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