Home | History | Annotate | Download | only in amd64
      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