// 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) 2008 The Regents of The University of Michigan
// 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.
//
// Authors: Gabe Black

//////////////////////////////////////////////////////////////////////////
//
// LdStOp Microop templates
//
//////////////////////////////////////////////////////////////////////////

// LEA template

def template MicroLeaExecute {{
    Fault %(class_name)s::execute(ExecContext *xc,
          Trace::InstRecord *traceData) const
    {
        Fault fault = NoFault;
        Addr EA;

        %(op_decl)s;
        %(op_rd)s;
        %(ea_code)s;
        DPRINTF(X86, "%s : %s: The address is %#x\n", instMnem, mnemonic, EA);

        %(code)s;
        if(fault == NoFault)
        {
            %(op_wb)s;
        }

        return fault;
    }
}};

def template MicroLeaDeclare {{
    class %(class_name)s : public %(base_class)s
    {
      public:
        %(class_name)s(ExtMachInst _machInst,
                const char * instMnem, uint64_t setFlags,
                uint8_t _scale, InstRegIndex _index, InstRegIndex _base,
                uint64_t _disp, InstRegIndex _segment,
                InstRegIndex _data,
                uint8_t _dataSize, uint8_t _addressSize,
                Request::FlagsType _memFlags);

        Fault execute(ExecContext *, Trace::InstRecord *) const;
    };
}};

// Load templates

def template MicroLoadExecute {{
    Fault %(class_name)s::execute(ExecContext *xc,
          Trace::InstRecord *traceData) const
    {
        Fault fault = NoFault;
        Addr EA;

        %(op_decl)s;
        %(op_rd)s;
        %(ea_code)s;
        DPRINTF(X86, "%s : %s: The address is %#x\n", instMnem, mnemonic, EA);

        fault = readMemAtomic(xc, traceData, EA, Mem, dataSize, memFlags);

        if (fault == NoFault) {
            %(code)s;
        } else if (memFlags & Request::PREFETCH) {
            // For prefetches, ignore any faults/exceptions.
            return NoFault;
        }
        if(fault == NoFault)
        {
            %(op_wb)s;
        }

        return fault;
    }
}};

def template MicroLoadInitiateAcc {{
    Fault %(class_name)s::initiateAcc(ExecContext * xc,
            Trace::InstRecord * traceData) const
    {
        Fault fault = NoFault;
        Addr EA;

        %(op_decl)s;
        %(op_rd)s;
        %(ea_code)s;
        DPRINTF(X86, "%s : %s: The address is %#x\n", instMnem, mnemonic, EA);

        fault = initiateMemRead(xc, traceData, EA,
                                %(memDataSize)s, memFlags);

        return fault;
    }
}};

def template MicroLoadCompleteAcc {{
    Fault %(class_name)s::completeAcc(PacketPtr pkt, ExecContext * xc,
                                      Trace::InstRecord * traceData) const
    {
        Fault fault = NoFault;

        %(op_decl)s;
        %(op_rd)s;

        getMem(pkt, Mem, dataSize, traceData);

        %(code)s;

        if(fault == NoFault)
        {
            %(op_wb)s;
        }

        return fault;
    }
}};

// Store templates

def template MicroStoreExecute {{
    Fault %(class_name)s::execute(ExecContext * xc,
            Trace::InstRecord *traceData) const
    {
        Fault fault = NoFault;

        Addr EA;
        %(op_decl)s;
        %(op_rd)s;
        %(ea_code)s;
        DPRINTF(X86, "%s : %s: The address is %#x\n", instMnem, mnemonic, EA);

        %(code)s;

        if (fault == NoFault) {
            fault = writeMemAtomic(xc, traceData, Mem, dataSize, EA,
                                   memFlags, NULL);
            if (fault == NoFault) {
                %(op_wb)s;
            }
        }

        return fault;
    }
}};

def template MicroStoreInitiateAcc {{
    Fault %(class_name)s::initiateAcc(ExecContext * xc,
            Trace::InstRecord * traceData) const
    {
        Fault fault = NoFault;

        Addr EA;
        %(op_decl)s;
        %(op_rd)s;
        %(ea_code)s;
        DPRINTF(X86, "%s : %s: The address is %#x\n", instMnem, mnemonic, EA);

        %(code)s;

        if (fault == NoFault) {
            fault = writeMemTiming(xc, traceData, Mem, dataSize, EA,
                                   memFlags, NULL);
        }
        return fault;
    }
}};

def template MicroStoreCompleteAcc {{
    Fault %(class_name)s::completeAcc(PacketPtr pkt,
            ExecContext * xc, Trace::InstRecord * traceData) const
    {
        %(op_decl)s;
        %(op_rd)s;
        %(complete_code)s;
        %(op_wb)s;
        return NoFault;
    }
}};

def template MicroLdStOpDeclare {{
    class %(class_name)s : public %(base_class)s
    {
      public:
        %(class_name)s(ExtMachInst _machInst,
                const char * instMnem, uint64_t setFlags,
                uint8_t _scale, InstRegIndex _index, InstRegIndex _base,
                uint64_t _disp, InstRegIndex _segment,
                InstRegIndex _data,
                uint8_t _dataSize, uint8_t _addressSize,
                Request::FlagsType _memFlags);

        Fault execute(ExecContext *, Trace::InstRecord *) const;
        Fault initiateAcc(ExecContext *, Trace::InstRecord *) const;
        Fault completeAcc(PacketPtr, ExecContext *, Trace::InstRecord *) const;
    };
}};

// LdStSplitOp is a load or store that uses a pair of regs as the
// source or destination.  Used for cmpxchg{8,16}b.
def template MicroLdStSplitOpDeclare {{
    class %(class_name)s : public %(base_class)s
    {
      public:
        %(class_name)s(ExtMachInst _machInst,
                const char * instMnem, uint64_t setFlags,
                uint8_t _scale, InstRegIndex _index, InstRegIndex _base,
                uint64_t _disp, InstRegIndex _segment,
                InstRegIndex _dataLow, InstRegIndex _dataHi,
                uint8_t _dataSize, uint8_t _addressSize,
                Request::FlagsType _memFlags);

        Fault execute(ExecContext *, Trace::InstRecord *) const;
        Fault initiateAcc(ExecContext *, Trace::InstRecord *) const;
        Fault completeAcc(PacketPtr, ExecContext *, Trace::InstRecord *) const;
    };
}};

def template MicroLdStOpConstructor {{
    %(class_name)s::%(class_name)s(
            ExtMachInst machInst, const char * instMnem, uint64_t setFlags,
            uint8_t _scale, InstRegIndex _index, InstRegIndex _base,
            uint64_t _disp, InstRegIndex _segment,
            InstRegIndex _data,
            uint8_t _dataSize, uint8_t _addressSize,
            Request::FlagsType _memFlags) :
        %(base_class)s(machInst, "%(mnemonic)s", instMnem, setFlags,
                _scale, _index, _base,
                _disp, _segment, _data,
                _dataSize, _addressSize, _memFlags, %(op_class)s)
    {
        %(constructor)s;
    }
}};

def template MicroLdStSplitOpConstructor {{
    %(class_name)s::%(class_name)s(
            ExtMachInst machInst, const char * instMnem, uint64_t setFlags,
            uint8_t _scale, InstRegIndex _index, InstRegIndex _base,
            uint64_t _disp, InstRegIndex _segment,
            InstRegIndex _dataLow, InstRegIndex _dataHi,
            uint8_t _dataSize, uint8_t _addressSize,
            Request::FlagsType _memFlags) :
        %(base_class)s(machInst, "%(mnemonic)s", instMnem, setFlags,
                _scale, _index, _base,
                _disp, _segment, _dataLow, _dataHi,
                _dataSize, _addressSize, _memFlags, %(op_class)s)
    {
        %(constructor)s;
    }
}};

let {{
    class LdStOp(X86Microop):
        def __init__(self, data, segment, addr, disp,
                dataSize, addressSize, baseFlags, atCPL0, prefetch, nonSpec,
                implicitStack, uncacheable):
            self.data = data
            [self.scale, self.index, self.base] = addr
            self.disp = disp
            self.segment = segment
            self.dataSize = dataSize
            self.addressSize = addressSize
            self.memFlags = baseFlags
            if atCPL0:
                self.memFlags += " | (CPL0FlagBit << FlagShift)"
            self.instFlags = ""
            if prefetch:
                self.memFlags += " | Request::PREFETCH"
                self.instFlags += " | (1ULL << StaticInst::IsDataPrefetch)"
            if nonSpec:
                self.instFlags += " | (1ULL << StaticInst::IsNonSpeculative)"
            if uncacheable:
                self.instFlags += " | (Request::UNCACHEABLE)"
            # For implicit stack operations, we should use *not* use the
            # alternative addressing mode for loads/stores if the prefix is set
            if not implicitStack:
                self.memFlags += " | (machInst.legacy.addr ? " + \
                                 "(AddrSizeFlagBit << FlagShift) : 0)"

        def getAllocator(self, microFlags):
            allocator = '''new %(class_name)s(machInst, macrocodeBlock,
                    %(flags)s, %(scale)s, %(index)s, %(base)s,
                    %(disp)s, %(segment)s, %(data)s,
                    %(dataSize)s, %(addressSize)s, %(memFlags)s)''' % {
                "class_name" : self.className,
                "flags" : self.microFlagsText(microFlags) + self.instFlags,
                "scale" : self.scale, "index" : self.index,
                "base" : self.base,
                "disp" : self.disp,
                "segment" : self.segment, "data" : self.data,
                "dataSize" : self.dataSize, "addressSize" : self.addressSize,
                "memFlags" : self.memFlags}
            return allocator

    class BigLdStOp(X86Microop):
        def __init__(self, data, segment, addr, disp,
                dataSize, addressSize, baseFlags, atCPL0, prefetch, nonSpec,
                implicitStack, uncacheable):
            self.data = data
            [self.scale, self.index, self.base] = addr
            self.disp = disp
            self.segment = segment
            self.dataSize = dataSize
            self.addressSize = addressSize
            self.memFlags = baseFlags
            if atCPL0:
                self.memFlags += " | (CPL0FlagBit << FlagShift)"
            self.instFlags = ""
            if prefetch:
                self.memFlags += " | Request::PREFETCH"
                self.instFlags += " | (1ULL << StaticInst::IsDataPrefetch)"
            if nonSpec:
                self.instFlags += " | (1ULL << StaticInst::IsNonSpeculative)"
            if uncacheable:
                self.instFlags += " | (Request::UNCACHEABLE)"
            # For implicit stack operations, we should use *not* use the
            # alternative addressing mode for loads/stores if the prefix is set
            if not implicitStack:
                self.memFlags += " | (machInst.legacy.addr ? " + \
                                 "(AddrSizeFlagBit << FlagShift) : 0)"

        def getAllocator(self, microFlags):
            allocString = '''
                (%(dataSize)s >= 4) ?
                    (StaticInstPtr)(new %(class_name)sBig(machInst,
                        macrocodeBlock, %(flags)s, %(scale)s, %(index)s,
                        %(base)s, %(disp)s, %(segment)s, %(data)s,
                        %(dataSize)s, %(addressSize)s, %(memFlags)s)) :
                    (StaticInstPtr)(new %(class_name)s(machInst,
                        macrocodeBlock, %(flags)s, %(scale)s, %(index)s,
                        %(base)s, %(disp)s, %(segment)s, %(data)s,
                        %(dataSize)s, %(addressSize)s, %(memFlags)s))
            '''
            allocator = allocString % {
                "class_name" : self.className,
                "flags" : self.microFlagsText(microFlags) + self.instFlags,
                "scale" : self.scale, "index" : self.index,
                "base" : self.base,
                "disp" : self.disp,
                "segment" : self.segment, "data" : self.data,
                "dataSize" : self.dataSize, "addressSize" : self.addressSize,
                "memFlags" : self.memFlags}
            return allocator

    class LdStSplitOp(LdStOp):
        def __init__(self, data, segment, addr, disp,
                dataSize, addressSize, baseFlags, atCPL0, prefetch, nonSpec,
                implicitStack, uncacheable):
            super(LdStSplitOp, self).__init__(0, segment, addr, disp,
                dataSize, addressSize, baseFlags, atCPL0, prefetch, nonSpec,
                implicitStack, uncacheable)
            (self.dataLow, self.dataHi) = data

        def getAllocator(self, microFlags):
            allocString = '''(StaticInstPtr)(new %(class_name)s(machInst,
                        macrocodeBlock, %(flags)s, %(scale)s, %(index)s,
                        %(base)s, %(disp)s, %(segment)s,
                        %(dataLow)s, %(dataHi)s,
                        %(dataSize)s, %(addressSize)s, %(memFlags)s))
            '''
            allocator = allocString % {
                "class_name" : self.className,
                "flags" : self.microFlagsText(microFlags) + self.instFlags,
                "scale" : self.scale, "index" : self.index,
                "base" : self.base,
                "disp" : self.disp,
                "segment" : self.segment,
                "dataLow" : self.dataLow, "dataHi" : self.dataHi,
                "dataSize" : self.dataSize, "addressSize" : self.addressSize,
                "memFlags" : self.memFlags}
            return allocator

}};

let {{

    # Make these empty strings so that concatenating onto
    # them will always work.
    header_output = ""
    decoder_output = ""
    exec_output = ""

    segmentEAExpr = \
        'bits(scale * Index + Base + disp, addressSize * 8 - 1, 0);'

    calculateEA = 'EA = SegBase + ' + segmentEAExpr

    def defineMicroLoadOp(mnemonic, code, bigCode='',
                          mem_flags="0", big=True, nonSpec=False,
                          implicitStack=False):
        global header_output
        global decoder_output
        global exec_output
        global microopClasses
        Name = mnemonic
        name = mnemonic.lower()

        # Build up the all register version of this micro op
        iops = [InstObjParams(name, Name, 'X86ISA::LdStOp',
                              { "code": code,
                                "ea_code": calculateEA,
                                "memDataSize": "dataSize" })]
        if big:
            iops += [InstObjParams(name, Name + "Big", 'X86ISA::LdStOp',
                                   { "code": bigCode,
                                     "ea_code": calculateEA,
                                     "memDataSize": "dataSize" })]
        for iop in iops:
            header_output += MicroLdStOpDeclare.subst(iop)
            decoder_output += MicroLdStOpConstructor.subst(iop)
            exec_output += MicroLoadExecute.subst(iop)
            exec_output += MicroLoadInitiateAcc.subst(iop)
            exec_output += MicroLoadCompleteAcc.subst(iop)

        if implicitStack:
            # For instructions that implicitly access the stack, the address
            # size is the same as the stack segment pointer size, not the
            # address size if specified by the instruction prefix
            addressSize = "env.stackSize"
        else:
            addressSize = "env.addressSize"

        base = LdStOp
        if big:
            base = BigLdStOp
        class LoadOp(base):
            def __init__(self, data, segment, addr, disp = 0,
                    dataSize="env.dataSize",
                    addressSize=addressSize,
                    atCPL0=False, prefetch=False, nonSpec=nonSpec,
                    implicitStack=implicitStack, uncacheable=False):
                super(LoadOp, self).__init__(data, segment, addr,
                        disp, dataSize, addressSize, mem_flags,
                        atCPL0, prefetch, nonSpec, implicitStack, uncacheable)
                self.className = Name
                self.mnemonic = name

        microopClasses[name] = LoadOp

    defineMicroLoadOp('Ld', 'Data = merge(Data, Mem, dataSize);',
                            'Data = Mem & mask(dataSize * 8);')
    defineMicroLoadOp('Ldis', 'Data = merge(Data, Mem, dataSize);',
                              'Data = Mem & mask(dataSize * 8);',
                               implicitStack=True)
    defineMicroLoadOp('Ldst', 'Data = merge(Data, Mem, dataSize);',
                              'Data = Mem & mask(dataSize * 8);',
                      '(StoreCheck << FlagShift)')
    defineMicroLoadOp('Ldstl', 'Data = merge(Data, Mem, dataSize);',
                               'Data = Mem & mask(dataSize * 8);',
                      '(StoreCheck << FlagShift) | Request::LOCKED_RMW',
                      nonSpec=True)

    defineMicroLoadOp('Ldfp', code='FpData_uqw = Mem', big = False)

    defineMicroLoadOp('Ldfp87', code='''
        switch (dataSize)
        {
          case 4:
            FpData_df = *(float *)&Mem;
            break;
          case 8:
            FpData_df = *(double *)&Mem;
            break;
          default:
            panic("Unhandled data size in LdFp87.\\n");
        }
    ''', big = False)

    # Load integer from memory into x87 top-of-stack register.
    # Used to implement fild instruction.
    defineMicroLoadOp('Ldifp87', code='''
        switch (dataSize)
        {
          case 2:
            FpData_df = (int64_t)sext<16>(Mem);
            break;
          case 4:
            FpData_df = (int64_t)sext<32>(Mem);
            break;
          case 8:
            FpData_df = (int64_t)Mem;
            break;
          default:
            panic("Unhandled data size in LdIFp87.\\n");
        }
    ''', big = False)

    def defineMicroLoadSplitOp(mnemonic, code, mem_flags="0", nonSpec=False):
        global header_output
        global decoder_output
        global exec_output
        global microopClasses
        Name = mnemonic
        name = mnemonic.lower()

        iop = InstObjParams(name, Name, 'X86ISA::LdStSplitOp',
                            { "code": code,
                              "ea_code": calculateEA,
                              "memDataSize": "2 * dataSize" })

        header_output += MicroLdStSplitOpDeclare.subst(iop)
        decoder_output += MicroLdStSplitOpConstructor.subst(iop)
        exec_output += MicroLoadExecute.subst(iop)
        exec_output += MicroLoadInitiateAcc.subst(iop)
        exec_output += MicroLoadCompleteAcc.subst(iop)

        class LoadOp(LdStSplitOp):
            def __init__(self, data, segment, addr, disp = 0,
                    dataSize="env.dataSize",
                    addressSize="env.addressSize",
                    atCPL0=False, prefetch=False, nonSpec=nonSpec,
                    implicitStack=False, uncacheable=False):
                super(LoadOp, self).__init__(data, segment, addr,
                        disp, dataSize, addressSize, mem_flags,
                        atCPL0, prefetch, nonSpec, implicitStack, uncacheable)
                self.className = Name
                self.mnemonic = name

        microopClasses[name] = LoadOp

    code = '''
        DataLow = Mem_u2qw[0];
        DataHi = Mem_u2qw[1];
    '''

    defineMicroLoadSplitOp('LdSplit', code,
                           '(StoreCheck << FlagShift)')

    defineMicroLoadSplitOp('LdSplitl', code,
                           '(StoreCheck << FlagShift) | Request::LOCKED_RMW',
                           nonSpec=True)

    def defineMicroStoreOp(mnemonic, code, completeCode="", mem_flags="0",
                           implicitStack=False):
        global header_output
        global decoder_output
        global exec_output
        global microopClasses
        Name = mnemonic
        name = mnemonic.lower()

        # Build up the all register version of this micro op
        iop = InstObjParams(name, Name, 'X86ISA::LdStOp',
                            { "code": code,
                              "complete_code": completeCode,
                              "ea_code": calculateEA,
                              "memDataSize": "dataSize" })
        header_output += MicroLdStOpDeclare.subst(iop)
        decoder_output += MicroLdStOpConstructor.subst(iop)
        exec_output += MicroStoreExecute.subst(iop)
        exec_output += MicroStoreInitiateAcc.subst(iop)
        exec_output += MicroStoreCompleteAcc.subst(iop)

        if implicitStack:
            # For instructions that implicitly access the stack, the address
            # size is the same as the stack segment pointer size, not the
            # address size if specified by the instruction prefix
            addressSize = "env.stackSize"
        else:
            addressSize = "env.addressSize"

        class StoreOp(LdStOp):
            def __init__(self, data, segment, addr, disp = 0,
                    dataSize="env.dataSize",
                    addressSize=addressSize,
                    atCPL0=False, nonSpec=False, implicitStack=implicitStack,
                    uncacheable=False):
                super(StoreOp, self).__init__(data, segment, addr, disp,
                        dataSize, addressSize, mem_flags, atCPL0, False,
                        nonSpec, implicitStack, uncacheable)
                self.className = Name
                self.mnemonic = name

        microopClasses[name] = StoreOp

    defineMicroStoreOp('St', 'Mem = pick(Data, 2, dataSize);')
    defineMicroStoreOp('Stis', 'Mem = pick(Data, 2, dataSize);',
                       implicitStack=True)
    defineMicroStoreOp('Stul', 'Mem = pick(Data, 2, dataSize);',
            mem_flags="Request::LOCKED_RMW")

    defineMicroStoreOp('Stfp', code='Mem = FpData_uqw;')

    defineMicroStoreOp('Stfp87', code='''
        switch (dataSize)
        {
          case 4: {
            float single(FpData_df);
            Mem = *(uint32_t *)&single;
          } break;
          case 8:
            Mem = *(uint64_t *)&FpData_df;
            break;
          default:
            panic("Unhandled data size in StFp87.\\n");
        }
    ''')

    defineMicroStoreOp('Cda', 'Mem = 0;', mem_flags="Request::NO_ACCESS")
    defineMicroStoreOp('Clflushopt', 'Mem = 0;',
                       mem_flags="Request::CLEAN | Request::INVALIDATE" +
                       " | Request::DST_POC")
    defineMicroStoreOp('Clwb', 'Mem = 0;',
                       mem_flags="Request::CLEAN | Request::DST_POC")

    def defineMicroStoreSplitOp(mnemonic, code,
                                completeCode="", mem_flags="0"):
        global header_output
        global decoder_output
        global exec_output
        global microopClasses
        Name = mnemonic
        name = mnemonic.lower()

        iop = InstObjParams(name, Name, 'X86ISA::LdStSplitOp',
                            { "code": code,
                              "complete_code": completeCode,
                              "ea_code": calculateEA,
                              "memDataSize": "2 * dataSize" })

        header_output += MicroLdStSplitOpDeclare.subst(iop)
        decoder_output += MicroLdStSplitOpConstructor.subst(iop)
        exec_output += MicroStoreExecute.subst(iop)
        exec_output += MicroStoreInitiateAcc.subst(iop)
        exec_output += MicroStoreCompleteAcc.subst(iop)

        class StoreOp(LdStSplitOp):
            def __init__(self, data, segment, addr, disp = 0,
                    dataSize="env.dataSize",
                    addressSize="env.addressSize",
                    atCPL0=False, nonSpec=False, implicitStack=False,
                    uncacheable=False):
                super(StoreOp, self).__init__(data, segment, addr, disp,
                        dataSize, addressSize, mem_flags, atCPL0, False,
                        nonSpec, implicitStack, uncacheable)
                self.className = Name
                self.mnemonic = name

        microopClasses[name] = StoreOp

    code = '''
        Mem_u2qw[0] = DataLow;
        Mem_u2qw[1] = DataHi;
    '''

    defineMicroStoreSplitOp('StSplit', code);

    defineMicroStoreSplitOp('StSplitul', code,
                            mem_flags='Request::LOCKED_RMW')

    iop = InstObjParams("lea", "Lea", 'X86ISA::LdStOp',
                        { "code": "Data = merge(Data, EA, dataSize);",
                          "ea_code": "EA = " + segmentEAExpr,
                          "memDataSize": "dataSize" })
    header_output += MicroLeaDeclare.subst(iop)
    decoder_output += MicroLdStOpConstructor.subst(iop)
    exec_output += MicroLeaExecute.subst(iop)

    class LeaOp(LdStOp):
        def __init__(self, data, segment, addr, disp = 0,
                dataSize="env.dataSize", addressSize="env.addressSize"):
            super(LeaOp, self).__init__(data, segment, addr, disp,
                    dataSize, addressSize, "0",
                    False, False, False, False, False)
            self.className = "Lea"
            self.mnemonic = "lea"

    microopClasses["lea"] = LeaOp


    iop = InstObjParams("tia", "Tia", 'X86ISA::LdStOp',
                        { "code": "xc->demapPage(EA, 0);",
                          "ea_code": calculateEA,
                          "memDataSize": "dataSize" })
    header_output += MicroLeaDeclare.subst(iop)
    decoder_output += MicroLdStOpConstructor.subst(iop)
    exec_output += MicroLeaExecute.subst(iop)

    class TiaOp(LdStOp):
        def __init__(self, segment, addr, disp = 0,
                dataSize="env.dataSize",
                addressSize="env.addressSize"):
            super(TiaOp, self).__init__("InstRegIndex(NUM_INTREGS)", segment,
                    addr, disp, dataSize, addressSize, "0", False, False,
                    False, False, False)
            self.className = "Tia"
            self.mnemonic = "tia"

    microopClasses["tia"] = TiaOp

    class CdaOp(LdStOp):
        def __init__(self, segment, addr, disp = 0,
                dataSize="env.dataSize",
                addressSize="env.addressSize", atCPL0=False):
            super(CdaOp, self).__init__("InstRegIndex(NUM_INTREGS)", segment,
                    addr, disp, dataSize, addressSize, "Request::NO_ACCESS",
                    atCPL0, False, False, False, False)
            self.className = "Cda"
            self.mnemonic = "cda"

    microopClasses["cda"] = CdaOp
}};
