Revision 83d73968 cpu-all.h

b/cpu-all.h
56 56

  
57 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 92
static inline int ldub_raw(void *ptr)
60 93
{
61 94
    return *(uint8_t *)ptr;
......
195 228

  
196 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 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 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 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 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 274
static inline uint64_t ldq_raw(void *ptr)
......
221 281

  
222 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 290
    uint8_t *d = (uint8_t *) ptr;
225 291
    d[0] = v >> 8;
226 292
    d[1] = v;
293
#endif
227 294
}
228 295

  
229 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 304
    uint8_t *d = (uint8_t *) ptr;
232 305
    d[0] = v >> 24;
233 306
    d[1] = v >> 16;
234 307
    d[2] = v >> 8;
235 308
    d[3] = v;
309
#endif
236 310
}
237 311

  
238 312
static inline void stq_raw(void *ptr, uint64_t v)

Also available in: Unified diff