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 "\tretq\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 "\tretq\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 "\tretq\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 "\tretq\n" 79 ); 80 81 82 extern void sbb_eb_gb_2 ( void ); 83 asm("\n" 84 VG_SYM(sbb_eb_gb_2) ":\n" 85 "\tpushq %rcx\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 "\tpopq %rcx\n" 100 "\tretq\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 "\tretq\n" 119 ); 120 121 122 extern void adc_eb_gb_2 ( void ); 123 asm("\n" 124 VG_SYM(adc_eb_gb_2) ":\n" 125 "\tpushq %rcx\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 "\tpopq %rcx\n" 140 "\tretq\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 "\tretq\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 "\tretq\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 "\tretq\n" 194 ); 195 196 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