1 #include "tests/asm.h"
2 #include <stdio.h>
3 
4 char in_b, out_b1, out_b2, in_b2;
5 
6 short in_w, out_w1, out_w2;
7 
8 int in_l, out_l1, out_l2;
9 
10 extern void sbb_ib_al ( void );
11 asm("\n"
12 VG_SYM(sbb_ib_al) ":\n"
13 
14 "\tmovb " VG_SYM(in_b) ", %al\n"
15 "\tclc\n"
16 "\tsbbb $5, %al\n"
17 "\tmovb %al, " VG_SYM(out_b1) "\n"
18 
19 "\tmovb " VG_SYM(in_b) ", %al\n"
20 "\tstc\n"
21 "\tsbbb $5, %al\n"
22 "\tmovb %al, " VG_SYM(out_b2) "\n"
23 
24 "\tret\n"
25 );
26 
27 
28 extern void sbb_iw_ax ( void );
29 asm("\n"
30 VG_SYM(sbb_iw_ax) ":\n"
31 
32 "\tmovw " VG_SYM(in_w) ", %ax\n"
33 "\tclc\n"
34 "\tsbbw $555, %ax\n"
35 "\tmovw %ax, " VG_SYM(out_w1) "\n"
36 
37 "\tmovw " VG_SYM(in_w) ", %ax\n"
38 "\tstc\n"
39 "\tsbbw $555, %ax\n"
40 "\tmovw %ax, " VG_SYM(out_w2) "\n"
41 
42 "\tret\n"
43 );
44 
45 
46 extern void sbb_il_eax ( void );
47 asm("\n"
48 VG_SYM(sbb_il_eax) ":\n"
49 
50 "\tmovl " VG_SYM(in_l) ", %eax\n"
51 "\tclc\n"
52 "\tsbbl $555666, %eax\n"
53 "\tmovl %eax, " VG_SYM(out_l1) "\n"
54 
55 "\tmovl " VG_SYM(in_l) ", %eax\n"
56 "\tstc\n"
57 "\tsbbl $555666, %eax\n"
58 "\tmovl %eax, " VG_SYM(out_l2) "\n"
59 
60 "\tret\n"
61 );
62 
63 
64 extern void sbb_eb_gb ( void );
65 asm("\n"
66 VG_SYM(sbb_eb_gb) ":\n"
67 
68 "\tmovb " VG_SYM(in_b) ", %al\n"
69 "\tclc\n"
70 "\tsbbb " VG_SYM(in_b2) ", %al\n"
71 "\tmovb %al, " VG_SYM(out_b1) "\n"
72 
73 "\tmovb " VG_SYM(in_b) ", %al\n"
74 "\tstc\n"
75 "\tsbbb " VG_SYM(in_b2) ", %al\n"
76 "\tmovb %al, " VG_SYM(out_b2) "\n"
77 
78 "\tret\n"
79 );
80 
81 
82 extern void sbb_eb_gb_2 ( void );
83 asm("\n"
84 VG_SYM(sbb_eb_gb_2) ":\n"
85 "\tpushl %ecx\n"
86 
87 "\tmovb " VG_SYM(in_b) ", %cl\n"
88 "\tmovb " VG_SYM(in_b2) ", %dh\n"
89 "\tclc\n"
90 "\tsbbb %dh,%cl\n"
91 "\tmovb %cl, " VG_SYM(out_b1) "\n"
92 
93 "\tmovb " VG_SYM(in_b) ", %cl\n"
94 "\tmovb " VG_SYM(in_b2) ", %dh\n"
95 "\tstc\n"
96 "\tsbbb %dh,%cl\n"
97 "\tmovb %cl, " VG_SYM(out_b2) "\n"
98 
99 "\tpopl %ecx\n"
100 "\tret\n"
101 );
102 
103 
104 extern void adc_eb_gb ( void );
105 asm("\n"
106 VG_SYM(adc_eb_gb) ":\n"
107 
108 "\tmovb " VG_SYM(in_b) ", %al\n"
109 "\tclc\n"
110 "\tadcb " VG_SYM(in_b2) ", %al\n"
111 "\tmovb %al, " VG_SYM(out_b1) "\n"
112 
113 "\tmovb " VG_SYM(in_b) ", %al\n"
114 "\tstc\n"
115 "\tadcb " VG_SYM(in_b2) ", %al\n"
116 "\tmovb %al, " VG_SYM(out_b2) "\n"
117 
118 "\tret\n"
119 );
120 
121 
122 extern void adc_eb_gb_2 ( void );
123 asm("\n"
124 VG_SYM(adc_eb_gb_2) ":\n"
125 "\tpushl %ecx\n"
126 
127 "\tmovb " VG_SYM(in_b) ", %cl\n"
128 "\tmovb " VG_SYM(in_b2) ", %dh\n"
129 "\tclc\n"
130 "\tadcb %dh,%cl\n"
131 "\tmovb %cl, " VG_SYM(out_b1) "\n"
132 
133 "\tmovb " VG_SYM(in_b) ", %cl\n"
134 "\tmovb " VG_SYM(in_b2) ", %dh\n"
135 "\tstc\n"
136 "\tadcb %dh,%cl\n"
137 "\tmovb %cl, " VG_SYM(out_b2) "\n"
138 
139 "\tpopl %ecx\n"
140 "\tret\n"
141 );
142 
143 extern void adc_ib_al ( void );
144 asm("\n"
145 VG_SYM(adc_ib_al) ":\n"
146 
147 "\tmovb " VG_SYM(in_b) ", %al\n"
148 "\tclc\n"
149 "\tadcb $5, %al\n"
150 "\tmovb %al, " VG_SYM(out_b1) "\n"
151 
152 "\tmovb " VG_SYM(in_b) ", %al\n"
153 "\tstc\n"
154 "\tadcb $5, %al\n"
155 "\tmovb %al, " VG_SYM(out_b2) "\n"
156 
157 "\tret\n"
158 );
159 
160 
161 extern void adc_iw_ax ( void );
162 asm("\n"
163 VG_SYM(adc_iw_ax) ":\n"
164 
165 "\tmovw " VG_SYM(in_w) ", %ax\n"
166 "\tclc\n"
167 "\tadcw $555, %ax\n"
168 "\tmovw %ax, " VG_SYM(out_w1) "\n"
169 
170 "\tmovw " VG_SYM(in_w) ", %ax\n"
171 "\tstc\n"
172 "\tadcw $555, %ax\n"
173 "\tmovw %ax, " VG_SYM(out_w2) "\n"
174 
175 "\tret\n"
176 );
177 
178 
179 extern void adc_il_eax ( void );
180 asm("\n"
181 VG_SYM(adc_il_eax) ":\n"
182 
183 "\tmovl " VG_SYM(in_l) ", %eax\n"
184 "\tclc\n"
185 "\tadcl $555666, %eax\n"
186 "\tmovl %eax, " VG_SYM(out_l1) "\n"
187 
188 "\tmovl " VG_SYM(in_l) ", %eax\n"
189 "\tstc\n"
190 "\tadcl $555666, %eax\n"
191 "\tmovl %eax, " VG_SYM(out_l2) "\n"
192 
193 "\tret\n"
194 );
195 
196 
main(void)197 int main ( void )
198 {
199    in_b = 99;
200    sbb_ib_al();
201    printf("r1 = %d %d\n", (int)out_b1, (int)out_b2);
202 
203    in_w = 49999;
204    sbb_iw_ax();
205    printf("r2 = %d %d\n", (int)out_w1, (int)out_w2);
206 
207    in_l = 0xF0000000;
208    sbb_il_eax();
209    printf("r3 = %d %d\n", (int)out_l1, (int)out_l2);
210 
211    in_b = 99;
212    in_b2 = 88;
213    sbb_eb_gb();
214    printf("r4 = %d %d\n", (int)out_b1, (int)out_b2);
215 
216    in_b = 66;
217    in_b2 = 77;
218    sbb_eb_gb_2();
219    printf("r5 = %d %d\n", (int)out_b1, (int)out_b2);
220 
221    in_b = 99;
222    in_b2 = 88;
223    adc_eb_gb();
224    printf("r6 = %d %d\n", (int)out_b1, (int)out_b2);
225 
226    in_b = 66;
227    in_b2 = 77;
228    adc_eb_gb_2();
229    printf("r7 = %d %d\n", (int)out_b1, (int)out_b2);
230 
231    in_b = 99;
232    adc_ib_al();
233    printf("r8 = %d %d\n", (int)out_b1, (int)out_b2);
234 
235    in_w = 49999;
236    adc_iw_ax();
237    printf("r9 = %d %d\n", (int)out_w1, (int)out_w2);
238 
239    in_l = 0xF0000000;
240    adc_il_eax();
241    printf("r10 = %d %d\n", (int)out_l1, (int)out_l2);
242 
243    return 0;
244 }
245