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