base.isa revision 4338
14338Sgblack@eecs.umich.edu// -*- mode:c++ -*- 24338Sgblack@eecs.umich.edu 34338Sgblack@eecs.umich.edu// Copyright (c) 2007 The Hewlett-Packard Development Company 44338Sgblack@eecs.umich.edu// All rights reserved. 54338Sgblack@eecs.umich.edu// 64338Sgblack@eecs.umich.edu// Redistribution and use of this software in source and binary forms, 74338Sgblack@eecs.umich.edu// with or without modification, are permitted provided that the 84338Sgblack@eecs.umich.edu// following conditions are met: 94338Sgblack@eecs.umich.edu// 104338Sgblack@eecs.umich.edu// The software must be used only for Non-Commercial Use which means any 114338Sgblack@eecs.umich.edu// use which is NOT directed to receiving any direct monetary 124338Sgblack@eecs.umich.edu// compensation for, or commercial advantage from such use. Illustrative 134338Sgblack@eecs.umich.edu// examples of non-commercial use are academic research, personal study, 144338Sgblack@eecs.umich.edu// teaching, education and corporate research & development. 154338Sgblack@eecs.umich.edu// Illustrative examples of commercial use are distributing products for 164338Sgblack@eecs.umich.edu// commercial advantage and providing services using the software for 174338Sgblack@eecs.umich.edu// commercial advantage. 184338Sgblack@eecs.umich.edu// 194338Sgblack@eecs.umich.edu// If you wish to use this software or functionality therein that may be 204338Sgblack@eecs.umich.edu// covered by patents for commercial use, please contact: 214338Sgblack@eecs.umich.edu// Director of Intellectual Property Licensing 224338Sgblack@eecs.umich.edu// Office of Strategy and Technology 234338Sgblack@eecs.umich.edu// Hewlett-Packard Company 244338Sgblack@eecs.umich.edu// 1501 Page Mill Road 254338Sgblack@eecs.umich.edu// Palo Alto, California 94304 264338Sgblack@eecs.umich.edu// 274338Sgblack@eecs.umich.edu// Redistributions of source code must retain the above copyright notice, 284338Sgblack@eecs.umich.edu// this list of conditions and the following disclaimer. Redistributions 294338Sgblack@eecs.umich.edu// in binary form must reproduce the above copyright notice, this list of 304338Sgblack@eecs.umich.edu// conditions and the following disclaimer in the documentation and/or 314338Sgblack@eecs.umich.edu// other materials provided with the distribution. Neither the name of 324338Sgblack@eecs.umich.edu// the COPYRIGHT HOLDER(s), HEWLETT-PACKARD COMPANY, nor the names of its 334338Sgblack@eecs.umich.edu// contributors may be used to endorse or promote products derived from 344338Sgblack@eecs.umich.edu// this software without specific prior written permission. No right of 354338Sgblack@eecs.umich.edu// sublicense is granted herewith. Derivatives of the software and 364338Sgblack@eecs.umich.edu// output created using the software may be prepared, but only for 374338Sgblack@eecs.umich.edu// Non-Commercial Uses. Derivatives of the software may be shared with 384338Sgblack@eecs.umich.edu// others provided: (i) the others agree to abide by the list of 394338Sgblack@eecs.umich.edu// conditions herein which includes the Non-Commercial Use restrictions; 404338Sgblack@eecs.umich.edu// and (ii) such Derivatives of the software include the above copyright 414338Sgblack@eecs.umich.edu// notice to acknowledge the contribution from this software where 424338Sgblack@eecs.umich.edu// applicable, this list of conditions and the disclaimer below. 434338Sgblack@eecs.umich.edu// 444338Sgblack@eecs.umich.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 454338Sgblack@eecs.umich.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 464338Sgblack@eecs.umich.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 474338Sgblack@eecs.umich.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 484338Sgblack@eecs.umich.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 494338Sgblack@eecs.umich.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 504338Sgblack@eecs.umich.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 514338Sgblack@eecs.umich.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 524338Sgblack@eecs.umich.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 534338Sgblack@eecs.umich.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 544338Sgblack@eecs.umich.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 554338Sgblack@eecs.umich.edu// 564338Sgblack@eecs.umich.edu// Authors: Gabe Black 574338Sgblack@eecs.umich.edu 584338Sgblack@eecs.umich.edu//The operand types a microop template can be specialized with 594338Sgblack@eecs.umich.eduoutput header {{ 604338Sgblack@eecs.umich.edu enum OperandType { 614338Sgblack@eecs.umich.edu RegisterOperand, 624338Sgblack@eecs.umich.edu ImmediateOperand 634338Sgblack@eecs.umich.edu }; 644338Sgblack@eecs.umich.edu}}; 654338Sgblack@eecs.umich.edu 664338Sgblack@eecs.umich.edu//A class which is the base of all x86 micro ops it provides a function to 674338Sgblack@eecs.umich.edu//set necessary flags appropriately. 684338Sgblack@eecs.umich.eduoutput header {{ 694338Sgblack@eecs.umich.edu class X86MicroOpBase : public X86StaticInst 704338Sgblack@eecs.umich.edu { 714338Sgblack@eecs.umich.edu protected: 724338Sgblack@eecs.umich.edu X86MicroOpBase(bool isMicro, bool isDelayed, 734338Sgblack@eecs.umich.edu bool isFirst, bool isLast, 744338Sgblack@eecs.umich.edu const char *mnem, ExtMachInst _machInst, 754338Sgblack@eecs.umich.edu OpClass __opClass) : 764338Sgblack@eecs.umich.edu X86StaticInst(mnem, _machInst, __opClass) 774338Sgblack@eecs.umich.edu { 784338Sgblack@eecs.umich.edu flags[IsMicroOp] = isMicro; 794338Sgblack@eecs.umich.edu flags[IsDelayedCommit] = isDelayed; 804338Sgblack@eecs.umich.edu flags[IsFirstMicroOp] = isFirst; 814338Sgblack@eecs.umich.edu flags[IsLastMicroOp] = isLast; 824338Sgblack@eecs.umich.edu } 834338Sgblack@eecs.umich.edu }; 844338Sgblack@eecs.umich.edu}}; 854338Sgblack@eecs.umich.edu 864338Sgblack@eecs.umich.edu// This sets up a class which is templated on the type of 874338Sgblack@eecs.umich.edu// arguments a particular flavor of a microcode instruction 884338Sgblack@eecs.umich.edu// can accept. It's parameters are specialized to create polymorphic 894338Sgblack@eecs.umich.edu// behavior in microops. 904338Sgblack@eecs.umich.edudef template BaseMicroOpTemplateDeclare {{ 914338Sgblack@eecs.umich.edu template%(signature)s 924338Sgblack@eecs.umich.edu class %(class_name)s; 934338Sgblack@eecs.umich.edu}}; 944338Sgblack@eecs.umich.edu 954338Sgblack@eecs.umich.edulet {{ 964338Sgblack@eecs.umich.edu def buildBaseMicroOpTemplate(Name, numParams): 974338Sgblack@eecs.umich.edu signature = "<" 984338Sgblack@eecs.umich.edu signature += "int SignatureOperandTypeSpecifier0" 994338Sgblack@eecs.umich.edu for count in xrange(1,numParams): 1004338Sgblack@eecs.umich.edu signature += \ 1014338Sgblack@eecs.umich.edu ", int SingatureOperandTypeSpecifier%d" % count 1024338Sgblack@eecs.umich.edu signature += ">" 1034338Sgblack@eecs.umich.edu subs = {"signature" : signature, "class_name" : Name} 1044338Sgblack@eecs.umich.edu return BaseMicroOpTemplateDeclare.subst(subs) 1054338Sgblack@eecs.umich.edu 1064338Sgblack@eecs.umich.edu RegOpType = "RegisterOperand" 1074338Sgblack@eecs.umich.edu ImmOpType = "ImmediateOperand" 1084338Sgblack@eecs.umich.edu 1094338Sgblack@eecs.umich.edu def buildMicroOpTemplateDict(*params): 1104338Sgblack@eecs.umich.edu signature = "<" 1114338Sgblack@eecs.umich.edu if len(params): 1124338Sgblack@eecs.umich.edu signature += params[0] 1134338Sgblack@eecs.umich.edu if len(params) > 1: 1144338Sgblack@eecs.umich.edu for param in params[1:]: 1154338Sgblack@eecs.umich.edu signature += ", %s" % param 1164338Sgblack@eecs.umich.edu signature += ">" 1174338Sgblack@eecs.umich.edu subs = {"param_dec" : "", "param_arg_dec" : "", 1184338Sgblack@eecs.umich.edu "param_init" : "", "signature" : signature} 1194338Sgblack@eecs.umich.edu for count in xrange(len(params)): 1204338Sgblack@eecs.umich.edu subs["param_dec"] += "uint64_t param%d;\n" % count 1214338Sgblack@eecs.umich.edu subs["param_arg_dec"] += ", uint64_t _param%d" % count 1224338Sgblack@eecs.umich.edu subs["param_init"] += ", param%d(_param%d)" % (count, count) 1234338Sgblack@eecs.umich.edu return subs 1244338Sgblack@eecs.umich.edu}}; 1254338Sgblack@eecs.umich.edu 1264338Sgblack@eecs.umich.edu// A tmeplate for building a specialized version of the microcode 1274338Sgblack@eecs.umich.edu// instruction which knows specifies which arguments it wants 1284338Sgblack@eecs.umich.edudef template MicroOpDeclare {{ 1294338Sgblack@eecs.umich.edu template<> 1304338Sgblack@eecs.umich.edu class %(class_name)s%(signature)s : public X86MicroOpBase 1314338Sgblack@eecs.umich.edu { 1324338Sgblack@eecs.umich.edu protected: 1334338Sgblack@eecs.umich.edu %(param_dec)s 1344338Sgblack@eecs.umich.edu void buildMe(); 1354338Sgblack@eecs.umich.edu 1364338Sgblack@eecs.umich.edu public: 1374338Sgblack@eecs.umich.edu %(class_name)s(bool isMicro, bool isDelayed, 1384338Sgblack@eecs.umich.edu bool isFirst, bool isLast, 1394338Sgblack@eecs.umich.edu ExtMachInst _machInst %(param_arg_dec)s); 1404338Sgblack@eecs.umich.edu 1414338Sgblack@eecs.umich.edu %(class_name)s(ExtMachInst _machInst %(param_arg_dec)s); 1424338Sgblack@eecs.umich.edu 1434338Sgblack@eecs.umich.edu %(BasicExecDeclare)s 1444338Sgblack@eecs.umich.edu }; 1454338Sgblack@eecs.umich.edu}}; 1464338Sgblack@eecs.umich.edu 1474338Sgblack@eecs.umich.edudef template MicroOpConstructor {{ 1484338Sgblack@eecs.umich.edu 1494338Sgblack@eecs.umich.edu inline void %(class_name)s%(signature)s::buildMe() 1504338Sgblack@eecs.umich.edu { 1514338Sgblack@eecs.umich.edu %(constructor)s; 1524338Sgblack@eecs.umich.edu } 1534338Sgblack@eecs.umich.edu 1544338Sgblack@eecs.umich.edu inline %(class_name)s%(signature)s::%(class_name)s( 1554338Sgblack@eecs.umich.edu ExtMachInst machInst %(param_arg_dec)s) : 1564338Sgblack@eecs.umich.edu %(base_class)s(false, false, false, false, 1574338Sgblack@eecs.umich.edu "%(mnemonic)s", machInst, %(op_class)s) 1584338Sgblack@eecs.umich.edu %(param_init)s 1594338Sgblack@eecs.umich.edu { 1604338Sgblack@eecs.umich.edu buildMe(); 1614338Sgblack@eecs.umich.edu } 1624338Sgblack@eecs.umich.edu 1634338Sgblack@eecs.umich.edu inline %(class_name)s%(signature)s::%(class_name)s( 1644338Sgblack@eecs.umich.edu bool isMicro, bool isDelayed, bool isFirst, bool isLast, 1654338Sgblack@eecs.umich.edu ExtMachInst machInst %(param_arg_dec)s) 1664338Sgblack@eecs.umich.edu : %(base_class)s(isMicro, isDelayed, isFirst, isLast, 1674338Sgblack@eecs.umich.edu "%(mnemonic)s", machInst, %(op_class)s) 1684338Sgblack@eecs.umich.edu %(param_init)s 1694338Sgblack@eecs.umich.edu { 1704338Sgblack@eecs.umich.edu buildMe(); 1714338Sgblack@eecs.umich.edu } 1724338Sgblack@eecs.umich.edu}}; 173