diff options
Diffstat (limited to 'src/third_party/unwind/dist/tests/ppc64-test-altivec.c')
-rw-r--r-- | src/third_party/unwind/dist/tests/ppc64-test-altivec.c | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/src/third_party/unwind/dist/tests/ppc64-test-altivec.c b/src/third_party/unwind/dist/tests/ppc64-test-altivec.c new file mode 100644 index 00000000000..a3e95eefbbc --- /dev/null +++ b/src/third_party/unwind/dist/tests/ppc64-test-altivec.c @@ -0,0 +1,177 @@ + + +#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; +} |