#include typedef unsigned int UInt; typedef unsigned short UShort; UInt read16le ( void* a ) { UInt res; __asm volatile( " lhbrx %0,0,%1 \n" // Get half word and reverse the bytes : "=b" (res) // %0 - Output operand : "b" (a) // %1 - Input operand : "memory" // Consider memory clobberred for aliasing ); return res; } UInt read16be ( void* a ) { UInt res; __asm volatile( " lhzx %0,0,%1 \n" // Get half word and reverse the bytes : "=b" (res) // %0 - Output operand : "b" (a) // %1 - Input operand : "memory" // Consider memory clobberred for aliasing ); return res; } UInt read32le ( void* a ) { UInt res; __asm volatile( " lwbrx %0,0,%1 \n" // Get half word and reverse the bytes : "=b" (res) // %0 - Output operand : "b" (a) // %1 - Input operand : "memory" // Consider memory clobberred for aliasing ); return res; } UInt read32be ( void* a ) { UInt res; __asm volatile( " lwzx %0,0,%1 \n" // Get half word and reverse the bytes : "=b" (res) // %0 - Output operand : "b" (a) // %1 - Input operand : "memory" // Consider memory clobberred for aliasing ); return res; } void write16be ( void* a, UInt data ) { __asm volatile( " sthx %0,0,%1\n" : : "b" (data), "b" (a) : "memory" ); } void write16le ( void* a, UInt data ) { __asm volatile( " sthbrx %0,0,%1\n" : : "b" (data), "b" (a) : "memory" ); } void write32be ( void* a, UInt data ) { __asm volatile( " stwx %0,0,%1\n" : : "b" (data), "b" (a) : "memory" ); } void write32le ( void* a, UInt data ) { __asm volatile( " stwbrx %0,0,%1\n" : : "b" (data), "b" (a) : "memory" ); } int main ( void ) { UInt foo = 0x12345678; printf("ld be16 0x%08x\n", read16be( &foo )); printf("ld le16 0x%08x\n", read16le( &foo )); printf("ld be32 0x%08x\n", read32be( &foo )); printf("ld le32 0x%08x\n", read32le( &foo )); foo = 0x12345678; write16be( &foo, 0xABCD ); printf("st be16 0x%08x\n", foo); foo = 0x12345678; write16le( &foo, 0xABCD ); printf("st le16 0x%08x\n", foo); foo = 0x12345678; write32be( &foo, 0xABCD1425 ); printf("st be32 0x%08x\n", foo); foo = 0x12345678; write32le( &foo, 0xABCD1425 ); printf("st le32 0x%08x\n", foo); return 0; }