sbbmisc.c revision b32f58018498ea2225959b0ba11c18f0c433deef
1#include "tests/asm.h"
2#include <stdio.h>
3
4char in_b, out_b1, out_b2, in_b2;
5
6short in_w, out_w1, out_w2;
7
8int in_l, out_l1, out_l2;
9
10extern void sbb_ib_al ( void );
11asm("\n"
12VG_SYM(sbb_ib_al) ":\n"
13
14#ifndef VGP_amd64_darwin
15"\tmovb " VG_SYM(in_b) ", %al\n"
16#else
17"\tmovb " VG_SYM(in_b) "(%rip), %al\n"
18#endif
19
20"\tclc\n"
21"\tsbbb $5, %al\n"
22#ifndef VGP_amd64_darwin
23"\tmovb %al, " VG_SYM(out_b1) "\n"
24
25"\tmovb " VG_SYM(in_b) ", %al\n"
26#else
27"\tmovb %al, " VG_SYM(out_b1) "(%rip)\n"
28
29"\tmovb " VG_SYM(in_b) "(%rip), %al\n"
30#endif
31"\tstc\n"
32"\tsbbb $5, %al\n"
33#ifndef VGP_amd64_darwin
34"\tmovb %al, " VG_SYM(out_b2) "\n"
35#else
36"\tmovb %al," VG_SYM(out_b2) "(%rip) \n"
37#endif
38
39"\tretq\n"
40);
41
42
43extern void sbb_iw_ax ( void );
44asm("\n"
45VG_SYM(sbb_iw_ax) ":\n"
46
47#ifndef VGP_amd64_darwin
48"\tmovw " VG_SYM(in_w) ", %ax\n"
49#else
50"\tmovw " VG_SYM(in_w) "(%rip), %ax\n"
51#endif
52"\tclc\n"
53"\tsbbw $555, %ax\n"
54#ifndef VGP_amd64_darwin
55"\tmovw %ax, " VG_SYM(out_w1) "\n"
56
57"\tmovw " VG_SYM(in_w) ", %ax\n"
58#else
59"\tmovw %ax, " VG_SYM(out_w1) "(%rip)\n"
60
61"\tmovw " VG_SYM(in_w) "(%rip), %ax\n"
62#endif
63"\tstc\n"
64"\tsbbw $555, %ax\n"
65#ifndef VGP_amd64_darwin
66"\tmovw %ax, " VG_SYM(out_w2) "\n"
67#else
68"\tmovw %ax, " VG_SYM(out_w2) "(%rip)\n"
69#endif
70
71"\tretq\n"
72);
73
74
75extern void sbb_il_eax ( void );
76asm("\n"
77VG_SYM(sbb_il_eax) ":\n"
78
79#ifndef VGP_amd64_darwin
80"\tmovl " VG_SYM(in_l) ", %eax\n"
81#else
82"\tmovl " VG_SYM(in_l) "(%rip), %eax\n"
83#endif
84"\tclc\n"
85"\tsbbl $555666, %eax\n"
86#ifndef VGP_amd64_darwin
87"\tmovl %eax, " VG_SYM(out_l1) "\n"
88
89"\tmovl " VG_SYM(in_l) ", %eax\n"
90#else
91"\tmovl %eax, " VG_SYM(out_l1) "(%rip)\n"
92
93"\tmovl " VG_SYM(in_l) "(%rip), %eax\n"
94#endif
95"\tstc\n"
96"\tsbbl $555666, %eax\n"
97#ifndef VGP_amd64_darwin
98"\tmovl %eax, " VG_SYM(out_l2) "\n"
99#else
100"\tmovl %eax, " VG_SYM(out_l2) "(%rip)\n"
101#endif
102
103"\tretq\n"
104);
105
106
107extern void sbb_eb_gb ( void );
108asm("\n"
109VG_SYM(sbb_eb_gb) ":\n"
110
111#ifndef VGP_amd64_darwin
112"\tmovb " VG_SYM(in_b) ", %al\n"
113#else
114"\tmovb " VG_SYM(in_b) "(%rip), %al\n"
115#endif
116"\tclc\n"
117#ifndef VGP_amd64_darwin
118"\tsbbb " VG_SYM(in_b2) ", %al\n"
119"\tmovb %al, " VG_SYM(out_b1) "\n"
120
121"\tmovb " VG_SYM(in_b) ", %al\n"
122#else
123"\tsbbb " VG_SYM(in_b2) "(%rip), %al\n"
124"\tmovb %al, " VG_SYM(out_b1) "(%rip)\n"
125
126"\tmovb " VG_SYM(in_b) "(%rip), %al\n"
127#endif
128"\tstc\n"
129#ifndef VGP_amd64_darwin
130"\tsbbb " VG_SYM(in_b2) ", %al\n"
131"\tmovb %al, " VG_SYM(out_b2) "\n"
132#else
133"\tsbbb " VG_SYM(in_b2) "(%rip), %al\n"
134"\tmovb %al, " VG_SYM(out_b2) "(%rip)\n"
135#endif
136
137"\tretq\n"
138);
139
140
141extern void sbb_eb_gb_2 ( void );
142asm("\n"
143VG_SYM(sbb_eb_gb_2) ":\n"
144"\tpushq %rcx\n"
145
146#ifndef VGP_amd64_darwin
147"\tmovb " VG_SYM(in_b) ", %cl\n"
148"\tmovb " VG_SYM(in_b2) ", %dh\n"
149#else
150"\tmovb " VG_SYM(in_b) "(%rip), %cl\n"
151"\tmovb " VG_SYM(in_b2) "(%rip), %dh\n"
152#endif
153"\tclc\n"
154"\tsbbb %dh,%cl\n"
155#ifndef VGP_amd64_darwin
156"\tmovb %cl, " VG_SYM(out_b1) "\n"
157
158"\tmovb " VG_SYM(in_b) ", %cl\n"
159"\tmovb " VG_SYM(in_b2) ", %dh\n"
160#else
161"\tmovb %cl, " VG_SYM(out_b1) "(%rip)\n"
162
163"\tmovb " VG_SYM(in_b) "(%rip), %cl\n"
164"\tmovb " VG_SYM(in_b2) "(%rip), %dh\n"
165#endif
166"\tstc\n"
167"\tsbbb %dh,%cl\n"
168#ifndef VGP_amd64_darwin
169"\tmovb %cl, " VG_SYM(out_b2) "\n"
170#else
171"\tmovb %cl, " VG_SYM(out_b2) "(%rip)\n"
172#endif
173
174"\tpopq %rcx\n"
175"\tretq\n"
176);
177
178
179extern void adc_eb_gb ( void );
180asm("\n"
181VG_SYM(adc_eb_gb) ":\n"
182
183#ifndef VGP_amd64_darwin
184"\tmovb " VG_SYM(in_b) ", %al\n"
185#else
186"\tmovb " VG_SYM(in_b) "(%rip), %al\n"
187#endif
188"\tclc\n"
189#ifndef VGP_amd64_darwin
190"\tadcb " VG_SYM(in_b2) ", %al\n"
191"\tmovb %al, " VG_SYM(out_b1) "\n"
192
193"\tmovb " VG_SYM(in_b) ", %al\n"
194#else
195"\tadcb " VG_SYM(in_b2) "(%rip), %al\n"
196"\tmovb %al, " VG_SYM(out_b1) "(%rip)\n"
197
198"\tmovb " VG_SYM(in_b) "(%rip), %al\n"
199#endif
200"\tstc\n"
201#ifndef VGP_amd64_darwin
202"\tadcb " VG_SYM(in_b2) ", %al\n"
203"\tmovb %al, " VG_SYM(out_b2) "\n"
204#else
205"\tadcb " VG_SYM(in_b2) "(%rip), %al\n"
206"\tmovb %al, " VG_SYM(out_b2) "(%rip)\n"
207#endif
208
209"\tretq\n"
210);
211
212
213extern void adc_eb_gb_2 ( void );
214asm("\n"
215VG_SYM(adc_eb_gb_2) ":\n"
216"\tpushq %rcx\n"
217
218#ifndef VGP_amd64_darwin
219"\tmovb " VG_SYM(in_b) ", %cl\n"
220"\tmovb " VG_SYM(in_b2) ", %dh\n"
221#else
222"\tmovb " VG_SYM(in_b) "(%rip), %cl\n"
223"\tmovb " VG_SYM(in_b2) "(%rip), %dh\n"
224#endif
225"\tclc\n"
226"\tadcb %dh,%cl\n"
227#ifndef VGP_amd64_darwin
228"\tmovb %cl, " VG_SYM(out_b1) "\n"
229
230"\tmovb " VG_SYM(in_b) ", %cl\n"
231"\tmovb " VG_SYM(in_b2) ", %dh\n"
232#else
233"\tmovb %cl, " VG_SYM(out_b1) "(%rip)\n"
234
235"\tmovb " VG_SYM(in_b) "(%rip), %cl\n"
236"\tmovb " VG_SYM(in_b2) "(%rip), %dh\n"
237#endif
238"\tstc\n"
239"\tadcb %dh,%cl\n"
240#ifndef VGP_amd64_darwin
241"\tmovb %cl, " VG_SYM(out_b2) "\n"
242#else
243"\tmovb %cl, " VG_SYM(out_b2) "(%rip)\n"
244#endif
245
246"\tpopq %rcx\n"
247"\tretq\n"
248);
249
250extern void adc_ib_al ( void );
251asm("\n"
252VG_SYM(adc_ib_al) ":\n"
253
254#ifndef VGP_amd64_darwin
255"\tmovb " VG_SYM(in_b) ", %al\n"
256#else
257"\tmovb " VG_SYM(in_b) "(%rip), %al\n"
258#endif
259"\tclc\n"
260"\tadcb $5, %al\n"
261#ifndef VGP_amd64_darwin
262"\tmovb %al, " VG_SYM(out_b1) "\n"
263
264"\tmovb " VG_SYM(in_b) ", %al\n"
265#else
266"\tmovb %al, " VG_SYM(out_b1) "(%rip)\n"
267
268"\tmovb " VG_SYM(in_b) "(%rip), %al\n"
269#endif
270"\tstc\n"
271"\tadcb $5, %al\n"
272#ifndef VGP_amd64_darwin
273"\tmovb %al, " VG_SYM(out_b2) "\n"
274#else
275"\tmovb %al, " VG_SYM(out_b2) "(%rip)\n"
276#endif
277
278"\tretq\n"
279);
280
281
282extern void adc_iw_ax ( void );
283asm("\n"
284VG_SYM(adc_iw_ax) ":\n"
285
286#ifndef VGP_amd64_darwin
287"\tmovw " VG_SYM(in_w) ", %ax\n"
288#else
289"\tmovw " VG_SYM(in_w) "(%rip), %ax\n"
290#endif
291"\tclc\n"
292"\tadcw $555, %ax\n"
293#ifndef VGP_amd64_darwin
294"\tmovw %ax, " VG_SYM(out_w1) "\n"
295
296"\tmovw " VG_SYM(in_w) ", %ax\n"
297#else
298"\tmovw %ax, " VG_SYM(out_w1) "(%rip)\n"
299
300"\tmovw " VG_SYM(in_w) "(%rip), %ax\n"
301#endif
302"\tstc\n"
303"\tadcw $555, %ax\n"
304#ifndef VGP_amd64_darwin
305"\tmovw %ax, " VG_SYM(out_w2) "\n"
306#else
307"\tmovw %ax, " VG_SYM(out_w2) "(%rip)\n"
308#endif
309
310"\tretq\n"
311);
312
313
314extern void adc_il_eax ( void );
315asm("\n"
316VG_SYM(adc_il_eax) ":\n"
317
318#ifndef VGP_amd64_darwin
319"\tmovl " VG_SYM(in_l) ", %eax\n"
320#else
321"\tmovl " VG_SYM(in_l) "(%rip), %eax\n"
322#endif
323"\tclc\n"
324"\tadcl $555666, %eax\n"
325#ifndef VGP_amd64_darwin
326"\tmovl %eax, " VG_SYM(out_l1) "\n"
327
328"\tmovl " VG_SYM(in_l) ", %eax\n"
329#else
330"\tmovl %eax, " VG_SYM(out_l1) "(%rip)\n"
331
332"\tmovl " VG_SYM(in_l) "(%rip), %eax\n"
333#endif
334"\tstc\n"
335"\tadcl $555666, %eax\n"
336#ifndef VGP_amd64_darwin
337"\tmovl %eax, " VG_SYM(out_l2) "\n"
338#else
339"\tmovl %eax, " VG_SYM(out_l2) "(%rip)\n"
340#endif
341
342"\tretq\n"
343);
344
345
346int main ( void )
347{
348   in_b = 99;
349   sbb_ib_al();
350   printf("r1 = %d %d\n", (int)out_b1, (int)out_b2);
351
352   in_w = 49999;
353   sbb_iw_ax();
354   printf("r2 = %d %d\n", (int)out_w1, (int)out_w2);
355
356   in_l = 0xF0000000;
357   sbb_il_eax();
358   printf("r3 = %d %d\n", (int)out_l1, (int)out_l2);
359
360   in_b = 99;
361   in_b2 = 88;
362   sbb_eb_gb();
363   printf("r4 = %d %d\n", (int)out_b1, (int)out_b2);
364
365   in_b = 66;
366   in_b2 = 77;
367   sbb_eb_gb_2();
368   printf("r5 = %d %d\n", (int)out_b1, (int)out_b2);
369
370   in_b = 99;
371   in_b2 = 88;
372   adc_eb_gb();
373   printf("r6 = %d %d\n", (int)out_b1, (int)out_b2);
374
375   in_b = 66;
376   in_b2 = 77;
377   adc_eb_gb_2();
378   printf("r7 = %d %d\n", (int)out_b1, (int)out_b2);
379
380   in_b = 99;
381   adc_ib_al();
382   printf("r8 = %d %d\n", (int)out_b1, (int)out_b2);
383
384   in_w = 49999;
385   adc_iw_ax();
386   printf("r9 = %d %d\n", (int)out_w1, (int)out_w2);
387
388   in_l = 0xF0000000;
389   adc_il_eax();
390   printf("r10 = %d %d\n", (int)out_l1, (int)out_l2);
391
392   return 0;
393}
394