summaryrefslogtreecommitdiff
path: root/src/third_party/unwind/dist/tests/ppc64-test-altivec.c
diff options
context:
space:
mode:
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.c177
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;
+}