1
2#include <stdio.h>
3
4typedef  unsigned int    UInt;
5typedef  unsigned short  UShort;
6
7UInt 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
19UInt 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
31UInt 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
43UInt 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
55void 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
65void 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
75void 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
85void 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
95int 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