167b0a95cb163b8ae43620346a5f8024c33d3864asewardj
267b0a95cb163b8ae43620346a5f8024c33d3864asewardj#include <stdio.h>
367b0a95cb163b8ae43620346a5f8024c33d3864asewardj
467b0a95cb163b8ae43620346a5f8024c33d3864asewardjtypedef  unsigned int    UInt;
567b0a95cb163b8ae43620346a5f8024c33d3864asewardjtypedef  unsigned short  UShort;
667b0a95cb163b8ae43620346a5f8024c33d3864asewardj
767b0a95cb163b8ae43620346a5f8024c33d3864asewardjUInt read16le ( void* a )
867b0a95cb163b8ae43620346a5f8024c33d3864asewardj{
967b0a95cb163b8ae43620346a5f8024c33d3864asewardj  UInt res;
1067b0a95cb163b8ae43620346a5f8024c33d3864asewardj  __asm volatile(
1167b0a95cb163b8ae43620346a5f8024c33d3864asewardj    "   lhbrx   %0,0,%1         \n"     // Get half word and reverse the bytes
1267b0a95cb163b8ae43620346a5f8024c33d3864asewardj    : "=b" (res)  // %0 - Output operand
1367b0a95cb163b8ae43620346a5f8024c33d3864asewardj    : "b" (a)        // %1 - Input operand
1467b0a95cb163b8ae43620346a5f8024c33d3864asewardj    : "memory"       // Consider memory clobberred for aliasing
1567b0a95cb163b8ae43620346a5f8024c33d3864asewardj  );
1667b0a95cb163b8ae43620346a5f8024c33d3864asewardj  return res;
1767b0a95cb163b8ae43620346a5f8024c33d3864asewardj}
1867b0a95cb163b8ae43620346a5f8024c33d3864asewardj
1967b0a95cb163b8ae43620346a5f8024c33d3864asewardjUInt read16be ( void* a )
2067b0a95cb163b8ae43620346a5f8024c33d3864asewardj{
2167b0a95cb163b8ae43620346a5f8024c33d3864asewardj  UInt res;
2267b0a95cb163b8ae43620346a5f8024c33d3864asewardj  __asm volatile(
2367b0a95cb163b8ae43620346a5f8024c33d3864asewardj    "   lhzx   %0,0,%1         \n"     // Get half word and reverse the bytes
2467b0a95cb163b8ae43620346a5f8024c33d3864asewardj    : "=b" (res)  // %0 - Output operand
2567b0a95cb163b8ae43620346a5f8024c33d3864asewardj    : "b" (a)        // %1 - Input operand
2667b0a95cb163b8ae43620346a5f8024c33d3864asewardj    : "memory"       // Consider memory clobberred for aliasing
2767b0a95cb163b8ae43620346a5f8024c33d3864asewardj  );
2867b0a95cb163b8ae43620346a5f8024c33d3864asewardj  return res;
2967b0a95cb163b8ae43620346a5f8024c33d3864asewardj}
3067b0a95cb163b8ae43620346a5f8024c33d3864asewardj
3167b0a95cb163b8ae43620346a5f8024c33d3864asewardjUInt read32le ( void* a )
3267b0a95cb163b8ae43620346a5f8024c33d3864asewardj{
3367b0a95cb163b8ae43620346a5f8024c33d3864asewardj  UInt res;
3467b0a95cb163b8ae43620346a5f8024c33d3864asewardj  __asm volatile(
3567b0a95cb163b8ae43620346a5f8024c33d3864asewardj    "   lwbrx   %0,0,%1         \n"     // Get half word and reverse the bytes
3667b0a95cb163b8ae43620346a5f8024c33d3864asewardj    : "=b" (res)  // %0 - Output operand
3767b0a95cb163b8ae43620346a5f8024c33d3864asewardj    : "b" (a)        // %1 - Input operand
3867b0a95cb163b8ae43620346a5f8024c33d3864asewardj    : "memory"       // Consider memory clobberred for aliasing
3967b0a95cb163b8ae43620346a5f8024c33d3864asewardj  );
4067b0a95cb163b8ae43620346a5f8024c33d3864asewardj  return res;
4167b0a95cb163b8ae43620346a5f8024c33d3864asewardj}
4267b0a95cb163b8ae43620346a5f8024c33d3864asewardj
4367b0a95cb163b8ae43620346a5f8024c33d3864asewardjUInt read32be ( void* a )
4467b0a95cb163b8ae43620346a5f8024c33d3864asewardj{
4567b0a95cb163b8ae43620346a5f8024c33d3864asewardj  UInt res;
4667b0a95cb163b8ae43620346a5f8024c33d3864asewardj  __asm volatile(
4767b0a95cb163b8ae43620346a5f8024c33d3864asewardj    "   lwzx   %0,0,%1         \n"     // Get half word and reverse the bytes
4867b0a95cb163b8ae43620346a5f8024c33d3864asewardj    : "=b" (res)  // %0 - Output operand
4967b0a95cb163b8ae43620346a5f8024c33d3864asewardj    : "b" (a)        // %1 - Input operand
5067b0a95cb163b8ae43620346a5f8024c33d3864asewardj    : "memory"       // Consider memory clobberred for aliasing
5167b0a95cb163b8ae43620346a5f8024c33d3864asewardj  );
5267b0a95cb163b8ae43620346a5f8024c33d3864asewardj  return res;
5367b0a95cb163b8ae43620346a5f8024c33d3864asewardj}
5467b0a95cb163b8ae43620346a5f8024c33d3864asewardj
5567b0a95cb163b8ae43620346a5f8024c33d3864asewardjvoid write16be ( void* a, UInt data )
5667b0a95cb163b8ae43620346a5f8024c33d3864asewardj{
5767b0a95cb163b8ae43620346a5f8024c33d3864asewardj  __asm volatile(
5867b0a95cb163b8ae43620346a5f8024c33d3864asewardj    "  sthx %0,0,%1\n"
5967b0a95cb163b8ae43620346a5f8024c33d3864asewardj    :
6067b0a95cb163b8ae43620346a5f8024c33d3864asewardj    : "b" (data), "b" (a)
6167b0a95cb163b8ae43620346a5f8024c33d3864asewardj    : "memory"
6267b0a95cb163b8ae43620346a5f8024c33d3864asewardj  );
6367b0a95cb163b8ae43620346a5f8024c33d3864asewardj}
6467b0a95cb163b8ae43620346a5f8024c33d3864asewardj
6567b0a95cb163b8ae43620346a5f8024c33d3864asewardjvoid write16le ( void* a, UInt data )
6667b0a95cb163b8ae43620346a5f8024c33d3864asewardj{
6767b0a95cb163b8ae43620346a5f8024c33d3864asewardj  __asm volatile(
6867b0a95cb163b8ae43620346a5f8024c33d3864asewardj    "  sthbrx %0,0,%1\n"
6967b0a95cb163b8ae43620346a5f8024c33d3864asewardj    :
7067b0a95cb163b8ae43620346a5f8024c33d3864asewardj    : "b" (data), "b" (a)
7167b0a95cb163b8ae43620346a5f8024c33d3864asewardj    : "memory"
7267b0a95cb163b8ae43620346a5f8024c33d3864asewardj  );
7367b0a95cb163b8ae43620346a5f8024c33d3864asewardj}
7467b0a95cb163b8ae43620346a5f8024c33d3864asewardj
7567b0a95cb163b8ae43620346a5f8024c33d3864asewardjvoid write32be ( void* a, UInt data )
7667b0a95cb163b8ae43620346a5f8024c33d3864asewardj{
7767b0a95cb163b8ae43620346a5f8024c33d3864asewardj  __asm volatile(
7867b0a95cb163b8ae43620346a5f8024c33d3864asewardj    "  stwx %0,0,%1\n"
7967b0a95cb163b8ae43620346a5f8024c33d3864asewardj    :
8067b0a95cb163b8ae43620346a5f8024c33d3864asewardj    : "b" (data), "b" (a)
8167b0a95cb163b8ae43620346a5f8024c33d3864asewardj    : "memory"
8267b0a95cb163b8ae43620346a5f8024c33d3864asewardj  );
8367b0a95cb163b8ae43620346a5f8024c33d3864asewardj}
8467b0a95cb163b8ae43620346a5f8024c33d3864asewardj
8567b0a95cb163b8ae43620346a5f8024c33d3864asewardjvoid write32le ( void* a, UInt data )
8667b0a95cb163b8ae43620346a5f8024c33d3864asewardj{
8767b0a95cb163b8ae43620346a5f8024c33d3864asewardj  __asm volatile(
8867b0a95cb163b8ae43620346a5f8024c33d3864asewardj    "  stwbrx %0,0,%1\n"
8967b0a95cb163b8ae43620346a5f8024c33d3864asewardj    :
9067b0a95cb163b8ae43620346a5f8024c33d3864asewardj    : "b" (data), "b" (a)
9167b0a95cb163b8ae43620346a5f8024c33d3864asewardj    : "memory"
9267b0a95cb163b8ae43620346a5f8024c33d3864asewardj  );
9367b0a95cb163b8ae43620346a5f8024c33d3864asewardj}
9467b0a95cb163b8ae43620346a5f8024c33d3864asewardj
9567b0a95cb163b8ae43620346a5f8024c33d3864asewardjint main ( void )
9667b0a95cb163b8ae43620346a5f8024c33d3864asewardj{
9767b0a95cb163b8ae43620346a5f8024c33d3864asewardj   UInt foo = 0x12345678;
9867b0a95cb163b8ae43620346a5f8024c33d3864asewardj   printf("ld be16 0x%08x\n", read16be( &foo ));
9967b0a95cb163b8ae43620346a5f8024c33d3864asewardj   printf("ld le16 0x%08x\n", read16le( &foo ));
10067b0a95cb163b8ae43620346a5f8024c33d3864asewardj   printf("ld be32 0x%08x\n", read32be( &foo ));
10167b0a95cb163b8ae43620346a5f8024c33d3864asewardj   printf("ld le32 0x%08x\n", read32le( &foo ));
10267b0a95cb163b8ae43620346a5f8024c33d3864asewardj
10367b0a95cb163b8ae43620346a5f8024c33d3864asewardj   foo = 0x12345678; write16be( &foo, 0xABCD );
10467b0a95cb163b8ae43620346a5f8024c33d3864asewardj   printf("st be16 0x%08x\n", foo);
10567b0a95cb163b8ae43620346a5f8024c33d3864asewardj
10667b0a95cb163b8ae43620346a5f8024c33d3864asewardj   foo = 0x12345678; write16le( &foo, 0xABCD );
10767b0a95cb163b8ae43620346a5f8024c33d3864asewardj   printf("st le16 0x%08x\n", foo);
10867b0a95cb163b8ae43620346a5f8024c33d3864asewardj
10967b0a95cb163b8ae43620346a5f8024c33d3864asewardj   foo = 0x12345678; write32be( &foo, 0xABCD1425 );
11067b0a95cb163b8ae43620346a5f8024c33d3864asewardj   printf("st be32 0x%08x\n", foo);
11167b0a95cb163b8ae43620346a5f8024c33d3864asewardj
11267b0a95cb163b8ae43620346a5f8024c33d3864asewardj   foo = 0x12345678; write32le( &foo, 0xABCD1425 );
11367b0a95cb163b8ae43620346a5f8024c33d3864asewardj   printf("st le32 0x%08x\n", foo);
11467b0a95cb163b8ae43620346a5f8024c33d3864asewardj
11567b0a95cb163b8ae43620346a5f8024c33d3864asewardj   return 0;
11667b0a95cb163b8ae43620346a5f8024c33d3864asewardj}
117