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