specop.isa revision 10184
16242Sgblack@eecs.umich.edu// Copyright (c) 2007-2008 The Hewlett-Packard Development Company
27093Sgblack@eecs.umich.edu// Copyright (c) 2011 Mark D. Hill and David A. Wood
37093Sgblack@eecs.umich.edu// All rights reserved.
47093Sgblack@eecs.umich.edu//
57093Sgblack@eecs.umich.edu// The license below extends only to copyright in the software and shall
67093Sgblack@eecs.umich.edu// not be construed as granting a license to any other intellectual
77093Sgblack@eecs.umich.edu// property including but not limited to intellectual property relating
87093Sgblack@eecs.umich.edu// to a hardware implementation of the functionality of the software
97093Sgblack@eecs.umich.edu// licensed hereunder.  You may use the software subject to the license
107093Sgblack@eecs.umich.edu// terms below provided that you ensure that this notice is replicated
117093Sgblack@eecs.umich.edu// unmodified and in its entirety in all distributions of the software,
127093Sgblack@eecs.umich.edu// modified or unmodified, in source code or in binary form.
137093Sgblack@eecs.umich.edu//
146242Sgblack@eecs.umich.edu// Redistribution and use in source and binary forms, with or without
156242Sgblack@eecs.umich.edu// modification, are permitted provided that the following conditions are
166242Sgblack@eecs.umich.edu// met: redistributions of source code must retain the above copyright
176242Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer;
186242Sgblack@eecs.umich.edu// redistributions in binary form must reproduce the above copyright
196242Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer in the
206242Sgblack@eecs.umich.edu// documentation and/or other materials provided with the distribution;
216242Sgblack@eecs.umich.edu// neither the name of the copyright holders nor the names of its
226242Sgblack@eecs.umich.edu// contributors may be used to endorse or promote products derived from
236242Sgblack@eecs.umich.edu// this software without specific prior written permission.
246242Sgblack@eecs.umich.edu//
256242Sgblack@eecs.umich.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
266242Sgblack@eecs.umich.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
276242Sgblack@eecs.umich.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
286242Sgblack@eecs.umich.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
296242Sgblack@eecs.umich.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
306242Sgblack@eecs.umich.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
316242Sgblack@eecs.umich.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
326242Sgblack@eecs.umich.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
336242Sgblack@eecs.umich.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
346242Sgblack@eecs.umich.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
356242Sgblack@eecs.umich.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
366242Sgblack@eecs.umich.edu//
376242Sgblack@eecs.umich.edu// Authors: Gabe Black
386242Sgblack@eecs.umich.edu
396242Sgblack@eecs.umich.edu//////////////////////////////////////////////////////////////////////////
406242Sgblack@eecs.umich.edu//
416242Sgblack@eecs.umich.edu// Fault Microop
426242Sgblack@eecs.umich.edu//
436242Sgblack@eecs.umich.edu//////////////////////////////////////////////////////////////////////////
446242Sgblack@eecs.umich.edu
456242Sgblack@eecs.umich.eduoutput header {{
466242Sgblack@eecs.umich.edu    class MicroFaultBase : public X86ISA::X86MicroopBase
476242Sgblack@eecs.umich.edu    {
486242Sgblack@eecs.umich.edu      protected:
496242Sgblack@eecs.umich.edu        Fault fault;
506242Sgblack@eecs.umich.edu        uint8_t cc;
516242Sgblack@eecs.umich.edu
526242Sgblack@eecs.umich.edu      public:
536242Sgblack@eecs.umich.edu        MicroFaultBase(ExtMachInst _machInst, const char * instMnem,
546242Sgblack@eecs.umich.edu                uint64_t setFlags, Fault _fault, uint8_t _cc);
556242Sgblack@eecs.umich.edu
566242Sgblack@eecs.umich.edu        std::string generateDisassembly(Addr pc,
576242Sgblack@eecs.umich.edu                const SymbolTable *symtab) const;
586242Sgblack@eecs.umich.edu    };
596242Sgblack@eecs.umich.edu
606242Sgblack@eecs.umich.edu    class MicroHalt : public X86ISA::X86MicroopBase
616242Sgblack@eecs.umich.edu    {
626242Sgblack@eecs.umich.edu      public:
636242Sgblack@eecs.umich.edu        MicroHalt(ExtMachInst _machInst, const char * instMnem,
646242Sgblack@eecs.umich.edu                uint64_t setFlags) :
657111Sgblack@eecs.umich.edu            X86MicroopBase(_machInst, "halt", instMnem,
666242Sgblack@eecs.umich.edu                           setFlags | (ULL(1) << StaticInst::IsNonSpeculative),
676242Sgblack@eecs.umich.edu                           No_OpClass)
686242Sgblack@eecs.umich.edu        {
696242Sgblack@eecs.umich.edu        }
706735Sgblack@eecs.umich.edu
716242Sgblack@eecs.umich.edu        %(BasicExecDeclare)s
726242Sgblack@eecs.umich.edu
736242Sgblack@eecs.umich.edu        std::string generateDisassembly(Addr pc,
746723Sgblack@eecs.umich.edu                const SymbolTable *symtab) const;
756242Sgblack@eecs.umich.edu    };
766242Sgblack@eecs.umich.edu}};
776261Sgblack@eecs.umich.edu
786403Sgblack@eecs.umich.edudef template MicroFaultDeclare {{
796403Sgblack@eecs.umich.edu    class %(class_name)s : public %(base_class)s
806403Sgblack@eecs.umich.edu    {
817325Sgblack@eecs.umich.edu      public:
827325Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst _machInst, const char * instMnem,
837350SAli.Saidi@ARM.com                uint64_t setFlags, Fault _fault, uint8_t _cc);
847259Sgblack@eecs.umich.edu
857259Sgblack@eecs.umich.edu        %(BasicExecDeclare)s
867259Sgblack@eecs.umich.edu    };
877259Sgblack@eecs.umich.edu}};
887264Sgblack@eecs.umich.edu
897267Sgblack@eecs.umich.edudef template MicroFaultExecute {{
907285Sgblack@eecs.umich.edu        Fault %(class_name)s::execute(%(CPU_exec_context)s *xc,
917265Sgblack@eecs.umich.edu                Trace::InstRecord *traceData) const
927266Sgblack@eecs.umich.edu        {
937266Sgblack@eecs.umich.edu            %(op_decl)s;
947266Sgblack@eecs.umich.edu            %(op_rd)s;
957268Sgblack@eecs.umich.edu            if (%(cond_test)s) {
967272Sgblack@eecs.umich.edu                //Return the fault we were constructed with
977272Sgblack@eecs.umich.edu                return fault;
987271Sgblack@eecs.umich.edu            } else {
997273Sgblack@eecs.umich.edu                return NoFault;
1007287Sgblack@eecs.umich.edu            }
1017287Sgblack@eecs.umich.edu        }
1027274Sgblack@eecs.umich.edu}};
1037275Sgblack@eecs.umich.edu
1047276Sgblack@eecs.umich.eduoutput exec {{
1057286Sgblack@eecs.umich.edu    Fault
1067297Sgblack@eecs.umich.edu    MicroHalt::execute(%(CPU_exec_context)s *xc,
1077297Sgblack@eecs.umich.edu            Trace::InstRecord * traceData) const
1087298Sgblack@eecs.umich.edu    {
1097352Sgblack@eecs.umich.edu        xc->tcBase()->suspend();
1107352Sgblack@eecs.umich.edu        return NoFault;
1117354Sgblack@eecs.umich.edu    }
1127353Sgblack@eecs.umich.edu}};
1137355Sgblack@eecs.umich.edu
1147355Sgblack@eecs.umich.eduoutput decoder {{
1157355Sgblack@eecs.umich.edu    MicroFaultBase::MicroFaultBase(
1167355Sgblack@eecs.umich.edu            ExtMachInst machInst, const char * instMnem,
1177355Sgblack@eecs.umich.edu            uint64_t setFlags, Fault _fault, uint8_t _cc) :
1187355Sgblack@eecs.umich.edu        X86MicroopBase(machInst, "fault", instMnem, setFlags, No_OpClass),
1197355Sgblack@eecs.umich.edu                fault(_fault), cc(_cc)
1207355Sgblack@eecs.umich.edu    {
1217355Sgblack@eecs.umich.edu    }
1227355Sgblack@eecs.umich.edu}};
1237355Sgblack@eecs.umich.edu
1247355Sgblack@eecs.umich.edudef template MicroFaultConstructor {{
1257355Sgblack@eecs.umich.edu    %(class_name)s::%(class_name)s(
1267355Sgblack@eecs.umich.edu            ExtMachInst machInst, const char * instMnem, uint64_t setFlags,
1277362Sgblack@eecs.umich.edu            Fault _fault, uint8_t _cc) :
1287362Sgblack@eecs.umich.edu        %(base_class)s(machInst, instMnem, setFlags, _fault, _cc)
1297362Sgblack@eecs.umich.edu    {
1307362Sgblack@eecs.umich.edu        %(constructor)s;
1317259Sgblack@eecs.umich.edu    }
1327259Sgblack@eecs.umich.edu}};
1337259Sgblack@eecs.umich.edu
1347259Sgblack@eecs.umich.eduoutput decoder {{
1357259Sgblack@eecs.umich.edu    std::string MicroFaultBase::generateDisassembly(Addr pc,
1367259Sgblack@eecs.umich.edu            const SymbolTable *symtab) const
1377259Sgblack@eecs.umich.edu    {
1387259Sgblack@eecs.umich.edu        std::stringstream response;
1397259Sgblack@eecs.umich.edu
1407259Sgblack@eecs.umich.edu        printMnemonic(response, instMnem, mnemonic);
1417259Sgblack@eecs.umich.edu        if(fault)
1427259Sgblack@eecs.umich.edu            response << fault->name();
1437259Sgblack@eecs.umich.edu        else
1447259Sgblack@eecs.umich.edu            response << "No Fault";
1457259Sgblack@eecs.umich.edu
1467259Sgblack@eecs.umich.edu        return response.str();
1477259Sgblack@eecs.umich.edu    }
1487259Sgblack@eecs.umich.edu
1497351Sgblack@eecs.umich.edu    std::string MicroHalt::generateDisassembly(Addr pc,
1507259Sgblack@eecs.umich.edu            const SymbolTable *symtab) const
1517259Sgblack@eecs.umich.edu    {
1527259Sgblack@eecs.umich.edu        std::stringstream response;
1537259Sgblack@eecs.umich.edu
1547259Sgblack@eecs.umich.edu        printMnemonic(response, instMnem, mnemonic);
1557259Sgblack@eecs.umich.edu
1567259Sgblack@eecs.umich.edu        return response.str();
1577259Sgblack@eecs.umich.edu    }
1587351Sgblack@eecs.umich.edu}};
1597351Sgblack@eecs.umich.edu
1607351Sgblack@eecs.umich.edulet {{
1617351Sgblack@eecs.umich.edu    class Fault(X86Microop):
1627351Sgblack@eecs.umich.edu        className = "MicroFault"
1637351Sgblack@eecs.umich.edu        def __init__(self, fault, flags=None):
1647351Sgblack@eecs.umich.edu            self.fault = fault
1657351Sgblack@eecs.umich.edu            if flags:
1667351Sgblack@eecs.umich.edu                if not isinstance(flags, (list, tuple)):
1677351Sgblack@eecs.umich.edu                    raise Exception, "flags must be a list or tuple of flags"
1687351Sgblack@eecs.umich.edu                self.cond = " | ".join(flags)
1697351Sgblack@eecs.umich.edu                self.className += "Flags"
1707351Sgblack@eecs.umich.edu            else:
1717351Sgblack@eecs.umich.edu                self.cond = "0"
1727351Sgblack@eecs.umich.edu
1737351Sgblack@eecs.umich.edu        def getAllocator(self, microFlags):
1747351Sgblack@eecs.umich.edu            allocator = '''new %(class_name)s(machInst, macrocodeBlock,
1757351Sgblack@eecs.umich.edu                    %(flags)s, %(fault)s, %(cc)s)''' % {
1767351Sgblack@eecs.umich.edu                "class_name" : self.className,
1777259Sgblack@eecs.umich.edu                "flags" : self.microFlagsText(microFlags),
1787259Sgblack@eecs.umich.edu                "fault" : self.fault,
1797259Sgblack@eecs.umich.edu                "cc" : self.cond}
1807259Sgblack@eecs.umich.edu            return allocator
1817259Sgblack@eecs.umich.edu
1827259Sgblack@eecs.umich.edu    iop = InstObjParams("fault", "MicroFaultFlags", "MicroFaultBase",
1837259Sgblack@eecs.umich.edu            {"code": "",
1846735Sgblack@eecs.umich.edu             "cond_test": "checkCondition(ccFlagBits | cfofBits | dfBit | \
1856261Sgblack@eecs.umich.edu                                          ecfBit | ezfBit, cc)"})
1866261Sgblack@eecs.umich.edu    exec_output = MicroFaultExecute.subst(iop)
1877259Sgblack@eecs.umich.edu    header_output = MicroFaultDeclare.subst(iop)
1887259Sgblack@eecs.umich.edu    decoder_output = MicroFaultConstructor.subst(iop)
1897259Sgblack@eecs.umich.edu    iop = InstObjParams("fault", "MicroFault", "MicroFaultBase",
1906261Sgblack@eecs.umich.edu            {"code": "",
1917259Sgblack@eecs.umich.edu             "cond_test": "true"})
1927259Sgblack@eecs.umich.edu    exec_output += MicroFaultExecute.subst(iop)
1937351Sgblack@eecs.umich.edu    header_output += MicroFaultDeclare.subst(iop)
1947351Sgblack@eecs.umich.edu    decoder_output += MicroFaultConstructor.subst(iop)
1957285Sgblack@eecs.umich.edu    microopClasses["fault"] = Fault
1967267Sgblack@eecs.umich.edu
1977287Sgblack@eecs.umich.edu    class Halt(X86Microop):
1987287Sgblack@eecs.umich.edu        className = "MicroHalt"
1997297Sgblack@eecs.umich.edu        def __init__(self):
2007297Sgblack@eecs.umich.edu            pass
2017355Sgblack@eecs.umich.edu
2027355Sgblack@eecs.umich.edu        def getAllocator(self, microFlags):
2037355Sgblack@eecs.umich.edu            return "new MicroHalt(machInst, macrocodeBlock, %s)" % \
2047355Sgblack@eecs.umich.edu                    self.microFlagsText(microFlags)
2057355Sgblack@eecs.umich.edu
2067362Sgblack@eecs.umich.edu    microopClasses["halt"] = Halt
2077355Sgblack@eecs.umich.edu}};
2087259Sgblack@eecs.umich.edu
2097259Sgblack@eecs.umich.edudef template MicroFenceOpDeclare {{
2107259Sgblack@eecs.umich.edu    class %(class_name)s : public X86ISA::X86MicroopBase
2117353Sgblack@eecs.umich.edu    {
2127362Sgblack@eecs.umich.edu      public:
2137297Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst _machInst,
2147272Sgblack@eecs.umich.edu                const char * instMnem,
2157352Sgblack@eecs.umich.edu                uint64_t setFlags);
2167351Sgblack@eecs.umich.edu
2177351Sgblack@eecs.umich.edu        %(BasicExecDeclare)s
2187351Sgblack@eecs.umich.edu    };
2197259Sgblack@eecs.umich.edu}};
2206242Sgblack@eecs.umich.edu
2216242Sgblack@eecs.umich.edudef template MicroFenceOpConstructor {{
2226242Sgblack@eecs.umich.edu    %(class_name)s::%(class_name)s(
2236242Sgblack@eecs.umich.edu            ExtMachInst machInst, const char * instMnem, uint64_t setFlags) :
2246242Sgblack@eecs.umich.edu        %(base_class)s(machInst, "%(mnemonic)s", instMnem,
2256242Sgblack@eecs.umich.edu                setFlags, %(op_class)s)
2266242Sgblack@eecs.umich.edu    {
2276242Sgblack@eecs.umich.edu        %(constructor)s;
2286735Sgblack@eecs.umich.edu    }
2296242Sgblack@eecs.umich.edu}};
2306242Sgblack@eecs.umich.edu
2316735Sgblack@eecs.umich.edulet {{
2326242Sgblack@eecs.umich.edu    class MfenceOp(X86Microop):
2336242Sgblack@eecs.umich.edu        def __init__(self):
2346242Sgblack@eecs.umich.edu            self.className = "Mfence"
2356242Sgblack@eecs.umich.edu            self.mnemonic = "mfence"
2366242Sgblack@eecs.umich.edu            self.instFlags = "| (1ULL << StaticInst::IsMemBarrier)"
2376242Sgblack@eecs.umich.edu
2386242Sgblack@eecs.umich.edu        def getAllocator(self, microFlags):
2396735Sgblack@eecs.umich.edu            allocString = '''
2406750Sgblack@eecs.umich.edu                    (StaticInstPtr)(new %(class_name)s(machInst,
2416750Sgblack@eecs.umich.edu                        macrocodeBlock, %(flags)s))
2426750Sgblack@eecs.umich.edu            '''
2436750Sgblack@eecs.umich.edu            allocator = allocString % {
2446735Sgblack@eecs.umich.edu                "class_name" : self.className,
2457360Sgblack@eecs.umich.edu                "mnemonic" : self.mnemonic,
2466735Sgblack@eecs.umich.edu                "flags" : self.microFlagsText(microFlags) + self.instFlags}
2476735Sgblack@eecs.umich.edu            return allocator
2486735Sgblack@eecs.umich.edu
2496735Sgblack@eecs.umich.edu    microopClasses["mfence"] = MfenceOp
2506735Sgblack@eecs.umich.edu}};
2516735Sgblack@eecs.umich.edu
2526735Sgblack@eecs.umich.edulet {{
2536735Sgblack@eecs.umich.edu    # Build up the all register version of this micro op
2546735Sgblack@eecs.umich.edu    iop = InstObjParams("mfence", "Mfence", 'X86MicroopBase',
2557360Sgblack@eecs.umich.edu            {"code" : ""})
2566735Sgblack@eecs.umich.edu    header_output += MicroFenceOpDeclare.subst(iop)
2577360Sgblack@eecs.umich.edu    decoder_output += MicroFenceOpConstructor.subst(iop)
2586735Sgblack@eecs.umich.edu    exec_output += BasicExecute.subst(iop)
2596735Sgblack@eecs.umich.edu}};
2606735Sgblack@eecs.umich.edu