/[qemu]/qemu/cpu-all.h
ViewVC logotype

Diff of /qemu/cpu-all.h

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.46 by bellard, Sun Oct 30 20:48:42 2005 UTC revision 1.47 by bellard, Sat Nov 19 17:47:39 2005 UTC
# Line 188  static inline void stb_p(void *ptr, int Line 188  static inline void stb_p(void *ptr, int
188  /* NOTE: on arm, putting 2 in /proc/sys/debug/alignment so that the  /* NOTE: on arm, putting 2 in /proc/sys/debug/alignment so that the
189     kernel handles unaligned load/stores may give better results, but     kernel handles unaligned load/stores may give better results, but
190     it is a system wide setting : bad */     it is a system wide setting : bad */
191  #if !defined(TARGET_WORDS_BIGENDIAN) && (defined(WORDS_BIGENDIAN) || defined(WORDS_ALIGNED))  #if defined(WORDS_BIGENDIAN) || defined(WORDS_ALIGNED)
192    
193  /* conservative code for little endian unaligned accesses */  /* conservative code for little endian unaligned accesses */
194  static inline int lduw_p(void *ptr)  static inline int lduw_le_p(void *ptr)
195  {  {
196  #ifdef __powerpc__  #ifdef __powerpc__
197      int val;      int val;
# Line 203  static inline int lduw_p(void *ptr) Line 203  static inline int lduw_p(void *ptr)
203  #endif  #endif
204  }  }
205    
206  static inline int ldsw_p(void *ptr)  static inline int ldsw_le_p(void *ptr)
207  {  {
208  #ifdef __powerpc__  #ifdef __powerpc__
209      int val;      int val;
# Line 215  static inline int ldsw_p(void *ptr) Line 215  static inline int ldsw_p(void *ptr)
215  #endif  #endif
216  }  }
217    
218  static inline int ldl_p(void *ptr)  static inline int ldl_le_p(void *ptr)
219  {  {
220  #ifdef __powerpc__  #ifdef __powerpc__
221      int val;      int val;
# Line 227  static inline int ldl_p(void *ptr) Line 227  static inline int ldl_p(void *ptr)
227  #endif  #endif
228  }  }
229    
230  static inline uint64_t ldq_p(void *ptr)  static inline uint64_t ldq_le_p(void *ptr)
231  {  {
232      uint8_t *p = ptr;      uint8_t *p = ptr;
233      uint32_t v1, v2;      uint32_t v1, v2;
# Line 236  static inline uint64_t ldq_p(void *ptr) Line 236  static inline uint64_t ldq_p(void *ptr)
236      return v1 | ((uint64_t)v2 << 32);      return v1 | ((uint64_t)v2 << 32);
237  }  }
238    
239  static inline void stw_p(void *ptr, int v)  static inline void stw_le_p(void *ptr, int v)
240  {  {
241  #ifdef __powerpc__  #ifdef __powerpc__
242      __asm__ __volatile__ ("sthbrx %1,0,%2" : "=m" (*(uint16_t *)ptr) : "r" (v), "r" (ptr));      __asm__ __volatile__ ("sthbrx %1,0,%2" : "=m" (*(uint16_t *)ptr) : "r" (v), "r" (ptr));
# Line 247  static inline void stw_p(void *ptr, int Line 247  static inline void stw_p(void *ptr, int
247  #endif  #endif
248  }  }
249    
250  static inline void stl_p(void *ptr, int v)  static inline void stl_le_p(void *ptr, int v)
251  {  {
252  #ifdef __powerpc__  #ifdef __powerpc__
253      __asm__ __volatile__ ("stwbrx %1,0,%2" : "=m" (*(uint32_t *)ptr) : "r" (v), "r" (ptr));      __asm__ __volatile__ ("stwbrx %1,0,%2" : "=m" (*(uint32_t *)ptr) : "r" (v), "r" (ptr));
# Line 260  static inline void stl_p(void *ptr, int Line 260  static inline void stl_p(void *ptr, int
260  #endif  #endif
261  }  }
262    
263  static inline void stq_p(void *ptr, uint64_t v)  static inline void stq_le_p(void *ptr, uint64_t v)
264  {  {
265      uint8_t *p = ptr;      uint8_t *p = ptr;
266      stl_p(p, (uint32_t)v);      stl_p(p, (uint32_t)v);
# Line 269  static inline void stq_p(void *ptr, uint Line 269  static inline void stq_p(void *ptr, uint
269    
270  /* float access */  /* float access */
271    
272  static inline float32 ldfl_p(void *ptr)  static inline float32 ldfl_le_p(void *ptr)
273  {  {
274      union {      union {
275          float32 f;          float32 f;
276          uint32_t i;          uint32_t i;
277      } u;      } u;
278      u.i = ldl_p(ptr);      u.i = ldl_le_p(ptr);
279      return u.f;      return u.f;
280  }  }
281    
282  static inline void stfl_p(void *ptr, float32 v)  static inline void stfl_le_p(void *ptr, float32 v)
283  {  {
284      union {      union {
285          float32 f;          float32 f;
286          uint32_t i;          uint32_t i;
287      } u;      } u;
288      u.f = v;      u.f = v;
289      stl_p(ptr, u.i);      stl_le_p(ptr, u.i);
290  }  }
291    
292  static inline float64 ldfq_p(void *ptr)  static inline float64 ldfq_le_p(void *ptr)
293  {  {
294      CPU_DoubleU u;      CPU_DoubleU u;
295      u.l.lower = ldl_p(ptr);      u.l.lower = ldl_le_p(ptr);
296      u.l.upper = ldl_p(ptr + 4);      u.l.upper = ldl_le_p(ptr + 4);
297      return u.d;      return u.d;
298  }  }
299    
300  static inline void stfq_p(void *ptr, float64 v)  static inline void stfq_le_p(void *ptr, float64 v)
301  {  {
302      CPU_DoubleU u;      CPU_DoubleU u;
303      u.d = v;      u.d = v;
304      stl_p(ptr, u.l.lower);      stl_le_p(ptr, u.l.lower);
305      stl_p(ptr + 4, u.l.upper);      stl_le_p(ptr + 4, u.l.upper);
306  }  }
307    
308  #elif defined(TARGET_WORDS_BIGENDIAN) && (!defined(WORDS_BIGENDIAN) || defined(WORDS_ALIGNED))  #else
309    
310    static inline int lduw_le_p(void *ptr)
311    {
312        return *(uint16_t *)ptr;
313    }
314    
315    static inline int ldsw_le_p(void *ptr)
316    {
317        return *(int16_t *)ptr;
318    }
319    
320    static inline int ldl_le_p(void *ptr)
321    {
322        return *(uint32_t *)ptr;
323    }
324    
325    static inline uint64_t ldq_le_p(void *ptr)
326    {
327        return *(uint64_t *)ptr;
328    }
329    
330    static inline void stw_le_p(void *ptr, int v)
331    {
332        *(uint16_t *)ptr = v;
333    }
334    
335    static inline void stl_le_p(void *ptr, int v)
336    {
337        *(uint32_t *)ptr = v;
338    }
339    
340    static inline void stq_le_p(void *ptr, uint64_t v)
341    {
342        *(uint64_t *)ptr = v;
343    }
344    
345    /* float access */
346    
347    static inline float32 ldfl_le_p(void *ptr)
348    {
349        return *(float32 *)ptr;
350    }
351    
352    static inline float64 ldfq_le_p(void *ptr)
353    {
354        return *(float64 *)ptr;
355    }
356    
357  static inline int lduw_p(void *ptr)  static inline void stfl_le_p(void *ptr, float32 v)
358    {
359        *(float32 *)ptr = v;
360    }
361    
362    static inline void stfq_le_p(void *ptr, float64 v)
363    {
364        *(float64 *)ptr = v;
365    }
366    #endif
367    
368    #if !defined(WORDS_BIGENDIAN) || defined(WORDS_ALIGNED)
369    
370    static inline int lduw_be_p(void *ptr)
371  {  {
372  #if defined(__i386__)  #if defined(__i386__)
373      int val;      int val;
# Line 322  static inline int lduw_p(void *ptr) Line 382  static inline int lduw_p(void *ptr)
382  #endif  #endif
383  }  }
384    
385  static inline int ldsw_p(void *ptr)  static inline int ldsw_be_p(void *ptr)
386  {  {
387  #if defined(__i386__)  #if defined(__i386__)
388      int val;      int val;
# Line 337  static inline int ldsw_p(void *ptr) Line 397  static inline int ldsw_p(void *ptr)
397  #endif  #endif
398  }  }
399    
400  static inline int ldl_p(void *ptr)  static inline int ldl_be_p(void *ptr)
401  {  {
402  #if defined(__i386__) || defined(__x86_64__)  #if defined(__i386__) || defined(__x86_64__)
403      int val;      int val;
# Line 352  static inline int ldl_p(void *ptr) Line 412  static inline int ldl_p(void *ptr)
412  #endif  #endif
413  }  }
414    
415  static inline uint64_t ldq_p(void *ptr)  static inline uint64_t ldq_be_p(void *ptr)
416  {  {
417      uint32_t a,b;      uint32_t a,b;
418      a = ldl_p(ptr);      a = ldl_be_p(ptr);
419      b = ldl_p(ptr+4);      b = ldl_be_p(ptr+4);
420      return (((uint64_t)a<<32)|b);      return (((uint64_t)a<<32)|b);
421  }  }
422    
423  static inline void stw_p(void *ptr, int v)  static inline void stw_be_p(void *ptr, int v)
424  {  {
425  #if defined(__i386__)  #if defined(__i386__)
426      asm volatile ("xchgb %b0, %h0\n"      asm volatile ("xchgb %b0, %h0\n"
# Line 374  static inline void stw_p(void *ptr, int Line 434  static inline void stw_p(void *ptr, int
434  #endif  #endif
435  }  }
436    
437  static inline void stl_p(void *ptr, int v)  static inline void stl_be_p(void *ptr, int v)
438  {  {
439  #if defined(__i386__) || defined(__x86_64__)  #if defined(__i386__) || defined(__x86_64__)
440      asm volatile ("bswap %0\n"      asm volatile ("bswap %0\n"
# Line 390  static inline void stl_p(void *ptr, int Line 450  static inline void stl_p(void *ptr, int
450  #endif  #endif
451  }  }
452    
453  static inline void stq_p(void *ptr, uint64_t v)  static inline void stq_be_p(void *ptr, uint64_t v)
454  {  {
455      stl_p(ptr, v >> 32);      stl_be_p(ptr, v >> 32);
456      stl_p(ptr + 4, v);      stl_be_p(ptr + 4, v);
457  }  }
458    
459  /* float access */  /* float access */
460    
461  static inline float32 ldfl_p(void *ptr)  static inline float32 ldfl_be_p(void *ptr)
462  {  {
463      union {      union {
464          float32 f;          float32 f;
465          uint32_t i;          uint32_t i;
466      } u;      } u;
467      u.i = ldl_p(ptr);      u.i = ldl_be_p(ptr);
468      return u.f;      return u.f;
469  }  }
470    
471  static inline void stfl_p(void *ptr, float32 v)  static inline void stfl_be_p(void *ptr, float32 v)
472  {  {
473      union {      union {
474          float32 f;          float32 f;
475          uint32_t i;          uint32_t i;
476      } u;      } u;
477      u.f = v;      u.f = v;
478      stl_p(ptr, u.i);      stl_be_p(ptr, u.i);
479  }  }
480    
481  static inline float64 ldfq_p(void *ptr)  static inline float64 ldfq_be_p(void *ptr)
482  {  {
483      CPU_DoubleU u;      CPU_DoubleU u;
484      u.l.upper = ldl_p(ptr);      u.l.upper = ldl_be_p(ptr);
485      u.l.lower = ldl_p(ptr + 4);      u.l.lower = ldl_be_p(ptr + 4);
486      return u.d;      return u.d;
487  }  }
488    
489  static inline void stfq_p(void *ptr, float64 v)  static inline void stfq_be_p(void *ptr, float64 v)
490  {  {
491      CPU_DoubleU u;      CPU_DoubleU u;
492      u.d = v;      u.d = v;
493      stl_p(ptr, u.l.upper);      stl_be_p(ptr, u.l.upper);
494      stl_p(ptr + 4, u.l.lower);      stl_be_p(ptr + 4, u.l.lower);
495  }  }
496    
497  #else  #else
498    
499  static inline int lduw_p(void *ptr)  static inline int lduw_be_p(void *ptr)
500  {  {
501      return *(uint16_t *)ptr;      return *(uint16_t *)ptr;
502  }  }
503    
504  static inline int ldsw_p(void *ptr)  static inline int ldsw_be_p(void *ptr)
505  {  {
506      return *(int16_t *)ptr;      return *(int16_t *)ptr;
507  }  }
508    
509  static inline int ldl_p(void *ptr)  static inline int ldl_be_p(void *ptr)
510  {  {
511      return *(uint32_t *)ptr;      return *(uint32_t *)ptr;
512  }  }
513    
514  static inline uint64_t ldq_p(void *ptr)  static inline uint64_t ldq_be_p(void *ptr)
515  {  {
516      return *(uint64_t *)ptr;      return *(uint64_t *)ptr;
517  }  }
518    
519  static inline void stw_p(void *ptr, int v)  static inline void stw_be_p(void *ptr, int v)
520  {  {
521      *(uint16_t *)ptr = v;      *(uint16_t *)ptr = v;
522  }  }
523    
524  static inline void stl_p(void *ptr, int v)  static inline void stl_be_p(void *ptr, int v)
525  {  {
526      *(uint32_t *)ptr = v;      *(uint32_t *)ptr = v;
527  }  }
528    
529  static inline void stq_p(void *ptr, uint64_t v)  static inline void stq_be_p(void *ptr, uint64_t v)
530  {  {
531      *(uint64_t *)ptr = v;      *(uint64_t *)ptr = v;
532  }  }
533    
534  /* float access */  /* float access */
535    
536  static inline float32 ldfl_p(void *ptr)  static inline float32 ldfl_be_p(void *ptr)
537  {  {
538      return *(float32 *)ptr;      return *(float32 *)ptr;
539  }  }
540    
541  static inline float64 ldfq_p(void *ptr)  static inline float64 ldfq_be_p(void *ptr)
542  {  {
543      return *(float64 *)ptr;      return *(float64 *)ptr;
544  }  }
545    
546  static inline void stfl_p(void *ptr, float32 v)  static inline void stfl_be_p(void *ptr, float32 v)
547  {  {
548      *(float32 *)ptr = v;      *(float32 *)ptr = v;
549  }  }
550    
551  static inline void stfq_p(void *ptr, float64 v)  static inline void stfq_be_p(void *ptr, float64 v)
552  {  {
553      *(float64 *)ptr = v;      *(float64 *)ptr = v;
554  }  }
555    
556    #endif
557    
558    /* target CPU memory access functions */
559    #if defined(TARGET_WORDS_BIGENDIAN)
560    #define lduw_p(p) lduw_be_p(p)
561    #define ldsw_p(p) ldsw_be_p(p)
562    #define ldl_p(p) ldl_be_p(p)
563    #define ldq_p(p) ldq_be_p(p)
564    #define ldfl_p(p) ldfl_be_p(p)
565    #define ldfq_p(p) ldfq_be_p(p)
566    #define stw_p(p, v) stw_be_p(p, v)
567    #define stl_p(p, v) stl_be_p(p, v)
568    #define stq_p(p, v) stq_be_p(p, v)
569    #define stfl_p(p, v) stfl_be_p(p, v)
570    #define stfq_p(p, v) stfq_be_p(p, v)
571    #else
572    #define lduw_p(p) lduw_le_p(p)
573    #define ldsw_p(p) ldsw_le_p(p)
574    #define ldl_p(p) ldl_le_p(p)
575    #define ldq_p(p) ldq_le_p(p)
576    #define ldfl_p(p) ldfl_le_p(p)
577    #define ldfq_p(p) ldfq_le_p(p)
578    #define stw_p(p, v) stw_le_p(p, v)
579    #define stl_p(p, v) stl_le_p(p, v)
580    #define stq_p(p, v) stq_le_p(p, v)
581    #define stfl_p(p, v) stfl_le_p(p, v)
582    #define stfq_p(p, v) stfq_le_p(p, v)
583  #endif  #endif
584    
585  /* MMU memory access macros */  /* MMU memory access macros */

Legend:
Removed from v.1.46  
changed lines
  Added in v.1.47

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26