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