Home | History | Annotate | Download | only in mips64
      1 #include "const.h"
      2 
      3 typedef enum {
      4    ABSS=0, ABSD,   ADDS,   ADDD,
      5    DIVS,   DIVD,   MULS,   MULD,
      6    NEGS,   NEGD,   SQRTS,  SQRTD,
      7    SUBS,   SUBD,   RECIPS, RECIPD,
      8    RSQRTS, RSQRTD, MSUBS,  MSUBD,
      9    MADDS,  MADDD,  NMADDS, NMADDD,
     10    NMSUBS, NMSUBD
     11 } flt_art_op_t;
     12 
     13 typedef enum {
     14    CEILWS=0, CEILWD,  FLOORWS,  FLOORWD,
     15    ROUNDWS,  ROUNDWD, TRUNCWS,  TRUNCWD,
     16    CEILLS,   CEILLD,  FLOORLS,  FLOORLD,
     17    ROUNDLS,  ROUNDLD, TRUNCLS,  TRUNCLD
     18 } flt_dir_op_t;
     19 
     20 typedef enum {
     21    CVTDS, CVTDW, CVTSD, CVTSW,
     22    CVTWS, CVTWD, CVTDL, CVTLS,
     23    CVTLD, CVTSL,
     24 } flt_round_op_t;
     25 
     26 const char *flt_art_op_names[] = {
     27    "abs.s",   "abs.d",   "add.s",   "add.d",
     28    "div.s",   "div.d",   "mul.s",   "mul.d",
     29    "neg.s",   "neg.d",   "sqrt.s",  "sqrt.d",
     30    "sub.s",   "sub.d",   "recip.s", "recip.d",
     31    "rsqrt.s", "rsqrt.d", "msub.s",  "msub.d",
     32    "madd.s",  "madd.d",  "nmadd.s", "nmadd.d",
     33    "nmsub.s", "nmsub.d"
     34 };
     35 
     36 const char *flt_dir_op_names[] = {
     37    "ceil.w.s",  "ceil.w.d",
     38    "floor.w.s", "floor.w.d",
     39    "round.w.s", "round.w.d",
     40    "trunc.w.s", "trunc.w.d",
     41    "ceil.l.s",  "ceil.l.d",
     42    "floor.l.s", "floor.l.d",
     43    "round.l.s", "round.l.d",
     44    "trunc.l.s", "trunc.l.d"
     45 };
     46 
     47 const char *flt_round_op_names[] = {
     48    "cvt.d.s", "cvt.d.w",
     49    "cvt.s.d", "cvt.s.w",
     50    "cvt.w.s", "cvt.w.d",
     51    "cvt.d.l", "cvt.l.s",
     52    "cvt.l.d", "cvt.s.l",
     53 };
     54 
     55 #define UNOPdd(op)               \
     56    fd_d = 0;                     \
     57    __asm__ __volatile__(         \
     58       op"   %1, %2"   "\n\t"     \
     59       "cfc1 %0, $31"  "\n\t"     \
     60       : "=r" (fcsr), "=f"(fd_d)  \
     61       : "f"(fs_d[i])             \
     62    );
     63 
     64 #define UNOPff(op)               \
     65    fd_f = 0;                     \
     66    __asm__ __volatile__(         \
     67       op"   %1, %2"   "\n\t"     \
     68       "cfc1 %0, $31"  "\n\t"     \
     69       : "=r" (fcsr), "=f"(fd_f)  \
     70       : "f"(fs_f[i])             \
     71    );
     72 
     73 #define UNOPfd(op)               \
     74    fd_d = 0;                     \
     75    __asm__ __volatile__(         \
     76       op"   %1, %2"   "\n\t"     \
     77       "cfc1 %0, $31"  "\n\t"     \
     78       : "=r" (fcsr), "=f"(fd_d)  \
     79       : "f"(fs_f[i])             \
     80    );
     81 
     82 #define UNOPdf(op)               \
     83    fd_f = 0;                     \
     84    __asm__ __volatile__(         \
     85       op"   %1, %2"   "\n\t"     \
     86       "cfc1 %0, $31"  "\n\t"     \
     87       : "=r" (fcsr), "=f"(fd_f)  \
     88       : "f"(fs_d[i])             \
     89    );
     90 
     91 #define UNOPfw(op)               \
     92    fd_w = 0;                     \
     93    __asm__ __volatile__(         \
     94       op"   $f0, %2"   "\n\t"    \
     95       "mfc1 %1,  $f0"  "\n\t"    \
     96       "cfc1 %0,  $31"  "\n\t"    \
     97       : "=r" (fcsr), "=r"(fd_w)  \
     98       : "f"(fs_f[i])             \
     99       : "$f0"                    \
    100    );
    101 
    102 #define UNOPdw(op)               \
    103    fd_w = 0;                     \
    104    __asm__ __volatile__(         \
    105       op"   $f0, %2"   "\n\t"    \
    106       "mfc1 %1,  $f0"  "\n\t"    \
    107       "cfc1 %0,  $31"  "\n\t"    \
    108       : "=r" (fcsr), "=r"(fd_w)  \
    109       : "f"(fs_d[i])             \
    110       : "$f0"                    \
    111    );
    112 
    113 #define UNOPwd(op)               \
    114    fd_d = 0;                     \
    115    __asm__ __volatile__(         \
    116       "mtc1 %2,  $f0"  "\n\t"    \
    117       op"   %1,  $f0"  "\n\t"    \
    118       "cfc1 %0,  $31"  "\n\t"    \
    119       : "=r" (fcsr), "=f"(fd_d)  \
    120       : "r"(fs_w[i])             \
    121       : "$f0"                    \
    122    );
    123 
    124 #define UNOPwf(op)               \
    125    fd_f = 0;                     \
    126    __asm__ __volatile__(         \
    127       "mtc1 %2,  $f0"  "\n\t"    \
    128       op"   %1,  $f0"  "\n\t"    \
    129       "cfc1 %0,  $31"  "\n\t"    \
    130       : "=r" (fcsr), "=f"(fd_f)  \
    131       : "r"(fs_w[i])             \
    132       : "$f0"                    \
    133    );
    134 
    135 #define UNOPld(op)               \
    136    fd_d = 0;                     \
    137    __asm__ __volatile__(         \
    138       "dmtc1 %2, $f0"  "\n\t"    \
    139       op"    %1, $f0"  "\n\t"    \
    140       "cfc1  %0, $31"  "\n\t"    \
    141       : "=r" (fcsr), "=f"(fd_d)  \
    142       : "r"(fs_l[i])             \
    143       : "$f0"                    \
    144    );
    145 
    146 #define UNOPdl(op)               \
    147    fd_l = 0;                     \
    148    __asm__ __volatile__(         \
    149       op"    $f0, %2"   "\n\t"   \
    150       "dmfc1 %1,  $f0"  "\n\t"   \
    151       "cfc1  %0,  $31"  "\n\t"   \
    152       : "=r" (fcsr), "=r"(fd_l)  \
    153       : "f"(fs_d[i])             \
    154       : "$f0"                    \
    155    );
    156 
    157 #define UNOPls(op)               \
    158    fd_f = 0;                     \
    159    __asm__ __volatile__(         \
    160       "dmtc1 %2, $f0"  "\n\t"    \
    161       op"    %1, $f0"  "\n\t"    \
    162       "cfc1  %0, $31"  "\n\t"    \
    163       : "=r" (fcsr), "=f"(fd_f)  \
    164       : "r"(fs_l[i])             \
    165       : "$f0"                    \
    166    );
    167 
    168 #define UNOPsl(op)               \
    169    fd_l = 0;                     \
    170    __asm__ __volatile__(         \
    171       op"    $f0, %2"   "\n\t"   \
    172       "dmfc1 %1,  $f0"  "\n\t"   \
    173       "cfc1  %0,  $31"  "\n\t"   \
    174       : "=r" (fcsr), "=r"(fd_l)  \
    175       : "f"(fs_f[i])             \
    176       : "$f0"                    \
    177    );
    178 
    179 #define BINOPf(op)                    \
    180    fd_f = 0;                          \
    181    __asm__ __volatile__(              \
    182       op"    %1, %2, %3"  "\n\t"      \
    183       "cfc1  %0, $31"     "\n\t"      \
    184       : "=r" (fcsr), "=f" (fd_f)      \
    185       : "f" (fs_f[i]), "f" (ft_f[i])  \
    186    );
    187 
    188 #define BINOPd(op)                    \
    189    fd_d = 0;                          \
    190    __asm__ __volatile__(              \
    191       op" %1, %2, %3"  "\n\t"         \
    192       "cfc1  %0, $31"     "\n\t"      \
    193       : "=r" (fcsr), "=f"(fd_d)       \
    194       : "f" (fs_d[i]), "f" (ft_d[i])  \
    195    );
    196 
    197 #define TRIOPf(op)                                    \
    198    fd_f = 0;                                          \
    199    __asm__ __volatile__(                              \
    200       op"    %1, %2, %3, %4"  "\n\t"                  \
    201       "cfc1  %0, $31"         "\n\t"                  \
    202       : "=r" (fcsr), "=f" (fd_f)                      \
    203       : "f" (fr_f[i]), "f" (fs_f[i]) , "f" (ft_f[i])  \
    204    );
    205 
    206 #define TRIOPd(op)                                    \
    207    fd_d = 0;                                          \
    208    __asm__ __volatile__(                              \
    209       op"    %1, %2, %3, %4"  "\n\t"                  \
    210       "cfc1  %0, $31"         "\n\t"                  \
    211       : "=r" (fcsr), "=f"(fd_d)                       \
    212       : "f" (fr_d[i]), "f" (fs_d[i]) , "f" (ft_d[i])  \
    213    );
    214 
    215 /* Conditional macros.*/
    216 #define TESTINST1s(instruction, RDval)               \
    217 {                                                    \
    218    float outf = 0;                                   \
    219    __asm__ __volatile__(                             \
    220       ".set        noreorder"                "\n\t"  \
    221       "mov.s       $f1,   %1"                "\n\t"  \
    222       "mov.s       $f2,   %2"                "\n\t"  \
    223       "mtc1        $zero, $f0"               "\n\t"  \
    224       "c.eq.s      $f1,   $f2"               "\n\t"  \
    225       instruction" end"instruction"s"#RDval  "\n\t"  \
    226       "nop"                                  "\n\t"  \
    227       "add.s       $f0,   $f0, $f1"          "\n\t"  \
    228       "end"instruction"s"#RDval":"           "\n\t"  \
    229       "add.s       $f0,   $f0, $f2"          "\n\t"  \
    230       "mov.s       %0,    $f0"               "\n\t"  \
    231       ".set        reorder"                  "\n\t"  \
    232       : "=f" (outf)                                  \
    233       : "f" (fs_f[i]) , "f" (ft_f[i])                \
    234       : "$f0", "$f1", "$f2"                          \
    235    );                                                \
    236    printf("%s, c.eq.s   out=%f, fs=%f, ft=%f\n",     \
    237           instruction, outf, fs_f[i], ft_f[i]);      \
    238 }
    239 
    240 #define TESTINST1d(instruction, RDval)               \
    241 {                                                    \
    242    double outd = 0;                                  \
    243    __asm__ __volatile__(                             \
    244       ".set        noreorder"                "\n\t"  \
    245       "mov.d       $f1,   %1"                "\n\t"  \
    246       "mov.d       $f2,   %2"                "\n\t"  \
    247       "dmtc1       $zero, $f0"               "\n\t"  \
    248       "c.eq.d      $f1,   $f2"               "\n\t"  \
    249       instruction" end"instruction"d"#RDval  "\n\t"  \
    250       "nop"                                  "\n\t"  \
    251       "add.d       $f0,   $f0, $f1"          "\n\t"  \
    252       "end"instruction"d"#RDval":"           "\n\t"  \
    253       "add.d       $f0,   $f0, $f2"          "\n\t"  \
    254       "mov.d       %0,    $f0"               "\n\t"  \
    255       ".set        reorder"                  "\n\t"  \
    256       : "=f" (outd)                                  \
    257       : "f" (fs_d[i]) , "f" (ft_d[i])                \
    258       : "$f0", "$f1", "$f2"                          \
    259    );                                                \
    260    printf("%s, c.eq.d   out=%f, fs=%f, ft=%f\n",     \
    261           instruction, outd, fs_d[i], ft_d[i]);      \
    262 }
    263 
    264 #define TESTINST2s(instruction, RDval)               \
    265 {                                                    \
    266    float outf = 0;                                   \
    267    __asm__ __volatile__(                             \
    268       ".set        noreorder"                "\n\t"  \
    269       "mov.s       $f1,   %1"                "\n\t"  \
    270       "mov.s       $f2,   %2"                "\n\t"  \
    271       "mtc1        $zero, $f0"               "\n\t"  \
    272       "c.eq.s      $f1,   $f2"               "\n\t"  \
    273       instruction" end"instruction"s"#RDval  "\n\t"  \
    274       "add.s       $f0,   $f0, $f1"          "\n\t"  \
    275       "end"instruction"s"#RDval":"           "\n\t"  \
    276       "add.s       $f0,   $f0, $f2"          "\n\t"  \
    277       "mov.s       %0, $f0"                  "\n\t"  \
    278       ".set        reorder"                  "\n\t"  \
    279       : "=f" (outf)                                  \
    280       : "f" (fs_f[i]) , "f" (ft_f[i])                \
    281       : "$f0", "$f1", "$f2"                          \
    282    );                                                \
    283    printf("%s, c.eq.s   out=%f, fs=%f, ft=%f\n",     \
    284           instruction, outf, fs_f[i], ft_f[i]);      \
    285 }
    286 
    287 #define TESTINST2d(instruction, RDval)               \
    288 {                                                    \
    289    double outd = 0;                                  \
    290    __asm__ __volatile__(                             \
    291       ".set        noreorder"                "\n\t"  \
    292       "mov.d       $f1,   %1"                "\n\t"  \
    293       "mov.d       $f2,   %2"                "\n\t"  \
    294       "dmtc1       $zero, $f0"               "\n\t"  \
    295       "c.eq.d      $f1,   $f2"               "\n\t"  \
    296       instruction" end"instruction"d"#RDval  "\n\t"  \
    297       "add.d       $f0,   $f0, $f1"          "\n\t"  \
    298       "end"instruction"d"#RDval":"           "\n\t"  \
    299       "add.d       $f0,   $f0, $f2"          "\n\t"  \
    300       "mov.d       %0, $f0"                  "\n\t"  \
    301       ".set        reorder"                  "\n\t"  \
    302       : "=f" (outd)                                  \
    303       : "f" (fs_d[i]) , "f" (ft_d[i])                \
    304       : "$f0", "$f1", "$f2"                          \
    305    );                                                \
    306    printf("%s, c.eq.d   out=%f, fs=%f, ft=%f\n",     \
    307           instruction, outd, fs_d[i], ft_d[i]);      \
    308 }
    309 
    310 #define TESTINST_CONDs(instruction, RDval)       \
    311 {                                                \
    312    float outf = 0;                               \
    313    __asm__ __volatile__(                         \
    314       ".set        noreorder"         "\n\t"     \
    315       "mov.s       $f1,   %1"         "\n\t"     \
    316       "mov.s       $f2,   %2"         "\n\t"     \
    317       "mov.s       $f0,   %1"         "\n\t"     \
    318       instruction" $f1,   $f2"        "\n\t"     \
    319       "bc1f end"instruction"s"#RDval  "\n\t"     \
    320       "nop"                           "\n\t"     \
    321       "add.s       $f0,   $f0, $f2"   "\n\t"     \
    322       "end"instruction"s"#RDval":"    "\n\t"     \
    323       "mov.s       %0,    $f0"        "\n\t"     \
    324       ".set        reorder"           "\n\t"     \
    325       : "=f" (outf)                              \
    326       : "f" (fs_f[i]) , "f" (ft_f[i])            \
    327       : "$f0", "$f1", "$f2"                      \
    328    );                                            \
    329    printf("%s, bc1f   out=%f, fs=%f, ft=%f\n",   \
    330           instruction, outf, fs_f[i], ft_f[i]);  \
    331 }
    332 
    333 #define TESTINST_CONDd(instruction, RDval)       \
    334 {                                                \
    335    double outd = 0;                              \
    336    __asm__ __volatile__(                         \
    337       ".set        noreorder"         "\n\t"     \
    338       "mov.d       $f1,   %1"         "\n\t"     \
    339       "mov.d       $f2,   %2"         "\n\t"     \
    340       "mov.d       $f0,   %1"         "\n\t"     \
    341       instruction" $f1,   $f2"        "\n\t"     \
    342       "bc1f end"instruction"d"#RDval  "\n\t"     \
    343       "nop"                           "\n\t"     \
    344       "add.d       $f0,   $f0, $f2"   "\n\t"     \
    345       "end"instruction"d"#RDval":"    "\n\t"     \
    346       "mov.d       %0,    $f0"        "\n\t"     \
    347       ".set        reorder"           "\n\t"     \
    348       : "=f" (outd)                              \
    349       : "f" (fs_d[i]) , "f" (ft_d[i])            \
    350       : "$f0", "$f1", "$f2"                      \
    351    );                                            \
    352    printf("%s, bc1f   out=%f, fs=%f, ft=%f\n",   \
    353           instruction, outd, fs_d[i], ft_d[i]);  \
    354 }
    355