mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 07:13:54 -06:00
Implement byte swapping accesses
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4574 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
a8c768c069
commit
8384dd67fe
2 changed files with 104 additions and 36 deletions
38
cpu-all.h
38
cpu-all.h
|
@ -233,6 +233,15 @@ static inline int lduw_le_p(void *ptr)
|
|||
int val;
|
||||
__asm__ __volatile__ ("lhbrx %0,0,%1" : "=r" (val) : "r" (ptr));
|
||||
return val;
|
||||
#elif defined(__sparc__)
|
||||
#ifndef ASI_PRIMARY_LITTLE
|
||||
#define ASI_PRIMARY_LITTLE 0x88
|
||||
#endif
|
||||
|
||||
int val;
|
||||
__asm__ __volatile__ ("lduha [%1] %2, %0" : "=r" (val) : "r" (ptr),
|
||||
"i" (ASI_PRIMARY_LITTLE));
|
||||
return val;
|
||||
#else
|
||||
uint8_t *p = ptr;
|
||||
return p[0] | (p[1] << 8);
|
||||
|
@ -245,6 +254,11 @@ static inline int ldsw_le_p(void *ptr)
|
|||
int val;
|
||||
__asm__ __volatile__ ("lhbrx %0,0,%1" : "=r" (val) : "r" (ptr));
|
||||
return (int16_t)val;
|
||||
#elif defined(__sparc__)
|
||||
int val;
|
||||
__asm__ __volatile__ ("ldsha [%1] %2, %0" : "=r" (val) : "r" (ptr),
|
||||
"i" (ASI_PRIMARY_LITTLE));
|
||||
return val;
|
||||
#else
|
||||
uint8_t *p = ptr;
|
||||
return (int16_t)(p[0] | (p[1] << 8));
|
||||
|
@ -257,6 +271,11 @@ static inline int ldl_le_p(void *ptr)
|
|||
int val;
|
||||
__asm__ __volatile__ ("lwbrx %0,0,%1" : "=r" (val) : "r" (ptr));
|
||||
return val;
|
||||
#elif defined(__sparc__)
|
||||
int val;
|
||||
__asm__ __volatile__ ("lduwa [%1] %2, %0" : "=r" (val) : "r" (ptr),
|
||||
"i" (ASI_PRIMARY_LITTLE));
|
||||
return val;
|
||||
#else
|
||||
uint8_t *p = ptr;
|
||||
return p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24);
|
||||
|
@ -265,17 +284,27 @@ static inline int ldl_le_p(void *ptr)
|
|||
|
||||
static inline uint64_t ldq_le_p(void *ptr)
|
||||
{
|
||||
#if defined(__sparc__)
|
||||
uint64_t val;
|
||||
__asm__ __volatile__ ("ldxa [%1] %2, %0" : "=r" (val) : "r" (ptr),
|
||||
"i" (ASI_PRIMARY_LITTLE));
|
||||
return val;
|
||||
#else
|
||||
uint8_t *p = ptr;
|
||||
uint32_t v1, v2;
|
||||
v1 = ldl_le_p(p);
|
||||
v2 = ldl_le_p(p + 4);
|
||||
return v1 | ((uint64_t)v2 << 32);
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void stw_le_p(void *ptr, int v)
|
||||
{
|
||||
#ifdef __powerpc__
|
||||
__asm__ __volatile__ ("sthbrx %1,0,%2" : "=m" (*(uint16_t *)ptr) : "r" (v), "r" (ptr));
|
||||
#elif defined(__sparc__)
|
||||
__asm__ __volatile__ ("stha %1, [%2] %3" : "=m" (*(uint16_t *)ptr) : "r" (v),
|
||||
"r" (ptr), "i" (ASI_PRIMARY_LITTLE));
|
||||
#else
|
||||
uint8_t *p = ptr;
|
||||
p[0] = v;
|
||||
|
@ -287,6 +316,9 @@ static inline void stl_le_p(void *ptr, int v)
|
|||
{
|
||||
#ifdef __powerpc__
|
||||
__asm__ __volatile__ ("stwbrx %1,0,%2" : "=m" (*(uint32_t *)ptr) : "r" (v), "r" (ptr));
|
||||
#elif defined(__sparc__)
|
||||
__asm__ __volatile__ ("stwa %1, [%2] %3" : "=m" (*(uint32_t *)ptr) : "r" (v),
|
||||
"r" (ptr), "i" (ASI_PRIMARY_LITTLE));
|
||||
#else
|
||||
uint8_t *p = ptr;
|
||||
p[0] = v;
|
||||
|
@ -298,9 +330,15 @@ static inline void stl_le_p(void *ptr, int v)
|
|||
|
||||
static inline void stq_le_p(void *ptr, uint64_t v)
|
||||
{
|
||||
#if defined(__sparc__)
|
||||
__asm__ __volatile__ ("stxa %1, [%2] %3" : "=m" (*(uint64_t *)ptr) : "r" (v),
|
||||
"r" (ptr), "i" (ASI_PRIMARY_LITTLE));
|
||||
#undef ASI_PRIMARY_LITTLE
|
||||
#else
|
||||
uint8_t *p = ptr;
|
||||
stl_le_p(p, (uint32_t)v);
|
||||
stl_le_p(p + 4, v >> 32);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* float access */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue