#include #include #include #include #define HAS_ALTIVEC #include /* Something of the same size as void*, so can be safely be coerced to/from a pointer type. Also same size as the host's gp registers. */ #ifndef __powerpc64__ typedef uint32_t HWord_t; #else typedef uint64_t HWord_t; #endif // #ifndef __powerpc64__ static vector unsigned int* viargs = NULL; register HWord_t r14 __asm__ ("r14"); register HWord_t r15 __asm__ ("r15"); static void build_viargs_table (void) { viargs = memalign(16, 2 * sizeof(vector unsigned int)); viargs[0] = (vector unsigned int) { 0x01020304,0x05060708,0x090A0B0C,0x0E0D0E0F }; viargs[1] = (vector unsigned int) { 0xF1F2F3F4,0xF5F6F7F8,0xF9FAFBFC,0xFEFDFEFF }; } int main(void) { volatile vector unsigned int vec_out; unsigned int *dst; int i; build_viargs_table(); i = -1; // for (i=-1; i<17; i++) { vec_out = (vector unsigned int){ 0,0,0,0 }; // make sure start address is 16 aligned - use viargs[0] r15 = (HWord_t)&viargs[0]; r14 = i; // do stuff __asm__ __volatile__ ("lvsl 17, 14, 15"); // retrieve output <- r17 __asm__ __volatile__ ("vor %0,17,17" : "=vr" (vec_out)); dst = (unsigned int*)&vec_out; printf(" => %08x %08x %08x %08x\n", dst[0], dst[1], dst[2], dst[3]); // } }