diff options
author | blueswir1 <blueswir1@c046a42c-6fe2-441c-8c8c-71466251a162> | 2008-05-25 11:19:24 +0000 |
---|---|---|
committer | blueswir1 <blueswir1@c046a42c-6fe2-441c-8c8c-71466251a162> | 2008-05-25 11:19:24 +0000 |
commit | 8384dd67fec5652a09ada4576214abfafab32c0c (patch) | |
tree | c8b109dc755543b391ad81cc41640a6fdf1191ac /cpu-all.h | |
parent | a8c768c0691f713801aa3d1f08fe9b2d70f12a36 (diff) |
Implement byte swapping accesses
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4574 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'cpu-all.h')
-rw-r--r-- | cpu-all.h | 38 |
1 files changed, 38 insertions, 0 deletions
@@ -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 */ |