disable UNW_ARM_METHOD_FRAME routine
[external/libunwind.git] / tests / ppc64-test-altivec.c
1
2
3 #include <libunwind.h>
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <string.h>
7 #include <unistd.h>
8 #include <altivec.h>
9
10 #include <sys/resource.h>
11
12 #define panic(args...)  { fprintf (stderr, args);  abort(); }
13
14 extern vector signed int vec_init ();
15 extern void vec_print (vector signed int v);
16
17 vector signed int vec_stack (int count);
18
19 int
20 main ()
21 {
22   printf ("&vec_stack = %016lx\n", (unsigned long) vec_stack);
23   vec_stack (3);
24   return 0;
25 }
26
27
28 vector signed int
29 vec_stack (int count)
30 {
31   register vector signed int v1;
32   register vector signed int v2;
33   register vector signed int v3;
34   register vector signed int v4;
35   register vector signed int v5;
36   register vector signed int v6;
37   register vector signed int v7;
38   register vector signed int v8;
39   register vector signed int v9;
40
41   unw_fpreg_t vr;
42
43   unw_cursor_t cursor;
44   unw_word_t ip, sp;
45   unw_context_t uc;
46   int ret;
47   int verbose = 1;
48
49   /* if (count == 0) return vec_init(); */
50
51   if (count == 0)
52     {
53       unw_getcontext (&uc);
54       if (unw_init_local (&cursor, &uc) < 0)
55         {
56           panic ("unw_init_local failed!\n");
57         }
58       else
59         {
60           do
61             {
62               if ((ret = unw_get_reg (&cursor, UNW_REG_IP, &ip)) < 0)
63                 {
64                   panic ("FAILURE: unw_get_reg returned %d for UNW_REG_IP\n",
65                          ret);
66                 }
67               if ((ret = unw_get_reg (&cursor, UNW_REG_SP, &sp)) < 0)
68                 {
69                   panic ("FAILURE: unw_get_reg returned %d for UNW_REG_SP\n",
70                          ret);
71                 }
72               if ((ret = unw_get_fpreg (&cursor, UNW_PPC64_V30, &vr)) < 0)
73                 {
74                   panic
75                     ("FAILURE: unw_get_vreg returned %d for UNW_PPC64_V30\n",
76                      ret);
77                 }
78
79
80               if (verbose)
81                 {
82                   const char *regname = unw_regname (UNW_PPC64_V30);
83                   char proc_name_buffer[256];
84                   unw_word_t offset;
85                   unsigned int * vec_half1, * vec_half2;
86                   vec_half1 = (unsigned int *)&vr;
87                   vec_half2 = vec_half1 + 1;
88                   printf ("ip = %016lx, sp=%016lx\n", (long) ip, (long) sp);
89                   printf ("vr30 = %08x %08x %08x %08x\n",
90                           (unsigned int) (*vec_half1 >> 16),
91                           (unsigned int) (*vec_half1 & 0xffffffff),
92                           (unsigned int) (*vec_half2 >> 16),
93                           (unsigned int) (*vec_half2 & 0xffffffff));
94                   ret =
95                     unw_get_proc_name (&cursor, proc_name_buffer,
96                                        sizeof (proc_name_buffer), &offset);
97                   if (ret == 0)
98                     {
99                       printf ("proc name = %s, offset = %lx\n",
100                               proc_name_buffer, offset);
101                     }
102                   else
103                     {
104                       panic ("unw_get_proc_name returned %d\n", ret);
105                     }
106                   printf ("unw_regname(UNW_PPC_V30) = %s\n\n", regname);
107                 }
108
109               ret = unw_step (&cursor);
110               if (ret < 0)
111                 {
112                   unw_get_reg (&cursor, UNW_REG_IP, &ip);
113                   panic ("FAILURE: unw_step() returned %d for ip=%lx\n", ret,
114                          (long) ip);
115                 }
116             }
117           while (ret > 0);
118         }
119     }
120
121   v1 = vec_init ();
122   v2 = vec_init ();
123   v3 = vec_init ();
124   v4 = vec_init ();
125   v5 = vec_init ();
126   v6 = vec_init ();
127
128   /* make use of all of the registers in some calculation */
129   v7 =
130     vec_nor (v1, vec_add (v2, vec_sub (v3, vec_and (v4, vec_or (v5, v6)))));
131
132   /*
133    * "force" the registers to be non-volatile by making a call and also
134    * using the registers after the call.
135    */
136   v8 = vec_stack (count - 1);
137
138   /*
139    * Use the result from the previous call, plus all of the non-volatile
140    * registers in another calculation.
141    */
142   v9 =
143     vec_nor (v1,
144              vec_add (v2,
145                       vec_sub (v3,
146                                vec_and (v4, vec_or (v5, vec_xor (v6, v8))))));
147
148   printf ("v1 - ");
149   vec_print (v1);
150   printf ("\n");
151   printf ("v2 - ");
152   vec_print (v2);
153   printf ("\n");
154   printf ("v3 - ");
155   vec_print (v3);
156   printf ("\n");
157   printf ("v4 - ");
158   vec_print (v4);
159   printf ("\n");
160   printf ("v5 - ");
161   vec_print (v5);
162   printf ("\n");
163   printf ("v6 - ");
164   vec_print (v6);
165   printf ("\n");
166   printf ("v7 - ");
167   vec_print (v7);
168   printf ("\n");
169   printf ("v8 - ");
170   vec_print (v8);
171   printf ("\n");
172   printf ("v9 - ");
173   vec_print (v9);
174   printf ("\n");
175
176   return v9;
177 }