limmop.isa revision 4792
110915Sandreas.sandberg@arm.com// Copyright (c) 2007 The Hewlett-Packard Development Company 211313Sandreas.sandberg@arm.com// All rights reserved. 310915Sandreas.sandberg@arm.com// 410915Sandreas.sandberg@arm.com// Redistribution and use of this software in source and binary forms, 510915Sandreas.sandberg@arm.com// with or without modification, are permitted provided that the 610915Sandreas.sandberg@arm.com// following conditions are met: 710915Sandreas.sandberg@arm.com// 810915Sandreas.sandberg@arm.com// The software must be used only for Non-Commercial Use which means any 910915Sandreas.sandberg@arm.com// use which is NOT directed to receiving any direct monetary 1010915Sandreas.sandberg@arm.com// compensation for, or commercial advantage from such use. Illustrative 1110915Sandreas.sandberg@arm.com// examples of non-commercial use are academic research, personal study, 1210915Sandreas.sandberg@arm.com// teaching, education and corporate research & development. 1310915Sandreas.sandberg@arm.com// Illustrative examples of commercial use are distributing products for 1410915Sandreas.sandberg@arm.com// commercial advantage and providing services using the software for 1510915Sandreas.sandberg@arm.com// commercial advantage. 1610915Sandreas.sandberg@arm.com// 1710915Sandreas.sandberg@arm.com// If you wish to use this software or functionality therein that may be 1810915Sandreas.sandberg@arm.com// covered by patents for commercial use, please contact: 1910915Sandreas.sandberg@arm.com// Director of Intellectual Property Licensing 2010915Sandreas.sandberg@arm.com// Office of Strategy and Technology 2110915Sandreas.sandberg@arm.com// Hewlett-Packard Company 2210915Sandreas.sandberg@arm.com// 1501 Page Mill Road 2310915Sandreas.sandberg@arm.com// Palo Alto, California 94304 2410915Sandreas.sandberg@arm.com// 2510915Sandreas.sandberg@arm.com// Redistributions of source code must retain the above copyright notice, 2610915Sandreas.sandberg@arm.com// this list of conditions and the following disclaimer. Redistributions 2710915Sandreas.sandberg@arm.com// in binary form must reproduce the above copyright notice, this list of 2810915Sandreas.sandberg@arm.com// conditions and the following disclaimer in the documentation and/or 2910915Sandreas.sandberg@arm.com// other materials provided with the distribution. Neither the name of 3010915Sandreas.sandberg@arm.com// the COPYRIGHT HOLDER(s), HEWLETT-PACKARD COMPANY, nor the names of its 3110915Sandreas.sandberg@arm.com// contributors may be used to endorse or promote products derived from 3210915Sandreas.sandberg@arm.com// this software without specific prior written permission. No right of 3310915Sandreas.sandberg@arm.com// sublicense is granted herewith. Derivatives of the software and 3410915Sandreas.sandberg@arm.com// output created using the software may be prepared, but only for 3510915Sandreas.sandberg@arm.com// Non-Commercial Uses. Derivatives of the software may be shared with 3610915Sandreas.sandberg@arm.com// others provided: (i) the others agree to abide by the list of 3710915Sandreas.sandberg@arm.com// conditions herein which includes the Non-Commercial Use restrictions; 3810915Sandreas.sandberg@arm.com// and (ii) such Derivatives of the software include the above copyright 3910915Sandreas.sandberg@arm.com// notice to acknowledge the contribution from this software where 4010915Sandreas.sandberg@arm.com// applicable, this list of conditions and the disclaimer below. 4110915Sandreas.sandberg@arm.com// 4210915Sandreas.sandberg@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 4310915Sandreas.sandberg@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 4410915Sandreas.sandberg@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 4510915Sandreas.sandberg@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 4610915Sandreas.sandberg@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 4710915Sandreas.sandberg@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 4810915Sandreas.sandberg@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 4910915Sandreas.sandberg@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 5010915Sandreas.sandberg@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 5110915Sandreas.sandberg@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 5210915Sandreas.sandberg@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 5310915Sandreas.sandberg@arm.com// 5410915Sandreas.sandberg@arm.com// Authors: Gabe Black 5510915Sandreas.sandberg@arm.com 5610915Sandreas.sandberg@arm.com////////////////////////////////////////////////////////////////////////// 5710915Sandreas.sandberg@arm.com// 5810915Sandreas.sandberg@arm.com// LIMMOp Microop templates 5910915Sandreas.sandberg@arm.com// 6010915Sandreas.sandberg@arm.com////////////////////////////////////////////////////////////////////////// 6110915Sandreas.sandberg@arm.com 6210915Sandreas.sandberg@arm.comdef template MicroLimmOpExecute {{ 6310915Sandreas.sandberg@arm.com Fault %(class_name)s::execute(%(CPU_exec_context)s *xc, 6410915Sandreas.sandberg@arm.com Trace::InstRecord *traceData) const 6510915Sandreas.sandberg@arm.com { 6610915Sandreas.sandberg@arm.com %(op_decl)s; 6710915Sandreas.sandberg@arm.com %(op_rd)s; 6810915Sandreas.sandberg@arm.com %(code)s; 6910915Sandreas.sandberg@arm.com %(op_wb)s; 7010915Sandreas.sandberg@arm.com return NoFault; 7110915Sandreas.sandberg@arm.com } 7210915Sandreas.sandberg@arm.com}}; 7310915Sandreas.sandberg@arm.com 7410915Sandreas.sandberg@arm.comdef template MicroLimmOpDeclare {{ 7510915Sandreas.sandberg@arm.com class %(class_name)s : public X86ISA::X86MicroopBase 7610915Sandreas.sandberg@arm.com { 7710915Sandreas.sandberg@arm.com protected: 7810915Sandreas.sandberg@arm.com const RegIndex dest; 7910915Sandreas.sandberg@arm.com const uint64_t imm; 8010915Sandreas.sandberg@arm.com const uint8_t dataSize; 8110915Sandreas.sandberg@arm.com void buildMe(); 8210915Sandreas.sandberg@arm.com 8310915Sandreas.sandberg@arm.com std::string generateDisassembly(Addr pc, 8410915Sandreas.sandberg@arm.com const SymbolTable *symtab) const; 8510915Sandreas.sandberg@arm.com 8610915Sandreas.sandberg@arm.com public: 8710915Sandreas.sandberg@arm.com %(class_name)s(ExtMachInst _machInst, 8811313Sandreas.sandberg@arm.com const char * instMnem, 8911313Sandreas.sandberg@arm.com bool isMicro, bool isDelayed, bool isFirst, bool isLast, 9010915Sandreas.sandberg@arm.com RegIndex _dest, uint64_t _imm, uint8_t _dataSize); 9110915Sandreas.sandberg@arm.com 9210915Sandreas.sandberg@arm.com %(class_name)s(ExtMachInst _machInst, 9310915Sandreas.sandberg@arm.com const char * instMnem, 9410915Sandreas.sandberg@arm.com RegIndex _dest, uint64_t _imm, uint8_t _dataSize); 9510915Sandreas.sandberg@arm.com 9610915Sandreas.sandberg@arm.com %(BasicExecDeclare)s 9710915Sandreas.sandberg@arm.com }; 9810915Sandreas.sandberg@arm.com}}; 9910915Sandreas.sandberg@arm.com 10010915Sandreas.sandberg@arm.comdef template MicroLimmOpDisassembly {{ 10110915Sandreas.sandberg@arm.com std::string %(class_name)s::generateDisassembly(Addr pc, 10210915Sandreas.sandberg@arm.com const SymbolTable *symtab) const 10310915Sandreas.sandberg@arm.com { 10410915Sandreas.sandberg@arm.com std::stringstream response; 10510915Sandreas.sandberg@arm.com 10610915Sandreas.sandberg@arm.com printMnemonic(response, instMnem, mnemonic); 10710915Sandreas.sandberg@arm.com printReg(response, dest, dataSize); 10810915Sandreas.sandberg@arm.com response << ", "; 10910915Sandreas.sandberg@arm.com ccprintf(response, "%#x", imm); 11010915Sandreas.sandberg@arm.com return response.str(); 11110915Sandreas.sandberg@arm.com } 11210915Sandreas.sandberg@arm.com}}; 11310915Sandreas.sandberg@arm.com 11410915Sandreas.sandberg@arm.comdef template MicroLimmOpConstructor {{ 11510915Sandreas.sandberg@arm.com 11610915Sandreas.sandberg@arm.com inline void %(class_name)s::buildMe() 11710915Sandreas.sandberg@arm.com { 11810915Sandreas.sandberg@arm.com %(constructor)s; 11910915Sandreas.sandberg@arm.com } 12010915Sandreas.sandberg@arm.com 12110915Sandreas.sandberg@arm.com inline %(class_name)s::%(class_name)s( 12210915Sandreas.sandberg@arm.com ExtMachInst machInst, const char * instMnem, 12310915Sandreas.sandberg@arm.com RegIndex _dest, uint64_t _imm, uint8_t _dataSize) : 12410915Sandreas.sandberg@arm.com %(base_class)s(machInst, "%(mnemonic)s", instMnem, 12510915Sandreas.sandberg@arm.com false, false, false, false, %(op_class)s), 12610915Sandreas.sandberg@arm.com dest(_dest), imm(_imm), dataSize(_dataSize) 12710915Sandreas.sandberg@arm.com { 12810915Sandreas.sandberg@arm.com buildMe(); 12910915Sandreas.sandberg@arm.com } 13011313Sandreas.sandberg@arm.com 13110915Sandreas.sandberg@arm.com inline %(class_name)s::%(class_name)s( 13210915Sandreas.sandberg@arm.com ExtMachInst machInst, const char * instMnem, 13310915Sandreas.sandberg@arm.com bool isMicro, bool isDelayed, bool isFirst, bool isLast, 13410915Sandreas.sandberg@arm.com RegIndex _dest, uint64_t _imm, uint8_t _dataSize) : 13510915Sandreas.sandberg@arm.com %(base_class)s(machInst, "%(mnemonic)s", instMnem, 13610915Sandreas.sandberg@arm.com isMicro, isDelayed, isFirst, isLast, %(op_class)s), 13710915Sandreas.sandberg@arm.com dest(_dest), imm(_imm), dataSize(_dataSize) 13810915Sandreas.sandberg@arm.com { 13910915Sandreas.sandberg@arm.com buildMe(); 14010915Sandreas.sandberg@arm.com } 14110915Sandreas.sandberg@arm.com}}; 14210915Sandreas.sandberg@arm.com 14310915Sandreas.sandberg@arm.comlet {{ 14410915Sandreas.sandberg@arm.com class LimmOp(X86Microop): 14510915Sandreas.sandberg@arm.com def __init__(self, dest, imm, dataSize="env.dataSize"): 14610915Sandreas.sandberg@arm.com self.className = "Limm" 14710915Sandreas.sandberg@arm.com self.mnemonic = "limm" 14810915Sandreas.sandberg@arm.com self.dest = dest 14910915Sandreas.sandberg@arm.com self.imm = imm 15010915Sandreas.sandberg@arm.com self.dataSize = dataSize 15110915Sandreas.sandberg@arm.com 15210915Sandreas.sandberg@arm.com def getAllocator(self, *microFlags): 15310915Sandreas.sandberg@arm.com allocator = '''new %(class_name)s(machInst, mnemonic 15410915Sandreas.sandberg@arm.com %(flags)s, %(dest)s, %(imm)s, %(dataSize)s)''' % { 15510915Sandreas.sandberg@arm.com "class_name" : self.className, 15610915Sandreas.sandberg@arm.com "mnemonic" : self.mnemonic, 15710915Sandreas.sandberg@arm.com "flags" : self.microFlagsText(microFlags), 15810915Sandreas.sandberg@arm.com "dest" : self.dest, "imm" : self.imm, 15910915Sandreas.sandberg@arm.com "dataSize" : self.dataSize} 16010915Sandreas.sandberg@arm.com return allocator 16110915Sandreas.sandberg@arm.com 16210915Sandreas.sandberg@arm.com microopClasses["limm"] = LimmOp 16310915Sandreas.sandberg@arm.com}}; 16410915Sandreas.sandberg@arm.com 16510915Sandreas.sandberg@arm.comlet {{ 16610915Sandreas.sandberg@arm.com # Build up the all register version of this micro op 16710915Sandreas.sandberg@arm.com iop = InstObjParams("limm", "Limm", 'X86MicroopBase', 16810915Sandreas.sandberg@arm.com {"code" : "DestReg = merge(DestReg, imm, dataSize);"}) 16910915Sandreas.sandberg@arm.com header_output += MicroLimmOpDeclare.subst(iop) 17010915Sandreas.sandberg@arm.com decoder_output += MicroLimmOpConstructor.subst(iop) 17110915Sandreas.sandberg@arm.com decoder_output += MicroLimmOpDisassembly.subst(iop) 17210915Sandreas.sandberg@arm.com exec_output += MicroLimmOpExecute.subst(iop) 17310915Sandreas.sandberg@arm.com}}; 17410915Sandreas.sandberg@arm.com