// 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):
        @overrideInOperand
        def regId(self):
            return f'(({self.reg_spec}) == gem5::X86ISA::int_reg::T0) ? ' \
                   f'RegId() : {self.reg_class}[{self.reg_spec}]'
        def __init__(self, idx, id, data_size='dataSize', *args, **kwargs):
            super().__init__('uqw', idx, 'IsInteger', id, *args, **kwargs)
            self.attrs['data_size'] = data_size

    class PickedReg(IntReg):
        @overrideInOperand
        def makeRead(self):
            return f'{self.base_name} = pick(xc->getRegOperand(' \
                        f'this, {self.src_reg_idx}), {self.reg_spec}, ' \
                        f'{self.data_size});\n'

        def __init__(self, idx, id, data_size='dataSize'):
            super().__init__(idx, id, data_size)

    class SignedPickedReg(IntReg):
        @overrideInOperand
        def makeRead(self):
            return f'{self.base_name} = signedPick(xc->getRegOperand(' \
                        f'this, {self.src_reg_idx}), {self.reg_spec}, ' \
                        f'{self.data_size});\n'

        def __init__(self, idx, id, data_size='dataSize'):
            super().__init__(idx, id, data_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 CCRegPred(CCRegOp):
        @overrideInOperand
        def srcRegId(self):
            return f'({self.readPredicate}) ? {self.regId()} : RegId()'
        @overrideInOperand
        def destRegId(self):
            return f'({self.writePredicate}) ? {self.regId()} : RegId()'
        def __init__(self, idx, id, *, read_predicate, write_predicate):
            super().__init__('uqw', idx, None, id)
            self.attrs['readPredicate'] = read_predicate
            self.attrs['writePredicate'] = write_predicate

    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_idx::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::int_reg::Prodlow', 7),
        'ProdHi':        IntReg('X86ISA::int_reg::Prodhi', 8),
        'Quotient':      IntReg('X86ISA::int_reg::Quotient', 9),
        'Remainder':     IntReg('X86ISA::int_reg::Remainder', 10),
        'Divisor':       IntReg('X86ISA::int_reg::Divisor', 11),
        'DoubleBits':    IntReg('X86ISA::int_reg::Doublebits', 11),
        'Rax':           IntReg('X86ISA::int_reg::Rax', 12),
        'Rbx':           IntReg('X86ISA::int_reg::Rbx', 13),
        'Rcx':           IntReg('X86ISA::int_reg::Rcx', 14),
        'Rdx':           IntReg('X86ISA::int_reg::Rdx', 15),
        'Rsp':           IntReg('X86ISA::int_reg::Rsp', 16),
        'Rbp':           IntReg('X86ISA::int_reg::Rbp', 17),
        'Rsi':           IntReg('X86ISA::int_reg::Rsi', 18),
        'Rdi':           IntReg('X86ISA::int_reg::Rdi', 19),
        'R8':            IntReg('X86ISA::int_reg::R8', 20),
        'R9':            IntReg('X86ISA::int_reg::R9', 21),
        'FpSrcReg1':     FloatReg('src1', 22),
        'FpSrcReg2':     FloatReg('src2', 23),
        'FpSrcReg3':     FloatReg('src3', 24),
        'FpDestReg':     FloatReg('dest', 25),
        'FpData':        FloatReg('data', 26),
        '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::cc_reg::Zaps', 60),
        'cfofBits':      CCReg('X86ISA::cc_reg::Cfof', 61),
        'dfBit':         CCReg('X86ISA::cc_reg::Df', 62),
        'ecfBit':        CCReg('X86ISA::cc_reg::Ecf', 63),
        'ezfBit':        CCReg('X86ISA::cc_reg::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': CCRegPred('X86ISA::cc_reg::Zaps', 60,
                read_predicate='(ext & X86ISA::CcFlagMask) != '
                'X86ISA::CcFlagMask && (ext & X86ISA::CcFlagMask) != 0',
                write_predicate='(ext & X86ISA::CcFlagMask) != 0'),
        'PredcfofBits':  CCRegPred('X86ISA::cc_reg::Cfof', 61,
                read_predicate='(ext & X86ISA::CfofMask) '
                '!= X86ISA::CfofMask && (ext & X86ISA::CfofMask) != 0',
                write_predicate='(ext & X86ISA::CfofMask) != 0'),
        'PreddfBit':     CCRegPred('X86ISA::cc_reg::Df', 62,
                read_predicate='false',
                write_predicate='(ext & X86ISA::DFBit) != 0'),
        'PredecfBit':    CCRegPred('X86ISA::cc_reg::Ecf', 63,
                read_predicate='false',
                write_predicate='(ext & X86ISA::ECFBit) != 0'),
        'PredezfBit':    CCRegPred('X86ISA::cc_reg::Ezf', 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::misc_reg::Rflags', 65),

        # Registers related to the state of x87 floating point unit.
        'TOP':           ControlReg('X86ISA::misc_reg::X87Top', 66,
                ctype='ub'),
        'FSW':           ControlReg('X86ISA::misc_reg::Fsw', 67, ctype='uw'),
        'FTW':           ControlReg('X86ISA::misc_reg::Ftw', 68, ctype='uw'),
        'FCW':           ControlReg('X86ISA::misc_reg::Fcw', 69, ctype='uw'),

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

        # Operands to get and set registers indexed by the operands of the
        # original instruction.
        'ControlDest':   SquashCR0Reg('X86ISA::misc_reg::cr(dest)', 100),
        'ControlSrc1':   ControlReg('X86ISA::misc_reg::cr(src1)', 101),
        'DebugDest':     ControlReg('X86ISA::misc_reg::dr(dest)', 102),
        'DebugSrc1':     ControlReg('X86ISA::misc_reg::dr(src1)', 103),
        'SegBaseDest':   SquashCSReg('X86ISA::misc_reg::segBase(dest)', 104),
        'SegBaseSrc1':   ControlReg('X86ISA::misc_reg::segBase(src1)', 105),
        'SegLimitDest':  SquashCSReg('X86ISA::misc_reg::segLimit(dest)', 106),
        'SegLimitSrc1':  ControlReg('X86ISA::misc_reg::segLimit(src1)', 107),
        'SegSelDest':    ControlReg('X86ISA::misc_reg::segSel(dest)', 108),
        'SegSelSrc1':    ControlReg('X86ISA::misc_reg::segSel(src1)', 109),
        'SegAttrDest':   SquashCSReg('X86ISA::misc_reg::segAttr(dest)', 110),
        'SegAttrSrc1':   ControlReg('X86ISA::misc_reg::segAttr(src1)', 111),

        # Operands to access specific control registers directly.
        'EferOp':        SquashCReg('X86ISA::misc_reg::Efer', 200),
        'CR4Op':         ControlReg('X86ISA::misc_reg::Cr4', 201),
        'DR7Op':         ControlReg('X86ISA::misc_reg::Dr7', 202),
        'LDTRBase':      ControlReg('X86ISA::misc_reg::TslBase', 203),
        'LDTRLimit':     ControlReg('X86ISA::misc_reg::TslLimit', 204),
        'LDTRSel':       ControlReg('X86ISA::misc_reg::Tsl', 205),
        'GDTRBase':      ControlReg('X86ISA::misc_reg::TsgBase', 206),
        'GDTRLimit':     ControlReg('X86ISA::misc_reg::TsgLimit', 207),
        'CSBase':        SquashCReg('X86ISA::misc_reg::CsEffBase', 208),
        'CSAttr':        SquashCReg('X86ISA::misc_reg::CsAttr', 209),
        'MiscRegDest':   ControlReg('dest', 210),
        'MiscRegSrc1':   ControlReg('src1', 211),
        'TscOp':         ControlReg('X86ISA::misc_reg::Tsc', 212),
        'M5Reg':         SquashCReg('X86ISA::misc_reg::M5Reg', 213),
        'Mem':           MemOp('uqw', None, (None, 'IsLoad', 'IsStore'), 300)
}};
