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