decoder.isa revision 2046
12686Sksewell@umich.edu////////////////////////////////////////////////////////////////////
22100SN/A//
35254Sksewell@umich.edu// The actual MIPS32 ISA decoder
45254Sksewell@umich.edu// -----------------------------
55254Sksewell@umich.edu// The following instructions are specified in the MIPS32 ISA
65254Sksewell@umich.edu// Specification. Decoding closely follows the style specified
75254Sksewell@umich.edu// in the MIPS32 ISAthe specification document starting with Table
85254Sksewell@umich.edu// A-2 (document available @ www.mips.com)
95254Sksewell@umich.edu//
105254Sksewell@umich.edu//@todo: Distinguish "unknown/future" use insts from "reserved"
115254Sksewell@umich.edu// ones
125254Sksewell@umich.edudecode OPCODE_HI default FailUnimpl::unknown() {
135254Sksewell@umich.edu
145254Sksewell@umich.edu    // Derived From ... Table A-2 MIPS32 ISA Manual
155254Sksewell@umich.edu    0x0: decode OPCODE_LO default FailUnimpl::reserved(){
165254Sksewell@umich.edu
175254Sksewell@umich.edu        0x0: decode FUNCTION_HI {
185254Sksewell@umich.edu            0x0: decode FUNCTION_LO {
195254Sksewell@umich.edu              0x1: decode MOVCI {
205254Sksewell@umich.edu                format BasicOp {
215254Sksewell@umich.edu                  0: movf({{ if( xc->miscRegs.fpcr == 0) Rd = Rs}});
225254Sksewell@umich.edu                  1: movt({{ if( xc->miscRegs.fpcr == 1) Rd = Rs}});
235254Sksewell@umich.edu                }
245254Sksewell@umich.edu              }
255254Sksewell@umich.edu
265254Sksewell@umich.edu              format BasicOp {
275254Sksewell@umich.edu
285254Sksewell@umich.edu                //Table A-3 Note: "1. Specific encodings of the rt, rd, and sa fields
295254Sksewell@umich.edu                //are used to distinguish among the SLL, NOP, SSNOP and EHB functions."
305254Sksewell@umich.edu
315254Sksewell@umich.edu                0x0: sll({{ Rd = Rt.uw << SA; }});
322706Sksewell@umich.edu
332022SN/A                0x2: decode SRL {
342022SN/A                   0: srl({{ Rd = Rt.uw >> SA; }});
352043SN/A
362024SN/A                   //Hardcoded assuming 32-bit ISA, probably need parameter here
372024SN/A                   1: rotr({{ Rd = (Rt.uw << (32 - SA)) | (Rt.uw >> SA);}});
382043SN/A                 }
392686Sksewell@umich.edu
404661Sksewell@umich.edu                 0x3: sra({{ Rd = Rt.sw >> SA; }});
412022SN/A
422083SN/A                 0x4: sllv({{ Rd = Rt.uw << Rs<4:0>; }});
432686Sksewell@umich.edu
442101SN/A                 0x6: decode SRLV {
452043SN/A                   0: srlv({{ Rd = Rt.uw >> Rs<4:0>; }});
462043SN/A
472101SN/A                   //Hardcoded assuming 32-bit ISA, probably need parameter here
482101SN/A                   1: rotrv({{ Rd = (Rt.uw << (32 - Rs<4:0>)) | (Rt.uw >> Rs<4:0>);}});
496384Sgblack@eecs.umich.edu                 }
506384Sgblack@eecs.umich.edu
516384Sgblack@eecs.umich.edu                 0x7: srav({{ Rd = Rt.sw >> Rs<4:0>; }});
526384Sgblack@eecs.umich.edu              }
536384Sgblack@eecs.umich.edu            }
546384Sgblack@eecs.umich.edu
552101SN/A            0x1: decode FUNCTION_LO {
562101SN/A
572101SN/A              //Table A-3 Note: "Specific encodings of the hint field are used
582046SN/A              //to distinguish JR from JR.HB and JALR from JALR.HB"
592686Sksewell@umich.edu              format Jump {
602686Sksewell@umich.edu                0x0: jr(IsReturn);
612686Sksewell@umich.edu                0x1: jalr(IsCall,IsReturn);
622470SN/A              }
632686Sksewell@umich.edu
644661Sksewell@umich.edu              format BasicOp {
655222Sksewell@umich.edu                0x2: movz({{ if (Rt == 0) Rd = Rs; }});
665222Sksewell@umich.edu                0x3: movn({{ if (Rt != 0) Rd = Rs; }});
672686Sksewell@umich.edu              }
688588Sgblack@eecs.umich.edu
692470SN/A              format Trap {
702241SN/A                0x4: syscall({{ xc->syscall()}},IsNonSpeculative);
712101SN/A                0x5: break({{ }});
722495SN/A                0x7: sync({{ }});
732495SN/A              }
748588Sgblack@eecs.umich.edu            }
752101SN/A
766384Sgblack@eecs.umich.edu            0x2: decode FUNCTION_LO {
776384Sgblack@eecs.umich.edu              format BasicOp {
786384Sgblack@eecs.umich.edu                0x0: mfhi({{ Rd = xc->miscRegs.hi; }});
798588Sgblack@eecs.umich.edu                0x1: mthi({{ xc->miscRegs.hi = Rs; }});
806384Sgblack@eecs.umich.edu                0x2: mflo({{ Rd = xc->miscRegs.lo; }});
812495SN/A                0x3: mtlo({{ xc->miscRegs.lo = Rs; }});
822101SN/A              }
832101SN/A            };
842495SN/A
852495SN/A            0x3: decode FUNCTION_LO {
862495SN/A              format IntOp {
872495SN/A                0x0: mult({{
882495SN/A                        INT64 temp1 = Rs.sw * Rt.sw;
892495SN/A                        xc->miscRegs.hi->temp1<63:32>;
902495SN/A                        xc->miscRegs.lo->temp1<31:0>
912495SN/A                }});
922495SN/A
932495SN/A                0x1: multu({{
942495SN/A                        INT64 temp1 = Rs.uw * Rt.uw;
952495SN/A                        xc->miscRegs.hi->temp1<63:32>;
962495SN/A                        xc->miscRegs.lo->temp1<31:0>
972101SN/A                        Rd.sw = Rs.uw * Rt.uw;
988588Sgblack@eecs.umich.edu                }});
992101SN/A
1002101SN/A                0x2: div({{
1018588Sgblack@eecs.umich.edu                        xc->miscRegs.hi = Rs.sw % Rt.sw;
1022101SN/A                        xc->miscRegs.lo = Rs.sw / Rt.sw;
1036384Sgblack@eecs.umich.edu                        }});
1046384Sgblack@eecs.umich.edu
1056384Sgblack@eecs.umich.edu                0x3: divu({{
1068588Sgblack@eecs.umich.edu                        xc->miscRegs.hi = Rs.uw % Rt.uw;
1078588Sgblack@eecs.umich.edu                        xc->miscRegs.lo = Rs.uw / Rt.uw;
1086384Sgblack@eecs.umich.edu                        }});
1092101SN/A              }
1102101SN/A            };
1112495SN/A
1122495SN/A            0x4: decode FUNCTION_LO {
1132495SN/A              format IntOp {
1142495SN/A                0x0: add({{  Rd.sw = Rs.sw + Rt.sw;}});
1152495SN/A                0x1: addu({{ Rd.uw = Rs.uw + Rt.uw;}});
1166384Sgblack@eecs.umich.edu                0x2: sub({{ Rd.sw = Rs.sw - Rt.sw;}});
1176384Sgblack@eecs.umich.edu                0x3: subu({{ Rd.uw = Rs.uw - Rt.uw;}});
1186384Sgblack@eecs.umich.edu                0x4: and({{ Rd.sw = Rs.uw & Rt.uw;}});
1196384Sgblack@eecs.umich.edu                0x5: or({{ Rd.sw = Rs.uw | Rt.uw;}});
1206384Sgblack@eecs.umich.edu                0x6: xor({{ Rd.sw = Rs.uw ^ Rt.uw;}});
1212495SN/A                0x7: nor({{ Rd.sw = ~(Rs.uw | Rt.uw);}});
1226384Sgblack@eecs.umich.edu              }
1232495SN/A            }
1242495SN/A
1252043SN/A            0x5: decode FUNCTION_LO {
1262043SN/A              format IntOp{
1272025SN/A                0x2: slt({{  Rd.sw = ( Rs.sw < Rt.sw ) ? 1 : 0}});
1282043SN/A                0x3: sltu({{ Rd.uw = ( Rs.uw < Rt.uw ) ? 1 : 0}});
1292686Sksewell@umich.edu              }
1302686Sksewell@umich.edu            };
1312123SN/A
1322101SN/A            0x6: decode FUNCTION_LO {
1336376Sgblack@eecs.umich.edu              format Trap {
1346376Sgblack@eecs.umich.edu                 0x0: tge({{ }});
1356376Sgblack@eecs.umich.edu                 0x1: tgeu({{ }});
1367792Sgblack@eecs.umich.edu                 0x2: tlt({{ }});
1376376Sgblack@eecs.umich.edu                 0x3: tltu({{ }});
1386376Sgblack@eecs.umich.edu                 0x4: teq({{ }});
1396376Sgblack@eecs.umich.edu                 0x6: tne({{ }});
1406376Sgblack@eecs.umich.edu              }
1416376Sgblack@eecs.umich.edu            }
1426376Sgblack@eecs.umich.edu        }
1436376Sgblack@eecs.umich.edu
1447792Sgblack@eecs.umich.edu        0x1: decode REGIMM_HI {
1456376Sgblack@eecs.umich.edu            0x0: decode REGIMM_LO {
1466376Sgblack@eecs.umich.edu              format Branch {
1476376Sgblack@eecs.umich.edu                0x0: bltz({{ cond = (Rs.sq < 0); }});
1486376Sgblack@eecs.umich.edu                0x1: bgez({{ cond = (Rs.sq >= 0); }});
1492101SN/A
1502042SN/A                //MIPS obsolete instructions
1512101SN/A                0x2: bltzl({{ cond = (Rs.sq < 0); }});
1527720Sgblack@eecs.umich.edu                0x3: bgezl({{ cond = (Rs.sq >= 0); }});
1537792Sgblack@eecs.umich.edu              }
1547792Sgblack@eecs.umich.edu            }
1557720Sgblack@eecs.umich.edu
1567720Sgblack@eecs.umich.edu            0x1: decode REGIMM_LO {
1577792Sgblack@eecs.umich.edu              format Trap {
1587792Sgblack@eecs.umich.edu                 0x0: tgei({{ }});
1597720Sgblack@eecs.umich.edu                 0x1: tgeiu({{ }});
1602101SN/A                 0x2: tlti({{ }});
1612101SN/A                 0x3: tltiu({{ }});
1622042SN/A                 0x4: teqi({{ }});
1632101SN/A                 0x6: tnei({{ }});
1642686Sksewell@umich.edu              }
1652686Sksewell@umich.edu            }
1668901Sandreas.hansson@arm.com
16711877Sbrandon.potter@amd.com            0x2: decode REGIMM_LO {
1688564Sgblack@eecs.umich.edu              format Branch {
16910474Sandreas.hansson@arm.com                0x0: bltzal({{ cond = (Rs.sq < 0); }});
1708564Sgblack@eecs.umich.edu                0x1: bgezal({{ cond = (Rs.sq >= 0); }});
1712686Sksewell@umich.edu
17210474Sandreas.hansson@arm.com                //MIPS obsolete instructions
1732101SN/A                0x2: bltzall({{ cond = (Rs.sq < 0); }});
1742083SN/A                0x3: bgezall({{ cond = (Rs.sq >= 0); }});
1752043SN/A              }
1762025SN/A            }
1772043SN/A
1786384Sgblack@eecs.umich.edu            0x3: decode REGIMM_LO {
1796384Sgblack@eecs.umich.edu              format Trap {
1804661Sksewell@umich.edu                0x7: synci({{ }});
1816384Sgblack@eecs.umich.edu              }
1826384Sgblack@eecs.umich.edu            }
1834661Sksewell@umich.edu        }
1842083SN/A
1852025SN/A        format Jump {
1862043SN/A            0x2: j();
1874661Sksewell@umich.edu            0x3: jal(IsCall);
1888588Sgblack@eecs.umich.edu        }
1898588Sgblack@eecs.umich.edu
1904661Sksewell@umich.edu        format Branch {
1914661Sksewell@umich.edu            0x4: beq({{ cond = (Rs.sq == 0); }});
1922686Sksewell@umich.edu            0x5: bne({{ cond = (Rs.sq !=  0); }});
1936384Sgblack@eecs.umich.edu            0x6: blez({{ cond = (Rs.sq <= 0); }});
1948588Sgblack@eecs.umich.edu            0x7: bgtz({{ cond = (Rs.sq > 0); }});
1958588Sgblack@eecs.umich.edu        }
1968588Sgblack@eecs.umich.edu    };
1976384Sgblack@eecs.umich.edu
1985222Sksewell@umich.edu    0x1: decode OPCODE_LO default FailUnimpl::reserved(){
1995222Sksewell@umich.edu        format IntOp {
2006384Sgblack@eecs.umich.edu            0x0: addi({{ Rt.sw = Rs.sw + INTIMM; }});
2018588Sgblack@eecs.umich.edu            0x1: addiu({{ Rt.uw = Rs.uw + INTIMM;}});
2028588Sgblack@eecs.umich.edu            0x2: slti({{ Rt.sw = ( Rs.sw < INTIMM ) ? 1 : 0 }});
2038588Sgblack@eecs.umich.edu            0x3: sltiu({{ Rt.uw = ( Rs.uw < INTIMM ) ? 1 : 0 }});
2046384Sgblack@eecs.umich.edu            0x4: andi({{ Rt.sw = Rs.sw & INTIMM;}});
2055222Sksewell@umich.edu            0x5: ori({{ Rt.sw = Rs.sw | INTIMM;}});
2062101SN/A            0x6: xori({{ Rt.sw = Rs.sw ^ INTIMM;}});
2072084SN/A            0x7: lui({{ Rt = INTIMM << 16}});
2082025SN/A        };
2092495SN/A    };
2102495SN/A
2112495SN/A    0x2: decode OPCODE_LO default FailUnimpl::reserved(){
2126384Sgblack@eecs.umich.edu
2138564Sgblack@eecs.umich.edu      //Table A-11 MIPS32 COP0 Encoding of rs Field
2148564Sgblack@eecs.umich.edu      0x0: decode RS_MSB {
2158738Sgblack@eecs.umich.edu        0x0: decode RS {
2168564Sgblack@eecs.umich.edu
21710474Sandreas.hansson@arm.com           format BasicOp {
2186384Sgblack@eecs.umich.edu                0x0: mfc0({{ }});
2196384Sgblack@eecs.umich.edu                0xC: mtc0({{ }});
2208588Sgblack@eecs.umich.edu                0xA: rdpgpr({{ }});
2215222Sksewell@umich.edu            }
2228564Sgblack@eecs.umich.edu
2238564Sgblack@eecs.umich.edu          0xB: decode SC {
2248738Sgblack@eecs.umich.edu            format BasicOp {
2258564Sgblack@eecs.umich.edu                0x0: di({{ }});
22610474Sandreas.hansson@arm.com                0x1: ei({{ }});
2276384Sgblack@eecs.umich.edu            }
2286384Sgblack@eecs.umich.edu          }
2298588Sgblack@eecs.umich.edu
2306384Sgblack@eecs.umich.edu          0xE: BasicOp::wrpgpr({{ }});
2316384Sgblack@eecs.umich.edu        }
2326384Sgblack@eecs.umich.edu
2336384Sgblack@eecs.umich.edu        //Table A-12 MIPS32 COP0 Encoding of Function Field When rs=CO
2342495SN/A        0x1: decode FUNCTION {
2352101SN/A          format Trap {
2362043SN/A                0x01: tlbr({{ }});
2372025SN/A                0x02: tlbwi({{ }});
2382495SN/A                0x06: tlbwr({{ }});
2392495SN/A                0x08: tlbp({{ }});
2402495SN/A          }
2418588Sgblack@eecs.umich.edu
2428588Sgblack@eecs.umich.edu          format BasicOp {
2432495SN/A                0x18: eret({{ }});
2442101SN/A                0x1F: deret({{ }});
2452084SN/A                0x20: wait({{ }});
2462024SN/A          }
2472043SN/A        }
2482239SN/A      }
2498588Sgblack@eecs.umich.edu
2508588Sgblack@eecs.umich.edu      //Table A-13 MIPS32 COP1 Encoding of rs Field
2518588Sgblack@eecs.umich.edu      0x1: decode RS_MSB {
2528588Sgblack@eecs.umich.edu
2538588Sgblack@eecs.umich.edu        0x0: decode RS_HI {
2548588Sgblack@eecs.umich.edu          0x0: decode RS_LO {
2552101SN/A            0x0: mfc1({{ }});
2562043SN/A            0x2: cfc1({{ }});
2572043SN/A            0x3: mfhc1({{ }});
2582025SN/A            0x4: mtc1({{ }});
2592043SN/A            0x6: ctc1({{ }});
2602043SN/A            0x7: mftc1({{ }});
2612101SN/A          }
2628588Sgblack@eecs.umich.edu
2638588Sgblack@eecs.umich.edu          0x1: decode ND {
2648588Sgblack@eecs.umich.edu            0x0: decode TF {
2658588Sgblack@eecs.umich.edu              format Branch {
2662101SN/A                0x0: bc1f({{ cond = (xc->miscRegs.fpcr == 0); }});
2672043SN/A                0x1: bc1t({{ cond = (xc->miscRegs.fpcr == 1); }});
2682025SN/A              }
2692043SN/A            }
2705222Sksewell@umich.edu
2718588Sgblack@eecs.umich.edu            0x1: decode TF {
2726384Sgblack@eecs.umich.edu              format Branch {
2738588Sgblack@eecs.umich.edu                0x0: bc1fl({{ cond = (xc->miscRegs.fpcr == 0); }});
2746384Sgblack@eecs.umich.edu                0x1: bc1tl({{ cond = (xc->miscRegs.fpcr == 1); }});
2758588Sgblack@eecs.umich.edu              }
2766384Sgblack@eecs.umich.edu            }
2778588Sgblack@eecs.umich.edu          }
2786384Sgblack@eecs.umich.edu        }
2798588Sgblack@eecs.umich.edu
2808588Sgblack@eecs.umich.edu        0x1: decode RS_HI {
2812101SN/A          0x2: decode RS_LO {
2822043SN/A
2832043SN/A            //Table A-14 MIPS32 COP1 Encoding of Function Field When rs=S
2842043SN/A            //(( single-word ))
2852101SN/A            0x0: decode RS_HI {
2868588Sgblack@eecs.umich.edu              0x0: decode RS_LO {
2872686Sksewell@umich.edu                format FloatOp {
2882686Sksewell@umich.edu                  0x0: add_fmt({{ }});
2898588Sgblack@eecs.umich.edu                  0x1: sub_fmt({{ }});
2902686Sksewell@umich.edu                  0x2: mul_fmt({{ }});
2918588Sgblack@eecs.umich.edu                  0x3: div_fmt({{ }});
2928588Sgblack@eecs.umich.edu                  0x4: sqrt_fmt({{ }});
2932101SN/A                  0x5: abs_fmt({{ }});
2942043SN/A                  0x6: mov_fmt({{ }});
2952043SN/A                  0x7: neg_fmt({{ }});
2962043SN/A                }
2976384Sgblack@eecs.umich.edu              }
2986384Sgblack@eecs.umich.edu
2994661Sksewell@umich.edu              0x1: decode RS_LO {
3002101SN/A                //only legal for 64 bit
3012101SN/A                format Float64Op {
3022101SN/A                  0x0: round_l({{ }});
3032043SN/A                  0x1: trunc_l({{ }});
3042043SN/A                  0x2: ceil_l({{ }});
3052043SN/A                  0x3: floor_l({{ }});
3062123SN/A                }
3077792Sgblack@eecs.umich.edu
3087792Sgblack@eecs.umich.edu                format FloatOp {
3097792Sgblack@eecs.umich.edu                  0x4: round_w({{ }});
3102043SN/A                  0x5: trunc_w({{ }});
3112043SN/A                  0x6: ceil_w({{ }});
3122100SN/A                  0x7: floor_w({{ }});
3132686Sksewell@umich.edu                }
3142686Sksewell@umich.edu              }
3158588Sgblack@eecs.umich.edu
3162686Sksewell@umich.edu              0x2: decode RS_LO {
3178588Sgblack@eecs.umich.edu                0x1: decode MOVCF {
3188588Sgblack@eecs.umich.edu                  format BasicOp {
3198588Sgblack@eecs.umich.edu                    0x0: movf_fmt({{ }});
3202043SN/A                    0x1: movt_fmt({{ }});
3212084SN/A                  }
3222024SN/A                }
3232101SN/A
3242686Sksewell@umich.edu                format BasicOp {
3255222Sksewell@umich.edu                  0x2: movz({{ if (Rt == 0) Rd = Rs; }});
3268564Sgblack@eecs.umich.edu                  0x3: movn({{ if (Rt != 0) Rd = Rs; }});
3278564Sgblack@eecs.umich.edu                }
3288738Sgblack@eecs.umich.edu
3298564Sgblack@eecs.umich.edu                format Float64Op {
33010474Sandreas.hansson@arm.com                  0x2: recip({{ }});
3316384Sgblack@eecs.umich.edu                  0x3: rsqrt{{ }});
3326384Sgblack@eecs.umich.edu                }
3338588Sgblack@eecs.umich.edu              }
3348588Sgblack@eecs.umich.edu
3358588Sgblack@eecs.umich.edu              0x4: decode RS_LO {
3368588Sgblack@eecs.umich.edu                0x1: cvt_d({{ }});
3378588Sgblack@eecs.umich.edu                0x4: cvt_w({{ }});
3388588Sgblack@eecs.umich.edu
3392495SN/A                //only legal for 64 bit
3402495SN/A                format Float64Op {
3416384Sgblack@eecs.umich.edu                  0x5: cvt_l({{ }});
3422495SN/A                  0x6: cvt_ps({{ }});
3432084SN/A                }
3442084SN/A              }
3452024SN/A            }
3462101SN/A
3472101SN/A            //Table A-15 MIPS32 COP1 Encoding of Function Field When rs=D
3482101SN/A            0x1: decode RS_HI {
3492101SN/A              0x0: decode RS_LO {
3506384Sgblack@eecs.umich.edu                0x0: add_fmt({{ }});
3516384Sgblack@eecs.umich.edu                0x1: sub_fmt({{ }});
3526384Sgblack@eecs.umich.edu                0x2: mul_fmt({{ }});
3536384Sgblack@eecs.umich.edu                0x3: div_fmt({{ }});
3546384Sgblack@eecs.umich.edu                0x4: sqrt_fmt({{ }});
3556384Sgblack@eecs.umich.edu                0x5: abs_fmt({{ }});
3566384Sgblack@eecs.umich.edu                0x6: mov_fmt({{ }});
3576384Sgblack@eecs.umich.edu                0x7: neg_fmt({{ }});
3586384Sgblack@eecs.umich.edu              }
3596384Sgblack@eecs.umich.edu
3606384Sgblack@eecs.umich.edu              0x1: decode RS_LO {
3616384Sgblack@eecs.umich.edu                //only legal for 64 bit
36211320Ssteve.reinhardt@amd.com                format mode64 {
3636384Sgblack@eecs.umich.edu                  0x0: round_l({{ }});
3646384Sgblack@eecs.umich.edu                  0x1: trunc_l({{ }});
3656384Sgblack@eecs.umich.edu                  0x2: ceil_l({{ }});
3666384Sgblack@eecs.umich.edu                  0x3: floor_l({{ }});
3676384Sgblack@eecs.umich.edu                }
3686384Sgblack@eecs.umich.edu
3696384Sgblack@eecs.umich.edu                0x4: round_w({{ }});
3706384Sgblack@eecs.umich.edu                0x5: trunc_w({{ }});
3716384Sgblack@eecs.umich.edu                0x6: ceil_w({{ }});
3726384Sgblack@eecs.umich.edu                0x7: floor_w({{ }});
3736384Sgblack@eecs.umich.edu              }
3746384Sgblack@eecs.umich.edu
3756384Sgblack@eecs.umich.edu              0x2: decode RS_LO {
3766384Sgblack@eecs.umich.edu                0x1: decode MOVCF {
3776384Sgblack@eecs.umich.edu                  0x0: movf_fmt({{ }});
3786384Sgblack@eecs.umich.edu                  0x1: movt_fmt({{ }});
3796384Sgblack@eecs.umich.edu                }
3806384Sgblack@eecs.umich.edu
3816384Sgblack@eecs.umich.edu                format Move {
3826384Sgblack@eecs.umich.edu                  0x2: movz({{ if (Rt == 0) Rd = Rs; }});
3836384Sgblack@eecs.umich.edu                  0x3: movn({{ if (Rt != 0) Rd = Rs; }});
3846384Sgblack@eecs.umich.edu                }
3854661Sksewell@umich.edu
3866376Sgblack@eecs.umich.edu                format mode64 {
3876376Sgblack@eecs.umich.edu                  0x5: recip({{ }});
3889918Ssteve.reinhardt@amd.com                  0x6: rsqrt{{ }});
3896376Sgblack@eecs.umich.edu                }
3904661Sksewell@umich.edu              }
3916384Sgblack@eecs.umich.edu
3926384Sgblack@eecs.umich.edu              0x4: decode RS_LO {
3936384Sgblack@eecs.umich.edu                0x0: cvt_s({{ }});
3944661Sksewell@umich.edu                0x4: cvt_w({{ }});
3956383Sgblack@eecs.umich.edu
3966383Sgblack@eecs.umich.edu                //only legal for 64 bit
3976383Sgblack@eecs.umich.edu                format mode64 {
3986383Sgblack@eecs.umich.edu                  0x5: cvt_l({{ }});
3996383Sgblack@eecs.umich.edu                }
4006383Sgblack@eecs.umich.edu              }
4016383Sgblack@eecs.umich.edu            }
4026383Sgblack@eecs.umich.edu
4036383Sgblack@eecs.umich.edu            //Table A-16 MIPS32 COP1 Encoding of Function Field When rs=W
4046383Sgblack@eecs.umich.edu            0x4: decode FUNCTION {
4056383Sgblack@eecs.umich.edu              0x10: cvt_s({{ }});
4066383Sgblack@eecs.umich.edu              0x10: cvt_d({{ }});
4076383Sgblack@eecs.umich.edu            }
4086384Sgblack@eecs.umich.edu
4092686Sksewell@umich.edu            //Table A-16 MIPS32 COP1 Encoding of Function Field When rs=L1
4104661Sksewell@umich.edu            //Note: "1. Format type L is legal only if 64-bit floating point operations
4114661Sksewell@umich.edu            //are enabled."
4129918Ssteve.reinhardt@amd.com            0x5: decode FUNCTION_HI {
4136384Sgblack@eecs.umich.edu              0x10: cvt_s({{ }});
4144661Sksewell@umich.edu              0x11: cvt_d({{ }});
4159918Ssteve.reinhardt@amd.com            }
4166384Sgblack@eecs.umich.edu
4176384Sgblack@eecs.umich.edu            //Table A-17 MIPS64 COP1 Encoding of Function Field When rs=PS1
4186384Sgblack@eecs.umich.edu            //Note: "1. Format type PS is legal only if 64-bit floating point operations
4196384Sgblack@eecs.umich.edu            //are enabled. "
4209918Ssteve.reinhardt@amd.com            0x6: decode RS_HI {
4216384Sgblack@eecs.umich.edu              0x0: decode RS_LO {
4226384Sgblack@eecs.umich.edu                0x0: add_fmt({{ }});
4236384Sgblack@eecs.umich.edu                0x1: sub_fmt({{ }});
4249918Ssteve.reinhardt@amd.com                0x2: mul_fmt({{ }});
4256384Sgblack@eecs.umich.edu                0x5: abs_fmt({{ }});
4266384Sgblack@eecs.umich.edu                0x6: mov_fmt({{ }});
4276384Sgblack@eecs.umich.edu                0x7: neg_fmt({{ }});
4286384Sgblack@eecs.umich.edu              }
4296384Sgblack@eecs.umich.edu
4306384Sgblack@eecs.umich.edu              0x2: decode RS_LO {
4316384Sgblack@eecs.umich.edu                0x1: decode MOVCF {
4326384Sgblack@eecs.umich.edu                  0x0: movf_fmt({{ }});
4336384Sgblack@eecs.umich.edu                  0x1: movt_fmt({{ }});
4346384Sgblack@eecs.umich.edu                }
4356384Sgblack@eecs.umich.edu
4366384Sgblack@eecs.umich.edu              }
4376384Sgblack@eecs.umich.edu
4386384Sgblack@eecs.umich.edu              0x4: decode RS_LO {
4396384Sgblack@eecs.umich.edu                0x0: cvt_s_pu({{ }});
4406384Sgblack@eecs.umich.edu              }
4416384Sgblack@eecs.umich.edu
4426384Sgblack@eecs.umich.edu              0x5: decode RS_LO {
4436384Sgblack@eecs.umich.edu                0x0: cvt_s_pl({{ }});
4446384Sgblack@eecs.umich.edu                0x4: pll_s_pl({{ }});
4456384Sgblack@eecs.umich.edu                0x5: plu_s_pl({{ }});
4462101SN/A                0x6: pul_s_pl({{ }});
4476384Sgblack@eecs.umich.edu                0x7: puu_s_pl({{ }});
4482686Sksewell@umich.edu              }
4492027SN/A            }
4506384Sgblack@eecs.umich.edu      }
4516384Sgblack@eecs.umich.edu
4524661Sksewell@umich.edu      //Table A-19 MIPS32 COP2 Encoding of rs Field
4539918Ssteve.reinhardt@amd.com      0x2: decode RS_MSB {
4544661Sksewell@umich.edu        0x0: decode RS_HI {
4554661Sksewell@umich.edu          0x0: decode RS_LO {
4564661Sksewell@umich.edu            format WarnUnimpl {
4574661Sksewell@umich.edu                0x0: mfc2({{ }});
4584661Sksewell@umich.edu                0x2: cfc2({{ }});
4596383Sgblack@eecs.umich.edu                0x3: mfhc2({{ }});
4604661Sksewell@umich.edu                0x4: mtc2({{ }});
4616383Sgblack@eecs.umich.edu                0x6: ctc2({{ }});
4624661Sksewell@umich.edu                0x7: mftc2({{ }});
4634661Sksewell@umich.edu            }
4646383Sgblack@eecs.umich.edu          }
4654661Sksewell@umich.edu
4664661Sksewell@umich.edu          0x1: decode ND {
4676383Sgblack@eecs.umich.edu            0x0: decode TF {
4684661Sksewell@umich.edu              format Branch {
4694661Sksewell@umich.edu                0x0: bc2f({{ cond = (xc->miscRegs.cop2cc == 0); }}, COP2);
4706383Sgblack@eecs.umich.edu                0x1: bc2t({{ cond = (xc->miscRegs.cop2cc == 1); }}, COP2}});
4714661Sksewell@umich.edu              }
4724661Sksewell@umich.edu            }
4736383Sgblack@eecs.umich.edu
4744661Sksewell@umich.edu            0x1: decode TF {
4754661Sksewell@umich.edu              format Branch {
4766383Sgblack@eecs.umich.edu                0x0: bc2fl({{ cond = (xc->miscRegs.cop2cc == 0); }}, COP2}});
4774661Sksewell@umich.edu                0x1: bc2tl({{ cond = (xc->miscRegs.cop2cc == 1); }}, COP2}});
4784661Sksewell@umich.edu              }
4796383Sgblack@eecs.umich.edu            }
4804661Sksewell@umich.edu          }
4814661Sksewell@umich.edu        }
4826383Sgblack@eecs.umich.edu      }
4834661Sksewell@umich.edu
4844661Sksewell@umich.edu      //Table A-20 MIPS64 COP1X Encoding of Function Field 1
4856383Sgblack@eecs.umich.edu      //Note: "COP1X instructions are legal only if 64-bit floating point
4864661Sksewell@umich.edu      //operations are enabled."
4874661Sksewell@umich.edu      0x3: decode FUNCTION_HI {
4886383Sgblack@eecs.umich.edu        0x0: decode FUNCTION_LO {
4894661Sksewell@umich.edu                format Memory {
4904661Sksewell@umich.edu                  0x0: lwxc1({{ }});
4916383Sgblack@eecs.umich.edu                  0x1: ldxc1({{ }});
4924661Sksewell@umich.edu                  0x5: luxc1({{ }});
4936383Sgblack@eecs.umich.edu                }
4946384Sgblack@eecs.umich.edu        }
4955222Sksewell@umich.edu
4964661Sksewell@umich.edu        0x1: decode FUNCTION_LO {
4976384Sgblack@eecs.umich.edu                format Memory {
4986384Sgblack@eecs.umich.edu                  0x0: swxc1({{ }});
4999918Ssteve.reinhardt@amd.com                  0x1: sdxc1({{ }});
5008607Sgblack@eecs.umich.edu                  0x5: suxc1({{ }});
5018607Sgblack@eecs.umich.edu                  0x7: prefx({{ }});
5029918Ssteve.reinhardt@amd.com                }
5036384Sgblack@eecs.umich.edu        }
5046384Sgblack@eecs.umich.edu
5056384Sgblack@eecs.umich.edu        format FloatOp {
5066384Sgblack@eecs.umich.edu                0x3: alnv_ps({{ }});
5076384Sgblack@eecs.umich.edu
5086384Sgblack@eecs.umich.edu                0x4: decode FUNCTION_LO {
5098588Sgblack@eecs.umich.edu                  0x0: madd_s({{ }});
5106384Sgblack@eecs.umich.edu                  0x1: madd_d({{ }});
5116384Sgblack@eecs.umich.edu                  0x6: madd_ps({{ }});
5126384Sgblack@eecs.umich.edu                }
5136384Sgblack@eecs.umich.edu
5146384Sgblack@eecs.umich.edu                0x5: decode FUNCTION_LO {
5158588Sgblack@eecs.umich.edu                  0x0: msub_s({{ }});
5166384Sgblack@eecs.umich.edu                  0x1: msub_d({{ }});
5178588Sgblack@eecs.umich.edu                  0x6: msub_ps({{ }});
5186384Sgblack@eecs.umich.edu                }
5196384Sgblack@eecs.umich.edu
5206384Sgblack@eecs.umich.edu                0x6: decode FUNCTION_LO {
5216384Sgblack@eecs.umich.edu                  0x0: nmadd_s({{ }});
5228588Sgblack@eecs.umich.edu                  0x1: nmadd_d({{ }});
5236384Sgblack@eecs.umich.edu                  0x6: nmadd_ps({{ }});
5248588Sgblack@eecs.umich.edu                }
5256384Sgblack@eecs.umich.edu
5268588Sgblack@eecs.umich.edu                0x7: decode FUNCTION_LO {
5276384Sgblack@eecs.umich.edu                  0x0: nmsub_s({{ }});
5286384Sgblack@eecs.umich.edu                  0x1: nmsub_d({{ }});
5298588Sgblack@eecs.umich.edu                  0x6: nmsub_ps({{ }});
5306384Sgblack@eecs.umich.edu                }
5316384Sgblack@eecs.umich.edu        }
5326384Sgblack@eecs.umich.edu      }
5336384Sgblack@eecs.umich.edu
5346384Sgblack@eecs.umich.edu      //MIPS obsolete instructions
5358607Sgblack@eecs.umich.edu        format Branch {
5366384Sgblack@eecs.umich.edu              0x4: beql({{ cond = (Rs.sq == 0); }});
5379918Ssteve.reinhardt@amd.com              0x5: bnel({{ cond = (Rs.sq != 0); }});
5386384Sgblack@eecs.umich.edu              0x6: blezl({{ cond = (Rs.sq <= 0); }});
5396384Sgblack@eecs.umich.edu              0x7: bgtzl({{ cond = (Rs.sq > 0); }});
5404661Sksewell@umich.edu        }
5414661Sksewell@umich.edu    };
5422101SN/A
5434661Sksewell@umich.edu    0x3: decode OPCODE_LO default FailUnimpl::reserved() {
5444661Sksewell@umich.edu
5454661Sksewell@umich.edu        //Table A-5 MIPS32 SPECIAL2 Encoding of Function Field
5464661Sksewell@umich.edu        0x4: decode FUNCTION_HI {
5474661Sksewell@umich.edu
5486376Sgblack@eecs.umich.edu            0x0: decode FUNCTION_LO {
5496376Sgblack@eecs.umich.edu                format IntOp {
5506376Sgblack@eecs.umich.edu                   0x0: madd({{
5516376Sgblack@eecs.umich.edu                        INT64 temp1 = Hi.sw << 32 | Lo.sw >> 32;
5526376Sgblack@eecs.umich.edu                        temp1 = temp1 + (Rs.sw * Rt.sw);
5536376Sgblack@eecs.umich.edu                        xc->miscRegs.hi->temp1<63:32>;
5546376Sgblack@eecs.umich.edu                        xc->miscRegs.lo->temp1<31:0>
5556376Sgblack@eecs.umich.edu                        }});
5566376Sgblack@eecs.umich.edu
5576376Sgblack@eecs.umich.edu                   0x1: maddu({{
5586376Sgblack@eecs.umich.edu                        INT64 temp1 = Hi.uw << 32 | Lo.uw >> 32;
5596376Sgblack@eecs.umich.edu                        temp1 = temp1 + (Rs.uw * Rt.uw);
5606376Sgblack@eecs.umich.edu                        xc->miscRegs.hi->temp1<63:32>;
5616376Sgblack@eecs.umich.edu                        xc->miscRegs.lo->temp1<31:0>
5626376Sgblack@eecs.umich.edu                        }});
5636376Sgblack@eecs.umich.edu
5645222Sksewell@umich.edu                   0x2: mul({{ 	Rd.sw = Rs.sw * Rt.sw; 	}});
5654661Sksewell@umich.edu
5666384Sgblack@eecs.umich.edu                   0x4: msub({{
5674661Sksewell@umich.edu                        INT64 temp1 = Hi.sw << 32 | Lo.sw >> 32;
5686384Sgblack@eecs.umich.edu                        temp1 = temp1 - (Rs.sw * Rt.sw);
5696384Sgblack@eecs.umich.edu                        xc->miscRegs.hi->temp1<63:32>;
5704661Sksewell@umich.edu                        xc->miscRegs.lo->temp1<31:0>
5714661Sksewell@umich.edu                        }});
5724661Sksewell@umich.edu
5736376Sgblack@eecs.umich.edu                   0x5: msubu({{
5746376Sgblack@eecs.umich.edu                        INT64 temp1 = Hi.uw << 32 | Lo.uw >> 32;
5756376Sgblack@eecs.umich.edu                        temp1 = temp1 - (Rs.uw * Rt.uw);
5766376Sgblack@eecs.umich.edu                        xc->miscRegs.hi->temp1<63:32>;
5776376Sgblack@eecs.umich.edu                        xc->miscRegs.lo->temp1<31:0>
5786376Sgblack@eecs.umich.edu                        }});
5796376Sgblack@eecs.umich.edu                }
5806376Sgblack@eecs.umich.edu            }
5816376Sgblack@eecs.umich.edu
5826376Sgblack@eecs.umich.edu            0x4: decode FUNCTION_LO {
5836376Sgblack@eecs.umich.edu                  format BasicOp {
5846376Sgblack@eecs.umich.edu                      0x0: clz({{ }});
5855222Sksewell@umich.edu                      0x1: clo({{ }});
5864661Sksewell@umich.edu                  }
5876384Sgblack@eecs.umich.edu            }
5884661Sksewell@umich.edu
5895222Sksewell@umich.edu            0x7: decode FUNCTION_LO {
5904661Sksewell@umich.edu              0x7: BasicOp::sdbbp({{ }});
5914661Sksewell@umich.edu            }
5924661Sksewell@umich.edu        }
5936384Sgblack@eecs.umich.edu
5946384Sgblack@eecs.umich.edu        //Table A-6 MIPS32 SPECIAL3 Encoding of Function Field for Release 2 of the Architecture
5956384Sgblack@eecs.umich.edu        0x7: decode FUNCTION_HI {
5966384Sgblack@eecs.umich.edu
5976384Sgblack@eecs.umich.edu          0x0: decode FUNCTION_LO {
5986384Sgblack@eecs.umich.edu                format Branch {
5996384Sgblack@eecs.umich.edu                    0x1: ext({{ }});
6006384Sgblack@eecs.umich.edu                    0x4: ins({{ }});
6016384Sgblack@eecs.umich.edu                }
6026384Sgblack@eecs.umich.edu          }
6036384Sgblack@eecs.umich.edu
60410474Sandreas.hansson@arm.com          //Table A-10 MIPS32 BSHFL Encoding of sa Field
6056384Sgblack@eecs.umich.edu          0x4: decode SA {
6066384Sgblack@eecs.umich.edu                format BasicOp {
6076384Sgblack@eecs.umich.edu                    0x02: wsbh({{ }});
6086384Sgblack@eecs.umich.edu                    0x10: seb({{ }});
6096384Sgblack@eecs.umich.edu                    0x18: seh({{ }});
6106384Sgblack@eecs.umich.edu                }
6116384Sgblack@eecs.umich.edu          }
6126384Sgblack@eecs.umich.edu
6136384Sgblack@eecs.umich.edu          0x6: decode FUNCTION_LO {
6146384Sgblack@eecs.umich.edu            0x7: BasicOp::rdhwr({{ }});
61510474Sandreas.hansson@arm.com          }
6166384Sgblack@eecs.umich.edu        }
6176384Sgblack@eecs.umich.edu    };
6186384Sgblack@eecs.umich.edu
6196384Sgblack@eecs.umich.edu    0x4: decode OPCODE_LO default FailUnimpl::reserved() {
6204661Sksewell@umich.edu        format Memory {
6216384Sgblack@eecs.umich.edu            0x0: lb({{ EA = Rs + disp; }}, {{ Rb.sw = Mem.sb; }});
6224661Sksewell@umich.edu            0x1: lh({{ EA = Rs + disp; }}, {{ Rb.sw = Mem.sh; }});
6234661Sksewell@umich.edu            0x2: lwl({{ EA = Rs + disp; }}, {{ Rb.sw = Mem.sw; }}, WordAlign);
6244661Sksewell@umich.edu            0x3: lw({{ EA = Rs + disp; }}, {{ Rb.uq = Mem.sb; }});
6256376Sgblack@eecs.umich.edu            0x4: lbu({{ EA = Rs + disp; }}, {{ Rb.uw = Mem.ub; }});
6266376Sgblack@eecs.umich.edu            0x5: lhu({{ EA = Rs + disp; }}, {{ Rb.uw = Mem.uh; }});
6276376Sgblack@eecs.umich.edu            0x6: lwr({{ EA = Rs + disp; }}, {{ Rb.uw = Mem.uw; }}, WordAlign);
6286376Sgblack@eecs.umich.edu        };
6296376Sgblack@eecs.umich.edu
63010474Sandreas.hansson@arm.com        0x7: FailUnimpl::reserved({{ }});
6314661Sksewell@umich.edu    };
6326376Sgblack@eecs.umich.edu
6334661Sksewell@umich.edu    0x5: decode OPCODE_LO default FailUnimpl::reserved() {
6346376Sgblack@eecs.umich.edu        format Memory {
6356376Sgblack@eecs.umich.edu            0x0: sb({{ EA = Rs + disp; }}, {{ Mem.ub = Rt<7:0>; }});
6366376Sgblack@eecs.umich.edu            0x1: sh({{ EA = Rs + disp; }},{{ Mem.uh = Rt<15:0>; }});
6376376Sgblack@eecs.umich.edu            0x2: swl({{ EA = Rs + disp; }},{{ Mem.ub = Rt<31:0>; }},WordAlign);
6386376Sgblack@eecs.umich.edu            0x3: sw({{ EA = Rs + disp; }},{{ Mem.ub = Rt<31:0>; }});
63910474Sandreas.hansson@arm.com            0x6: swr({{ EA = Rs + disp; }},{{ Mem.ub = Rt<31:0>; }},WordAlign);
6404661Sksewell@umich.edu        };
6416376Sgblack@eecs.umich.edu
6424661Sksewell@umich.edu        format WarnUnimpl {
6436384Sgblack@eecs.umich.edu            0x4: reserved({{ }});
6442101SN/A            0x5: reserved({{ }});
6452101SN/A            0x7: cache({{ }});
6462101SN/A        };
6476384Sgblack@eecs.umich.edu
6486384Sgblack@eecs.umich.edu    };
6496384Sgblack@eecs.umich.edu
6506384Sgblack@eecs.umich.edu    0x6: decode OPCODE_LO default FailUnimpl::reserved() {
6516384Sgblack@eecs.umich.edu        format Memory {
6526384Sgblack@eecs.umich.edu            0x0: ll({{ }});
6536384Sgblack@eecs.umich.edu            0x1: lwc1({{ EA = Rs + disp; }},{{ Ft<31:0> = Mem.uf; }});
6546384Sgblack@eecs.umich.edu            0x5: ldc1({{ EA = Rs + disp; }},{{ Ft<63:0> = Mem.df; }});
6557792Sgblack@eecs.umich.edu        };
6566384Sgblack@eecs.umich.edu    };
6577792Sgblack@eecs.umich.edu
6586384Sgblack@eecs.umich.edu    0x7: decode OPCODE_LO default FailUnimpl::reserved() {
6597792Sgblack@eecs.umich.edu        format Memory {
6606384Sgblack@eecs.umich.edu            0x0: sc({{ }});
6617792Sgblack@eecs.umich.edu            0x1: swc1({{ EA = Rs + disp; }},{{ Mem.uf = Ft<31:0>; }});
6626384Sgblack@eecs.umich.edu            0x5: sdc1({{ EA = Rs + disp; }},{{ Mem.df = Ft<63:0>; }});
6636384Sgblack@eecs.umich.edu        };
6646384Sgblack@eecs.umich.edu
6656384Sgblack@eecs.umich.edu    }
6666384Sgblack@eecs.umich.edu}
6676384Sgblack@eecs.umich.edu
6686384Sgblack@eecs.umich.edu
6696376Sgblack@eecs.umich.edu