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