1
2#include <stdio.h>
3#include <signal.h>
4#include <setjmp.h>
5#include <string.h>
6#include <assert.h>
7
8static jmp_buf env_sigtrap;
9static void handler_sigtrap ( int x ) { longjmp(env_sigtrap,1); }
10
11void try ( char* who, void(*maybe_traps)(long), long arg )
12{
13   struct sigaction tmp_act;
14   int r, trapped = 0;
15   memset(&tmp_act, 0, sizeof(tmp_act));
16   tmp_act.sa_handler = handler_sigtrap;
17   sigemptyset(&tmp_act.sa_mask);
18   tmp_act.sa_flags = SA_NODEFER;
19   r = sigaction(SIGTRAP, &tmp_act, NULL);
20   assert(r == 0);
21   if (setjmp(env_sigtrap)) {
22      trapped = 1;
23   } else {
24      maybe_traps(arg);
25   }
26   signal(SIGTRAP, SIG_DFL);
27
28   printf("%s(%4lld) -> %s\n", who, (long long int)arg,
29	  trapped ? "TRAP" : "no trap" );
30}
31
32static void twi_0_neg100 ( long n ) {
33  __asm__ __volatile__("twi 0, %0,-100"
34		       : /*out*/ : /*in*/ "r" (n) );
35}
36static void twi_1_neg100 ( long n ) {
37  __asm__ __volatile__("twi 1, %0,-100"
38		       : /*out*/ : /*in*/ "r" (n) );
39}
40static void twi_2_neg100 ( long n ) {
41  __asm__ __volatile__("twi 2, %0,-100"
42		       : /*out*/ : /*in*/ "r" (n) );
43}
44static void twi_3_neg100 ( long n ) {
45  __asm__ __volatile__("twi 3, %0,-100"
46		       : /*out*/ : /*in*/ "r" (n) );
47}
48static void twi_4_neg100 ( long n ) {
49  __asm__ __volatile__("twi 4, %0,-100"
50		       : /*out*/ : /*in*/ "r" (n) );
51}
52static void twi_5_neg100 ( long n ) {
53  __asm__ __volatile__("twi 5, %0,-100"
54		       : /*out*/ : /*in*/ "r" (n) );
55}
56static void twi_6_neg100 ( long n ) {
57  __asm__ __volatile__("twi 6, %0,-100"
58		       : /*out*/ : /*in*/ "r" (n) );
59}
60static void twi_7_neg100 ( long n ) {
61  __asm__ __volatile__("twi 7, %0,-100"
62		       : /*out*/ : /*in*/ "r" (n) );
63}
64static void twi_8_neg100 ( long n ) {
65  __asm__ __volatile__("twi 8, %0,-100"
66		       : /*out*/ : /*in*/ "r" (n) );
67}
68static void twi_9_neg100 ( long n ) {
69  __asm__ __volatile__("twi 9, %0,-100"
70		       : /*out*/ : /*in*/ "r" (n) );
71}
72static void twi_10_neg100 ( long n ) {
73  __asm__ __volatile__("twi 10, %0,-100"
74		       : /*out*/ : /*in*/ "r" (n) );
75}
76static void twi_11_neg100 ( long n ) {
77  __asm__ __volatile__("twi 11, %0,-100"
78		       : /*out*/ : /*in*/ "r" (n) );
79}
80static void twi_12_neg100 ( long n ) {
81  __asm__ __volatile__("twi 12, %0,-100"
82		       : /*out*/ : /*in*/ "r" (n) );
83}
84static void twi_13_neg100 ( long n ) {
85  __asm__ __volatile__("twi 13, %0,-100"
86		       : /*out*/ : /*in*/ "r" (n) );
87}
88static void twi_14_neg100 ( long n ) {
89  __asm__ __volatile__("twi 14, %0,-100"
90		       : /*out*/ : /*in*/ "r" (n) );
91}
92static void twi_15_neg100 ( long n ) {
93  __asm__ __volatile__("twi 15, %0,-100"
94		       : /*out*/ : /*in*/ "r" (n) );
95}
96static void twi_16_neg100 ( long n ) {
97  __asm__ __volatile__("twi 16, %0,-100"
98		       : /*out*/ : /*in*/ "r" (n) );
99}
100static void twi_17_neg100 ( long n ) {
101  __asm__ __volatile__("twi 17, %0,-100"
102		       : /*out*/ : /*in*/ "r" (n) );
103}
104static void twi_18_neg100 ( long n ) {
105  __asm__ __volatile__("twi 18, %0,-100"
106		       : /*out*/ : /*in*/ "r" (n) );
107}
108static void twi_19_neg100 ( long n ) {
109  __asm__ __volatile__("twi 19, %0,-100"
110		       : /*out*/ : /*in*/ "r" (n) );
111}
112static void twi_20_neg100 ( long n ) {
113  __asm__ __volatile__("twi 20, %0,-100"
114		       : /*out*/ : /*in*/ "r" (n) );
115}
116static void twi_21_neg100 ( long n ) {
117  __asm__ __volatile__("twi 21, %0,-100"
118		       : /*out*/ : /*in*/ "r" (n) );
119}
120static void twi_22_neg100 ( long n ) {
121  __asm__ __volatile__("twi 22, %0,-100"
122		       : /*out*/ : /*in*/ "r" (n) );
123}
124static void twi_23_neg100 ( long n ) {
125  __asm__ __volatile__("twi 23, %0,-100"
126		       : /*out*/ : /*in*/ "r" (n) );
127}
128static void twi_24_neg100 ( long n ) {
129  __asm__ __volatile__("twi 24, %0,-100"
130		       : /*out*/ : /*in*/ "r" (n) );
131}
132static void twi_25_neg100 ( long n ) {
133  __asm__ __volatile__("twi 25, %0,-100"
134		       : /*out*/ : /*in*/ "r" (n) );
135}
136static void twi_26_neg100 ( long n ) {
137  __asm__ __volatile__("twi 26, %0,-100"
138		       : /*out*/ : /*in*/ "r" (n) );
139}
140static void twi_27_neg100 ( long n ) {
141  __asm__ __volatile__("twi 27, %0,-100"
142		       : /*out*/ : /*in*/ "r" (n) );
143}
144static void twi_28_neg100 ( long n ) {
145  __asm__ __volatile__("twi 28, %0,-100"
146		       : /*out*/ : /*in*/ "r" (n) );
147}
148static void twi_29_neg100 ( long n ) {
149  __asm__ __volatile__("twi 29, %0,-100"
150		       : /*out*/ : /*in*/ "r" (n) );
151}
152static void twi_30_neg100 ( long n ) {
153  __asm__ __volatile__("twi 30, %0,-100"
154		       : /*out*/ : /*in*/ "r" (n) );
155}
156static void twi_31_neg100 ( long n ) {
157  __asm__ __volatile__("twi 31, %0,-100"
158		       : /*out*/ : /*in*/ "r" (n) );
159}
160
161#if defined(__powerpc64__)
162
163static void tdi_0_neg100 ( long n ) {
164  __asm__ __volatile__("tdi 0, %0,-100"
165		       : /*out*/ : /*in*/ "r" (n) );
166}
167static void tdi_1_neg100 ( long n ) {
168  __asm__ __volatile__("tdi 1, %0,-100"
169		       : /*out*/ : /*in*/ "r" (n) );
170}
171static void tdi_2_neg100 ( long n ) {
172  __asm__ __volatile__("tdi 2, %0,-100"
173		       : /*out*/ : /*in*/ "r" (n) );
174}
175static void tdi_3_neg100 ( long n ) {
176  __asm__ __volatile__("tdi 3, %0,-100"
177		       : /*out*/ : /*in*/ "r" (n) );
178}
179static void tdi_4_neg100 ( long n ) {
180  __asm__ __volatile__("tdi 4, %0,-100"
181		       : /*out*/ : /*in*/ "r" (n) );
182}
183static void tdi_5_neg100 ( long n ) {
184  __asm__ __volatile__("tdi 5, %0,-100"
185		       : /*out*/ : /*in*/ "r" (n) );
186}
187static void tdi_6_neg100 ( long n ) {
188  __asm__ __volatile__("tdi 6, %0,-100"
189		       : /*out*/ : /*in*/ "r" (n) );
190}
191static void tdi_7_neg100 ( long n ) {
192  __asm__ __volatile__("tdi 7, %0,-100"
193		       : /*out*/ : /*in*/ "r" (n) );
194}
195static void tdi_8_neg100 ( long n ) {
196  __asm__ __volatile__("tdi 8, %0,-100"
197		       : /*out*/ : /*in*/ "r" (n) );
198}
199static void tdi_9_neg100 ( long n ) {
200  __asm__ __volatile__("tdi 9, %0,-100"
201		       : /*out*/ : /*in*/ "r" (n) );
202}
203static void tdi_10_neg100 ( long n ) {
204  __asm__ __volatile__("tdi 10, %0,-100"
205		       : /*out*/ : /*in*/ "r" (n) );
206}
207static void tdi_11_neg100 ( long n ) {
208  __asm__ __volatile__("tdi 11, %0,-100"
209		       : /*out*/ : /*in*/ "r" (n) );
210}
211static void tdi_12_neg100 ( long n ) {
212  __asm__ __volatile__("tdi 12, %0,-100"
213		       : /*out*/ : /*in*/ "r" (n) );
214}
215static void tdi_13_neg100 ( long n ) {
216  __asm__ __volatile__("tdi 13, %0,-100"
217		       : /*out*/ : /*in*/ "r" (n) );
218}
219static void tdi_14_neg100 ( long n ) {
220  __asm__ __volatile__("tdi 14, %0,-100"
221		       : /*out*/ : /*in*/ "r" (n) );
222}
223static void tdi_15_neg100 ( long n ) {
224  __asm__ __volatile__("tdi 15, %0,-100"
225		       : /*out*/ : /*in*/ "r" (n) );
226}
227static void tdi_16_neg100 ( long n ) {
228  __asm__ __volatile__("tdi 16, %0,-100"
229		       : /*out*/ : /*in*/ "r" (n) );
230}
231static void tdi_17_neg100 ( long n ) {
232  __asm__ __volatile__("tdi 17, %0,-100"
233		       : /*out*/ : /*in*/ "r" (n) );
234}
235static void tdi_18_neg100 ( long n ) {
236  __asm__ __volatile__("tdi 18, %0,-100"
237		       : /*out*/ : /*in*/ "r" (n) );
238}
239static void tdi_19_neg100 ( long n ) {
240  __asm__ __volatile__("tdi 19, %0,-100"
241		       : /*out*/ : /*in*/ "r" (n) );
242}
243static void tdi_20_neg100 ( long n ) {
244  __asm__ __volatile__("tdi 20, %0,-100"
245		       : /*out*/ : /*in*/ "r" (n) );
246}
247static void tdi_21_neg100 ( long n ) {
248  __asm__ __volatile__("tdi 21, %0,-100"
249		       : /*out*/ : /*in*/ "r" (n) );
250}
251static void tdi_22_neg100 ( long n ) {
252  __asm__ __volatile__("tdi 22, %0,-100"
253		       : /*out*/ : /*in*/ "r" (n) );
254}
255static void tdi_23_neg100 ( long n ) {
256  __asm__ __volatile__("tdi 23, %0,-100"
257		       : /*out*/ : /*in*/ "r" (n) );
258}
259static void tdi_24_neg100 ( long n ) {
260  __asm__ __volatile__("tdi 24, %0,-100"
261		       : /*out*/ : /*in*/ "r" (n) );
262}
263static void tdi_25_neg100 ( long n ) {
264  __asm__ __volatile__("tdi 25, %0,-100"
265		       : /*out*/ : /*in*/ "r" (n) );
266}
267static void tdi_26_neg100 ( long n ) {
268  __asm__ __volatile__("tdi 26, %0,-100"
269		       : /*out*/ : /*in*/ "r" (n) );
270}
271static void tdi_27_neg100 ( long n ) {
272  __asm__ __volatile__("tdi 27, %0,-100"
273		       : /*out*/ : /*in*/ "r" (n) );
274}
275static void tdi_28_neg100 ( long n ) {
276  __asm__ __volatile__("tdi 28, %0,-100"
277		       : /*out*/ : /*in*/ "r" (n) );
278}
279static void tdi_29_neg100 ( long n ) {
280  __asm__ __volatile__("tdi 29, %0,-100"
281		       : /*out*/ : /*in*/ "r" (n) );
282}
283static void tdi_30_neg100 ( long n ) {
284  __asm__ __volatile__("tdi 30, %0,-100"
285		       : /*out*/ : /*in*/ "r" (n) );
286}
287static void tdi_31_neg100 ( long n ) {
288  __asm__ __volatile__("tdi 31, %0,-100"
289		       : /*out*/ : /*in*/ "r" (n) );
290}
291
292#endif
293
294
295int main ( void )
296{
297#define TWI_GROUP(cmp) \
298   try("twi_" #cmp "_neg100", twi_##cmp##_neg100, -150); \
299   try("twi_" #cmp "_neg100", twi_##cmp##_neg100, -100); \
300   try("twi_" #cmp "_neg100", twi_##cmp##_neg100,  -50);
301
302   TWI_GROUP(0);
303   TWI_GROUP(1);
304   TWI_GROUP(2);
305   TWI_GROUP(3);
306   TWI_GROUP(4);
307   TWI_GROUP(5);
308   TWI_GROUP(6);
309   TWI_GROUP(7);
310   TWI_GROUP(8);
311   TWI_GROUP(9);
312   TWI_GROUP(10);
313   TWI_GROUP(11);
314   TWI_GROUP(12);
315   TWI_GROUP(13);
316   TWI_GROUP(14);
317   TWI_GROUP(15);
318   TWI_GROUP(16);
319   TWI_GROUP(17);
320   TWI_GROUP(18);
321   TWI_GROUP(19);
322   TWI_GROUP(20);
323   TWI_GROUP(21);
324   TWI_GROUP(22);
325   TWI_GROUP(23);
326   TWI_GROUP(24);
327   TWI_GROUP(25);
328   TWI_GROUP(26);
329   TWI_GROUP(27);
330   TWI_GROUP(28);
331   TWI_GROUP(29);
332   TWI_GROUP(30);
333   TWI_GROUP(31);
334#if defined(__powerpc64__)
335#define TDI_GROUP(cmp) \
336   try("tdi_" #cmp "_neg100", tdi_##cmp##_neg100, -150); \
337   try("tdi_" #cmp "_neg100", tdi_##cmp##_neg100, -100); \
338   try("tdi_" #cmp "_neg100", tdi_##cmp##_neg100,  -50);
339
340   TDI_GROUP(0);
341   TDI_GROUP(1);
342   TDI_GROUP(2);
343   TDI_GROUP(3);
344   TDI_GROUP(4);
345   TDI_GROUP(5);
346   TDI_GROUP(6);
347   TDI_GROUP(7);
348   TDI_GROUP(8);
349   TDI_GROUP(9);
350   TDI_GROUP(10);
351   TDI_GROUP(11);
352   TDI_GROUP(12);
353   TDI_GROUP(13);
354   TDI_GROUP(14);
355   TDI_GROUP(15);
356   TDI_GROUP(16);
357   TDI_GROUP(17);
358   TDI_GROUP(18);
359   TDI_GROUP(19);
360   TDI_GROUP(20);
361   TDI_GROUP(21);
362   TDI_GROUP(22);
363   TDI_GROUP(23);
364   TDI_GROUP(24);
365   TDI_GROUP(25);
366   TDI_GROUP(26);
367   TDI_GROUP(27);
368   TDI_GROUP(28);
369   TDI_GROUP(29);
370   TDI_GROUP(30);
371   TDI_GROUP(31);
372#endif
373   return 0;
374}
375