Home | History | Annotate | Download | only in ppc32
      1 
      2 #include <stdio.h>
      3 
      4 typedef  unsigned int    UInt;
      5 typedef  unsigned short  UShort;
      6 
      7 UInt read16le ( void* a )
      8 {
      9   UInt res;
     10   __asm volatile(
     11     "   lhbrx   %0,0,%1         \n"     // Get half word and reverse the bytes
     12     : "=b" (res)  // %0 - Output operand
     13     : "b" (a)        // %1 - Input operand
     14     : "memory"       // Consider memory clobberred for aliasing
     15   );
     16   return res;
     17 }
     18 
     19 UInt read16be ( void* a )
     20 {
     21   UInt res;
     22   __asm volatile(
     23     "   lhzx   %0,0,%1         \n"     // Get half word and reverse the bytes
     24     : "=b" (res)  // %0 - Output operand
     25     : "b" (a)        // %1 - Input operand
     26     : "memory"       // Consider memory clobberred for aliasing
     27   );
     28   return res;
     29 }
     30 
     31 UInt read32le ( void* a )
     32 {
     33   UInt res;
     34   __asm volatile(
     35     "   lwbrx   %0,0,%1         \n"     // Get half word and reverse the bytes
     36     : "=b" (res)  // %0 - Output operand
     37     : "b" (a)        // %1 - Input operand
     38     : "memory"       // Consider memory clobberred for aliasing
     39   );
     40   return res;
     41 }
     42 
     43 UInt read32be ( void* a )
     44 {
     45   UInt res;
     46   __asm volatile(
     47     "   lwzx   %0,0,%1         \n"     // Get half word and reverse the bytes
     48     : "=b" (res)  // %0 - Output operand
     49     : "b" (a)        // %1 - Input operand
     50     : "memory"       // Consider memory clobberred for aliasing
     51   );
     52   return res;
     53 }
     54 
     55 void write16be ( void* a, UInt data )
     56 {
     57   __asm volatile(
     58     "  sthx %0,0,%1\n"
     59     :
     60     : "b" (data), "b" (a)
     61     : "memory"
     62   );
     63 }
     64 
     65 void write16le ( void* a, UInt data )
     66 {
     67   __asm volatile(
     68     "  sthbrx %0,0,%1\n"
     69     :
     70     : "b" (data), "b" (a)
     71     : "memory"
     72   );
     73 }
     74 
     75 void write32be ( void* a, UInt data )
     76 {
     77   __asm volatile(
     78     "  stwx %0,0,%1\n"
     79     :
     80     : "b" (data), "b" (a)
     81     : "memory"
     82   );
     83 }
     84 
     85 void write32le ( void* a, UInt data )
     86 {
     87   __asm volatile(
     88     "  stwbrx %0,0,%1\n"
     89     :
     90     : "b" (data), "b" (a)
     91     : "memory"
     92   );
     93 }
     94 
     95 int main ( void )
     96 {
     97    UInt foo = 0x12345678;
     98    printf("ld be16 0x%08x\n", read16be( &foo ));
     99    printf("ld le16 0x%08x\n", read16le( &foo ));
    100    printf("ld be32 0x%08x\n", read32be( &foo ));
    101    printf("ld le32 0x%08x\n", read32le( &foo ));
    102 
    103    foo = 0x12345678; write16be( &foo, 0xABCD );
    104    printf("st be16 0x%08x\n", foo);
    105 
    106    foo = 0x12345678; write16le( &foo, 0xABCD );
    107    printf("st le16 0x%08x\n", foo);
    108 
    109    foo = 0x12345678; write32be( &foo, 0xABCD1425 );
    110    printf("st be32 0x%08x\n", foo);
    111 
    112    foo = 0x12345678; write32le( &foo, 0xABCD1425 );
    113    printf("st le32 0x%08x\n", foo);
    114 
    115    return 0;
    116 }
    117