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