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

// Copyright (c) 2007-2008 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.

//Include the definitions of the micro ops.
//These are python representations of static insts which stand on their own
//and make up an internal instruction set. They are used by the micro
//assembler.
##include "microops/microops.isa"

//Include code to build macroops in both C++ and python.
##include "macroop.isa"

//Include code to fill out the microcode ROM in both C++ and python.
##include "rom.isa"

let {{
    import sys
    sys.path[0:0] = ["src/arch/x86/isa/"]
    from insts import microcode
    # print microcode
    from micro_asm import MicroAssembler, RomMacroop
    mainRom = X86MicrocodeRom('main ROM')
    assembler = MicroAssembler(X86Macroop, microopClasses, mainRom, RomMacroop)

    def gpRegIdx(idx):
        return "X86ISA::GpRegIndex(%s)" % idx
    def fpRegIdx(idx):
        return "X86ISA::FpRegIndex(%s)" % idx
    def ctrlRegIdx(idx):
        return "X86ISA::CtrlRegIndex(%s)" % idx
    def crRegIdx(idx):
        return "X86ISA::CrRegIndex(%s)" % idx
    def drRegIdx(idx):
        return "X86ISA::DbgRegIndex(%s)" % idx
    def segRegIdx(idx):
        return "X86ISA::SegRegIndex(%s)" % idx

    assembler.symbols["gpRegIdx"] = gpRegIdx
    assembler.symbols["fpRegIdx"] = fpRegIdx
    assembler.symbols["ctrlRegIdx"] = ctrlRegIdx
    assembler.symbols["crRegIdx"] = crRegIdx
    assembler.symbols["drRegIdx"] = drRegIdx
    assembler.symbols["segRegIdx"] = segRegIdx

    # Add in symbols for the microcode registers
    for num in range(16):
        assembler.symbols["t%d" % num] = gpRegIdx("intRegMicro(%d)" % num)
    for num in range(8):
        assembler.symbols["ufp%d" % num] = \
            fpRegIdx("float_reg::microfp(%d)" % num)
    # Add in symbols for the segment descriptor registers
    for letter in ("c", "d", "e", "f", "g", "h", "s"):
        assembler.symbols["%ss" % letter.lower()] = \
            segRegIdx(f"segment_idx::{letter.capitalize()}s")

    # Add in symbols for the various checks of segment selectors.
    for check in ("NoCheck", "CSCheck", "CallGateCheck", "IntGateCheck",
                  "SoftIntGateCheck", "SSCheck", "IretCheck", "IntCSCheck",
                  "TRCheck", "TSSCheck", "InGDTCheck", "LDTCheck"):
        assembler.symbols[check] = "Seg%s" % check

    for reg in ("tr", "idtr"):
        assembler.symbols[reg] = segRegIdx(f"segment_idx::{reg.capitalize()}")

    for reg in ("tsl", "tsg"):
        assembler.symbols[reg] = segRegIdx(f"segment_idx::{reg.capitalize()}")

    # Miscellaneous symbols
    symbols = {
        "reg" : gpRegIdx("env.reg"),
        "cr" : crRegIdx("env.reg"),
        "dr" : drRegIdx("env.reg"),
        "sr" : segRegIdx("env.reg"),
        "xmml" : fpRegIdx("float_reg::xmmLow(env.reg)"),
        "xmmh" : fpRegIdx("float_reg::xmmHigh(env.reg)"),
        "regm" : gpRegIdx("env.regm"),
        "crm" : crRegIdx("env.regm"),
        "drm" : drRegIdx("env.regm"),
        "srm" : segRegIdx("env.regm"),
        "xmmlm" : fpRegIdx("float_reg::xmmLow(env.regm)"),
        "xmmhm" : fpRegIdx("float_reg::xmmHigh(env.regm)"),
        "mmx" : fpRegIdx("float_reg::mmx(env.reg)"),
        "mmxm" : fpRegIdx("float_reg::mmx(env.regm)"),
        "imm" : "adjustedImm",
        "disp" : "adjustedDisp",
        "seg" : segRegIdx("env.seg"),
        "scale" : "env.scale",
        "index" : gpRegIdx("env.index"),
        "base" : gpRegIdx("env.base"),
        "dsz" : "env.dataSize",
        "asz" : "env.addressSize",
        "ssz" : "env.stackSize"
    }
    assembler.symbols.update(symbols)

    assembler.symbols["ldsz"] = \
        "((env.dataSize == 8) ? 3 : (env.dataSize == 4) ? 2 : 1)"

    assembler.symbols["lasz"] = \
        "((env.addressSize == 8) ? 3 : (env.addressSize == 4) ? 2 : 1)"

    assembler.symbols["lssz"] = \
        "((env.stackSize == 8) ? 3 : (env.stackSize == 4) ? 2 : 1)"

    # Short hand for common scale-index-base combinations.
    assembler.symbols["sib"] = \
        [symbols["scale"], symbols["index"], symbols["base"]]
    assembler.symbols["riprel"] = \
        ["1", assembler.symbols["t0"], assembler.symbols["t7"]]

    # This segment selects an internal address space mapped to MSRs,
    # CPUID info, etc.
    assembler.symbols["intseg"] = segRegIdx("segment_idx::Ms")
    # This segment always has base 0, and doesn't imply any special handling
    # like the internal segment above
    assembler.symbols["flatseg"] = segRegIdx("segment_idx::Ls")

    for reg in ('ax', 'bx', 'cx', 'dx', 'sp', 'bp', 'si', 'di', \
                '8',  '9',  '10', '11', '12', '13', '14', '15'):
        assembler.symbols["r%s" % reg] = \
            gpRegIdx("int_reg::R%s" % reg)

    for reg in ('ah', 'bh', 'ch', 'dh'):
        assembler.symbols[reg] = \
            gpRegIdx("X86ISA::intRegFolded(int_reg::%s, IntFoldBit)" %
                    reg.capitalize())

    for reg in range(16):
        assembler.symbols["cr%d" % reg] = crRegIdx("%d" % reg)

    for flag in ('CF', 'PF', 'ECF', 'AF', 'EZF', 'ZF', 'SF', 'OF', \
                 'TF', 'IF', 'NT', 'RF', 'VM', 'AC', 'VIF', 'VIP', 'ID'):
        assembler.symbols[flag] = flag + "Bit"

    for cond in ('True', 'False', 'ECF', 'EZF', 'SZnZF',
                 'MSTRZ', 'STRZ', 'MSTRC',
                 'OF', 'CF', 'ZF', 'CvZF',
                 'SF', 'PF', 'SxOF', 'SxOvZF'):
        assembler.symbols["C%s" % cond] = "condition_tests::%s" % cond
        assembler.symbols["nC%s" % cond] = "condition_tests::Not%s" % cond
    assembler.symbols["CSTRZnEZF"] = "condition_tests::STRZnEZF"
    assembler.symbols["CSTRnZnEZF"] = "condition_tests::STRnZnEZF"

    assembler.symbols["CTrue"] = "condition_tests::True"
    assembler.symbols["CFalse"] = "condition_tests::False"

    for reg in (('sysenter_cs', 'SysenterCs'), ('sysenter_esp', 'SysenterEsp'),
                ('sysenter_eip', 'SysenterEip'), 'star', 'lstar', 'cstar',
                ('sf_mask', 'SfMask'), ('kernel_gs_base', 'KernelGsBase')):
        if isinstance(reg, tuple):
            assembler.symbols[reg[0]] = ctrlRegIdx(f"misc_reg::{reg[1]}")
        else:
            assembler.symbols[reg] = \
                ctrlRegIdx(f"misc_reg::{reg.capitalize()}")

    for flag in ('Scalar', 'MultHi', 'Signed'):
        assembler.symbols[flag] = 'Media%sOp' % flag

    # Code literal which forces a default 64 bit operand size in 64 bit mode.
    assembler.symbols["oszIn64Override"] = '''
    if (machInst.mode.submode == SixtyFourBitMode &&
            env.dataSize == 4)
        env.dataSize = 8;
    '''

    assembler.symbols["maxOsz"] = '''
    if (machInst.mode.submode == SixtyFourBitMode)
        env.dataSize = 8;
    else
        env.dataSize = 4;
    '''

    assembler.symbols["clampOsz"] = '''
    if (env.dataSize == 2)
        env.dataSize = 4;
    '''

    def trimImm(width):
        return "adjustedImm = adjustedImm & mask(%s);" % width

    assembler.symbols["trimImm"] = trimImm

    def labeler(labelStr):
        return "label_%s" % labelStr

    assembler.symbols["label"] = labeler

    def rom_labeler(labelStr):
        return "romMicroPC(rom_labels::extern_label_%s)" % labelStr

    assembler.symbols["rom_label"] = rom_labeler

    def rom_local_labeler(labelStr):
        return "romMicroPC(rom_labels::label_%s)" % labelStr

    assembler.symbols["rom_local_label"] = rom_local_labeler

    def stack_index(index):
        return fpRegIdx("float_reg::NumRegs + (((%s) + 8) %% 8)" % index)

    assembler.symbols["st"] = stack_index
    assembler.symbols["sti"] = stack_index("env.reg")
    assembler.symbols["stim"] = stack_index("env.regm")

    assembler.symbols["fsw"] = ctrlRegIdx("misc_reg::Fsw")
    assembler.symbols["fcw"] = ctrlRegIdx("misc_reg::Fcw")
    assembler.symbols["ftw"] = ctrlRegIdx("misc_reg::Ftw")

    macroopDict = assembler.assemble(microcode)

    decoder_output += mainRom.getDefinition()
    header_output += mainRom.getDeclaration()
}};
