12686Sksewell@umich.edu// -*- mode:c++ -*- 22100SN/A 35254Sksewell@umich.edu// Copyright (c) 2007 MIPS Technologies, Inc. 45254Sksewell@umich.edu// All rights reserved. 55254Sksewell@umich.edu// 65254Sksewell@umich.edu// Redistribution and use in source and binary forms, with or without 75254Sksewell@umich.edu// modification, are permitted provided that the following conditions are 85254Sksewell@umich.edu// met: redistributions of source code must retain the above copyright 95254Sksewell@umich.edu// notice, this list of conditions and the following disclaimer; 105254Sksewell@umich.edu// redistributions in binary form must reproduce the above copyright 115254Sksewell@umich.edu// notice, this list of conditions and the following disclaimer in the 125254Sksewell@umich.edu// documentation and/or other materials provided with the distribution; 135254Sksewell@umich.edu// neither the name of the copyright holders nor the names of its 145254Sksewell@umich.edu// contributors may be used to endorse or promote products derived from 155254Sksewell@umich.edu// this software without specific prior written permission. 165254Sksewell@umich.edu// 175254Sksewell@umich.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 185254Sksewell@umich.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 195254Sksewell@umich.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 205254Sksewell@umich.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 215254Sksewell@umich.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 225254Sksewell@umich.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 235254Sksewell@umich.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 245254Sksewell@umich.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 255254Sksewell@umich.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 265254Sksewell@umich.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 275254Sksewell@umich.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 285254Sksewell@umich.edu// 295254Sksewell@umich.edu// Authors: Korey Sewell 305254Sksewell@umich.edu// Brett Miller 315254Sksewell@umich.edu// Jaidev Patwardhan 322706Sksewell@umich.edu 332022SN/A//////////////////////////////////////////////////////////////////// 342022SN/A// 352043SN/A// The actual MIPS32 ISA decoder 362024SN/A// ----------------------------- 372024SN/A// The following instructions are specified in the MIPS32 ISA 382043SN/A// Specification. Decoding closely follows the style specified 392686Sksewell@umich.edu// in the MIPS32 ISA specification document starting with Table 404661Sksewell@umich.edu// A-2 (document available @ http://www.mips.com) 412022SN/A// 422083SN/Adecode OPCODE_HI default Unknown::unknown() { 432686Sksewell@umich.edu //Table A-2 442101SN/A 0x0: decode OPCODE_LO { 452043SN/A 0x0: decode FUNCTION_HI { 462043SN/A 0x0: decode FUNCTION_LO { 472101SN/A 0x1: decode MOVCI { 482101SN/A format BasicOp { 496384Sgblack@eecs.umich.edu 0: movf({{ 506384Sgblack@eecs.umich.edu Rd = (getCondCode(FCSR, CC) == 0) ? Rd : Rs; 516384Sgblack@eecs.umich.edu }}); 526384Sgblack@eecs.umich.edu 1: movt({{ 536384Sgblack@eecs.umich.edu Rd = (getCondCode(FCSR, CC) == 1) ? Rd : Rs; 546384Sgblack@eecs.umich.edu }}); 552101SN/A } 562101SN/A } 572101SN/A 582046SN/A format BasicOp { 592686Sksewell@umich.edu //Table A-3 Note: "Specific encodings of the rd, rs, and 602686Sksewell@umich.edu //rt fields are used to distinguish SLL, SSNOP, and EHB 612686Sksewell@umich.edu //functions 622470SN/A 0x0: decode RS { 632686Sksewell@umich.edu 0x0: decode RT_RD { 644661Sksewell@umich.edu 0x0: decode SA default Nop::nop() { 655222Sksewell@umich.edu 0x1: ssnop({{;}}); 665222Sksewell@umich.edu 0x3: ehb({{;}}); 672686Sksewell@umich.edu } 6813389Sgabeblack@google.com default: sll({{ Rd = Rt << SA; }}); 692470SN/A } 702241SN/A } 712101SN/A 722495SN/A 0x2: decode RS_SRL { 732495SN/A 0x0:decode SRL { 7413389Sgabeblack@google.com 0: srl({{ Rd = Rt >> SA; }}); 752101SN/A 766384Sgblack@eecs.umich.edu //Hardcoded assuming 32-bit ISA, 776384Sgblack@eecs.umich.edu //probably need parameter here 786384Sgblack@eecs.umich.edu 1: rotr({{ 7913389Sgabeblack@google.com Rd = (Rt << (32 - SA)) | (Rt >> SA); 806384Sgblack@eecs.umich.edu }}); 812495SN/A } 822101SN/A } 832101SN/A 842495SN/A 0x3: decode RS { 852495SN/A 0x0: sra({{ 862495SN/A uint32_t temp = Rt >> SA; 872495SN/A if ( (Rt & 0x80000000) > 0 ) { 882495SN/A uint32_t mask = 0x80000000; 892495SN/A for(int i=0; i < SA; i++) { 902495SN/A temp |= mask; 912495SN/A mask = mask >> 1; 922495SN/A } 932495SN/A } 942495SN/A Rd = temp; 952495SN/A }}); 962495SN/A } 972101SN/A 9813389Sgabeblack@google.com 0x4: sllv({{ Rd = Rt << Rs<4:0>; }}); 992101SN/A 1002101SN/A 0x6: decode SRLV { 10113389Sgabeblack@google.com 0: srlv({{ Rd = Rt >> Rs<4:0>; }}); 1022101SN/A 1036384Sgblack@eecs.umich.edu //Hardcoded assuming 32-bit ISA, 1046384Sgblack@eecs.umich.edu //probably need parameter here 1056384Sgblack@eecs.umich.edu 1: rotrv({{ 10613389Sgabeblack@google.com Rd = (Rt << (32 - Rs<4:0>)) | (Rt >> Rs<4:0>); 1076384Sgblack@eecs.umich.edu }}); 1082101SN/A } 1092101SN/A 1102495SN/A 0x7: srav({{ 1112495SN/A int shift_amt = Rs<4:0>; 1122495SN/A 1132495SN/A uint32_t temp = Rt >> shift_amt; 1142495SN/A 1156384Sgblack@eecs.umich.edu if ((Rt & 0x80000000) > 0) { 1166384Sgblack@eecs.umich.edu uint32_t mask = 0x80000000; 1176384Sgblack@eecs.umich.edu for (int i = 0; i < shift_amt; i++) { 1186384Sgblack@eecs.umich.edu temp |= mask; 1196384Sgblack@eecs.umich.edu mask = mask >> 1; 1202495SN/A } 1216384Sgblack@eecs.umich.edu } 1222495SN/A Rd = temp; 1232495SN/A }}); 1242043SN/A } 1252043SN/A } 1262025SN/A 1272043SN/A 0x1: decode FUNCTION_LO { 1282686Sksewell@umich.edu //Table A-3 Note: "Specific encodings of the hint field are 1292686Sksewell@umich.edu //used to distinguish JR from JR.HB and JALR from JALR.HB" 1302123SN/A format Jump { 1312101SN/A 0x0: decode HINT { 1326376Sgblack@eecs.umich.edu 0x1: jr_hb({{ 1336376Sgblack@eecs.umich.edu Config1Reg config1 = Config1; 1346376Sgblack@eecs.umich.edu if (config1.ca == 0) { 1357792Sgblack@eecs.umich.edu NNPC = Rs; 1366376Sgblack@eecs.umich.edu } else { 1376376Sgblack@eecs.umich.edu panic("MIPS16e not supported\n"); 1386376Sgblack@eecs.umich.edu } 1396376Sgblack@eecs.umich.edu }}, IsReturn, ClearHazards); 1406376Sgblack@eecs.umich.edu default: jr({{ 1416376Sgblack@eecs.umich.edu Config1Reg config1 = Config1; 1426376Sgblack@eecs.umich.edu if (config1.ca == 0) { 1437792Sgblack@eecs.umich.edu NNPC = Rs; 1446376Sgblack@eecs.umich.edu } else { 1456376Sgblack@eecs.umich.edu panic("MIPS16e not supported\n"); 1466376Sgblack@eecs.umich.edu } 1476376Sgblack@eecs.umich.edu }}, IsReturn); 1482101SN/A } 1492042SN/A 1502101SN/A 0x1: decode HINT { 1517720Sgblack@eecs.umich.edu 0x1: jalr_hb({{ 1527792Sgblack@eecs.umich.edu Rd = NNPC; 1537792Sgblack@eecs.umich.edu NNPC = Rs; 1547720Sgblack@eecs.umich.edu }}, IsCall, ClearHazards); 1557720Sgblack@eecs.umich.edu default: jalr({{ 1567792Sgblack@eecs.umich.edu Rd = NNPC; 1577792Sgblack@eecs.umich.edu NNPC = Rs; 1587720Sgblack@eecs.umich.edu }}, IsCall); 1592101SN/A } 1602101SN/A } 1612042SN/A 1622101SN/A format BasicOp { 1632686Sksewell@umich.edu 0x2: movz({{ Rd = (Rt == 0) ? Rs : Rd; }}); 1642686Sksewell@umich.edu 0x3: movn({{ Rd = (Rt != 0) ? Rs : Rd; }}); 1658901Sandreas.hansson@arm.com 0x4: decode FullSystemInt { 16611877Sbrandon.potter@amd.com 0: syscall_se({{ xc->syscall(R2, &fault); }}, 1678564Sgblack@eecs.umich.edu IsSerializeAfter, IsNonSpeculative); 16810474Sandreas.hansson@arm.com default: syscall({{ fault = std::make_shared<SystemCallFault>(); }}); 1698564Sgblack@eecs.umich.edu } 1702686Sksewell@umich.edu 0x7: sync({{ ; }}, IsMemBarrier); 17110474Sandreas.hansson@arm.com 0x5: break({{fault = std::make_shared<BreakpointFault>();}}); 1722101SN/A } 1732083SN/A 1742043SN/A } 1752025SN/A 1762043SN/A 0x2: decode FUNCTION_LO { 1776384Sgblack@eecs.umich.edu 0x0: HiLoRsSelOp::mfhi({{ Rd = HI_RS_SEL; }}, 1786384Sgblack@eecs.umich.edu IntMultOp, IsIprAccess); 1794661Sksewell@umich.edu 0x1: HiLoRdSelOp::mthi({{ HI_RD_SEL = Rs; }}); 1806384Sgblack@eecs.umich.edu 0x2: HiLoRsSelOp::mflo({{ Rd = LO_RS_SEL; }}, 1816384Sgblack@eecs.umich.edu IntMultOp, IsIprAccess); 1824661Sksewell@umich.edu 0x3: HiLoRdSelOp::mtlo({{ LO_RD_SEL = Rs; }}); 1832083SN/A } 1842025SN/A 1852043SN/A 0x3: decode FUNCTION_LO { 1864661Sksewell@umich.edu format HiLoRdSelValOp { 1878588Sgblack@eecs.umich.edu 0x0: mult({{ val = Rs_sd * Rt_sd; }}, IntMultOp); 1888588Sgblack@eecs.umich.edu 0x1: multu({{ val = Rs_ud * Rt_ud; }}, IntMultOp); 1894661Sksewell@umich.edu } 1904661Sksewell@umich.edu 1912686Sksewell@umich.edu format HiLoOp { 1926384Sgblack@eecs.umich.edu 0x2: div({{ 1938588Sgblack@eecs.umich.edu if (Rt_sd != 0) { 1948588Sgblack@eecs.umich.edu HI0 = Rs_sd % Rt_sd; 1958588Sgblack@eecs.umich.edu LO0 = Rs_sd / Rt_sd; 1966384Sgblack@eecs.umich.edu } 1975222Sksewell@umich.edu }}, IntDivOp); 1985222Sksewell@umich.edu 1996384Sgblack@eecs.umich.edu 0x3: divu({{ 2008588Sgblack@eecs.umich.edu if (Rt_ud != 0) { 2018588Sgblack@eecs.umich.edu HI0 = Rs_ud % Rt_ud; 2028588Sgblack@eecs.umich.edu LO0 = Rs_ud / Rt_ud; 2036384Sgblack@eecs.umich.edu } 2045222Sksewell@umich.edu }}, IntDivOp); 2052101SN/A } 2062084SN/A } 2072025SN/A 2082495SN/A 0x4: decode HINT { 2092495SN/A 0x0: decode FUNCTION_LO { 2102495SN/A format IntOp { 2116384Sgblack@eecs.umich.edu 0x0: add({{ 21213389Sgabeblack@google.com uint32_t result; 2138564Sgblack@eecs.umich.edu Rd = result = Rs + Rt; 2148738Sgblack@eecs.umich.edu if (FullSystem && 2158564Sgblack@eecs.umich.edu findOverflow(32, result, Rs, Rt)) { 21610474Sandreas.hansson@arm.com fault = std::make_shared<IntegerOverflowFault>(); 2176384Sgblack@eecs.umich.edu } 2186384Sgblack@eecs.umich.edu }}); 21913389Sgabeblack@google.com 0x1: addu({{ Rd = Rs_sw + Rt_sw;}}); 2205222Sksewell@umich.edu 0x2: sub({{ 22113389Sgabeblack@google.com uint32_t result; 2228564Sgblack@eecs.umich.edu Rd = result = Rs - Rt; 2238738Sgblack@eecs.umich.edu if (FullSystem && 2248564Sgblack@eecs.umich.edu findOverflow(32, result, Rs, ~Rt)) { 22510474Sandreas.hansson@arm.com fault = std::make_shared<IntegerOverflowFault>(); 2266384Sgblack@eecs.umich.edu } 2276384Sgblack@eecs.umich.edu }}); 22813389Sgabeblack@google.com 0x3: subu({{ Rd = Rs_sw - Rt_sw; }}); 2296384Sgblack@eecs.umich.edu 0x4: and({{ Rd = Rs & Rt; }}); 2306384Sgblack@eecs.umich.edu 0x5: or({{ Rd = Rs | Rt; }}); 2316384Sgblack@eecs.umich.edu 0x6: xor({{ Rd = Rs ^ Rt; }}); 2326384Sgblack@eecs.umich.edu 0x7: nor({{ Rd = ~(Rs | Rt); }}); 2332495SN/A } 2342101SN/A } 2352043SN/A } 2362025SN/A 2372495SN/A 0x5: decode HINT { 2382495SN/A 0x0: decode FUNCTION_LO { 2392495SN/A format IntOp{ 24013389Sgabeblack@google.com 0x2: slt({{ Rd = (Rs_sw < Rt_sw) ? 1 : 0 }}); 24113389Sgabeblack@google.com 0x3: sltu({{ Rd = (Rs < Rt) ? 1 : 0 }}); 2422495SN/A } 2432101SN/A } 2442084SN/A } 2452024SN/A 2462043SN/A 0x6: decode FUNCTION_LO { 2472239SN/A format Trap { 24813389Sgabeblack@google.com 0x0: tge({{ cond = (Rs_sw >= Rt_sw); }}); 24913389Sgabeblack@google.com 0x1: tgeu({{ cond = (Rs >= Rt); }}); 2508588Sgblack@eecs.umich.edu 0x2: tlt({{ cond = (Rs_sw < Rt_sw); }}); 25113389Sgabeblack@google.com 0x3: tltu({{ cond = (Rs < Rt); }}); 2528588Sgblack@eecs.umich.edu 0x4: teq({{ cond = (Rs_sw == Rt_sw); }}); 2538588Sgblack@eecs.umich.edu 0x6: tne({{ cond = (Rs_sw != Rt_sw); }}); 2542101SN/A } 2552043SN/A } 2562043SN/A } 2572025SN/A 2582043SN/A 0x1: decode REGIMM_HI { 2592043SN/A 0x0: decode REGIMM_LO { 2602101SN/A format Branch { 2618588Sgblack@eecs.umich.edu 0x0: bltz({{ cond = (Rs_sw < 0); }}); 2628588Sgblack@eecs.umich.edu 0x1: bgez({{ cond = (Rs_sw >= 0); }}); 2638588Sgblack@eecs.umich.edu 0x2: bltzl({{ cond = (Rs_sw < 0); }}, Likely); 2648588Sgblack@eecs.umich.edu 0x3: bgezl({{ cond = (Rs_sw >= 0); }}, Likely); 2652101SN/A } 2662043SN/A } 2672025SN/A 2682043SN/A 0x1: decode REGIMM_LO { 2695222Sksewell@umich.edu format TrapImm { 2708588Sgblack@eecs.umich.edu 0x0: tgei( {{ cond = (Rs_sw >= (int16_t)INTIMM); }}); 2716384Sgblack@eecs.umich.edu 0x1: tgeiu({{ 27213389Sgabeblack@google.com cond = (Rs >= (uint32_t)(int32_t)(int16_t)INTIMM); 2736384Sgblack@eecs.umich.edu }}); 2748588Sgblack@eecs.umich.edu 0x2: tlti( {{ cond = (Rs_sw < (int16_t)INTIMM); }}); 2756384Sgblack@eecs.umich.edu 0x3: tltiu({{ 27613389Sgabeblack@google.com cond = (Rs < (uint32_t)(int32_t)(int16_t)INTIMM); 2776384Sgblack@eecs.umich.edu }}); 2788588Sgblack@eecs.umich.edu 0x4: teqi( {{ cond = (Rs_sw == (int16_t)INTIMM); }}); 2798588Sgblack@eecs.umich.edu 0x6: tnei( {{ cond = (Rs_sw != (int16_t)INTIMM); }}); 2802101SN/A } 2812043SN/A } 2822043SN/A 2832043SN/A 0x2: decode REGIMM_LO { 2842101SN/A format Branch { 2858588Sgblack@eecs.umich.edu 0x0: bltzal({{ cond = (Rs_sw < 0); }}, Link); 2862686Sksewell@umich.edu 0x1: decode RS { 2872686Sksewell@umich.edu 0x0: bal ({{ cond = 1; }}, IsCall, Link); 2888588Sgblack@eecs.umich.edu default: bgezal({{ cond = (Rs_sw >= 0); }}, Link); 2892686Sksewell@umich.edu } 2908588Sgblack@eecs.umich.edu 0x2: bltzall({{ cond = (Rs_sw < 0); }}, Link, Likely); 2918588Sgblack@eecs.umich.edu 0x3: bgezall({{ cond = (Rs_sw >= 0); }}, Link, Likely); 2922101SN/A } 2932043SN/A } 2942043SN/A 2952043SN/A 0x3: decode REGIMM_LO { 2966384Sgblack@eecs.umich.edu // from Table 5-4 MIPS32 REGIMM Encoding of rt Field 2976384Sgblack@eecs.umich.edu // (DSP ASE MANUAL) 2984661Sksewell@umich.edu 0x4: DspBranch::bposge32({{ cond = (dspctl<5:0> >= 32); }}); 2992101SN/A format WarnUnimpl { 3002101SN/A 0x7: synci(); 3012101SN/A } 3022043SN/A } 3032043SN/A } 3042043SN/A 3052123SN/A format Jump { 3067792Sgblack@eecs.umich.edu 0x2: j({{ NNPC = (NPC & 0xF0000000) | (JMPTARG << 2); }}); 3077792Sgblack@eecs.umich.edu 0x3: jal({{ NNPC = (NPC & 0xF0000000) | (JMPTARG << 2); }}, 3087792Sgblack@eecs.umich.edu IsCall, Link); 3092043SN/A } 3102043SN/A 3112100SN/A format Branch { 3122686Sksewell@umich.edu 0x4: decode RS_RT { 3132686Sksewell@umich.edu 0x0: b({{ cond = 1; }}); 3148588Sgblack@eecs.umich.edu default: beq({{ cond = (Rs_sw == Rt_sw); }}); 3152686Sksewell@umich.edu } 3168588Sgblack@eecs.umich.edu 0x5: bne({{ cond = (Rs_sw != Rt_sw); }}); 3178588Sgblack@eecs.umich.edu 0x6: blez({{ cond = (Rs_sw <= 0); }}); 3188588Sgblack@eecs.umich.edu 0x7: bgtz({{ cond = (Rs_sw > 0); }}); 3192043SN/A } 3202084SN/A } 3212024SN/A 3222101SN/A 0x1: decode OPCODE_LO { 3232686Sksewell@umich.edu format IntImmOp { 3245222Sksewell@umich.edu 0x0: addi({{ 32513389Sgabeblack@google.com uint32_t result; 3268564Sgblack@eecs.umich.edu Rt = result = Rs + imm; 3278738Sgblack@eecs.umich.edu if (FullSystem && 3288564Sgblack@eecs.umich.edu findOverflow(32, result, Rs, imm)) { 32910474Sandreas.hansson@arm.com fault = std::make_shared<IntegerOverflowFault>(); 3306384Sgblack@eecs.umich.edu } 3316384Sgblack@eecs.umich.edu }}); 33213389Sgabeblack@google.com 0x1: addiu({{ Rt = Rs_sw + imm; }}); 33313389Sgabeblack@google.com 0x2: slti({{ Rt = (Rs_sw < imm) ? 1 : 0 }}); 33413389Sgabeblack@google.com 0x3: sltiu({{ Rt = (Rs < (uint32_t)sextImm) ? 1 : 0;}}); 33513389Sgabeblack@google.com 0x4: andi({{ Rt = Rs_sw & zextImm; }}); 33613389Sgabeblack@google.com 0x5: ori({{ Rt = Rs_sw | zextImm; }}); 33713389Sgabeblack@google.com 0x6: xori({{ Rt = Rs_sw ^ zextImm; }}); 3382495SN/A 3392495SN/A 0x7: decode RS { 3406384Sgblack@eecs.umich.edu 0x0: lui({{ Rt = imm << 16; }}); 3412495SN/A } 3422084SN/A } 3432084SN/A } 3442024SN/A 3452101SN/A 0x2: decode OPCODE_LO { 3462101SN/A //Table A-11 MIPS32 COP0 Encoding of rs Field 3472101SN/A 0x0: decode RS_MSB { 3482101SN/A 0x0: decode RS { 3496384Sgblack@eecs.umich.edu format CP0Control { 3506384Sgblack@eecs.umich.edu 0x0: mfc0({{ 3516384Sgblack@eecs.umich.edu Config3Reg config3 = Config3; 3526384Sgblack@eecs.umich.edu PageGrainReg pageGrain = PageGrain; 3536384Sgblack@eecs.umich.edu Rt = CP0_RD_SEL; 3546384Sgblack@eecs.umich.edu /* Hack for PageMask */ 3556384Sgblack@eecs.umich.edu if (RD == 5) { 3566384Sgblack@eecs.umich.edu // PageMask 3576384Sgblack@eecs.umich.edu if (config3.sp == 0 || pageGrain.esp == 0) 3586384Sgblack@eecs.umich.edu Rt &= 0xFFFFE7FF; 3596384Sgblack@eecs.umich.edu } 3606384Sgblack@eecs.umich.edu }}); 36111320Ssteve.reinhardt@amd.com 0x4: mtc0({{ 3626384Sgblack@eecs.umich.edu CP0_RD_SEL = Rt; 3636384Sgblack@eecs.umich.edu CauseReg cause = Cause; 3646384Sgblack@eecs.umich.edu IntCtlReg intCtl = IntCtl; 3656384Sgblack@eecs.umich.edu if (RD == 11) { 3666384Sgblack@eecs.umich.edu // Compare 3676384Sgblack@eecs.umich.edu if (cause.ti == 1) { 3686384Sgblack@eecs.umich.edu cause.ti = 0; 3696384Sgblack@eecs.umich.edu int offset = 10; // corresponding to cause.ip0 3706384Sgblack@eecs.umich.edu offset += intCtl.ipti - 2; 3716384Sgblack@eecs.umich.edu replaceBits(cause, offset, offset, 0); 3726384Sgblack@eecs.umich.edu } 3736384Sgblack@eecs.umich.edu } 3746384Sgblack@eecs.umich.edu Cause = cause; 3756384Sgblack@eecs.umich.edu }}); 3766384Sgblack@eecs.umich.edu } 3776384Sgblack@eecs.umich.edu format CP0Unimpl { 3786384Sgblack@eecs.umich.edu 0x1: dmfc0(); 3796384Sgblack@eecs.umich.edu 0x5: dmtc0(); 3806384Sgblack@eecs.umich.edu default: unknown(); 3816384Sgblack@eecs.umich.edu } 3826384Sgblack@eecs.umich.edu format MT_MFTR { 3836384Sgblack@eecs.umich.edu // Decode MIPS MT MFTR instruction into sub-instructions 3844661Sksewell@umich.edu 0x8: decode MT_U { 3856376Sgblack@eecs.umich.edu 0x0: mftc0({{ 38613899Sgabeblack@google.com data = readRegOtherThread(xc, RegId(MiscRegClass, 38712104Snathanael.premillieu@arm.com (RT << 3 | SEL))); 3886376Sgblack@eecs.umich.edu }}); 3894661Sksewell@umich.edu 0x1: decode SEL { 3906384Sgblack@eecs.umich.edu 0x0: mftgpr({{ 39113899Sgabeblack@google.com data = readRegOtherThread(xc, 39212104Snathanael.premillieu@arm.com RegId(IntRegClass, RT)); 3936384Sgblack@eecs.umich.edu }}); 3944661Sksewell@umich.edu 0x1: decode RT { 39512104Snathanael.premillieu@arm.com 0x0: mftlo_dsp0({{ 39613899Sgabeblack@google.com data = readRegOtherThread(xc, 39712104Snathanael.premillieu@arm.com RegId(IntRegClass, INTREG_DSP_LO0)); 39812104Snathanael.premillieu@arm.com }}); 39912104Snathanael.premillieu@arm.com 0x1: mfthi_dsp0({{ 40013899Sgabeblack@google.com data = readRegOtherThread(xc, 40112104Snathanael.premillieu@arm.com RegId(IntRegClass, INTREG_DSP_HI0)); 40212104Snathanael.premillieu@arm.com }}); 40312104Snathanael.premillieu@arm.com 0x2: mftacx_dsp0({{ 40413899Sgabeblack@google.com data = readRegOtherThread(xc, 40512104Snathanael.premillieu@arm.com RegId(IntRegClass, INTREG_DSP_ACX0)); 40612104Snathanael.premillieu@arm.com }}); 40712104Snathanael.premillieu@arm.com 0x4: mftlo_dsp1({{ 40813899Sgabeblack@google.com data = readRegOtherThread(xc, 40912104Snathanael.premillieu@arm.com RegId(IntRegClass, INTREG_DSP_LO1)); 41012104Snathanael.premillieu@arm.com }}); 41112104Snathanael.premillieu@arm.com 0x5: mfthi_dsp1({{ 41213899Sgabeblack@google.com data = readRegOtherThread(xc, 41312104Snathanael.premillieu@arm.com RegId(IntRegClass, INTREG_DSP_HI1)); 41412104Snathanael.premillieu@arm.com }}); 41512104Snathanael.premillieu@arm.com 0x6: mftacx_dsp1({{ 41613899Sgabeblack@google.com data = readRegOtherThread(xc, 41712104Snathanael.premillieu@arm.com RegId(IntRegClass, INTREG_DSP_ACX1)); 41812104Snathanael.premillieu@arm.com }}); 41912104Snathanael.premillieu@arm.com 0x8: mftlo_dsp2({{ 42013899Sgabeblack@google.com data = readRegOtherThread(xc, 42112104Snathanael.premillieu@arm.com RegId(IntRegClass, INTREG_DSP_LO2)); 42212104Snathanael.premillieu@arm.com }}); 42312104Snathanael.premillieu@arm.com 0x9: mfthi_dsp2({{ 42413899Sgabeblack@google.com data = readRegOtherThread(xc, 42512104Snathanael.premillieu@arm.com RegId(IntRegClass, INTREG_DSP_HI2)); 42612104Snathanael.premillieu@arm.com }}); 42712104Snathanael.premillieu@arm.com 0x10: mftacx_dsp2({{ 42813899Sgabeblack@google.com data = readRegOtherThread(xc, 42912104Snathanael.premillieu@arm.com RegId(IntRegClass, INTREG_DSP_ACX2)); 43012104Snathanael.premillieu@arm.com }}); 43112104Snathanael.premillieu@arm.com 0x12: mftlo_dsp3({{ 43213899Sgabeblack@google.com data = readRegOtherThread(xc, 43312104Snathanael.premillieu@arm.com RegId(IntRegClass, INTREG_DSP_LO3)); 43412104Snathanael.premillieu@arm.com }}); 43512104Snathanael.premillieu@arm.com 0x13: mfthi_dsp3({{ 43613899Sgabeblack@google.com data = readRegOtherThread(xc, 43712104Snathanael.premillieu@arm.com RegId(IntRegClass, INTREG_DSP_HI3)); 43812104Snathanael.premillieu@arm.com }}); 43912104Snathanael.premillieu@arm.com 0x14: mftacx_dsp3({{ 44013899Sgabeblack@google.com data = readRegOtherThread(xc, 44112104Snathanael.premillieu@arm.com RegId(IntRegClass, INTREG_DSP_ACX3)); 44212104Snathanael.premillieu@arm.com }}); 44312104Snathanael.premillieu@arm.com 0x16: mftdsp({{ 44413899Sgabeblack@google.com data = readRegOtherThread(xc, 44512104Snathanael.premillieu@arm.com RegId(IntRegClass, INTREG_DSP_CONTROL)); 44612104Snathanael.premillieu@arm.com }}); 4476384Sgblack@eecs.umich.edu default: CP0Unimpl::unknown(); 4482686Sksewell@umich.edu } 4494661Sksewell@umich.edu 0x2: decode MT_H { 45012104Snathanael.premillieu@arm.com 0x0: mftc1({{ 45113899Sgabeblack@google.com data = readRegOtherThread(xc, 45212104Snathanael.premillieu@arm.com RegId(FloatRegClass, RT)); 4536384Sgblack@eecs.umich.edu }}); 45412104Snathanael.premillieu@arm.com 0x1: mfthc1({{ 45513899Sgabeblack@google.com data = readRegOtherThread(xc, 45612104Snathanael.premillieu@arm.com RegId(FloatRegClass, RT)); 4576384Sgblack@eecs.umich.edu }}); 4586384Sgblack@eecs.umich.edu } 4596384Sgblack@eecs.umich.edu 0x3: cftc1({{ 46013899Sgabeblack@google.com uint32_t fcsr_val = readRegOtherThread(xc, 46112104Snathanael.premillieu@arm.com RegId(FloatRegClass, FLOATREG_FCSR)); 4626384Sgblack@eecs.umich.edu switch (RT) { 4636384Sgblack@eecs.umich.edu case 0: 46413899Sgabeblack@google.com data = readRegOtherThread(xc, 46512104Snathanael.premillieu@arm.com RegId(MiscRegClass, FLOATREG_FIR)); 4666384Sgblack@eecs.umich.edu break; 4676384Sgblack@eecs.umich.edu case 25: 4686384Sgblack@eecs.umich.edu data = (fcsr_val & 0xFE000000 >> 24) | 4696384Sgblack@eecs.umich.edu (fcsr_val & 0x00800000 >> 23); 4706384Sgblack@eecs.umich.edu break; 4716384Sgblack@eecs.umich.edu case 26: 4726384Sgblack@eecs.umich.edu data = fcsr_val & 0x0003F07C; 4736384Sgblack@eecs.umich.edu break; 4746384Sgblack@eecs.umich.edu case 28: 4756384Sgblack@eecs.umich.edu data = (fcsr_val & 0x00000F80) | 4766384Sgblack@eecs.umich.edu (fcsr_val & 0x01000000 >> 21) | 4776384Sgblack@eecs.umich.edu (fcsr_val & 0x00000003); 4786384Sgblack@eecs.umich.edu break; 4796384Sgblack@eecs.umich.edu case 31: 4806384Sgblack@eecs.umich.edu data = fcsr_val; 4816384Sgblack@eecs.umich.edu break; 4826384Sgblack@eecs.umich.edu default: 4836384Sgblack@eecs.umich.edu fatal("FP Control Value (%d) Not Valid"); 4846384Sgblack@eecs.umich.edu } 4856384Sgblack@eecs.umich.edu }}); 4866384Sgblack@eecs.umich.edu default: CP0Unimpl::unknown(); 4872101SN/A } 4886384Sgblack@eecs.umich.edu } 4892686Sksewell@umich.edu } 4902027SN/A 4916384Sgblack@eecs.umich.edu format MT_MTTR { 4926384Sgblack@eecs.umich.edu // Decode MIPS MT MTTR instruction into sub-instructions 4934661Sksewell@umich.edu 0xC: decode MT_U { 49413899Sgabeblack@google.com 0x0: mttc0({{ setRegOtherThread(xc, 49512104Snathanael.premillieu@arm.com RegId(MiscRegClass, (RD << 3 | SEL)), Rt); 4964661Sksewell@umich.edu }}); 4974661Sksewell@umich.edu 0x1: decode SEL { 49813899Sgabeblack@google.com 0x0: mttgpr({{ setRegOtherThread(xc, 49912104Snathanael.premillieu@arm.com RegId(IntRegClass, RD), Rt); 50012104Snathanael.premillieu@arm.com }}); 5014661Sksewell@umich.edu 0x1: decode RT { 50213899Sgabeblack@google.com 0x0: mttlo_dsp0({{ setRegOtherThread(xc, 50312104Snathanael.premillieu@arm.com RegId(IntRegClass, INTREG_DSP_LO0), Rt); 50412104Snathanael.premillieu@arm.com }}); 50513899Sgabeblack@google.com 0x1: mtthi_dsp0({{ setRegOtherThread(xc, 50612104Snathanael.premillieu@arm.com RegId(IntRegClass, INTREG_DSP_HI0), Rt); 50712104Snathanael.premillieu@arm.com }}); 50813899Sgabeblack@google.com 0x2: mttacx_dsp0({{ setRegOtherThread(xc, 50912104Snathanael.premillieu@arm.com RegId(IntRegClass, INTREG_DSP_ACX0), Rt); 51012104Snathanael.premillieu@arm.com }}); 51113899Sgabeblack@google.com 0x4: mttlo_dsp1({{ setRegOtherThread(xc, 51212104Snathanael.premillieu@arm.com RegId(IntRegClass, INTREG_DSP_LO1), Rt); 51312104Snathanael.premillieu@arm.com }}); 51413899Sgabeblack@google.com 0x5: mtthi_dsp1({{ setRegOtherThread(xc, 51512104Snathanael.premillieu@arm.com RegId(IntRegClass, INTREG_DSP_HI1), Rt); 51612104Snathanael.premillieu@arm.com }}); 51713899Sgabeblack@google.com 0x6: mttacx_dsp1({{ setRegOtherThread(xc, 51812104Snathanael.premillieu@arm.com RegId(IntRegClass, INTREG_DSP_ACX1), Rt); 51912104Snathanael.premillieu@arm.com }}); 52013899Sgabeblack@google.com 0x8: mttlo_dsp2({{ setRegOtherThread(xc, 52112104Snathanael.premillieu@arm.com RegId(IntRegClass, INTREG_DSP_LO2), Rt); 52212104Snathanael.premillieu@arm.com }}); 52313899Sgabeblack@google.com 0x9: mtthi_dsp2({{ setRegOtherThread(xc, 52412104Snathanael.premillieu@arm.com RegId(IntRegClass, INTREG_DSP_HI2), Rt); 52512104Snathanael.premillieu@arm.com }}); 52613899Sgabeblack@google.com 0x10: mttacx_dsp2({{ setRegOtherThread(xc, 52712104Snathanael.premillieu@arm.com RegId(IntRegClass, INTREG_DSP_ACX2), Rt); 52812104Snathanael.premillieu@arm.com }}); 52913899Sgabeblack@google.com 0x12: mttlo_dsp3({{ setRegOtherThread(xc, 53012104Snathanael.premillieu@arm.com RegId(IntRegClass, INTREG_DSP_LO3), Rt); 53112104Snathanael.premillieu@arm.com }}); 53213899Sgabeblack@google.com 0x13: mtthi_dsp3({{ setRegOtherThread(xc, 53312104Snathanael.premillieu@arm.com RegId(IntRegClass, INTREG_DSP_HI3), Rt); 53412104Snathanael.premillieu@arm.com }}); 53513899Sgabeblack@google.com 0x14: mttacx_dsp3({{ setRegOtherThread(xc, 53612104Snathanael.premillieu@arm.com RegId(IntRegClass, INTREG_DSP_ACX3), Rt); 53712104Snathanael.premillieu@arm.com }}); 53813899Sgabeblack@google.com 0x16: mttdsp({{ setRegOtherThread(xc, 53912104Snathanael.premillieu@arm.com RegId(IntRegClass, INTREG_DSP_CONTROL), Rt); 54012104Snathanael.premillieu@arm.com }}); 5416384Sgblack@eecs.umich.edu default: CP0Unimpl::unknown(); 5425222Sksewell@umich.edu 5434661Sksewell@umich.edu } 5446384Sgblack@eecs.umich.edu 0x2: mttc1({{ 54513899Sgabeblack@google.com uint64_t data = readRegOtherThread(xc, 54612104Snathanael.premillieu@arm.com RegId(FloatRegClass, RD)); 5478607Sgblack@eecs.umich.edu data = insertBits(data, MT_H ? 63 : 31, 5488607Sgblack@eecs.umich.edu MT_H ? 32 : 0, Rt); 54913899Sgabeblack@google.com setRegOtherThread(xc, RegId(FloatRegClass, RD), 5506384Sgblack@eecs.umich.edu data); 5516384Sgblack@eecs.umich.edu }}); 5526384Sgblack@eecs.umich.edu 0x3: cttc1({{ 5536384Sgblack@eecs.umich.edu uint32_t data; 5546384Sgblack@eecs.umich.edu switch (RD) { 5556384Sgblack@eecs.umich.edu case 25: 55613389Sgabeblack@google.com data = (Rt<7:1> << 25) | // move 31-25 5576384Sgblack@eecs.umich.edu (FCSR & 0x01000000) | // bit 24 5586384Sgblack@eecs.umich.edu (FCSR & 0x004FFFFF); // bit 22-0 5596384Sgblack@eecs.umich.edu break; 5606384Sgblack@eecs.umich.edu case 26: 5616384Sgblack@eecs.umich.edu data = (FCSR & 0xFFFC0000) | // move 31-18 56213389Sgabeblack@google.com Rt<17:12> << 12 | // bit 17-12 56313389Sgabeblack@google.com // bit 11-7 56413389Sgabeblack@google.com (FCSR & 0x00000F80) << 7 | 56513389Sgabeblack@google.com Rt<6:2> << 2 | // bit 6-2 5666384Sgblack@eecs.umich.edu (FCSR & 0x00000002); // bit 1...0 5676384Sgblack@eecs.umich.edu break; 5686384Sgblack@eecs.umich.edu case 28: 5696384Sgblack@eecs.umich.edu data = (FCSR & 0xFE000000) | // move 31-25 57013389Sgabeblack@google.com Rt<2:2> << 24 | // bit 24 57113389Sgabeblack@google.com // bit 23-12 57213389Sgabeblack@google.com (FCSR & 0x00FFF000) << 23 | 57313389Sgabeblack@google.com Rt<11:7> << 7 | // bit 24 5746384Sgblack@eecs.umich.edu (FCSR & 0x000007E) | 57513389Sgabeblack@google.com Rt<1:0>; // bit 22-0 5766384Sgblack@eecs.umich.edu break; 5776384Sgblack@eecs.umich.edu case 31: 57813389Sgabeblack@google.com data = Rt; 5796384Sgblack@eecs.umich.edu break; 5806384Sgblack@eecs.umich.edu default: 5816384Sgblack@eecs.umich.edu panic("FP Control Value (%d) " 5826384Sgblack@eecs.umich.edu "Not Available. Ignoring " 5836384Sgblack@eecs.umich.edu "Access to Floating Control " 5848607Sgblack@eecs.umich.edu "S""tatus Register", FS); 5856384Sgblack@eecs.umich.edu } 58613899Sgabeblack@google.com setRegOtherThread(xc, 58712104Snathanael.premillieu@arm.com RegId(FloatRegClass, FLOATREG_FCSR), data); 5886384Sgblack@eecs.umich.edu }}); 5896384Sgblack@eecs.umich.edu default: CP0Unimpl::unknown(); 5904661Sksewell@umich.edu } 5914661Sksewell@umich.edu } 5922101SN/A } 5934661Sksewell@umich.edu 0xB: decode RD { 5944661Sksewell@umich.edu format MT_Control { 5954661Sksewell@umich.edu 0x0: decode POS { 5964661Sksewell@umich.edu 0x0: decode SEL { 5974661Sksewell@umich.edu 0x1: decode SC { 5986376Sgblack@eecs.umich.edu 0x0: dvpe({{ 5996376Sgblack@eecs.umich.edu MVPControlReg mvpControl = MVPControl; 6006376Sgblack@eecs.umich.edu VPEConf0Reg vpeConf0 = VPEConf0; 6016376Sgblack@eecs.umich.edu Rt = MVPControl; 6026376Sgblack@eecs.umich.edu if (vpeConf0.mvp == 1) 6036376Sgblack@eecs.umich.edu mvpControl.evp = 0; 6046376Sgblack@eecs.umich.edu MVPControl = mvpControl; 6056376Sgblack@eecs.umich.edu }}); 6066376Sgblack@eecs.umich.edu 0x1: evpe({{ 6076376Sgblack@eecs.umich.edu MVPControlReg mvpControl = MVPControl; 6086376Sgblack@eecs.umich.edu VPEConf0Reg vpeConf0 = VPEConf0; 6096376Sgblack@eecs.umich.edu Rt = MVPControl; 6106376Sgblack@eecs.umich.edu if (vpeConf0.mvp == 1) 6116376Sgblack@eecs.umich.edu mvpControl.evp = 1; 6126376Sgblack@eecs.umich.edu MVPControl = mvpControl; 6136376Sgblack@eecs.umich.edu }}); 6145222Sksewell@umich.edu default:CP0Unimpl::unknown(); 6154661Sksewell@umich.edu } 6166384Sgblack@eecs.umich.edu default:CP0Unimpl::unknown(); 6174661Sksewell@umich.edu } 6186384Sgblack@eecs.umich.edu default:CP0Unimpl::unknown(); 6196384Sgblack@eecs.umich.edu } 6204661Sksewell@umich.edu 0x1: decode POS { 6214661Sksewell@umich.edu 0xF: decode SEL { 6224661Sksewell@umich.edu 0x1: decode SC { 6236376Sgblack@eecs.umich.edu 0x0: dmt({{ 6246376Sgblack@eecs.umich.edu VPEControlReg vpeControl = VPEControl; 6256376Sgblack@eecs.umich.edu Rt = vpeControl; 6266376Sgblack@eecs.umich.edu vpeControl.te = 0; 6276376Sgblack@eecs.umich.edu VPEControl = vpeControl; 6286376Sgblack@eecs.umich.edu }}); 6296376Sgblack@eecs.umich.edu 0x1: emt({{ 6306376Sgblack@eecs.umich.edu VPEControlReg vpeControl = VPEControl; 6316376Sgblack@eecs.umich.edu Rt = vpeControl; 6326376Sgblack@eecs.umich.edu vpeControl.te = 1; 6336376Sgblack@eecs.umich.edu VPEControl = vpeControl; 6346376Sgblack@eecs.umich.edu }}); 6355222Sksewell@umich.edu default:CP0Unimpl::unknown(); 6364661Sksewell@umich.edu } 6376384Sgblack@eecs.umich.edu default:CP0Unimpl::unknown(); 6384661Sksewell@umich.edu } 6395222Sksewell@umich.edu default:CP0Unimpl::unknown(); 6404661Sksewell@umich.edu } 6414661Sksewell@umich.edu } 6424661Sksewell@umich.edu 0xC: decode POS { 6436384Sgblack@eecs.umich.edu 0x0: decode SC { 6446384Sgblack@eecs.umich.edu 0x0: CP0Control::di({{ 6456384Sgblack@eecs.umich.edu StatusReg status = Status; 6466384Sgblack@eecs.umich.edu ConfigReg config = Config; 6476384Sgblack@eecs.umich.edu // Rev 2.0 or beyond? 6486384Sgblack@eecs.umich.edu if (config.ar >= 1) { 6496384Sgblack@eecs.umich.edu Rt = status; 6506384Sgblack@eecs.umich.edu status.ie = 0; 6516384Sgblack@eecs.umich.edu } else { 6526384Sgblack@eecs.umich.edu // Enable this else branch once we 6536384Sgblack@eecs.umich.edu // actually set values for Config on init 65410474Sandreas.hansson@arm.com fault = std::make_shared<ReservedInstructionFault>(); 6556384Sgblack@eecs.umich.edu } 6566384Sgblack@eecs.umich.edu Status = status; 6576384Sgblack@eecs.umich.edu }}); 6586384Sgblack@eecs.umich.edu 0x1: CP0Control::ei({{ 6596384Sgblack@eecs.umich.edu StatusReg status = Status; 6606384Sgblack@eecs.umich.edu ConfigReg config = Config; 6616384Sgblack@eecs.umich.edu if (config.ar >= 1) { 6626384Sgblack@eecs.umich.edu Rt = status; 6636384Sgblack@eecs.umich.edu status.ie = 1; 6646384Sgblack@eecs.umich.edu } else { 66510474Sandreas.hansson@arm.com fault = std::make_shared<ReservedInstructionFault>(); 6666384Sgblack@eecs.umich.edu } 6676384Sgblack@eecs.umich.edu }}); 6686384Sgblack@eecs.umich.edu default:CP0Unimpl::unknown(); 6696384Sgblack@eecs.umich.edu } 6704661Sksewell@umich.edu } 6716384Sgblack@eecs.umich.edu default: CP0Unimpl::unknown(); 6724661Sksewell@umich.edu } 6734661Sksewell@umich.edu format CP0Control { 6744661Sksewell@umich.edu 0xA: rdpgpr({{ 6756376Sgblack@eecs.umich.edu ConfigReg config = Config; 6766376Sgblack@eecs.umich.edu if (config.ar >= 1) { 6776376Sgblack@eecs.umich.edu // Rev 2 of the architecture 6786376Sgblack@eecs.umich.edu panic("Shadow Sets Not Fully Implemented.\n"); 6796376Sgblack@eecs.umich.edu } else { 68010474Sandreas.hansson@arm.com fault = std::make_shared<ReservedInstructionFault>(); 6814661Sksewell@umich.edu } 6826376Sgblack@eecs.umich.edu }}); 6834661Sksewell@umich.edu 0xE: wrpgpr({{ 6846376Sgblack@eecs.umich.edu ConfigReg config = Config; 6856376Sgblack@eecs.umich.edu if (config.ar >= 1) { 6866376Sgblack@eecs.umich.edu // Rev 2 of the architecture 6876376Sgblack@eecs.umich.edu panic("Shadow Sets Not Fully Implemented.\n"); 6886376Sgblack@eecs.umich.edu } else { 68910474Sandreas.hansson@arm.com fault = std::make_shared<ReservedInstructionFault>(); 6904661Sksewell@umich.edu } 6916376Sgblack@eecs.umich.edu }}); 6924661Sksewell@umich.edu } 6936384Sgblack@eecs.umich.edu } 6942101SN/A 6952101SN/A //Table A-12 MIPS32 COP0 Encoding of Function Field When rs=CO 6962101SN/A 0x1: decode FUNCTION { 6976384Sgblack@eecs.umich.edu format CP0Control { 6986384Sgblack@eecs.umich.edu 0x18: eret({{ 6996384Sgblack@eecs.umich.edu StatusReg status = Status; 7006384Sgblack@eecs.umich.edu ConfigReg config = Config; 7016384Sgblack@eecs.umich.edu SRSCtlReg srsCtl = SRSCtl; 7026384Sgblack@eecs.umich.edu DPRINTF(MipsPRA,"Restoring PC - %x\n",EPC); 7036384Sgblack@eecs.umich.edu if (status.erl == 1) { 7046384Sgblack@eecs.umich.edu status.erl = 0; 7057792Sgblack@eecs.umich.edu NPC = ErrorEPC; 7066384Sgblack@eecs.umich.edu // Need to adjust NNPC, otherwise things break 7077792Sgblack@eecs.umich.edu NNPC = ErrorEPC + sizeof(MachInst); 7086384Sgblack@eecs.umich.edu } else { 7097792Sgblack@eecs.umich.edu NPC = EPC; 7106384Sgblack@eecs.umich.edu // Need to adjust NNPC, otherwise things break 7117792Sgblack@eecs.umich.edu NNPC = EPC + sizeof(MachInst); 7126384Sgblack@eecs.umich.edu status.exl = 0; 7136384Sgblack@eecs.umich.edu if (config.ar >=1 && 7146384Sgblack@eecs.umich.edu srsCtl.hss > 0 && 7156384Sgblack@eecs.umich.edu status.bev == 0) { 7166384Sgblack@eecs.umich.edu srsCtl.css = srsCtl.pss; 7176384Sgblack@eecs.umich.edu //xc->setShadowSet(srsCtl.pss); 7186384Sgblack@eecs.umich.edu } 7196376Sgblack@eecs.umich.edu } 7206384Sgblack@eecs.umich.edu LLFlag = 0; 7216384Sgblack@eecs.umich.edu Status = status; 7226384Sgblack@eecs.umich.edu SRSCtl = srsCtl; 7236384Sgblack@eecs.umich.edu }}, IsReturn, IsSerializing, IsERET); 7245222Sksewell@umich.edu 7256384Sgblack@eecs.umich.edu 0x1F: deret({{ 7266384Sgblack@eecs.umich.edu DebugReg debug = Debug; 7276384Sgblack@eecs.umich.edu if (debug.dm == 1) { 7286384Sgblack@eecs.umich.edu debug.dm = 1; 7296384Sgblack@eecs.umich.edu debug.iexi = 0; 7307792Sgblack@eecs.umich.edu NPC = DEPC; 7316384Sgblack@eecs.umich.edu } else { 7327792Sgblack@eecs.umich.edu NPC = NPC; 7336384Sgblack@eecs.umich.edu // Undefined; 7346384Sgblack@eecs.umich.edu } 7356384Sgblack@eecs.umich.edu Debug = debug; 7366384Sgblack@eecs.umich.edu }}, IsReturn, IsSerializing, IsERET); 7376384Sgblack@eecs.umich.edu } 7386384Sgblack@eecs.umich.edu format CP0TLB { 7396384Sgblack@eecs.umich.edu 0x01: tlbr({{ 7406384Sgblack@eecs.umich.edu MipsISA::PTE *PTEntry = 74112406Sgabeblack@google.com dynamic_cast<MipsISA::TLB *>( 74212406Sgabeblack@google.com xc->tcBase()->getITBPtr())-> 7436384Sgblack@eecs.umich.edu getEntry(Index & 0x7FFFFFFF); 7446384Sgblack@eecs.umich.edu if (PTEntry == NULL) { 7456384Sgblack@eecs.umich.edu fatal("Invalid PTE Entry received on " 7466384Sgblack@eecs.umich.edu "a TLBR instruction\n"); 7476384Sgblack@eecs.umich.edu } 7486384Sgblack@eecs.umich.edu /* Setup PageMask */ 7496384Sgblack@eecs.umich.edu // If 1KB pages are not enabled, a read of PageMask 7506384Sgblack@eecs.umich.edu // must return 0b00 in bits 12, 11 7516384Sgblack@eecs.umich.edu PageMask = (PTEntry->Mask << 11); 7526384Sgblack@eecs.umich.edu /* Setup EntryHi */ 7536384Sgblack@eecs.umich.edu EntryHi = ((PTEntry->VPN << 11) | (PTEntry->asid)); 7546384Sgblack@eecs.umich.edu /* Setup Entry Lo0 */ 7556384Sgblack@eecs.umich.edu EntryLo0 = ((PTEntry->PFN0 << 6) | 7566384Sgblack@eecs.umich.edu (PTEntry->C0 << 3) | 7576384Sgblack@eecs.umich.edu (PTEntry->D0 << 2) | 7586384Sgblack@eecs.umich.edu (PTEntry->V0 << 1) | 7596384Sgblack@eecs.umich.edu PTEntry->G); 7606384Sgblack@eecs.umich.edu /* Setup Entry Lo1 */ 7616384Sgblack@eecs.umich.edu EntryLo1 = ((PTEntry->PFN1 << 6) | 7626384Sgblack@eecs.umich.edu (PTEntry->C1 << 3) | 7636384Sgblack@eecs.umich.edu (PTEntry->D1 << 2) | 7646384Sgblack@eecs.umich.edu (PTEntry->V1 << 1) | 7656384Sgblack@eecs.umich.edu PTEntry->G); 7666384Sgblack@eecs.umich.edu }}); // Need to hook up to TLB 7675222Sksewell@umich.edu 7686384Sgblack@eecs.umich.edu 0x02: tlbwi({{ 7696384Sgblack@eecs.umich.edu //Create PTE 7706384Sgblack@eecs.umich.edu MipsISA::PTE newEntry; 7716384Sgblack@eecs.umich.edu //Write PTE 7726384Sgblack@eecs.umich.edu newEntry.Mask = (Addr)(PageMask >> 11); 7736384Sgblack@eecs.umich.edu newEntry.VPN = (Addr)(EntryHi >> 11); 7746384Sgblack@eecs.umich.edu /* PageGrain _ ESP Config3 _ SP */ 7756384Sgblack@eecs.umich.edu if (bits(PageGrain, 28) == 0 || bits(Config3, 4) ==0) { 7766384Sgblack@eecs.umich.edu // If 1KB pages are *NOT* enabled, lowest bits of 7776384Sgblack@eecs.umich.edu // the mask are 0b11 for TLB writes 7786384Sgblack@eecs.umich.edu newEntry.Mask |= 0x3; 7796384Sgblack@eecs.umich.edu // Reset bits 0 and 1 if 1KB pages are not enabled 7806384Sgblack@eecs.umich.edu newEntry.VPN &= 0xFFFFFFFC; 7816384Sgblack@eecs.umich.edu } 7826384Sgblack@eecs.umich.edu newEntry.asid = (uint8_t)(EntryHi & 0xFF); 7835222Sksewell@umich.edu 7846384Sgblack@eecs.umich.edu newEntry.PFN0 = (Addr)(EntryLo0 >> 6); 7856384Sgblack@eecs.umich.edu newEntry.PFN1 = (Addr)(EntryLo1 >> 6); 7866384Sgblack@eecs.umich.edu newEntry.D0 = (bool)((EntryLo0 >> 2) & 1); 7876384Sgblack@eecs.umich.edu newEntry.D1 = (bool)((EntryLo1 >> 2) & 1); 7886384Sgblack@eecs.umich.edu newEntry.V1 = (bool)((EntryLo1 >> 1) & 1); 7896384Sgblack@eecs.umich.edu newEntry.V0 = (bool)((EntryLo0 >> 1) & 1); 7906384Sgblack@eecs.umich.edu newEntry.G = (bool)((EntryLo0 & EntryLo1) & 1); 7916384Sgblack@eecs.umich.edu newEntry.C0 = (uint8_t)((EntryLo0 >> 3) & 0x7); 7926384Sgblack@eecs.umich.edu newEntry.C1 = (uint8_t)((EntryLo1 >> 3) & 0x7); 7936384Sgblack@eecs.umich.edu /* Now, compute the AddrShiftAmount and OffsetMask - 7946384Sgblack@eecs.umich.edu TLB optimizations */ 7956384Sgblack@eecs.umich.edu /* Addr Shift Amount for 1KB or larger pages */ 7966384Sgblack@eecs.umich.edu if ((newEntry.Mask & 0xFFFF) == 3) { 7976384Sgblack@eecs.umich.edu newEntry.AddrShiftAmount = 12; 7986384Sgblack@eecs.umich.edu } else if ((newEntry.Mask & 0xFFFF) == 0x0000) { 7996384Sgblack@eecs.umich.edu newEntry.AddrShiftAmount = 10; 8006384Sgblack@eecs.umich.edu } else if ((newEntry.Mask & 0xFFFC) == 0x000C) { 8016384Sgblack@eecs.umich.edu newEntry.AddrShiftAmount = 14; 8026384Sgblack@eecs.umich.edu } else if ((newEntry.Mask & 0xFFF0) == 0x0030) { 8036384Sgblack@eecs.umich.edu newEntry.AddrShiftAmount = 16; 8046384Sgblack@eecs.umich.edu } else if ((newEntry.Mask & 0xFFC0) == 0x00C0) { 8056384Sgblack@eecs.umich.edu newEntry.AddrShiftAmount = 18; 8066384Sgblack@eecs.umich.edu } else if ((newEntry.Mask & 0xFF00) == 0x0300) { 8076384Sgblack@eecs.umich.edu newEntry.AddrShiftAmount = 20; 8086384Sgblack@eecs.umich.edu } else if ((newEntry.Mask & 0xFC00) == 0x0C00) { 8096384Sgblack@eecs.umich.edu newEntry.AddrShiftAmount = 22; 8106384Sgblack@eecs.umich.edu } else if ((newEntry.Mask & 0xF000) == 0x3000) { 8116384Sgblack@eecs.umich.edu newEntry.AddrShiftAmount = 24; 8126384Sgblack@eecs.umich.edu } else if ((newEntry.Mask & 0xC000) == 0xC000) { 8136384Sgblack@eecs.umich.edu newEntry.AddrShiftAmount = 26; 8146384Sgblack@eecs.umich.edu } else if ((newEntry.Mask & 0x30000) == 0x30000) { 8156384Sgblack@eecs.umich.edu newEntry.AddrShiftAmount = 28; 8166384Sgblack@eecs.umich.edu } else { 8176384Sgblack@eecs.umich.edu fatal("Invalid Mask Pattern Detected!\n"); 8186384Sgblack@eecs.umich.edu } 8196384Sgblack@eecs.umich.edu newEntry.OffsetMask = 8206384Sgblack@eecs.umich.edu (1 << newEntry.AddrShiftAmount) - 1; 8215222Sksewell@umich.edu 82212406Sgabeblack@google.com auto ptr = dynamic_cast<MipsISA::TLB *>( 82312406Sgabeblack@google.com xc->tcBase()->getITBPtr()); 8246384Sgblack@eecs.umich.edu Config3Reg config3 = Config3; 8256384Sgblack@eecs.umich.edu PageGrainReg pageGrain = PageGrain; 8266384Sgblack@eecs.umich.edu int SP = 0; 8276384Sgblack@eecs.umich.edu if (bits(config3, config3.sp) == 1 && 8286384Sgblack@eecs.umich.edu bits(pageGrain, pageGrain.esp) == 1) { 8296384Sgblack@eecs.umich.edu SP = 1; 8306384Sgblack@eecs.umich.edu } 83112406Sgabeblack@google.com ptr->insertAt(newEntry, Index & 0x7FFFFFFF, SP); 8326384Sgblack@eecs.umich.edu }}); 8336384Sgblack@eecs.umich.edu 0x06: tlbwr({{ 8346384Sgblack@eecs.umich.edu //Create PTE 8356384Sgblack@eecs.umich.edu MipsISA::PTE newEntry; 8366384Sgblack@eecs.umich.edu //Write PTE 8376384Sgblack@eecs.umich.edu newEntry.Mask = (Addr)(PageMask >> 11); 8386384Sgblack@eecs.umich.edu newEntry.VPN = (Addr)(EntryHi >> 11); 8396384Sgblack@eecs.umich.edu /* PageGrain _ ESP Config3 _ SP */ 8406384Sgblack@eecs.umich.edu if (bits(PageGrain, 28) == 0 || 8416384Sgblack@eecs.umich.edu bits(Config3, 4) == 0) { 8426384Sgblack@eecs.umich.edu // If 1KB pages are *NOT* enabled, lowest bits of 8436384Sgblack@eecs.umich.edu // the mask are 0b11 for TLB writes 8446384Sgblack@eecs.umich.edu newEntry.Mask |= 0x3; 8456384Sgblack@eecs.umich.edu // Reset bits 0 and 1 if 1KB pages are not enabled 8466384Sgblack@eecs.umich.edu newEntry.VPN &= 0xFFFFFFFC; 8476384Sgblack@eecs.umich.edu } 8486384Sgblack@eecs.umich.edu newEntry.asid = (uint8_t)(EntryHi & 0xFF); 8495222Sksewell@umich.edu 8506384Sgblack@eecs.umich.edu newEntry.PFN0 = (Addr)(EntryLo0 >> 6); 8516384Sgblack@eecs.umich.edu newEntry.PFN1 = (Addr)(EntryLo1 >> 6); 8526384Sgblack@eecs.umich.edu newEntry.D0 = (bool)((EntryLo0 >> 2) & 1); 8536384Sgblack@eecs.umich.edu newEntry.D1 = (bool)((EntryLo1 >> 2) & 1); 8546384Sgblack@eecs.umich.edu newEntry.V1 = (bool)((EntryLo1 >> 1) & 1); 8556384Sgblack@eecs.umich.edu newEntry.V0 = (bool)((EntryLo0 >> 1) & 1); 8566384Sgblack@eecs.umich.edu newEntry.G = (bool)((EntryLo0 & EntryLo1) & 1); 8576384Sgblack@eecs.umich.edu newEntry.C0 = (uint8_t)((EntryLo0 >> 3) & 0x7); 8586384Sgblack@eecs.umich.edu newEntry.C1 = (uint8_t)((EntryLo1 >> 3) & 0x7); 8596384Sgblack@eecs.umich.edu /* Now, compute the AddrShiftAmount and OffsetMask - 8606384Sgblack@eecs.umich.edu TLB optimizations */ 8616384Sgblack@eecs.umich.edu /* Addr Shift Amount for 1KB or larger pages */ 8626384Sgblack@eecs.umich.edu if ((newEntry.Mask & 0xFFFF) == 3){ 8636384Sgblack@eecs.umich.edu newEntry.AddrShiftAmount = 12; 8646384Sgblack@eecs.umich.edu } else if ((newEntry.Mask & 0xFFFF) == 0x0000) { 8656384Sgblack@eecs.umich.edu newEntry.AddrShiftAmount = 10; 8666384Sgblack@eecs.umich.edu } else if ((newEntry.Mask & 0xFFFC) == 0x000C) { 8676384Sgblack@eecs.umich.edu newEntry.AddrShiftAmount = 14; 8686384Sgblack@eecs.umich.edu } else if ((newEntry.Mask & 0xFFF0) == 0x0030) { 8696384Sgblack@eecs.umich.edu newEntry.AddrShiftAmount = 16; 8706384Sgblack@eecs.umich.edu } else if ((newEntry.Mask & 0xFFC0) == 0x00C0) { 8716384Sgblack@eecs.umich.edu newEntry.AddrShiftAmount = 18; 8726384Sgblack@eecs.umich.edu } else if ((newEntry.Mask & 0xFF00) == 0x0300) { 8736384Sgblack@eecs.umich.edu newEntry.AddrShiftAmount = 20; 8746384Sgblack@eecs.umich.edu } else if ((newEntry.Mask & 0xFC00) == 0x0C00) { 8756384Sgblack@eecs.umich.edu newEntry.AddrShiftAmount = 22; 8766384Sgblack@eecs.umich.edu } else if ((newEntry.Mask & 0xF000) == 0x3000) { 8776384Sgblack@eecs.umich.edu newEntry.AddrShiftAmount = 24; 8786384Sgblack@eecs.umich.edu } else if ((newEntry.Mask & 0xC000) == 0xC000) { 8796384Sgblack@eecs.umich.edu newEntry.AddrShiftAmount = 26; 8806384Sgblack@eecs.umich.edu } else if ((newEntry.Mask & 0x30000) == 0x30000) { 8816384Sgblack@eecs.umich.edu newEntry.AddrShiftAmount = 28; 8826384Sgblack@eecs.umich.edu } else { 8836384Sgblack@eecs.umich.edu fatal("Invalid Mask Pattern Detected!\n"); 8846384Sgblack@eecs.umich.edu } 8856384Sgblack@eecs.umich.edu newEntry.OffsetMask = 8866384Sgblack@eecs.umich.edu (1 << newEntry.AddrShiftAmount) - 1; 8875222Sksewell@umich.edu 88812406Sgabeblack@google.com auto ptr = dynamic_cast<MipsISA::TLB *>( 88912406Sgabeblack@google.com xc->tcBase()->getITBPtr()); 8906384Sgblack@eecs.umich.edu Config3Reg config3 = Config3; 8916384Sgblack@eecs.umich.edu PageGrainReg pageGrain = PageGrain; 8926384Sgblack@eecs.umich.edu int SP = 0; 8936384Sgblack@eecs.umich.edu if (bits(config3, config3.sp) == 1 && 8946384Sgblack@eecs.umich.edu bits(pageGrain, pageGrain.esp) == 1) { 8956384Sgblack@eecs.umich.edu SP = 1; 8966384Sgblack@eecs.umich.edu } 89712406Sgabeblack@google.com ptr->insertAt(newEntry, Random, SP); 8986384Sgblack@eecs.umich.edu }}); 8992101SN/A 9006384Sgblack@eecs.umich.edu 0x08: tlbp({{ 9016384Sgblack@eecs.umich.edu Config3Reg config3 = Config3; 9026384Sgblack@eecs.umich.edu PageGrainReg pageGrain = PageGrain; 9036384Sgblack@eecs.umich.edu EntryHiReg entryHi = EntryHi; 9046384Sgblack@eecs.umich.edu int tlbIndex; 9056384Sgblack@eecs.umich.edu Addr vpn; 9066384Sgblack@eecs.umich.edu if (pageGrain.esp == 1 && config3.sp ==1) { 9076384Sgblack@eecs.umich.edu vpn = EntryHi >> 11; 9086384Sgblack@eecs.umich.edu } else { 9096384Sgblack@eecs.umich.edu // Mask off lower 2 bits 9106384Sgblack@eecs.umich.edu vpn = ((EntryHi >> 11) & 0xFFFFFFFC); 9116384Sgblack@eecs.umich.edu } 91212406Sgabeblack@google.com tlbIndex = dynamic_cast<MipsISA::TLB *>( 91312406Sgabeblack@google.com xc->tcBase()->getITBPtr())-> 91412406Sgabeblack@google.com probeEntry(vpn, entryHi.asid); 9156384Sgblack@eecs.umich.edu // Check TLB for entry matching EntryHi 9166384Sgblack@eecs.umich.edu if (tlbIndex != -1) { 9176384Sgblack@eecs.umich.edu Index = tlbIndex; 9186384Sgblack@eecs.umich.edu } else { 9196384Sgblack@eecs.umich.edu // else, set Index = 1 << 31 9206384Sgblack@eecs.umich.edu Index = (1 << 31); 9216384Sgblack@eecs.umich.edu } 9226384Sgblack@eecs.umich.edu }}); 9236384Sgblack@eecs.umich.edu } 9246384Sgblack@eecs.umich.edu format CP0Unimpl { 9256384Sgblack@eecs.umich.edu 0x20: wait(); 9266384Sgblack@eecs.umich.edu } 9276384Sgblack@eecs.umich.edu default: CP0Unimpl::unknown(); 9282101SN/A } 9292043SN/A } 9302027SN/A 9312101SN/A //Table A-13 MIPS32 COP1 Encoding of rs Field 9322101SN/A 0x1: decode RS_MSB { 9332101SN/A 0x0: decode RS_HI { 9342101SN/A 0x0: decode RS_LO { 9352686Sksewell@umich.edu format CP1Control { 93613389Sgabeblack@google.com 0x0: mfc1 ({{ Rt = Fs_uw; }}); 9372495SN/A 9382495SN/A 0x2: cfc1({{ 9396384Sgblack@eecs.umich.edu switch (FS) { 9402573SN/A case 0: 9412616SN/A Rt = FIR; 9422573SN/A break; 9432573SN/A case 25: 9446384Sgblack@eecs.umich.edu Rt = (FCSR & 0xFE000000) >> 24 | 9456384Sgblack@eecs.umich.edu (FCSR & 0x00800000) >> 23; 9462573SN/A break; 9472573SN/A case 26: 9486384Sgblack@eecs.umich.edu Rt = (FCSR & 0x0003F07C); 9492573SN/A break; 9502573SN/A case 28: 9516384Sgblack@eecs.umich.edu Rt = (FCSR & 0x00000F80) | 9526384Sgblack@eecs.umich.edu (FCSR & 0x01000000) >> 21 | 9536384Sgblack@eecs.umich.edu (FCSR & 0x00000003); 9542573SN/A break; 9552573SN/A case 31: 9562616SN/A Rt = FCSR; 9572573SN/A break; 9582573SN/A default: 9595222Sksewell@umich.edu warn("FP Control Value (%d) Not Valid"); 9602573SN/A } 9612573SN/A }}); 9622573SN/A 96313389Sgabeblack@google.com 0x3: mfhc1({{ Rt = Fs_ud<63:32>; }}); 9642686Sksewell@umich.edu 96513389Sgabeblack@google.com 0x4: mtc1({{ Fs_uw = Rt; }}); 9662686Sksewell@umich.edu 9672573SN/A 0x6: ctc1({{ 9686384Sgblack@eecs.umich.edu switch (FS) { 9692573SN/A case 25: 97013389Sgabeblack@google.com FCSR = (Rt<7:1> << 25) | // move 31-25 9716384Sgblack@eecs.umich.edu (FCSR & 0x01000000) | // bit 24 9726384Sgblack@eecs.umich.edu (FCSR & 0x004FFFFF); // bit 22-0 9732573SN/A break; 9742573SN/A case 26: 9756384Sgblack@eecs.umich.edu FCSR = (FCSR & 0xFFFC0000) | // move 31-18 97613389Sgabeblack@google.com Rt<17:12> << 12 | // bit 17-12 9776384Sgblack@eecs.umich.edu (FCSR & 0x00000F80) << 7 | // bit 11-7 97813389Sgabeblack@google.com Rt<6:2> << 2 | // bit 6-2 9796384Sgblack@eecs.umich.edu (FCSR & 0x00000002); // bit 1-0 9802573SN/A break; 9812573SN/A case 28: 9826384Sgblack@eecs.umich.edu FCSR = (FCSR & 0xFE000000) | // move 31-25 98313389Sgabeblack@google.com Rt<2:2> << 24 | // bit 24 9846384Sgblack@eecs.umich.edu (FCSR & 0x00FFF000) << 23 | // bit 23-12 98513389Sgabeblack@google.com Rt<11:7> << 7 | // bit 24 9866384Sgblack@eecs.umich.edu (FCSR & 0x000007E) | 98713389Sgabeblack@google.com Rt<1:0>; // bit 22-0 9882573SN/A break; 9892573SN/A case 31: 99013389Sgabeblack@google.com FCSR = Rt; 9912573SN/A break; 9922573SN/A 9932573SN/A default: 9946384Sgblack@eecs.umich.edu panic("FP Control Value (%d) " 9956384Sgblack@eecs.umich.edu "Not Available. Ignoring Access " 9966384Sgblack@eecs.umich.edu "to Floating Control Status " 9976384Sgblack@eecs.umich.edu "Register", FS); 9982495SN/A } 9992495SN/A }}); 10002686Sksewell@umich.edu 10012686Sksewell@umich.edu 0x7: mthc1({{ 100213389Sgabeblack@google.com uint64_t fs_hi = Rt; 10038588Sgblack@eecs.umich.edu uint64_t fs_lo = Fs_ud & 0x0FFFFFFFF; 10048588Sgblack@eecs.umich.edu Fs_ud = (fs_hi << 32) | fs_lo; 10052686Sksewell@umich.edu }}); 10062686Sksewell@umich.edu 10072101SN/A } 10085222Sksewell@umich.edu format CP1Unimpl { 10095222Sksewell@umich.edu 0x1: dmfc1(); 10105222Sksewell@umich.edu 0x5: dmtc1(); 10115222Sksewell@umich.edu } 10126384Sgblack@eecs.umich.edu } 10132025SN/A 10146384Sgblack@eecs.umich.edu 0x1: decode RS_LO { 10156384Sgblack@eecs.umich.edu 0x0: decode ND { 10166384Sgblack@eecs.umich.edu format Branch { 10176384Sgblack@eecs.umich.edu 0x0: decode TF { 10186384Sgblack@eecs.umich.edu 0x0: bc1f({{ 10196384Sgblack@eecs.umich.edu cond = getCondCode(FCSR, BRANCH_CC) == 0; 10206384Sgblack@eecs.umich.edu }}); 10216384Sgblack@eecs.umich.edu 0x1: bc1t({{ 10226384Sgblack@eecs.umich.edu cond = getCondCode(FCSR, BRANCH_CC) == 1; 10236384Sgblack@eecs.umich.edu }}); 10246384Sgblack@eecs.umich.edu } 10256384Sgblack@eecs.umich.edu 0x1: decode TF { 10266384Sgblack@eecs.umich.edu 0x0: bc1fl({{ 10276384Sgblack@eecs.umich.edu cond = getCondCode(FCSR, BRANCH_CC) == 0; 10286384Sgblack@eecs.umich.edu }}, Likely); 10296384Sgblack@eecs.umich.edu 0x1: bc1tl({{ 10306384Sgblack@eecs.umich.edu cond = getCondCode(FCSR, BRANCH_CC) == 1; 10316384Sgblack@eecs.umich.edu }}, Likely); 10326384Sgblack@eecs.umich.edu } 10336384Sgblack@eecs.umich.edu } 10346384Sgblack@eecs.umich.edu } 10356384Sgblack@eecs.umich.edu format CP1Unimpl { 10366384Sgblack@eecs.umich.edu 0x1: bc1any2(); 10376384Sgblack@eecs.umich.edu 0x2: bc1any4(); 10386384Sgblack@eecs.umich.edu default: unknown(); 10396384Sgblack@eecs.umich.edu } 10406384Sgblack@eecs.umich.edu } 10412043SN/A } 10422027SN/A 10432101SN/A 0x1: decode RS_HI { 10442101SN/A 0x2: decode RS_LO { 10456384Sgblack@eecs.umich.edu //Table A-14 MIPS32 COP1 Encoding of Function Field When 10466384Sgblack@eecs.umich.edu //rs=S (( single-precision floating point)) 10472572SN/A 0x0: decode FUNCTION_HI { 10482572SN/A 0x0: decode FUNCTION_LO { 10492101SN/A format FloatOp { 10508588Sgblack@eecs.umich.edu 0x0: add_s({{ Fd_sf = Fs_sf + Ft_sf; }}); 10518588Sgblack@eecs.umich.edu 0x1: sub_s({{ Fd_sf = Fs_sf - Ft_sf; }}); 10528588Sgblack@eecs.umich.edu 0x2: mul_s({{ Fd_sf = Fs_sf * Ft_sf; }}); 10538588Sgblack@eecs.umich.edu 0x3: div_s({{ Fd_sf = Fs_sf / Ft_sf; }}); 10548588Sgblack@eecs.umich.edu 0x4: sqrt_s({{ Fd_sf = sqrt(Fs_sf); }}); 10558588Sgblack@eecs.umich.edu 0x5: abs_s({{ Fd_sf = fabs(Fs_sf); }}); 10568588Sgblack@eecs.umich.edu 0x7: neg_s({{ Fd_sf = -Fs_sf; }}); 10572101SN/A } 10588588Sgblack@eecs.umich.edu 0x6: BasicOp::mov_s({{ Fd_sf = Fs_sf; }}); 10592101SN/A } 10602572SN/A 0x1: decode FUNCTION_LO { 10612686Sksewell@umich.edu format FloatConvertOp { 10628588Sgblack@eecs.umich.edu 0x0: round_l_s({{ val = Fs_sf; }}, 10636384Sgblack@eecs.umich.edu ToLong, Round); 10648588Sgblack@eecs.umich.edu 0x1: trunc_l_s({{ val = Fs_sf; }}, 10656384Sgblack@eecs.umich.edu ToLong, Trunc); 10668588Sgblack@eecs.umich.edu 0x2: ceil_l_s({{ val = Fs_sf;}}, 10676384Sgblack@eecs.umich.edu ToLong, Ceil); 10688588Sgblack@eecs.umich.edu 0x3: floor_l_s({{ val = Fs_sf; }}, 10696384Sgblack@eecs.umich.edu ToLong, Floor); 10708588Sgblack@eecs.umich.edu 0x4: round_w_s({{ val = Fs_sf; }}, 10716384Sgblack@eecs.umich.edu ToWord, Round); 10728588Sgblack@eecs.umich.edu 0x5: trunc_w_s({{ val = Fs_sf; }}, 10736384Sgblack@eecs.umich.edu ToWord, Trunc); 10748588Sgblack@eecs.umich.edu 0x6: ceil_w_s({{ val = Fs_sf; }}, 10756384Sgblack@eecs.umich.edu ToWord, Ceil); 10768588Sgblack@eecs.umich.edu 0x7: floor_w_s({{ val = Fs_sf; }}, 10776384Sgblack@eecs.umich.edu ToWord, Floor); 10782101SN/A } 10792101SN/A } 10802027SN/A 10812572SN/A 0x2: decode FUNCTION_LO { 10822101SN/A 0x1: decode MOVCF { 10832686Sksewell@umich.edu format BasicOp { 10846384Sgblack@eecs.umich.edu 0x0: movf_s({{ 10856384Sgblack@eecs.umich.edu Fd = (getCondCode(FCSR,CC) == 0) ? 10866384Sgblack@eecs.umich.edu Fs : Fd; 10876384Sgblack@eecs.umich.edu }}); 10886384Sgblack@eecs.umich.edu 0x1: movt_s({{ 10896384Sgblack@eecs.umich.edu Fd = (getCondCode(FCSR,CC) == 1) ? 10906384Sgblack@eecs.umich.edu Fs : Fd; 10916384Sgblack@eecs.umich.edu }}); 10922101SN/A } 10932101SN/A } 10942027SN/A 10952686Sksewell@umich.edu format BasicOp { 10962686Sksewell@umich.edu 0x2: movz_s({{ Fd = (Rt == 0) ? Fs : Fd; }}); 10972686Sksewell@umich.edu 0x3: movn_s({{ Fd = (Rt != 0) ? Fs : Fd; }}); 10982686Sksewell@umich.edu } 10992686Sksewell@umich.edu 11002602SN/A format FloatOp { 11012602SN/A 0x5: recip_s({{ Fd = 1 / Fs; }}); 11026384Sgblack@eecs.umich.edu 0x6: rsqrt_s({{ Fd = 1 / sqrt(Fs); }}); 11032101SN/A } 11045222Sksewell@umich.edu format CP1Unimpl { 11056384Sgblack@eecs.umich.edu default: unknown(); 11065222Sksewell@umich.edu } 11072101SN/A } 11085222Sksewell@umich.edu 0x3: CP1Unimpl::unknown(); 11092027SN/A 11102572SN/A 0x4: decode FUNCTION_LO { 11112603SN/A format FloatConvertOp { 11128588Sgblack@eecs.umich.edu 0x1: cvt_d_s({{ val = Fs_sf; }}, ToDouble); 11138588Sgblack@eecs.umich.edu 0x4: cvt_w_s({{ val = Fs_sf; }}, ToWord); 11148588Sgblack@eecs.umich.edu 0x5: cvt_l_s({{ val = Fs_sf; }}, ToLong); 11152101SN/A } 11162055SN/A 11172686Sksewell@umich.edu 0x6: FloatOp::cvt_ps_s({{ 111813389Sgabeblack@google.com Fd_ud = (uint64_t)Fs_uw << 32 | 111913389Sgabeblack@google.com (uint64_t)Ft_uw; 11206384Sgblack@eecs.umich.edu }}); 11215222Sksewell@umich.edu format CP1Unimpl { 11226384Sgblack@eecs.umich.edu default: unknown(); 11235222Sksewell@umich.edu } 11242101SN/A } 11255222Sksewell@umich.edu 0x5: CP1Unimpl::unknown(); 11262602SN/A 11272602SN/A 0x6: decode FUNCTION_LO { 11282603SN/A format FloatCompareOp { 11296384Sgblack@eecs.umich.edu 0x0: c_f_s({{ cond = 0; }}, 11306384Sgblack@eecs.umich.edu SinglePrecision, UnorderedFalse); 11316384Sgblack@eecs.umich.edu 0x1: c_un_s({{ cond = 0; }}, 11326384Sgblack@eecs.umich.edu SinglePrecision, UnorderedTrue); 11338588Sgblack@eecs.umich.edu 0x2: c_eq_s({{ cond = (Fs_sf == Ft_sf); }}, 11342686Sksewell@umich.edu UnorderedFalse); 11358588Sgblack@eecs.umich.edu 0x3: c_ueq_s({{ cond = (Fs_sf == Ft_sf); }}, 11362686Sksewell@umich.edu UnorderedTrue); 11378588Sgblack@eecs.umich.edu 0x4: c_olt_s({{ cond = (Fs_sf < Ft_sf); }}, 11382686Sksewell@umich.edu UnorderedFalse); 11398588Sgblack@eecs.umich.edu 0x5: c_ult_s({{ cond = (Fs_sf < Ft_sf); }}, 11402686Sksewell@umich.edu UnorderedTrue); 11418588Sgblack@eecs.umich.edu 0x6: c_ole_s({{ cond = (Fs_sf <= Ft_sf); }}, 11422686Sksewell@umich.edu UnorderedFalse); 11438588Sgblack@eecs.umich.edu 0x7: c_ule_s({{ cond = (Fs_sf <= Ft_sf); }}, 11442686Sksewell@umich.edu UnorderedTrue); 11452602SN/A } 11462602SN/A } 11472602SN/A 11482602SN/A 0x7: decode FUNCTION_LO { 11492686Sksewell@umich.edu format FloatCompareOp { 11502686Sksewell@umich.edu 0x0: c_sf_s({{ cond = 0; }}, SinglePrecision, 11512686Sksewell@umich.edu UnorderedFalse, QnanException); 11522686Sksewell@umich.edu 0x1: c_ngle_s({{ cond = 0; }}, SinglePrecision, 11532686Sksewell@umich.edu UnorderedTrue, QnanException); 11548588Sgblack@eecs.umich.edu 0x2: c_seq_s({{ cond = (Fs_sf == Ft_sf); }}, 11552686Sksewell@umich.edu UnorderedFalse, QnanException); 11568588Sgblack@eecs.umich.edu 0x3: c_ngl_s({{ cond = (Fs_sf == Ft_sf); }}, 11572686Sksewell@umich.edu UnorderedTrue, QnanException); 11588588Sgblack@eecs.umich.edu 0x4: c_lt_s({{ cond = (Fs_sf < Ft_sf); }}, 11592686Sksewell@umich.edu UnorderedFalse, QnanException); 11608588Sgblack@eecs.umich.edu 0x5: c_nge_s({{ cond = (Fs_sf < Ft_sf); }}, 11612686Sksewell@umich.edu UnorderedTrue, QnanException); 11628588Sgblack@eecs.umich.edu 0x6: c_le_s({{ cond = (Fs_sf <= Ft_sf); }}, 11632686Sksewell@umich.edu UnorderedFalse, QnanException); 11648588Sgblack@eecs.umich.edu 0x7: c_ngt_s({{ cond = (Fs_sf <= Ft_sf); }}, 11652686Sksewell@umich.edu UnorderedTrue, QnanException); 11662602SN/A } 11672602SN/A } 11682101SN/A } 11692055SN/A 11706384Sgblack@eecs.umich.edu //Table A-15 MIPS32 COP1 Encoding of Function Field When 11716384Sgblack@eecs.umich.edu //rs=D 11722572SN/A 0x1: decode FUNCTION_HI { 11732572SN/A 0x0: decode FUNCTION_LO { 11742101SN/A format FloatOp { 11758588Sgblack@eecs.umich.edu 0x0: add_d({{ Fd_df = Fs_df + Ft_df; }}); 11768588Sgblack@eecs.umich.edu 0x1: sub_d({{ Fd_df = Fs_df - Ft_df; }}); 11778588Sgblack@eecs.umich.edu 0x2: mul_d({{ Fd_df = Fs_df * Ft_df; }}); 11788588Sgblack@eecs.umich.edu 0x3: div_d({{ Fd_df = Fs_df / Ft_df; }}); 11798588Sgblack@eecs.umich.edu 0x4: sqrt_d({{ Fd_df = sqrt(Fs_df); }}); 11808588Sgblack@eecs.umich.edu 0x5: abs_d({{ Fd_df = fabs(Fs_df); }}); 11818588Sgblack@eecs.umich.edu 0x7: neg_d({{ Fd_df = -1 * Fs_df; }}); 11822101SN/A } 11838588Sgblack@eecs.umich.edu 0x6: BasicOp::mov_d({{ Fd_df = Fs_df; }}); 11842101SN/A } 11852027SN/A 11862572SN/A 0x1: decode FUNCTION_LO { 11872686Sksewell@umich.edu format FloatConvertOp { 11888588Sgblack@eecs.umich.edu 0x0: round_l_d({{ val = Fs_df; }}, 11896384Sgblack@eecs.umich.edu ToLong, Round); 11908588Sgblack@eecs.umich.edu 0x1: trunc_l_d({{ val = Fs_df; }}, 11916384Sgblack@eecs.umich.edu ToLong, Trunc); 11928588Sgblack@eecs.umich.edu 0x2: ceil_l_d({{ val = Fs_df; }}, 11936384Sgblack@eecs.umich.edu ToLong, Ceil); 11948588Sgblack@eecs.umich.edu 0x3: floor_l_d({{ val = Fs_df; }}, 11956384Sgblack@eecs.umich.edu ToLong, Floor); 11968588Sgblack@eecs.umich.edu 0x4: round_w_d({{ val = Fs_df; }}, 11976384Sgblack@eecs.umich.edu ToWord, Round); 11988588Sgblack@eecs.umich.edu 0x5: trunc_w_d({{ val = Fs_df; }}, 11996384Sgblack@eecs.umich.edu ToWord, Trunc); 12008588Sgblack@eecs.umich.edu 0x6: ceil_w_d({{ val = Fs_df; }}, 12016384Sgblack@eecs.umich.edu ToWord, Ceil); 12028588Sgblack@eecs.umich.edu 0x7: floor_w_d({{ val = Fs_df; }}, 12036384Sgblack@eecs.umich.edu ToWord, Floor); 12042101SN/A } 12052101SN/A } 12062027SN/A 12072572SN/A 0x2: decode FUNCTION_LO { 12082101SN/A 0x1: decode MOVCF { 12092686Sksewell@umich.edu format BasicOp { 12106384Sgblack@eecs.umich.edu 0x0: movf_d({{ 12118588Sgblack@eecs.umich.edu Fd_df = (getCondCode(FCSR,CC) == 0) ? 12128588Sgblack@eecs.umich.edu Fs_df : Fd_df; 12136384Sgblack@eecs.umich.edu }}); 12146384Sgblack@eecs.umich.edu 0x1: movt_d({{ 12158588Sgblack@eecs.umich.edu Fd_df = (getCondCode(FCSR,CC) == 1) ? 12168588Sgblack@eecs.umich.edu Fs_df : Fd_df; 12176384Sgblack@eecs.umich.edu }}); 12182101SN/A } 12192101SN/A } 12202027SN/A 12212101SN/A format BasicOp { 12226384Sgblack@eecs.umich.edu 0x2: movz_d({{ 12238588Sgblack@eecs.umich.edu Fd_df = (Rt == 0) ? Fs_df : Fd_df; 12246384Sgblack@eecs.umich.edu }}); 12256384Sgblack@eecs.umich.edu 0x3: movn_d({{ 12268588Sgblack@eecs.umich.edu Fd_df = (Rt != 0) ? Fs_df : Fd_df; 12276384Sgblack@eecs.umich.edu }}); 12282101SN/A } 12292027SN/A 12302605SN/A format FloatOp { 12318588Sgblack@eecs.umich.edu 0x5: recip_d({{ Fd_df = 1 / Fs_df; }}); 12328588Sgblack@eecs.umich.edu 0x6: rsqrt_d({{ Fd_df = 1 / sqrt(Fs_df); }}); 12332101SN/A } 12345222Sksewell@umich.edu format CP1Unimpl { 12356384Sgblack@eecs.umich.edu default: unknown(); 12365222Sksewell@umich.edu } 12375222Sksewell@umich.edu 12382101SN/A } 12392572SN/A 0x4: decode FUNCTION_LO { 12402686Sksewell@umich.edu format FloatConvertOp { 12418588Sgblack@eecs.umich.edu 0x0: cvt_s_d({{ val = Fs_df; }}, ToSingle); 12428588Sgblack@eecs.umich.edu 0x4: cvt_w_d({{ val = Fs_df; }}, ToWord); 12438588Sgblack@eecs.umich.edu 0x5: cvt_l_d({{ val = Fs_df; }}, ToLong); 12442101SN/A } 12456384Sgblack@eecs.umich.edu default: CP1Unimpl::unknown(); 12462101SN/A } 12472602SN/A 12482602SN/A 0x6: decode FUNCTION_LO { 12492604SN/A format FloatCompareOp { 12506384Sgblack@eecs.umich.edu 0x0: c_f_d({{ cond = 0; }}, 12516384Sgblack@eecs.umich.edu DoublePrecision, UnorderedFalse); 12526384Sgblack@eecs.umich.edu 0x1: c_un_d({{ cond = 0; }}, 12536384Sgblack@eecs.umich.edu DoublePrecision, UnorderedTrue); 12548588Sgblack@eecs.umich.edu 0x2: c_eq_d({{ cond = (Fs_df == Ft_df); }}, 12552686Sksewell@umich.edu UnorderedFalse); 12568588Sgblack@eecs.umich.edu 0x3: c_ueq_d({{ cond = (Fs_df == Ft_df); }}, 12572686Sksewell@umich.edu UnorderedTrue); 12588588Sgblack@eecs.umich.edu 0x4: c_olt_d({{ cond = (Fs_df < Ft_df); }}, 12592686Sksewell@umich.edu UnorderedFalse); 12608588Sgblack@eecs.umich.edu 0x5: c_ult_d({{ cond = (Fs_df < Ft_df); }}, 12612686Sksewell@umich.edu UnorderedTrue); 12628588Sgblack@eecs.umich.edu 0x6: c_ole_d({{ cond = (Fs_df <= Ft_df); }}, 12632686Sksewell@umich.edu UnorderedFalse); 12648588Sgblack@eecs.umich.edu 0x7: c_ule_d({{ cond = (Fs_df <= Ft_df); }}, 12652686Sksewell@umich.edu UnorderedTrue); 12662602SN/A } 12672602SN/A } 12682602SN/A 12692602SN/A 0x7: decode FUNCTION_LO { 12702686Sksewell@umich.edu format FloatCompareOp { 12712686Sksewell@umich.edu 0x0: c_sf_d({{ cond = 0; }}, DoublePrecision, 12722686Sksewell@umich.edu UnorderedFalse, QnanException); 12732686Sksewell@umich.edu 0x1: c_ngle_d({{ cond = 0; }}, DoublePrecision, 12742686Sksewell@umich.edu UnorderedTrue, QnanException); 12758588Sgblack@eecs.umich.edu 0x2: c_seq_d({{ cond = (Fs_df == Ft_df); }}, 12762686Sksewell@umich.edu UnorderedFalse, QnanException); 12778588Sgblack@eecs.umich.edu 0x3: c_ngl_d({{ cond = (Fs_df == Ft_df); }}, 12782686Sksewell@umich.edu UnorderedTrue, QnanException); 12798588Sgblack@eecs.umich.edu 0x4: c_lt_d({{ cond = (Fs_df < Ft_df); }}, 12802686Sksewell@umich.edu UnorderedFalse, QnanException); 12818588Sgblack@eecs.umich.edu 0x5: c_nge_d({{ cond = (Fs_df < Ft_df); }}, 12822686Sksewell@umich.edu UnorderedTrue, QnanException); 12838588Sgblack@eecs.umich.edu 0x6: c_le_d({{ cond = (Fs_df <= Ft_df); }}, 12842686Sksewell@umich.edu UnorderedFalse, QnanException); 12858588Sgblack@eecs.umich.edu 0x7: c_ngt_d({{ cond = (Fs_df <= Ft_df); }}, 12862686Sksewell@umich.edu UnorderedTrue, QnanException); 12872602SN/A } 12882602SN/A } 12896384Sgblack@eecs.umich.edu default: CP1Unimpl::unknown(); 12902101SN/A } 12915222Sksewell@umich.edu 0x2: CP1Unimpl::unknown(); 12925222Sksewell@umich.edu 0x3: CP1Unimpl::unknown(); 12935222Sksewell@umich.edu 0x7: CP1Unimpl::unknown(); 12942027SN/A 129511320Ssteve.reinhardt@amd.com //Table A-16 MIPS32 COP1 Encoding of Function 12966384Sgblack@eecs.umich.edu //Field When rs=W 12972101SN/A 0x4: decode FUNCTION { 12982605SN/A format FloatConvertOp { 12999999Sclt67@cornell.edu 0x20: cvt_s_w({{ val = Fs_sw; }}, ToSingle); 13009999Sclt67@cornell.edu 0x21: cvt_d_w({{ val = Fs_sw; }}, ToDouble); 13015222Sksewell@umich.edu 0x26: CP1Unimpl::cvt_ps_w(); 13022101SN/A } 13036384Sgblack@eecs.umich.edu default: CP1Unimpl::unknown(); 13042101SN/A } 13052027SN/A 13066384Sgblack@eecs.umich.edu //Table A-16 MIPS32 COP1 Encoding of Function Field 13076384Sgblack@eecs.umich.edu //When rs=L1 13086384Sgblack@eecs.umich.edu //Note: "1. Format type L is legal only if 64-bit 13096384Sgblack@eecs.umich.edu //floating point operations are enabled." 13108695Sguodeyuan@tsinghua.org.cn 0x5: decode FUNCTION { 13112686Sksewell@umich.edu format FloatConvertOp { 13129999Sclt67@cornell.edu 0x20: cvt_s_l({{ val = Fs_sd; }}, ToSingle); 13139999Sclt67@cornell.edu 0x21: cvt_d_l({{ val = Fs_sd; }}, ToDouble); 13145222Sksewell@umich.edu 0x26: CP1Unimpl::cvt_ps_l(); 13152101SN/A } 13166384Sgblack@eecs.umich.edu default: CP1Unimpl::unknown(); 13172101SN/A } 13182101SN/A 13196384Sgblack@eecs.umich.edu //Table A-17 MIPS64 COP1 Encoding of Function Field 13206384Sgblack@eecs.umich.edu //When rs=PS1 13216384Sgblack@eecs.umich.edu //Note: "1. Format type PS is legal only if 64-bit 13226384Sgblack@eecs.umich.edu //floating point operations are enabled. " 13232572SN/A 0x6: decode FUNCTION_HI { 13242572SN/A 0x0: decode FUNCTION_LO { 13252101SN/A format Float64Op { 13262605SN/A 0x0: add_ps({{ 13278588Sgblack@eecs.umich.edu Fd1_sf = Fs1_sf + Ft2_sf; 13288588Sgblack@eecs.umich.edu Fd2_sf = Fs2_sf + Ft2_sf; 13292101SN/A }}); 13302605SN/A 0x1: sub_ps({{ 13318588Sgblack@eecs.umich.edu Fd1_sf = Fs1_sf - Ft2_sf; 13328588Sgblack@eecs.umich.edu Fd2_sf = Fs2_sf - Ft2_sf; 13332101SN/A }}); 13342605SN/A 0x2: mul_ps({{ 13358588Sgblack@eecs.umich.edu Fd1_sf = Fs1_sf * Ft2_sf; 13368588Sgblack@eecs.umich.edu Fd2_sf = Fs2_sf * Ft2_sf; 13372101SN/A }}); 13382605SN/A 0x5: abs_ps({{ 13398588Sgblack@eecs.umich.edu Fd1_sf = fabs(Fs1_sf); 13408588Sgblack@eecs.umich.edu Fd2_sf = fabs(Fs2_sf); 13412101SN/A }}); 13422605SN/A 0x6: mov_ps({{ 13438588Sgblack@eecs.umich.edu Fd1_sf = Fs1_sf; 13448588Sgblack@eecs.umich.edu Fd2_sf = Fs2_sf; 13452101SN/A }}); 13462605SN/A 0x7: neg_ps({{ 13478588Sgblack@eecs.umich.edu Fd1_sf = -(Fs1_sf); 13488588Sgblack@eecs.umich.edu Fd2_sf = -(Fs2_sf); 13492101SN/A }}); 13506384Sgblack@eecs.umich.edu default: CP1Unimpl::unknown(); 13512101SN/A } 13522101SN/A } 13535222Sksewell@umich.edu 0x1: CP1Unimpl::unknown(); 13542572SN/A 0x2: decode FUNCTION_LO { 13552101SN/A 0x1: decode MOVCF { 13562101SN/A format Float64Op { 13572607SN/A 0x0: movf_ps({{ 13582686Sksewell@umich.edu Fd1 = (getCondCode(FCSR, CC) == 0) ? 13592686Sksewell@umich.edu Fs1 : Fd1; 13602686Sksewell@umich.edu Fd2 = (getCondCode(FCSR, CC+1) == 0) ? 13612686Sksewell@umich.edu Fs2 : Fd2; 13622607SN/A }}); 13632607SN/A 0x1: movt_ps({{ 13642686Sksewell@umich.edu Fd2 = (getCondCode(FCSR, CC) == 1) ? 13652686Sksewell@umich.edu Fs1 : Fd1; 13662686Sksewell@umich.edu Fd2 = (getCondCode(FCSR, CC+1) == 1) ? 13672686Sksewell@umich.edu Fs2 : Fd2; 13682607SN/A }}); 13692101SN/A } 13702101SN/A } 13712101SN/A 13722605SN/A format Float64Op { 13732607SN/A 0x2: movz_ps({{ 13742686Sksewell@umich.edu Fd1 = (getCondCode(FCSR, CC) == 0) ? 13752686Sksewell@umich.edu Fs1 : Fd1; 13762686Sksewell@umich.edu Fd2 = (getCondCode(FCSR, CC) == 0) ? 13772686Sksewell@umich.edu Fs2 : Fd2; 13782607SN/A }}); 13792607SN/A 0x3: movn_ps({{ 13802686Sksewell@umich.edu Fd1 = (getCondCode(FCSR, CC) == 1) ? 13812686Sksewell@umich.edu Fs1 : Fd1; 13822686Sksewell@umich.edu Fd2 = (getCondCode(FCSR, CC) == 1) ? 13832686Sksewell@umich.edu Fs2 : Fd2; 13842607SN/A }}); 13852135SN/A } 13866384Sgblack@eecs.umich.edu default: CP1Unimpl::unknown(); 13872101SN/A } 13885222Sksewell@umich.edu 0x3: CP1Unimpl::unknown(); 13892572SN/A 0x4: decode FUNCTION_LO { 13908588Sgblack@eecs.umich.edu 0x0: FloatOp::cvt_s_pu({{ Fd_sf = Fs2_sf; }}); 13915222Sksewell@umich.edu default: CP1Unimpl::unknown(); 13922101SN/A } 13932101SN/A 13942572SN/A 0x5: decode FUNCTION_LO { 13958588Sgblack@eecs.umich.edu 0x0: FloatOp::cvt_s_pl({{ Fd_sf = Fs1_sf; }}); 13962101SN/A format Float64Op { 13976384Sgblack@eecs.umich.edu 0x4: pll({{ 13988588Sgblack@eecs.umich.edu Fd_ud = (uint64_t)Fs1_uw << 32 | Ft1_uw; 13996384Sgblack@eecs.umich.edu }}); 14006384Sgblack@eecs.umich.edu 0x5: plu({{ 14018588Sgblack@eecs.umich.edu Fd_ud = (uint64_t)Fs1_uw << 32 | Ft2_uw; 14026384Sgblack@eecs.umich.edu }}); 14036384Sgblack@eecs.umich.edu 0x6: pul({{ 14048588Sgblack@eecs.umich.edu Fd_ud = (uint64_t)Fs2_uw << 32 | Ft1_uw; 14056384Sgblack@eecs.umich.edu }}); 14066384Sgblack@eecs.umich.edu 0x7: puu({{ 14078588Sgblack@eecs.umich.edu Fd_ud = (uint64_t)Fs2_uw << 32 | Ft2_uw; 14086384Sgblack@eecs.umich.edu }}); 14092101SN/A } 14105222Sksewell@umich.edu default: CP1Unimpl::unknown(); 14112101SN/A } 14122602SN/A 14132602SN/A 0x6: decode FUNCTION_LO { 14142608SN/A format FloatPSCompareOp { 14152686Sksewell@umich.edu 0x0: c_f_ps({{ cond1 = 0; }}, {{ cond2 = 0; }}, 14162686Sksewell@umich.edu UnorderedFalse); 14172686Sksewell@umich.edu 0x1: c_un_ps({{ cond1 = 0; }}, {{ cond2 = 0; }}, 14182686Sksewell@umich.edu UnorderedTrue); 14198588Sgblack@eecs.umich.edu 0x2: c_eq_ps({{ cond1 = (Fs1_sf == Ft1_sf); }}, 14208588Sgblack@eecs.umich.edu {{ cond2 = (Fs2_sf == Ft2_sf); }}, 14212686Sksewell@umich.edu UnorderedFalse); 14228588Sgblack@eecs.umich.edu 0x3: c_ueq_ps({{ cond1 = (Fs1_sf == Ft1_sf); }}, 14238588Sgblack@eecs.umich.edu {{ cond2 = (Fs2_sf == Ft2_sf); }}, 14242686Sksewell@umich.edu UnorderedTrue); 14258588Sgblack@eecs.umich.edu 0x4: c_olt_ps({{ cond1 = (Fs1_sf < Ft1_sf); }}, 14268588Sgblack@eecs.umich.edu {{ cond2 = (Fs2_sf < Ft2_sf); }}, 14272686Sksewell@umich.edu UnorderedFalse); 14288588Sgblack@eecs.umich.edu 0x5: c_ult_ps({{ cond1 = (Fs_sf < Ft_sf); }}, 14298588Sgblack@eecs.umich.edu {{ cond2 = (Fs2_sf < Ft2_sf); }}, 14302686Sksewell@umich.edu UnorderedTrue); 14318588Sgblack@eecs.umich.edu 0x6: c_ole_ps({{ cond1 = (Fs_sf <= Ft_sf); }}, 14328588Sgblack@eecs.umich.edu {{ cond2 = (Fs2_sf <= Ft2_sf); }}, 14332686Sksewell@umich.edu UnorderedFalse); 14348588Sgblack@eecs.umich.edu 0x7: c_ule_ps({{ cond1 = (Fs1_sf <= Ft1_sf); }}, 14358588Sgblack@eecs.umich.edu {{ cond2 = (Fs2_sf <= Ft2_sf); }}, 14362686Sksewell@umich.edu UnorderedTrue); 14372602SN/A } 14382602SN/A } 14392602SN/A 14402602SN/A 0x7: decode FUNCTION_LO { 14412686Sksewell@umich.edu format FloatPSCompareOp { 14422686Sksewell@umich.edu 0x0: c_sf_ps({{ cond1 = 0; }}, {{ cond2 = 0; }}, 14432686Sksewell@umich.edu UnorderedFalse, QnanException); 14442686Sksewell@umich.edu 0x1: c_ngle_ps({{ cond1 = 0; }}, 14452686Sksewell@umich.edu {{ cond2 = 0; }}, 14462686Sksewell@umich.edu UnorderedTrue, QnanException); 14478588Sgblack@eecs.umich.edu 0x2: c_seq_ps({{ cond1 = (Fs1_sf == Ft1_sf); }}, 14488588Sgblack@eecs.umich.edu {{ cond2 = (Fs2_sf == Ft2_sf); }}, 14492686Sksewell@umich.edu UnorderedFalse, QnanException); 14508588Sgblack@eecs.umich.edu 0x3: c_ngl_ps({{ cond1 = (Fs1_sf == Ft1_sf); }}, 14518588Sgblack@eecs.umich.edu {{ cond2 = (Fs2_sf == Ft2_sf); }}, 14522686Sksewell@umich.edu UnorderedTrue, QnanException); 14538588Sgblack@eecs.umich.edu 0x4: c_lt_ps({{ cond1 = (Fs1_sf < Ft1_sf); }}, 14548588Sgblack@eecs.umich.edu {{ cond2 = (Fs2_sf < Ft2_sf); }}, 14552686Sksewell@umich.edu UnorderedFalse, QnanException); 14568588Sgblack@eecs.umich.edu 0x5: c_nge_ps({{ cond1 = (Fs1_sf < Ft1_sf); }}, 14578588Sgblack@eecs.umich.edu {{ cond2 = (Fs2_sf < Ft2_sf); }}, 14582686Sksewell@umich.edu UnorderedTrue, QnanException); 14598588Sgblack@eecs.umich.edu 0x6: c_le_ps({{ cond1 = (Fs1_sf <= Ft1_sf); }}, 14608588Sgblack@eecs.umich.edu {{ cond2 = (Fs2_sf <= Ft2_sf); }}, 14612686Sksewell@umich.edu UnorderedFalse, QnanException); 14628588Sgblack@eecs.umich.edu 0x7: c_ngt_ps({{ cond1 = (Fs1_sf <= Ft1_sf); }}, 14638588Sgblack@eecs.umich.edu {{ cond2 = (Fs2_sf <= Ft2_sf); }}, 14642686Sksewell@umich.edu UnorderedTrue, QnanException); 14652602SN/A } 14662602SN/A } 14672101SN/A } 14682101SN/A } 14696384Sgblack@eecs.umich.edu default: CP1Unimpl::unknown(); 14702101SN/A } 14712101SN/A } 14722101SN/A 14732101SN/A //Table A-19 MIPS32 COP2 Encoding of rs Field 14742101SN/A 0x2: decode RS_MSB { 14755222Sksewell@umich.edu format CP2Unimpl { 14762686Sksewell@umich.edu 0x0: decode RS_HI { 14772686Sksewell@umich.edu 0x0: decode RS_LO { 14782101SN/A 0x0: mfc2(); 14792101SN/A 0x2: cfc2(); 14802101SN/A 0x3: mfhc2(); 14812101SN/A 0x4: mtc2(); 14822101SN/A 0x6: ctc2(); 14832101SN/A 0x7: mftc2(); 14846384Sgblack@eecs.umich.edu default: unknown(); 14852101SN/A } 14862101SN/A 14872686Sksewell@umich.edu 0x1: decode ND { 14882686Sksewell@umich.edu 0x0: decode TF { 14892101SN/A 0x0: bc2f(); 14902101SN/A 0x1: bc2t(); 14916384Sgblack@eecs.umich.edu default: unknown(); 14922101SN/A } 14932101SN/A 14942686Sksewell@umich.edu 0x1: decode TF { 14952101SN/A 0x0: bc2fl(); 14962101SN/A 0x1: bc2tl(); 14976384Sgblack@eecs.umich.edu default: unknown(); 14982101SN/A } 14996384Sgblack@eecs.umich.edu default: unknown(); 15005222Sksewell@umich.edu 15016384Sgblack@eecs.umich.edu } 15026384Sgblack@eecs.umich.edu default: unknown(); 15036384Sgblack@eecs.umich.edu } 15046384Sgblack@eecs.umich.edu default: unknown(); 15052101SN/A } 15062101SN/A } 15072101SN/A 15082101SN/A //Table A-20 MIPS64 COP1X Encoding of Function Field 1 15092101SN/A //Note: "COP1X instructions are legal only if 64-bit floating point 15102101SN/A //operations are enabled." 15112101SN/A 0x3: decode FUNCTION_HI { 15122101SN/A 0x0: decode FUNCTION_LO { 15132686Sksewell@umich.edu format LoadIndexedMemory { 151413389Sgabeblack@google.com 0x0: lwxc1({{ Fd_uw = Mem; }}); 15158588Sgblack@eecs.umich.edu 0x1: ldxc1({{ Fd_ud = Mem_ud; }}); 15168588Sgblack@eecs.umich.edu 0x5: luxc1({{ Fd_ud = Mem_ud; }}, 15172742Sksewell@umich.edu {{ EA = (Rs + Rt) & ~7; }}); 15182101SN/A } 15192043SN/A } 15202027SN/A 15212101SN/A 0x1: decode FUNCTION_LO { 15222686Sksewell@umich.edu format StoreIndexedMemory { 152313389Sgabeblack@google.com 0x0: swxc1({{ Mem = Fs_uw; }}); 15248588Sgblack@eecs.umich.edu 0x1: sdxc1({{ Mem_ud = Fs_ud; }}); 15258588Sgblack@eecs.umich.edu 0x5: suxc1({{ Mem_ud = Fs_ud; }}, 15262742Sksewell@umich.edu {{ EA = (Rs + Rt) & ~7; }}); 15272046SN/A } 15282686Sksewell@umich.edu 0x7: Prefetch::prefx({{ EA = Rs + Rt; }}); 15292101SN/A } 15302027SN/A 15312686Sksewell@umich.edu 0x3: decode FUNCTION_LO { 15326384Sgblack@eecs.umich.edu 0x6: Float64Op::alnv_ps({{ 15336384Sgblack@eecs.umich.edu if (Rs<2:0> == 0) { 15348588Sgblack@eecs.umich.edu Fd_ud = Fs_ud; 15356384Sgblack@eecs.umich.edu } else if (Rs<2:0> == 4) { 15368564Sgblack@eecs.umich.edu if (GuestByteOrder == BigEndianByteOrder) 15378588Sgblack@eecs.umich.edu Fd_ud = Fs_ud<31:0> << 32 | Ft_ud<63:32>; 15388564Sgblack@eecs.umich.edu else 15398588Sgblack@eecs.umich.edu Fd_ud = Ft_ud<31:0> << 32 | Fs_ud<63:32>; 15406384Sgblack@eecs.umich.edu } else { 15418588Sgblack@eecs.umich.edu Fd_ud = Fd_ud; 15426384Sgblack@eecs.umich.edu } 15436384Sgblack@eecs.umich.edu }}); 15442686Sksewell@umich.edu } 15452027SN/A 15462686Sksewell@umich.edu format FloatAccOp { 15472686Sksewell@umich.edu 0x4: decode FUNCTION_LO { 15488588Sgblack@eecs.umich.edu 0x0: madd_s({{ Fd_sf = (Fs_sf * Ft_sf) + Fr_sf; }}); 15498588Sgblack@eecs.umich.edu 0x1: madd_d({{ Fd_df = (Fs_df * Ft_df) + Fr_df; }}); 15502686Sksewell@umich.edu 0x6: madd_ps({{ 15518588Sgblack@eecs.umich.edu Fd1_sf = (Fs1_df * Ft1_df) + Fr1_df; 15528588Sgblack@eecs.umich.edu Fd2_sf = (Fs2_df * Ft2_df) + Fr2_df; 15532686Sksewell@umich.edu }}); 15542686Sksewell@umich.edu } 15552027SN/A 15562686Sksewell@umich.edu 0x5: decode FUNCTION_LO { 15578588Sgblack@eecs.umich.edu 0x0: msub_s({{ Fd_sf = (Fs_sf * Ft_sf) - Fr_sf; }}); 15588588Sgblack@eecs.umich.edu 0x1: msub_d({{ Fd_df = (Fs_df * Ft_df) - Fr_df; }}); 15592686Sksewell@umich.edu 0x6: msub_ps({{ 15608588Sgblack@eecs.umich.edu Fd1_sf = (Fs1_df * Ft1_df) - Fr1_df; 15618588Sgblack@eecs.umich.edu Fd2_sf = (Fs2_df * Ft2_df) - Fr2_df; 15622686Sksewell@umich.edu }}); 15632686Sksewell@umich.edu } 15642027SN/A 15652686Sksewell@umich.edu 0x6: decode FUNCTION_LO { 15668588Sgblack@eecs.umich.edu 0x0: nmadd_s({{ Fd_sf = (-1 * Fs_sf * Ft_sf) - Fr_sf; }}); 15678588Sgblack@eecs.umich.edu 0x1: nmadd_d({{ Fd_df = (-1 * Fs_df * Ft_df) - Fr_df; }}); 15682686Sksewell@umich.edu 0x6: nmadd_ps({{ 15698588Sgblack@eecs.umich.edu Fd1_sf = -((Fs1_df * Ft1_df) + Fr1_df); 15708588Sgblack@eecs.umich.edu Fd2_sf = -((Fs2_df * Ft2_df) + Fr2_df); 15712686Sksewell@umich.edu }}); 15722686Sksewell@umich.edu } 15732027SN/A 15742686Sksewell@umich.edu 0x7: decode FUNCTION_LO { 15758588Sgblack@eecs.umich.edu 0x0: nmsub_s({{ Fd_sf = (-1 * Fs_sf * Ft_sf) + Fr_sf; }}); 15768588Sgblack@eecs.umich.edu 0x1: nmsub_d({{ Fd_df = (-1 * Fs_df * Ft_df) + Fr_df; }}); 15772686Sksewell@umich.edu 0x6: nmsub_ps({{ 15788588Sgblack@eecs.umich.edu Fd1_sf = -((Fs1_df * Ft1_df) - Fr1_df); 15798588Sgblack@eecs.umich.edu Fd2_sf = -((Fs2_df * Ft2_df) - Fr2_df); 15802686Sksewell@umich.edu }}); 15812046SN/A } 15822101SN/A } 15832043SN/A } 15842025SN/A 15852686Sksewell@umich.edu format Branch { 15868588Sgblack@eecs.umich.edu 0x4: beql({{ cond = (Rs_sw == Rt_sw); }}, Likely); 15878588Sgblack@eecs.umich.edu 0x5: bnel({{ cond = (Rs_sw != Rt_sw); }}, Likely); 15888588Sgblack@eecs.umich.edu 0x6: blezl({{ cond = (Rs_sw <= 0); }}, Likely); 15898588Sgblack@eecs.umich.edu 0x7: bgtzl({{ cond = (Rs_sw > 0); }}, Likely); 15902046SN/A } 15912084SN/A } 15922024SN/A 15932686Sksewell@umich.edu 0x3: decode OPCODE_LO { 15942043SN/A //Table A-5 MIPS32 SPECIAL2 Encoding of Function Field 15952043SN/A 0x4: decode FUNCTION_HI { 15962686Sksewell@umich.edu 0x0: decode FUNCTION_LO { 15976384Sgblack@eecs.umich.edu 0x2: IntOp::mul({{ 15988588Sgblack@eecs.umich.edu int64_t temp1 = Rs_sd * Rt_sd; 159913389Sgabeblack@google.com Rd = temp1<31:0>; 16006384Sgblack@eecs.umich.edu }}, IntMultOp); 16012027SN/A 16024661Sksewell@umich.edu format HiLoRdSelValOp { 16036384Sgblack@eecs.umich.edu 0x0: madd({{ 16046384Sgblack@eecs.umich.edu val = ((int64_t)HI_RD_SEL << 32 | LO_RD_SEL) + 16058588Sgblack@eecs.umich.edu (Rs_sd * Rt_sd); 16066384Sgblack@eecs.umich.edu }}, IntMultOp); 16076384Sgblack@eecs.umich.edu 0x1: maddu({{ 16086384Sgblack@eecs.umich.edu val = ((uint64_t)HI_RD_SEL << 32 | LO_RD_SEL) + 16098588Sgblack@eecs.umich.edu (Rs_ud * Rt_ud); 16106384Sgblack@eecs.umich.edu }}, IntMultOp); 16116384Sgblack@eecs.umich.edu 0x4: msub({{ 16126384Sgblack@eecs.umich.edu val = ((int64_t)HI_RD_SEL << 32 | LO_RD_SEL) - 16138588Sgblack@eecs.umich.edu (Rs_sd * Rt_sd); 16146384Sgblack@eecs.umich.edu }}, IntMultOp); 16156384Sgblack@eecs.umich.edu 0x5: msubu({{ 16166384Sgblack@eecs.umich.edu val = ((uint64_t)HI_RD_SEL << 32 | LO_RD_SEL) - 16178588Sgblack@eecs.umich.edu (Rs_ud * Rt_ud); 16186384Sgblack@eecs.umich.edu }}, IntMultOp); 16192043SN/A } 16202043SN/A } 16212027SN/A 16222043SN/A 0x4: decode FUNCTION_LO { 16232101SN/A format BasicOp { 16246384Sgblack@eecs.umich.edu 0x0: clz({{ 16256384Sgblack@eecs.umich.edu int cnt = 32; 16266384Sgblack@eecs.umich.edu for (int idx = 31; idx >= 0; idx--) { 16276384Sgblack@eecs.umich.edu if (Rs<idx:idx> == 1) { 16286384Sgblack@eecs.umich.edu cnt = 31 - idx; 16296384Sgblack@eecs.umich.edu break; 16306384Sgblack@eecs.umich.edu } 16316384Sgblack@eecs.umich.edu } 163213389Sgabeblack@google.com Rd = cnt; 16336384Sgblack@eecs.umich.edu }}); 16346384Sgblack@eecs.umich.edu 0x1: clo({{ 16356384Sgblack@eecs.umich.edu int cnt = 32; 16366384Sgblack@eecs.umich.edu for (int idx = 31; idx >= 0; idx--) { 16376384Sgblack@eecs.umich.edu if (Rs<idx:idx> == 0) { 16386384Sgblack@eecs.umich.edu cnt = 31 - idx; 16396384Sgblack@eecs.umich.edu break; 16406384Sgblack@eecs.umich.edu } 16416384Sgblack@eecs.umich.edu } 164213389Sgabeblack@google.com Rd = cnt; 16436384Sgblack@eecs.umich.edu }}); 16442101SN/A } 16452043SN/A } 16462027SN/A 16472043SN/A 0x7: decode FUNCTION_LO { 16482686Sksewell@umich.edu 0x7: FailUnimpl::sdbbp(); 16492043SN/A } 16502043SN/A } 16512024SN/A 16522686Sksewell@umich.edu //Table A-6 MIPS32 SPECIAL3 Encoding of Function Field for Release 2 16532686Sksewell@umich.edu //of the Architecture 16542043SN/A 0x7: decode FUNCTION_HI { 16552101SN/A 0x0: decode FUNCTION_LO { 16562686Sksewell@umich.edu format BasicOp { 165713389Sgabeblack@google.com 0x0: ext({{ Rt = bits(Rs, MSB + LSB, LSB); }}); 16586384Sgblack@eecs.umich.edu 0x4: ins({{ 165913389Sgabeblack@google.com Rt = bits(Rt, 31, MSB + 1) << (MSB + 1) | 166013389Sgabeblack@google.com bits(Rs, MSB - LSB, 0) << LSB | 166113389Sgabeblack@google.com bits(Rt, LSB - 1, 0); 16626384Sgblack@eecs.umich.edu }}); 16632046SN/A } 16642101SN/A } 16652026SN/A 16662101SN/A 0x1: decode FUNCTION_LO { 16674661Sksewell@umich.edu format MT_Control { 16686384Sgblack@eecs.umich.edu 0x0: fork({{ 16696384Sgblack@eecs.umich.edu forkThread(xc->tcBase(), fault, RD, Rs, Rt); 16706384Sgblack@eecs.umich.edu }}, UserMode); 16716384Sgblack@eecs.umich.edu 0x1: yield({{ 167213389Sgabeblack@google.com Rd = yieldThread(xc->tcBase(), fault, Rs_sw, 16736384Sgblack@eecs.umich.edu YQMask); 16746384Sgblack@eecs.umich.edu }}, UserMode); 16754661Sksewell@umich.edu } 16764661Sksewell@umich.edu 16774661Sksewell@umich.edu //Table 5-9 MIPS32 LX Encoding of the op Field (DSP ASE MANUAL) 16784661Sksewell@umich.edu 0x2: decode OP_HI { 16794661Sksewell@umich.edu 0x0: decode OP_LO { 16804661Sksewell@umich.edu format LoadIndexedMemory { 168113389Sgabeblack@google.com 0x0: lwx({{ Rd = Mem; }}); 168213389Sgabeblack@google.com 0x4: lhx({{ Rd = Mem_sh; }}); 168313389Sgabeblack@google.com 0x6: lbux({{ Rd = Mem_ub; }}); 16844661Sksewell@umich.edu } 16854661Sksewell@umich.edu } 16864661Sksewell@umich.edu } 16876384Sgblack@eecs.umich.edu 0x4: DspIntOp::insv({{ 16886384Sgblack@eecs.umich.edu int pos = dspctl<5:0>; 16896384Sgblack@eecs.umich.edu int size = dspctl<12:7> - 1; 169013389Sgabeblack@google.com Rt = insertBits(Rt, pos + size, pos, Rs<size:0>); 16916384Sgblack@eecs.umich.edu }}); 16924661Sksewell@umich.edu } 16934661Sksewell@umich.edu 16944661Sksewell@umich.edu 0x2: decode FUNCTION_LO { 16954661Sksewell@umich.edu 16966384Sgblack@eecs.umich.edu //Table 5-5 MIPS32 ADDU.QB Encoding of the op Field 16976384Sgblack@eecs.umich.edu //(DSP ASE MANUAL) 16984661Sksewell@umich.edu 0x0: decode OP_HI { 16994661Sksewell@umich.edu 0x0: decode OP_LO { 17004661Sksewell@umich.edu format DspIntOp { 17016384Sgblack@eecs.umich.edu 0x0: addu_qb({{ 170213389Sgabeblack@google.com Rd = dspAdd(Rs, Rt, SIMD_FMT_QB, 170313389Sgabeblack@google.com NOSATURATE, UNSIGNED, &dspctl); 17046384Sgblack@eecs.umich.edu }}); 17056384Sgblack@eecs.umich.edu 0x1: subu_qb({{ 170613389Sgabeblack@google.com Rd = dspSub(Rs, Rt, SIMD_FMT_QB, 170713389Sgabeblack@google.com NOSATURATE, UNSIGNED, &dspctl); 17086384Sgblack@eecs.umich.edu }}); 17096384Sgblack@eecs.umich.edu 0x4: addu_s_qb({{ 171013389Sgabeblack@google.com Rd = dspAdd(Rs, Rt, SIMD_FMT_QB, 171113389Sgabeblack@google.com SATURATE, UNSIGNED, &dspctl); 17126384Sgblack@eecs.umich.edu }}); 17136384Sgblack@eecs.umich.edu 0x5: subu_s_qb({{ 171413389Sgabeblack@google.com Rd = dspSub(Rs, Rt, SIMD_FMT_QB, 171513389Sgabeblack@google.com SATURATE, UNSIGNED, &dspctl); 17166384Sgblack@eecs.umich.edu }}); 17176384Sgblack@eecs.umich.edu 0x6: muleu_s_ph_qbl({{ 171813389Sgabeblack@google.com Rd = dspMuleu(Rs, Rt, MODE_L, &dspctl); 17196384Sgblack@eecs.umich.edu }}, IntMultOp); 17206384Sgblack@eecs.umich.edu 0x7: muleu_s_ph_qbr({{ 172113389Sgabeblack@google.com Rd = dspMuleu(Rs, Rt, MODE_R, &dspctl); 17226384Sgblack@eecs.umich.edu }}, IntMultOp); 17234661Sksewell@umich.edu } 17244661Sksewell@umich.edu } 17254661Sksewell@umich.edu 0x1: decode OP_LO { 17264661Sksewell@umich.edu format DspIntOp { 17276384Sgblack@eecs.umich.edu 0x0: addu_ph({{ 172813389Sgabeblack@google.com Rd = dspAdd(Rs, Rt, SIMD_FMT_PH, 172913389Sgabeblack@google.com NOSATURATE, UNSIGNED, &dspctl); 17306384Sgblack@eecs.umich.edu }}); 17316384Sgblack@eecs.umich.edu 0x1: subu_ph({{ 173213389Sgabeblack@google.com Rd = dspSub(Rs, Rt, SIMD_FMT_PH, 173313389Sgabeblack@google.com NOSATURATE, UNSIGNED, &dspctl); 17346384Sgblack@eecs.umich.edu }}); 17356384Sgblack@eecs.umich.edu 0x2: addq_ph({{ 173613389Sgabeblack@google.com Rd = dspAdd(Rs, Rt, SIMD_FMT_PH, 173713389Sgabeblack@google.com NOSATURATE, SIGNED, &dspctl); 17386384Sgblack@eecs.umich.edu }}); 17396384Sgblack@eecs.umich.edu 0x3: subq_ph({{ 174013389Sgabeblack@google.com Rd = dspSub(Rs, Rt, SIMD_FMT_PH, 174113389Sgabeblack@google.com NOSATURATE, SIGNED, &dspctl); 17426384Sgblack@eecs.umich.edu }}); 17436384Sgblack@eecs.umich.edu 0x4: addu_s_ph({{ 174413389Sgabeblack@google.com Rd = dspAdd(Rs, Rt, SIMD_FMT_PH, 174513389Sgabeblack@google.com SATURATE, UNSIGNED, &dspctl); 17466384Sgblack@eecs.umich.edu }}); 17476384Sgblack@eecs.umich.edu 0x5: subu_s_ph({{ 174813389Sgabeblack@google.com Rd = dspSub(Rs, Rt, SIMD_FMT_PH, 174913389Sgabeblack@google.com SATURATE, UNSIGNED, &dspctl); 17506384Sgblack@eecs.umich.edu }}); 17516384Sgblack@eecs.umich.edu 0x6: addq_s_ph({{ 175213389Sgabeblack@google.com Rd = dspAdd(Rs, Rt, SIMD_FMT_PH, 175313389Sgabeblack@google.com SATURATE, SIGNED, &dspctl); 17546384Sgblack@eecs.umich.edu }}); 17556384Sgblack@eecs.umich.edu 0x7: subq_s_ph({{ 175613389Sgabeblack@google.com Rd = dspSub(Rs, Rt, SIMD_FMT_PH, 175713389Sgabeblack@google.com SATURATE, SIGNED, &dspctl); 17586384Sgblack@eecs.umich.edu }}); 17594661Sksewell@umich.edu } 17604661Sksewell@umich.edu } 17614661Sksewell@umich.edu 0x2: decode OP_LO { 17624661Sksewell@umich.edu format DspIntOp { 17636384Sgblack@eecs.umich.edu 0x0: addsc({{ 17646384Sgblack@eecs.umich.edu int64_t dresult; 17658588Sgblack@eecs.umich.edu dresult = Rs_ud + Rt_ud; 176613389Sgabeblack@google.com Rd = dresult<31:0>; 17676384Sgblack@eecs.umich.edu dspctl = insertBits(dspctl, 13, 13, 17686384Sgblack@eecs.umich.edu dresult<32:32>); 17696384Sgblack@eecs.umich.edu }}); 17706384Sgblack@eecs.umich.edu 0x1: addwc({{ 17716384Sgblack@eecs.umich.edu int64_t dresult; 17728588Sgblack@eecs.umich.edu dresult = Rs_sd + Rt_sd + dspctl<13:13>; 177313389Sgabeblack@google.com Rd = dresult<31:0>; 17746384Sgblack@eecs.umich.edu if (dresult<32:32> != dresult<31:31>) 17756384Sgblack@eecs.umich.edu dspctl = insertBits(dspctl, 20, 20, 1); 17766384Sgblack@eecs.umich.edu }}); 17776384Sgblack@eecs.umich.edu 0x2: modsub({{ 177813389Sgabeblack@google.com Rd = (Rs_sw == 0) ? Rt_sw<23:8> : 17798588Sgblack@eecs.umich.edu Rs_sw - Rt_sw<7:0>; 17806384Sgblack@eecs.umich.edu }}); 17816384Sgblack@eecs.umich.edu 0x4: raddu_w_qb({{ 178213389Sgabeblack@google.com Rd = Rs<31:24> + Rs<23:16> + 178313389Sgabeblack@google.com Rs<15:8> + Rs<7:0>; 17846384Sgblack@eecs.umich.edu }}); 17856384Sgblack@eecs.umich.edu 0x6: addq_s_w({{ 178613389Sgabeblack@google.com Rd = dspAdd(Rs_sw, Rt_sw, SIMD_FMT_W, 17876384Sgblack@eecs.umich.edu SATURATE, SIGNED, &dspctl); 17886384Sgblack@eecs.umich.edu }}); 17896384Sgblack@eecs.umich.edu 0x7: subq_s_w({{ 179013389Sgabeblack@google.com Rd = dspSub(Rs_sw, Rt_sw, SIMD_FMT_W, 17916384Sgblack@eecs.umich.edu SATURATE, SIGNED, &dspctl); 17926384Sgblack@eecs.umich.edu }}); 17934661Sksewell@umich.edu } 17944661Sksewell@umich.edu } 17954661Sksewell@umich.edu 0x3: decode OP_LO { 17964661Sksewell@umich.edu format DspIntOp { 17976384Sgblack@eecs.umich.edu 0x4: muleq_s_w_phl({{ 179813389Sgabeblack@google.com Rd = dspMuleq(Rs_sw, Rt_sw, 17996384Sgblack@eecs.umich.edu MODE_L, &dspctl); 18006384Sgblack@eecs.umich.edu }}, IntMultOp); 18016384Sgblack@eecs.umich.edu 0x5: muleq_s_w_phr({{ 180213389Sgabeblack@google.com Rd = dspMuleq(Rs_sw, Rt_sw, 18036384Sgblack@eecs.umich.edu MODE_R, &dspctl); 18046384Sgblack@eecs.umich.edu }}, IntMultOp); 18056384Sgblack@eecs.umich.edu 0x6: mulq_s_ph({{ 180613389Sgabeblack@google.com Rd = dspMulq(Rs_sw, Rt_sw, SIMD_FMT_PH, 18076384Sgblack@eecs.umich.edu SATURATE, NOROUND, &dspctl); 18086384Sgblack@eecs.umich.edu }}, IntMultOp); 18096384Sgblack@eecs.umich.edu 0x7: mulq_rs_ph({{ 181013389Sgabeblack@google.com Rd = dspMulq(Rs_sw, Rt_sw, SIMD_FMT_PH, 18116384Sgblack@eecs.umich.edu SATURATE, ROUND, &dspctl); 18126384Sgblack@eecs.umich.edu }}, IntMultOp); 18134661Sksewell@umich.edu } 18144661Sksewell@umich.edu } 18154661Sksewell@umich.edu } 18164661Sksewell@umich.edu 18176384Sgblack@eecs.umich.edu //Table 5-6 MIPS32 CMPU_EQ_QB Encoding of the op Field 18186384Sgblack@eecs.umich.edu //(DSP ASE MANUAL) 18194661Sksewell@umich.edu 0x1: decode OP_HI { 18204661Sksewell@umich.edu 0x0: decode OP_LO { 18214661Sksewell@umich.edu format DspIntOp { 18226384Sgblack@eecs.umich.edu 0x0: cmpu_eq_qb({{ 182313389Sgabeblack@google.com dspCmp(Rs, Rt, SIMD_FMT_QB, 18246384Sgblack@eecs.umich.edu UNSIGNED, CMP_EQ, &dspctl); 18256384Sgblack@eecs.umich.edu }}); 18266384Sgblack@eecs.umich.edu 0x1: cmpu_lt_qb({{ 182713389Sgabeblack@google.com dspCmp(Rs, Rt, SIMD_FMT_QB, 18286384Sgblack@eecs.umich.edu UNSIGNED, CMP_LT, &dspctl); 18296384Sgblack@eecs.umich.edu }}); 18306384Sgblack@eecs.umich.edu 0x2: cmpu_le_qb({{ 183113389Sgabeblack@google.com dspCmp(Rs, Rt, SIMD_FMT_QB, 18326384Sgblack@eecs.umich.edu UNSIGNED, CMP_LE, &dspctl); 18336384Sgblack@eecs.umich.edu }}); 18346384Sgblack@eecs.umich.edu 0x3: pick_qb({{ 183513389Sgabeblack@google.com Rd = dspPick(Rs, Rt, SIMD_FMT_QB, &dspctl); 18366384Sgblack@eecs.umich.edu }}); 18376384Sgblack@eecs.umich.edu 0x4: cmpgu_eq_qb({{ 183813389Sgabeblack@google.com Rd = dspCmpg(Rs, Rt, SIMD_FMT_QB, 183913389Sgabeblack@google.com UNSIGNED, CMP_EQ ); 18406384Sgblack@eecs.umich.edu }}); 18416384Sgblack@eecs.umich.edu 0x5: cmpgu_lt_qb({{ 184213389Sgabeblack@google.com Rd = dspCmpg(Rs, Rt, SIMD_FMT_QB, 184313389Sgabeblack@google.com UNSIGNED, CMP_LT); 18446384Sgblack@eecs.umich.edu }}); 18456384Sgblack@eecs.umich.edu 0x6: cmpgu_le_qb({{ 184613389Sgabeblack@google.com Rd = dspCmpg(Rs, Rt, SIMD_FMT_QB, 184713389Sgabeblack@google.com UNSIGNED, CMP_LE); 18486384Sgblack@eecs.umich.edu }}); 18494661Sksewell@umich.edu } 18504661Sksewell@umich.edu } 18514661Sksewell@umich.edu 0x1: decode OP_LO { 18524661Sksewell@umich.edu format DspIntOp { 18536384Sgblack@eecs.umich.edu 0x0: cmp_eq_ph({{ 185413389Sgabeblack@google.com dspCmp(Rs, Rt, SIMD_FMT_PH, 18556384Sgblack@eecs.umich.edu SIGNED, CMP_EQ, &dspctl); 18566384Sgblack@eecs.umich.edu }}); 18576384Sgblack@eecs.umich.edu 0x1: cmp_lt_ph({{ 185813389Sgabeblack@google.com dspCmp(Rs, Rt, SIMD_FMT_PH, 18596384Sgblack@eecs.umich.edu SIGNED, CMP_LT, &dspctl); 18606384Sgblack@eecs.umich.edu }}); 18616384Sgblack@eecs.umich.edu 0x2: cmp_le_ph({{ 186213389Sgabeblack@google.com dspCmp(Rs, Rt, SIMD_FMT_PH, 18636384Sgblack@eecs.umich.edu SIGNED, CMP_LE, &dspctl); 18646384Sgblack@eecs.umich.edu }}); 18656384Sgblack@eecs.umich.edu 0x3: pick_ph({{ 186613389Sgabeblack@google.com Rd = dspPick(Rs, Rt, SIMD_FMT_PH, &dspctl); 18676384Sgblack@eecs.umich.edu }}); 18686384Sgblack@eecs.umich.edu 0x4: precrq_qb_ph({{ 186913389Sgabeblack@google.com Rd = Rs<31:24> << 24 | Rs<15:8> << 16 | 187013389Sgabeblack@google.com Rt<31:24> << 8 | Rt<15:8>; 18716384Sgblack@eecs.umich.edu }}); 18726384Sgblack@eecs.umich.edu 0x5: precr_qb_ph({{ 187313389Sgabeblack@google.com Rd = Rs<23:16> << 24 | Rs<7:0> << 16 | 187413389Sgabeblack@google.com Rt<23:16> << 8 | Rt<7:0>; 18756384Sgblack@eecs.umich.edu }}); 18766384Sgblack@eecs.umich.edu 0x6: packrl_ph({{ 187713389Sgabeblack@google.com Rd = dspPack(Rs, Rt, SIMD_FMT_PH); 18786384Sgblack@eecs.umich.edu }}); 18796384Sgblack@eecs.umich.edu 0x7: precrqu_s_qb_ph({{ 188013389Sgabeblack@google.com Rd = dspPrecrqu(Rs, Rt, &dspctl); 18816384Sgblack@eecs.umich.edu }}); 18824661Sksewell@umich.edu } 18834661Sksewell@umich.edu } 18844661Sksewell@umich.edu 0x2: decode OP_LO { 18854661Sksewell@umich.edu format DspIntOp { 18866384Sgblack@eecs.umich.edu 0x4: precrq_ph_w({{ 188713389Sgabeblack@google.com Rd = Rs<31:16> << 16 | Rt<31:16>; 18886384Sgblack@eecs.umich.edu }}); 18896384Sgblack@eecs.umich.edu 0x5: precrq_rs_ph_w({{ 189013389Sgabeblack@google.com Rd = dspPrecrq(Rs, Rt, SIMD_FMT_W, &dspctl); 18916384Sgblack@eecs.umich.edu }}); 18924661Sksewell@umich.edu } 18934661Sksewell@umich.edu } 18944661Sksewell@umich.edu 0x3: decode OP_LO { 18954661Sksewell@umich.edu format DspIntOp { 18966384Sgblack@eecs.umich.edu 0x0: cmpgdu_eq_qb({{ 189713389Sgabeblack@google.com Rd = dspCmpgd(Rs, Rt, SIMD_FMT_QB, 189813389Sgabeblack@google.com UNSIGNED, CMP_EQ, &dspctl); 18996384Sgblack@eecs.umich.edu }}); 19006384Sgblack@eecs.umich.edu 0x1: cmpgdu_lt_qb({{ 190113389Sgabeblack@google.com Rd = dspCmpgd(Rs, Rt, SIMD_FMT_QB, 190213389Sgabeblack@google.com UNSIGNED, CMP_LT, &dspctl); 19036384Sgblack@eecs.umich.edu }}); 19046384Sgblack@eecs.umich.edu 0x2: cmpgdu_le_qb({{ 190513389Sgabeblack@google.com Rd = dspCmpgd(Rs, Rt, SIMD_FMT_QB, 190613389Sgabeblack@google.com UNSIGNED, CMP_LE, &dspctl); 19076384Sgblack@eecs.umich.edu }}); 19086384Sgblack@eecs.umich.edu 0x6: precr_sra_ph_w({{ 190913389Sgabeblack@google.com Rt = dspPrecrSra(Rt, Rs, RD, 191013389Sgabeblack@google.com SIMD_FMT_W, NOROUND); 19116384Sgblack@eecs.umich.edu }}); 19126384Sgblack@eecs.umich.edu 0x7: precr_sra_r_ph_w({{ 191313389Sgabeblack@google.com Rt = dspPrecrSra(Rt, Rs, RD, 191413389Sgabeblack@google.com SIMD_FMT_W, ROUND); 19156384Sgblack@eecs.umich.edu }}); 19164661Sksewell@umich.edu } 19174661Sksewell@umich.edu } 19184661Sksewell@umich.edu } 19194661Sksewell@umich.edu 19206384Sgblack@eecs.umich.edu //Table 5-7 MIPS32 ABSQ_S.PH Encoding of the op Field 19216384Sgblack@eecs.umich.edu //(DSP ASE MANUAL) 19224661Sksewell@umich.edu 0x2: decode OP_HI { 19234661Sksewell@umich.edu 0x0: decode OP_LO { 19244661Sksewell@umich.edu format DspIntOp { 19256384Sgblack@eecs.umich.edu 0x1: absq_s_qb({{ 192613389Sgabeblack@google.com Rd = dspAbs(Rt_sw, SIMD_FMT_QB, &dspctl); 19276384Sgblack@eecs.umich.edu }}); 19286384Sgblack@eecs.umich.edu 0x2: repl_qb({{ 192913389Sgabeblack@google.com Rd = RS_RT<7:0> << 24 | RS_RT<7:0> << 16 | 193013389Sgabeblack@google.com RS_RT<7:0> << 8 | RS_RT<7:0>; 19316384Sgblack@eecs.umich.edu }}); 19326384Sgblack@eecs.umich.edu 0x3: replv_qb({{ 193313389Sgabeblack@google.com Rd = Rt<7:0> << 24 | Rt<7:0> << 16 | 193413389Sgabeblack@google.com Rt<7:0> << 8 | Rt<7:0>; 19356384Sgblack@eecs.umich.edu }}); 19366384Sgblack@eecs.umich.edu 0x4: precequ_ph_qbl({{ 193713389Sgabeblack@google.com Rd = dspPrece(Rt, SIMD_FMT_QB, UNSIGNED, 193813389Sgabeblack@google.com SIMD_FMT_PH, SIGNED, MODE_L); 19396384Sgblack@eecs.umich.edu }}); 19406384Sgblack@eecs.umich.edu 0x5: precequ_ph_qbr({{ 194113389Sgabeblack@google.com Rd = dspPrece(Rt, SIMD_FMT_QB, UNSIGNED, 194213389Sgabeblack@google.com SIMD_FMT_PH, SIGNED, MODE_R); 19436384Sgblack@eecs.umich.edu }}); 19446384Sgblack@eecs.umich.edu 0x6: precequ_ph_qbla({{ 194513389Sgabeblack@google.com Rd = dspPrece(Rt, SIMD_FMT_QB, UNSIGNED, 194613389Sgabeblack@google.com SIMD_FMT_PH, SIGNED, MODE_LA); 19476384Sgblack@eecs.umich.edu }}); 19486384Sgblack@eecs.umich.edu 0x7: precequ_ph_qbra({{ 194913389Sgabeblack@google.com Rd = dspPrece(Rt, SIMD_FMT_QB, UNSIGNED, 195013389Sgabeblack@google.com SIMD_FMT_PH, SIGNED, MODE_RA); 19516384Sgblack@eecs.umich.edu }}); 19524661Sksewell@umich.edu } 19534661Sksewell@umich.edu } 19544661Sksewell@umich.edu 0x1: decode OP_LO { 19554661Sksewell@umich.edu format DspIntOp { 19566384Sgblack@eecs.umich.edu 0x1: absq_s_ph({{ 195713389Sgabeblack@google.com Rd = dspAbs(Rt_sw, SIMD_FMT_PH, &dspctl); 19586384Sgblack@eecs.umich.edu }}); 19596384Sgblack@eecs.umich.edu 0x2: repl_ph({{ 196013389Sgabeblack@google.com Rd = (sext<10>(RS_RT))<15:0> << 16 | 19616384Sgblack@eecs.umich.edu (sext<10>(RS_RT))<15:0>; 19626384Sgblack@eecs.umich.edu }}); 19636384Sgblack@eecs.umich.edu 0x3: replv_ph({{ 196413389Sgabeblack@google.com Rd = Rt<15:0> << 16 | Rt<15:0>; 19656384Sgblack@eecs.umich.edu }}); 19666384Sgblack@eecs.umich.edu 0x4: preceq_w_phl({{ 196713389Sgabeblack@google.com Rd = dspPrece(Rt, SIMD_FMT_PH, SIGNED, 196813389Sgabeblack@google.com SIMD_FMT_W, SIGNED, MODE_L); 19696384Sgblack@eecs.umich.edu }}); 19706384Sgblack@eecs.umich.edu 0x5: preceq_w_phr({{ 197113389Sgabeblack@google.com Rd = dspPrece(Rt, SIMD_FMT_PH, SIGNED, 197213389Sgabeblack@google.com SIMD_FMT_W, SIGNED, MODE_R); 19736384Sgblack@eecs.umich.edu }}); 19744661Sksewell@umich.edu } 19754661Sksewell@umich.edu } 19764661Sksewell@umich.edu 0x2: decode OP_LO { 19774661Sksewell@umich.edu format DspIntOp { 19786384Sgblack@eecs.umich.edu 0x1: absq_s_w({{ 197913389Sgabeblack@google.com Rd = dspAbs(Rt_sw, SIMD_FMT_W, &dspctl); 19806384Sgblack@eecs.umich.edu }}); 19814661Sksewell@umich.edu } 19824661Sksewell@umich.edu } 19834661Sksewell@umich.edu 0x3: decode OP_LO { 19846384Sgblack@eecs.umich.edu 0x3: IntOp::bitrev({{ 198513389Sgabeblack@google.com Rd = bitrev(Rt<15:0>); 19866384Sgblack@eecs.umich.edu }}); 19874661Sksewell@umich.edu format DspIntOp { 19886384Sgblack@eecs.umich.edu 0x4: preceu_ph_qbl({{ 198913389Sgabeblack@google.com Rd = dspPrece(Rt, SIMD_FMT_QB, 199013389Sgabeblack@google.com UNSIGNED, SIMD_FMT_PH, 19916384Sgblack@eecs.umich.edu UNSIGNED, MODE_L); 19926384Sgblack@eecs.umich.edu }}); 19936384Sgblack@eecs.umich.edu 0x5: preceu_ph_qbr({{ 199413389Sgabeblack@google.com Rd = dspPrece(Rt, SIMD_FMT_QB, 199513389Sgabeblack@google.com UNSIGNED, SIMD_FMT_PH, 19966384Sgblack@eecs.umich.edu UNSIGNED, MODE_R ); 19976384Sgblack@eecs.umich.edu }}); 19986384Sgblack@eecs.umich.edu 0x6: preceu_ph_qbla({{ 199913389Sgabeblack@google.com Rd = dspPrece(Rt, SIMD_FMT_QB, 200013389Sgabeblack@google.com UNSIGNED, SIMD_FMT_PH, 200113389Sgabeblack@google.com UNSIGNED, MODE_LA ); 20026384Sgblack@eecs.umich.edu }}); 20036384Sgblack@eecs.umich.edu 0x7: preceu_ph_qbra({{ 200413389Sgabeblack@google.com Rd = dspPrece(Rt, SIMD_FMT_QB, 200513389Sgabeblack@google.com UNSIGNED, SIMD_FMT_PH, 20066384Sgblack@eecs.umich.edu UNSIGNED, MODE_RA); 20076384Sgblack@eecs.umich.edu }}); 20084661Sksewell@umich.edu } 20094661Sksewell@umich.edu } 20104661Sksewell@umich.edu } 20114661Sksewell@umich.edu 20126384Sgblack@eecs.umich.edu //Table 5-8 MIPS32 SHLL.QB Encoding of the op Field 20136384Sgblack@eecs.umich.edu //(DSP ASE MANUAL) 20144661Sksewell@umich.edu 0x3: decode OP_HI { 20154661Sksewell@umich.edu 0x0: decode OP_LO { 20164661Sksewell@umich.edu format DspIntOp { 20176384Sgblack@eecs.umich.edu 0x0: shll_qb({{ 201813389Sgabeblack@google.com Rd = dspShll(Rt_sw, RS, SIMD_FMT_QB, 201913389Sgabeblack@google.com NOSATURATE, UNSIGNED, &dspctl); 20206384Sgblack@eecs.umich.edu }}); 20216384Sgblack@eecs.umich.edu 0x1: shrl_qb({{ 202213389Sgabeblack@google.com Rd = dspShrl(Rt_sw, RS, SIMD_FMT_QB, 202313389Sgabeblack@google.com UNSIGNED); 20246384Sgblack@eecs.umich.edu }}); 20256384Sgblack@eecs.umich.edu 0x2: shllv_qb({{ 202613389Sgabeblack@google.com Rd = dspShll(Rt_sw, Rs_sw, SIMD_FMT_QB, 202713389Sgabeblack@google.com NOSATURATE, UNSIGNED, &dspctl); 20286384Sgblack@eecs.umich.edu }}); 20296384Sgblack@eecs.umich.edu 0x3: shrlv_qb({{ 203013389Sgabeblack@google.com Rd = dspShrl(Rt_sw, Rs_sw, SIMD_FMT_QB, 203113389Sgabeblack@google.com UNSIGNED); 20326384Sgblack@eecs.umich.edu }}); 20336384Sgblack@eecs.umich.edu 0x4: shra_qb({{ 203413389Sgabeblack@google.com Rd = dspShra(Rt_sw, RS, SIMD_FMT_QB, 203513389Sgabeblack@google.com NOROUND, SIGNED, &dspctl); 20366384Sgblack@eecs.umich.edu }}); 20376384Sgblack@eecs.umich.edu 0x5: shra_r_qb({{ 203813389Sgabeblack@google.com Rd = dspShra(Rt_sw, RS, SIMD_FMT_QB, 203913389Sgabeblack@google.com ROUND, SIGNED, &dspctl); 20406384Sgblack@eecs.umich.edu }}); 20416384Sgblack@eecs.umich.edu 0x6: shrav_qb({{ 204213389Sgabeblack@google.com Rd = dspShra(Rt_sw, Rs_sw, SIMD_FMT_QB, 204313389Sgabeblack@google.com NOROUND, SIGNED, &dspctl); 20446384Sgblack@eecs.umich.edu }}); 20456384Sgblack@eecs.umich.edu 0x7: shrav_r_qb({{ 204613389Sgabeblack@google.com Rd = dspShra(Rt_sw, Rs_sw, SIMD_FMT_QB, 204713389Sgabeblack@google.com ROUND, SIGNED, &dspctl); 20486384Sgblack@eecs.umich.edu }}); 20494661Sksewell@umich.edu } 20504661Sksewell@umich.edu } 20514661Sksewell@umich.edu 0x1: decode OP_LO { 20524661Sksewell@umich.edu format DspIntOp { 20536384Sgblack@eecs.umich.edu 0x0: shll_ph({{ 205413389Sgabeblack@google.com Rd = dspShll(Rt, RS, SIMD_FMT_PH, 205513389Sgabeblack@google.com NOSATURATE, SIGNED, &dspctl); 20566384Sgblack@eecs.umich.edu }}); 20576384Sgblack@eecs.umich.edu 0x1: shra_ph({{ 205813389Sgabeblack@google.com Rd = dspShra(Rt_sw, RS, SIMD_FMT_PH, 205913389Sgabeblack@google.com NOROUND, SIGNED, &dspctl); 20606384Sgblack@eecs.umich.edu }}); 20616384Sgblack@eecs.umich.edu 0x2: shllv_ph({{ 206213389Sgabeblack@google.com Rd = dspShll(Rt_sw, Rs_sw, SIMD_FMT_PH, 206313389Sgabeblack@google.com NOSATURATE, SIGNED, &dspctl); 20646384Sgblack@eecs.umich.edu }}); 20656384Sgblack@eecs.umich.edu 0x3: shrav_ph({{ 206613389Sgabeblack@google.com Rd = dspShra(Rt_sw, Rs_sw, SIMD_FMT_PH, 206713389Sgabeblack@google.com NOROUND, SIGNED, &dspctl); 20686384Sgblack@eecs.umich.edu }}); 20696384Sgblack@eecs.umich.edu 0x4: shll_s_ph({{ 207013389Sgabeblack@google.com Rd = dspShll(Rt_sw, RS, SIMD_FMT_PH, 207113389Sgabeblack@google.com SATURATE, SIGNED, &dspctl); 20726384Sgblack@eecs.umich.edu }}); 20736384Sgblack@eecs.umich.edu 0x5: shra_r_ph({{ 207413389Sgabeblack@google.com Rd = dspShra(Rt_sw, RS, SIMD_FMT_PH, 207513389Sgabeblack@google.com ROUND, SIGNED, &dspctl); 20766384Sgblack@eecs.umich.edu }}); 20776384Sgblack@eecs.umich.edu 0x6: shllv_s_ph({{ 207813389Sgabeblack@google.com Rd = dspShll(Rt_sw, Rs_sw, SIMD_FMT_PH, 207913389Sgabeblack@google.com SATURATE, SIGNED, &dspctl); 20806384Sgblack@eecs.umich.edu }}); 20816384Sgblack@eecs.umich.edu 0x7: shrav_r_ph({{ 208213389Sgabeblack@google.com Rd = dspShra(Rt_sw, Rs_sw, SIMD_FMT_PH, 208313389Sgabeblack@google.com ROUND, SIGNED, &dspctl); 20846384Sgblack@eecs.umich.edu }}); 20854661Sksewell@umich.edu } 20864661Sksewell@umich.edu } 20874661Sksewell@umich.edu 0x2: decode OP_LO { 20884661Sksewell@umich.edu format DspIntOp { 20896384Sgblack@eecs.umich.edu 0x4: shll_s_w({{ 209013389Sgabeblack@google.com Rd = dspShll(Rt_sw, RS, SIMD_FMT_W, 209113389Sgabeblack@google.com SATURATE, SIGNED, &dspctl); 20926384Sgblack@eecs.umich.edu }}); 20936384Sgblack@eecs.umich.edu 0x5: shra_r_w({{ 209413389Sgabeblack@google.com Rd = dspShra(Rt_sw, RS, SIMD_FMT_W, 209513389Sgabeblack@google.com ROUND, SIGNED, &dspctl); 20966384Sgblack@eecs.umich.edu }}); 20976384Sgblack@eecs.umich.edu 0x6: shllv_s_w({{ 209813389Sgabeblack@google.com Rd = dspShll(Rt_sw, Rs_sw, SIMD_FMT_W, 209913389Sgabeblack@google.com SATURATE, SIGNED, &dspctl); 21006384Sgblack@eecs.umich.edu }}); 21016384Sgblack@eecs.umich.edu 0x7: shrav_r_w({{ 210213389Sgabeblack@google.com Rd = dspShra(Rt_sw, Rs_sw, SIMD_FMT_W, 210313389Sgabeblack@google.com ROUND, SIGNED, &dspctl); 21046384Sgblack@eecs.umich.edu }}); 21054661Sksewell@umich.edu } 21064661Sksewell@umich.edu } 21074661Sksewell@umich.edu 0x3: decode OP_LO { 21084661Sksewell@umich.edu format DspIntOp { 21096384Sgblack@eecs.umich.edu 0x1: shrl_ph({{ 211013389Sgabeblack@google.com Rd = dspShrl(Rt_sw, RS, SIMD_FMT_PH, 211113389Sgabeblack@google.com UNSIGNED); 21126384Sgblack@eecs.umich.edu }}); 21136384Sgblack@eecs.umich.edu 0x3: shrlv_ph({{ 211413389Sgabeblack@google.com Rd = dspShrl(Rt_sw, Rs_sw, SIMD_FMT_PH, 211513389Sgabeblack@google.com UNSIGNED); 21166384Sgblack@eecs.umich.edu }}); 21174661Sksewell@umich.edu } 21184661Sksewell@umich.edu } 21194661Sksewell@umich.edu } 21204661Sksewell@umich.edu } 21214661Sksewell@umich.edu 21224661Sksewell@umich.edu 0x3: decode FUNCTION_LO { 21234661Sksewell@umich.edu 21246384Sgblack@eecs.umich.edu //Table 3.12 MIPS32 ADDUH.QB Encoding of the op Field 21256384Sgblack@eecs.umich.edu //(DSP ASE Rev2 Manual) 21264661Sksewell@umich.edu 0x0: decode OP_HI { 21274661Sksewell@umich.edu 0x0: decode OP_LO { 21284661Sksewell@umich.edu format DspIntOp { 21296384Sgblack@eecs.umich.edu 0x0: adduh_qb({{ 213013389Sgabeblack@google.com Rd = dspAddh(Rs_sw, Rt_sw, SIMD_FMT_QB, 213113389Sgabeblack@google.com NOROUND, UNSIGNED); 21326384Sgblack@eecs.umich.edu }}); 21336384Sgblack@eecs.umich.edu 0x1: subuh_qb({{ 213413389Sgabeblack@google.com Rd = dspSubh(Rs_sw, Rt_sw, SIMD_FMT_QB, 213513389Sgabeblack@google.com NOROUND, UNSIGNED); 21366384Sgblack@eecs.umich.edu }}); 21376384Sgblack@eecs.umich.edu 0x2: adduh_r_qb({{ 213813389Sgabeblack@google.com Rd = dspAddh(Rs_sw, Rt_sw, SIMD_FMT_QB, 213913389Sgabeblack@google.com ROUND, UNSIGNED); 21406384Sgblack@eecs.umich.edu }}); 21416384Sgblack@eecs.umich.edu 0x3: subuh_r_qb({{ 214213389Sgabeblack@google.com Rd = dspSubh(Rs_sw, Rt_sw, SIMD_FMT_QB, 214313389Sgabeblack@google.com ROUND, UNSIGNED); 21446384Sgblack@eecs.umich.edu }}); 21454661Sksewell@umich.edu } 21464661Sksewell@umich.edu } 21474661Sksewell@umich.edu 0x1: decode OP_LO { 21484661Sksewell@umich.edu format DspIntOp { 21496384Sgblack@eecs.umich.edu 0x0: addqh_ph({{ 215013389Sgabeblack@google.com Rd = dspAddh(Rs_sw, Rt_sw, SIMD_FMT_PH, 215113389Sgabeblack@google.com NOROUND, SIGNED); 21526384Sgblack@eecs.umich.edu }}); 21536384Sgblack@eecs.umich.edu 0x1: subqh_ph({{ 215413389Sgabeblack@google.com Rd = dspSubh(Rs_sw, Rt_sw, SIMD_FMT_PH, 215513389Sgabeblack@google.com NOROUND, SIGNED); 21566384Sgblack@eecs.umich.edu }}); 21576384Sgblack@eecs.umich.edu 0x2: addqh_r_ph({{ 215813389Sgabeblack@google.com Rd = dspAddh(Rs_sw, Rt_sw, SIMD_FMT_PH, 215913389Sgabeblack@google.com ROUND, SIGNED); 21606384Sgblack@eecs.umich.edu }}); 21616384Sgblack@eecs.umich.edu 0x3: subqh_r_ph({{ 216213389Sgabeblack@google.com Rd = dspSubh(Rs_sw, Rt_sw, SIMD_FMT_PH, 216313389Sgabeblack@google.com ROUND, SIGNED); 21646384Sgblack@eecs.umich.edu }}); 21656384Sgblack@eecs.umich.edu 0x4: mul_ph({{ 216613389Sgabeblack@google.com Rd = dspMul(Rs_sw, Rt_sw, SIMD_FMT_PH, 216713389Sgabeblack@google.com NOSATURATE, &dspctl); 21686384Sgblack@eecs.umich.edu }}, IntMultOp); 21696384Sgblack@eecs.umich.edu 0x6: mul_s_ph({{ 217013389Sgabeblack@google.com Rd = dspMul(Rs_sw, Rt_sw, SIMD_FMT_PH, 217113389Sgabeblack@google.com SATURATE, &dspctl); 21726384Sgblack@eecs.umich.edu }}, IntMultOp); 21734661Sksewell@umich.edu } 21744661Sksewell@umich.edu } 21754661Sksewell@umich.edu 0x2: decode OP_LO { 21764661Sksewell@umich.edu format DspIntOp { 21776384Sgblack@eecs.umich.edu 0x0: addqh_w({{ 217813389Sgabeblack@google.com Rd = dspAddh(Rs_sw, Rt_sw, SIMD_FMT_W, 217913389Sgabeblack@google.com NOROUND, SIGNED); 21806384Sgblack@eecs.umich.edu }}); 21816384Sgblack@eecs.umich.edu 0x1: subqh_w({{ 218213389Sgabeblack@google.com Rd = dspSubh(Rs_sw, Rt_sw, SIMD_FMT_W, 218313389Sgabeblack@google.com NOROUND, SIGNED); 21846384Sgblack@eecs.umich.edu }}); 21856384Sgblack@eecs.umich.edu 0x2: addqh_r_w({{ 218613389Sgabeblack@google.com Rd = dspAddh(Rs_sw, Rt_sw, SIMD_FMT_W, 218713389Sgabeblack@google.com ROUND, SIGNED); 21886384Sgblack@eecs.umich.edu }}); 21896384Sgblack@eecs.umich.edu 0x3: subqh_r_w({{ 219013389Sgabeblack@google.com Rd = dspSubh(Rs_sw, Rt_sw, SIMD_FMT_W, 219113389Sgabeblack@google.com ROUND, SIGNED); 21926384Sgblack@eecs.umich.edu }}); 21936384Sgblack@eecs.umich.edu 0x6: mulq_s_w({{ 219413389Sgabeblack@google.com Rd = dspMulq(Rs_sw, Rt_sw, SIMD_FMT_W, 219513389Sgabeblack@google.com SATURATE, NOROUND, &dspctl); 21966384Sgblack@eecs.umich.edu }}, IntMultOp); 21976384Sgblack@eecs.umich.edu 0x7: mulq_rs_w({{ 219813389Sgabeblack@google.com Rd = dspMulq(Rs_sw, Rt_sw, SIMD_FMT_W, 219913389Sgabeblack@google.com SATURATE, ROUND, &dspctl); 22006384Sgblack@eecs.umich.edu }}, IntMultOp); 22014661Sksewell@umich.edu } 22024661Sksewell@umich.edu } 22032061SN/A } 22042101SN/A } 22052061SN/A 22062101SN/A //Table A-10 MIPS32 BSHFL Encoding of sa Field 22072101SN/A 0x4: decode SA { 22082046SN/A format BasicOp { 22096384Sgblack@eecs.umich.edu 0x02: wsbh({{ 221013389Sgabeblack@google.com Rd = Rt<23:16> << 24 | Rt<31:24> << 16 | 221113389Sgabeblack@google.com Rt<7:0> << 8 | Rt<15:8>; 22122686Sksewell@umich.edu }}); 221313389Sgabeblack@google.com 0x10: seb({{ Rd = Rt_sb; }}); 221413389Sgabeblack@google.com 0x18: seh({{ Rd = Rt_sh; }}); 22152046SN/A } 22162101SN/A } 22172043SN/A 22182101SN/A 0x6: decode FUNCTION_LO { 22194661Sksewell@umich.edu 22206384Sgblack@eecs.umich.edu //Table 5-10 MIPS32 DPAQ.W.PH Encoding of the op Field 22216384Sgblack@eecs.umich.edu //(DSP ASE MANUAL) 22224661Sksewell@umich.edu 0x0: decode OP_HI { 22234661Sksewell@umich.edu 0x0: decode OP_LO { 22244661Sksewell@umich.edu format DspHiLoOp { 22256384Sgblack@eecs.umich.edu 0x0: dpa_w_ph({{ 22268588Sgblack@eecs.umich.edu dspac = dspDpa(dspac, Rs_sw, Rt_sw, ACDST, 22276384Sgblack@eecs.umich.edu SIMD_FMT_PH, SIGNED, MODE_L); 22286384Sgblack@eecs.umich.edu }}, IntMultOp); 22296384Sgblack@eecs.umich.edu 0x1: dps_w_ph({{ 22308588Sgblack@eecs.umich.edu dspac = dspDps(dspac, Rs_sw, Rt_sw, ACDST, 22316384Sgblack@eecs.umich.edu SIMD_FMT_PH, SIGNED, MODE_L); 22326384Sgblack@eecs.umich.edu }}, IntMultOp); 22336384Sgblack@eecs.umich.edu 0x2: mulsa_w_ph({{ 22348588Sgblack@eecs.umich.edu dspac = dspMulsa(dspac, Rs_sw, Rt_sw, 22356384Sgblack@eecs.umich.edu ACDST, SIMD_FMT_PH ); 22366384Sgblack@eecs.umich.edu }}, IntMultOp); 22376384Sgblack@eecs.umich.edu 0x3: dpau_h_qbl({{ 22388588Sgblack@eecs.umich.edu dspac = dspDpa(dspac, Rs_sw, Rt_sw, ACDST, 22396384Sgblack@eecs.umich.edu SIMD_FMT_QB, UNSIGNED, MODE_L); 22406384Sgblack@eecs.umich.edu }}, IntMultOp); 22416384Sgblack@eecs.umich.edu 0x4: dpaq_s_w_ph({{ 22428588Sgblack@eecs.umich.edu dspac = dspDpaq(dspac, Rs_sw, Rt_sw, 22436384Sgblack@eecs.umich.edu ACDST, SIMD_FMT_PH, 22446384Sgblack@eecs.umich.edu SIMD_FMT_W, NOSATURATE, 22456384Sgblack@eecs.umich.edu MODE_L, &dspctl); 22466384Sgblack@eecs.umich.edu }}, IntMultOp); 22476384Sgblack@eecs.umich.edu 0x5: dpsq_s_w_ph({{ 22488588Sgblack@eecs.umich.edu dspac = dspDpsq(dspac, Rs_sw, Rt_sw, 22496384Sgblack@eecs.umich.edu ACDST, SIMD_FMT_PH, 22506384Sgblack@eecs.umich.edu SIMD_FMT_W, NOSATURATE, 22516384Sgblack@eecs.umich.edu MODE_L, &dspctl); 22526384Sgblack@eecs.umich.edu }}, IntMultOp); 22536384Sgblack@eecs.umich.edu 0x6: mulsaq_s_w_ph({{ 22548588Sgblack@eecs.umich.edu dspac = dspMulsaq(dspac, Rs_sw, Rt_sw, 22556384Sgblack@eecs.umich.edu ACDST, SIMD_FMT_PH, 22566384Sgblack@eecs.umich.edu &dspctl); 22576384Sgblack@eecs.umich.edu }}, IntMultOp); 22586384Sgblack@eecs.umich.edu 0x7: dpau_h_qbr({{ 22598588Sgblack@eecs.umich.edu dspac = dspDpa(dspac, Rs_sw, Rt_sw, ACDST, 22606384Sgblack@eecs.umich.edu SIMD_FMT_QB, UNSIGNED, MODE_R); 22616384Sgblack@eecs.umich.edu }}, IntMultOp); 22624661Sksewell@umich.edu } 22634661Sksewell@umich.edu } 22644661Sksewell@umich.edu 0x1: decode OP_LO { 22654661Sksewell@umich.edu format DspHiLoOp { 22666384Sgblack@eecs.umich.edu 0x0: dpax_w_ph({{ 22678588Sgblack@eecs.umich.edu dspac = dspDpa(dspac, Rs_sw, Rt_sw, ACDST, 22686384Sgblack@eecs.umich.edu SIMD_FMT_PH, SIGNED, MODE_X); 22696384Sgblack@eecs.umich.edu }}, IntMultOp); 22706384Sgblack@eecs.umich.edu 0x1: dpsx_w_ph({{ 22718588Sgblack@eecs.umich.edu dspac = dspDps(dspac, Rs_sw, Rt_sw, ACDST, 22726384Sgblack@eecs.umich.edu SIMD_FMT_PH, SIGNED, MODE_X); 22736384Sgblack@eecs.umich.edu }}, IntMultOp); 22746384Sgblack@eecs.umich.edu 0x3: dpsu_h_qbl({{ 22758588Sgblack@eecs.umich.edu dspac = dspDps(dspac, Rs_sw, Rt_sw, ACDST, 22766384Sgblack@eecs.umich.edu SIMD_FMT_QB, UNSIGNED, MODE_L); 22776384Sgblack@eecs.umich.edu }}, IntMultOp); 22786384Sgblack@eecs.umich.edu 0x4: dpaq_sa_l_w({{ 22798588Sgblack@eecs.umich.edu dspac = dspDpaq(dspac, Rs_sw, Rt_sw, 22806384Sgblack@eecs.umich.edu ACDST, SIMD_FMT_W, 22816384Sgblack@eecs.umich.edu SIMD_FMT_L, SATURATE, 22826384Sgblack@eecs.umich.edu MODE_L, &dspctl); 22836384Sgblack@eecs.umich.edu }}, IntMultOp); 22846384Sgblack@eecs.umich.edu 0x5: dpsq_sa_l_w({{ 22858588Sgblack@eecs.umich.edu dspac = dspDpsq(dspac, Rs_sw, Rt_sw, 22866384Sgblack@eecs.umich.edu ACDST, SIMD_FMT_W, 22876384Sgblack@eecs.umich.edu SIMD_FMT_L, SATURATE, 22886384Sgblack@eecs.umich.edu MODE_L, &dspctl); 22896384Sgblack@eecs.umich.edu }}, IntMultOp); 22906384Sgblack@eecs.umich.edu 0x7: dpsu_h_qbr({{ 22918588Sgblack@eecs.umich.edu dspac = dspDps(dspac, Rs_sw, Rt_sw, ACDST, 22926384Sgblack@eecs.umich.edu SIMD_FMT_QB, UNSIGNED, MODE_R); 22936384Sgblack@eecs.umich.edu }}, IntMultOp); 22944661Sksewell@umich.edu } 22954661Sksewell@umich.edu } 22964661Sksewell@umich.edu 0x2: decode OP_LO { 22974661Sksewell@umich.edu format DspHiLoOp { 22986384Sgblack@eecs.umich.edu 0x0: maq_sa_w_phl({{ 229913389Sgabeblack@google.com dspac = dspMaq(dspac, Rs, Rt, 23006384Sgblack@eecs.umich.edu ACDST, SIMD_FMT_PH, 23016384Sgblack@eecs.umich.edu MODE_L, SATURATE, &dspctl); 23026384Sgblack@eecs.umich.edu }}, IntMultOp); 23036384Sgblack@eecs.umich.edu 0x2: maq_sa_w_phr({{ 230413389Sgabeblack@google.com dspac = dspMaq(dspac, Rs, Rt, 23056384Sgblack@eecs.umich.edu ACDST, SIMD_FMT_PH, 23066384Sgblack@eecs.umich.edu MODE_R, SATURATE, &dspctl); 23076384Sgblack@eecs.umich.edu }}, IntMultOp); 23086384Sgblack@eecs.umich.edu 0x4: maq_s_w_phl({{ 230913389Sgabeblack@google.com dspac = dspMaq(dspac, Rs, Rt, 23106384Sgblack@eecs.umich.edu ACDST, SIMD_FMT_PH, 23116384Sgblack@eecs.umich.edu MODE_L, NOSATURATE, &dspctl); 23126384Sgblack@eecs.umich.edu }}, IntMultOp); 23136384Sgblack@eecs.umich.edu 0x6: maq_s_w_phr({{ 231413389Sgabeblack@google.com dspac = dspMaq(dspac, Rs, Rt, 23156384Sgblack@eecs.umich.edu ACDST, SIMD_FMT_PH, 23166384Sgblack@eecs.umich.edu MODE_R, NOSATURATE, &dspctl); 23176384Sgblack@eecs.umich.edu }}, IntMultOp); 23184661Sksewell@umich.edu } 23194661Sksewell@umich.edu } 23204661Sksewell@umich.edu 0x3: decode OP_LO { 23214661Sksewell@umich.edu format DspHiLoOp { 23226384Sgblack@eecs.umich.edu 0x0: dpaqx_s_w_ph({{ 23238588Sgblack@eecs.umich.edu dspac = dspDpaq(dspac, Rs_sw, Rt_sw, 23246384Sgblack@eecs.umich.edu ACDST, SIMD_FMT_PH, 23256384Sgblack@eecs.umich.edu SIMD_FMT_W, NOSATURATE, 23266384Sgblack@eecs.umich.edu MODE_X, &dspctl); 23276384Sgblack@eecs.umich.edu }}, IntMultOp); 23286384Sgblack@eecs.umich.edu 0x1: dpsqx_s_w_ph({{ 23298588Sgblack@eecs.umich.edu dspac = dspDpsq(dspac, Rs_sw, Rt_sw, 23306384Sgblack@eecs.umich.edu ACDST, SIMD_FMT_PH, 23316384Sgblack@eecs.umich.edu SIMD_FMT_W, NOSATURATE, 23326384Sgblack@eecs.umich.edu MODE_X, &dspctl); 23336384Sgblack@eecs.umich.edu }}, IntMultOp); 23346384Sgblack@eecs.umich.edu 0x2: dpaqx_sa_w_ph({{ 23358588Sgblack@eecs.umich.edu dspac = dspDpaq(dspac, Rs_sw, Rt_sw, 23366384Sgblack@eecs.umich.edu ACDST, SIMD_FMT_PH, 23376384Sgblack@eecs.umich.edu SIMD_FMT_W, SATURATE, 23386384Sgblack@eecs.umich.edu MODE_X, &dspctl); 23396384Sgblack@eecs.umich.edu }}, IntMultOp); 23406384Sgblack@eecs.umich.edu 0x3: dpsqx_sa_w_ph({{ 23418588Sgblack@eecs.umich.edu dspac = dspDpsq(dspac, Rs_sw, Rt_sw, 23426384Sgblack@eecs.umich.edu ACDST, SIMD_FMT_PH, 23436384Sgblack@eecs.umich.edu SIMD_FMT_W, SATURATE, 23446384Sgblack@eecs.umich.edu MODE_X, &dspctl); 23456384Sgblack@eecs.umich.edu }}, IntMultOp); 23464661Sksewell@umich.edu } 23474661Sksewell@umich.edu } 23484661Sksewell@umich.edu } 23494661Sksewell@umich.edu 23504661Sksewell@umich.edu //Table 3.3 MIPS32 APPEND Encoding of the op Field 23514661Sksewell@umich.edu 0x1: decode OP_HI { 23524661Sksewell@umich.edu 0x0: decode OP_LO { 23534661Sksewell@umich.edu format IntOp { 23546384Sgblack@eecs.umich.edu 0x0: append({{ 235513389Sgabeblack@google.com Rt = (Rt << RD) | bits(Rs, RD - 1, 0); 23566384Sgblack@eecs.umich.edu }}); 23576384Sgblack@eecs.umich.edu 0x1: prepend({{ 235813389Sgabeblack@google.com Rt = (Rt >> RD) | 235913389Sgabeblack@google.com (bits(Rs, RD - 1, 0) << (32 - RD)); 23606384Sgblack@eecs.umich.edu }}); 23614661Sksewell@umich.edu } 23624661Sksewell@umich.edu } 23634661Sksewell@umich.edu 0x2: decode OP_LO { 23644661Sksewell@umich.edu format IntOp { 23656384Sgblack@eecs.umich.edu 0x0: balign({{ 236613389Sgabeblack@google.com Rt = (Rt << (8 * BP)) | (Rs >> (8 * (4 - BP))); 23676384Sgblack@eecs.umich.edu }}); 23684661Sksewell@umich.edu } 23694661Sksewell@umich.edu } 23704661Sksewell@umich.edu } 23714661Sksewell@umich.edu 23722101SN/A } 23734661Sksewell@umich.edu 0x7: decode FUNCTION_LO { 23744661Sksewell@umich.edu 23756384Sgblack@eecs.umich.edu //Table 5-11 MIPS32 EXTR.W Encoding of the op Field 23766384Sgblack@eecs.umich.edu //(DSP ASE MANUAL) 23774661Sksewell@umich.edu 0x0: decode OP_HI { 23784661Sksewell@umich.edu 0x0: decode OP_LO { 23794661Sksewell@umich.edu format DspHiLoOp { 23806384Sgblack@eecs.umich.edu 0x0: extr_w({{ 238113389Sgabeblack@google.com Rt = dspExtr(dspac, SIMD_FMT_W, RS, 238213389Sgabeblack@google.com NOROUND, NOSATURATE, &dspctl); 23836384Sgblack@eecs.umich.edu }}); 23846384Sgblack@eecs.umich.edu 0x1: extrv_w({{ 238513389Sgabeblack@google.com Rt = dspExtr(dspac, SIMD_FMT_W, Rs, 238613389Sgabeblack@google.com NOROUND, NOSATURATE, &dspctl); 23876384Sgblack@eecs.umich.edu }}); 23886384Sgblack@eecs.umich.edu 0x2: extp({{ 238913389Sgabeblack@google.com Rt = dspExtp(dspac, RS, &dspctl); 23906384Sgblack@eecs.umich.edu }}); 23916384Sgblack@eecs.umich.edu 0x3: extpv({{ 239213389Sgabeblack@google.com Rt = dspExtp(dspac, Rs, &dspctl); 23936384Sgblack@eecs.umich.edu }}); 23946384Sgblack@eecs.umich.edu 0x4: extr_r_w({{ 239513389Sgabeblack@google.com Rt = dspExtr(dspac, SIMD_FMT_W, RS, 239613389Sgabeblack@google.com ROUND, NOSATURATE, &dspctl); 23976384Sgblack@eecs.umich.edu }}); 23986384Sgblack@eecs.umich.edu 0x5: extrv_r_w({{ 239913389Sgabeblack@google.com Rt = dspExtr(dspac, SIMD_FMT_W, Rs, 240013389Sgabeblack@google.com ROUND, NOSATURATE, &dspctl); 24016384Sgblack@eecs.umich.edu }}); 24026384Sgblack@eecs.umich.edu 0x6: extr_rs_w({{ 240313389Sgabeblack@google.com Rt = dspExtr(dspac, SIMD_FMT_W, RS, 240413389Sgabeblack@google.com ROUND, SATURATE, &dspctl); 24056384Sgblack@eecs.umich.edu }}); 24066384Sgblack@eecs.umich.edu 0x7: extrv_rs_w({{ 240713389Sgabeblack@google.com Rt = dspExtr(dspac, SIMD_FMT_W, Rs, 240813389Sgabeblack@google.com ROUND, SATURATE, &dspctl); 24096384Sgblack@eecs.umich.edu }}); 24104661Sksewell@umich.edu } 24114661Sksewell@umich.edu } 24124661Sksewell@umich.edu 0x1: decode OP_LO { 24134661Sksewell@umich.edu format DspHiLoOp { 24146384Sgblack@eecs.umich.edu 0x2: extpdp({{ 241513389Sgabeblack@google.com Rt = dspExtpd(dspac, RS, &dspctl); 24166384Sgblack@eecs.umich.edu }}); 24176384Sgblack@eecs.umich.edu 0x3: extpdpv({{ 241813389Sgabeblack@google.com Rt = dspExtpd(dspac, Rs, &dspctl); 24196384Sgblack@eecs.umich.edu }}); 24206384Sgblack@eecs.umich.edu 0x6: extr_s_h({{ 242113389Sgabeblack@google.com Rt = dspExtr(dspac, SIMD_FMT_PH, RS, 242213389Sgabeblack@google.com NOROUND, SATURATE, &dspctl); 24236384Sgblack@eecs.umich.edu }}); 24246384Sgblack@eecs.umich.edu 0x7: extrv_s_h({{ 242513389Sgabeblack@google.com Rt = dspExtr(dspac, SIMD_FMT_PH, Rs, 242613389Sgabeblack@google.com NOROUND, SATURATE, &dspctl); 24276384Sgblack@eecs.umich.edu }}); 24284661Sksewell@umich.edu } 24294661Sksewell@umich.edu } 24304661Sksewell@umich.edu 0x2: decode OP_LO { 24314661Sksewell@umich.edu format DspIntOp { 24326384Sgblack@eecs.umich.edu 0x2: rddsp({{ 243313389Sgabeblack@google.com Rd = readDSPControl(&dspctl, RDDSPMASK); 24346384Sgblack@eecs.umich.edu }}); 24356384Sgblack@eecs.umich.edu 0x3: wrdsp({{ 243613389Sgabeblack@google.com writeDSPControl(&dspctl, Rs, WRDSPMASK); 24376384Sgblack@eecs.umich.edu }}); 24384661Sksewell@umich.edu } 24394661Sksewell@umich.edu } 24404661Sksewell@umich.edu 0x3: decode OP_LO { 24414661Sksewell@umich.edu format DspHiLoOp { 24426384Sgblack@eecs.umich.edu 0x2: shilo({{ 244311294Sandreas.hansson@arm.com if ((int64_t)sext<6>(HILOSA) < 0) { 24446384Sgblack@eecs.umich.edu dspac = (uint64_t)dspac << 24456384Sgblack@eecs.umich.edu -sext<6>(HILOSA); 24466384Sgblack@eecs.umich.edu } else { 24476384Sgblack@eecs.umich.edu dspac = (uint64_t)dspac >> 24486384Sgblack@eecs.umich.edu sext<6>(HILOSA); 24496384Sgblack@eecs.umich.edu } 24506384Sgblack@eecs.umich.edu }}); 24516384Sgblack@eecs.umich.edu 0x3: shilov({{ 245211294Sandreas.hansson@arm.com if ((int64_t)sext<6>(Rs_sw<5:0>) < 0) { 24536384Sgblack@eecs.umich.edu dspac = (uint64_t)dspac << 24548588Sgblack@eecs.umich.edu -sext<6>(Rs_sw<5:0>); 24556384Sgblack@eecs.umich.edu } else { 24566384Sgblack@eecs.umich.edu dspac = (uint64_t)dspac >> 24578588Sgblack@eecs.umich.edu sext<6>(Rs_sw<5:0>); 24586384Sgblack@eecs.umich.edu } 24596384Sgblack@eecs.umich.edu }}); 24606384Sgblack@eecs.umich.edu 0x7: mthlip({{ 24616384Sgblack@eecs.umich.edu dspac = dspac << 32; 246213389Sgabeblack@google.com dspac |= Rs; 24636384Sgblack@eecs.umich.edu dspctl = insertBits(dspctl, 5, 0, 24646384Sgblack@eecs.umich.edu dspctl<5:0> + 32); 24656384Sgblack@eecs.umich.edu }}); 24664661Sksewell@umich.edu } 24674661Sksewell@umich.edu } 24684661Sksewell@umich.edu } 24698564Sgblack@eecs.umich.edu 0x3: decode OP default FailUnimpl::rdhwr() { 24708901Sandreas.hansson@arm.com 0x0: decode FullSystemInt { 24718564Sgblack@eecs.umich.edu 0: decode RD { 24728564Sgblack@eecs.umich.edu 29: BasicOp::rdhwr_se({{ Rt = TpValue; }}); 24738564Sgblack@eecs.umich.edu } 24746810Sgblack@eecs.umich.edu } 24755222Sksewell@umich.edu } 24764661Sksewell@umich.edu } 24772043SN/A } 24782084SN/A } 24792024SN/A 24802686Sksewell@umich.edu 0x4: decode OPCODE_LO { 24812124SN/A format LoadMemory { 248213389Sgabeblack@google.com 0x0: lb({{ Rt = Mem_sb; }}); 248313389Sgabeblack@google.com 0x1: lh({{ Rt = Mem_sh; }}); 248413389Sgabeblack@google.com 0x3: lw({{ Rt = Mem_sw; }}); 248513389Sgabeblack@google.com 0x4: lbu({{ Rt = Mem_ub;}}); 248613389Sgabeblack@google.com 0x5: lhu({{ Rt = Mem_uh; }}); 24872686Sksewell@umich.edu } 24882495SN/A 24892686Sksewell@umich.edu format LoadUnalignedMemory { 24906384Sgblack@eecs.umich.edu 0x2: lwl({{ 24916384Sgblack@eecs.umich.edu uint32_t mem_shift = 24 - (8 * byte_offset); 249213389Sgabeblack@google.com Rt = mem_word << mem_shift | (Rt & mask(mem_shift)); 24936384Sgblack@eecs.umich.edu }}); 24946384Sgblack@eecs.umich.edu 0x6: lwr({{ 24956384Sgblack@eecs.umich.edu uint32_t mem_shift = 8 * byte_offset; 249613389Sgabeblack@google.com Rt = (Rt & (mask(mem_shift) << (32 - mem_shift))) | 24976384Sgblack@eecs.umich.edu (mem_word >> mem_shift); 24986384Sgblack@eecs.umich.edu }}); 24996384Sgblack@eecs.umich.edu } 25002084SN/A } 25012024SN/A 25022686Sksewell@umich.edu 0x5: decode OPCODE_LO { 25032124SN/A format StoreMemory { 25048588Sgblack@eecs.umich.edu 0x0: sb({{ Mem_ub = Rt<7:0>; }}); 25058588Sgblack@eecs.umich.edu 0x1: sh({{ Mem_uh = Rt<15:0>; }}); 250613389Sgabeblack@google.com 0x3: sw({{ Mem = Rt<31:0>; }}); 25072084SN/A } 25082024SN/A 25092686Sksewell@umich.edu format StoreUnalignedMemory { 25106384Sgblack@eecs.umich.edu 0x2: swl({{ 25116384Sgblack@eecs.umich.edu uint32_t reg_shift = 24 - (8 * byte_offset); 25126384Sgblack@eecs.umich.edu uint32_t mem_shift = 32 - reg_shift; 25136384Sgblack@eecs.umich.edu mem_word = (mem_word & (mask(reg_shift) << mem_shift)) | 251413389Sgabeblack@google.com (Rt >> reg_shift); 25156384Sgblack@eecs.umich.edu }}); 25166384Sgblack@eecs.umich.edu 0x6: swr({{ 25176384Sgblack@eecs.umich.edu uint32_t reg_shift = 8 * byte_offset; 251813389Sgabeblack@google.com mem_word = Rt << reg_shift | 25196384Sgblack@eecs.umich.edu (mem_word & (mask(reg_shift))); 25206384Sgblack@eecs.umich.edu }}); 25212084SN/A } 25225222Sksewell@umich.edu format CP0Control { 25235222Sksewell@umich.edu 0x7: cache({{ 252413389Sgabeblack@google.com //Addr CacheEA = Rs + OFFSET; 25256384Sgblack@eecs.umich.edu //fault = xc->CacheOp((uint8_t)CACHE_OP,(Addr) CacheEA); 25266384Sgblack@eecs.umich.edu }}); 25275222Sksewell@umich.edu } 25282084SN/A } 25292024SN/A 25302686Sksewell@umich.edu 0x6: decode OPCODE_LO { 25312686Sksewell@umich.edu format LoadMemory { 253213389Sgabeblack@google.com 0x0: ll({{ Rt = Mem; }}, mem_flags=LLSC); 253313389Sgabeblack@google.com 0x1: lwc1({{ Ft_uw = Mem; }}); 25348588Sgblack@eecs.umich.edu 0x5: ldc1({{ Ft_ud = Mem_ud; }}); 25352084SN/A } 25365222Sksewell@umich.edu 0x2: CP2Unimpl::lwc2(); 25375222Sksewell@umich.edu 0x6: CP2Unimpl::ldc2(); 25382686Sksewell@umich.edu 0x3: Prefetch::pref(); 25392084SN/A } 25402024SN/A 25412239SN/A 25422686Sksewell@umich.edu 0x7: decode OPCODE_LO { 254313389Sgabeblack@google.com 0x0: StoreCond::sc({{ Mem = Rt; }}, 25442686Sksewell@umich.edu {{ uint64_t tmp = write_result; 254513389Sgabeblack@google.com Rt = (tmp == 0 || tmp == 1) ? tmp : Rt; 25466384Sgblack@eecs.umich.edu }}, mem_flags=LLSC, 25476384Sgblack@eecs.umich.edu inst_flags = IsStoreConditional); 25482686Sksewell@umich.edu format StoreMemory { 254913389Sgabeblack@google.com 0x1: swc1({{ Mem = Ft_uw; }}); 25508588Sgblack@eecs.umich.edu 0x5: sdc1({{ Mem_ud = Ft_ud; }}); 25512084SN/A } 25525222Sksewell@umich.edu 0x2: CP2Unimpl::swc2(); 25535222Sksewell@umich.edu 0x6: CP2Unimpl::sdc2(); 25542027SN/A } 25552024SN/A} 25562022SN/A 25572027SN/A 2558