// Copyright (c) 2007-2008 The Hewlett-Packard Development Company
// Copyright (c) 2015 Advanced Micro Devices, Inc.
// 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.
//
// Copyright (c) 2007 The Regents of The University of Michigan
// Copyright (c) 2012 Mark D. Hill and David A. Wood
// Copyright (c) 2012-2013 Advanced Micro Devices, Inc.
// All rights reserved.
//
// 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.

def operand_types {{
    'sb' : 'int8_t',
    'ub' : 'uint8_t',
    'sw' : 'int16_t',
    'uw' : 'uint16_t',
    'sdw' : 'int32_t',
    'udw' : 'uint32_t',
    'sqw' : 'int64_t',
    'uqw' : 'uint64_t',
    'u2qw' : 'std::array<uint64_t, 2>',
    'sf' : 'float',
    'df' : 'double',
}};

let {{
    class IntReg(IntRegOp):
        def __init__(self, idx, id, *args, **kwargs):
            super().__init__('uqw', idx, 'IsInteger', id, *args, **kwargs)

    class PickedReg(IntReg):
        def __init__(self, idx, id, size='dataSize'):
            super().__init__(idx, id,
                    read_code='pick(xc->getRegOperand(this, %(op_idx)s), '
                              '%(reg_idx)s, ' + size + ')')

    class SignedPickedReg(IntReg):
        def __init__(self, idx, id, size='dataSize'):
            super().__init__(idx, id,
                    read_code='signedPick(xc->getRegOperand(this, '
                            '%(op_idx)s), %(reg_idx)s, ' + size + ')')

    class FloatReg(FloatRegOp):
        def __init__(self, idx, id):
            super().__init__('df', idx, 'IsFloating', id)

    class CCReg(CCRegOp):
        def __init__(self, idx, id):
            super().__init__('uqw', idx, None, id)

    class ControlReg(ControlRegOp):
        def __init__(self, idx, id, ctype='uqw'):
            super().__init__(ctype, idx,
                (None, None, ['IsSerializeAfter',
                              'IsSerializing',
                              'IsNonSpeculative']),
                id)

    class SquashCheckReg(ControlRegOp):
        def __init__(self, idx, id, check, ctype='uqw'):
            super().__init__(ctype, idx,
                (None, None,
                 [f'(({check}) ? IsSquashAfter : IsSerializeAfter)',
                  'IsSerializing', 'IsNonSpeculative']),
                id)

    class SquashCReg(SquashCheckReg):
        def __init__(self, idx, id, ctype='uqw'):
            super().__init__(idx, id, 'true', ctype)

    class SquashCSReg(SquashCheckReg):
        def __init__(self, idx, id, ctype='uqw'):
            super().__init__(idx, id, 'dest == X86ISA::SEGMENT_REG_CS', ctype)

    class SquashCR0Reg(SquashCheckReg):
        def __init__(self, idx, id, ctype='uqw'):
            super().__init__(idx, id, 'dest == 0', ctype)
}};

def operands {{
        'SrcReg1':       IntReg('src1', 1),
        'PSrcReg1':      PickedReg('src1', 1),
        'PMSrcReg1':     PickedReg('src1', 1, 'srcSize'),
        'SPSrcReg1':     SignedPickedReg('src1', 1),
        'SrcReg2':       IntReg('src2', 2),
        'PSrcReg2':      PickedReg('src2', 2),
        'SPSrcReg2':     SignedPickedReg('src2', 2),
        'Index':         IntReg('index', 3),
        'Base':          IntReg('base', 4),
        'DestReg':       IntReg('dest', 5),
        'Data':          IntReg('data', 6),
        'PData':         PickedReg('data', 6),
        'DataLow':       IntReg('dataLow', 6),
        'DataHi':        IntReg('dataHi', 6),
        'ProdLow':       IntReg('X86ISA::INTREG_PRODLOW', 7),
        'ProdHi':        IntReg('X86ISA::INTREG_PRODHI', 8),
        'Quotient':      IntReg('X86ISA::INTREG_QUOTIENT', 9),
        'Remainder':     IntReg('X86ISA::INTREG_REMAINDER', 10),
        'Divisor':       IntReg('X86ISA::INTREG_DIVISOR', 11),
        'DoubleBits':    IntReg('X86ISA::INTREG_DOUBLEBITS', 11),
        'Rax':           IntReg('X86ISA::INTREG_RAX', 12),
        'Rbx':           IntReg('X86ISA::INTREG_RBX', 13),
        'Rcx':           IntReg('X86ISA::INTREG_RCX', 14),
        'Rdx':           IntReg('X86ISA::INTREG_RDX', 15),
        'Rsp':           IntReg('X86ISA::INTREG_RSP', 16),
        'Rbp':           IntReg('X86ISA::INTREG_RBP', 17),
        'Rsi':           IntReg('X86ISA::INTREG_RSI', 18),
        'Rdi':           IntReg('X86ISA::INTREG_RDI', 19),
        'R8':            IntReg('X86ISA::INTREG_R8', 20),
        'R9':            IntReg('X86ISA::INTREG_R9', 21),
        'FpSrcReg1':     FloatReg('src1', 22),
        'FpSrcReg2':     FloatReg('src2', 23),
        'FpDestReg':     FloatReg('dest', 24),
        'FpData':        FloatReg('data', 25),
        'RIP':           PCStateOp('uqw', 'pc',
                          (None, None, 'IsControl'), 50),
        'NRIP':          PCStateOp('uqw', 'npc',
                          (None, None, 'IsControl'), 50),
        'nuIP':          PCStateOp('uqw', 'nupc',
                          (None, None, 'IsControl'), 50),
        # These registers hold the condition code portion of the flag
        # register. The nccFlagBits version holds the rest.
        'ccFlagBits':    CCReg('X86ISA::CCREG_ZAPS', 60),
        'cfofBits':      CCReg('X86ISA::CCREG_CFOF', 61),
        'dfBit':         CCReg('X86ISA::CCREG_DF', 62),
        'ecfBit':        CCReg('X86ISA::CCREG_ECF', 63),
        'ezfBit':        CCReg('X86ISA::CCREG_EZF', 64),

        # These Pred registers are to be used where reading the portions of
        # condition code registers is possibly optional, depending on how the
        # check evaluates. There are two checks being specified, one tests if
        # a register needs to be read, the other tests whether the register
        # needs to be written to. It is unlikely that these would need to be
        # used in the actual operation of the instruction. It is expected
        # that these are used only in the flag code.

        # Rationale behind the checks: at times, we need to partially update
        # the condition code bits in a register. So we read the register even
        # in the case when the all the bits will be written, or none of the
        # bits will be written. The read predicate checks if any of the bits
        # would be retained, the write predicate checks if any of the bits
        # are being written.

        'PredccFlagBits': CCRegOp('uqw', 'X86ISA::CCREG_ZAPS', sort_pri=60,
                read_predicate='(ext & X86ISA::ccFlagMask) != '
                'X86ISA::ccFlagMask && (ext & X86ISA::ccFlagMask) != 0',
                write_predicate='(ext & X86ISA::ccFlagMask) != 0'),
        'PredcfofBits':  CCRegOp('uqw', 'X86ISA::CCREG_CFOF', sort_pri=61,
                read_predicate='(ext & X86ISA::cfofMask) '
                '!= X86ISA::cfofMask && (ext & X86ISA::cfofMask) != 0',
                write_predicate='(ext & X86ISA::cfofMask) != 0'),
        'PreddfBit':     CCRegOp('uqw', 'X86ISA::CCREG_DF', sort_pri=62,
                read_predicate='false',
                write_predicate='(ext & X86ISA::DFBit) != 0'),
        'PredecfBit':    CCRegOp('uqw', 'X86ISA::CCREG_ECF', sort_pri=63,
                read_predicate='false',
                write_predicate='(ext & X86ISA::ECFBit) != 0'),
        'PredezfBit':    CCRegOp('uqw', 'X86ISA::CCREG_EZF', sort_pri=64,
                read_predicate='false',
                write_predicate='(ext & X86ISA::EZFBit) != 0'),

        # These register should needs to be more protected so that later
        # instructions don't map their indexes with an old value.
        'nccFlagBits':   ControlReg('X86ISA::MISCREG_RFLAGS', 65),

        # Registers related to the state of x87 floating point unit.
        'TOP':           ControlReg('X86ISA::MISCREG_X87_TOP', 66, ctype='ub'),
        'FSW':           ControlReg('X86ISA::MISCREG_FSW', 67, ctype='uw'),
        'FTW':           ControlReg('X86ISA::MISCREG_FTW', 68, ctype='uw'),
        'FCW':           ControlReg('X86ISA::MISCREG_FCW', 69, ctype='uw'),

        # The segment base as used by memory instructions.
        'SegBase':       ControlReg('X86ISA::MISCREG_SEG_EFF_BASE(segment)',
                70),

        # Operands to get and set registers indexed by the operands of the
        # original instruction.
        'ControlDest':   SquashCR0Reg('X86ISA::MISCREG_CR(dest)', 100),
        'ControlSrc1':   ControlReg('X86ISA::MISCREG_CR(src1)', 101),
        'DebugDest':     ControlReg('X86ISA::MISCREG_DR(dest)', 102),
        'DebugSrc1':     ControlReg('X86ISA::MISCREG_DR(src1)', 103),
        'SegBaseDest':   SquashCSReg('X86ISA::MISCREG_SEG_BASE(dest)', 104),
        'SegBaseSrc1':   ControlReg('X86ISA::MISCREG_SEG_BASE(src1)', 105),
        'SegLimitDest':  SquashCSReg('X86ISA::MISCREG_SEG_LIMIT(dest)', 106),
        'SegLimitSrc1':  ControlReg('X86ISA::MISCREG_SEG_LIMIT(src1)', 107),
        'SegSelDest':    ControlReg('X86ISA::MISCREG_SEG_SEL(dest)', 108),
        'SegSelSrc1':    ControlReg('X86ISA::MISCREG_SEG_SEL(src1)', 109),
        'SegAttrDest':   SquashCSReg('X86ISA::MISCREG_SEG_ATTR(dest)', 110),
        'SegAttrSrc1':   ControlReg('X86ISA::MISCREG_SEG_ATTR(src1)', 111),

        # Operands to access specific control registers directly.
        'EferOp':        SquashCReg('X86ISA::MISCREG_EFER', 200),
        'CR4Op':         ControlReg('X86ISA::MISCREG_CR4', 201),
        'DR7Op':         ControlReg('X86ISA::MISCREG_DR7', 202),
        'LDTRBase':      ControlReg('X86ISA::MISCREG_TSL_BASE', 203),
        'LDTRLimit':     ControlReg('X86ISA::MISCREG_TSL_LIMIT', 204),
        'LDTRSel':       ControlReg('X86ISA::MISCREG_TSL', 205),
        'GDTRBase':      ControlReg('X86ISA::MISCREG_TSG_BASE', 206),
        'GDTRLimit':     ControlReg('X86ISA::MISCREG_TSG_LIMIT', 207),
        'CSBase':        SquashCReg('X86ISA::MISCREG_CS_EFF_BASE', 208),
        'CSAttr':        SquashCReg('X86ISA::MISCREG_CS_ATTR', 209),
        'MiscRegDest':   ControlReg('dest', 210),
        'MiscRegSrc1':   ControlReg('src1', 211),
        'TscOp':         ControlReg('X86ISA::MISCREG_TSC', 212),
        'M5Reg':         SquashCReg('X86ISA::MISCREG_M5_REG', 213),
        'Mem':           MemOp('uqw', None, (None, 'IsLoad', 'IsStore'), 300)
}};
