mt.isa revision 12234
12686Sksewell@umich.edu// -*- mode:c++ -*- 22686Sksewell@umich.edu 35268Sksewell@umich.edu// Copyright (c) 2007 MIPS Technologies, Inc. 45268Sksewell@umich.edu// All rights reserved. 55268Sksewell@umich.edu// 65268Sksewell@umich.edu// Redistribution and use in source and binary forms, with or without 75268Sksewell@umich.edu// modification, are permitted provided that the following conditions are 85268Sksewell@umich.edu// met: redistributions of source code must retain the above copyright 95268Sksewell@umich.edu// notice, this list of conditions and the following disclaimer; 105268Sksewell@umich.edu// redistributions in binary form must reproduce the above copyright 115268Sksewell@umich.edu// notice, this list of conditions and the following disclaimer in the 125268Sksewell@umich.edu// documentation and/or other materials provided with the distribution; 135268Sksewell@umich.edu// neither the name of the copyright holders nor the names of its 145268Sksewell@umich.edu// contributors may be used to endorse or promote products derived from 155268Sksewell@umich.edu// this software without specific prior written permission. 165268Sksewell@umich.edu// 175268Sksewell@umich.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 185268Sksewell@umich.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 195268Sksewell@umich.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 205268Sksewell@umich.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 215268Sksewell@umich.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 225268Sksewell@umich.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 235268Sksewell@umich.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 245268Sksewell@umich.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 255268Sksewell@umich.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 265268Sksewell@umich.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 275268Sksewell@umich.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 285268Sksewell@umich.edu// 295268Sksewell@umich.edu// Authors: Korey Sewell 302706Sksewell@umich.edu 312686Sksewell@umich.edu//////////////////////////////////////////////////////////////////// 322686Sksewell@umich.edu// 332686Sksewell@umich.edu// MT instructions 342686Sksewell@umich.edu// 352686Sksewell@umich.edu 362686Sksewell@umich.eduoutput header {{ 372686Sksewell@umich.edu /** 382741Sksewell@umich.edu * Base class for MIPS MT ASE operations. 392686Sksewell@umich.edu */ 404661Sksewell@umich.edu class MTOp : public MipsStaticInst 412686Sksewell@umich.edu { 422686Sksewell@umich.edu protected: 432686Sksewell@umich.edu 442686Sksewell@umich.edu /// Constructor 454661Sksewell@umich.edu MTOp(const char *mnem, MachInst _machInst, OpClass __opClass) : 464661Sksewell@umich.edu MipsStaticInst(mnem, _machInst, __opClass), user_mode(false) 472686Sksewell@umich.edu { 482686Sksewell@umich.edu } 492686Sksewell@umich.edu 504661Sksewell@umich.edu std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const; 514661Sksewell@umich.edu 524661Sksewell@umich.edu bool user_mode; 534661Sksewell@umich.edu }; 544661Sksewell@umich.edu 554661Sksewell@umich.edu class MTUserModeOp : public MTOp 564661Sksewell@umich.edu { 574661Sksewell@umich.edu protected: 584661Sksewell@umich.edu 594661Sksewell@umich.edu /// Constructor 604661Sksewell@umich.edu MTUserModeOp(const char *mnem, MachInst _machInst, OpClass __opClass) : 614661Sksewell@umich.edu MTOp(mnem, _machInst, __opClass) 624661Sksewell@umich.edu { 634661Sksewell@umich.edu user_mode = true; 644661Sksewell@umich.edu } 654661Sksewell@umich.edu 664661Sksewell@umich.edu //std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const; 672686Sksewell@umich.edu }; 682686Sksewell@umich.edu}}; 692686Sksewell@umich.edu 702686Sksewell@umich.eduoutput decoder {{ 714661Sksewell@umich.edu std::string MTOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const 724661Sksewell@umich.edu { 734661Sksewell@umich.edu std::stringstream ss; 744661Sksewell@umich.edu 755269Sksewell@umich.edu if (strcmp(mnemonic,"mttc0") == 0 || strcmp(mnemonic,"mftc0") == 0) { 764661Sksewell@umich.edu ccprintf(ss, "%-10s r%d, r%d, %d", mnemonic, RT, RD, SEL); 775269Sksewell@umich.edu } else if (strcmp(mnemonic,"mftgpr") == 0) { 784661Sksewell@umich.edu ccprintf(ss, "%-10s r%d, r%d", mnemonic, RD, RT); 794661Sksewell@umich.edu } else { 804661Sksewell@umich.edu ccprintf(ss, "%-10s r%d, r%d", mnemonic, RT, RD); 814661Sksewell@umich.edu } 824661Sksewell@umich.edu 834661Sksewell@umich.edu return ss.str(); 844661Sksewell@umich.edu } 854661Sksewell@umich.edu}}; 864661Sksewell@umich.edu 879554Sandreas.hansson@arm.comoutput header {{ 8812234Sgabeblack@google.com void getThrRegExValues(ExecContext *xc, 899554Sandreas.hansson@arm.com MipsISA::VPEConf0Reg &vpe_conf0, 909554Sandreas.hansson@arm.com MipsISA::TCBindReg &tc_bind_mt, 919554Sandreas.hansson@arm.com MipsISA::TCBindReg &tc_bind, 929554Sandreas.hansson@arm.com MipsISA::VPEControlReg &vpe_control, 939554Sandreas.hansson@arm.com MipsISA::MVPConf0Reg &mvp_conf0); 949554Sandreas.hansson@arm.com 9512234Sgabeblack@google.com void getMTExValues(ExecContext *xc, MipsISA::Config3Reg &config3); 969554Sandreas.hansson@arm.com}}; 979554Sandreas.hansson@arm.com 984661Sksewell@umich.eduoutput exec {{ 9912234Sgabeblack@google.com void getThrRegExValues(ExecContext *xc, 1006376Sgblack@eecs.umich.edu VPEConf0Reg &vpe_conf0, TCBindReg &tc_bind_mt, 1016376Sgblack@eecs.umich.edu TCBindReg &tc_bind, VPEControlReg &vpe_control, 1026376Sgblack@eecs.umich.edu MVPConf0Reg &mvp_conf0) 1034661Sksewell@umich.edu { 1046383Sgblack@eecs.umich.edu vpe_conf0 = xc->readMiscReg(MISCREG_VPE_CONF0); 10512104Snathanael.premillieu@arm.com tc_bind_mt = xc->readRegOtherThread(RegId(MiscRegClass, 10612104Snathanael.premillieu@arm.com MISCREG_TC_BIND)); 1076383Sgblack@eecs.umich.edu tc_bind = xc->readMiscReg(MISCREG_TC_BIND); 1086383Sgblack@eecs.umich.edu vpe_control = xc->readMiscReg(MISCREG_VPE_CONTROL); 1096383Sgblack@eecs.umich.edu mvp_conf0 = xc->readMiscReg(MISCREG_MVP_CONF0); 1104661Sksewell@umich.edu } 1114661Sksewell@umich.edu 11212234Sgabeblack@google.com void getMTExValues(ExecContext *xc, Config3Reg &config3) 1134661Sksewell@umich.edu { 1146383Sgblack@eecs.umich.edu config3 = xc->readMiscReg(MISCREG_CONFIG3); 1154661Sksewell@umich.edu } 1164661Sksewell@umich.edu}}; 1174661Sksewell@umich.edu 1184661Sksewell@umich.edudef template ThreadRegisterExecute {{ 11912234Sgabeblack@google.com Fault %(class_name)s::execute( 12012234Sgabeblack@google.com ExecContext *xc, Trace::InstRecord *traceData) const 1212686Sksewell@umich.edu { 1224661Sksewell@umich.edu Fault fault = NoFault; 1238607Sgblack@eecs.umich.edu int64_t data M5_VAR_USED; 1244661Sksewell@umich.edu %(op_decl)s; 1254661Sksewell@umich.edu %(op_rd)s; 1264661Sksewell@umich.edu 1276376Sgblack@eecs.umich.edu VPEConf0Reg vpeConf0; 1286376Sgblack@eecs.umich.edu TCBindReg tcBindMT; 1296376Sgblack@eecs.umich.edu TCBindReg tcBind; 1306376Sgblack@eecs.umich.edu VPEControlReg vpeControl; 1316376Sgblack@eecs.umich.edu MVPConf0Reg mvpConf0; 1324661Sksewell@umich.edu 1336376Sgblack@eecs.umich.edu getThrRegExValues(xc, vpeConf0, tcBindMT, 1346376Sgblack@eecs.umich.edu tcBind, vpeControl, mvpConf0); 1354661Sksewell@umich.edu 1364661Sksewell@umich.edu if (isCoprocessorEnabled(xc, 0)) { 1376376Sgblack@eecs.umich.edu if (vpeConf0.mvp == 0 && tcBindMT.curVPE != tcBind.curVPE) { 1384661Sksewell@umich.edu data = -1; 1396376Sgblack@eecs.umich.edu } else if (vpeControl.targTC > mvpConf0.ptc) { 1404661Sksewell@umich.edu data = -1; 1414661Sksewell@umich.edu } else { 1424661Sksewell@umich.edu %(code)s; 1434661Sksewell@umich.edu } 1444661Sksewell@umich.edu } else { 14510474Sandreas.hansson@arm.com fault = std::make_shared<CoprocessorUnusableFault>(0); 1464661Sksewell@umich.edu } 1474661Sksewell@umich.edu 1484661Sksewell@umich.edu if(fault == NoFault) 1494661Sksewell@umich.edu { 1504661Sksewell@umich.edu %(op_wb)s; 1514661Sksewell@umich.edu } 1524661Sksewell@umich.edu 1534661Sksewell@umich.edu return fault; 1542686Sksewell@umich.edu } 1552686Sksewell@umich.edu}}; 1562686Sksewell@umich.edu 1574661Sksewell@umich.edudef template MTExecute{{ 15812234Sgabeblack@google.com Fault %(class_name)s::execute( 15912234Sgabeblack@google.com ExecContext *xc, Trace::InstRecord *traceData) const 1602686Sksewell@umich.edu { 1614661Sksewell@umich.edu Fault fault = NoFault; 1624661Sksewell@umich.edu %(op_decl)s; 1634661Sksewell@umich.edu %(op_rd)s; 1642686Sksewell@umich.edu 1656376Sgblack@eecs.umich.edu Config3Reg config3; 1664661Sksewell@umich.edu 1674661Sksewell@umich.edu getMTExValues(xc, config3); 1684661Sksewell@umich.edu 1694661Sksewell@umich.edu if (isCoprocessorEnabled(xc, 0)) { 1706376Sgblack@eecs.umich.edu if (config3.mt == 1) { 1714661Sksewell@umich.edu %(code)s; 1724661Sksewell@umich.edu } else { 17310474Sandreas.hansson@arm.com fault = std::make_shared<ReservedInstructionFault>(); 1744661Sksewell@umich.edu } 1754661Sksewell@umich.edu } else { 17610474Sandreas.hansson@arm.com fault = std::make_shared<CoprocessorUnusableFault>(0); 1774661Sksewell@umich.edu } 1784661Sksewell@umich.edu 1794661Sksewell@umich.edu if(fault == NoFault) 1804661Sksewell@umich.edu { 1814661Sksewell@umich.edu %(op_wb)s; 1824661Sksewell@umich.edu } 1834661Sksewell@umich.edu return fault; 1842686Sksewell@umich.edu } 1852686Sksewell@umich.edu}}; 1862686Sksewell@umich.edu 1872686Sksewell@umich.edu// Primary format for integer operate instructions: 1884661Sksewell@umich.edudef format MT_Control(code, *opt_flags) {{ 1894661Sksewell@umich.edu inst_flags = ('IsNonSpeculative', ) 1904661Sksewell@umich.edu op_type = 'MTOp' 1914661Sksewell@umich.edu 1924661Sksewell@umich.edu for x in opt_flags: 1934661Sksewell@umich.edu if x == 'UserMode': 1944661Sksewell@umich.edu op_type = 'MTUserModeOp' 1954661Sksewell@umich.edu else: 1964661Sksewell@umich.edu inst_flags += (x, ) 1974661Sksewell@umich.edu 1984661Sksewell@umich.edu iop = InstObjParams(name, Name, op_type, code, inst_flags) 1992686Sksewell@umich.edu header_output = BasicDeclare.subst(iop) 2002686Sksewell@umich.edu decoder_output = BasicConstructor.subst(iop) 2012686Sksewell@umich.edu decode_block = BasicDecode.subst(iop) 2024661Sksewell@umich.edu exec_output = MTExecute.subst(iop) 2032686Sksewell@umich.edu}}; 2044661Sksewell@umich.edu 2054661Sksewell@umich.edudef format MT_MFTR(code, *flags) {{ 2064661Sksewell@umich.edu flags += ('IsNonSpeculative', ) 2077823Ssteve.reinhardt@amd.com# code = 'std::cerr << curTick() << \": T\" << xc->tcBase()->threadId() << \": Executing MT INST: ' + name + '\" << endl;\n' + code 2084661Sksewell@umich.edu 2098607Sgblack@eecs.umich.edu code += ''' 2108607Sgblack@eecs.umich.edu if (MT_H) 2118607Sgblack@eecs.umich.edu data = bits(data, 63, 32); 2128607Sgblack@eecs.umich.edu Rd = data; 2138607Sgblack@eecs.umich.edu ''' 2144661Sksewell@umich.edu 2154661Sksewell@umich.edu iop = InstObjParams(name, Name, 'MTOp', code, flags) 2164661Sksewell@umich.edu header_output = BasicDeclare.subst(iop) 2174661Sksewell@umich.edu decoder_output = BasicConstructor.subst(iop) 2184661Sksewell@umich.edu decode_block = BasicDecode.subst(iop) 2194661Sksewell@umich.edu exec_output = ThreadRegisterExecute.subst(iop) 2204661Sksewell@umich.edu}}; 2214661Sksewell@umich.edu 2224661Sksewell@umich.edudef format MT_MTTR(code, *flags) {{ 2234661Sksewell@umich.edu flags += ('IsNonSpeculative', ) 2247823Ssteve.reinhardt@amd.com# code = 'std::cerr << curTick() << \": T\" << xc->tcBase()->threadId() << \": Executing MT INST: ' + name + '\" << endl;\n' + code 2254661Sksewell@umich.edu iop = InstObjParams(name, Name, 'MTOp', code, flags) 2264661Sksewell@umich.edu header_output = BasicDeclare.subst(iop) 2274661Sksewell@umich.edu decoder_output = BasicConstructor.subst(iop) 2284661Sksewell@umich.edu decode_block = BasicDecode.subst(iop) 2294661Sksewell@umich.edu exec_output = ThreadRegisterExecute.subst(iop) 2304661Sksewell@umich.edu}}; 231