Add some painfully untested FPU instructions.
authorDavid Given <dg@cowlark.com>
Sun, 2 Sep 2018 19:36:09 +0000 (21:36 +0200)
committerDavid Given <dg@cowlark.com>
Sun, 2 Sep 2018 19:36:09 +0000 (21:36 +0200)
mach/mips/as/instructions.dat
mach/mips/as/mach2.c
mach/mips/as/mach3.c
mach/mips/as/mach4.c

index 1f7aae7..f3736d6 100644 (file)
 000000<RS-><RT-><RD->00000100110 "xor" RD=gpr ',' RS=gpr ',' RT=gpr
 001110<RS-><RT-><IMM-----------> "xori" RT=gpr ',' RS=gpr ',' IMM=e16
 
+# FPU instructions.
+
+010001<F-->00000<FS-><FD->000101 "abs." F=FMT FD=fpr ',' FS=fpr
+010001<F--><FT-><FS-><FD->000000 "add." F=FMT FD=fpr ',' FS=fpr ',' FT=fpr
+010011<RS-><FT-><FS-><FD->011110 "alnv.ps" FD=fpr ',' FS=fpr ',' FT=fpr ',' RS=gpr
+010001<F--><FT-><FS-><C>0011<CO> "c." CO=FCOND '.' F=FMT FS=fpr ',' FT=fpr
+010001<F-->00000<FS-><FD->001010 "ceil.l." F=FMT FD=fpr ',' FS=fpr
+010001<F-->00000<FS-><FD->001110 "ceil.w." F=FMT FD=fpr ',' FS=fpr
+01000100010<RT-><FS->00000000000 "cfc1" RT=gpr ',' FS=fpr
+01000100110<RT-><FS->00000000000 "ctc1" RT=gpr ',' FS=fpr
+010001<F-->00000<FS-><FD->100001 "cvt.d." F=FMT FD=fpr ',' FS=fpr
+010001<F-->00000<FS-><FD->100101 "cvt.l." F=FMT FD=fpr ',' FS=fpr
+01000110000<FT-><FS-><FD->100110 "cvt.ps.s" FD=fpr ',' FS=fpr ',' FT=fpr
+010001<F-->00000<FS-><FD->100000 "cvt.s." F=FMT FD=fpr ',' FS=fpr
+0100011011000000<FS-><FD->101000 "cvt.s.pl" FS=fpr ',' FD=fpr
+0100011011000000<FS-><FD->100000 "cvt.s.pu" FS=fpr ',' FD=fpr
+010001<F-->00000<FS-><FD->100100 "cvt.w." F=FMT FD=fpr ',' FS=fpr
+010001<F--><FT-><FS-><FD->000011 "div." F=FMT FD=fpr ',' FS=fpr ',' FT=fpr
+010001<F-->00000<FS-><FD->001011 "floor.l." F=FMT FD=fpr ',' FS=fpr
+010001<F-->00000<FS-><FD->001111 "floor.w." F=FMT FD=fpr ',' FS=fpr
+110101<RS-><FT-><IMM-----------> "ldc1" FT=fpr ',' IMM=e16 '(' RS=gpr ')'
+010011<RS-><RT->00000<FD->000001 "ldxc1" FD=fpr ',' RT=gpr '(' RS=gpr ')'
+010011<RS-><RT->00000<FD->000101 "luxc1" FD=fpr ',' RT=gpr '(' RS=gpr ')'
+110001<RS-><FT-><IMM-----------> "lwc1" FT=fpr ',' IMM=e16 '(' RS=gpr ')'
+010011<RS-><RT->00000<FD->000000 "lwxc1" FD=fpr ',' RT=gpr '(' RS=gpr ')'
+010011<FR-><FT-><FS-><FD->100<F> "madd." F=FMT3 FD=fpr ',' FR=fpr ',' FS=fpr ',' FT=fpr
+01000100000<RT-><FS->00000000000 "mfc1" RT=gpr ',' FS=fpr
+01000100011<RT-><FS->00000000000 "mfhc1" RT=gpr ',' FS=fpr
+010001<F-->00000<FS-><FD->000110 "mov." F=FMT FD=fpr ',' FS=fpr
+000000<RS-><C>00<RD->00000000001 "movf" RD=gpr ',' RS=gpr ',' C=FCOND
+010001<F--><C>00<FS-><FD->010001 "movf." F=FMT FD=fpr ',' FS=fpr ',' C=FCOND
+010001<F--><RT-><FS-><FD->010011 "movn." F=FMT FD=fpr ',' FS=fpr ',' RT=gpr
+000000<RS-><C>01<RD->00000000001 "movt" RD=gpr ',' RS=gpr ',' C=FCOND
+010001<F--><C>01<FS-><FD->010001 "movt." F=FMT FD=fpr ',' FS=fpr ',' C=FCOND
+010001<F--><RT-><FS-><FD->010010 "movz." F=FMT FD=fpr ',' FS=fpr ',' RT=gpr
+010011<FR-><FT-><FS-><FD->101<F> "msub." F=FMT3 FD=fpr ',' FR=fpr ',' FS=fpr ',' FT=fpr
+01000100100<RT-><FS->00000000000 "mtc1" RT=gpr ',' FS=fpr
+01000100111<RT-><FS->00000000000 "mthc1" RT=gpr ',' FS=fpr
+010001<F--><FT-><FS-><FD->000010 "mul." F=FMT FD=fpr ',' FS=fpr ',' FT=fpr
+010001<F-->00000<FS-><FD->000111 "neg." F=FMT FD=fpr ',' FS=fpr
+010011<FR-><FT-><FS-><FD->110<F> "nmadd." F=FMT3 FD=fpr ',' FR=fpr ',' FS=fpr ',' FT=fpr
+010011<FR-><FT-><FS-><FD->111<F> "nmsub." F=FMT3 FD=fpr ',' FR=fpr ',' FS=fpr ',' FT=fpr
+01000110110<FT-><FS-><FD->101100 "pll.ps" FD=fpr ',' FS=fpr ',' FT=fpr
+01000110110<FT-><FS-><FD->101101 "plu.ps" FD=fpr ',' FS=fpr ',' FT=fpr
+01000110110<FT-><FS-><FD->101110 "pul.ps" FD=fpr ',' FS=fpr ',' FT=fpr
+01000110110<FT-><FS-><FD->101111 "puu.ps" FD=fpr ',' FS=fpr ',' FT=fpr
+010001<F-->00000<FS-><FD->010101 "recip." F=FMT FD=fpr ',' FS=fpr
+010001<F-->00000<FS-><FD->001000 "round.l." F=FMT FD=fpr ',' FS=fpr
+010001<F-->00000<FS-><FD->001100 "round.w." F=FMT FD=fpr ',' FS=fpr
+010001<F-->00000<FS-><FD->010110 "rsqrt." F=FMT FD=fpr ',' FS=fpr
+111101<RS-><FT-><IMM-----------> "sdc1" FT=fpr ',' IMM=e16 '(' RS=gpr ')'
+010011<RS-><RT->00000<FD->001001 "sdxc1" FD=fpr ',' RT=gpr '(' RS=gpr ')'
+010001<F-->00000<FS-><FD->000100 "sqrt." F=FMT FD=fpr ',' FS=fpr
+010001<F--><FT-><FS-><FD->000001 "sub." F=FMT FD=fpr ',' FS=fpr ',' FT=fpr
+010011<RS-><RT->00000<FD->001101 "suxc1" FD=fpr ',' RT=gpr '(' RS=gpr ')'
+111001<RS-><FT-><IMM-----------> "swc1" FT=fpr ',' IMM=e16 '(' RS=gpr ')'
+010011<RS-><RT->00000<FD->001000 "swxc1" FD=fpr ',' RT=gpr '(' RS=gpr ')'
+
+# Generic coprocessor instructions.
+
+01000101000<C>00<OFF-----------> "bc1f" C=u3 ',' OFF=offset16
+0100010100000000<OFF-----------> "bc1f" OFF=offset16
+01000101000<C>10<OFF-----------> "bc1fl" C=u3 ',' OFF=offset16
+0100010100000010<OFF-----------> "bc1fl" OFF=offset16
+01000101000<C>01<OFF-----------> "bc1t" C=u3 ',' OFF=offset16
+0100010100000001<OFF-----------> "bc1t" OFF=offset16
+01000101000<C>11<OFF-----------> "bc1tl" C=u3 ',' OFF=offset16
+0100010100000011<OFF-----------> "bc1tl" OFF=offset16
+01001001000<C>00<OFF-----------> "bc2f" C=u3 ',' OFF=offset16
+0100100100000000<OFF-----------> "bc2f" OFF=offset16
+01001001000<C>10<OFF-----------> "bc2fl" C=u3 ',' OFF=offset16
+0100100100000010<OFF-----------> "bc2fl" OFF=offset16
+01001001000<C>01<OFF-----------> "bc2t" C=u3 ',' OFF=offset16
+0100100100000001<OFF-----------> "bc2t" OFF=offset16
+01001001000<C>11<OFF-----------> "bc2tl" C=u3 ',' OFF=offset16
+0100100100000011<OFF-----------> "bc2tl" OFF=offset16
+01001000010<RT-><IMM-----------> "cfc2" RT=gpr ',' IMM=u16
+01001000110<RT-><IMM-----------> "ctc2" RT=gpr ',' IMM=u16
+0100101<FUN--------------------> "cop2" FUN=u25
+110110<RS-><RT-><IMM-----------> "ldc2" RT=u5 ',' IMM=e16 '(' RS=gpr ')'
+110010<RS-><RT-><IMM-----------> "lwc2" RT=u5 ',' IMM=e16 '(' RS=gpr ')'
+01000000000<RT-><RD->00000000<S> "mfc0" RT=gpr ',' RD=u5 ',' S=u3
+01001000000<RT-><IMM-----------> "mfc2" RT=gpr ',' IMM=u16
+01000000010<RT-><RD->00000000<S> "mfhc0" RT=gpr ',' RD=u5 ',' S=u3
+01001000011<RT-><IMM-----------> "mfhc2" RT=gpr ',' IMM=u16
+01000000100<RT-><RD->00000000<S> "mtc0" RT=gpr ',' RD=u5 ',' S=u3
+01001000100<RT-><IMM-----------> "mtc2" RT=gpr ',' IMM=u16
+01000000110<RT-><RD->00000000<S> "mthc0" RT=gpr ',' RD=u5 ',' S=u3
+01001000111<RT-><IMM-----------> "mthc2" RT=gpr ',' IMM=u16
+111110<RS-><RT-><IMM-----------> "sdc2" RT=u5 ',' IMM=e16 '(' RS=gpr ')'
+111010<RS-><RT-><IMM-----------> "swc2" RT=u5 ',' IMM=e16 '(' RS=gpr ')'
+
+
+
index 2672c0b..11886d0 100644 (file)
@@ -1,9 +1,12 @@
 %token <y_word> GPR
 %token <y_word> FPR
+%token <y_word> FMT
+%token <y_word> FMT3
+%token <y_word> FCOND
 
-%type <y_word> gpr
+%type <y_word> gpr fpr
 %type <y_word> e16 e9
-%type <y_word> u20 u5
+%type <y_word> u25 u20 u16 u5 u3
 %type <y_word> abs26 offset16
 
 %type <y_word> extmsblsb insmsblsb
index 0de4b37..45af1c4 100644 (file)
 0,     FPR,        30,         "f30",
 0,     FPR,        31,         "f31",
 
-#include "tokens.y"
+/* Floating-point comparison values */
+
+0,     FCOND,      0,          "f",
+0,     FCOND,      1,          "un",
+0,     FCOND,      2,          "eq",
+0,     FCOND,      3,          "ueq",
+0,     FCOND,      4,          "olt",
+0,     FCOND,      5,          "ult",
+0,     FCOND,      6,          "ole",
+0,     FCOND,      7,          "ule",
+0,     FCOND,      8,          "sf",
+0,     FCOND,      9,          "ngle",
+0,     FCOND,      10,         "seq",
+0,     FCOND,      11,         "ngl",
+0,     FCOND,      12,         "lt",
+0,     FCOND,      13,         "nge",
+0,     FCOND,      14,         "le",
+0,     FCOND,      15,         "ngt",
+
+0,     FMT,        16,         "s",
+0,     FMT,        17,         "d",
+0,     FMT,        20,         "w",
+0,     FMT,        21,         "l",
+0,     FMT,        22,         "ps",
 
+0,     FMT3,       0,          "s",
+0,     FMT3,       1,          "d",
+0,     FMT3,       4,          "w",
+0,     FMT3,       5,          "l",
+0,     FMT3,       6,          "ps",
+
+#include "tokens.y"
 
index 2185fb2..f4d4c5e 100644 (file)
@@ -1,6 +1,7 @@
 #include "rules.y"
 
 gpr: GPR
+fpr: FPR
 
 e16
        : absexp
@@ -22,6 +23,15 @@ e9
        }
        ;
 
+u25
+       : absexp
+       {
+               if (($1 < 0) || ($1 > 0x1ffffff))
+                       serror("25-bit unsigned value out of range");
+               $$ = $1;
+       }
+       ;
+
 u20
        : absexp
        {
@@ -31,6 +41,14 @@ u20
        }
        ;
 
+u16
+       : absexp
+       {
+               if (($1 < 0) || ($1 > 0xffff))
+                       serror("16-bit unsigned value out of range");
+               $$ = $1;
+       }
+       ;
 
 u5
        : absexp
@@ -41,6 +59,15 @@ u5
        }
        ;
 
+u3
+       : absexp
+       {
+               if (($1 < 0) || ($1 > 0x7))
+                       serror("3-bit unsigned value out of range");
+               $$ = $1;
+       }
+       ;
+
 offset16
        : expr
        {