base.isa revision 4344:174e31456abe
110448Snilay@cs.wisc.edu// -*- mode:c++ -*- 210448Snilay@cs.wisc.edu 310448Snilay@cs.wisc.edu// Copyright (c) 2007 The Hewlett-Packard Development Company 410448Snilay@cs.wisc.edu// All rights reserved. 510448Snilay@cs.wisc.edu// 610448Snilay@cs.wisc.edu// Redistribution and use of this software in source and binary forms, 710448Snilay@cs.wisc.edu// with or without modification, are permitted provided that the 810448Snilay@cs.wisc.edu// following conditions are met: 910448Snilay@cs.wisc.edu// 1010448Snilay@cs.wisc.edu// The software must be used only for Non-Commercial Use which means any 1110448Snilay@cs.wisc.edu// use which is NOT directed to receiving any direct monetary 1210448Snilay@cs.wisc.edu// compensation for, or commercial advantage from such use. Illustrative 1310448Snilay@cs.wisc.edu// examples of non-commercial use are academic research, personal study, 1410448Snilay@cs.wisc.edu// teaching, education and corporate research & development. 1510448Snilay@cs.wisc.edu// Illustrative examples of commercial use are distributing products for 1610448Snilay@cs.wisc.edu// commercial advantage and providing services using the software for 1710448Snilay@cs.wisc.edu// commercial advantage. 1810448Snilay@cs.wisc.edu// 1910448Snilay@cs.wisc.edu// If you wish to use this software or functionality therein that may be 2010448Snilay@cs.wisc.edu// covered by patents for commercial use, please contact: 2110448Snilay@cs.wisc.edu// Director of Intellectual Property Licensing 2210447Snilay@cs.wisc.edu// Office of Strategy and Technology 2310447Snilay@cs.wisc.edu// Hewlett-Packard Company 2410447Snilay@cs.wisc.edu// 1501 Page Mill Road 2510447Snilay@cs.wisc.edu// Palo Alto, California 94304 2610447Snilay@cs.wisc.edu// 2710447Snilay@cs.wisc.edu// Redistributions of source code must retain the above copyright notice, 2810447Snilay@cs.wisc.edu// this list of conditions and the following disclaimer. Redistributions 2910447Snilay@cs.wisc.edu// in binary form must reproduce the above copyright notice, this list of 3010447Snilay@cs.wisc.edu// conditions and the following disclaimer in the documentation and/or 3110447Snilay@cs.wisc.edu// other materials provided with the distribution. Neither the name of 3210447Snilay@cs.wisc.edu// the COPYRIGHT HOLDER(s), HEWLETT-PACKARD COMPANY, nor the names of its 3310447Snilay@cs.wisc.edu// contributors may be used to endorse or promote products derived from 3410447Snilay@cs.wisc.edu// this software without specific prior written permission. No right of 3510447Snilay@cs.wisc.edu// sublicense is granted herewith. Derivatives of the software and 3610447Snilay@cs.wisc.edu// output created using the software may be prepared, but only for 3710447Snilay@cs.wisc.edu// Non-Commercial Uses. Derivatives of the software may be shared with 3810447Snilay@cs.wisc.edu// others provided: (i) the others agree to abide by the list of 3910447Snilay@cs.wisc.edu// conditions herein which includes the Non-Commercial Use restrictions; 4010447Snilay@cs.wisc.edu// and (ii) such Derivatives of the software include the above copyright 4110447Snilay@cs.wisc.edu// notice to acknowledge the contribution from this software where 4210447Snilay@cs.wisc.edu// applicable, this list of conditions and the disclaimer below. 4310447Snilay@cs.wisc.edu// 4410447Snilay@cs.wisc.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 4510447Snilay@cs.wisc.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 4610447Snilay@cs.wisc.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 4710447Snilay@cs.wisc.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 4810447Snilay@cs.wisc.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 4910447Snilay@cs.wisc.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 5010447Snilay@cs.wisc.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 5110447Snilay@cs.wisc.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 5210447Snilay@cs.wisc.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 5310447Snilay@cs.wisc.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 5410447Snilay@cs.wisc.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 5510447Snilay@cs.wisc.edu// 5610447Snilay@cs.wisc.edu// Authors: Gabe Black 5710447Snilay@cs.wisc.edu 5810447Snilay@cs.wisc.edu//The operand types a microop template can be specialized with 5910447Snilay@cs.wisc.eduoutput header {{ 6010447Snilay@cs.wisc.edu enum OperandType { 6110447Snilay@cs.wisc.edu RegisterOperand, 6210447Snilay@cs.wisc.edu ImmediateOperand 6310447Snilay@cs.wisc.edu }; 6410447Snilay@cs.wisc.edu}}; 6510447Snilay@cs.wisc.edu 6610447Snilay@cs.wisc.edu//A class which is the base of all x86 micro ops. It provides a function to 6710447Snilay@cs.wisc.edu//set necessary flags appropriately. 6810447Snilay@cs.wisc.eduoutput header {{ 6910447Snilay@cs.wisc.edu class X86MicroOpBase : public X86StaticInst 7010447Snilay@cs.wisc.edu { 7110447Snilay@cs.wisc.edu protected: 7210447Snilay@cs.wisc.edu uint8_t opSize; 7310447Snilay@cs.wisc.edu uint8_t addrSize; 7410447Snilay@cs.wisc.edu 7510447Snilay@cs.wisc.edu X86MicroOpBase(bool isMicro, bool isDelayed, 7610447Snilay@cs.wisc.edu bool isFirst, bool isLast, 7710447Snilay@cs.wisc.edu const char *mnem, ExtMachInst _machInst, 7810447Snilay@cs.wisc.edu OpClass __opClass) : 7910447Snilay@cs.wisc.edu X86StaticInst(mnem, _machInst, __opClass) 8010447Snilay@cs.wisc.edu { 8110447Snilay@cs.wisc.edu flags[IsMicroOp] = isMicro; 8210447Snilay@cs.wisc.edu flags[IsDelayedCommit] = isDelayed; 8310447Snilay@cs.wisc.edu flags[IsFirstMicroOp] = isFirst; 8410447Snilay@cs.wisc.edu flags[IsLastMicroOp] = isLast; 8510447Snilay@cs.wisc.edu } 8610447Snilay@cs.wisc.edu }; 8710447Snilay@cs.wisc.edu}}; 8810447Snilay@cs.wisc.edu 8910447Snilay@cs.wisc.edu// This sets up a class which is templated on the type of 9010447Snilay@cs.wisc.edu// arguments a particular flavor of a microcode instruction 9110447Snilay@cs.wisc.edu// can accept. It's parameters are specialized to create polymorphic 9210447Snilay@cs.wisc.edu// behavior in microops. 9310447Snilay@cs.wisc.edudef template BaseMicroOpTemplateDeclare {{ 9410447Snilay@cs.wisc.edu template%(signature)s 9510447Snilay@cs.wisc.edu class %(class_name)s; 9610447Snilay@cs.wisc.edu}}; 9710447Snilay@cs.wisc.edu 9810447Snilay@cs.wisc.edulet {{ 9910447Snilay@cs.wisc.edu def buildBaseMicroOpTemplate(Name, numParams): 10010447Snilay@cs.wisc.edu assert(numParams > 0) 10110447Snilay@cs.wisc.edu signature = "<" 10210447Snilay@cs.wisc.edu signature += "int SignatureOperandTypeSpecifier0" 10310447Snilay@cs.wisc.edu for count in xrange(1,numParams): 10410447Snilay@cs.wisc.edu signature += \ 10510447Snilay@cs.wisc.edu ", int SingatureOperandTypeSpecifier%d" % count 10610447Snilay@cs.wisc.edu signature += ">" 10710447Snilay@cs.wisc.edu subs = {"signature" : signature, "class_name" : Name} 10810447Snilay@cs.wisc.edu return BaseMicroOpTemplateDeclare.subst(subs) 10910447Snilay@cs.wisc.edu}}; 11010447Snilay@cs.wisc.edu 11110447Snilay@cs.wisc.edulet {{ 11210447Snilay@cs.wisc.edu def buildMicroOpTemplateDict(*params): 11310447Snilay@cs.wisc.edu signature = "<" 11410447Snilay@cs.wisc.edu if len(params): 11510447Snilay@cs.wisc.edu signature += params[0] 11610447Snilay@cs.wisc.edu if len(params) > 1: 11710447Snilay@cs.wisc.edu for param in params[1:]: 11810447Snilay@cs.wisc.edu signature += ", %s" % param 11910447Snilay@cs.wisc.edu signature += ">" 12010447Snilay@cs.wisc.edu subs = {"param_dec" : "", "param_arg_dec" : "", 12110447Snilay@cs.wisc.edu "param_init" : "", "signature" : signature} 12210447Snilay@cs.wisc.edu for count in xrange(len(params)): 12310447Snilay@cs.wisc.edu subs["param_dec"] += "uint64_t param%d;\n" % count 12410447Snilay@cs.wisc.edu subs["param_arg_dec"] += ", uint64_t _param%d" % count 12510447Snilay@cs.wisc.edu subs["param_init"] += ", param%d(_param%d)" % (count, count) 12610447Snilay@cs.wisc.edu return subs 12710447Snilay@cs.wisc.edu}}; 12810447Snilay@cs.wisc.edu 12910447Snilay@cs.wisc.edu// A tmeplate for building a specialized version of the microcode 13010447Snilay@cs.wisc.edu// instruction which knows specifies which arguments it wants 13110447Snilay@cs.wisc.edudef template MicroOpDeclare {{ 13210447Snilay@cs.wisc.edu template<> 13310447Snilay@cs.wisc.edu class %(class_name)s%(signature)s : public X86MicroOpBase 13410447Snilay@cs.wisc.edu { 13510447Snilay@cs.wisc.edu protected: 13610447Snilay@cs.wisc.edu %(param_dec)s 13710447Snilay@cs.wisc.edu void buildMe(); 13810447Snilay@cs.wisc.edu 13910447Snilay@cs.wisc.edu public: 14010447Snilay@cs.wisc.edu %(class_name)s(bool isMicro, bool isDelayed, 14110447Snilay@cs.wisc.edu bool isFirst, bool isLast, 14210447Snilay@cs.wisc.edu ExtMachInst _machInst %(param_arg_dec)s); 14310447Snilay@cs.wisc.edu 14410447Snilay@cs.wisc.edu %(class_name)s(ExtMachInst _machInst %(param_arg_dec)s); 14510447Snilay@cs.wisc.edu 14610447Snilay@cs.wisc.edu %(BasicExecDeclare)s 14710447Snilay@cs.wisc.edu }; 14810447Snilay@cs.wisc.edu}}; 14910447Snilay@cs.wisc.edu 15010447Snilay@cs.wisc.edudef template MicroOpConstructor {{ 15110447Snilay@cs.wisc.edu 15210447Snilay@cs.wisc.edu inline void %(class_name)s%(signature)s::buildMe() 15310447Snilay@cs.wisc.edu { 15410447Snilay@cs.wisc.edu %(constructor)s; 15510447Snilay@cs.wisc.edu } 15610447Snilay@cs.wisc.edu 15710447Snilay@cs.wisc.edu inline %(class_name)s%(signature)s::%(class_name)s( 15810447Snilay@cs.wisc.edu ExtMachInst machInst %(param_arg_dec)s) : 15910447Snilay@cs.wisc.edu %(base_class)s(false, false, false, false, 16010447Snilay@cs.wisc.edu "%(mnemonic)s", machInst, %(op_class)s) 16110447Snilay@cs.wisc.edu %(param_init)s 16210447Snilay@cs.wisc.edu { 16310447Snilay@cs.wisc.edu buildMe(); 16410447Snilay@cs.wisc.edu } 16510447Snilay@cs.wisc.edu 16610447Snilay@cs.wisc.edu inline %(class_name)s%(signature)s::%(class_name)s( 16710447Snilay@cs.wisc.edu bool isMicro, bool isDelayed, bool isFirst, bool isLast, 16810447Snilay@cs.wisc.edu ExtMachInst machInst %(param_arg_dec)s) 16910447Snilay@cs.wisc.edu : %(base_class)s(isMicro, isDelayed, isFirst, isLast, 17010447Snilay@cs.wisc.edu "%(mnemonic)s", machInst, %(op_class)s) 17110447Snilay@cs.wisc.edu %(param_init)s 17210447Snilay@cs.wisc.edu { 17310447Snilay@cs.wisc.edu buildMe(); 17410447Snilay@cs.wisc.edu } 17510447Snilay@cs.wisc.edu}}; 17610447Snilay@cs.wisc.edu