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