| |
| #include <stdio.h> |
| |
| 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; |
| } |