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), long arg1, long arg2 )
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(arg1, arg2);
25   }
26   signal(SIGTRAP, SIG_DFL);
27
28   printf("%s(%4lld,%4lld) -> %s\n", who, (long long int)arg1,
29	   (long long int)arg2,
30	  trapped ? "TRAP" : "no trap" );
31}
32
33static void tw_0 ( long n, long m ) {
34  __asm__ __volatile__("tw 0, %0,%1"
35		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
36}
37static void tw_1 ( long n, long m ) {
38  __asm__ __volatile__("tw 1, %0,%1"
39		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
40}
41static void tw_2 ( long n, long m ) {
42  __asm__ __volatile__("tw 2, %0,%1"
43		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
44}
45static void tw_3 ( long n, long m ) {
46  __asm__ __volatile__("tw 3, %0,%1"
47		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
48}
49static void tw_4 ( long n, long m ) {
50  __asm__ __volatile__("tw 4, %0,%1"
51		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
52}
53static void tw_5 ( long n, long m ) {
54  __asm__ __volatile__("tw 5, %0,%1"
55		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
56}
57static void tw_6 ( long n, long m ) {
58  __asm__ __volatile__("tw 6, %0,%1"
59		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
60}
61static void tw_7 ( long n, long m ) {
62  __asm__ __volatile__("tw 7, %0,%1"
63		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
64}
65static void tw_8 ( long n, long m ) {
66  __asm__ __volatile__("tw 8, %0,%1"
67		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
68}
69static void tw_9 ( long n, long m ) {
70  __asm__ __volatile__("tw 9, %0,%1"
71		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
72}
73static void tw_10 ( long n, long m ) {
74  __asm__ __volatile__("tw 10, %0,%1"
75		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
76}
77static void tw_11 ( long n, long m ) {
78  __asm__ __volatile__("tw 11, %0,%1"
79		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
80}
81static void tw_12 ( long n, long m ) {
82  __asm__ __volatile__("tw 12, %0,%1"
83		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
84}
85static void tw_13 ( long n, long m ) {
86  __asm__ __volatile__("tw 13, %0,%1"
87		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
88}
89static void tw_14 ( long n, long m ) {
90  __asm__ __volatile__("tw 14, %0,%1"
91		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
92}
93static void tw_15 ( long n, long m ) {
94  __asm__ __volatile__("tw 15, %0,%1"
95		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
96}
97static void tw_16 ( long n, long m ) {
98  __asm__ __volatile__("tw 16, %0,%1"
99		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
100}
101static void tw_17 ( long n, long m ) {
102  __asm__ __volatile__("tw 17, %0,%1"
103		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
104}
105static void tw_18 ( long n, long m ) {
106  __asm__ __volatile__("tw 18, %0,%1"
107		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
108}
109static void tw_19 ( long n, long m ) {
110  __asm__ __volatile__("tw 19, %0,%1"
111		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
112}
113static void tw_20 ( long n, long m ) {
114  __asm__ __volatile__("tw 20, %0,%1"
115		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
116}
117static void tw_21 ( long n, long m ) {
118  __asm__ __volatile__("tw 21, %0,%1"
119		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
120}
121static void tw_22 ( long n, long m ) {
122  __asm__ __volatile__("tw 22, %0,%1"
123		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
124}
125static void tw_23 ( long n, long m ) {
126  __asm__ __volatile__("tw 23, %0,%1"
127		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
128}
129static void tw_24 ( long n, long m ) {
130  __asm__ __volatile__("tw 24, %0,%1"
131		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
132}
133static void tw_25 ( long n, long m ) {
134  __asm__ __volatile__("tw 25, %0,%1"
135		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
136}
137static void tw_26 ( long n, long m ) {
138  __asm__ __volatile__("tw 26, %0,%1"
139		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
140}
141static void tw_27 ( long n, long m ) {
142  __asm__ __volatile__("tw 27, %0,%1"
143		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
144}
145static void tw_28 ( long n, long m ) {
146  __asm__ __volatile__("tw 28, %0,%1"
147		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
148}
149static void tw_29 ( long n, long m ) {
150  __asm__ __volatile__("tw 29, %0,%1"
151		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
152}
153static void tw_30 ( long n, long m ) {
154  __asm__ __volatile__("tw 30, %0,%1"
155		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
156}
157static void tw_31 ( long n, long m ) {
158  __asm__ __volatile__("tw 31, %0,%1"
159		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
160}
161
162#if defined(__powerpc64__)
163
164static void td_0 ( long n, long m ) {
165  __asm__ __volatile__("td 0, %0,%1"
166		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
167}
168static void td_1 ( long n, long m ) {
169  __asm__ __volatile__("td 1, %0,%1"
170		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
171}
172static void td_2 ( long n, long m ) {
173  __asm__ __volatile__("td 2, %0,%1"
174		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
175}
176static void td_3 ( long n, long m ) {
177  __asm__ __volatile__("td 3, %0,%1"
178		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
179}
180static void td_4 ( long n, long m ) {
181  __asm__ __volatile__("td 4, %0,%1"
182		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
183}
184static void td_5 ( long n, long m ) {
185  __asm__ __volatile__("td 5, %0,%1"
186		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
187}
188static void td_6 ( long n, long m ) {
189  __asm__ __volatile__("td 6, %0,%1"
190		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
191}
192static void td_7 ( long n, long m ) {
193  __asm__ __volatile__("td 7, %0,%1"
194		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
195}
196static void td_8 ( long n, long m ) {
197  __asm__ __volatile__("td 8, %0,%1"
198		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
199}
200static void td_9 ( long n, long m ) {
201  __asm__ __volatile__("td 9, %0,%1"
202		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
203}
204static void td_10 ( long n, long m ) {
205  __asm__ __volatile__("td 10, %0,%1"
206		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
207}
208static void td_11 ( long n, long m ) {
209  __asm__ __volatile__("td 11, %0,%1"
210		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
211}
212static void td_12 ( long n, long m ) {
213  __asm__ __volatile__("td 12, %0,%1"
214		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
215}
216static void td_13 ( long n, long m ) {
217  __asm__ __volatile__("td 13, %0,%1"
218		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
219}
220static void td_14 ( long n, long m ) {
221  __asm__ __volatile__("td 14, %0,%1"
222		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
223}
224static void td_15 ( long n, long m ) {
225  __asm__ __volatile__("td 15, %0,%1"
226		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
227}
228static void td_16 ( long n, long m ) {
229  __asm__ __volatile__("td 16, %0,%1"
230		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
231}
232static void td_17 ( long n, long m ) {
233  __asm__ __volatile__("td 17, %0,%1"
234		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
235}
236static void td_18 ( long n, long m ) {
237  __asm__ __volatile__("td 18, %0,%1"
238		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
239}
240static void td_19 ( long n, long m ) {
241  __asm__ __volatile__("td 19, %0,%1"
242		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
243}
244static void td_20 ( long n, long m ) {
245  __asm__ __volatile__("td 20, %0,%1"
246		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
247}
248static void td_21 ( long n, long m ) {
249  __asm__ __volatile__("td 21, %0,%1"
250		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
251}
252static void td_22 ( long n, long m ) {
253  __asm__ __volatile__("td 22, %0,%1"
254		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
255}
256static void td_23 ( long n, long m ) {
257  __asm__ __volatile__("td 23, %0,%1"
258		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
259}
260static void td_24 ( long n, long m ) {
261  __asm__ __volatile__("td 24, %0,%1"
262		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
263}
264static void td_25 ( long n, long m ) {
265  __asm__ __volatile__("td 25, %0,%1"
266		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
267}
268static void td_26 ( long n, long m ) {
269  __asm__ __volatile__("td 26, %0,%1"
270		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
271}
272static void td_27 ( long n, long m ) {
273  __asm__ __volatile__("td 27, %0,%1"
274		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
275}
276static void td_28 ( long n, long m ) {
277  __asm__ __volatile__("td 28, %0,%1"
278		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
279}
280static void td_29 ( long n, long m ) {
281  __asm__ __volatile__("td 29, %0,%1"
282		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
283}
284static void td_30 ( long n, long m ) {
285  __asm__ __volatile__("td 30, %0,%1"
286		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
287}
288static void td_31 ( long n, long m ) {
289  __asm__ __volatile__("td 31, %0,%1"
290		       : /*out*/ : /*in*/ "r" (n), "r" (m) );
291}
292
293#endif
294
295
296int main ( void )
297{
298#define TW_GROUP(cmp) \
299   try("tw_" #cmp "", tw_##cmp, -150, -100); \
300   try("tw_" #cmp "", tw_##cmp, -100, -100); \
301   try("tw_" #cmp "", tw_##cmp,  -50, -100);
302
303   TW_GROUP(0);
304   TW_GROUP(1);
305   TW_GROUP(2);
306   TW_GROUP(3);
307   TW_GROUP(4);
308   TW_GROUP(5);
309   TW_GROUP(6);
310   TW_GROUP(7);
311   TW_GROUP(8);
312   TW_GROUP(9);
313   TW_GROUP(10);
314   TW_GROUP(11);
315   TW_GROUP(12);
316   TW_GROUP(13);
317   TW_GROUP(14);
318   TW_GROUP(15);
319   TW_GROUP(16);
320   TW_GROUP(17);
321   TW_GROUP(18);
322   TW_GROUP(19);
323   TW_GROUP(20);
324   TW_GROUP(21);
325   TW_GROUP(22);
326   TW_GROUP(23);
327   TW_GROUP(24);
328   TW_GROUP(25);
329   TW_GROUP(26);
330   TW_GROUP(27);
331   TW_GROUP(28);
332   TW_GROUP(29);
333   TW_GROUP(30);
334   TW_GROUP(31);
335#if defined(__powerpc64__)
336#define TD_GROUP(cmp) \
337   try("td_" #cmp "", td_##cmp, -150, -100); \
338   try("td_" #cmp "", td_##cmp, -100, -100); \
339   try("td_" #cmp "", td_##cmp,  -50, -100);
340
341   TD_GROUP(0);
342   TD_GROUP(1);
343   TD_GROUP(2);
344   TD_GROUP(3);
345   TD_GROUP(4);
346   TD_GROUP(5);
347   TD_GROUP(6);
348   TD_GROUP(7);
349   TD_GROUP(8);
350   TD_GROUP(9);
351   TD_GROUP(10);
352   TD_GROUP(11);
353   TD_GROUP(12);
354   TD_GROUP(13);
355   TD_GROUP(14);
356   TD_GROUP(15);
357   TD_GROUP(16);
358   TD_GROUP(17);
359   TD_GROUP(18);
360   TD_GROUP(19);
361   TD_GROUP(20);
362   TD_GROUP(21);
363   TD_GROUP(22);
364   TD_GROUP(23);
365   TD_GROUP(24);
366   TD_GROUP(25);
367   TD_GROUP(26);
368   TD_GROUP(27);
369   TD_GROUP(28);
370   TD_GROUP(29);
371   TD_GROUP(30);
372   TD_GROUP(31);
373#endif
374   return 0;
375}
376