Skip to content

Commit

Permalink
Fixed crash when running SysSpeed's Drive benchmark
Browse files Browse the repository at this point in the history
Possibly other edge cases also
  • Loading branch information
midwan committed Jan 23, 2021
1 parent 32152dd commit 6b2cbe8
Showing 1 changed file with 20 additions and 101 deletions.
121 changes: 20 additions & 101 deletions src/machdep/maccess.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,125 +9,44 @@
#ifndef MACCESS_UAE_H
#define MACCESS_UAE_H

#if defined(ARMV6_ASSEMBLY)
STATIC_INLINE uae_u32 do_get_mem_long(uae_u32* a)
static __inline__ uint32_t do_get_mem_long(uint32_t* a)
{
uae_u32 v;
__asm__(
"ldr %[v], [%[a]] \n\t"
"rev %[v], %[v] \n\t"
: [v] "=r" (v) : [a] "r" (a));
return v;
}
#elif defined(CPU_AARCH64)
STATIC_INLINE uae_u32 do_get_mem_long(uae_u32 *a)
{
uae_u32 v;
__asm__ (
"ldr %w[v], [%x[a]] \n\t"
"rev %w[v], %w[v] \n\t"
: [v] "=r" (v) : [a] "r" (a) );
return v;
}
#else
STATIC_INLINE uae_u32 do_get_mem_long(uae_u32 *_GCCRES_ a)
{
uae_u8 *b = (uae_u8 *)a;

return (*b << 24) | (*(b+1) << 16) | (*(b+2) << 8) | (*(b+3));
}
#endif

#if defined(ARMV6_ASSEMBLY)
uint8_t* b = (uint8_t*)a;

STATIC_INLINE uae_u16 do_get_mem_word(uae_u16*_GCCRES_ a)
{
uae_u16 v;
__asm__(
"ldrh %[v], [%[a]] \n\t"
"rev16 %[v], %[v] \n\t"
: [v] "=r" (v) : [a] "r" (a));
return v;
}
#elif defined(CPU_AARCH64)
STATIC_INLINE uae_u16 do_get_mem_word(uae_u16 *_GCCRES_ a)
{
uae_u16 v;
__asm__ (
"ldrh %w[v], [%x[a]] \n\t"
"rev16 %w[v], %w[v] \n\t"
: [v] "=r" (v) : [a] "r" (a) );
return v;
return (*b << 24) | (*(b + 1) << 16) | (*(b + 2) << 8) | (*(b + 3));
}
#else
STATIC_INLINE uae_u16 do_get_mem_word(uae_u16 *_GCCRES_ a)

static __inline__ uint16_t do_get_mem_word(uint16_t* a)
{
uae_u8 *b = (uae_u8 *)a;
return (*b << 8) | (*(b+1));
uint8_t* b = (uint8_t*)a;

return (*b << 8) | (*(b + 1));
}
#endif

STATIC_INLINE uae_u8 do_get_mem_byte(uae_u8 *_GCCRES_ a)
static __inline__ uint8_t do_get_mem_byte(uint8_t* a)
{
return *a;
}

#ifdef ARMV6_ASSEMBLY
STATIC_INLINE void do_put_mem_long(uae_u32*_GCCRES_ a, uae_u32 v)
static __inline__ void do_put_mem_long(uint32_t* a, uint32_t v)
{
__asm__(
"rev r2, %[v] \n\t"
"str r2, [%[a]] \n\t"
: : [v] "r" (v), [a] "r" (a) : "r2", "memory");
}
#elif defined(CPU_AARCH64)
STATIC_INLINE void do_put_mem_long(uae_u32 *_GCCRES_ a, uae_u32 v)
{
__asm__ (
"rev w2, %w[v] \n\t"
"str w2, [%x[a]] \n\t"
: : [v] "r" (v), [a] "r" (a) : "w2", "memory" );
}
#else
STATIC_INLINE void do_put_mem_long(uae_u32 *_GCCRES_ a, uae_u32 v)
{
uae_u8 *b = (uae_u8 *)a;

uint8_t* b = (uint8_t*)a;

*b = v >> 24;
*(b+1) = v >> 16;
*(b+2) = v >> 8;
*(b+3) = v;
*(b + 1) = v >> 16;
*(b + 2) = v >> 8;
*(b + 3) = v;
}
#endif

#ifdef ARMV6_ASSEMBLY
STATIC_INLINE void do_put_mem_word(uae_u16*_GCCRES_ a, uae_u16 v)
static __inline__ void do_put_mem_word(uint16_t* a, uint16_t v)
{
__asm__(
"rev16 r2, %[v] \n\t"
"strh r2, [%[a]] \n\t"
: : [v] "r" (v), [a] "r" (a) : "r2", "memory");
}
#elif defined(CPU_AARCH64)
STATIC_INLINE void do_put_mem_word(uae_u16 *_GCCRES_ a, uae_u16 v)
{
__asm__ (
"rev16 w2, %w[v] \n\t"
"strh w2, [%x[a]] \n\t"
: : [v] "r" (v), [a] "r" (a) : "w2", "memory" );
}
#else
STATIC_INLINE void do_put_mem_word(uae_u16 *_GCCRES_ a, uae_u16 v)
{
uae_u8 *b = (uae_u8 *)a;

uint8_t* b = (uint8_t*)a;

*b = v >> 8;
*(b+1) = v;
*(b + 1) = v;
}
#endif

STATIC_INLINE void do_put_mem_byte(uae_u8 *_GCCRES_ a, uae_u8 v)
static __inline__ void do_put_mem_byte(uint8_t* a, uint8_t v)
{
*a = v;
}
Expand Down

0 comments on commit 6b2cbe8

Please # to comment.