Commit 83d73968500d903a8dde19298a324bf45be7b3ee
1 parent
6b2d3e3c
faster big endian accesses on i386 - big endian ldsw_raw fix
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@632 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
78 additions
and
4 deletions
cpu-all.h
| @@ -56,6 +56,39 @@ typedef union { | @@ -56,6 +56,39 @@ typedef union { | ||
| 56 | 56 | ||
| 57 | /* CPU memory access without any memory or io remapping */ | 57 | /* CPU memory access without any memory or io remapping */ |
| 58 | 58 | ||
| 59 | +/* | ||
| 60 | + * the generic syntax for the memory accesses is: | ||
| 61 | + * | ||
| 62 | + * load: ld{type}{sign}{size}{endian}_{access_type}(ptr) | ||
| 63 | + * | ||
| 64 | + * store: st{type}{size}{endian}_{access_type}(ptr, val) | ||
| 65 | + * | ||
| 66 | + * type is: | ||
| 67 | + * (empty): integer access | ||
| 68 | + * f : float access | ||
| 69 | + * | ||
| 70 | + * sign is: | ||
| 71 | + * (empty): for floats or 32 bit size | ||
| 72 | + * u : unsigned | ||
| 73 | + * s : signed | ||
| 74 | + * | ||
| 75 | + * size is: | ||
| 76 | + * b: 8 bits | ||
| 77 | + * w: 16 bits | ||
| 78 | + * l: 32 bits | ||
| 79 | + * q: 64 bits | ||
| 80 | + * | ||
| 81 | + * endian is: | ||
| 82 | + * (empty): target cpu endianness or 8 bit access | ||
| 83 | + * r : reversed target cpu endianness (not implemented yet) | ||
| 84 | + * be : big endian (not implemented yet) | ||
| 85 | + * le : little endian (not implemented yet) | ||
| 86 | + * | ||
| 87 | + * access_type is: | ||
| 88 | + * raw : host memory access | ||
| 89 | + * user : user mode access using soft MMU | ||
| 90 | + * kernel : kernel mode access using soft MMU | ||
| 91 | + */ | ||
| 59 | static inline int ldub_raw(void *ptr) | 92 | static inline int ldub_raw(void *ptr) |
| 60 | { | 93 | { |
| 61 | return *(uint8_t *)ptr; | 94 | return *(uint8_t *)ptr; |
| @@ -195,20 +228,47 @@ static inline void stfq_raw(void *ptr, double v) | @@ -195,20 +228,47 @@ static inline void stfq_raw(void *ptr, double v) | ||
| 195 | 228 | ||
| 196 | static inline int lduw_raw(void *ptr) | 229 | static inline int lduw_raw(void *ptr) |
| 197 | { | 230 | { |
| 231 | +#if defined(__i386__) | ||
| 232 | + int val; | ||
| 233 | + asm volatile ("movzwl %1, %0\n" | ||
| 234 | + "xchgb %b0, %h0\n" | ||
| 235 | + : "=q" (val) | ||
| 236 | + : "m" (*(uint16_t *)ptr)); | ||
| 237 | + return val; | ||
| 238 | +#else | ||
| 198 | uint8_t *b = (uint8_t *) ptr; | 239 | uint8_t *b = (uint8_t *) ptr; |
| 199 | - return (b[0]<<8|b[1]); | 240 | + return ((b[0] << 8) | b[1]); |
| 241 | +#endif | ||
| 200 | } | 242 | } |
| 201 | 243 | ||
| 202 | static inline int ldsw_raw(void *ptr) | 244 | static inline int ldsw_raw(void *ptr) |
| 203 | { | 245 | { |
| 204 | - int8_t *b = (int8_t *) ptr; | ||
| 205 | - return (b[0]<<8|b[1]); | 246 | +#if defined(__i386__) |
| 247 | + int val; | ||
| 248 | + asm volatile ("movzwl %1, %0\n" | ||
| 249 | + "xchgb %b0, %h0\n" | ||
| 250 | + : "=q" (val) | ||
| 251 | + : "m" (*(uint16_t *)ptr)); | ||
| 252 | + return (int16_t)val; | ||
| 253 | +#else | ||
| 254 | + uint8_t *b = (uint8_t *) ptr; | ||
| 255 | + return (int16_t)((b[0] << 8) | b[1]); | ||
| 256 | +#endif | ||
| 206 | } | 257 | } |
| 207 | 258 | ||
| 208 | static inline int ldl_raw(void *ptr) | 259 | static inline int ldl_raw(void *ptr) |
| 209 | { | 260 | { |
| 261 | +#if defined(__i386__) | ||
| 262 | + int val; | ||
| 263 | + asm volatile ("movl %1, %0\n" | ||
| 264 | + "bswap %0\n" | ||
| 265 | + : "=r" (val) | ||
| 266 | + : "m" (*(uint32_t *)ptr)); | ||
| 267 | + return val; | ||
| 268 | +#else | ||
| 210 | uint8_t *b = (uint8_t *) ptr; | 269 | uint8_t *b = (uint8_t *) ptr; |
| 211 | - return (b[0]<<24|b[1]<<16|b[2]<<8|b[3]); | 270 | + return (b[0] << 24) | (b[1] << 16) | (b[2] << 8) | b[3]; |
| 271 | +#endif | ||
| 212 | } | 272 | } |
| 213 | 273 | ||
| 214 | static inline uint64_t ldq_raw(void *ptr) | 274 | static inline uint64_t ldq_raw(void *ptr) |
| @@ -221,18 +281,32 @@ static inline uint64_t ldq_raw(void *ptr) | @@ -221,18 +281,32 @@ static inline uint64_t ldq_raw(void *ptr) | ||
| 221 | 281 | ||
| 222 | static inline void stw_raw(void *ptr, int v) | 282 | static inline void stw_raw(void *ptr, int v) |
| 223 | { | 283 | { |
| 284 | +#if defined(__i386__) | ||
| 285 | + asm volatile ("xchgb %b0, %h0\n" | ||
| 286 | + "movw %w0, %1\n" | ||
| 287 | + : "=q" (v) | ||
| 288 | + : "m" (*(uint16_t *)ptr), "0" (v)); | ||
| 289 | +#else | ||
| 224 | uint8_t *d = (uint8_t *) ptr; | 290 | uint8_t *d = (uint8_t *) ptr; |
| 225 | d[0] = v >> 8; | 291 | d[0] = v >> 8; |
| 226 | d[1] = v; | 292 | d[1] = v; |
| 293 | +#endif | ||
| 227 | } | 294 | } |
| 228 | 295 | ||
| 229 | static inline void stl_raw(void *ptr, int v) | 296 | static inline void stl_raw(void *ptr, int v) |
| 230 | { | 297 | { |
| 298 | +#if defined(__i386__) | ||
| 299 | + asm volatile ("bswap %0\n" | ||
| 300 | + "movl %0, %1\n" | ||
| 301 | + : "=r" (v) | ||
| 302 | + : "m" (*(uint32_t *)ptr), "0" (v)); | ||
| 303 | +#else | ||
| 231 | uint8_t *d = (uint8_t *) ptr; | 304 | uint8_t *d = (uint8_t *) ptr; |
| 232 | d[0] = v >> 24; | 305 | d[0] = v >> 24; |
| 233 | d[1] = v >> 16; | 306 | d[1] = v >> 16; |
| 234 | d[2] = v >> 8; | 307 | d[2] = v >> 8; |
| 235 | d[3] = v; | 308 | d[3] = v; |
| 309 | +#endif | ||
| 236 | } | 310 | } |
| 237 | 311 | ||
| 238 | static inline void stq_raw(void *ptr, uint64_t v) | 312 | static inline void stq_raw(void *ptr, uint64_t v) |