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