#include <libunwind.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <altivec.h> #include <sys/resource.h> #define panic(args...) { fprintf (stderr, args); abort(); } extern vector signed int vec_init (); extern void vec_print (vector signed int v); vector signed int vec_stack (int count); int main () { printf ("&vec_stack = %016lx\n", (unsigned long) vec_stack); vec_stack (3); return 0; } vector signed int vec_stack (int count) { register vector signed int v1; register vector signed int v2; register vector signed int v3; register vector signed int v4; register vector signed int v5; register vector signed int v6; register vector signed int v7; register vector signed int v8; register vector signed int v9; unw_fpreg_t vr; unw_cursor_t cursor; unw_word_t ip, sp; unw_context_t uc; int ret; int verbose = 1; /* if (count == 0) return vec_init(); */ if (count == 0) { unw_getcontext (&uc); if (unw_init_local (&cursor, &uc) < 0) { panic ("unw_init_local failed!\n"); } else { do { if ((ret = unw_get_reg (&cursor, UNW_REG_IP, &ip)) < 0) { panic ("FAILURE: unw_get_reg returned %d for UNW_REG_IP\n", ret); } if ((ret = unw_get_reg (&cursor, UNW_REG_SP, &sp)) < 0) { panic ("FAILURE: unw_get_reg returned %d for UNW_REG_SP\n", ret); } if ((ret = unw_get_fpreg (&cursor, UNW_PPC64_V30, &vr)) < 0) { panic ("FAILURE: unw_get_vreg returned %d for UNW_PPC64_V30\n", ret); } if (verbose) { const char *regname = unw_regname (UNW_PPC64_V30); char proc_name_buffer[256]; unw_word_t offset; unsigned int * vec_half1, * vec_half2; vec_half1 = (unsigned int *)&vr; vec_half2 = vec_half1 + 1; printf ("ip = %016lx, sp=%016lx\n", (long) ip, (long) sp); printf ("vr30 = %08x %08x %08x %08x\n", (unsigned int) (*vec_half1 >> 16), (unsigned int) (*vec_half1 & 0xffffffff), (unsigned int) (*vec_half2 >> 16), (unsigned int) (*vec_half2 & 0xffffffff)); ret = unw_get_proc_name (&cursor, proc_name_buffer, sizeof (proc_name_buffer), &offset); if (ret == 0) { printf ("proc name = %s, offset = %lx\n", proc_name_buffer, offset); } else { panic ("unw_get_proc_name returned %d\n", ret); } printf ("unw_regname(UNW_PPC_V30) = %s\n\n", regname); } ret = unw_step (&cursor); if (ret < 0) { unw_get_reg (&cursor, UNW_REG_IP, &ip); panic ("FAILURE: unw_step() returned %d for ip=%lx\n", ret, (long) ip); } } while (ret > 0); } } v1 = vec_init (); v2 = vec_init (); v3 = vec_init (); v4 = vec_init (); v5 = vec_init (); v6 = vec_init (); /* make use of all of the registers in some calculation */ v7 = vec_nor (v1, vec_add (v2, vec_sub (v3, vec_and (v4, vec_or (v5, v6))))); /* * "force" the registers to be non-volatile by making a call and also * using the registers after the call. */ v8 = vec_stack (count - 1); /* * Use the result from the previous call, plus all of the non-volatile * registers in another calculation. */ v9 = vec_nor (v1, vec_add (v2, vec_sub (v3, vec_and (v4, vec_or (v5, vec_xor (v6, v8)))))); printf ("v1 - "); vec_print (v1); printf ("\n"); printf ("v2 - "); vec_print (v2); printf ("\n"); printf ("v3 - "); vec_print (v3); printf ("\n"); printf ("v4 - "); vec_print (v4); printf ("\n"); printf ("v5 - "); vec_print (v5); printf ("\n"); printf ("v6 - "); vec_print (v6); printf ("\n"); printf ("v7 - "); vec_print (v7); printf ("\n"); printf ("v8 - "); vec_print (v8); printf ("\n"); printf ("v9 - "); vec_print (v9); printf ("\n"); return v9; }