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 } 178