decoder.isa revision 2573
17639Sgblack@eecs.umich.edu// -*- mode:c++ -*- 27639Sgblack@eecs.umich.edu 310829Sandreas.hansson@arm.com//////////////////////////////////////////////////////////////////// 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 (xc->readMiscReg(FPCR) != CC) Rd = Rs}}); 247639Sgblack@eecs.umich.edu 1: movt({{ if (xc->readMiscReg(FPCR) == CC) 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 } 9710037SARM gem5 Developers 9810037SARM gem5 Developers 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 } 11510037SARM gem5 Developers 11610037SARM gem5 Developers 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); }}); 13210037SARM gem5 Developers 0x2: mflo({{ Rd = xc->readMiscReg(Lo); }}); 13310037SARM gem5 Developers 0x3: mtlo({{ xc->setMiscReg(Lo,Rs); }}); 13410037SARM gem5 Developers } 13510037SARM gem5 Developers } 13610037SARM gem5 Developers 13710037SARM gem5 Developers 0x3: decode FUNCTION_LO { 13810037SARM gem5 Developers format IntOp { 13910037SARM gem5 Developers 0x0: mult({{ 14010037SARM gem5 Developers int64_t temp1 = Rs.sd * Rt.sd; 14110037SARM gem5 Developers xc->setMiscReg(Hi,temp1<63:32>); 14210037SARM gem5 Developers xc->setMiscReg(Lo,temp1<31:0>); 14310037SARM gem5 Developers }}); 14410037SARM gem5 Developers 14510037SARM gem5 Developers 0x1: multu({{ 14610037SARM gem5 Developers uint64_t temp1 = Rs.ud * Rt.ud; 14710037SARM gem5 Developers xc->setMiscReg(Hi,temp1<63:32>); 14810037SARM gem5 Developers xc->setMiscReg(Lo,temp1<31:0>); 14910037SARM gem5 Developers }}); 15010037SARM gem5 Developers 15110037SARM gem5 Developers 0x2: div({{ 15210037SARM gem5 Developers xc->setMiscReg(Hi,Rs.sw % Rt.sw); 15310037SARM gem5 Developers xc->setMiscReg(Lo,Rs.sw / Rt.sw); 15410037SARM gem5 Developers }}); 15510037SARM gem5 Developers 15610037SARM gem5 Developers 0x3: divu({{ 15710037SARM gem5 Developers xc->setMiscReg(Hi,Rs.uw % Rt.uw); 15810037SARM gem5 Developers xc->setMiscReg(Lo,Rs.uw / Rt.uw); 15910037SARM gem5 Developers }}); 16010037SARM gem5 Developers } 16110037SARM gem5 Developers } 16210037SARM gem5 Developers 16310037SARM gem5 Developers 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 //MIPS obsolete instructions 2087639Sgblack@eecs.umich.edu 0x2: bltzl({{ cond = (Rs.sw < 0); }}); 2097639Sgblack@eecs.umich.edu 0x3: bgezl({{ cond = (Rs.sw >= 0); }}); 2107639Sgblack@eecs.umich.edu } 2117639Sgblack@eecs.umich.edu } 21210037SARM gem5 Developers 21310037SARM gem5 Developers 0x1: decode REGIMM_LO { 21410037SARM gem5 Developers format Trap { 21510037SARM gem5 Developers 0x0: tgei( {{ cond = (Rs.sw >= INTIMM); }}); 21610037SARM gem5 Developers 0x1: tgeiu({{ cond = (Rs.uw >= INTIMM); }}); 21710037SARM gem5 Developers 0x2: tlti( {{ cond = (Rs.sw < INTIMM); }}); 21810037SARM gem5 Developers 0x3: tltiu({{ cond = (Rs.uw < INTIMM); }}); 21910037SARM gem5 Developers 0x4: teqi( {{ cond = (Rs.sw == INTIMM);}}); 22010037SARM gem5 Developers 0x6: tnei( {{ cond = (Rs.sw != INTIMM);}}); 22110037SARM gem5 Developers } 22210037SARM gem5 Developers } 22310037SARM gem5 Developers 22410037SARM gem5 Developers 0x2: decode REGIMM_LO { 22510037SARM gem5 Developers format Branch { 22610037SARM gem5 Developers 0x0: bltzal({{ cond = (Rs.sw < 0); }}, IsCall,IsReturn); 22710037SARM gem5 Developers 0x1: bgezal({{ cond = (Rs.sw >= 0); }}, IsCall,IsReturn); 22810037SARM gem5 Developers } 22910037SARM gem5 Developers 23010037SARM gem5 Developers format BranchLikely { 23110037SARM gem5 Developers //Will be removed in future MIPS releases 23210037SARM gem5 Developers 0x2: bltzall({{ cond = (Rs.sw < 0); }}, IsCall, IsReturn); 23310037SARM gem5 Developers 0x3: bgezall({{ cond = (Rs.sw >= 0); }}, IsCall, IsReturn); 23410037SARM gem5 Developers } 23510037SARM gem5 Developers } 23610037SARM gem5 Developers 23710037SARM gem5 Developers 0x3: decode REGIMM_LO { 23810037SARM gem5 Developers format WarnUnimpl { 23910037SARM gem5 Developers 0x7: synci(); 24010037SARM gem5 Developers } 24110037SARM gem5 Developers } 24210037SARM gem5 Developers } 24310037SARM gem5 Developers 2447639Sgblack@eecs.umich.edu format Jump { 2457639Sgblack@eecs.umich.edu 0x2: j({{ NNPC = (NPC & 0xF0000000) | (JMPTARG << 2);}}); 2467639Sgblack@eecs.umich.edu 2477639Sgblack@eecs.umich.edu 0x3: jal({{ NNPC = (NPC & 0xF0000000) | (JMPTARG << 2); }},IsCall,IsReturn); 2487639Sgblack@eecs.umich.edu } 2497639Sgblack@eecs.umich.edu 2507639Sgblack@eecs.umich.edu format Branch { 2517639Sgblack@eecs.umich.edu 0x4: beq({{ cond = (Rs.sw == Rt.sw); }}); 2527639Sgblack@eecs.umich.edu 0x5: bne({{ cond = (Rs.sw != Rt.sw); }}); 2537639Sgblack@eecs.umich.edu 0x6: decode RT { 2547639Sgblack@eecs.umich.edu 0x0: blez({{ cond = (Rs.sw <= 0); }}); 2557639Sgblack@eecs.umich.edu } 2567639Sgblack@eecs.umich.edu 2577639Sgblack@eecs.umich.edu 0x7: decode RT { 2587639Sgblack@eecs.umich.edu 0x0: bgtz({{ cond = (Rs.sw > 0); }}); 2597639Sgblack@eecs.umich.edu } 2607639Sgblack@eecs.umich.edu } 2617639Sgblack@eecs.umich.edu } 2627639Sgblack@eecs.umich.edu 2637639Sgblack@eecs.umich.edu 0x1: decode OPCODE_LO { 2647639Sgblack@eecs.umich.edu format IntOp { 2657639Sgblack@eecs.umich.edu 0x0: addi({{ Rt.sw = Rs.sw + imm; /*Trap If Overflow*/}}); 2667639Sgblack@eecs.umich.edu 0x1: addiu({{ Rt.sw = Rs.sw + imm;}}); 2677639Sgblack@eecs.umich.edu 0x2: slti({{ Rt.sw = ( Rs.sw < imm) ? 1 : 0 }}); 2687639Sgblack@eecs.umich.edu 0x3: sltiu({{ Rt.uw = ( Rs.uw < (uint32_t)sextImm ) ? 1 : 0 }}); 2697639Sgblack@eecs.umich.edu 0x4: andi({{ Rt.sw = Rs.sw & zextImm;}}); 2707639Sgblack@eecs.umich.edu 0x5: ori({{ Rt.sw = Rs.sw | zextImm;}}); 2717639Sgblack@eecs.umich.edu 0x6: xori({{ Rt.sw = Rs.sw ^ zextImm;}}); 2727639Sgblack@eecs.umich.edu 2737639Sgblack@eecs.umich.edu 0x7: decode RS { 2747639Sgblack@eecs.umich.edu 0x0: lui({{ Rt = imm << 16}}); 2757639Sgblack@eecs.umich.edu } 2767639Sgblack@eecs.umich.edu } 2777639Sgblack@eecs.umich.edu } 2787639Sgblack@eecs.umich.edu 2797639Sgblack@eecs.umich.edu 0x2: decode OPCODE_LO { 2807639Sgblack@eecs.umich.edu 2817639Sgblack@eecs.umich.edu //Table A-11 MIPS32 COP0 Encoding of rs Field 2827639Sgblack@eecs.umich.edu 0x0: decode RS_MSB { 2837639Sgblack@eecs.umich.edu 0x0: decode RS { 2847639Sgblack@eecs.umich.edu format System { 2857639Sgblack@eecs.umich.edu 0x0: mfc0({{ 2867639Sgblack@eecs.umich.edu //uint64_t reg_num = Rd.uw; 2877639Sgblack@eecs.umich.edu 2887639Sgblack@eecs.umich.edu Rt = xc->readMiscReg(RD << 5 | SEL); 2897639Sgblack@eecs.umich.edu }}); 2907639Sgblack@eecs.umich.edu 2917639Sgblack@eecs.umich.edu 0x4: mtc0({{ 2927639Sgblack@eecs.umich.edu //uint64_t reg_num = Rd.uw; 2937639Sgblack@eecs.umich.edu 2947639Sgblack@eecs.umich.edu xc->setMiscReg(RD << 5 | SEL,Rt); 2957639Sgblack@eecs.umich.edu }}); 2967639Sgblack@eecs.umich.edu 2977639Sgblack@eecs.umich.edu 0x8: mftr({{ 2987639Sgblack@eecs.umich.edu //The contents of the coprocessor 0 register specified by the 2997639Sgblack@eecs.umich.edu //combination of rd and sel are loaded into general register 3007639Sgblack@eecs.umich.edu //rt. Note that not all coprocessor 0 registers support the 3017639Sgblack@eecs.umich.edu //sel field. In those instances, the sel field must be zero. 3027639Sgblack@eecs.umich.edu 3037639Sgblack@eecs.umich.edu //MT Code Needed Here 3047639Sgblack@eecs.umich.edu }}); 3057639Sgblack@eecs.umich.edu 3067639Sgblack@eecs.umich.edu 0xC: mttr({{ 3077639Sgblack@eecs.umich.edu //The contents of the coprocessor 0 register specified by the 30810037SARM gem5 Developers //combination of rd and sel are loaded into general register 30910037SARM gem5 Developers //rt. Note that not all coprocessor 0 registers support the 31010037SARM gem5 Developers //sel field. In those instances, the sel field must be zero. 31110037SARM gem5 Developers 31210037SARM gem5 Developers //MT Code Needed Here 31310037SARM gem5 Developers }}); 31410037SARM gem5 Developers 31510037SARM gem5 Developers 31610037SARM gem5 Developers 0xA: rdpgpr({{ 31710037SARM gem5 Developers //Accessing Previous Shadow Set Register Number 31810037SARM gem5 Developers //uint64_t prev = xc->readMiscReg(SRSCtl)/*[PSS]*/; 31910037SARM gem5 Developers //uint64_t reg_num = Rt.uw; 32010037SARM gem5 Developers 32110037SARM gem5 Developers //Rd = xc->regs.IntRegFile[prev]; 32210037SARM gem5 Developers //Rd = xc->shadowIntRegFile[prev][reg_num]; 32310037SARM gem5 Developers }}); 32410037SARM gem5 Developers 32510037SARM gem5 Developers 0xB: decode RD { 32610037SARM gem5 Developers 32710037SARM gem5 Developers 0x0: decode SC { 32810037SARM gem5 Developers 0x0: dvpe({{ 32910037SARM gem5 Developers Rt.sw = xc->readMiscReg(MVPControl); 33010037SARM gem5 Developers xc->setMiscReg(MVPControl,0); 33110037SARM gem5 Developers }}); 33210037SARM gem5 Developers 33310037SARM gem5 Developers 0x1: evpe({{ 33410037SARM gem5 Developers Rt.sw = xc->readMiscReg(MVPControl); 33510037SARM gem5 Developers xc->setMiscReg(MVPControl,1); 33610037SARM gem5 Developers }}); 33710037SARM gem5 Developers } 33810037SARM gem5 Developers 33910037SARM gem5 Developers 0x1: decode SC { 34010037SARM gem5 Developers 0x0: dmt({{ 34110037SARM gem5 Developers Rt.sw = xc->readMiscReg(VPEControl); 34210037SARM gem5 Developers xc->setMiscReg(VPEControl,0); 34310037SARM gem5 Developers }}); 34410037SARM gem5 Developers 34510037SARM gem5 Developers 0x1: emt({{ 34610037SARM gem5 Developers Rt.sw = xc->readMiscReg(VPEControl); 34710037SARM gem5 Developers xc->setMiscReg(VPEControl,1); 34810037SARM gem5 Developers }}); 34910037SARM gem5 Developers } 35010037SARM gem5 Developers 35110037SARM gem5 Developers 0xC: decode SC { 35210037SARM gem5 Developers 0x0: di({{ 35310037SARM gem5 Developers Rt.sw = xc->readMiscReg(Status); 35410037SARM gem5 Developers xc->setMiscReg(Status,0); 35510037SARM gem5 Developers }}); 35610037SARM gem5 Developers 35710037SARM gem5 Developers 0x1: ei({{ 35810037SARM gem5 Developers Rt.sw = xc->readMiscReg(Status); 35910037SARM gem5 Developers xc->setMiscReg(Status,1); 36010037SARM gem5 Developers }}); 36110037SARM gem5 Developers } 36210037SARM gem5 Developers } 36310037SARM gem5 Developers 36410037SARM gem5 Developers 0xE: wrpgpr({{ 36510037SARM gem5 Developers //Accessing Previous Shadow Set Register Number 36610037SARM gem5 Developers //uint64_t prev = xc->readMiscReg(SRSCtl/*[PSS]*/); 36710037SARM gem5 Developers //uint64_t reg_num = Rd.uw; 36810037SARM gem5 Developers 36910037SARM gem5 Developers //xc->regs.IntRegFile[prev]; 37010037SARM gem5 Developers //xc->shadowIntRegFile[prev][reg_num] = Rt; 37110037SARM gem5 Developers }}); 37210037SARM gem5 Developers } 37310037SARM gem5 Developers } 37410037SARM gem5 Developers 37510037SARM gem5 Developers //Table A-12 MIPS32 COP0 Encoding of Function Field When rs=CO 37610037SARM gem5 Developers 0x1: decode FUNCTION { 37710037SARM gem5 Developers format System { 37810037SARM gem5 Developers 0x01: tlbr({{ }}); 37910037SARM gem5 Developers 0x02: tlbwi({{ }}); 38010037SARM gem5 Developers 0x06: tlbwr({{ }}); 38110037SARM gem5 Developers 0x08: tlbp({{ }}); 38210037SARM gem5 Developers } 38310037SARM gem5 Developers 38410037SARM gem5 Developers format WarnUnimpl { 38510037SARM gem5 Developers 0x18: eret(); 38610037SARM gem5 Developers 0x1F: deret(); 38710037SARM gem5 Developers 0x20: wait(); 38810037SARM gem5 Developers } 38910037SARM gem5 Developers } 39010037SARM gem5 Developers } 39110037SARM gem5 Developers 39210037SARM gem5 Developers //Table A-13 MIPS32 COP1 Encoding of rs Field 39310037SARM gem5 Developers 0x1: decode RS_MSB { 39410037SARM gem5 Developers 39510037SARM gem5 Developers 0x0: decode RS_HI { 39610037SARM gem5 Developers 0x0: decode RS_LO { 39710037SARM gem5 Developers format FloatOp { 39810037SARM gem5 Developers 0x0: mfc1 ({{ Rt.uw = Fs.uw<31:0>; }}); 39910037SARM gem5 Developers 0x3: mfhc1({{ Rt.uw = Fs.ud<63:32>;}}); 40010037SARM gem5 Developers 0x4: mtc1 ({{ Fs.uw = Rt.uw; }}); 40110037SARM gem5 Developers 0x7: mthc1({{ 40210037SARM gem5 Developers uint64_t fs_hi = Rt.ud << 32; 40310037SARM gem5 Developers uint64_t fs_lo = Fs.ud & 0x0000FFFF; 40410037SARM gem5 Developers Fs.ud = fs_hi & fs_lo; 40510037SARM gem5 Developers }}); 40610037SARM gem5 Developers } 40710037SARM gem5 Developers 40810037SARM gem5 Developers format System { 40910037SARM gem5 Developers 0x2: cfc1({{ 41010037SARM gem5 Developers std::cout << "FP Control Reg " << FS << "accessed." << std::endl; 41110037SARM gem5 Developers uint32_t fcsr_reg = xc->readMiscReg(FCSR); 41210037SARM gem5 Developers 41310037SARM gem5 Developers switch (FS) 41410037SARM gem5 Developers { 41510037SARM gem5 Developers case 0: 41610037SARM gem5 Developers Rt = xc->readMiscReg(FIR); 41710037SARM gem5 Developers break; 41810037SARM gem5 Developers case 25: 41910037SARM gem5 Developers Rt = 0 | (fcsr_reg & 0xFE000000) >> 24 | (fcsr_reg & 0x00800000) >> 23; 42010037SARM gem5 Developers break; 42110037SARM gem5 Developers case 26: 42210037SARM gem5 Developers Rt = 0 | (fcsr_reg & 0x0003F07C); 42310037SARM gem5 Developers break; 42410037SARM gem5 Developers case 28: 42510037SARM gem5 Developers Rt = 0 | (fcsr_reg); 4267639Sgblack@eecs.umich.edu break; 4277639Sgblack@eecs.umich.edu case 31: 4287639Sgblack@eecs.umich.edu Rt = fcsr_reg; 4297639Sgblack@eecs.umich.edu break; 4307639Sgblack@eecs.umich.edu default: 4317639Sgblack@eecs.umich.edu panic("FP Control Value (%d) Not Available. Ignoring Access to" 4327639Sgblack@eecs.umich.edu "Floating Control Status Register",fcsr_reg); 4337639Sgblack@eecs.umich.edu } 4347639Sgblack@eecs.umich.edu }}); 4357639Sgblack@eecs.umich.edu 4367639Sgblack@eecs.umich.edu 0x6: ctc1({{ 4377639Sgblack@eecs.umich.edu std::cout << "FP Control Reg " << FS << "accessed." << std::endl; 4387639Sgblack@eecs.umich.edu 4397639Sgblack@eecs.umich.edu uint32_t fcsr_reg = xc->readMiscReg(FCSR); 4407639Sgblack@eecs.umich.edu uint32_t temp; 4417639Sgblack@eecs.umich.edu switch (FS) 4427639Sgblack@eecs.umich.edu { 4437639Sgblack@eecs.umich.edu case 25: 4447639Sgblack@eecs.umich.edu temp = 0 | (Rt.uw<7:1> << 25) // move 31...25 4457639Sgblack@eecs.umich.edu | (fcsr_reg & 0x01000000) // bit 24 4467639Sgblack@eecs.umich.edu | (fcsr_reg & 0x004FFFFF);// bit 22...0 4477639Sgblack@eecs.umich.edu break; 4487639Sgblack@eecs.umich.edu 4497639Sgblack@eecs.umich.edu case 26: 4507639Sgblack@eecs.umich.edu temp = 0 | (fcsr_reg & 0xFFFC0000) // move 31...18 4517639Sgblack@eecs.umich.edu | Rt.uw<17:12> << 12 // bit 17...12 4527639Sgblack@eecs.umich.edu | (fcsr_reg & 0x00000F80) << 7// bit 11...7 4537639Sgblack@eecs.umich.edu | Rt.uw<6:2> << 2 // bit 6...2 4547639Sgblack@eecs.umich.edu | (fcsr_reg & 0x00000002); // bit 1...0 4557639Sgblack@eecs.umich.edu break; 4567639Sgblack@eecs.umich.edu 4577639Sgblack@eecs.umich.edu case 28: 4587639Sgblack@eecs.umich.edu temp = 0 | (fcsr_reg & 0xFE000000) // move 31...25 4597639Sgblack@eecs.umich.edu | Rt.uw<2:2> << 24 // bit 24 4607639Sgblack@eecs.umich.edu | (fcsr_reg & 0x00FFF000) << 23// bit 23...12 4617639Sgblack@eecs.umich.edu | Rt.uw<11:7> << 7 // bit 24 4627639Sgblack@eecs.umich.edu | (fcsr_reg & 0x000007E) 4637639Sgblack@eecs.umich.edu | Rt.uw<1:0>;// bit 22...0 4647639Sgblack@eecs.umich.edu break; 4657639Sgblack@eecs.umich.edu 4667639Sgblack@eecs.umich.edu case 31: 4677639Sgblack@eecs.umich.edu temp = Rt.uw; 4687639Sgblack@eecs.umich.edu break; 4697639Sgblack@eecs.umich.edu 4707639Sgblack@eecs.umich.edu default: 4717639Sgblack@eecs.umich.edu panic("FP Control Value (%d) Not Available. Ignoring Access to" 4727639Sgblack@eecs.umich.edu "Floating Control Status Register",fcsr_reg); 4737639Sgblack@eecs.umich.edu } 4747639Sgblack@eecs.umich.edu 4757639Sgblack@eecs.umich.edu xc->setMiscReg(FCSR,temp); 4767639Sgblack@eecs.umich.edu }}); 4777639Sgblack@eecs.umich.edu } 4787639Sgblack@eecs.umich.edu } 4797639Sgblack@eecs.umich.edu 4807639Sgblack@eecs.umich.edu 0x1: decode ND { 4817639Sgblack@eecs.umich.edu 0x0: decode TF { 4827639Sgblack@eecs.umich.edu format Branch { 4837639Sgblack@eecs.umich.edu 0x0: bc1f({{ cond = (xc->readMiscReg(FPCR) == 0); }}); 4847639Sgblack@eecs.umich.edu 0x1: bc1t({{ cond = (xc->readMiscReg(FPCR) == 1); }}); 4857639Sgblack@eecs.umich.edu } 4867639Sgblack@eecs.umich.edu } 4877639Sgblack@eecs.umich.edu 4887639Sgblack@eecs.umich.edu 0x1: decode TF { 4897639Sgblack@eecs.umich.edu format BranchLikely { 4907639Sgblack@eecs.umich.edu 0x0: bc1fl({{ cond = (xc->readMiscReg(FPCR) == 0); }}); 4917639Sgblack@eecs.umich.edu 0x1: bc1tl({{ cond = (xc->readMiscReg(FPCR) == 1); }}); 4927639Sgblack@eecs.umich.edu } 4937639Sgblack@eecs.umich.edu } 4947639Sgblack@eecs.umich.edu } 4957639Sgblack@eecs.umich.edu } 4967639Sgblack@eecs.umich.edu 4977639Sgblack@eecs.umich.edu 0x1: decode RS_HI { 4987639Sgblack@eecs.umich.edu 0x2: decode RS_LO { 4997639Sgblack@eecs.umich.edu 5007639Sgblack@eecs.umich.edu //Table A-14 MIPS32 COP1 Encoding of Function Field When rs=S 5017639Sgblack@eecs.umich.edu //(( single-word )) 5027639Sgblack@eecs.umich.edu 0x0: decode FUNCTION_HI { 5037639Sgblack@eecs.umich.edu 0x0: decode FUNCTION_LO { 5047639Sgblack@eecs.umich.edu format FloatOp { 5057639Sgblack@eecs.umich.edu 0x0: adds({{ Fd.sf = Fs.sf + Ft.sf;}}); 5067639Sgblack@eecs.umich.edu 0x1: subs({{ Fd.sf = Fs.sf - Ft.sf;}}); 5077639Sgblack@eecs.umich.edu 0x2: muls({{ Fd.sf = Fs.sf * Ft.sf;}}); 5087639Sgblack@eecs.umich.edu 0x3: divs({{ Fd.sf = Fs.sf / Ft.sf;}}); 5097639Sgblack@eecs.umich.edu 0x4: sqrts({{ Fd.sf = sqrt(Fs.sf);}}); 5107639Sgblack@eecs.umich.edu 0x5: abss({{ Fd.sf = fabs(Fs.sf);}}); 5117639Sgblack@eecs.umich.edu 0x6: movs({{ Fd.sf = Fs.sf;}}); 5127639Sgblack@eecs.umich.edu 0x7: negs({{ Fd.sf = -1 * Fs.sf;}}); 5137639Sgblack@eecs.umich.edu } 5147639Sgblack@eecs.umich.edu } 5157639Sgblack@eecs.umich.edu 5167639Sgblack@eecs.umich.edu 0x1: decode FUNCTION_LO { 5177639Sgblack@eecs.umich.edu //only legal for 64 bit-FP 5187639Sgblack@eecs.umich.edu format Float64Op { 5197639Sgblack@eecs.umich.edu 0x0: round_l_s({{ Fd = convert_and_round(Fs.sf,RND_NEAREST,FP_LONG,FP_SINGLE);}}); 5207639Sgblack@eecs.umich.edu 0x1: trunc_l_s({{ Fd = convert_and_round(Fs.sf,RND_ZERO,FP_LONG,FP_SINGLE);}}); 5217639Sgblack@eecs.umich.edu 0x2: ceil_l_s({{ Fd = convert_and_round(Fs.sf,RND_UP,FP_LONG,FP_SINGLE);}}); 5227639Sgblack@eecs.umich.edu 0x3: floor_l_s({{ Fd = convert_and_round(Fs.sf,RND_DOWN,FP_LONG,FP_SINGLE);}}); 5237639Sgblack@eecs.umich.edu } 5247639Sgblack@eecs.umich.edu 5257639Sgblack@eecs.umich.edu format FloatOp { 5267639Sgblack@eecs.umich.edu 0x4: round_w_s({{ Fd = convert_and_round(Fs.sf,RND_NEAREST,FP_WORD,FP_SINGLE);}}); 5277639Sgblack@eecs.umich.edu 0x5: trunc_w_s({{ Fd = convert_and_round(Fs.sf,RND_ZERO,FP_WORD,FP_SINGLE);}}); 5287639Sgblack@eecs.umich.edu 0x6: ceil_w_s({{ Fd = convert_and_round(Fs.sf,RND_UP,FP_WORD,FP_SINGLE);}}); 5297639Sgblack@eecs.umich.edu 0x7: floor_w_s({{ Fd = convert_and_round(Fs.sf,RND_DOWN,FP_WORD,FP_SINGLE);}}); 53010037SARM gem5 Developers } 53110037SARM gem5 Developers } 53210037SARM gem5 Developers 53310037SARM gem5 Developers 0x2: decode FUNCTION_LO { 53410037SARM gem5 Developers 0x1: decode MOVCF { 53510037SARM gem5 Developers format FloatOp { 53610037SARM gem5 Developers 0x0: movfs({{if (xc->readMiscReg(FPCR) != CC) Fd = Fs; }}); 53710037SARM gem5 Developers 0x1: movts({{if (xc->readMiscReg(FPCR) == CC) Fd = Fs;}}); 53810037SARM gem5 Developers } 53910037SARM gem5 Developers } 54010037SARM gem5 Developers 54110037SARM gem5 Developers format BasicOp { 54210037SARM gem5 Developers 0x2: movzs({{ if (Rt == 0) Fd = Fs; }}); 54310037SARM gem5 Developers 0x3: movns({{ if (Rt != 0) Fd = Fs; }}); 54410037SARM gem5 Developers } 54510037SARM gem5 Developers 54610037SARM gem5 Developers format Float64Op { 54710037SARM gem5 Developers 0x5: recips({{ Fd = 1 / Fs; }}); 54810037SARM gem5 Developers 0x6: rsqrts({{ Fd = 1 / sqrt((double)Fs.ud);}}); 54910037SARM gem5 Developers } 55010037SARM gem5 Developers } 55110037SARM gem5 Developers 55210037SARM gem5 Developers 0x4: decode FUNCTION_LO { 55310037SARM gem5 Developers 55410037SARM gem5 Developers format FloatOp { 55510037SARM gem5 Developers 0x1: cvt_d_s({{ 55610037SARM gem5 Developers int rnd_mode = xc->readMiscReg(FCSR); 55710037SARM gem5 Developers Fd = convert_and_round(Fs.sf,rnd_mode,FP_DOUBLE,FP_SINGLE); 55810037SARM gem5 Developers }}); 55910037SARM gem5 Developers 56010037SARM gem5 Developers 0x4: cvt_w_s({{ int rnd_mode = xc->readMiscReg(FCSR); 56110037SARM gem5 Developers Fd = convert_and_round(Fs.sf,rnd_mode,FP_WORD,FP_SINGLE); 56210037SARM gem5 Developers }}); 56310037SARM gem5 Developers } 56410037SARM gem5 Developers 56510037SARM gem5 Developers //only legal for 64 bit 56610037SARM gem5 Developers format Float64Op { 56710037SARM gem5 Developers 0x5: cvt_l_s({{ int rnd_mode = xc->readMiscReg(FCSR); 56810037SARM gem5 Developers Fd = convert_and_round(Fs.sf,rnd_mode,FP_LONG,FP_SINGLE); 56910037SARM gem5 Developers }}); 5707639Sgblack@eecs.umich.edu 5717639Sgblack@eecs.umich.edu 0x6: cvt_ps_s({{ /*Fd.df = Fs.df<31:0> | Ft.df<31:0>;*/ }}); 5727639Sgblack@eecs.umich.edu } 5737639Sgblack@eecs.umich.edu } 5747639Sgblack@eecs.umich.edu } 5757639Sgblack@eecs.umich.edu 5767639Sgblack@eecs.umich.edu //Table A-15 MIPS32 COP1 Encoding of Function Field When rs=D 5777639Sgblack@eecs.umich.edu 0x1: decode FUNCTION_HI { 5787639Sgblack@eecs.umich.edu 0x0: decode FUNCTION_LO { 5797639Sgblack@eecs.umich.edu format FloatOp { 5807639Sgblack@eecs.umich.edu 0x0: addd({{ Fd.df = Fs.df + Ft.df;}}); 5817639Sgblack@eecs.umich.edu 0x1: subd({{ Fd.df = Fs.df - Ft.df;}}); 5827639Sgblack@eecs.umich.edu 0x2: muld({{ Fd.df = Fs.df * Ft.df;}}); 5837639Sgblack@eecs.umich.edu 0x3: divd({{ Fd.df = Fs.df / Ft.df;}}); 5847639Sgblack@eecs.umich.edu 0x4: sqrtd({{ Fd.df = sqrt(Fs.df);}}); 5857639Sgblack@eecs.umich.edu 0x5: absd({{ Fd.df = fabs(Fs.df);}}); 5867639Sgblack@eecs.umich.edu 0x6: movd({{ Fd.df = Fs.df;}}); 5877639Sgblack@eecs.umich.edu 0x7: negd({{ Fd.df = -1 * Fs.df;}}); 5887639Sgblack@eecs.umich.edu } 5897639Sgblack@eecs.umich.edu } 5907639Sgblack@eecs.umich.edu 5917639Sgblack@eecs.umich.edu 0x1: decode FUNCTION_LO { 5927639Sgblack@eecs.umich.edu //only legal for 64 bit 5937639Sgblack@eecs.umich.edu format Float64Op { 5947639Sgblack@eecs.umich.edu 0x0: round_l_d({{ Fd = convert_and_round(Fs.df,RND_NEAREST,FP_LONG,FP_DOUBLE); }}); 5957639Sgblack@eecs.umich.edu 0x1: trunc_l_d({{ Fd = convert_and_round(Fs.df,RND_ZERO,FP_LONG,FP_DOUBLE);}}); 5967639Sgblack@eecs.umich.edu 0x2: ceil_l_d({{ Fd = convert_and_round(Fs.df,RND_UP,FP_LONG,FP_DOUBLE);}}); 5977639Sgblack@eecs.umich.edu 0x3: floor_l_d({{ Fd = convert_and_round(Fs.df,RND_DOWN,FP_LONG,FP_DOUBLE);}}); 5987639Sgblack@eecs.umich.edu } 5997639Sgblack@eecs.umich.edu 6007639Sgblack@eecs.umich.edu format FloatOp { 6017639Sgblack@eecs.umich.edu 0x4: round_w_d({{ Fd = convert_and_round(Fs.df,RND_NEAREST,FP_LONG,FP_DOUBLE); }}); 6027639Sgblack@eecs.umich.edu 0x5: trunc_w_d({{ Fd = convert_and_round(Fs.df,RND_ZERO,FP_LONG,FP_DOUBLE); }}); 6037639Sgblack@eecs.umich.edu 0x6: ceil_w_d({{ Fd = convert_and_round(Fs.df,RND_UP,FP_LONG,FP_DOUBLE); }}); 6047639Sgblack@eecs.umich.edu 0x7: floor_w_d({{ Fd = convert_and_round(Fs.df,RND_DOWN,FP_LONG,FP_DOUBLE); }}); 6057639Sgblack@eecs.umich.edu } 6067639Sgblack@eecs.umich.edu } 6077639Sgblack@eecs.umich.edu 6087639Sgblack@eecs.umich.edu 0x2: decode FUNCTION_LO { 6097639Sgblack@eecs.umich.edu 0x1: decode MOVCF { 6107639Sgblack@eecs.umich.edu format FloatOp { 6117639Sgblack@eecs.umich.edu 0x0: movfd({{if (xc->readMiscReg(FPCR) != CC) Fd.df = Fs.df; }}); 6127639Sgblack@eecs.umich.edu 0x1: movtd({{if (xc->readMiscReg(FPCR) == CC) Fd.df = Fs.df; }}); 6137639Sgblack@eecs.umich.edu } 6147639Sgblack@eecs.umich.edu } 6157639Sgblack@eecs.umich.edu 6167639Sgblack@eecs.umich.edu format BasicOp { 6177639Sgblack@eecs.umich.edu 0x2: movzd({{ if (Rt == 0) Fd.df = Fs.df; }}); 6187639Sgblack@eecs.umich.edu 0x3: movnd({{ if (Rt != 0) Fd.df = Fs.df; }}); 6197639Sgblack@eecs.umich.edu } 6207639Sgblack@eecs.umich.edu 6217639Sgblack@eecs.umich.edu format Float64Op { 6227639Sgblack@eecs.umich.edu 0x5: recipd({{ Fd.df = 1 / Fs.df}}); 6237639Sgblack@eecs.umich.edu 0x6: rsqrtd({{ Fd.df = 1 / sqrt(Fs.df) }}); 6247639Sgblack@eecs.umich.edu } 6257639Sgblack@eecs.umich.edu } 6267639Sgblack@eecs.umich.edu 6277639Sgblack@eecs.umich.edu 0x4: decode FUNCTION_LO { 6287639Sgblack@eecs.umich.edu format FloatOp { 6297639Sgblack@eecs.umich.edu 0x0: cvt_s_d({{ 6307639Sgblack@eecs.umich.edu int rnd_mode = xc->readMiscReg(FCSR); 6317639Sgblack@eecs.umich.edu Fd = convert_and_round(Fs.df,rnd_mode,FP_SINGLE,FP_DOUBLE); 6327639Sgblack@eecs.umich.edu }}); 6337639Sgblack@eecs.umich.edu 6347639Sgblack@eecs.umich.edu 0x4: cvt_w_d({{ 6357639Sgblack@eecs.umich.edu int rnd_mode = xc->readMiscReg(FCSR); 63610037SARM gem5 Developers Fd = convert_and_round(Fs.df,rnd_mode,FP_WORD,FP_DOUBLE); 63710037SARM gem5 Developers }}); 63810037SARM gem5 Developers } 63910037SARM gem5 Developers 64010037SARM gem5 Developers //only legal for 64 bit 64110037SARM gem5 Developers format Float64Op { 64210037SARM gem5 Developers 0x5: cvt_l_d({{ 64310037SARM gem5 Developers int rnd_mode = xc->readMiscReg(FCSR); 64410037SARM gem5 Developers Fd = convert_and_round(Fs.df,rnd_mode,FP_LONG,FP_DOUBLE); 64510037SARM gem5 Developers }}); 64610037SARM gem5 Developers } 64710037SARM gem5 Developers } 64810037SARM gem5 Developers } 64910037SARM gem5 Developers 65010037SARM gem5 Developers //Table A-16 MIPS32 COP1 Encoding of Function Field When rs=W 65110037SARM gem5 Developers 0x4: decode FUNCTION { 65210037SARM gem5 Developers format FloatOp { 65310037SARM gem5 Developers 0x20: cvt_s({{ 65410037SARM gem5 Developers int rnd_mode = xc->readMiscReg(FCSR); 65510037SARM gem5 Developers Fd = convert_and_round(Fs.df,rnd_mode,FP_SINGLE,FP_WORD); 65610037SARM gem5 Developers }}); 65710037SARM gem5 Developers 65810037SARM gem5 Developers 0x21: cvt_d({{ 65910037SARM gem5 Developers int rnd_mode = xc->readMiscReg(FCSR); 66010037SARM gem5 Developers Fd = convert_and_round(Fs.df,rnd_mode,FP_DOUBLE,FP_WORD); 66110037SARM gem5 Developers }}); 66210037SARM gem5 Developers } 66310037SARM gem5 Developers } 66410037SARM gem5 Developers 66510037SARM gem5 Developers //Table A-16 MIPS32 COP1 Encoding of Function Field When rs=L1 66610037SARM gem5 Developers //Note: "1. Format type L is legal only if 64-bit floating point operations 66710037SARM gem5 Developers //are enabled." 66810037SARM gem5 Developers 0x5: decode FUNCTION_HI { 66910037SARM gem5 Developers format FloatOp { 67010037SARM gem5 Developers 0x10: cvt_s_l({{ 67110037SARM gem5 Developers int rnd_mode = xc->readMiscReg(FCSR); 67210037SARM gem5 Developers Fd = convert_and_round(Fs.df,rnd_mode,FP_SINGLE,FP_LONG); 67310037SARM gem5 Developers }}); 67410037SARM gem5 Developers 67510037SARM gem5 Developers 0x11: cvt_d_l({{ 67610037SARM gem5 Developers int rnd_mode = xc->readMiscReg(FCSR); 67710037SARM gem5 Developers Fd = convert_and_round(Fs.df,rnd_mode,FP_DOUBLE,FP_LONG); 67810037SARM gem5 Developers }}); 67910037SARM gem5 Developers } 68010037SARM gem5 Developers } 68110037SARM gem5 Developers 68210037SARM gem5 Developers //Table A-17 MIPS64 COP1 Encoding of Function Field When rs=PS1 68310037SARM gem5 Developers //Note: "1. Format type PS is legal only if 64-bit floating point operations 68410037SARM gem5 Developers //are enabled. " 68510037SARM gem5 Developers 0x6: decode FUNCTION_HI { 68610037SARM gem5 Developers 0x0: decode FUNCTION_LO { 68710037SARM gem5 Developers format Float64Op { 68810037SARM gem5 Developers 0x0: addps({{ //Must Check for Exception Here... Supposed to Operate on Upper and 68910037SARM gem5 Developers //Lower Halves Independently but we take simulator shortcut 69010037SARM gem5 Developers Fd.df = Fs.df + Ft.df; 69110037SARM gem5 Developers }}); 69210037SARM gem5 Developers 69310037SARM gem5 Developers 0x1: subps({{ //Must Check for Exception Here... Supposed to Operate on Upper and 69410037SARM gem5 Developers //Lower Halves Independently but we take simulator shortcut 69510037SARM gem5 Developers Fd.df = Fs.df - Ft.df; 6967639Sgblack@eecs.umich.edu }}); 6977639Sgblack@eecs.umich.edu 6987639Sgblack@eecs.umich.edu 0x2: mulps({{ //Must Check for Exception Here... Supposed to Operate on Upper and 6997639Sgblack@eecs.umich.edu //Lower Halves Independently but we take simulator shortcut 7007639Sgblack@eecs.umich.edu Fd.df = Fs.df * Ft.df; 7017639Sgblack@eecs.umich.edu }}); 7027639Sgblack@eecs.umich.edu 7037639Sgblack@eecs.umich.edu 0x5: absps({{ //Must Check for Exception Here... Supposed to Operate on Upper and 7047639Sgblack@eecs.umich.edu //Lower Halves Independently but we take simulator shortcut 7057639Sgblack@eecs.umich.edu Fd.df = fabs(Fs.df); 7067639Sgblack@eecs.umich.edu }}); 7077639Sgblack@eecs.umich.edu 7087639Sgblack@eecs.umich.edu 0x6: movps({{ //Must Check for Exception Here... Supposed to Operate on Upper and 7097639Sgblack@eecs.umich.edu //Lower Halves Independently but we take simulator shortcut 7107639Sgblack@eecs.umich.edu //Fd.df = Fs<31:0> | Ft<31:0>; 7117639Sgblack@eecs.umich.edu }}); 7127639Sgblack@eecs.umich.edu 7137639Sgblack@eecs.umich.edu 0x7: negps({{ //Must Check for Exception Here... Supposed to Operate on Upper and 7147639Sgblack@eecs.umich.edu //Lower Halves Independently but we take simulator shortcut 7157639Sgblack@eecs.umich.edu Fd.df = -1 * Fs.df; 7167639Sgblack@eecs.umich.edu }}); 7177639Sgblack@eecs.umich.edu } 7187639Sgblack@eecs.umich.edu } 7197639Sgblack@eecs.umich.edu 7207639Sgblack@eecs.umich.edu 0x2: decode FUNCTION_LO { 7217639Sgblack@eecs.umich.edu 0x1: decode MOVCF { 7227639Sgblack@eecs.umich.edu format Float64Op { 7237639Sgblack@eecs.umich.edu 0x0: movfps({{if (xc->readMiscReg(FPCR) != CC) Fd = Fs;}}); 7247639Sgblack@eecs.umich.edu 0x1: movtps({{if (xc->readMiscReg(FPCR) == CC) Fd = Fs;}}); 7257639Sgblack@eecs.umich.edu } 7267639Sgblack@eecs.umich.edu } 7277639Sgblack@eecs.umich.edu 7287639Sgblack@eecs.umich.edu format BasicOp { 7297639Sgblack@eecs.umich.edu 0x2: movzps({{if (xc->readMiscReg(FPCR) != CC) Fd = Fs; }}); 7307639Sgblack@eecs.umich.edu 0x3: movnps({{if (xc->readMiscReg(FPCR) == CC) Fd = Fs; }}); 7317639Sgblack@eecs.umich.edu } 7327639Sgblack@eecs.umich.edu 7337639Sgblack@eecs.umich.edu } 7347639Sgblack@eecs.umich.edu 7357639Sgblack@eecs.umich.edu 0x4: decode FUNCTION_LO { 73610037SARM gem5 Developers 0x0: Float64Op::cvt_s_pu({{ 73710037SARM gem5 Developers int rnd_mode = xc->readMiscReg(FCSR); 7387639Sgblack@eecs.umich.edu Fd = convert_and_round(Fs.df,rnd_mode,FP_DOUBLE,FP_PS_HI); 7397639Sgblack@eecs.umich.edu }}); 7407639Sgblack@eecs.umich.edu } 7417639Sgblack@eecs.umich.edu 7427639Sgblack@eecs.umich.edu 0x5: decode FUNCTION_LO { 7437639Sgblack@eecs.umich.edu format Float64Op { 7447639Sgblack@eecs.umich.edu 0x0: cvt_s_pl({{ 7457639Sgblack@eecs.umich.edu int rnd_mode = xc->readMiscReg(FCSR); 7467639Sgblack@eecs.umich.edu Fd = convert_and_round(Fs.df,rnd_mode,FP_SINGLE,FP_PS_LO); 7477639Sgblack@eecs.umich.edu }}); 7487639Sgblack@eecs.umich.edu 0x4: pll({{ /*Fd.df = Fs<31:0> | Ft<31:0>*/}}); 7497639Sgblack@eecs.umich.edu 0x5: plu({{ /*Fd.df = Fs<31:0> | Ft<63:32>*/}}); 75010037SARM gem5 Developers 0x6: pul({{ /*Fd.df = Fs<63:32> | Ft<31:0>*/}}); 75110037SARM gem5 Developers 0x7: puu({{ /*Fd.df = Fs<63:32 | Ft<63:32>*/}}); 7527639Sgblack@eecs.umich.edu } 7537639Sgblack@eecs.umich.edu } 7547639Sgblack@eecs.umich.edu } 7557639Sgblack@eecs.umich.edu } 7567639Sgblack@eecs.umich.edu } 7577639Sgblack@eecs.umich.edu } 7587639Sgblack@eecs.umich.edu 7597639Sgblack@eecs.umich.edu //Table A-19 MIPS32 COP2 Encoding of rs Field 7607639Sgblack@eecs.umich.edu 0x2: decode RS_MSB { 7617639Sgblack@eecs.umich.edu 0x0: decode RS_HI { 7627639Sgblack@eecs.umich.edu 0x0: decode RS_LO { 7637639Sgblack@eecs.umich.edu format WarnUnimpl { 7647639Sgblack@eecs.umich.edu 0x0: mfc2(); 7657639Sgblack@eecs.umich.edu 0x2: cfc2(); 7667639Sgblack@eecs.umich.edu 0x3: mfhc2(); 7677639Sgblack@eecs.umich.edu 0x4: mtc2(); 7687639Sgblack@eecs.umich.edu 0x6: ctc2(); 7697639Sgblack@eecs.umich.edu 0x7: mftc2(); 7707639Sgblack@eecs.umich.edu } 7717639Sgblack@eecs.umich.edu } 7727639Sgblack@eecs.umich.edu 7737639Sgblack@eecs.umich.edu 0x1: decode ND { 7747639Sgblack@eecs.umich.edu 0x0: decode TF { 7757639Sgblack@eecs.umich.edu format WarnUnimpl { 7767639Sgblack@eecs.umich.edu 0x0: bc2f(); 7777639Sgblack@eecs.umich.edu 0x1: bc2t(); 7787639Sgblack@eecs.umich.edu } 7797639Sgblack@eecs.umich.edu } 7807639Sgblack@eecs.umich.edu 7817639Sgblack@eecs.umich.edu 0x1: decode TF { 7827639Sgblack@eecs.umich.edu format WarnUnimpl { 78310037SARM gem5 Developers 0x0: bc2fl(); 78410037SARM gem5 Developers 0x1: bc2tl(); 7857639Sgblack@eecs.umich.edu } 7867639Sgblack@eecs.umich.edu } 7877639Sgblack@eecs.umich.edu } 7887639Sgblack@eecs.umich.edu } 7897639Sgblack@eecs.umich.edu } 7907639Sgblack@eecs.umich.edu 7917639Sgblack@eecs.umich.edu //Table A-20 MIPS64 COP1X Encoding of Function Field 1 7927639Sgblack@eecs.umich.edu //Note: "COP1X instructions are legal only if 64-bit floating point 7937639Sgblack@eecs.umich.edu //operations are enabled." 7947639Sgblack@eecs.umich.edu 0x3: decode FUNCTION_HI { 7957639Sgblack@eecs.umich.edu 0x0: decode FUNCTION_LO { 7967639Sgblack@eecs.umich.edu format LoadFloatMemory { 7977639Sgblack@eecs.umich.edu 0x0: lwxc1({{ /*F_t<31:0> = Mem.sf; */}}, {{ EA = Rs + Rt; }}); 7987639Sgblack@eecs.umich.edu 0x1: ldxc1({{ /*F_t<63:0> = Mem.df;*/ }}, {{ EA = Rs + Rt; }}); 7997639Sgblack@eecs.umich.edu 0x5: luxc1({{ /*F_t<31:0> = Mem.df; */}}, 8007639Sgblack@eecs.umich.edu {{ //Need to make EA<2:0> = 0 8017639Sgblack@eecs.umich.edu EA = Rs + Rt; 8027639Sgblack@eecs.umich.edu }}); 8037639Sgblack@eecs.umich.edu } 8047639Sgblack@eecs.umich.edu } 8057639Sgblack@eecs.umich.edu 8067639Sgblack@eecs.umich.edu 0x1: decode FUNCTION_LO { 8077639Sgblack@eecs.umich.edu format StoreFloatMemory { 8087639Sgblack@eecs.umich.edu 0x0: swxc1({{ /*Mem.sf = Ft<31:0>; */}},{{ EA = Rs + Rt; }}); 8097639Sgblack@eecs.umich.edu 0x1: sdxc1({{ /*Mem.df = Ft<63:0> */}}, {{ EA = Rs + Rt; }}); 8107639Sgblack@eecs.umich.edu 0x5: suxc1({{ /*Mem.df = F_t<63:0>;*/}}, 8117639Sgblack@eecs.umich.edu {{ //Need to make sure EA<2:0> = 0 8127639Sgblack@eecs.umich.edu EA = Rs + Rt; 8137639Sgblack@eecs.umich.edu }}); 8147639Sgblack@eecs.umich.edu } 8157639Sgblack@eecs.umich.edu 8167639Sgblack@eecs.umich.edu 0x7: WarnUnimpl::prefx(); 8177639Sgblack@eecs.umich.edu } 8187639Sgblack@eecs.umich.edu 8197639Sgblack@eecs.umich.edu format FloatOp { 8207639Sgblack@eecs.umich.edu 0x3: WarnUnimpl::alnv_ps(); 8217639Sgblack@eecs.umich.edu 8227639Sgblack@eecs.umich.edu format BasicOp { 8237639Sgblack@eecs.umich.edu 0x4: decode FUNCTION_LO { 8247639Sgblack@eecs.umich.edu 0x0: madd_s({{ Fd.sf = (Fs.sf * Fs.sf) + Fr.sf; }}); 8257639Sgblack@eecs.umich.edu 0x1: madd_d({{ Fd.df = (Fs.df * Fs.df) + Fr.df; }}); 8267639Sgblack@eecs.umich.edu 0x6: madd_ps({{ 8277639Sgblack@eecs.umich.edu //Must Check for Exception Here... Supposed to Operate on Upper and 8287639Sgblack@eecs.umich.edu //Lower Halves Independently but we take simulator shortcut 8297639Sgblack@eecs.umich.edu Fd.df = (Fs.df * Fs.df) + Fr.df; 8307639Sgblack@eecs.umich.edu }}); 8317639Sgblack@eecs.umich.edu } 8327639Sgblack@eecs.umich.edu 8337639Sgblack@eecs.umich.edu 0x5: decode FUNCTION_LO { 8347639Sgblack@eecs.umich.edu 0x0: msub_s({{ Fd.sf = (Fs.sf * Fs.sf) - Fr.sf; }}); 8357639Sgblack@eecs.umich.edu 0x1: msub_d({{ Fd.df = (Fs.df * Fs.df) - Fr.df; }}); 8367639Sgblack@eecs.umich.edu 0x6: msub_ps({{ 8377639Sgblack@eecs.umich.edu //Must Check for Exception Here... Supposed to Operate on Upper and 8387639Sgblack@eecs.umich.edu //Lower Halves Independently but we take simulator shortcut 8397639Sgblack@eecs.umich.edu Fd.df = (Fs.df * Fs.df) - Fr.df; 8407639Sgblack@eecs.umich.edu }}); 8417639Sgblack@eecs.umich.edu } 8427639Sgblack@eecs.umich.edu 8437639Sgblack@eecs.umich.edu 0x6: decode FUNCTION_LO { 84410037SARM gem5 Developers 0x0: nmadd_s({{ Fd.sf = (-1 * Fs.sf * Fs.sf) - Fr.sf; }}); 84510037SARM gem5 Developers 0x1: nmadd_d({{ Fd.df = (-1 * Fs.df * Fs.df) + Fr.df; }}); 84610037SARM gem5 Developers 0x6: nmadd_ps({{ 84710037SARM gem5 Developers //Must Check for Exception Here... Supposed to Operate on Upper and 84810037SARM gem5 Developers //Lower Halves Independently but we take simulator shortcut 84910037SARM gem5 Developers Fd.df = (-1 * Fs.df * Fs.df) + Fr.df; 85010037SARM gem5 Developers }}); 85110037SARM gem5 Developers } 85210037SARM gem5 Developers 85310037SARM gem5 Developers 0x7: decode FUNCTION_LO { 85410037SARM gem5 Developers 0x0: nmsub_s({{ Fd.sf = (-1 * Fs.sf * Fs.sf) - Fr.sf; }}); 85510037SARM gem5 Developers 0x1: nmsub_d({{ Fd.df = (-1 * Fs.df * Fs.df) - Fr.df; }}); 85610037SARM gem5 Developers 0x6: nmsub_ps({{ 85710037SARM gem5 Developers //Must Check for Exception Here... Supposed to Operate on Upper and 85810037SARM gem5 Developers //Lower Halves Independently but we take simulator shortcut 85910037SARM gem5 Developers Fd.df = (-1 * Fs.df * Fs.df) + Fr.df; 86010037SARM gem5 Developers }}); 86110037SARM gem5 Developers } 86210037SARM gem5 Developers } 86310037SARM gem5 Developers } 86410037SARM gem5 Developers } 86510037SARM gem5 Developers 86610037SARM gem5 Developers //MIPS obsolete instructions 86710037SARM gem5 Developers format BranchLikely { 86810037SARM gem5 Developers 0x4: beql({{ cond = (Rs.sw == 0); }}); 86910037SARM gem5 Developers 0x5: bnel({{ cond = (Rs.sw != 0); }}); 87010037SARM gem5 Developers 0x6: blezl({{ cond = (Rs.sw <= 0); }}); 87110037SARM gem5 Developers 0x7: bgtzl({{ cond = (Rs.sw > 0); }}); 87210037SARM gem5 Developers } 87310037SARM gem5 Developers } 87410037SARM gem5 Developers 87510037SARM gem5 Developers 0x3: decode OPCODE_LO default FailUnimpl::reserved() { 87610037SARM gem5 Developers 87710037SARM gem5 Developers //Table A-5 MIPS32 SPECIAL2 Encoding of Function Field 87810037SARM gem5 Developers 0x4: decode FUNCTION_HI { 87910037SARM gem5 Developers 88010037SARM gem5 Developers 0x0: decode FUNCTION_LO { 88110037SARM gem5 Developers format IntOp { 88210037SARM gem5 Developers 0x0: madd({{ 88310037SARM gem5 Developers int64_t temp1 = xc->readMiscReg(Hi) << 32 | xc->readMiscReg(Lo) >> 32; 88410037SARM gem5 Developers temp1 = temp1 + (Rs.sw * Rt.sw); 88510037SARM gem5 Developers xc->setMiscReg(Hi,temp1<63:32>); 88610037SARM gem5 Developers xc->setMiscReg(Lo,temp1<31:0>); 88710037SARM gem5 Developers }}); 88810037SARM gem5 Developers 88910037SARM gem5 Developers 0x1: maddu({{ 89010037SARM gem5 Developers int64_t temp1 = xc->readMiscReg(Hi) << 32 | xc->readMiscReg(Lo) >> 32; 89110037SARM gem5 Developers temp1 = temp1 + (Rs.uw * Rt.uw); 89210037SARM gem5 Developers xc->setMiscReg(Hi,temp1<63:32>); 89310037SARM gem5 Developers xc->setMiscReg(Lo,temp1<31:0>); 89410037SARM gem5 Developers }}); 89510037SARM gem5 Developers 89610037SARM gem5 Developers 0x2: mul({{ Rd.sw = Rs.sw * Rt.sw; }}); 89710037SARM gem5 Developers 89810037SARM gem5 Developers 0x4: msub({{ 89910037SARM gem5 Developers int64_t temp1 = xc->readMiscReg(Hi) << 32 | xc->readMiscReg(Lo) >> 32; 90010037SARM gem5 Developers temp1 = temp1 - (Rs.sw * Rt.sw); 90110037SARM gem5 Developers xc->setMiscReg(Hi,temp1<63:32>); 90210037SARM gem5 Developers xc->setMiscReg(Lo,temp1<31:0>); 90310037SARM gem5 Developers }}); 90410037SARM gem5 Developers 90510037SARM gem5 Developers 0x5: msubu({{ 90610037SARM gem5 Developers int64_t temp1 = xc->readMiscReg(Hi) << 32 | xc->readMiscReg(Lo) >> 32; 90710037SARM gem5 Developers temp1 = temp1 - (Rs.uw * Rt.uw); 90810037SARM gem5 Developers xc->setMiscReg(Hi,temp1<63:32>); 90910037SARM gem5 Developers xc->setMiscReg(Lo,temp1<31:0>); 91010037SARM gem5 Developers }}); 91110037SARM gem5 Developers } 91210037SARM gem5 Developers } 91310037SARM gem5 Developers 91410037SARM gem5 Developers 0x4: decode FUNCTION_LO { 91510037SARM gem5 Developers format BasicOp { 91610037SARM gem5 Developers 0x0: clz({{ 91710037SARM gem5 Developers /*int cnt = 0; 91810037SARM gem5 Developers int idx = 0; 91910037SARM gem5 Developers while ( Rs.uw<idx> != 1) { 92010037SARM gem5 Developers cnt++; 92110037SARM gem5 Developers idx--; 92210037SARM gem5 Developers } 92310037SARM gem5 Developers 92410037SARM gem5 Developers Rd.uw = cnt;*/ 92510037SARM gem5 Developers }}); 92610037SARM gem5 Developers 92710037SARM gem5 Developers 0x1: clo({{ 92810037SARM gem5 Developers /*int cnt = 0; 92910037SARM gem5 Developers int idx = 0; 93010037SARM gem5 Developers while ( Rs.uw<idx> != 0) { 93110037SARM gem5 Developers cnt++; 93210037SARM gem5 Developers idx--; 93310037SARM gem5 Developers } 93410037SARM gem5 Developers 93510037SARM gem5 Developers Rd.uw = cnt;*/ 93610037SARM gem5 Developers }}); 93710037SARM gem5 Developers } 93810037SARM gem5 Developers } 93910037SARM gem5 Developers 94010037SARM gem5 Developers 0x7: decode FUNCTION_LO { 94110037SARM gem5 Developers 0x7: WarnUnimpl::sdbbp(); 94210037SARM gem5 Developers } 94310037SARM gem5 Developers } 94410037SARM gem5 Developers 94510037SARM gem5 Developers //Table A-6 MIPS32 SPECIAL3 Encoding of Function Field for Release 2 of the Architecture 94610037SARM gem5 Developers 0x7: decode FUNCTION_HI { 94710037SARM gem5 Developers 94810037SARM gem5 Developers 0x0: decode FUNCTION_LO { 94910037SARM gem5 Developers format FailUnimpl { 95010037SARM gem5 Developers 0x1: ext(); 95110037SARM gem5 Developers 0x4: ins(); 95210037SARM gem5 Developers } 95310037SARM gem5 Developers } 95410037SARM gem5 Developers 95510037SARM gem5 Developers 0x1: decode FUNCTION_LO { 95610037SARM gem5 Developers format FailUnimpl { 95710037SARM gem5 Developers 0x0: fork(); 95810037SARM gem5 Developers 0x1: yield(); 95910037SARM gem5 Developers } 96010037SARM gem5 Developers } 96110037SARM gem5 Developers 96210037SARM gem5 Developers 96310037SARM gem5 Developers //Table A-10 MIPS32 BSHFL Encoding of sa Field 96410037SARM gem5 Developers 0x4: decode SA { 96510037SARM gem5 Developers 96610037SARM gem5 Developers 0x02: FailUnimpl::wsbh(); 96710037SARM gem5 Developers 96810037SARM gem5 Developers format BasicOp { 96910037SARM gem5 Developers 0x10: seb({{ Rd.sw = Rt<7:0>}}); 97010037SARM gem5 Developers 0x18: seh({{ Rd.sw = Rt<15:0>}}); 97110037SARM gem5 Developers } 97210037SARM gem5 Developers } 97310037SARM gem5 Developers 97410037SARM gem5 Developers 0x6: decode FUNCTION_LO { 97510037SARM gem5 Developers 0x7: FailUnimpl::rdhwr();//{{ /*Rt = xc->hwRegs[RD];*/ }} 97610037SARM gem5 Developers } 97710037SARM gem5 Developers } 97810037SARM gem5 Developers } 97910037SARM gem5 Developers 98010037SARM gem5 Developers 0x4: decode OPCODE_LO default FailUnimpl::reserved() { 98110037SARM gem5 Developers format LoadMemory { 98210037SARM gem5 Developers 0x0: lb({{ Rt.sw = Mem.sb; }}); 98310037SARM gem5 Developers 0x1: lh({{ Rt.sw = Mem.sh; }}); 98410037SARM gem5 Developers 98510037SARM gem5 Developers 0x2: lwl({{ 98610037SARM gem5 Developers uint32_t mem_word = Mem.uw; 98710037SARM gem5 Developers uint32_t unalign_addr = Rs + disp; 98810037SARM gem5 Developers uint32_t offset = unalign_addr & 0x00000003; 98910037SARM gem5 Developers#if BYTE_ORDER == BIG_ENDIAN 99010037SARM gem5 Developers std::cout << "Big Endian Byte Order\n"; 99110037SARM gem5 Developers 99210037SARM gem5 Developers switch(offset) 99310037SARM gem5 Developers { 99410037SARM gem5 Developers case 0: 99510037SARM gem5 Developers Rt = mem_word; 99610037SARM gem5 Developers break; 99710037SARM gem5 Developers 99810037SARM gem5 Developers case 1: 99910037SARM gem5 Developers Rt &= 0x000F; 100010037SARM gem5 Developers Rt |= (mem_word << 4); 100110037SARM gem5 Developers break; 100210037SARM gem5 Developers 100310037SARM gem5 Developers case 2: 100410037SARM gem5 Developers Rt &= 0x00FF; 100510037SARM gem5 Developers Rt |= (mem_word << 8); 100610037SARM gem5 Developers break; 100710037SARM gem5 Developers 100810037SARM gem5 Developers case 3: 100910037SARM gem5 Developers Rt &= 0x0FFF; 101010037SARM gem5 Developers Rt |= (mem_word << 12); 101110037SARM gem5 Developers break; 101210037SARM gem5 Developers 101310037SARM gem5 Developers default: 101410037SARM gem5 Developers panic("lwl: bad offset"); 101510037SARM gem5 Developers } 101610037SARM gem5 Developers#elif BYTE_ORDER == LITTLE_ENDIAN 101710037SARM gem5 Developers std::cout << "Little Endian Byte Order\n"; 101810037SARM gem5 Developers 101910037SARM gem5 Developers switch(offset) 102010037SARM gem5 Developers { 102110037SARM gem5 Developers case 0: 102210037SARM gem5 Developers Rt &= 0x0FFF; 102310037SARM gem5 Developers Rt |= (mem_word << 12); 102410037SARM gem5 Developers break; 102510037SARM gem5 Developers 102610037SARM gem5 Developers case 1: 102710037SARM gem5 Developers Rt &= 0x00FF; 102810037SARM gem5 Developers Rt |= (mem_word << 8); 102910037SARM gem5 Developers break; 103010037SARM gem5 Developers 103110037SARM gem5 Developers case 2: 103210037SARM gem5 Developers Rt &= 0x000F; 103310037SARM gem5 Developers Rt |= (mem_word << 4); 103410037SARM gem5 Developers break; 103510037SARM gem5 Developers 103610037SARM gem5 Developers case 3: 103710037SARM gem5 Developers Rt = mem_word; 103810037SARM gem5 Developers break; 103910037SARM gem5 Developers 104010037SARM gem5 Developers default: 104110037SARM gem5 Developers panic("lwl: bad offset"); 104210037SARM gem5 Developers } 104310037SARM gem5 Developers#endif 104410037SARM gem5 Developers }}, {{ EA = (Rs + disp) & ~3; }}); 104510037SARM gem5 Developers 104610037SARM gem5 Developers 0x3: lw({{ Rt.sw = Mem.sw; }}); 104710037SARM gem5 Developers 0x4: lbu({{ Rt.uw = Mem.ub; }}); 104810037SARM gem5 Developers 0x5: lhu({{ Rt.uw = Mem.uh; }}); 104910037SARM gem5 Developers 0x6: lwr({{ 105010037SARM gem5 Developers uint32_t mem_word = Mem.uw; 105110037SARM gem5 Developers uint32_t unalign_addr = Rs + disp; 105210037SARM gem5 Developers uint32_t offset = unalign_addr & 0x00000003; 105310037SARM gem5 Developers 105410037SARM gem5 Developers#if BYTE_ORDER == BIG_ENDIAN 105510037SARM gem5 Developers switch(offset) 105610037SARM gem5 Developers { 105710037SARM gem5 Developers case 0: Rt &= 0xFFF0; Rt |= (mem_word >> 12); break; 105810037SARM gem5 Developers case 1: Rt &= 0xFF00; Rt |= (mem_word >> 8); break; 10597639Sgblack@eecs.umich.edu case 2: Rt &= 0xF000; Rt |= (mem_word >> 4); break; 10607639Sgblack@eecs.umich.edu case 3: Rt = mem_word; break; 106110197SCurtis.Dunham@arm.com default: panic("lwr: bad offset"); 106210197SCurtis.Dunham@arm.com } 106310197SCurtis.Dunham@arm.com#elif BYTE_ORDER == LITTLE_ENDIAN 106410197SCurtis.Dunham@arm.com switch(offset) 106510197SCurtis.Dunham@arm.com { 10667639Sgblack@eecs.umich.edu case 0: Rt = mem_word; break; 10677639Sgblack@eecs.umich.edu case 1: Rt &= 0xF000; Rt |= (mem_word >> 4); break; 10687639Sgblack@eecs.umich.edu case 2: Rt &= 0xFF00; Rt |= (mem_word >> 8); break; 10699517SAli.Saidi@ARM.com case 3: Rt &= 0xFFF0; Rt |= (mem_word >> 12); break; 10707639Sgblack@eecs.umich.edu default: panic("lwr: bad offset"); 10717639Sgblack@eecs.umich.edu } 10727639Sgblack@eecs.umich.edu#endif 10737639Sgblack@eecs.umich.edu }}, 10747639Sgblack@eecs.umich.edu {{ EA = (Rs + disp) & ~3; }}); 10757639Sgblack@eecs.umich.edu } 10767639Sgblack@eecs.umich.edu 10779517SAli.Saidi@ARM.com 0x7: FailUnimpl::reserved(); 10787639Sgblack@eecs.umich.edu } 10797639Sgblack@eecs.umich.edu 10807639Sgblack@eecs.umich.edu 0x5: decode OPCODE_LO default FailUnimpl::reserved() { 10817639Sgblack@eecs.umich.edu format StoreMemory { 10827639Sgblack@eecs.umich.edu 0x0: sb({{ Mem.ub = Rt<7:0>; }}); 10837639Sgblack@eecs.umich.edu 0x1: sh({{ Mem.uh = Rt<15:0>; }}); 10847639Sgblack@eecs.umich.edu 0x2: swl({{ 10857639Sgblack@eecs.umich.edu uint32_t mem_word = 0; 10867639Sgblack@eecs.umich.edu uint32_t aligned_addr = (Rs + disp) & ~3; 10877639Sgblack@eecs.umich.edu uint32_t unalign_addr = Rs + disp; 10887639Sgblack@eecs.umich.edu uint32_t offset = unalign_addr & 0x00000003; 108910197SCurtis.Dunham@arm.com 109010197SCurtis.Dunham@arm.com DPRINTF(IEW,"Execute: aligned=0x%x unaligned=0x%x\n offset=0x%x", 10917639Sgblack@eecs.umich.edu aligned_addr,unalign_addr,offset); 10927639Sgblack@eecs.umich.edu 10937639Sgblack@eecs.umich.edu fault = xc->read(aligned_addr, (uint32_t&)mem_word, memAccessFlags); 10949517SAli.Saidi@ARM.com 10957639Sgblack@eecs.umich.edu#if BYTE_ORDER == BIG_ENDIAN 10967639Sgblack@eecs.umich.edu switch(offset) 10977639Sgblack@eecs.umich.edu { 10987639Sgblack@eecs.umich.edu case 0: 10997639Sgblack@eecs.umich.edu Mem = Rt; 11007639Sgblack@eecs.umich.edu break; 11017639Sgblack@eecs.umich.edu 11029517SAli.Saidi@ARM.com case 1: 11037639Sgblack@eecs.umich.edu mem_word &= 0xF000; 11047639Sgblack@eecs.umich.edu mem_word |= (Rt >> 4); 11057639Sgblack@eecs.umich.edu Mem = mem_word; 110610197SCurtis.Dunham@arm.com break; 110710197SCurtis.Dunham@arm.com 11087639Sgblack@eecs.umich.edu case 2: 11097639Sgblack@eecs.umich.edu mem_word &= 0xFF00; 11107639Sgblack@eecs.umich.edu mem_word |= (Rt >> 8); 11119517SAli.Saidi@ARM.com Mem = mem_word; 11127639Sgblack@eecs.umich.edu break; 11137639Sgblack@eecs.umich.edu 11147639Sgblack@eecs.umich.edu case 3: 11157639Sgblack@eecs.umich.edu mem_word &= 0xFFF0; 11167639Sgblack@eecs.umich.edu mem_word |= (Rt >> 12); 11177639Sgblack@eecs.umich.edu Mem = mem_word; 11187639Sgblack@eecs.umich.edu break; 11199517SAli.Saidi@ARM.com 11207639Sgblack@eecs.umich.edu default: 11217639Sgblack@eecs.umich.edu panic("swl: bad offset"); 11227639Sgblack@eecs.umich.edu } 112310197SCurtis.Dunham@arm.com#elif BYTE_ORDER == LITTLE_ENDIAN 11247639Sgblack@eecs.umich.edu switch(offset) 112510197SCurtis.Dunham@arm.com { 11267639Sgblack@eecs.umich.edu case 0: 11277639Sgblack@eecs.umich.edu mem_word &= 0xFFF0; 11287639Sgblack@eecs.umich.edu mem_word |= (Rt >> 12); 11297639Sgblack@eecs.umich.edu Mem = mem_word; 11307639Sgblack@eecs.umich.edu break; 11317639Sgblack@eecs.umich.edu 11327639Sgblack@eecs.umich.edu case 1: 11337639Sgblack@eecs.umich.edu mem_word &= 0xFF00; 11347760SGiacomo.Gabrielli@arm.com mem_word |= (Rt >> 8); 11357639Sgblack@eecs.umich.edu Mem = mem_word; 11367639Sgblack@eecs.umich.edu break; 11377640Sgblack@eecs.umich.edu 11387639Sgblack@eecs.umich.edu case 2: 11397639Sgblack@eecs.umich.edu mem_word &= 0xF000; 11407639Sgblack@eecs.umich.edu mem_word |= (Rt >> 4); 11417639Sgblack@eecs.umich.edu Mem = mem_word; 11428588Sgblack@eecs.umich.edu break; 11438588Sgblack@eecs.umich.edu 11447639Sgblack@eecs.umich.edu case 3: 11457639Sgblack@eecs.umich.edu Mem = Rt; 11467639Sgblack@eecs.umich.edu break; 11478588Sgblack@eecs.umich.edu 11487639Sgblack@eecs.umich.edu default: 11497639Sgblack@eecs.umich.edu panic("swl: bad offset"); 11507639Sgblack@eecs.umich.edu } 11517639Sgblack@eecs.umich.edu#endif 11527639Sgblack@eecs.umich.edu }},{{ EA = (Rs + disp) & ~3; }},mem_flags = NO_ALIGN_FAULT); 11537639Sgblack@eecs.umich.edu 11547639Sgblack@eecs.umich.edu 0x3: sw({{ Mem.uw = Rt<31:0>; }}); 11557639Sgblack@eecs.umich.edu 11567639Sgblack@eecs.umich.edu 0x6: swr({{ 11577639Sgblack@eecs.umich.edu uint32_t mem_word = 0; 11587639Sgblack@eecs.umich.edu uint32_t aligned_addr = (Rs + disp) & ~3; 11597639Sgblack@eecs.umich.edu uint32_t unalign_addr = Rs + disp; 11607639Sgblack@eecs.umich.edu uint32_t offset = unalign_addr & 0x00000003; 11617639Sgblack@eecs.umich.edu 11627639Sgblack@eecs.umich.edu fault = xc->read(aligned_addr, (uint32_t&)mem_word, memAccessFlags); 11637639Sgblack@eecs.umich.edu 11647639Sgblack@eecs.umich.edu#if BYTE_ORDER == BIG_ENDIAN 11657639Sgblack@eecs.umich.edu switch(offset) 11667639Sgblack@eecs.umich.edu { 11677639Sgblack@eecs.umich.edu case 0: 11687639Sgblack@eecs.umich.edu mem_word &= 0x0FFF; 11697639Sgblack@eecs.umich.edu mem_word |= (Rt << 12); 11707639Sgblack@eecs.umich.edu Mem = mem_word; 11717639Sgblack@eecs.umich.edu break; 11727639Sgblack@eecs.umich.edu 11737639Sgblack@eecs.umich.edu case 1: 11747639Sgblack@eecs.umich.edu mem_word &= 0x00FF; 11757639Sgblack@eecs.umich.edu mem_word |= (Rt << 8); 11767639Sgblack@eecs.umich.edu Mem = mem_word; 11777639Sgblack@eecs.umich.edu break; 11787639Sgblack@eecs.umich.edu 11797639Sgblack@eecs.umich.edu case 2: 11808588Sgblack@eecs.umich.edu mem_word &= 0x000F; 11817639Sgblack@eecs.umich.edu mem_word |= (Rt << 4); 11827639Sgblack@eecs.umich.edu Mem = mem_word; 11837639Sgblack@eecs.umich.edu break; 11847639Sgblack@eecs.umich.edu 11857639Sgblack@eecs.umich.edu case 3: 11867760SGiacomo.Gabrielli@arm.com Mem = Rt; 11877760SGiacomo.Gabrielli@arm.com break; 11887639Sgblack@eecs.umich.edu 11897639Sgblack@eecs.umich.edu default: 11907639Sgblack@eecs.umich.edu panic("swr: bad offset"); 11917639Sgblack@eecs.umich.edu } 11927639Sgblack@eecs.umich.edu#elif BYTE_ORDER == LITTLE_ENDIAN 11937639Sgblack@eecs.umich.edu switch(offset) 11947639Sgblack@eecs.umich.edu { 11957760SGiacomo.Gabrielli@arm.com case 0: 11967639Sgblack@eecs.umich.edu Mem = Rt; 11977639Sgblack@eecs.umich.edu break; 11987640Sgblack@eecs.umich.edu 119913544Sgabeblack@google.com case 1: 12007639Sgblack@eecs.umich.edu mem_word &= 0x000F; 12017639Sgblack@eecs.umich.edu mem_word |= (Rt << 4); 12027639Sgblack@eecs.umich.edu Mem = mem_word; 12037639Sgblack@eecs.umich.edu break; 12047639Sgblack@eecs.umich.edu 12057639Sgblack@eecs.umich.edu case 2: 12067639Sgblack@eecs.umich.edu mem_word &= 0x00FF; 12077639Sgblack@eecs.umich.edu mem_word |= (Rt << 8); 12087639Sgblack@eecs.umich.edu Mem = mem_word; 12097639Sgblack@eecs.umich.edu break; 12107639Sgblack@eecs.umich.edu 12117639Sgblack@eecs.umich.edu case 3: 12127639Sgblack@eecs.umich.edu mem_word &= 0x0FFF; 12137639Sgblack@eecs.umich.edu mem_word |= (Rt << 12); 12147639Sgblack@eecs.umich.edu Mem = mem_word; 12157639Sgblack@eecs.umich.edu break; 12167639Sgblack@eecs.umich.edu 12177639Sgblack@eecs.umich.edu default: 12187639Sgblack@eecs.umich.edu panic("swr: bad offset"); 12197639Sgblack@eecs.umich.edu } 12207639Sgblack@eecs.umich.edu#endif 12217639Sgblack@eecs.umich.edu }},{{ EA = (Rs + disp) & ~3;}},mem_flags = NO_ALIGN_FAULT); 12227639Sgblack@eecs.umich.edu } 122313544Sgabeblack@google.com 12247639Sgblack@eecs.umich.edu format WarnUnimpl { 12257639Sgblack@eecs.umich.edu 0x7: cache(); 122613544Sgabeblack@google.com } 12277639Sgblack@eecs.umich.edu 12287639Sgblack@eecs.umich.edu } 12297639Sgblack@eecs.umich.edu 12307639Sgblack@eecs.umich.edu 0x6: decode OPCODE_LO default FailUnimpl::reserved() { 123113544Sgabeblack@google.com 0x0: FailUnimpl::ll(); 12327639Sgblack@eecs.umich.edu 123313544Sgabeblack@google.com format LoadFloatMemory { 12347639Sgblack@eecs.umich.edu 0x1: lwc1({{ Ft.uw = Mem.uw; }}); 12357639Sgblack@eecs.umich.edu 0x5: ldc1({{ Ft.ud = Mem.ud; }}); 12367639Sgblack@eecs.umich.edu } 12377639Sgblack@eecs.umich.edu } 12387639Sgblack@eecs.umich.edu 12397639Sgblack@eecs.umich.edu 12407639Sgblack@eecs.umich.edu 0x7: decode OPCODE_LO default FailUnimpl::reserved() { 12417639Sgblack@eecs.umich.edu 0x0: FailUnimpl::sc(); 12427639Sgblack@eecs.umich.edu 12437639Sgblack@eecs.umich.edu format StoreFloatMemory { 12447639Sgblack@eecs.umich.edu 0x1: swc1({{ Mem.uw = Ft.uw; }}); 12457639Sgblack@eecs.umich.edu 0x5: sdc1({{ Mem.ud = Ft.ud; }}); 12467639Sgblack@eecs.umich.edu } 124713544Sgabeblack@google.com } 124813544Sgabeblack@google.com} 12497639Sgblack@eecs.umich.edu 12507639Sgblack@eecs.umich.edu 12517639Sgblack@eecs.umich.edu