// -*- mode:c++ -*-

// Copyright (c) 2007 The Hewlett-Packard Development Company
// All rights reserved.
//
// The license below extends only to copyright in the software and shall
// not be construed as granting a license to any other intellectual
// property including but not limited to intellectual property relating
// to a hardware implementation of the functionality of the software
// licensed hereunder.  You may use the software subject to the license
// terms below provided that you ensure that this notice is replicated
// unmodified and in its entirety in all distributions of the software,
// modified or unmodified, in source code or in binary form.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met: redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer;
// redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution;
// neither the name of the copyright holders nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

////////////////////////////////////////////////////////////////////
//
//  Code to "specialize" a microcode sequence to use a particular
//  variety of operands
//

let {{
    # This code builds up a decode block which decodes based on switchval.
    # vals is a dict which matches case values with what should be decoded to.
    # Each element of the dict is a list containing a function and then the
    # arguments to pass to it.
    def doSplitDecode(switchVal, vals, default = None):
        blocks = OutputBlocks()
        blocks.decode_block = 'switch(%s) {\n' % switchVal
        for (val, todo) in vals.items():
            new_blocks = todo[0](*todo[1:])
            new_blocks.decode_block = \
                '\tcase %s: %s\n' % (val, new_blocks.decode_block)
            blocks.append(new_blocks)
        if default:
            new_blocks = default[0](*default[1:])
            new_blocks.decode_block = \
                '\tdefault: %s\n' % new_blocks.decode_block
            blocks.append(new_blocks)
        blocks.decode_block += '}\n'
        return blocks
}};

let {{
    def doRipRelativeDecode(Name, opTypes, env):
        # print "RIPing %s with opTypes %s" % (Name, opTypes)
        env.memoryInst = True
        normEnv = copy.copy(env)
        normEnv.addToDisassembly(
                '''printMem(out, env.seg, env.scale, env.index, env.base,
                    machInst.displacement, env.addressSize, false);''')
        normBlocks = specializeInst(Name + "_M", copy.copy(opTypes), normEnv)
        ripEnv = copy.copy(env)
        ripEnv.addToDisassembly(
                '''printMem(out, env.seg, 1, 0, 0,
                    machInst.displacement, env.addressSize, true);''')
        ripBlocks = specializeInst(Name + "_P", copy.copy(opTypes), ripEnv)

        blocks = OutputBlocks()
        blocks.append(normBlocks)
        blocks.append(ripBlocks)

        blocks.decode_block = '''
        if(machInst.modRM.mod == 0 &&
          machInst.modRM.rm == 5 &&
          machInst.mode.submode == SixtyFourBitMode)
        { %s }
        else
        { %s }''' % \
         (ripBlocks.decode_block, normBlocks.decode_block)
        return blocks
}};

let {{
    def doBadInstDecode():
        blocks = OutputBlocks()
        blocks.decode_block = '''
        return new Unknown(machInst);
        '''
        return blocks
}};

let {{
    class OpType(object):
        parser = re.compile(r"(?P<tag>[A-Z]+)(?P<size>[a-z]*)|"
                             "(r(?P<reg>[A-Z0-9]+)(?P<rsize>[a-z]*))|"
                             "(s(?P<seg>[A-Z0-9]+)(?P<ssize>[a-z]*))")
        def __init__(self, opTypeString):
            match = OpType.parser.search(opTypeString)
            if match == None:
                raise Exception("Problem parsing operand type {}".format(
                    opTypeString))
            self.reg = match.group("reg")
            self.seg = match.group("seg")
            self.tag = match.group("tag")
            self.size = match.group("size")
            if not self.size:
                self.size = match.group("rsize")
            if not self.size:
                self.size = match.group("ssize")

    ModRMRegIndex = "(MODRM_REG | (REX_R << 3))"
    ModRMRMIndex = "(MODRM_RM | (REX_B << 3))"
    InstRegIndex = "(OPCODE_OP_BOTTOM3 | (REX_B << 3))"

    # This function specializes the given piece of code to use a particular
    # set of argument types described by "opTypes".
    def specializeInst(Name, opTypes, env):
        # print "Specializing %s with opTypes %s" % (Name, opTypes)
        while len(opTypes):
            # Parse the operand type string we're working with
            opType = OpType(opTypes[0])
            opTypes.pop(0)

            if opType.tag not in ("I", "J", "P", "PR", "Q", "V", "VR", "W"):
                if opType.size:
                    env.setSize(opType.size)

            if opType.reg:
                #Figure out what to do with fixed register operands
                #This is the index to use, so we should stick it some place.
                if opType.reg in ("A", "B", "C", "D"):
                    regString = "int_reg::R%sx" % opType.reg.lower()
                else:
                    regString = "int_reg::R%s" % opType.reg.lower()
                env.addReg(regString)
                if env.regmUsed:
                    regString = "env.regm"
                else:
                    regString = "env.reg"
                env.addToDisassembly(
                    "printReg(out, RegId(IntRegClass, %s), regSize);\n" %
                    regString)

                Name += "_R"

            elif opType.seg:
                env.addReg("SEGMENT_REG_%sS" % opType.seg)
                if env.regmUsed:
                    regString = "env.regm"
                else:
                    regString = "env.reg"
                env.addToDisassembly("printSegment(out, %s);\n" % regString)

                Name += "_S"

            elif opType.tag == "B":
                # This refers to registers whose index is encoded as part of
                # the opcode.
                env.addToDisassembly(
                        "printReg(out, RegId(IntRegClass, %s), regSize);\n" %
                        InstRegIndex)

                Name += "_R"

                env.addReg(InstRegIndex)
            elif opType.tag == "M":
                # This refers to memory. The macroop constructor sets up modrm
                # addressing. Non memory modrm settings should cause an error.
                env.doModRM = True
                return doSplitDecode("MODRM_MOD",
                        {"3" : (doBadInstDecode,) },
                        (doRipRelativeDecode, Name, opTypes, env))
            elif opType.tag == None or opType.size == None:
                raise Exception("Problem parsing operand tag: {}".format(
                    opType.tag))
            elif opType.tag == "C":
                # A control register indexed by the "reg" field
                env.addReg(ModRMRegIndex)
                env.addToDisassembly(
                        "ccprintf(out, \"CR%%d\", %s);\n" % ModRMRegIndex)
                Name += "_C"
            elif opType.tag == "D":
                # A debug register indexed by the "reg" field
                env.addReg(ModRMRegIndex)
                env.addToDisassembly(
                        "ccprintf(out, \"DR%%d\", %s);\n" % ModRMRegIndex)
                Name += "_D"
            elif opType.tag == "S":
                # A segment selector register indexed by the "reg" field
                env.addReg(ModRMRegIndex)
                env.addToDisassembly(
                        "printSegment(out, %s);\n" % ModRMRegIndex)
                Name += "_S"
            elif opType.tag in ("G", "P", "T", "V"):
                # Use the "reg" field of the ModRM byte to select the register
                env.addReg(ModRMRegIndex)

                if opType.tag == "P":
                    regFormat = 'ccprintf(out, "MMX%%d", %s);\n'
                    Name += "_MMX"
                elif opType.tag == "V":
                    regFormat = 'ccprintf(out, "XMM%%d", %s);\n'
                    Name += "_XMM"
                else:
                    regFormat = \
                        "printReg(out, RegId(IntRegClass, %s), regSize);\n"
                    Name += "_R"
                env.addToDisassembly(regFormat % ModRMRegIndex)
            elif opType.tag in ("E", "Q", "W"):
                # This might refer to memory or to a register. We need to
                # divide it up farther.
                regEnv = copy.copy(env)
                regEnv.addReg(ModRMRMIndex)

                # This refers to memory. The macroop constructor should set up

                # modrm addressing.
                memEnv = copy.copy(env)
                memEnv.doModRM = True
                if opType.tag == "Q":
                    regFormat = 'ccprintf(out, "MMX%%d", %s);\n'
                    regSuffix = "_MMX"
                elif opType.tag == "W":
                    regFormat = 'ccprintf(out, "XMM%%d", %s);\n'
                    regSuffix = "_XMM"
                else:
                    regFormat = \
                        "printReg(out, RegId(IntRegClass, %s), regSize);\n"
                    regSuffix = "_R"
                env.addToDisassembly(regFormat % ModRMRegIndex)
                return doSplitDecode("MODRM_MOD",
                    {"3" : (specializeInst, Name + regSuffix,
                            copy.copy(opTypes), regEnv)},
                           (doRipRelativeDecode, Name,
                            copy.copy(opTypes), memEnv))
            elif opType.tag in ("I", "J"):
                # Immediates
                env.addToDisassembly(
                        "ccprintf(out, \"%#x\", machInst.immediate);\n")
                Name += "_I"
            elif opType.tag == "O":
                # Immediate containing a memory offset
                Name += "_MI"
            elif opType.tag in ("PR", "R", "VR"):
                # Non register modrm settings should cause an error
                env.addReg(ModRMRMIndex)

                if opType.tag == "PR":
                    regFormat = 'ccprintf(out, "MMX%%d", %s);\n'
                    Name += "_MMX"
                elif opType.tag == "VR":
                    regFormat = 'ccprintf(out, "XMM%%d", %s);\n'
                    Name += "_XMM"
                else:
                    regFormat = \
                        "printReg(out, RegId(IntRegClass, %s), regSize);\n"
                    Name += "_R"
                env.addToDisassembly(regFormat % ModRMRegIndex)
            elif opType.tag in ("X", "Y"):
                # This type of memory addressing is for string instructions.
                # They'll use the right index and segment internally.
                if opType.tag == "X":
                    env.addToDisassembly(
                            '''printMem(out, env.seg,
                                1, X86ISA::int_reg::NumRegs,
                                X86ISA::int_reg::Rsi, 0,
                                env.addressSize, false);''')
                else:
                    env.addToDisassembly(
                            '''printMem(out, SEGMENT_REG_ES,
                                1, X86ISA::int_reg::NumRegs,
                                X86ISA::int_reg::Rdi, 0,
                                env.addressSize, false);''')
                Name += "_M"
            else:
                raise Exception("Unrecognized tag {}.".format(opType.tag))

        # Generate code to return a macroop of the given name which will
        # operate in the "emulation environment" env
        return genMacroop(Name, env)
}};
