// -*- 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_idx::%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_idx::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)
}};
