#include "tests/asm.h" #include char in_b, out_b1, out_b2, in_b2; short in_w, out_w1, out_w2; int in_l, out_l1, out_l2; extern void sbb_ib_al ( void ); asm("\n" ".text\n" VG_SYM(sbb_ib_al) ":\n" "\tmovb " VG_SYM(in_b) ", %al\n" "\tclc\n" "\tsbbb $5, %al\n" "\tmovb %al, " VG_SYM(out_b1) "\n" "\tmovb " VG_SYM(in_b) ", %al\n" "\tstc\n" "\tsbbb $5, %al\n" "\tmovb %al, " VG_SYM(out_b2) "\n" "\tret\n" ".previous\n" ); extern void sbb_iw_ax ( void ); asm("\n" ".text\n" VG_SYM(sbb_iw_ax) ":\n" "\tmovw " VG_SYM(in_w) ", %ax\n" "\tclc\n" "\tsbbw $555, %ax\n" "\tmovw %ax, " VG_SYM(out_w1) "\n" "\tmovw " VG_SYM(in_w) ", %ax\n" "\tstc\n" "\tsbbw $555, %ax\n" "\tmovw %ax, " VG_SYM(out_w2) "\n" "\tret\n" ".previous\n" ); extern void sbb_il_eax ( void ); asm("\n" ".text\n" VG_SYM(sbb_il_eax) ":\n" "\tmovl " VG_SYM(in_l) ", %eax\n" "\tclc\n" "\tsbbl $555666, %eax\n" "\tmovl %eax, " VG_SYM(out_l1) "\n" "\tmovl " VG_SYM(in_l) ", %eax\n" "\tstc\n" "\tsbbl $555666, %eax\n" "\tmovl %eax, " VG_SYM(out_l2) "\n" "\tret\n" ".previous\n" ); extern void sbb_eb_gb ( void ); asm("\n" ".text\n" VG_SYM(sbb_eb_gb) ":\n" "\tmovb " VG_SYM(in_b) ", %al\n" "\tclc\n" "\tsbbb " VG_SYM(in_b2) ", %al\n" "\tmovb %al, " VG_SYM(out_b1) "\n" "\tmovb " VG_SYM(in_b) ", %al\n" "\tstc\n" "\tsbbb " VG_SYM(in_b2) ", %al\n" "\tmovb %al, " VG_SYM(out_b2) "\n" "\tret\n" ".previous\n" ); extern void sbb_eb_gb_2 ( void ); asm("\n" ".text\n" VG_SYM(sbb_eb_gb_2) ":\n" "\tpushl %ecx\n" "\tmovb " VG_SYM(in_b) ", %cl\n" "\tmovb " VG_SYM(in_b2) ", %dh\n" "\tclc\n" "\tsbbb %dh,%cl\n" "\tmovb %cl, " VG_SYM(out_b1) "\n" "\tmovb " VG_SYM(in_b) ", %cl\n" "\tmovb " VG_SYM(in_b2) ", %dh\n" "\tstc\n" "\tsbbb %dh,%cl\n" "\tmovb %cl, " VG_SYM(out_b2) "\n" "\tpopl %ecx\n" "\tret\n" ".previous\n" ); extern void adc_eb_gb ( void ); asm("\n" ".text\n" VG_SYM(adc_eb_gb) ":\n" "\tmovb " VG_SYM(in_b) ", %al\n" "\tclc\n" "\tadcb " VG_SYM(in_b2) ", %al\n" "\tmovb %al, " VG_SYM(out_b1) "\n" "\tmovb " VG_SYM(in_b) ", %al\n" "\tstc\n" "\tadcb " VG_SYM(in_b2) ", %al\n" "\tmovb %al, " VG_SYM(out_b2) "\n" "\tret\n" ".previous\n" ); extern void adc_eb_gb_2 ( void ); asm("\n" ".text\n" VG_SYM(adc_eb_gb_2) ":\n" "\tpushl %ecx\n" "\tmovb " VG_SYM(in_b) ", %cl\n" "\tmovb " VG_SYM(in_b2) ", %dh\n" "\tclc\n" "\tadcb %dh,%cl\n" "\tmovb %cl, " VG_SYM(out_b1) "\n" "\tmovb " VG_SYM(in_b) ", %cl\n" "\tmovb " VG_SYM(in_b2) ", %dh\n" "\tstc\n" "\tadcb %dh,%cl\n" "\tmovb %cl, " VG_SYM(out_b2) "\n" "\tpopl %ecx\n" "\tret\n" ".previous\n" ); extern void adc_ib_al ( void ); asm("\n" ".text\n" VG_SYM(adc_ib_al) ":\n" "\tmovb " VG_SYM(in_b) ", %al\n" "\tclc\n" "\tadcb $5, %al\n" "\tmovb %al, " VG_SYM(out_b1) "\n" "\tmovb " VG_SYM(in_b) ", %al\n" "\tstc\n" "\tadcb $5, %al\n" "\tmovb %al, " VG_SYM(out_b2) "\n" "\tret\n" ".previous\n" ); extern void adc_iw_ax ( void ); asm("\n" ".text\n" VG_SYM(adc_iw_ax) ":\n" "\tmovw " VG_SYM(in_w) ", %ax\n" "\tclc\n" "\tadcw $555, %ax\n" "\tmovw %ax, " VG_SYM(out_w1) "\n" "\tmovw " VG_SYM(in_w) ", %ax\n" "\tstc\n" "\tadcw $555, %ax\n" "\tmovw %ax, " VG_SYM(out_w2) "\n" "\tret\n" ".previous\n" ); extern void adc_il_eax ( void ); asm("\n" ".text\n" VG_SYM(adc_il_eax) ":\n" "\tmovl " VG_SYM(in_l) ", %eax\n" "\tclc\n" "\tadcl $555666, %eax\n" "\tmovl %eax, " VG_SYM(out_l1) "\n" "\tmovl " VG_SYM(in_l) ", %eax\n" "\tstc\n" "\tadcl $555666, %eax\n" "\tmovl %eax, " VG_SYM(out_l2) "\n" "\tret\n" ".previous\n" ); int main ( void ) { in_b = 99; sbb_ib_al(); printf("r1 = %d %d\n", (int)out_b1, (int)out_b2); in_w = 49999; sbb_iw_ax(); printf("r2 = %d %d\n", (int)out_w1, (int)out_w2); in_l = 0xF0000000; sbb_il_eax(); printf("r3 = %d %d\n", (int)out_l1, (int)out_l2); in_b = 99; in_b2 = 88; sbb_eb_gb(); printf("r4 = %d %d\n", (int)out_b1, (int)out_b2); in_b = 66; in_b2 = 77; sbb_eb_gb_2(); printf("r5 = %d %d\n", (int)out_b1, (int)out_b2); in_b = 99; in_b2 = 88; adc_eb_gb(); printf("r6 = %d %d\n", (int)out_b1, (int)out_b2); in_b = 66; in_b2 = 77; adc_eb_gb_2(); printf("r7 = %d %d\n", (int)out_b1, (int)out_b2); in_b = 99; adc_ib_al(); printf("r8 = %d %d\n", (int)out_b1, (int)out_b2); in_w = 49999; adc_iw_ax(); printf("r9 = %d %d\n", (int)out_w1, (int)out_w2); in_l = 0xF0000000; adc_il_eax(); printf("r10 = %d %d\n", (int)out_l1, (int)out_l2); return 0; }