decoder.isa revision 2607
17639Sgblack@eecs.umich.edu // -*- mode:c++ -*- 27639Sgblack@eecs.umich.edu 37639Sgblack@eecs.umich.edu//////////////////////////////////////////////////////////////////// 47639Sgblack@eecs.umich.edu// 57639Sgblack@eecs.umich.edu// The actual MIPS32 ISA decoder 67639Sgblack@eecs.umich.edu// ----------------------------- 77639Sgblack@eecs.umich.edu// The following instructions are specified in the MIPS32 ISA 87639Sgblack@eecs.umich.edu// Specification. Decoding closely follows the style specified 97639Sgblack@eecs.umich.edu// in the MIPS32 ISAthe specification document starting with Table 107639Sgblack@eecs.umich.edu// A-2 (document available @ www.mips.com) 117639Sgblack@eecs.umich.edu// 127639Sgblack@eecs.umich.edu//@todo: Distinguish "unknown/future" use insts from "reserved" 137639Sgblack@eecs.umich.edu// ones 147639Sgblack@eecs.umich.edudecode OPCODE_HI default Unknown::unknown() { 157639Sgblack@eecs.umich.edu 167639Sgblack@eecs.umich.edu // Derived From ... Table A-2 MIPS32 ISA Manual 177639Sgblack@eecs.umich.edu 0x0: decode OPCODE_LO { 187639Sgblack@eecs.umich.edu 197639Sgblack@eecs.umich.edu 0x0: decode FUNCTION_HI { 207639Sgblack@eecs.umich.edu 0x0: decode FUNCTION_LO { 217639Sgblack@eecs.umich.edu 0x1: decode MOVCI { 227639Sgblack@eecs.umich.edu format BasicOp { 237639Sgblack@eecs.umich.edu 0: movf({{ if (getFPConditionCode(CC) == 0) Rd = Rs}}); 247639Sgblack@eecs.umich.edu 1: movt({{ if (getFPConditionCode(CC) == 1) Rd = Rs}}); 257639Sgblack@eecs.umich.edu } 267639Sgblack@eecs.umich.edu } 277639Sgblack@eecs.umich.edu 287639Sgblack@eecs.umich.edu format BasicOp { 297639Sgblack@eecs.umich.edu 307639Sgblack@eecs.umich.edu //Table A-3 Note: "1. Specific encodings of the rt, rd, and sa fields 317639Sgblack@eecs.umich.edu //are used to distinguish among the SLL, NOP, SSNOP and EHB functions. 327639Sgblack@eecs.umich.edu 0x0: decode RS { 337639Sgblack@eecs.umich.edu 0x0: decode RT { //fix Nop traditional vs. Nop converted disassembly later 347639Sgblack@eecs.umich.edu 0x0: decode RD default Nop::nop(){ 357639Sgblack@eecs.umich.edu 0x0: decode SA { 367639Sgblack@eecs.umich.edu 0x1: ssnop({{ ; }}); //really sll r0,r0,1 377639Sgblack@eecs.umich.edu 0x3: ehb({{ ; }}); //really sll r0,r0,3 387639Sgblack@eecs.umich.edu } 397639Sgblack@eecs.umich.edu } 407639Sgblack@eecs.umich.edu 417639Sgblack@eecs.umich.edu default: sll({{ Rd = Rt.uw << SA; }}); 427639Sgblack@eecs.umich.edu } 437639Sgblack@eecs.umich.edu 447639Sgblack@eecs.umich.edu } 457639Sgblack@eecs.umich.edu 467639Sgblack@eecs.umich.edu 0x2: decode RS_SRL { 477639Sgblack@eecs.umich.edu 0x0:decode SRL { 487639Sgblack@eecs.umich.edu 0: srl({{ Rd = Rt.uw >> SA; }}); 497639Sgblack@eecs.umich.edu 507639Sgblack@eecs.umich.edu //Hardcoded assuming 32-bit ISA, probably need parameter here 517639Sgblack@eecs.umich.edu 1: rotr({{ Rd = (Rt.uw << (32 - SA)) | (Rt.uw >> SA);}}); 527639Sgblack@eecs.umich.edu } 537639Sgblack@eecs.umich.edu } 547639Sgblack@eecs.umich.edu 557639Sgblack@eecs.umich.edu 0x3: decode RS { 567639Sgblack@eecs.umich.edu 0x0: sra({{ 577639Sgblack@eecs.umich.edu uint32_t temp = Rt >> SA; 587639Sgblack@eecs.umich.edu 597639Sgblack@eecs.umich.edu if ( (Rt & 0x80000000) > 0 ) { 607639Sgblack@eecs.umich.edu uint32_t mask = 0x80000000; 617639Sgblack@eecs.umich.edu for(int i=0; i < SA; i++) { 627639Sgblack@eecs.umich.edu temp |= mask; 637639Sgblack@eecs.umich.edu mask = mask >> 1; 647639Sgblack@eecs.umich.edu } 657639Sgblack@eecs.umich.edu } 667639Sgblack@eecs.umich.edu 677639Sgblack@eecs.umich.edu Rd = temp; 687639Sgblack@eecs.umich.edu }}); 697639Sgblack@eecs.umich.edu } 707639Sgblack@eecs.umich.edu 717639Sgblack@eecs.umich.edu 0x4: sllv({{ Rd = Rt.uw << Rs<4:0>; }}); 727639Sgblack@eecs.umich.edu 737639Sgblack@eecs.umich.edu 0x6: decode SRLV { 747639Sgblack@eecs.umich.edu 0: srlv({{ Rd = Rt.uw >> Rs<4:0>; }}); 757639Sgblack@eecs.umich.edu 767639Sgblack@eecs.umich.edu //Hardcoded assuming 32-bit ISA, probably need parameter here 777639Sgblack@eecs.umich.edu 1: rotrv({{ Rd = (Rt.uw << (32 - Rs<4:0>)) | (Rt.uw >> Rs<4:0>);}}); 787639Sgblack@eecs.umich.edu } 797639Sgblack@eecs.umich.edu 807639Sgblack@eecs.umich.edu 0x7: srav({{ 817639Sgblack@eecs.umich.edu int shift_amt = Rs<4:0>; 827639Sgblack@eecs.umich.edu 837639Sgblack@eecs.umich.edu uint32_t temp = Rt >> shift_amt; 847639Sgblack@eecs.umich.edu 857639Sgblack@eecs.umich.edu if ( (Rt & 0x80000000) > 0 ) { 867639Sgblack@eecs.umich.edu uint32_t mask = 0x80000000; 877639Sgblack@eecs.umich.edu for(int i=0; i < shift_amt; i++) { 887639Sgblack@eecs.umich.edu temp |= mask; 897639Sgblack@eecs.umich.edu mask = mask >> 1; 907639Sgblack@eecs.umich.edu } 917639Sgblack@eecs.umich.edu } 927639Sgblack@eecs.umich.edu 937639Sgblack@eecs.umich.edu Rd = temp; 947639Sgblack@eecs.umich.edu }}); 957639Sgblack@eecs.umich.edu } 967639Sgblack@eecs.umich.edu } 977639Sgblack@eecs.umich.edu 987639Sgblack@eecs.umich.edu 0x1: decode FUNCTION_LO { 997639Sgblack@eecs.umich.edu 1007639Sgblack@eecs.umich.edu //Table A-3 Note: "Specific encodings of the hint field are used 1017639Sgblack@eecs.umich.edu //to distinguish JR from JR.HB and JALR from JALR.HB" 1027639Sgblack@eecs.umich.edu format Jump { 1037639Sgblack@eecs.umich.edu 0x0: decode HINT { 1047639Sgblack@eecs.umich.edu 0:jr({{ NNPC = Rs & ~1; }},IsReturn); 1057639Sgblack@eecs.umich.edu 1067639Sgblack@eecs.umich.edu 1:jr_hb({{ NNPC = Rs & ~1; clear_exe_inst_hazards(); }},IsReturn); 1077639Sgblack@eecs.umich.edu } 1087639Sgblack@eecs.umich.edu 1097639Sgblack@eecs.umich.edu 0x1: decode HINT { 1107639Sgblack@eecs.umich.edu 0: jalr({{ Rd = NNPC; NNPC = Rs; }},IsCall,IsReturn); 1117639Sgblack@eecs.umich.edu 1127639Sgblack@eecs.umich.edu 1: jalr_hb({{ Rd = NNPC; NNPC = Rs; clear_exe_inst_hazards();}},IsCall,IsReturn); 1137639Sgblack@eecs.umich.edu } 1147639Sgblack@eecs.umich.edu } 1157639Sgblack@eecs.umich.edu 1167639Sgblack@eecs.umich.edu format BasicOp { 1177639Sgblack@eecs.umich.edu 0x2: movz({{ if (Rt == 0) Rd = Rs; }}); 1187639Sgblack@eecs.umich.edu 0x3: movn({{ if (Rt != 0) Rd = Rs; }}); 1197639Sgblack@eecs.umich.edu } 1207639Sgblack@eecs.umich.edu 1217639Sgblack@eecs.umich.edu format BasicOp { 1227639Sgblack@eecs.umich.edu 0x4: syscall({{ xc->syscall(R2); }},IsNonSpeculative); 1237639Sgblack@eecs.umich.edu 0x5: break({{ panic("Not implemented break yet"); }},IsNonSpeculative); 1247639Sgblack@eecs.umich.edu 0x7: sync({{ panic("Not implemented sync yet"); }},IsNonSpeculative); 1257639Sgblack@eecs.umich.edu } 1267639Sgblack@eecs.umich.edu } 1277639Sgblack@eecs.umich.edu 1287639Sgblack@eecs.umich.edu 0x2: decode FUNCTION_LO { 1297639Sgblack@eecs.umich.edu format BasicOp { 1307639Sgblack@eecs.umich.edu 0x0: mfhi({{ Rd = xc->readMiscReg(Hi); }}); 1317639Sgblack@eecs.umich.edu 0x1: mthi({{ xc->setMiscReg(Hi,Rs); }}); 1327639Sgblack@eecs.umich.edu 0x2: mflo({{ Rd = xc->readMiscReg(Lo); }}); 1337639Sgblack@eecs.umich.edu 0x3: mtlo({{ xc->setMiscReg(Lo,Rs); }}); 1347639Sgblack@eecs.umich.edu } 1357639Sgblack@eecs.umich.edu } 1367639Sgblack@eecs.umich.edu 1377639Sgblack@eecs.umich.edu 0x3: decode FUNCTION_LO { 1387639Sgblack@eecs.umich.edu format IntOp { 1397639Sgblack@eecs.umich.edu 0x0: mult({{ 1407639Sgblack@eecs.umich.edu int64_t temp1 = Rs.sd * Rt.sd; 1417639Sgblack@eecs.umich.edu xc->setMiscReg(Hi,temp1<63:32>); 1427639Sgblack@eecs.umich.edu xc->setMiscReg(Lo,temp1<31:0>); 1437639Sgblack@eecs.umich.edu }}); 1447639Sgblack@eecs.umich.edu 1457639Sgblack@eecs.umich.edu 0x1: multu({{ 1467639Sgblack@eecs.umich.edu uint64_t temp1 = Rs.ud * Rt.ud; 1477639Sgblack@eecs.umich.edu xc->setMiscReg(Hi,temp1<63:32>); 1487639Sgblack@eecs.umich.edu xc->setMiscReg(Lo,temp1<31:0>); 1497639Sgblack@eecs.umich.edu }}); 1507639Sgblack@eecs.umich.edu 1517639Sgblack@eecs.umich.edu 0x2: div({{ 1527639Sgblack@eecs.umich.edu xc->setMiscReg(Hi,Rs.sd % Rt.sd); 1537639Sgblack@eecs.umich.edu xc->setMiscReg(Lo,Rs.sd / Rt.sd); 1547639Sgblack@eecs.umich.edu }}); 1557639Sgblack@eecs.umich.edu 1567639Sgblack@eecs.umich.edu 0x3: divu({{ 1577639Sgblack@eecs.umich.edu xc->setMiscReg(Hi,Rs.ud % Rt.ud); 1587639Sgblack@eecs.umich.edu xc->setMiscReg(Lo,Rs.ud / Rt.ud); 1597639Sgblack@eecs.umich.edu }}); 1607639Sgblack@eecs.umich.edu } 1617639Sgblack@eecs.umich.edu } 1627639Sgblack@eecs.umich.edu 1637639Sgblack@eecs.umich.edu 0x4: decode HINT { 1647639Sgblack@eecs.umich.edu 0x0: decode FUNCTION_LO { 1657639Sgblack@eecs.umich.edu format IntOp { 1667639Sgblack@eecs.umich.edu 0x0: add({{ Rd.sw = Rs.sw + Rt.sw;/*Trap on Overflow*/}}); 1677639Sgblack@eecs.umich.edu 0x1: addu({{ Rd.sw = Rs.sw + Rt.sw;}}); 1687639Sgblack@eecs.umich.edu 0x2: sub({{ Rd.sw = Rs.sw - Rt.sw; /*Trap on Overflow*/}}); 1697639Sgblack@eecs.umich.edu 0x3: subu({{ Rd.sw = Rs.sw - Rt.sw;}}); 1707639Sgblack@eecs.umich.edu 0x4: and({{ Rd = Rs & Rt;}}); 1717639Sgblack@eecs.umich.edu 0x5: or({{ Rd = Rs | Rt;}}); 1727639Sgblack@eecs.umich.edu 0x6: xor({{ Rd = Rs ^ Rt;}}); 1737639Sgblack@eecs.umich.edu 0x7: nor({{ Rd = ~(Rs | Rt);}}); 1747639Sgblack@eecs.umich.edu } 1757639Sgblack@eecs.umich.edu } 1767639Sgblack@eecs.umich.edu } 1777639Sgblack@eecs.umich.edu 1787639Sgblack@eecs.umich.edu 0x5: decode HINT { 1797639Sgblack@eecs.umich.edu 0x0: decode FUNCTION_LO { 1807639Sgblack@eecs.umich.edu format IntOp{ 1817639Sgblack@eecs.umich.edu 0x2: slt({{ Rd.sw = ( Rs.sw < Rt.sw ) ? 1 : 0}}); 1827639Sgblack@eecs.umich.edu 0x3: sltu({{ Rd.uw = ( Rs.uw < Rt.uw ) ? 1 : 0}}); 1837639Sgblack@eecs.umich.edu } 1847639Sgblack@eecs.umich.edu } 1857639Sgblack@eecs.umich.edu } 1867639Sgblack@eecs.umich.edu 1877639Sgblack@eecs.umich.edu 0x6: decode FUNCTION_LO { 1887639Sgblack@eecs.umich.edu format Trap { 1897639Sgblack@eecs.umich.edu 0x0: tge({{ cond = (Rs.sw >= Rt.sw); }}); 1907639Sgblack@eecs.umich.edu 0x1: tgeu({{ cond = (Rs.uw >= Rt.uw); }}); 1917639Sgblack@eecs.umich.edu 0x2: tlt({{ cond = (Rs.sw < Rt.sw); }}); 1927639Sgblack@eecs.umich.edu 0x3: tltu({{ cond = (Rs.uw >= Rt.uw); }}); 1937639Sgblack@eecs.umich.edu 0x4: teq({{ cond = (Rs.sw == Rt.sw); }}); 1947639Sgblack@eecs.umich.edu 0x6: tne({{ cond = (Rs.sw != Rt.sw); }}); 1957639Sgblack@eecs.umich.edu } 1967639Sgblack@eecs.umich.edu } 1977639Sgblack@eecs.umich.edu } 1987639Sgblack@eecs.umich.edu 1997639Sgblack@eecs.umich.edu 0x1: decode REGIMM_HI { 2007639Sgblack@eecs.umich.edu 0x0: decode REGIMM_LO { 2017639Sgblack@eecs.umich.edu format Branch { 2027639Sgblack@eecs.umich.edu 0x0: bltz({{ cond = (Rs.sw < 0); }}); 2037639Sgblack@eecs.umich.edu 0x1: bgez({{ cond = (Rs.sw >= 0); }}); 2047639Sgblack@eecs.umich.edu } 2057639Sgblack@eecs.umich.edu 2067639Sgblack@eecs.umich.edu format BranchLikely { 2077639Sgblack@eecs.umich.edu 0x2: bltzl({{ cond = (Rs.sw < 0); }}); 2087639Sgblack@eecs.umich.edu 0x3: bgezl({{ cond = (Rs.sw >= 0); }}); 2097639Sgblack@eecs.umich.edu } 2107639Sgblack@eecs.umich.edu } 2117639Sgblack@eecs.umich.edu 2127639Sgblack@eecs.umich.edu 0x1: decode REGIMM_LO { 2137639Sgblack@eecs.umich.edu format Trap { 2147639Sgblack@eecs.umich.edu 0x0: tgei( {{ cond = (Rs.sw >= INTIMM); }}); 2157639Sgblack@eecs.umich.edu 0x1: tgeiu({{ cond = (Rs.uw >= INTIMM); }}); 2167639Sgblack@eecs.umich.edu 0x2: tlti( {{ cond = (Rs.sw < INTIMM); }}); 2177639Sgblack@eecs.umich.edu 0x3: tltiu({{ cond = (Rs.uw < INTIMM); }}); 2187639Sgblack@eecs.umich.edu 0x4: teqi( {{ cond = (Rs.sw == INTIMM);}}); 2197639Sgblack@eecs.umich.edu 0x6: tnei( {{ cond = (Rs.sw != INTIMM);}}); 2207639Sgblack@eecs.umich.edu } 2217639Sgblack@eecs.umich.edu } 2227639Sgblack@eecs.umich.edu 2237639Sgblack@eecs.umich.edu 0x2: decode REGIMM_LO { 2247639Sgblack@eecs.umich.edu format Branch { 2257639Sgblack@eecs.umich.edu 0x0: bltzal({{ cond = (Rs.sw < 0); }}, IsCall,IsReturn); 2267639Sgblack@eecs.umich.edu 0x1: bgezal({{ cond = (Rs.sw >= 0); }}, IsCall,IsReturn); 2277639Sgblack@eecs.umich.edu } 2287639Sgblack@eecs.umich.edu 2297639Sgblack@eecs.umich.edu format BranchLikely { 2307639Sgblack@eecs.umich.edu 0x2: bltzall({{ cond = (Rs.sw < 0); }}, IsCall, IsReturn); 2317639Sgblack@eecs.umich.edu 0x3: bgezall({{ cond = (Rs.sw >= 0); }}, IsCall, IsReturn); 2327639Sgblack@eecs.umich.edu } 2337639Sgblack@eecs.umich.edu } 2347639Sgblack@eecs.umich.edu 2357639Sgblack@eecs.umich.edu 0x3: decode REGIMM_LO { 2367639Sgblack@eecs.umich.edu format WarnUnimpl { 2377639Sgblack@eecs.umich.edu 0x7: synci(); 2387639Sgblack@eecs.umich.edu } 2397639Sgblack@eecs.umich.edu } 2407639Sgblack@eecs.umich.edu } 2417639Sgblack@eecs.umich.edu 2427639Sgblack@eecs.umich.edu format Jump { 2437639Sgblack@eecs.umich.edu 0x2: j({{ NNPC = (NPC & 0xF0000000) | (JMPTARG << 2);}}); 2447639Sgblack@eecs.umich.edu 2457639Sgblack@eecs.umich.edu 0x3: jal({{ NNPC = (NPC & 0xF0000000) | (JMPTARG << 2); }},IsCall,IsReturn); 2467639Sgblack@eecs.umich.edu } 2477639Sgblack@eecs.umich.edu 2487639Sgblack@eecs.umich.edu format Branch { 2497639Sgblack@eecs.umich.edu 0x4: beq({{ cond = (Rs.sw == Rt.sw); }}); 2507639Sgblack@eecs.umich.edu 0x5: bne({{ cond = (Rs.sw != Rt.sw); }}); 2517639Sgblack@eecs.umich.edu 0x6: decode RT { 2527639Sgblack@eecs.umich.edu 0x0: blez({{ cond = (Rs.sw <= 0); }}); 2537639Sgblack@eecs.umich.edu } 2547639Sgblack@eecs.umich.edu 2557639Sgblack@eecs.umich.edu 0x7: decode RT { 2567639Sgblack@eecs.umich.edu 0x0: bgtz({{ cond = (Rs.sw > 0); }}); 2577639Sgblack@eecs.umich.edu } 2587639Sgblack@eecs.umich.edu } 2597639Sgblack@eecs.umich.edu } 2607639Sgblack@eecs.umich.edu 2617639Sgblack@eecs.umich.edu 0x1: decode OPCODE_LO { 2627639Sgblack@eecs.umich.edu format IntOp { 2637639Sgblack@eecs.umich.edu 0x0: addi({{ Rt.sw = Rs.sw + imm; /*Trap If Overflow*/}}); 2647639Sgblack@eecs.umich.edu 0x1: addiu({{ Rt.sw = Rs.sw + imm;}}); 2657639Sgblack@eecs.umich.edu 0x2: slti({{ Rt.sw = ( Rs.sw < imm) ? 1 : 0 }}); 2667639Sgblack@eecs.umich.edu 0x3: sltiu({{ Rt.uw = ( Rs.uw < (uint32_t)sextImm ) ? 1 : 0 }}); 2677639Sgblack@eecs.umich.edu 0x4: andi({{ Rt.sw = Rs.sw & zextImm;}}); 2687639Sgblack@eecs.umich.edu 0x5: ori({{ Rt.sw = Rs.sw | zextImm;}}); 2697639Sgblack@eecs.umich.edu 0x6: xori({{ Rt.sw = Rs.sw ^ zextImm;}}); 2707639Sgblack@eecs.umich.edu 2717639Sgblack@eecs.umich.edu 0x7: decode RS { 2727639Sgblack@eecs.umich.edu 0x0: lui({{ Rt = imm << 16}}); 2737639Sgblack@eecs.umich.edu } 2747639Sgblack@eecs.umich.edu } 2757639Sgblack@eecs.umich.edu } 2767639Sgblack@eecs.umich.edu 2777639Sgblack@eecs.umich.edu 0x2: decode OPCODE_LO { 2787639Sgblack@eecs.umich.edu 2797639Sgblack@eecs.umich.edu //Table A-11 MIPS32 COP0 Encoding of rs Field 2807639Sgblack@eecs.umich.edu 0x0: decode RS_MSB { 2817639Sgblack@eecs.umich.edu 0x0: decode RS { 2827639Sgblack@eecs.umich.edu format System { 2837639Sgblack@eecs.umich.edu 0x0: mfc0({{ 2847639Sgblack@eecs.umich.edu //uint64_t reg_num = Rd.uw; 2857639Sgblack@eecs.umich.edu 2867639Sgblack@eecs.umich.edu Rt = xc->readMiscReg(RD << 5 | SEL); 2877639Sgblack@eecs.umich.edu }}); 2887639Sgblack@eecs.umich.edu 2897639Sgblack@eecs.umich.edu 0x4: mtc0({{ 2907639Sgblack@eecs.umich.edu //uint64_t reg_num = Rd.uw; 2917639Sgblack@eecs.umich.edu 2927639Sgblack@eecs.umich.edu xc->setMiscReg(RD << 5 | SEL,Rt); 2937639Sgblack@eecs.umich.edu }}); 2947639Sgblack@eecs.umich.edu 2957639Sgblack@eecs.umich.edu 0x8: mftr({{ 2967639Sgblack@eecs.umich.edu //The contents of the coprocessor 0 register specified by the 2977639Sgblack@eecs.umich.edu //combination of rd and sel are loaded into general register 2987639Sgblack@eecs.umich.edu //rt. Note that not all coprocessor 0 registers support the 2997639Sgblack@eecs.umich.edu //sel field. In those instances, the sel field must be zero. 3007639Sgblack@eecs.umich.edu 3017639Sgblack@eecs.umich.edu //MT Code Needed Here 3027639Sgblack@eecs.umich.edu }}); 3037639Sgblack@eecs.umich.edu 3047639Sgblack@eecs.umich.edu 0xC: mttr({{ 3057639Sgblack@eecs.umich.edu //The contents of the coprocessor 0 register specified by the 3067639Sgblack@eecs.umich.edu //combination of rd and sel are loaded into general register 3077639Sgblack@eecs.umich.edu //rt. Note that not all coprocessor 0 registers support the 3087639Sgblack@eecs.umich.edu //sel field. In those instances, the sel field must be zero. 3097639Sgblack@eecs.umich.edu 3107639Sgblack@eecs.umich.edu //MT Code Needed Here 3117639Sgblack@eecs.umich.edu }}); 3127639Sgblack@eecs.umich.edu 3137639Sgblack@eecs.umich.edu 3147639Sgblack@eecs.umich.edu 0xA: rdpgpr({{ 3157639Sgblack@eecs.umich.edu //Accessing Previous Shadow Set Register Number 3167639Sgblack@eecs.umich.edu //uint64_t prev = xc->readMiscReg(SRSCtl)/*[PSS]*/; 3177639Sgblack@eecs.umich.edu //uint64_t reg_num = Rt.uw; 3187639Sgblack@eecs.umich.edu 3197639Sgblack@eecs.umich.edu //Rd = xc->regs.IntRegFile[prev]; 3207639Sgblack@eecs.umich.edu //Rd = xc->shadowIntRegFile[prev][reg_num]; 3217639Sgblack@eecs.umich.edu }}); 3227639Sgblack@eecs.umich.edu 3237639Sgblack@eecs.umich.edu 0xB: decode RD { 3247639Sgblack@eecs.umich.edu 3257639Sgblack@eecs.umich.edu 0x0: decode SC { 3267639Sgblack@eecs.umich.edu 0x0: dvpe({{ 3277639Sgblack@eecs.umich.edu Rt.sw = xc->readMiscReg(MVPControl); 3287639Sgblack@eecs.umich.edu xc->setMiscReg(MVPControl,0); 3297639Sgblack@eecs.umich.edu }}); 3307639Sgblack@eecs.umich.edu 3317639Sgblack@eecs.umich.edu 0x1: evpe({{ 3327639Sgblack@eecs.umich.edu Rt.sw = xc->readMiscReg(MVPControl); 3337639Sgblack@eecs.umich.edu xc->setMiscReg(MVPControl,1); 3347639Sgblack@eecs.umich.edu }}); 3357639Sgblack@eecs.umich.edu } 3367639Sgblack@eecs.umich.edu 3377639Sgblack@eecs.umich.edu 0x1: decode SC { 3387639Sgblack@eecs.umich.edu 0x0: dmt({{ 3397639Sgblack@eecs.umich.edu Rt.sw = xc->readMiscReg(VPEControl); 3407639Sgblack@eecs.umich.edu xc->setMiscReg(VPEControl,0); 3417639Sgblack@eecs.umich.edu }}); 3427639Sgblack@eecs.umich.edu 3437639Sgblack@eecs.umich.edu 0x1: emt({{ 3447639Sgblack@eecs.umich.edu Rt.sw = xc->readMiscReg(VPEControl); 3457639Sgblack@eecs.umich.edu xc->setMiscReg(VPEControl,1); 3467639Sgblack@eecs.umich.edu }}); 3477639Sgblack@eecs.umich.edu } 3487639Sgblack@eecs.umich.edu 3497639Sgblack@eecs.umich.edu 0xC: decode SC { 3507639Sgblack@eecs.umich.edu 0x0: di({{ 3517639Sgblack@eecs.umich.edu Rt.sw = xc->readMiscReg(Status); 3527639Sgblack@eecs.umich.edu xc->setMiscReg(Status,0); 3537639Sgblack@eecs.umich.edu }}); 3547639Sgblack@eecs.umich.edu 3557639Sgblack@eecs.umich.edu 0x1: ei({{ 3567639Sgblack@eecs.umich.edu Rt.sw = xc->readMiscReg(Status); 3577639Sgblack@eecs.umich.edu xc->setMiscReg(Status,1); 3587639Sgblack@eecs.umich.edu }}); 3597639Sgblack@eecs.umich.edu } 3607639Sgblack@eecs.umich.edu } 3617639Sgblack@eecs.umich.edu 3627639Sgblack@eecs.umich.edu 0xE: wrpgpr({{ 3637639Sgblack@eecs.umich.edu //Accessing Previous Shadow Set Register Number 3647639Sgblack@eecs.umich.edu //uint64_t prev = xc->readMiscReg(SRSCtl/*[PSS]*/); 3657639Sgblack@eecs.umich.edu //uint64_t reg_num = Rd.uw; 3667639Sgblack@eecs.umich.edu 3677639Sgblack@eecs.umich.edu //xc->regs.IntRegFile[prev]; 3687639Sgblack@eecs.umich.edu //xc->shadowIntRegFile[prev][reg_num] = Rt; 3697639Sgblack@eecs.umich.edu }}); 3707639Sgblack@eecs.umich.edu } 3717639Sgblack@eecs.umich.edu } 3727639Sgblack@eecs.umich.edu 3737639Sgblack@eecs.umich.edu //Table A-12 MIPS32 COP0 Encoding of Function Field When rs=CO 3747639Sgblack@eecs.umich.edu 0x1: decode FUNCTION { 3757639Sgblack@eecs.umich.edu format System { 3767639Sgblack@eecs.umich.edu 0x01: tlbr({{ }}); 3777639Sgblack@eecs.umich.edu 0x02: tlbwi({{ }}); 3787639Sgblack@eecs.umich.edu 0x06: tlbwr({{ }}); 3797639Sgblack@eecs.umich.edu 0x08: tlbp({{ }}); 3807639Sgblack@eecs.umich.edu } 3817639Sgblack@eecs.umich.edu 3827639Sgblack@eecs.umich.edu format WarnUnimpl { 3837639Sgblack@eecs.umich.edu 0x18: eret(); 3847639Sgblack@eecs.umich.edu 0x1F: deret(); 3857639Sgblack@eecs.umich.edu 0x20: wait(); 3867639Sgblack@eecs.umich.edu } 3877639Sgblack@eecs.umich.edu } 3887639Sgblack@eecs.umich.edu } 3897639Sgblack@eecs.umich.edu 3907639Sgblack@eecs.umich.edu //Table A-13 MIPS32 COP1 Encoding of rs Field 3917639Sgblack@eecs.umich.edu 0x1: decode RS_MSB { 3927639Sgblack@eecs.umich.edu 3937639Sgblack@eecs.umich.edu 0x0: decode RS_HI { 3947639Sgblack@eecs.umich.edu 0x0: decode RS_LO { 3957639Sgblack@eecs.umich.edu format FloatOp { 3967639Sgblack@eecs.umich.edu 0x0: mfc1 ({{ Rt.uw = Fs.uw<31:0>; }}); 3977639Sgblack@eecs.umich.edu 0x3: mfhc1({{ Rt.uw = Fs.ud<63:32>;}}); 3987639Sgblack@eecs.umich.edu 0x4: mtc1 ({{ Fs.uw = Rt.uw; }}); 3997639Sgblack@eecs.umich.edu 0x7: mthc1({{ 4007639Sgblack@eecs.umich.edu uint64_t fs_hi = Rt.ud << 32; 4017639Sgblack@eecs.umich.edu uint64_t fs_lo = Fs.ud & 0x0000FFFF; 4027639Sgblack@eecs.umich.edu Fs.ud = fs_hi & fs_lo; 4037639Sgblack@eecs.umich.edu }}); 4047639Sgblack@eecs.umich.edu } 4057639Sgblack@eecs.umich.edu 4067639Sgblack@eecs.umich.edu format System { 4077639Sgblack@eecs.umich.edu 0x2: cfc1({{ 4087639Sgblack@eecs.umich.edu uint32_t fcsr_reg = xc->readMiscReg(FCSR); 4097639Sgblack@eecs.umich.edu 4107639Sgblack@eecs.umich.edu switch (FS) 4117639Sgblack@eecs.umich.edu { 4127639Sgblack@eecs.umich.edu case 0: 4137639Sgblack@eecs.umich.edu Rt = xc->readMiscReg(FIR); 4147639Sgblack@eecs.umich.edu break; 4157639Sgblack@eecs.umich.edu case 25: 4167639Sgblack@eecs.umich.edu Rt = 0 | (fcsr_reg & 0xFE000000) >> 24 | (fcsr_reg & 0x00800000) >> 23; 4177639Sgblack@eecs.umich.edu break; 4187639Sgblack@eecs.umich.edu case 26: 4197639Sgblack@eecs.umich.edu Rt = 0 | (fcsr_reg & 0x0003F07C); 4207639Sgblack@eecs.umich.edu break; 4217639Sgblack@eecs.umich.edu case 28: 4227639Sgblack@eecs.umich.edu Rt = 0 | (fcsr_reg); 4237639Sgblack@eecs.umich.edu break; 4247639Sgblack@eecs.umich.edu case 31: 4257639Sgblack@eecs.umich.edu Rt = fcsr_reg; 4267639Sgblack@eecs.umich.edu break; 4277639Sgblack@eecs.umich.edu default: 4287639Sgblack@eecs.umich.edu panic("FP Control Value (%d) Not Available. Ignoring Access to" 4297639Sgblack@eecs.umich.edu "Floating Control Status Register",fcsr_reg); 4307639Sgblack@eecs.umich.edu } 4317639Sgblack@eecs.umich.edu }}); 4327639Sgblack@eecs.umich.edu 4337639Sgblack@eecs.umich.edu 0x6: ctc1({{ 4347639Sgblack@eecs.umich.edu uint32_t fcsr_reg = xc->readMiscReg(FCSR); 4357639Sgblack@eecs.umich.edu uint32_t temp; 4367639Sgblack@eecs.umich.edu 4377639Sgblack@eecs.umich.edu switch (FS) 4387639Sgblack@eecs.umich.edu { 4397639Sgblack@eecs.umich.edu case 25: 4407639Sgblack@eecs.umich.edu temp = 0 | (Rt.uw<7:1> << 25) // move 31...25 4417639Sgblack@eecs.umich.edu | (fcsr_reg & 0x01000000) // bit 24 4427639Sgblack@eecs.umich.edu | (fcsr_reg & 0x004FFFFF);// bit 22...0 4437639Sgblack@eecs.umich.edu break; 4447639Sgblack@eecs.umich.edu 4457639Sgblack@eecs.umich.edu case 26: 4467639Sgblack@eecs.umich.edu temp = 0 | (fcsr_reg & 0xFFFC0000) // move 31...18 4477639Sgblack@eecs.umich.edu | Rt.uw<17:12> << 12 // bit 17...12 4487639Sgblack@eecs.umich.edu | (fcsr_reg & 0x00000F80) << 7// bit 11...7 4497639Sgblack@eecs.umich.edu | Rt.uw<6:2> << 2 // bit 6...2 4507639Sgblack@eecs.umich.edu | (fcsr_reg & 0x00000002); // bit 1...0 4517639Sgblack@eecs.umich.edu break; 4527639Sgblack@eecs.umich.edu 4537639Sgblack@eecs.umich.edu case 28: 4547639Sgblack@eecs.umich.edu temp = 0 | (fcsr_reg & 0xFE000000) // move 31...25 4557639Sgblack@eecs.umich.edu | Rt.uw<2:2> << 24 // bit 24 4567639Sgblack@eecs.umich.edu | (fcsr_reg & 0x00FFF000) << 23// bit 23...12 4577639Sgblack@eecs.umich.edu | Rt.uw<11:7> << 7 // bit 24 4587639Sgblack@eecs.umich.edu | (fcsr_reg & 0x000007E) 4597639Sgblack@eecs.umich.edu | Rt.uw<1:0>;// bit 22...0 4607639Sgblack@eecs.umich.edu break; 4617639Sgblack@eecs.umich.edu 4627639Sgblack@eecs.umich.edu case 31: 4637639Sgblack@eecs.umich.edu temp = Rt.uw; 4647639Sgblack@eecs.umich.edu break; 4657639Sgblack@eecs.umich.edu 4667639Sgblack@eecs.umich.edu default: 4677639Sgblack@eecs.umich.edu panic("FP Control Value (%d) Not Available. Ignoring Access to" 4687639Sgblack@eecs.umich.edu "Floating Control Status Register",fcsr_reg); 4697639Sgblack@eecs.umich.edu } 4707639Sgblack@eecs.umich.edu 4717639Sgblack@eecs.umich.edu xc->setMiscReg(FCSR,temp); 4727639Sgblack@eecs.umich.edu }}); 4737639Sgblack@eecs.umich.edu } 4747639Sgblack@eecs.umich.edu } 4757639Sgblack@eecs.umich.edu 4767639Sgblack@eecs.umich.edu 0x1: decode ND { 4777639Sgblack@eecs.umich.edu 0x0: decode TF { 4787639Sgblack@eecs.umich.edu format Branch { 4797639Sgblack@eecs.umich.edu 0x0: bc1f({{ cond = (getFPConditionCode(CC) == 0); }}); 4807639Sgblack@eecs.umich.edu 0x1: bc1t({{ cond = (getFPConditionCode(CC) == 1); }}); 4817639Sgblack@eecs.umich.edu } 4827639Sgblack@eecs.umich.edu } 4837639Sgblack@eecs.umich.edu 4847639Sgblack@eecs.umich.edu 0x1: decode TF { 4857639Sgblack@eecs.umich.edu format BranchLikely { 4867639Sgblack@eecs.umich.edu 0x0: bc1fl({{ cond = (getFPConditionCode(CC) == 0); }}); 4877639Sgblack@eecs.umich.edu 0x1: bc1tl({{ cond = (getFPConditionCode(CC) == 1); }}); 4887639Sgblack@eecs.umich.edu } 4897639Sgblack@eecs.umich.edu } 4907639Sgblack@eecs.umich.edu } 4917639Sgblack@eecs.umich.edu } 4927639Sgblack@eecs.umich.edu 4937639Sgblack@eecs.umich.edu 0x1: decode RS_HI { 4947639Sgblack@eecs.umich.edu 0x2: decode RS_LO { 4957639Sgblack@eecs.umich.edu 4967639Sgblack@eecs.umich.edu //Table A-14 MIPS32 COP1 Encoding of Function Field When rs=S 4977639Sgblack@eecs.umich.edu //(( single-word )) 4987639Sgblack@eecs.umich.edu 0x0: decode FUNCTION_HI { 4997639Sgblack@eecs.umich.edu 0x0: decode FUNCTION_LO { 5007639Sgblack@eecs.umich.edu format FloatOp { 5017639Sgblack@eecs.umich.edu 0x0: add_s({{ Fd.sf = Fs.sf + Ft.sf;}}); 5027639Sgblack@eecs.umich.edu 0x1: sub_s({{ Fd.sf = Fs.sf - Ft.sf;}}); 5037639Sgblack@eecs.umich.edu 0x2: mul_s({{ Fd.sf = Fs.sf * Ft.sf;}}); 5047639Sgblack@eecs.umich.edu 0x3: div_s({{ Fd.sf = Fs.sf / Ft.sf;}}); 5057639Sgblack@eecs.umich.edu 0x4: sqrt_s({{ Fd.sf = sqrt(Fs.sf);}}); 5067639Sgblack@eecs.umich.edu 0x5: abs_s({{ Fd.sf = fabs(Fs.sf);}}); 5077639Sgblack@eecs.umich.edu 0x6: mov_s({{ Fd.sf = Fs.sf;}}); 5087639Sgblack@eecs.umich.edu 0x7: neg_s({{ Fd.sf = -1 * Fs.sf;}}); 5097639Sgblack@eecs.umich.edu } 5107639Sgblack@eecs.umich.edu } 5117639Sgblack@eecs.umich.edu 5127639Sgblack@eecs.umich.edu 0x1: decode FUNCTION_LO { 5137639Sgblack@eecs.umich.edu format Float64Op { 5147639Sgblack@eecs.umich.edu 0x0: round_l_s({{ 5157639Sgblack@eecs.umich.edu Fd.ud = fpConvert(roundFP(Fs.sf), SINGLE_TO_LONG); 5167639Sgblack@eecs.umich.edu }}); 5177639Sgblack@eecs.umich.edu 5187639Sgblack@eecs.umich.edu 0x1: trunc_l_s({{ 5197639Sgblack@eecs.umich.edu Fd.ud = fpConvert(truncFP(Fs.sf), SINGLE_TO_LONG); 5207639Sgblack@eecs.umich.edu }}); 5217639Sgblack@eecs.umich.edu 5227639Sgblack@eecs.umich.edu 0x2: ceil_l_s({{ 5237639Sgblack@eecs.umich.edu Fd.ud = fpConvert(ceil(Fs.sf), SINGLE_TO_LONG); 5247639Sgblack@eecs.umich.edu }}); 5257639Sgblack@eecs.umich.edu 5267639Sgblack@eecs.umich.edu 0x3: floor_l_s({{ 5277639Sgblack@eecs.umich.edu Fd.ud = fpConvert(floor(Fs.sf), SINGLE_TO_LONG); 5287639Sgblack@eecs.umich.edu }}); 5297639Sgblack@eecs.umich.edu } 5307639Sgblack@eecs.umich.edu 5317639Sgblack@eecs.umich.edu format FloatOp { 5327639Sgblack@eecs.umich.edu 0x4: round_w_s({{ 5337639Sgblack@eecs.umich.edu Fd.uw = fpConvert(roundFP(Fs.sf), SINGLE_TO_WORD); 5347639Sgblack@eecs.umich.edu }}); 5357639Sgblack@eecs.umich.edu 5367639Sgblack@eecs.umich.edu 0x5: trunc_w_s({{ 5377639Sgblack@eecs.umich.edu Fd.uw = fpConvert(truncFP(Fs.sf), SINGLE_TO_WORD); 5387639Sgblack@eecs.umich.edu }}); 5397639Sgblack@eecs.umich.edu 5407639Sgblack@eecs.umich.edu 0x6: ceil_w_s({{ 5417639Sgblack@eecs.umich.edu Fd.uw = fpConvert(ceil(Fs.sf), SINGLE_TO_WORD); 5427639Sgblack@eecs.umich.edu }}); 5437639Sgblack@eecs.umich.edu 5447639Sgblack@eecs.umich.edu 0x7: floor_w_s({{ 5457639Sgblack@eecs.umich.edu Fd.uw = fpConvert(floor(Fs.sf), SINGLE_TO_WORD); 5467639Sgblack@eecs.umich.edu }}); 5477639Sgblack@eecs.umich.edu } 5487639Sgblack@eecs.umich.edu } 5497639Sgblack@eecs.umich.edu 5507639Sgblack@eecs.umich.edu 0x2: decode FUNCTION_LO { 5517639Sgblack@eecs.umich.edu 0x1: decode MOVCF { 5527639Sgblack@eecs.umich.edu format FloatOp { 5537639Sgblack@eecs.umich.edu 0x0: movf_s({{if (getFPConditionCode(CC) == 0) Fd = Fs;}}); 5547639Sgblack@eecs.umich.edu 0x1: movt_s({{if (getFPConditionCode(CC) == 1) Fd = Fs;}}); 5557639Sgblack@eecs.umich.edu } 5567639Sgblack@eecs.umich.edu } 5577639Sgblack@eecs.umich.edu 5587639Sgblack@eecs.umich.edu format FloatOp { 5597639Sgblack@eecs.umich.edu 0x2: movz_s({{ if (Rt == 0) Fd = Fs; }}); 5607639Sgblack@eecs.umich.edu 0x3: movn_s({{ if (Rt != 0) Fd = Fs; }}); 5617639Sgblack@eecs.umich.edu 0x5: recip_s({{ Fd = 1 / Fs; }}); 5627639Sgblack@eecs.umich.edu 0x6: rsqrt_s({{ Fd = 1 / sqrt(Fs);}}); 5637639Sgblack@eecs.umich.edu } 5647639Sgblack@eecs.umich.edu } 5657639Sgblack@eecs.umich.edu 5667639Sgblack@eecs.umich.edu 0x4: decode FUNCTION_LO { 5677639Sgblack@eecs.umich.edu 5687639Sgblack@eecs.umich.edu format FloatConvertOp { 5697639Sgblack@eecs.umich.edu 0x1: cvt_d_s({{ 5707639Sgblack@eecs.umich.edu Fd.ud = fpConvert(Fs.sf, SINGLE_TO_DOUBLE); 5717639Sgblack@eecs.umich.edu }}); 5727639Sgblack@eecs.umich.edu 5737639Sgblack@eecs.umich.edu 0x4: cvt_w_s({{ 5747639Sgblack@eecs.umich.edu Fd.uw = fpConvert(Fs.sf, SINGLE_TO_WORD); 5757639Sgblack@eecs.umich.edu }}); 5767639Sgblack@eecs.umich.edu } 5777639Sgblack@eecs.umich.edu 5787639Sgblack@eecs.umich.edu format FloatConvertOp { 5797639Sgblack@eecs.umich.edu 0x5: cvt_l_s({{ 5807639Sgblack@eecs.umich.edu Fd.ud = fpConvert(Fs.sf, SINGLE_TO_LONG); 5817639Sgblack@eecs.umich.edu }}); 5827639Sgblack@eecs.umich.edu 5837639Sgblack@eecs.umich.edu 0x6: cvt_ps_st({{ 5847639Sgblack@eecs.umich.edu Fd.ud = (uint64_t)Fs.uw << 32 | (uint64_t)Ft.uw; 5857639Sgblack@eecs.umich.edu }}); 5867639Sgblack@eecs.umich.edu } 5877639Sgblack@eecs.umich.edu } 5887639Sgblack@eecs.umich.edu 5897639Sgblack@eecs.umich.edu 0x6: decode FUNCTION_LO { 5907639Sgblack@eecs.umich.edu format FloatCompareOp { 5917639Sgblack@eecs.umich.edu 0x0: c_f_s({{ cond = 0; }}); 5927639Sgblack@eecs.umich.edu 5937639Sgblack@eecs.umich.edu 0x1: c_un_s({{ 5947639Sgblack@eecs.umich.edu if (unorderedFP(Fs.sf) || unorderedFP(Ft.sf)) 5957639Sgblack@eecs.umich.edu cond = 1; 5967639Sgblack@eecs.umich.edu else 5977639Sgblack@eecs.umich.edu cond = 0; 5987639Sgblack@eecs.umich.edu }}); 5997639Sgblack@eecs.umich.edu 6007639Sgblack@eecs.umich.edu 0x2: c_eq_s({{ 6017639Sgblack@eecs.umich.edu if (unorderedFP(Fs.sf) || unorderedFP(Ft.sf)) 6027639Sgblack@eecs.umich.edu cond = 0; 6037639Sgblack@eecs.umich.edu else 6047639Sgblack@eecs.umich.edu cond = (Fs.sf == Ft.sf); 6057639Sgblack@eecs.umich.edu }}); 6067639Sgblack@eecs.umich.edu 6077639Sgblack@eecs.umich.edu 0x3: c_ueq_s({{ 6087639Sgblack@eecs.umich.edu if (unorderedFP(Fs.sf) || unorderedFP(Ft.sf)) 6097639Sgblack@eecs.umich.edu cond = 1; 6107639Sgblack@eecs.umich.edu else 6117639Sgblack@eecs.umich.edu cond = (Fs.sf == Ft.sf); 6127639Sgblack@eecs.umich.edu }}); 6137639Sgblack@eecs.umich.edu 6147639Sgblack@eecs.umich.edu 0x4: c_olt_s({{ 6157639Sgblack@eecs.umich.edu if (unorderedFP(Fs.sf) || unorderedFP(Ft.sf)) 6167639Sgblack@eecs.umich.edu cond = 0; 6177639Sgblack@eecs.umich.edu else 6187639Sgblack@eecs.umich.edu cond = (Fs.sf < Ft.sf); 6197639Sgblack@eecs.umich.edu }}); 6207639Sgblack@eecs.umich.edu 6217639Sgblack@eecs.umich.edu 0x5: c_ult_s({{ 6227639Sgblack@eecs.umich.edu if (unorderedFP(Fs.sf) || unorderedFP(Ft.sf)) 6237640Sgblack@eecs.umich.edu cond = 1; 6247640Sgblack@eecs.umich.edu else 6257640Sgblack@eecs.umich.edu cond = (Fs.sf < Ft.sf); 6267640Sgblack@eecs.umich.edu }}); 6277640Sgblack@eecs.umich.edu 6287640Sgblack@eecs.umich.edu 0x6: c_ole_s({{ 6297640Sgblack@eecs.umich.edu if (unorderedFP(Fs.sf) || unorderedFP(Ft.sf)) 6307639Sgblack@eecs.umich.edu cond = 0; 6317639Sgblack@eecs.umich.edu else 6327639Sgblack@eecs.umich.edu cond = (Fs.sf <= Ft.sf); 6337639Sgblack@eecs.umich.edu }}); 6347639Sgblack@eecs.umich.edu 6357639Sgblack@eecs.umich.edu 0x7: c_ule_s({{ 6367639Sgblack@eecs.umich.edu if (unorderedFP(Fs.sf) || unorderedFP(Ft.sf)) 6377639Sgblack@eecs.umich.edu cond = 1; 6387639Sgblack@eecs.umich.edu else 6397639Sgblack@eecs.umich.edu cond = (Fs.sf <= Ft.sf); 6407639Sgblack@eecs.umich.edu }}); 6417639Sgblack@eecs.umich.edu } 6427639Sgblack@eecs.umich.edu } 6437639Sgblack@eecs.umich.edu 6447640Sgblack@eecs.umich.edu 0x7: decode FUNCTION_LO { 6457639Sgblack@eecs.umich.edu format FloatCompareWithXcptOp { 6467639Sgblack@eecs.umich.edu 0x0: c_sf_s({{ cond = 0; }}); 6477639Sgblack@eecs.umich.edu 6487639Sgblack@eecs.umich.edu 0x1: c_ngle_s({{ 6497639Sgblack@eecs.umich.edu if (unorderedFP(Fs.sf) || unorderedFP(Ft.sf)) 6507639Sgblack@eecs.umich.edu cond = 1; 6517639Sgblack@eecs.umich.edu else 6527639Sgblack@eecs.umich.edu cond = 0; 6537639Sgblack@eecs.umich.edu }}); 6547639Sgblack@eecs.umich.edu 6557639Sgblack@eecs.umich.edu 0x2: c_seq_s({{ 6567639Sgblack@eecs.umich.edu if (unorderedFP(Fs.sf) || unorderedFP(Ft.sf)) 6577639Sgblack@eecs.umich.edu cond = 0; 6587639Sgblack@eecs.umich.edu else 6597639Sgblack@eecs.umich.edu cond = (Fs.sf == Ft.sf); 6607639Sgblack@eecs.umich.edu }}); 6617639Sgblack@eecs.umich.edu 6627639Sgblack@eecs.umich.edu 0x3: c_ngl_s({{ 6637639Sgblack@eecs.umich.edu if (unorderedFP(Fs.sf) || unorderedFP(Ft.sf)) 6647639Sgblack@eecs.umich.edu cond = 1; 6657639Sgblack@eecs.umich.edu else 6667639Sgblack@eecs.umich.edu cond = (Fs.sf == Ft.sf); 6677639Sgblack@eecs.umich.edu }}); 6687639Sgblack@eecs.umich.edu 6697639Sgblack@eecs.umich.edu 0x4: c_lt_s({{ 6707639Sgblack@eecs.umich.edu if (unorderedFP(Fs.sf) || unorderedFP(Ft.sf)) 6717639Sgblack@eecs.umich.edu cond = 0; 6727639Sgblack@eecs.umich.edu else 6737639Sgblack@eecs.umich.edu cond = (Fs.sf < Ft.sf); 6747639Sgblack@eecs.umich.edu }}); 6757639Sgblack@eecs.umich.edu 6767639Sgblack@eecs.umich.edu 0x5: c_nge_s({{ 6777639Sgblack@eecs.umich.edu if (unorderedFP(Fs.sf) || unorderedFP(Ft.sf)) 6787639Sgblack@eecs.umich.edu cond = 1; 6797639Sgblack@eecs.umich.edu else 6807639Sgblack@eecs.umich.edu cond = (Fs.sf < Ft.sf); 6817639Sgblack@eecs.umich.edu }}); 6827639Sgblack@eecs.umich.edu 6837639Sgblack@eecs.umich.edu 0x6: c_le_s({{ 6847639Sgblack@eecs.umich.edu if (unorderedFP(Fs.sf) || unorderedFP(Ft.sf)) 6857639Sgblack@eecs.umich.edu cond = 0; 6867639Sgblack@eecs.umich.edu else 6877639Sgblack@eecs.umich.edu cond = (Fs.sf <= Ft.sf); 6887639Sgblack@eecs.umich.edu }}); 6897639Sgblack@eecs.umich.edu 6907639Sgblack@eecs.umich.edu 0x7: c_ngt_s({{ 6917639Sgblack@eecs.umich.edu if (unorderedFP(Fs.sf) || unorderedFP(Ft.sf)) 6927639Sgblack@eecs.umich.edu cond = 1; 6937639Sgblack@eecs.umich.edu else 6947639Sgblack@eecs.umich.edu cond = (Fs.sf <= Ft.sf); 6957639Sgblack@eecs.umich.edu }}); 6967639Sgblack@eecs.umich.edu } 6977639Sgblack@eecs.umich.edu } 6987639Sgblack@eecs.umich.edu } 6997639Sgblack@eecs.umich.edu 7007639Sgblack@eecs.umich.edu //Table A-15 MIPS32 COP1 Encoding of Function Field When rs=D 7017639Sgblack@eecs.umich.edu 0x1: decode FUNCTION_HI { 7027639Sgblack@eecs.umich.edu 0x0: decode FUNCTION_LO { 7037639Sgblack@eecs.umich.edu format FloatOp { 7047640Sgblack@eecs.umich.edu 0x0: add_d({{ Fd.df = Fs.df + Ft.df;}}); 7057639Sgblack@eecs.umich.edu 0x1: sub_d({{ Fd.df = Fs.df - Ft.df;}}); 7067639Sgblack@eecs.umich.edu 0x2: mul_d({{ Fd.df = Fs.df * Ft.df;}}); 7077639Sgblack@eecs.umich.edu 0x3: div_d({{ Fd.df = Fs.df / Ft.df;}}); 7087639Sgblack@eecs.umich.edu 0x4: sqrt_d({{ Fd.df = sqrt(Fs.df);}}); 7097639Sgblack@eecs.umich.edu 0x5: abs_d({{ Fd.df = fabs(Fs.df);}}); 7107639Sgblack@eecs.umich.edu 0x6: mov_d({{ Fd.ud = Fs.ud;}}); 7117639Sgblack@eecs.umich.edu 0x7: neg_d({{ Fd.df = -1 * Fs.df;}}); 7127639Sgblack@eecs.umich.edu } 7137639Sgblack@eecs.umich.edu } 7147639Sgblack@eecs.umich.edu 7157639Sgblack@eecs.umich.edu 0x1: decode FUNCTION_LO { 7167639Sgblack@eecs.umich.edu format FloatOp { 7177639Sgblack@eecs.umich.edu 0x0: round_l_d({{ 7187639Sgblack@eecs.umich.edu Fd.ud = fpConvert(roundFP(Fs.ud), DOUBLE_TO_LONG); 7197639Sgblack@eecs.umich.edu }}); 7207639Sgblack@eecs.umich.edu 7217639Sgblack@eecs.umich.edu 0x1: trunc_l_d({{ 7227639Sgblack@eecs.umich.edu Fd.ud = fpConvert(truncFP(Fs.ud), DOUBLE_TO_LONG); 7237639Sgblack@eecs.umich.edu }}); 7247639Sgblack@eecs.umich.edu 7257639Sgblack@eecs.umich.edu 0x2: ceil_l_d({{ 7267639Sgblack@eecs.umich.edu Fd.ud = fpConvert(ceil(Fs.ud), DOUBLE_TO_LONG); 7277639Sgblack@eecs.umich.edu }}); 7287639Sgblack@eecs.umich.edu 7297639Sgblack@eecs.umich.edu 0x3: floor_l_d({{ 7307639Sgblack@eecs.umich.edu Fd.ud = fpConvert(floor(Fs.ud), DOUBLE_TO_LONG); 7317639Sgblack@eecs.umich.edu }}); 7327639Sgblack@eecs.umich.edu } 7337639Sgblack@eecs.umich.edu 7347639Sgblack@eecs.umich.edu format FloatOp { 7357639Sgblack@eecs.umich.edu 0x4: round_w_d({{ 7367639Sgblack@eecs.umich.edu Fd.uw = fpConvert(roundFP(Fs.ud), DOUBLE_TO_WORD); 7377639Sgblack@eecs.umich.edu }}); 7387639Sgblack@eecs.umich.edu 7397639Sgblack@eecs.umich.edu 0x5: trunc_w_d({{ 7407639Sgblack@eecs.umich.edu Fd.uw = fpConvert(truncFP(Fs.ud), DOUBLE_TO_WORD); 7417639Sgblack@eecs.umich.edu }}); 7427639Sgblack@eecs.umich.edu 7437639Sgblack@eecs.umich.edu 0x6: ceil_w_d({{ 7447639Sgblack@eecs.umich.edu Fd.uw = fpConvert(ceil(Fs.ud), DOUBLE_TO_WORD); 7457639Sgblack@eecs.umich.edu }}); 7467639Sgblack@eecs.umich.edu 7477639Sgblack@eecs.umich.edu 0x7: floor_w_d({{ 7487639Sgblack@eecs.umich.edu Fd.uw = fpConvert(floor(Fs.ud), DOUBLE_TO_WORD); 7497639Sgblack@eecs.umich.edu }}); 7507639Sgblack@eecs.umich.edu } 7517639Sgblack@eecs.umich.edu } 7527639Sgblack@eecs.umich.edu 7537639Sgblack@eecs.umich.edu 0x2: decode FUNCTION_LO { 7547639Sgblack@eecs.umich.edu 0x1: decode MOVCF { 7557639Sgblack@eecs.umich.edu format FloatOp { 7567639Sgblack@eecs.umich.edu 0x0: movf_d({{if (getFPConditionCode(CC) == 0) Fd.df = Fs.df; }}); 7577639Sgblack@eecs.umich.edu 0x1: movt_d({{if (getFPConditionCode(CC) == 1) Fd.df = Fs.df; }}); 7587639Sgblack@eecs.umich.edu } 7597639Sgblack@eecs.umich.edu } 7607639Sgblack@eecs.umich.edu 7617639Sgblack@eecs.umich.edu format BasicOp { 7627639Sgblack@eecs.umich.edu 0x2: movz_d({{ if (Rt == 0) Fd.df = Fs.df; }}); 7637639Sgblack@eecs.umich.edu 0x3: movn_d({{ if (Rt != 0) Fd.df = Fs.df; }}); 7647639Sgblack@eecs.umich.edu } 7657639Sgblack@eecs.umich.edu 7667639Sgblack@eecs.umich.edu format FloatOp { 7677639Sgblack@eecs.umich.edu 0x5: recip_d({{ Fd.df = 1 / Fs.df}}); 7687639Sgblack@eecs.umich.edu 0x6: rsqrt_d({{ Fd.df = 1 / sqrt(Fs.df) }}); 7697639Sgblack@eecs.umich.edu } 7707639Sgblack@eecs.umich.edu } 7717639Sgblack@eecs.umich.edu 7727639Sgblack@eecs.umich.edu 0x4: decode FUNCTION_LO { 7737639Sgblack@eecs.umich.edu format FloatOp { 7747639Sgblack@eecs.umich.edu 0x0: cvt_s_d({{ 7757639Sgblack@eecs.umich.edu Fd.uw = fpConvert(Fs.ud, DOUBLE_TO_SINGLE); 7767639Sgblack@eecs.umich.edu }}); 7777639Sgblack@eecs.umich.edu 7787639Sgblack@eecs.umich.edu 0x4: cvt_w_d({{ 7797639Sgblack@eecs.umich.edu Fd.uw = fpConvert(Fs.ud, DOUBLE_TO_WORD); 7807639Sgblack@eecs.umich.edu }}); 7817639Sgblack@eecs.umich.edu 7827639Sgblack@eecs.umich.edu 0x5: cvt_l_d({{ 7837639Sgblack@eecs.umich.edu Fd.ud = fpConvert(Fs.ud, DOUBLE_TO_LONG); 7847639Sgblack@eecs.umich.edu }}); 7857639Sgblack@eecs.umich.edu } 7867639Sgblack@eecs.umich.edu } 7877639Sgblack@eecs.umich.edu 7887639Sgblack@eecs.umich.edu 0x6: decode FUNCTION_LO { 7897639Sgblack@eecs.umich.edu format FloatCompareOp { 7907639Sgblack@eecs.umich.edu 0x0: c_f_d({{ cond = 0; }}); 7917639Sgblack@eecs.umich.edu 7927639Sgblack@eecs.umich.edu 0x1: c_un_d({{ 7937639Sgblack@eecs.umich.edu if (unorderedFP(Fs.df) || unorderedFP(Ft.df)) 7947639Sgblack@eecs.umich.edu cond = 1; 7957639Sgblack@eecs.umich.edu else 7967639Sgblack@eecs.umich.edu cond = 0; 7977639Sgblack@eecs.umich.edu }}); 7987639Sgblack@eecs.umich.edu 7997640Sgblack@eecs.umich.edu 0x2: c_eq_d({{ 8007639Sgblack@eecs.umich.edu if (unorderedFP(Fs.df) || unorderedFP(Ft.df)) 8017639Sgblack@eecs.umich.edu cond = 0; 8027639Sgblack@eecs.umich.edu else 8037639Sgblack@eecs.umich.edu cond = (Fs.df == Ft.df); 8047639Sgblack@eecs.umich.edu }}); 8057639Sgblack@eecs.umich.edu 8067639Sgblack@eecs.umich.edu 0x3: c_ueq_d({{ 8077639Sgblack@eecs.umich.edu if (unorderedFP(Fs.df) || unorderedFP(Ft.df)) 8087639Sgblack@eecs.umich.edu cond = 1; 8097639Sgblack@eecs.umich.edu else 8107639Sgblack@eecs.umich.edu cond = (Fs.df == Ft.df); 8117639Sgblack@eecs.umich.edu }}); 8127639Sgblack@eecs.umich.edu 8137639Sgblack@eecs.umich.edu 0x4: c_olt_d({{ 8147639Sgblack@eecs.umich.edu if (unorderedFP(Fs.df) || unorderedFP(Ft.df)) 8157639Sgblack@eecs.umich.edu cond = 0; 8167639Sgblack@eecs.umich.edu else 8177639Sgblack@eecs.umich.edu cond = (Fs.df < Ft.df); 8187639Sgblack@eecs.umich.edu }}); 8197639Sgblack@eecs.umich.edu 8207639Sgblack@eecs.umich.edu 0x5: c_ult_d({{ 8217639Sgblack@eecs.umich.edu if (unorderedFP(Fs.df) || unorderedFP(Ft.df)) 8227639Sgblack@eecs.umich.edu cond = 1; 8237639Sgblack@eecs.umich.edu else 8247639Sgblack@eecs.umich.edu cond = (Fs.df < Ft.df); 8257639Sgblack@eecs.umich.edu }}); 8267639Sgblack@eecs.umich.edu 8277639Sgblack@eecs.umich.edu 0x6: c_ole_d({{ 8287639Sgblack@eecs.umich.edu if (unorderedFP(Fs.df) || unorderedFP(Ft.df)) 8297639Sgblack@eecs.umich.edu cond = 0; 8307639Sgblack@eecs.umich.edu else 8317639Sgblack@eecs.umich.edu cond = (Fs.df <= Ft.df); 8327639Sgblack@eecs.umich.edu }}); 8337639Sgblack@eecs.umich.edu 8347639Sgblack@eecs.umich.edu 0x7: c_ule_d({{ 8357639Sgblack@eecs.umich.edu if (unorderedFP(Fs.df) || unorderedFP(Ft.df)) 8367639Sgblack@eecs.umich.edu cond = 1; 8377639Sgblack@eecs.umich.edu else 8387639Sgblack@eecs.umich.edu cond = (Fs.df <= Ft.df); 8397639Sgblack@eecs.umich.edu }}); 8407639Sgblack@eecs.umich.edu } 8417639Sgblack@eecs.umich.edu } 8427639Sgblack@eecs.umich.edu 8437639Sgblack@eecs.umich.edu 0x7: decode FUNCTION_LO { 8447639Sgblack@eecs.umich.edu format FloatCompareWithXcptOp { 8457639Sgblack@eecs.umich.edu 0x0: c_sf_d({{ cond = 0; }}); 8467639Sgblack@eecs.umich.edu 8477639Sgblack@eecs.umich.edu 0x1: c_ngle_d({{ 8487639Sgblack@eecs.umich.edu if (unorderedFP(Fs.df) || unorderedFP(Ft.df)) 8497639Sgblack@eecs.umich.edu cond = 1; 8507639Sgblack@eecs.umich.edu else 8517639Sgblack@eecs.umich.edu cond = 0; 8527639Sgblack@eecs.umich.edu }}); 8537639Sgblack@eecs.umich.edu 8547639Sgblack@eecs.umich.edu 0x2: c_seq_d({{ 8557639Sgblack@eecs.umich.edu if (unorderedFP(Fs.df) || unorderedFP(Ft.df)) 8567639Sgblack@eecs.umich.edu cond = 0; 8577639Sgblack@eecs.umich.edu else 8587639Sgblack@eecs.umich.edu cond = (Fs.df == Ft.df); 8597639Sgblack@eecs.umich.edu }}); 8607639Sgblack@eecs.umich.edu 8617639Sgblack@eecs.umich.edu 0x3: c_ngl_d({{ 8627640Sgblack@eecs.umich.edu if (unorderedFP(Fs.df) || unorderedFP(Ft.df)) 8637639Sgblack@eecs.umich.edu cond = 1; 8647639Sgblack@eecs.umich.edu else 8657639Sgblack@eecs.umich.edu cond = (Fs.df == Ft.df); 8667639Sgblack@eecs.umich.edu }}); 8677639Sgblack@eecs.umich.edu 8687639Sgblack@eecs.umich.edu 0x4: c_lt_d({{ 8697639Sgblack@eecs.umich.edu if (unorderedFP(Fs.df) || unorderedFP(Ft.df)) 8707639Sgblack@eecs.umich.edu cond = 0; 8717639Sgblack@eecs.umich.edu else 8727639Sgblack@eecs.umich.edu cond = (Fs.df < Ft.df); 8737639Sgblack@eecs.umich.edu }}); 8747639Sgblack@eecs.umich.edu 8757639Sgblack@eecs.umich.edu 0x5: c_nge_d({{ 8767639Sgblack@eecs.umich.edu if (unorderedFP(Fs.df) || unorderedFP(Ft.df)) 8777639Sgblack@eecs.umich.edu cond = 1; 8787639Sgblack@eecs.umich.edu else 8797639Sgblack@eecs.umich.edu cond = (Fs.df < Ft.df); 8807639Sgblack@eecs.umich.edu }}); 8817639Sgblack@eecs.umich.edu 8827639Sgblack@eecs.umich.edu 0x6: c_le_d({{ 8837639Sgblack@eecs.umich.edu if (unorderedFP(Fs.df) || unorderedFP(Ft.df)) 8847639Sgblack@eecs.umich.edu cond = 0; 8857639Sgblack@eecs.umich.edu else 8867639Sgblack@eecs.umich.edu cond = (Fs.df <= Ft.df); 8877639Sgblack@eecs.umich.edu }}); 8887639Sgblack@eecs.umich.edu 8897639Sgblack@eecs.umich.edu 0x7: c_ngt_d({{ 8907639Sgblack@eecs.umich.edu if (unorderedFP(Fs.df) || unorderedFP(Ft.df)) 8917639Sgblack@eecs.umich.edu cond = 1; 8927639Sgblack@eecs.umich.edu else 8937639Sgblack@eecs.umich.edu cond = (Fs.df <= Ft.df); 8947639Sgblack@eecs.umich.edu }}); 8957639Sgblack@eecs.umich.edu } 8967639Sgblack@eecs.umich.edu } 8977639Sgblack@eecs.umich.edu } 8987639Sgblack@eecs.umich.edu 8997639Sgblack@eecs.umich.edu //Table A-16 MIPS32 COP1 Encoding of Function Field When rs=W 9007639Sgblack@eecs.umich.edu 0x4: decode FUNCTION { 9017639Sgblack@eecs.umich.edu format FloatConvertOp { 9027639Sgblack@eecs.umich.edu 0x20: cvt_s_w({{ 9037639Sgblack@eecs.umich.edu Fd.uw = fpConvert(Fs.sf, WORD_TO_SINGLE); 9047639Sgblack@eecs.umich.edu }}); 9057639Sgblack@eecs.umich.edu 9067639Sgblack@eecs.umich.edu 0x21: cvt_d_w({{ 9077640Sgblack@eecs.umich.edu Fd.ud = fpConvert(Fs.sf, WORD_TO_DOUBLE); 9087639Sgblack@eecs.umich.edu }}); 9097639Sgblack@eecs.umich.edu } 9107639Sgblack@eecs.umich.edu 9117639Sgblack@eecs.umich.edu format Float64ConvertOp { 9127639Sgblack@eecs.umich.edu 0x26: cvt_ps_pw({{ 9137639Sgblack@eecs.umich.edu Fd.ud = fpConvert(Fs.ud, WORD_TO_PS); 9147639Sgblack@eecs.umich.edu }}); 9157639Sgblack@eecs.umich.edu } 9167639Sgblack@eecs.umich.edu } 9177639Sgblack@eecs.umich.edu 9187639Sgblack@eecs.umich.edu //Table A-16 MIPS32 COP1 Encoding of Function Field When rs=L1 9197639Sgblack@eecs.umich.edu //Note: "1. Format type L is legal only if 64-bit floating point operations 9207639Sgblack@eecs.umich.edu //are enabled." 9217639Sgblack@eecs.umich.edu 0x5: decode FUNCTION_HI { 9227639Sgblack@eecs.umich.edu format Float64ConvertOp { 9237639Sgblack@eecs.umich.edu 0x20: cvt_s_l({{ 9247639Sgblack@eecs.umich.edu Fd.uw = fpConvert(Fs.ud, LONG_TO_SINGLE); 9257639Sgblack@eecs.umich.edu }}); 9267639Sgblack@eecs.umich.edu 9277639Sgblack@eecs.umich.edu 0x21: cvt_d_l({{ 9287639Sgblack@eecs.umich.edu Fd.ud = fpConvert(Fs.ud, LONG_TO_DOUBLE); 9297639Sgblack@eecs.umich.edu }}); 9307639Sgblack@eecs.umich.edu 9317639Sgblack@eecs.umich.edu 0x26: cvt_ps_l({{ 9327639Sgblack@eecs.umich.edu Fd.ud = fpConvert(Fs.ud, LONG_TO_PS); 9337639Sgblack@eecs.umich.edu }}); 9347639Sgblack@eecs.umich.edu } 9357639Sgblack@eecs.umich.edu } 9367639Sgblack@eecs.umich.edu 9377639Sgblack@eecs.umich.edu //Table A-17 MIPS64 COP1 Encoding of Function Field When rs=PS1 9387639Sgblack@eecs.umich.edu //Note: "1. Format type PS is legal only if 64-bit floating point operations 9397639Sgblack@eecs.umich.edu //are enabled. " 9407639Sgblack@eecs.umich.edu 0x6: decode FUNCTION_HI { 9417639Sgblack@eecs.umich.edu 0x0: decode FUNCTION_LO { 9427639Sgblack@eecs.umich.edu format Float64Op { 9437639Sgblack@eecs.umich.edu 0x0: add_ps({{ 9447639Sgblack@eecs.umich.edu Fd1.sf = Fs1.sf + Ft2.sf; 9457639Sgblack@eecs.umich.edu Fd2.sf = Fs2.sf + Ft2.sf; 9467639Sgblack@eecs.umich.edu }}); 9477639Sgblack@eecs.umich.edu 9487639Sgblack@eecs.umich.edu 0x1: sub_ps({{ 9497639Sgblack@eecs.umich.edu Fd1.sf = Fs1.sf - Ft2.sf; 9507639Sgblack@eecs.umich.edu Fd2.sf = Fs2.sf - Ft2.sf; 9517639Sgblack@eecs.umich.edu }}); 9527639Sgblack@eecs.umich.edu 9537640Sgblack@eecs.umich.edu 0x2: mul_ps({{ 9547639Sgblack@eecs.umich.edu Fd1.sf = Fs1.sf * Ft2.sf; 9557639Sgblack@eecs.umich.edu Fd2.sf = Fs2.sf * Ft2.sf; 9567639Sgblack@eecs.umich.edu }}); 9577639Sgblack@eecs.umich.edu 9587639Sgblack@eecs.umich.edu 0x5: abs_ps({{ 9597639Sgblack@eecs.umich.edu Fd1.sf = fabs(Fs1.sf); 9607639Sgblack@eecs.umich.edu Fd2.sf = fabs(Fs2.sf); 9617639Sgblack@eecs.umich.edu }}); 9627639Sgblack@eecs.umich.edu 9637639Sgblack@eecs.umich.edu 0x6: mov_ps({{ 9647639Sgblack@eecs.umich.edu Fd1.sf = Fs1.sf; 9657639Sgblack@eecs.umich.edu Fd2.sf = Fs2.sf; 9667639Sgblack@eecs.umich.edu }}); 9677639Sgblack@eecs.umich.edu 9687639Sgblack@eecs.umich.edu 0x7: neg_ps({{ 9697639Sgblack@eecs.umich.edu Fd1.sf = -1 * Fs1.sf; 9707639Sgblack@eecs.umich.edu Fd2.sf = -1 * Fs2.sf; 9717639Sgblack@eecs.umich.edu }}); 9727639Sgblack@eecs.umich.edu } 9737639Sgblack@eecs.umich.edu } 9747639Sgblack@eecs.umich.edu 9757639Sgblack@eecs.umich.edu 0x2: decode FUNCTION_LO { 9767639Sgblack@eecs.umich.edu 0x1: decode MOVCF { 9777639Sgblack@eecs.umich.edu format Float64Op { 9787639Sgblack@eecs.umich.edu 0x0: movf_ps({{ 9797639Sgblack@eecs.umich.edu if (getFPConditionCode(CC) == 0) 9807639Sgblack@eecs.umich.edu Fd1 = Fs1; 9817639Sgblack@eecs.umich.edu if (getFPConditionCode(CC+1) == 0) 9827639Sgblack@eecs.umich.edu Fd2 = Fs2; 9837639Sgblack@eecs.umich.edu }}); 9847639Sgblack@eecs.umich.edu 9857639Sgblack@eecs.umich.edu 0x1: movt_ps({{ 9867639Sgblack@eecs.umich.edu if (getFPConditionCode(CC) == 1) 9877639Sgblack@eecs.umich.edu Fd1 = Fs1; 9887639Sgblack@eecs.umich.edu if (getFPConditionCode(CC+1) == 1) 9897639Sgblack@eecs.umich.edu Fd2 = Fs2; 9907639Sgblack@eecs.umich.edu }}); 9917639Sgblack@eecs.umich.edu } 9927639Sgblack@eecs.umich.edu } 9937639Sgblack@eecs.umich.edu 9947639Sgblack@eecs.umich.edu format Float64Op { 9957639Sgblack@eecs.umich.edu 0x2: movz_ps({{ 9967639Sgblack@eecs.umich.edu if (getFPConditionCode(CC) == 0) 9977639Sgblack@eecs.umich.edu Fd1 = Fs1; 9987639Sgblack@eecs.umich.edu if (getFPConditionCode(CC) == 0) 9997640Sgblack@eecs.umich.edu Fd2 = Fs2; 10007639Sgblack@eecs.umich.edu }}); 10017639Sgblack@eecs.umich.edu 10027639Sgblack@eecs.umich.edu 0x3: movn_ps({{ 10037639Sgblack@eecs.umich.edu if (getFPConditionCode(CC) == 1) 10047639Sgblack@eecs.umich.edu Fd1 = Fs1; 10057639Sgblack@eecs.umich.edu if (getFPConditionCode(CC) == 1) 10067639Sgblack@eecs.umich.edu Fd2 = Fs2; 10077639Sgblack@eecs.umich.edu }}); 10087639Sgblack@eecs.umich.edu } 10097639Sgblack@eecs.umich.edu 10107639Sgblack@eecs.umich.edu } 10117639Sgblack@eecs.umich.edu 10127639Sgblack@eecs.umich.edu 0x4: decode FUNCTION_LO { 10137639Sgblack@eecs.umich.edu 0x0: Float64Op::cvt_s_pu({{ 10147639Sgblack@eecs.umich.edu Fd.uw = fpConvert(Fs2.uw, PU_TO_SINGLE); 10157639Sgblack@eecs.umich.edu }}); 10167639Sgblack@eecs.umich.edu } 10177639Sgblack@eecs.umich.edu 10187639Sgblack@eecs.umich.edu 0x5: decode FUNCTION_LO { 10197639Sgblack@eecs.umich.edu format Float64Op { 10207639Sgblack@eecs.umich.edu 0x0: cvt_s_pl({{ 10217639Sgblack@eecs.umich.edu Fd.uw = fpConvert(Fs1.uw, PL_TO_SINGLE); 10227639Sgblack@eecs.umich.edu }}); 10237639Sgblack@eecs.umich.edu 10247639Sgblack@eecs.umich.edu 0x4: pll({{ Fd.ud = Fs.ud<31:0> << 32 | Ft.ud<31:0>; }}); 10257639Sgblack@eecs.umich.edu 0x5: plu({{ Fd.ud = Fs.ud<31:0> << 32 | Ft.ud<63:32>;}}); 10267639Sgblack@eecs.umich.edu 0x6: pul({{ Fd.ud = Fs.ud<63:32> << 32 | Ft.ud<31:0>; }}); 10277639Sgblack@eecs.umich.edu 0x7: puu({{ Fd.ud = Fs.ud<63:32> << 32 | Ft.ud<63:32>;}}); 10287639Sgblack@eecs.umich.edu } 10297639Sgblack@eecs.umich.edu } 10307639Sgblack@eecs.umich.edu 10317639Sgblack@eecs.umich.edu 0x6: decode FUNCTION_LO { 10327639Sgblack@eecs.umich.edu format FloatOp { 10337639Sgblack@eecs.umich.edu 0x0: c_f_ps({{ ; }}); 10347639Sgblack@eecs.umich.edu 0x1: c_un_ps({{ ; }}); 10357639Sgblack@eecs.umich.edu 0x2: c_eq_ps({{ ; }}); 10367639Sgblack@eecs.umich.edu 0x3: c_ueq_ps({{ ; }}); 10377639Sgblack@eecs.umich.edu 0x4: c_olt_ps({{ ; }}); 10387639Sgblack@eecs.umich.edu 0x5: c_ult_ps({{ ; }}); 10397639Sgblack@eecs.umich.edu 0x6: c_ole_ps({{ ; }}); 10407639Sgblack@eecs.umich.edu 0x7: c_ule_ps({{ ; }}); 10417639Sgblack@eecs.umich.edu } 10427639Sgblack@eecs.umich.edu } 10437639Sgblack@eecs.umich.edu 10447639Sgblack@eecs.umich.edu 0x7: decode FUNCTION_LO { 10457639Sgblack@eecs.umich.edu format FloatOp { 10467639Sgblack@eecs.umich.edu 0x0: c_sf_ps({{ ; }}); 10477639Sgblack@eecs.umich.edu 0x1: c_ngle_ps({{ ; }}); 10487639Sgblack@eecs.umich.edu 0x2: c_seq_ps({{ ; }}); 10497639Sgblack@eecs.umich.edu 0x3: c_ngl_ps({{ ; }}); 10507639Sgblack@eecs.umich.edu 0x4: c_lt_ps({{ ; }}); 10517639Sgblack@eecs.umich.edu 0x5: c_nge_ps({{ ; }}); 10527639Sgblack@eecs.umich.edu 0x6: c_le_ps({{ ; }}); 10537639Sgblack@eecs.umich.edu 0x7: c_ngt_ps({{ ; }}); 10547640Sgblack@eecs.umich.edu } 10557639Sgblack@eecs.umich.edu } 10567639Sgblack@eecs.umich.edu 10577639Sgblack@eecs.umich.edu } 10587639Sgblack@eecs.umich.edu } 10597639Sgblack@eecs.umich.edu } 10607639Sgblack@eecs.umich.edu } 10617639Sgblack@eecs.umich.edu 10627639Sgblack@eecs.umich.edu //Table A-19 MIPS32 COP2 Encoding of rs Field 10637639Sgblack@eecs.umich.edu 0x2: decode RS_MSB { 10647639Sgblack@eecs.umich.edu 0x0: decode RS_HI { 10657639Sgblack@eecs.umich.edu 0x0: decode RS_LO { 10667639Sgblack@eecs.umich.edu format WarnUnimpl { 10677639Sgblack@eecs.umich.edu 0x0: mfc2(); 10687639Sgblack@eecs.umich.edu 0x2: cfc2(); 10697639Sgblack@eecs.umich.edu 0x3: mfhc2(); 10707639Sgblack@eecs.umich.edu 0x4: mtc2(); 10717639Sgblack@eecs.umich.edu 0x6: ctc2(); 10727639Sgblack@eecs.umich.edu 0x7: mftc2(); 10737639Sgblack@eecs.umich.edu } 10747639Sgblack@eecs.umich.edu } 10757639Sgblack@eecs.umich.edu 10767639Sgblack@eecs.umich.edu 0x1: decode ND { 10777639Sgblack@eecs.umich.edu 0x0: decode TF { 10787639Sgblack@eecs.umich.edu format WarnUnimpl { 10797639Sgblack@eecs.umich.edu 0x0: bc2f(); 10807639Sgblack@eecs.umich.edu 0x1: bc2t(); 10817639Sgblack@eecs.umich.edu } 10827639Sgblack@eecs.umich.edu } 10837639Sgblack@eecs.umich.edu 10847639Sgblack@eecs.umich.edu 0x1: decode TF { 10857639Sgblack@eecs.umich.edu format WarnUnimpl { 10867639Sgblack@eecs.umich.edu 0x0: bc2fl(); 10877639Sgblack@eecs.umich.edu 0x1: bc2tl(); 10887639Sgblack@eecs.umich.edu } 10897639Sgblack@eecs.umich.edu } 10907639Sgblack@eecs.umich.edu } 10917639Sgblack@eecs.umich.edu } 10927639Sgblack@eecs.umich.edu } 10937639Sgblack@eecs.umich.edu 10947639Sgblack@eecs.umich.edu //Table A-20 MIPS64 COP1X Encoding of Function Field 1 10957639Sgblack@eecs.umich.edu //Note: "COP1X instructions are legal only if 64-bit floating point 10967639Sgblack@eecs.umich.edu //operations are enabled." 10977640Sgblack@eecs.umich.edu 0x3: decode FUNCTION_HI { 10987639Sgblack@eecs.umich.edu 0x0: decode FUNCTION_LO { 10997639Sgblack@eecs.umich.edu format LoadFloatMemory { 11007639Sgblack@eecs.umich.edu 0x0: lwxc1({{ Ft.uw = Mem.uw;}}, {{ EA = Rs + Rt; }}); 11017639Sgblack@eecs.umich.edu 0x1: ldxc1({{ Ft.ud = Mem.ud;}}, {{ EA = Rs + Rt; }}); 11027639Sgblack@eecs.umich.edu 0x5: luxc1({{ Ft.uw = Mem.ud;}}, {{ EA = Rs + Rt; }}); 11037639Sgblack@eecs.umich.edu } 11047639Sgblack@eecs.umich.edu } 11057639Sgblack@eecs.umich.edu 11067639Sgblack@eecs.umich.edu 0x1: decode FUNCTION_LO { 11077639Sgblack@eecs.umich.edu format StoreFloatMemory { 11087639Sgblack@eecs.umich.edu 0x0: swxc1({{ Mem.uw = Ft.uw;}}, {{ EA = Rs + Rt; }}); 11097639Sgblack@eecs.umich.edu 0x1: sdxc1({{ Mem.ud = Ft.ud;}}, {{ EA = Rs + Rt; }}); 11107639Sgblack@eecs.umich.edu 0x5: suxc1({{ Mem.ud = Ft.ud;}}, {{ EA = Rs + Rt; }}); 11117639Sgblack@eecs.umich.edu } 11127639Sgblack@eecs.umich.edu 11137639Sgblack@eecs.umich.edu 0x7: WarnUnimpl::prefx(); 11147639Sgblack@eecs.umich.edu } 11157639Sgblack@eecs.umich.edu 11167639Sgblack@eecs.umich.edu format FloatOp { 11177639Sgblack@eecs.umich.edu 0x3: WarnUnimpl::alnv_ps(); 11187639Sgblack@eecs.umich.edu 11197639Sgblack@eecs.umich.edu format BasicOp { 11207639Sgblack@eecs.umich.edu 0x4: decode FUNCTION_LO { 11217639Sgblack@eecs.umich.edu 0x0: madd_s({{ Fd.sf = (Fs.sf * Ft.sf) + Fr.sf; }}); 11227639Sgblack@eecs.umich.edu 0x1: madd_d({{ Fd.df = (Fs.df * Ft.df) + Fr.df; }}); 11237639Sgblack@eecs.umich.edu 0x6: madd_ps({{ 11247639Sgblack@eecs.umich.edu Fd1.sf = (Fs1.df * Ft1.df) + Fr1.df; 11257639Sgblack@eecs.umich.edu Fd2.sf = (Fs2.df * Ft2.df) + Fr2.df; 11267639Sgblack@eecs.umich.edu }}); 11277639Sgblack@eecs.umich.edu } 11287639Sgblack@eecs.umich.edu 11297639Sgblack@eecs.umich.edu 0x5: decode FUNCTION_LO { 11307639Sgblack@eecs.umich.edu 0x0: msub_s({{ Fd.sf = (Fs.sf * Ft.sf) - Fr.sf; }}); 11317639Sgblack@eecs.umich.edu 0x1: msub_d({{ Fd.df = (Fs.df * Ft.df) - Fr.df; }}); 11327639Sgblack@eecs.umich.edu 0x6: msub_ps({{ 11337639Sgblack@eecs.umich.edu Fd1.sf = (Fs1.df * Ft1.df) - Fr1.df; 11347639Sgblack@eecs.umich.edu Fd2.sf = (Fs2.df * Ft2.df) - Fr2.df; 11357639Sgblack@eecs.umich.edu }}); 11367639Sgblack@eecs.umich.edu } 11377639Sgblack@eecs.umich.edu 11387639Sgblack@eecs.umich.edu 0x6: decode FUNCTION_LO { 11397639Sgblack@eecs.umich.edu 0x0: nmadd_s({{ Fd.sf = (-1 * Fs.sf * Ft.sf) - Fr.sf; }}); 11407640Sgblack@eecs.umich.edu 0x1: nmadd_d({{ Fd.df = (-1 * Fs.df * Ft.df) + Fr.df; }}); 11417639Sgblack@eecs.umich.edu 0x6: nmadd_ps({{ 11427639Sgblack@eecs.umich.edu Fd1.sf = -1 * ((Fs1.df * Ft1.df) + Fr1.df); 11437639Sgblack@eecs.umich.edu Fd2.sf = -1 * ((Fs2.df * Ft2.df) + Fr2.df); 11447639Sgblack@eecs.umich.edu }}); 11457639Sgblack@eecs.umich.edu } 11467639Sgblack@eecs.umich.edu 11477639Sgblack@eecs.umich.edu 0x7: decode FUNCTION_LO { 11487639Sgblack@eecs.umich.edu 0x0: nmsub_s({{ Fd.sf = (-1 * Fs.sf * Ft.sf) - Fr.sf; }}); 11497639Sgblack@eecs.umich.edu 0x1: nmsub_d({{ Fd.df = (-1 * Fs.df * Ft.df) - Fr.df; }}); 11507639Sgblack@eecs.umich.edu 0x6: nmsub_ps({{ 11517639Sgblack@eecs.umich.edu 0x6: msub_ps({{ 11527639Sgblack@eecs.umich.edu Fd1.sf = -1 * ((Fs1.df * Ft1.df) - Fr1.df); 11537639Sgblack@eecs.umich.edu Fd2.sf = -1 * ((Fs2.df * Ft2.df) - Fr2.df); 11547639Sgblack@eecs.umich.edu }}); 11557639Sgblack@eecs.umich.edu } 11567639Sgblack@eecs.umich.edu } 11577639Sgblack@eecs.umich.edu } 11587639Sgblack@eecs.umich.edu } 11597639Sgblack@eecs.umich.edu 11607639Sgblack@eecs.umich.edu format BranchLikely { 11617639Sgblack@eecs.umich.edu 0x4: beql({{ cond = (Rs.sw == 0); }}); 11627639Sgblack@eecs.umich.edu 0x5: bnel({{ cond = (Rs.sw != 0); }}); 11637639Sgblack@eecs.umich.edu 0x6: blezl({{ cond = (Rs.sw <= 0); }}); 11647639Sgblack@eecs.umich.edu 0x7: bgtzl({{ cond = (Rs.sw > 0); }}); 11657639Sgblack@eecs.umich.edu } 11667639Sgblack@eecs.umich.edu } 11677639Sgblack@eecs.umich.edu 11687639Sgblack@eecs.umich.edu 0x3: decode OPCODE_LO default FailUnimpl::reserved() { 11697639Sgblack@eecs.umich.edu 11707639Sgblack@eecs.umich.edu //Table A-5 MIPS32 SPECIAL2 Encoding of Function Field 11717639Sgblack@eecs.umich.edu 0x4: decode FUNCTION_HI { 11727639Sgblack@eecs.umich.edu 11737639Sgblack@eecs.umich.edu 0x0: decode FUNCTION_LO { 11747639Sgblack@eecs.umich.edu format IntOp { 11757639Sgblack@eecs.umich.edu 0x0: madd({{ 11767639Sgblack@eecs.umich.edu int64_t temp1 = xc->readMiscReg(Hi) << 32 | xc->readMiscReg(Lo) >> 32; 11777639Sgblack@eecs.umich.edu temp1 = temp1 + (Rs.sw * Rt.sw); 11787639Sgblack@eecs.umich.edu xc->setMiscReg(Hi,temp1<63:32>); 11797639Sgblack@eecs.umich.edu xc->setMiscReg(Lo,temp1<31:0>); 11807639Sgblack@eecs.umich.edu }}); 11817639Sgblack@eecs.umich.edu 11827640Sgblack@eecs.umich.edu 0x1: maddu({{ 11837639Sgblack@eecs.umich.edu int64_t temp1 = xc->readMiscReg(Hi) << 32 | xc->readMiscReg(Lo) >> 32; 11847639Sgblack@eecs.umich.edu temp1 = temp1 + (Rs.uw * Rt.uw); 11857639Sgblack@eecs.umich.edu xc->setMiscReg(Hi,temp1<63:32>); 11867639Sgblack@eecs.umich.edu xc->setMiscReg(Lo,temp1<31:0>); 11877639Sgblack@eecs.umich.edu }}); 11887639Sgblack@eecs.umich.edu 11897639Sgblack@eecs.umich.edu 0x2: mul({{ Rd.sw = Rs.sw * Rt.sw; }}); 11907639Sgblack@eecs.umich.edu 11917639Sgblack@eecs.umich.edu 0x4: msub({{ 11927639Sgblack@eecs.umich.edu int64_t temp1 = xc->readMiscReg(Hi) << 32 | xc->readMiscReg(Lo) >> 32; 11937639Sgblack@eecs.umich.edu temp1 = temp1 - (Rs.sw * Rt.sw); 11947639Sgblack@eecs.umich.edu xc->setMiscReg(Hi,temp1<63:32>); 11957639Sgblack@eecs.umich.edu xc->setMiscReg(Lo,temp1<31:0>); 11967639Sgblack@eecs.umich.edu }}); 11977639Sgblack@eecs.umich.edu 11987639Sgblack@eecs.umich.edu 0x5: msubu({{ 11997639Sgblack@eecs.umich.edu int64_t temp1 = xc->readMiscReg(Hi) << 32 | xc->readMiscReg(Lo) >> 32; 12007639Sgblack@eecs.umich.edu temp1 = temp1 - (Rs.uw * Rt.uw); 12017639Sgblack@eecs.umich.edu xc->setMiscReg(Hi,temp1<63:32>); 12027639Sgblack@eecs.umich.edu xc->setMiscReg(Lo,temp1<31:0>); 12037639Sgblack@eecs.umich.edu }}); 12047639Sgblack@eecs.umich.edu } 12057639Sgblack@eecs.umich.edu } 12067639Sgblack@eecs.umich.edu 12077639Sgblack@eecs.umich.edu 0x4: decode FUNCTION_LO { 12087639Sgblack@eecs.umich.edu format BasicOp { 12097639Sgblack@eecs.umich.edu 0x0: clz({{ 12107639Sgblack@eecs.umich.edu int cnt = 0; 12117639Sgblack@eecs.umich.edu uint32_t mask = 0x80000000; 12127639Sgblack@eecs.umich.edu for (int i=0; i < 32; i++) { 12137639Sgblack@eecs.umich.edu if( (Rs & mask) == 0) { 12147639Sgblack@eecs.umich.edu cnt++; 12157639Sgblack@eecs.umich.edu } else { 12167639Sgblack@eecs.umich.edu break; 12177639Sgblack@eecs.umich.edu } 12187639Sgblack@eecs.umich.edu } 12197639Sgblack@eecs.umich.edu Rd.uw = cnt; 12207639Sgblack@eecs.umich.edu }}); 12217639Sgblack@eecs.umich.edu 12227639Sgblack@eecs.umich.edu 0x1: clo({{ 12237640Sgblack@eecs.umich.edu int cnt = 0; 12247639Sgblack@eecs.umich.edu uint32_t mask = 0x80000000; 12257639Sgblack@eecs.umich.edu for (int i=0; i < 32; i++) { 12267639Sgblack@eecs.umich.edu if( (Rs & mask) != 0) { 12277639Sgblack@eecs.umich.edu cnt++; 12287639Sgblack@eecs.umich.edu } else { 12297639Sgblack@eecs.umich.edu break; 12307639Sgblack@eecs.umich.edu } 12317639Sgblack@eecs.umich.edu } 12327639Sgblack@eecs.umich.edu Rd.uw = cnt; 12337639Sgblack@eecs.umich.edu }}); 12347639Sgblack@eecs.umich.edu } 12357639Sgblack@eecs.umich.edu } 12367639Sgblack@eecs.umich.edu 12377639Sgblack@eecs.umich.edu 0x7: decode FUNCTION_LO { 12387639Sgblack@eecs.umich.edu 0x7: WarnUnimpl::sdbbp(); 12397639Sgblack@eecs.umich.edu } 12407639Sgblack@eecs.umich.edu } 12417639Sgblack@eecs.umich.edu 12427639Sgblack@eecs.umich.edu //Table A-6 MIPS32 SPECIAL3 Encoding of Function Field for Release 2 of the Architecture 12437639Sgblack@eecs.umich.edu 0x7: decode FUNCTION_HI { 12447639Sgblack@eecs.umich.edu 12457639Sgblack@eecs.umich.edu 0x0: decode FUNCTION_LO { 12467639Sgblack@eecs.umich.edu format FailUnimpl { 12477639Sgblack@eecs.umich.edu 0x1: ext(); 12487639Sgblack@eecs.umich.edu 0x4: ins(); 12497639Sgblack@eecs.umich.edu } 12507639Sgblack@eecs.umich.edu } 12517639Sgblack@eecs.umich.edu 12527639Sgblack@eecs.umich.edu 0x1: decode FUNCTION_LO { 12537639Sgblack@eecs.umich.edu format FailUnimpl { 12547639Sgblack@eecs.umich.edu 0x0: fork(); 12557639Sgblack@eecs.umich.edu 0x1: yield(); 12567639Sgblack@eecs.umich.edu } 12577639Sgblack@eecs.umich.edu } 12587640Sgblack@eecs.umich.edu 12597639Sgblack@eecs.umich.edu 12607639Sgblack@eecs.umich.edu //Table A-10 MIPS32 BSHFL Encoding of sa Field 12617639Sgblack@eecs.umich.edu 0x4: decode SA { 12627639Sgblack@eecs.umich.edu 12637639Sgblack@eecs.umich.edu 0x02: FailUnimpl::wsbh(); 12647639Sgblack@eecs.umich.edu 12657639Sgblack@eecs.umich.edu format BasicOp { 12667639Sgblack@eecs.umich.edu 0x10: seb({{ Rd.sw = Rt<7:0>}}); 12677639Sgblack@eecs.umich.edu 0x18: seh({{ Rd.sw = Rt<15:0>}}); 12687639Sgblack@eecs.umich.edu } 12697639Sgblack@eecs.umich.edu } 12707639Sgblack@eecs.umich.edu 12717639Sgblack@eecs.umich.edu 0x6: decode FUNCTION_LO { 12727639Sgblack@eecs.umich.edu 0x7: FailUnimpl::rdhwr();//{{ /*Rt = xc->hwRegs[RD];*/ }} 12737639Sgblack@eecs.umich.edu } 12747639Sgblack@eecs.umich.edu } 12757639Sgblack@eecs.umich.edu } 12767639Sgblack@eecs.umich.edu 12777639Sgblack@eecs.umich.edu 0x4: decode OPCODE_LO default FailUnimpl::reserved() { 12787639Sgblack@eecs.umich.edu format LoadMemory { 12797639Sgblack@eecs.umich.edu 0x0: lb({{ Rt.sw = Mem.sb; }}); 12807639Sgblack@eecs.umich.edu 0x1: lh({{ Rt.sw = Mem.sh; }}); 12817639Sgblack@eecs.umich.edu 12827639Sgblack@eecs.umich.edu 0x2: lwl({{ 12837639Sgblack@eecs.umich.edu uint32_t mem_word = Mem.uw; 12847639Sgblack@eecs.umich.edu uint32_t unalign_addr = Rs + disp; 12857639Sgblack@eecs.umich.edu uint32_t offset = unalign_addr & 0x00000003; 12867639Sgblack@eecs.umich.edu#if BYTE_ORDER == BIG_ENDIAN 12877639Sgblack@eecs.umich.edu switch(offset) 12887639Sgblack@eecs.umich.edu { 12897639Sgblack@eecs.umich.edu case 0: 12907639Sgblack@eecs.umich.edu Rt = mem_word; 12917639Sgblack@eecs.umich.edu break; 12927639Sgblack@eecs.umich.edu 12937639Sgblack@eecs.umich.edu case 1: 12947639Sgblack@eecs.umich.edu Rt &= 0x000F; 12957639Sgblack@eecs.umich.edu Rt |= (mem_word << 4); 12967639Sgblack@eecs.umich.edu break; 12977639Sgblack@eecs.umich.edu 12987639Sgblack@eecs.umich.edu case 2: 12997639Sgblack@eecs.umich.edu Rt &= 0x00FF; 13007639Sgblack@eecs.umich.edu Rt |= (mem_word << 8); 13017639Sgblack@eecs.umich.edu break; 13027639Sgblack@eecs.umich.edu 13037639Sgblack@eecs.umich.edu case 3: 13047639Sgblack@eecs.umich.edu Rt &= 0x0FFF; 13057639Sgblack@eecs.umich.edu Rt |= (mem_word << 12); 13067639Sgblack@eecs.umich.edu break; 13077639Sgblack@eecs.umich.edu 13087639Sgblack@eecs.umich.edu default: 13097639Sgblack@eecs.umich.edu panic("lwl: bad offset"); 13107639Sgblack@eecs.umich.edu } 13117639Sgblack@eecs.umich.edu#elif BYTE_ORDER == LITTLE_ENDIAN 13127639Sgblack@eecs.umich.edu switch(offset) 13137639Sgblack@eecs.umich.edu { 13147639Sgblack@eecs.umich.edu case 0: 13157639Sgblack@eecs.umich.edu Rt &= 0x0FFF; 13167639Sgblack@eecs.umich.edu Rt |= (mem_word << 12); 13177639Sgblack@eecs.umich.edu break; 13187639Sgblack@eecs.umich.edu 13197639Sgblack@eecs.umich.edu case 1: 13207639Sgblack@eecs.umich.edu Rt &= 0x00FF; 13217639Sgblack@eecs.umich.edu Rt |= (mem_word << 8); 13227640Sgblack@eecs.umich.edu break; 13237639Sgblack@eecs.umich.edu 13247639Sgblack@eecs.umich.edu case 2: 13257639Sgblack@eecs.umich.edu Rt &= 0x000F; 13267639Sgblack@eecs.umich.edu Rt |= (mem_word << 4); 13277639Sgblack@eecs.umich.edu break; 13287639Sgblack@eecs.umich.edu 13297639Sgblack@eecs.umich.edu case 3: 13307639Sgblack@eecs.umich.edu Rt = mem_word; 13317639Sgblack@eecs.umich.edu break; 13327639Sgblack@eecs.umich.edu 13337639Sgblack@eecs.umich.edu default: 13347639Sgblack@eecs.umich.edu panic("lwl: bad offset"); 13357639Sgblack@eecs.umich.edu } 13367639Sgblack@eecs.umich.edu#endif 13377639Sgblack@eecs.umich.edu }}, {{ EA = (Rs + disp) & ~3; }}); 13387639Sgblack@eecs.umich.edu 13397639Sgblack@eecs.umich.edu 0x3: lw({{ Rt.sw = Mem.sw; }}); 13407639Sgblack@eecs.umich.edu 0x4: lbu({{ Rt.uw = Mem.ub; }}); 13417639Sgblack@eecs.umich.edu 0x5: lhu({{ Rt.uw = Mem.uh; }}); 13427639Sgblack@eecs.umich.edu 0x6: lwr({{ 13437639Sgblack@eecs.umich.edu uint32_t mem_word = Mem.uw; 13447639Sgblack@eecs.umich.edu uint32_t unalign_addr = Rs + disp; 13457639Sgblack@eecs.umich.edu uint32_t offset = unalign_addr & 0x00000003; 13467639Sgblack@eecs.umich.edu 13477639Sgblack@eecs.umich.edu#if BYTE_ORDER == BIG_ENDIAN 13487639Sgblack@eecs.umich.edu switch(offset) 13497639Sgblack@eecs.umich.edu { 13507639Sgblack@eecs.umich.edu case 0: Rt &= 0xFFF0; Rt |= (mem_word >> 12); break; 13517639Sgblack@eecs.umich.edu case 1: Rt &= 0xFF00; Rt |= (mem_word >> 8); break; 13527639Sgblack@eecs.umich.edu case 2: Rt &= 0xF000; Rt |= (mem_word >> 4); break; 13537639Sgblack@eecs.umich.edu case 3: Rt = mem_word; break; 13547639Sgblack@eecs.umich.edu default: panic("lwr: bad offset"); 13557639Sgblack@eecs.umich.edu } 13567639Sgblack@eecs.umich.edu#elif BYTE_ORDER == LITTLE_ENDIAN 13577639Sgblack@eecs.umich.edu switch(offset) 13587639Sgblack@eecs.umich.edu { 13597639Sgblack@eecs.umich.edu case 0: Rt = mem_word; break; 13607639Sgblack@eecs.umich.edu case 1: Rt &= 0xF000; Rt |= (mem_word >> 4); break; 13617639Sgblack@eecs.umich.edu case 2: Rt &= 0xFF00; Rt |= (mem_word >> 8); break; 13627639Sgblack@eecs.umich.edu case 3: Rt &= 0xFFF0; Rt |= (mem_word >> 12); break; 13637639Sgblack@eecs.umich.edu default: panic("lwr: bad offset"); 13647639Sgblack@eecs.umich.edu } 13657640Sgblack@eecs.umich.edu#endif 13667639Sgblack@eecs.umich.edu }}, 13677639Sgblack@eecs.umich.edu {{ EA = (Rs + disp) & ~3; }}); 13687639Sgblack@eecs.umich.edu } 13697639Sgblack@eecs.umich.edu 13707639Sgblack@eecs.umich.edu 0x7: FailUnimpl::reserved(); 13717639Sgblack@eecs.umich.edu } 13727639Sgblack@eecs.umich.edu 13737639Sgblack@eecs.umich.edu 0x5: decode OPCODE_LO default FailUnimpl::reserved() { 13747639Sgblack@eecs.umich.edu format StoreMemory { 13757639Sgblack@eecs.umich.edu 0x0: sb({{ Mem.ub = Rt<7:0>; }}); 13767639Sgblack@eecs.umich.edu 0x1: sh({{ Mem.uh = Rt<15:0>; }}); 13777639Sgblack@eecs.umich.edu 0x2: swl({{ 13787639Sgblack@eecs.umich.edu uint32_t mem_word = 0; 13797639Sgblack@eecs.umich.edu uint32_t aligned_addr = (Rs + disp) & ~3; 13807639Sgblack@eecs.umich.edu uint32_t unalign_addr = Rs + disp; 13817639Sgblack@eecs.umich.edu uint32_t offset = unalign_addr & 0x00000003; 13827639Sgblack@eecs.umich.edu 13837639Sgblack@eecs.umich.edu DPRINTF(IEW,"Execute: aligned=0x%x unaligned=0x%x\n offset=0x%x", 13847639Sgblack@eecs.umich.edu aligned_addr,unalign_addr,offset); 13857639Sgblack@eecs.umich.edu 13867639Sgblack@eecs.umich.edu fault = xc->read(aligned_addr, (uint32_t&)mem_word, memAccessFlags); 13877639Sgblack@eecs.umich.edu 13887639Sgblack@eecs.umich.edu#if BYTE_ORDER == BIG_ENDIAN 13897639Sgblack@eecs.umich.edu switch(offset) 13907639Sgblack@eecs.umich.edu { 13917639Sgblack@eecs.umich.edu case 0: 13927639Sgblack@eecs.umich.edu Mem = Rt; 13937639Sgblack@eecs.umich.edu break; 13947639Sgblack@eecs.umich.edu 13957639Sgblack@eecs.umich.edu case 1: 13967639Sgblack@eecs.umich.edu mem_word &= 0xF000; 13977639Sgblack@eecs.umich.edu mem_word |= (Rt >> 4); 13987639Sgblack@eecs.umich.edu Mem = mem_word; 13997639Sgblack@eecs.umich.edu break; 14007639Sgblack@eecs.umich.edu 14017639Sgblack@eecs.umich.edu case 2: 14027639Sgblack@eecs.umich.edu mem_word &= 0xFF00; 14037639Sgblack@eecs.umich.edu mem_word |= (Rt >> 8); 14047639Sgblack@eecs.umich.edu Mem = mem_word; 14057639Sgblack@eecs.umich.edu break; 14067639Sgblack@eecs.umich.edu 14077639Sgblack@eecs.umich.edu case 3: 14087640Sgblack@eecs.umich.edu mem_word &= 0xFFF0; 14097639Sgblack@eecs.umich.edu mem_word |= (Rt >> 12); 14107639Sgblack@eecs.umich.edu Mem = mem_word; 14117639Sgblack@eecs.umich.edu break; 14127639Sgblack@eecs.umich.edu 14137639Sgblack@eecs.umich.edu default: 14147639Sgblack@eecs.umich.edu panic("swl: bad offset"); 14157639Sgblack@eecs.umich.edu } 14167639Sgblack@eecs.umich.edu#elif BYTE_ORDER == LITTLE_ENDIAN 14177639Sgblack@eecs.umich.edu switch(offset) 14187639Sgblack@eecs.umich.edu { 14197639Sgblack@eecs.umich.edu case 0: 14207639Sgblack@eecs.umich.edu mem_word &= 0xFFF0; 14217639Sgblack@eecs.umich.edu mem_word |= (Rt >> 12); 14227639Sgblack@eecs.umich.edu Mem = mem_word; 14237639Sgblack@eecs.umich.edu break; 14247639Sgblack@eecs.umich.edu 14257639Sgblack@eecs.umich.edu case 1: 14267639Sgblack@eecs.umich.edu mem_word &= 0xFF00; 14277639Sgblack@eecs.umich.edu mem_word |= (Rt >> 8); 14287639Sgblack@eecs.umich.edu Mem = mem_word; 14297639Sgblack@eecs.umich.edu break; 14307639Sgblack@eecs.umich.edu 14317639Sgblack@eecs.umich.edu case 2: 14327639Sgblack@eecs.umich.edu mem_word &= 0xF000; 14337639Sgblack@eecs.umich.edu mem_word |= (Rt >> 4); 14347639Sgblack@eecs.umich.edu Mem = mem_word; 14357639Sgblack@eecs.umich.edu break; 14367639Sgblack@eecs.umich.edu 14377639Sgblack@eecs.umich.edu case 3: 14387639Sgblack@eecs.umich.edu Mem = Rt; 14397639Sgblack@eecs.umich.edu break; 14407639Sgblack@eecs.umich.edu 14417639Sgblack@eecs.umich.edu default: 14427639Sgblack@eecs.umich.edu panic("swl: bad offset"); 14437639Sgblack@eecs.umich.edu } 14447639Sgblack@eecs.umich.edu#endif 14457640Sgblack@eecs.umich.edu }},{{ EA = (Rs + disp) & ~3; }},mem_flags = NO_ALIGN_FAULT); 14467639Sgblack@eecs.umich.edu 14477639Sgblack@eecs.umich.edu 0x3: sw({{ Mem.uw = Rt<31:0>; }}); 14487639Sgblack@eecs.umich.edu 14497639Sgblack@eecs.umich.edu 0x6: swr({{ 14507639Sgblack@eecs.umich.edu uint32_t mem_word = 0; 14517639Sgblack@eecs.umich.edu uint32_t aligned_addr = (Rs + disp) & ~3; 14527639Sgblack@eecs.umich.edu uint32_t unalign_addr = Rs + disp; 14537639Sgblack@eecs.umich.edu uint32_t offset = unalign_addr & 0x00000003; 14547639Sgblack@eecs.umich.edu 14557639Sgblack@eecs.umich.edu fault = xc->read(aligned_addr, (uint32_t&)mem_word, memAccessFlags); 14567639Sgblack@eecs.umich.edu 14577639Sgblack@eecs.umich.edu#if BYTE_ORDER == BIG_ENDIAN 14587639Sgblack@eecs.umich.edu switch(offset) 14597639Sgblack@eecs.umich.edu { 14607639Sgblack@eecs.umich.edu case 0: 14617639Sgblack@eecs.umich.edu mem_word &= 0x0FFF; 14627639Sgblack@eecs.umich.edu mem_word |= (Rt << 12); 14637639Sgblack@eecs.umich.edu Mem = mem_word; 14647639Sgblack@eecs.umich.edu break; 14657639Sgblack@eecs.umich.edu 14667639Sgblack@eecs.umich.edu case 1: 14677639Sgblack@eecs.umich.edu mem_word &= 0x00FF; 14687639Sgblack@eecs.umich.edu mem_word |= (Rt << 8); 14697639Sgblack@eecs.umich.edu Mem = mem_word; 14707639Sgblack@eecs.umich.edu break; 14717639Sgblack@eecs.umich.edu 14727639Sgblack@eecs.umich.edu case 2: 14737639Sgblack@eecs.umich.edu mem_word &= 0x000F; 14747639Sgblack@eecs.umich.edu mem_word |= (Rt << 4); 14757639Sgblack@eecs.umich.edu Mem = mem_word; 14767639Sgblack@eecs.umich.edu break; 14777639Sgblack@eecs.umich.edu 14787639Sgblack@eecs.umich.edu case 3: 14797639Sgblack@eecs.umich.edu Mem = Rt; 14807639Sgblack@eecs.umich.edu break; 14817639Sgblack@eecs.umich.edu 14827639Sgblack@eecs.umich.edu default: 14837639Sgblack@eecs.umich.edu panic("swr: bad offset"); 14847639Sgblack@eecs.umich.edu } 14857639Sgblack@eecs.umich.edu#elif BYTE_ORDER == LITTLE_ENDIAN 14867639Sgblack@eecs.umich.edu switch(offset) 14877639Sgblack@eecs.umich.edu { 14887639Sgblack@eecs.umich.edu case 0: 14897639Sgblack@eecs.umich.edu Mem = Rt; 14907639Sgblack@eecs.umich.edu break; 14917639Sgblack@eecs.umich.edu 14927639Sgblack@eecs.umich.edu case 1: 14937639Sgblack@eecs.umich.edu mem_word &= 0x000F; 14947639Sgblack@eecs.umich.edu mem_word |= (Rt << 4); 14957639Sgblack@eecs.umich.edu Mem = mem_word; 14967639Sgblack@eecs.umich.edu break; 14977639Sgblack@eecs.umich.edu 14987639Sgblack@eecs.umich.edu case 2: 14997639Sgblack@eecs.umich.edu mem_word &= 0x00FF; 15007639Sgblack@eecs.umich.edu mem_word |= (Rt << 8); 15017639Sgblack@eecs.umich.edu Mem = mem_word; 15027639Sgblack@eecs.umich.edu break; 15037639Sgblack@eecs.umich.edu 15047639Sgblack@eecs.umich.edu case 3: 15057639Sgblack@eecs.umich.edu mem_word &= 0x0FFF; 15067639Sgblack@eecs.umich.edu mem_word |= (Rt << 12); 15077639Sgblack@eecs.umich.edu Mem = mem_word; 15087639Sgblack@eecs.umich.edu break; 15097639Sgblack@eecs.umich.edu 15107639Sgblack@eecs.umich.edu default: 15117639Sgblack@eecs.umich.edu panic("swr: bad offset"); 15127639Sgblack@eecs.umich.edu } 15137639Sgblack@eecs.umich.edu#endif 15147639Sgblack@eecs.umich.edu }},{{ EA = (Rs + disp) & ~3;}},mem_flags = NO_ALIGN_FAULT); 15157639Sgblack@eecs.umich.edu } 15167639Sgblack@eecs.umich.edu 15177639Sgblack@eecs.umich.edu format WarnUnimpl { 15187639Sgblack@eecs.umich.edu 0x7: cache(); 15197639Sgblack@eecs.umich.edu } 15207639Sgblack@eecs.umich.edu 15217639Sgblack@eecs.umich.edu } 15227639Sgblack@eecs.umich.edu 15237639Sgblack@eecs.umich.edu 0x6: decode OPCODE_LO default FailUnimpl::reserved() { 15247639Sgblack@eecs.umich.edu 0x0: LoadMemory::ll({{Rt.uw = Mem.uw}},mem_flags=LOCKED); 15257639Sgblack@eecs.umich.edu 15267639Sgblack@eecs.umich.edu format LoadFloatMemory { 15277639Sgblack@eecs.umich.edu 0x1: lwc1({{ Ft.uw = Mem.uw; }}); 15287639Sgblack@eecs.umich.edu 0x5: ldc1({{ Ft.ud = Mem.ud; }}); 15297639Sgblack@eecs.umich.edu } 15307639Sgblack@eecs.umich.edu } 15317639Sgblack@eecs.umich.edu 15327639Sgblack@eecs.umich.edu 15337639Sgblack@eecs.umich.edu 0x7: decode OPCODE_LO default FailUnimpl::reserved() { 15347639Sgblack@eecs.umich.edu 0x0: StoreMemory::sc({{ Mem.uw = Rt.uw; Rt.uw = 1; }}); 15357639Sgblack@eecs.umich.edu 15367639Sgblack@eecs.umich.edu format StoreFloatMemory { 15377639Sgblack@eecs.umich.edu 0x1: swc1({{ Mem.uw = Ft.uw; }}); 15387639Sgblack@eecs.umich.edu 0x5: sdc1({{ Mem.ud = Ft.ud; }}); 15397639Sgblack@eecs.umich.edu } 15407639Sgblack@eecs.umich.edu } 15417639Sgblack@eecs.umich.edu} 15427639Sgblack@eecs.umich.edu 15437639Sgblack@eecs.umich.edu 15447639Sgblack@eecs.umich.edu