17130Sgblack@eecs.umich.edu/*
210346Smitch.hayenga@arm.com * Copyright (c) 2010-2014 ARM Limited
37130Sgblack@eecs.umich.edu * All rights reserved
47130Sgblack@eecs.umich.edu *
57130Sgblack@eecs.umich.edu * The license below extends only to copyright in the software and shall
67130Sgblack@eecs.umich.edu * not be construed as granting a license to any other intellectual
77130Sgblack@eecs.umich.edu * property including but not limited to intellectual property relating
87130Sgblack@eecs.umich.edu * to a hardware implementation of the functionality of the software
97130Sgblack@eecs.umich.edu * licensed hereunder.  You may use the software subject to the license
107130Sgblack@eecs.umich.edu * terms below provided that you ensure that this notice is replicated
117130Sgblack@eecs.umich.edu * unmodified and in its entirety in all distributions of the software,
127130Sgblack@eecs.umich.edu * modified or unmodified, in source code or in binary form.
137130Sgblack@eecs.umich.edu *
147130Sgblack@eecs.umich.edu * Copyright (c) 2007-2008 The Florida State University
156253Sgblack@eecs.umich.edu * All rights reserved.
166253Sgblack@eecs.umich.edu *
176253Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
186253Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
196253Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
206253Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
216253Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
226253Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
236253Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
246253Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
256253Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
266253Sgblack@eecs.umich.edu * this software without specific prior written permission.
276253Sgblack@eecs.umich.edu *
286253Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
296253Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
306253Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
316253Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
326253Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
336253Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
346253Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
356253Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
366253Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
376253Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
386253Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
396253Sgblack@eecs.umich.edu *
406253Sgblack@eecs.umich.edu * Authors: Stephen Hines
416253Sgblack@eecs.umich.edu */
426253Sgblack@eecs.umich.edu#ifndef __ARCH_ARM_MACROMEM_HH__
436253Sgblack@eecs.umich.edu#define __ARCH_ARM_MACROMEM_HH__
446253Sgblack@eecs.umich.edu
456253Sgblack@eecs.umich.edu#include "arch/arm/insts/pred_inst.hh"
467294Sgblack@eecs.umich.edu#include "arch/arm/tlb.hh"
476253Sgblack@eecs.umich.edu
486253Sgblack@eecs.umich.edunamespace ArmISA
496253Sgblack@eecs.umich.edu{
506253Sgblack@eecs.umich.edu
516253Sgblack@eecs.umich.edustatic inline unsigned int
526253Sgblack@eecs.umich.edunumber_of_ones(int32_t val)
536253Sgblack@eecs.umich.edu{
546253Sgblack@eecs.umich.edu    uint32_t ones = 0;
556253Sgblack@eecs.umich.edu    for (int i = 0; i < 32; i++ )
566253Sgblack@eecs.umich.edu    {
576253Sgblack@eecs.umich.edu        if ( val & (1<<i) )
586253Sgblack@eecs.umich.edu            ones++;
596253Sgblack@eecs.umich.edu    }
606253Sgblack@eecs.umich.edu    return ones;
616253Sgblack@eecs.umich.edu}
626253Sgblack@eecs.umich.edu
637431Sgblack@eecs.umich.edu/**
647431Sgblack@eecs.umich.edu * Base class for Memory microops
657431Sgblack@eecs.umich.edu */
667343Sgblack@eecs.umich.educlass MicroOp : public PredOp
677343Sgblack@eecs.umich.edu{
687343Sgblack@eecs.umich.edu  protected:
697343Sgblack@eecs.umich.edu    MicroOp(const char *mnem, ExtMachInst machInst, OpClass __opClass)
707343Sgblack@eecs.umich.edu            : PredOp(mnem, machInst, __opClass)
717343Sgblack@eecs.umich.edu    {
727343Sgblack@eecs.umich.edu    }
737343Sgblack@eecs.umich.edu
747343Sgblack@eecs.umich.edu  public:
757343Sgblack@eecs.umich.edu    void
7612616Sgabeblack@google.com    advancePC(PCState &pcState) const override
777720Sgblack@eecs.umich.edu    {
787720Sgblack@eecs.umich.edu        if (flags[IsLastMicroop]) {
797720Sgblack@eecs.umich.edu            pcState.uEnd();
807720Sgblack@eecs.umich.edu        } else if (flags[IsMicroop]) {
817720Sgblack@eecs.umich.edu            pcState.uAdvance();
827720Sgblack@eecs.umich.edu        } else {
837720Sgblack@eecs.umich.edu            pcState.advance();
847720Sgblack@eecs.umich.edu        }
857720Sgblack@eecs.umich.edu    }
867343Sgblack@eecs.umich.edu};
877343Sgblack@eecs.umich.edu
8810037SARM gem5 Developersclass MicroOpX : public ArmStaticInst
8910037SARM gem5 Developers{
9010037SARM gem5 Developers  protected:
9110037SARM gem5 Developers    MicroOpX(const char *mnem, ExtMachInst machInst, OpClass __opClass)
9210037SARM gem5 Developers            : ArmStaticInst(mnem, machInst, __opClass)
9310037SARM gem5 Developers    {}
9410037SARM gem5 Developers
9510037SARM gem5 Developers  public:
9610037SARM gem5 Developers    void
9712616Sgabeblack@google.com    advancePC(PCState &pcState) const override
9810037SARM gem5 Developers    {
9910037SARM gem5 Developers        if (flags[IsLastMicroop]) {
10010037SARM gem5 Developers            pcState.uEnd();
10110037SARM gem5 Developers        } else if (flags[IsMicroop]) {
10210037SARM gem5 Developers            pcState.uAdvance();
10310037SARM gem5 Developers        } else {
10410037SARM gem5 Developers            pcState.advance();
10510037SARM gem5 Developers        }
10610037SARM gem5 Developers    }
10710037SARM gem5 Developers};
10810037SARM gem5 Developers
1096253Sgblack@eecs.umich.edu/**
1107639Sgblack@eecs.umich.edu * Microops for Neon loads/stores
1117639Sgblack@eecs.umich.edu */
1127639Sgblack@eecs.umich.educlass MicroNeonMemOp : public MicroOp
1137639Sgblack@eecs.umich.edu{
1147639Sgblack@eecs.umich.edu  protected:
1157639Sgblack@eecs.umich.edu    RegIndex dest, ura;
1167639Sgblack@eecs.umich.edu    uint32_t imm;
1177639Sgblack@eecs.umich.edu    unsigned memAccessFlags;
1187639Sgblack@eecs.umich.edu
1197639Sgblack@eecs.umich.edu    MicroNeonMemOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
1207639Sgblack@eecs.umich.edu                   RegIndex _dest, RegIndex _ura, uint32_t _imm)
1217639Sgblack@eecs.umich.edu            : MicroOp(mnem, machInst, __opClass),
1227639Sgblack@eecs.umich.edu              dest(_dest), ura(_ura), imm(_imm),
1237639Sgblack@eecs.umich.edu              memAccessFlags(TLB::MustBeOne)
1247639Sgblack@eecs.umich.edu    {
1257639Sgblack@eecs.umich.edu    }
1267639Sgblack@eecs.umich.edu};
1277639Sgblack@eecs.umich.edu
1287639Sgblack@eecs.umich.edu/**
1297639Sgblack@eecs.umich.edu * Microops for Neon load/store (de)interleaving
1307639Sgblack@eecs.umich.edu */
1317639Sgblack@eecs.umich.educlass MicroNeonMixOp : public MicroOp
1327639Sgblack@eecs.umich.edu{
1337639Sgblack@eecs.umich.edu  protected:
1347639Sgblack@eecs.umich.edu    RegIndex dest, op1;
1357639Sgblack@eecs.umich.edu    uint32_t step;
1367639Sgblack@eecs.umich.edu
1377639Sgblack@eecs.umich.edu    MicroNeonMixOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
1387639Sgblack@eecs.umich.edu                   RegIndex _dest, RegIndex _op1, uint32_t _step)
1397639Sgblack@eecs.umich.edu            : MicroOp(mnem, machInst, __opClass),
1407639Sgblack@eecs.umich.edu              dest(_dest), op1(_op1), step(_step)
1417639Sgblack@eecs.umich.edu    {
1427639Sgblack@eecs.umich.edu    }
1437639Sgblack@eecs.umich.edu};
1447639Sgblack@eecs.umich.edu
1457639Sgblack@eecs.umich.educlass MicroNeonMixLaneOp : public MicroNeonMixOp
1467639Sgblack@eecs.umich.edu{
1477639Sgblack@eecs.umich.edu  protected:
1487639Sgblack@eecs.umich.edu    unsigned lane;
1497639Sgblack@eecs.umich.edu
1507639Sgblack@eecs.umich.edu    MicroNeonMixLaneOp(const char *mnem, ExtMachInst machInst,
1517639Sgblack@eecs.umich.edu                       OpClass __opClass, RegIndex _dest, RegIndex _op1,
1527639Sgblack@eecs.umich.edu                       uint32_t _step, unsigned _lane)
1537639Sgblack@eecs.umich.edu            : MicroNeonMixOp(mnem, machInst, __opClass, _dest, _op1, _step),
1547639Sgblack@eecs.umich.edu              lane(_lane)
1557639Sgblack@eecs.umich.edu    {
1567639Sgblack@eecs.umich.edu    }
1577639Sgblack@eecs.umich.edu};
1588140SMatt.Horsnell@arm.com
1598140SMatt.Horsnell@arm.com/**
16010037SARM gem5 Developers * Microops for AArch64 NEON load/store (de)interleaving
16110037SARM gem5 Developers */
16210037SARM gem5 Developersclass MicroNeonMixOp64 : public MicroOp
16310037SARM gem5 Developers{
16410037SARM gem5 Developers  protected:
16510037SARM gem5 Developers    RegIndex dest, op1;
16610037SARM gem5 Developers    uint8_t eSize, dataSize, numStructElems, numRegs, step;
16710037SARM gem5 Developers
16810037SARM gem5 Developers    MicroNeonMixOp64(const char *mnem, ExtMachInst machInst, OpClass __opClass,
16910037SARM gem5 Developers                     RegIndex _dest, RegIndex _op1, uint8_t _eSize,
17010037SARM gem5 Developers                     uint8_t _dataSize, uint8_t _numStructElems,
17110037SARM gem5 Developers                     uint8_t _numRegs, uint8_t _step)
17210037SARM gem5 Developers        : MicroOp(mnem, machInst, __opClass), dest(_dest), op1(_op1),
17310037SARM gem5 Developers          eSize(_eSize), dataSize(_dataSize), numStructElems(_numStructElems),
17410037SARM gem5 Developers          numRegs(_numRegs), step(_step)
17510037SARM gem5 Developers    {
17610037SARM gem5 Developers    }
17710037SARM gem5 Developers};
17810037SARM gem5 Developers
17910037SARM gem5 Developersclass MicroNeonMixLaneOp64 : public MicroOp
18010037SARM gem5 Developers{
18110037SARM gem5 Developers  protected:
18210037SARM gem5 Developers    RegIndex dest, op1;
18310037SARM gem5 Developers    uint8_t eSize, dataSize, numStructElems, lane, step;
18410037SARM gem5 Developers    bool replicate;
18510037SARM gem5 Developers
18610037SARM gem5 Developers    MicroNeonMixLaneOp64(const char *mnem, ExtMachInst machInst,
18710037SARM gem5 Developers                         OpClass __opClass, RegIndex _dest, RegIndex _op1,
18810037SARM gem5 Developers                         uint8_t _eSize, uint8_t _dataSize,
18910037SARM gem5 Developers                         uint8_t _numStructElems, uint8_t _lane, uint8_t _step,
19010037SARM gem5 Developers                         bool _replicate = false)
19110037SARM gem5 Developers        : MicroOp(mnem, machInst, __opClass), dest(_dest), op1(_op1),
19210037SARM gem5 Developers          eSize(_eSize), dataSize(_dataSize), numStructElems(_numStructElems),
19310037SARM gem5 Developers          lane(_lane), step(_step), replicate(_replicate)
19410037SARM gem5 Developers    {
19510037SARM gem5 Developers    }
19610037SARM gem5 Developers};
19710037SARM gem5 Developers
19810037SARM gem5 Developers/**
19910037SARM gem5 Developers * Base classes for microcoded AArch64 NEON memory instructions.
20010037SARM gem5 Developers */
20110037SARM gem5 Developersclass VldMultOp64 : public PredMacroOp
20210037SARM gem5 Developers{
20310037SARM gem5 Developers  protected:
20410037SARM gem5 Developers    uint8_t eSize, dataSize, numStructElems, numRegs;
20510037SARM gem5 Developers    bool wb;
20610037SARM gem5 Developers
20710037SARM gem5 Developers    VldMultOp64(const char *mnem, ExtMachInst machInst, OpClass __opClass,
20810037SARM gem5 Developers                RegIndex rn, RegIndex vd, RegIndex rm, uint8_t eSize,
20910037SARM gem5 Developers                uint8_t dataSize, uint8_t numStructElems, uint8_t numRegs,
21010037SARM gem5 Developers                bool wb);
21110037SARM gem5 Developers};
21210037SARM gem5 Developers
21310037SARM gem5 Developersclass VstMultOp64 : public PredMacroOp
21410037SARM gem5 Developers{
21510037SARM gem5 Developers  protected:
21610037SARM gem5 Developers    uint8_t eSize, dataSize, numStructElems, numRegs;
21710037SARM gem5 Developers    bool wb;
21810037SARM gem5 Developers
21910037SARM gem5 Developers    VstMultOp64(const char *mnem, ExtMachInst machInst, OpClass __opClass,
22010037SARM gem5 Developers                RegIndex rn, RegIndex vd, RegIndex rm, uint8_t eSize,
22110037SARM gem5 Developers                uint8_t dataSize, uint8_t numStructElems, uint8_t numRegs,
22210037SARM gem5 Developers                bool wb);
22310037SARM gem5 Developers};
22410037SARM gem5 Developers
22510037SARM gem5 Developersclass VldSingleOp64 : public PredMacroOp
22610037SARM gem5 Developers{
22710037SARM gem5 Developers  protected:
22810037SARM gem5 Developers    uint8_t eSize, dataSize, numStructElems, index;
22910037SARM gem5 Developers    bool wb, replicate;
23010037SARM gem5 Developers
23110037SARM gem5 Developers    VldSingleOp64(const char *mnem, ExtMachInst machInst, OpClass __opClass,
23210037SARM gem5 Developers                  RegIndex rn, RegIndex vd, RegIndex rm, uint8_t eSize,
23310037SARM gem5 Developers                  uint8_t dataSize, uint8_t numStructElems, uint8_t index,
23410037SARM gem5 Developers                  bool wb, bool replicate = false);
23510037SARM gem5 Developers};
23610037SARM gem5 Developers
23710037SARM gem5 Developersclass VstSingleOp64 : public PredMacroOp
23810037SARM gem5 Developers{
23910037SARM gem5 Developers  protected:
24010037SARM gem5 Developers    uint8_t eSize, dataSize, numStructElems, index;
24110037SARM gem5 Developers    bool wb, replicate;
24210037SARM gem5 Developers
24310037SARM gem5 Developers    VstSingleOp64(const char *mnem, ExtMachInst machInst, OpClass __opClass,
24410037SARM gem5 Developers                  RegIndex rn, RegIndex vd, RegIndex rm, uint8_t eSize,
24510037SARM gem5 Developers                  uint8_t dataSize, uint8_t numStructElems, uint8_t index,
24610037SARM gem5 Developers                  bool wb, bool replicate = false);
24710037SARM gem5 Developers};
24810037SARM gem5 Developers
24910037SARM gem5 Developers/**
2508140SMatt.Horsnell@arm.com * Microops of the form
2518140SMatt.Horsnell@arm.com * PC   = IntRegA
2528140SMatt.Horsnell@arm.com * CPSR = IntRegB
2538140SMatt.Horsnell@arm.com */
2548140SMatt.Horsnell@arm.comclass MicroSetPCCPSR : public MicroOp
2558140SMatt.Horsnell@arm.com{
2568140SMatt.Horsnell@arm.com    protected:
2578140SMatt.Horsnell@arm.com    IntRegIndex ura, urb, urc;
2588140SMatt.Horsnell@arm.com
2598140SMatt.Horsnell@arm.com    MicroSetPCCPSR(const char *mnem, ExtMachInst machInst, OpClass __opClass,
2608140SMatt.Horsnell@arm.com                   IntRegIndex _ura, IntRegIndex _urb, IntRegIndex _urc)
2618140SMatt.Horsnell@arm.com        : MicroOp(mnem, machInst, __opClass),
2628140SMatt.Horsnell@arm.com          ura(_ura), urb(_urb), urc(_urc)
2638140SMatt.Horsnell@arm.com    {
2648140SMatt.Horsnell@arm.com    }
2658140SMatt.Horsnell@arm.com
26612616Sgabeblack@google.com    std::string generateDisassembly(
26712616Sgabeblack@google.com            Addr pc, const SymbolTable *symtab) const override;
2688140SMatt.Horsnell@arm.com};
2698140SMatt.Horsnell@arm.com
2707646Sgene.wu@arm.com/**
2717646Sgene.wu@arm.com * Microops of the form IntRegA = IntRegB
2727646Sgene.wu@arm.com */
2737646Sgene.wu@arm.comclass MicroIntMov : public MicroOp
2747646Sgene.wu@arm.com{
2757646Sgene.wu@arm.com  protected:
2767646Sgene.wu@arm.com    RegIndex ura, urb;
2777646Sgene.wu@arm.com
2787646Sgene.wu@arm.com    MicroIntMov(const char *mnem, ExtMachInst machInst, OpClass __opClass,
2797646Sgene.wu@arm.com               RegIndex _ura, RegIndex _urb)
2807646Sgene.wu@arm.com            : MicroOp(mnem, machInst, __opClass),
2817646Sgene.wu@arm.com              ura(_ura), urb(_urb)
2827646Sgene.wu@arm.com    {
2837646Sgene.wu@arm.com    }
2847646Sgene.wu@arm.com
28512616Sgabeblack@google.com    std::string generateDisassembly(
28612616Sgabeblack@google.com            Addr pc, const SymbolTable *symtab) const override;
2877646Sgene.wu@arm.com};
2887639Sgblack@eecs.umich.edu
2897639Sgblack@eecs.umich.edu/**
2906308Sgblack@eecs.umich.edu * Microops of the form IntRegA = IntRegB op Imm
2916308Sgblack@eecs.umich.edu */
2927639Sgblack@eecs.umich.educlass MicroIntImmOp : public MicroOp
2936308Sgblack@eecs.umich.edu{
2946308Sgblack@eecs.umich.edu  protected:
2956308Sgblack@eecs.umich.edu    RegIndex ura, urb;
29610037SARM gem5 Developers    int32_t imm;
2976308Sgblack@eecs.umich.edu
2987639Sgblack@eecs.umich.edu    MicroIntImmOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
29910037SARM gem5 Developers                  RegIndex _ura, RegIndex _urb, int32_t _imm)
3007343Sgblack@eecs.umich.edu            : MicroOp(mnem, machInst, __opClass),
3016308Sgblack@eecs.umich.edu              ura(_ura), urb(_urb), imm(_imm)
3026308Sgblack@eecs.umich.edu    {
3036308Sgblack@eecs.umich.edu    }
3047615Sminkyu.jeong@arm.com
30512616Sgabeblack@google.com    std::string generateDisassembly(
30612616Sgabeblack@google.com            Addr pc, const SymbolTable *symtab) const override;
3076308Sgblack@eecs.umich.edu};
3086308Sgblack@eecs.umich.edu
30910037SARM gem5 Developersclass MicroIntImmXOp : public MicroOpX
31010037SARM gem5 Developers{
31110037SARM gem5 Developers  protected:
31210037SARM gem5 Developers    RegIndex ura, urb;
31310037SARM gem5 Developers    int64_t imm;
31410037SARM gem5 Developers
31510037SARM gem5 Developers    MicroIntImmXOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
31610037SARM gem5 Developers                   RegIndex _ura, RegIndex _urb, int64_t _imm)
31710037SARM gem5 Developers            : MicroOpX(mnem, machInst, __opClass),
31810037SARM gem5 Developers              ura(_ura), urb(_urb), imm(_imm)
31910037SARM gem5 Developers    {
32010037SARM gem5 Developers    }
32110037SARM gem5 Developers
32212616Sgabeblack@google.com    std::string generateDisassembly(
32312616Sgabeblack@google.com            Addr pc, const SymbolTable *symtab) const override;
32410037SARM gem5 Developers};
32510037SARM gem5 Developers
3266308Sgblack@eecs.umich.edu/**
3277639Sgblack@eecs.umich.edu * Microops of the form IntRegA = IntRegB op IntRegC
3287639Sgblack@eecs.umich.edu */
3297639Sgblack@eecs.umich.educlass MicroIntOp : public MicroOp
3307639Sgblack@eecs.umich.edu{
3317639Sgblack@eecs.umich.edu  protected:
3327639Sgblack@eecs.umich.edu    RegIndex ura, urb, urc;
3337639Sgblack@eecs.umich.edu
3347639Sgblack@eecs.umich.edu    MicroIntOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
3357639Sgblack@eecs.umich.edu               RegIndex _ura, RegIndex _urb, RegIndex _urc)
3367639Sgblack@eecs.umich.edu            : MicroOp(mnem, machInst, __opClass),
3377639Sgblack@eecs.umich.edu              ura(_ura), urb(_urb), urc(_urc)
3387639Sgblack@eecs.umich.edu    {
3397639Sgblack@eecs.umich.edu    }
3407639Sgblack@eecs.umich.edu
34112616Sgabeblack@google.com    std::string generateDisassembly(
34212616Sgabeblack@google.com            Addr pc, const SymbolTable *symtab) const override;
3437639Sgblack@eecs.umich.edu};
3447639Sgblack@eecs.umich.edu
34510037SARM gem5 Developersclass MicroIntRegXOp : public MicroOp
34610037SARM gem5 Developers{
34710037SARM gem5 Developers  protected:
34810037SARM gem5 Developers    RegIndex ura, urb, urc;
34910037SARM gem5 Developers    ArmExtendType type;
35010037SARM gem5 Developers    uint32_t shiftAmt;
35110037SARM gem5 Developers
35210037SARM gem5 Developers    MicroIntRegXOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
35310037SARM gem5 Developers                   RegIndex _ura, RegIndex _urb, RegIndex _urc,
35410037SARM gem5 Developers                   ArmExtendType _type, uint32_t _shiftAmt)
35510037SARM gem5 Developers            : MicroOp(mnem, machInst, __opClass),
35610037SARM gem5 Developers              ura(_ura), urb(_urb), urc(_urc),
35710037SARM gem5 Developers              type(_type), shiftAmt(_shiftAmt)
35810037SARM gem5 Developers    {
35910037SARM gem5 Developers    }
36010037SARM gem5 Developers
36112616Sgabeblack@google.com    std::string generateDisassembly(
36212616Sgabeblack@google.com            Addr pc, const SymbolTable *symtab) const override;
36310037SARM gem5 Developers};
36410037SARM gem5 Developers
3657639Sgblack@eecs.umich.edu/**
3667646Sgene.wu@arm.com * Microops of the form IntRegA = IntRegB op shifted IntRegC
3677646Sgene.wu@arm.com */
3687646Sgene.wu@arm.comclass MicroIntRegOp : public MicroOp
3697646Sgene.wu@arm.com{
3707646Sgene.wu@arm.com  protected:
3717646Sgene.wu@arm.com    RegIndex ura, urb, urc;
3727646Sgene.wu@arm.com    int32_t shiftAmt;
3737646Sgene.wu@arm.com    ArmShiftType shiftType;
3747646Sgene.wu@arm.com
3757646Sgene.wu@arm.com    MicroIntRegOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
3767646Sgene.wu@arm.com               RegIndex _ura, RegIndex _urb, RegIndex _urc,
3777646Sgene.wu@arm.com               int32_t _shiftAmt, ArmShiftType _shiftType)
3787646Sgene.wu@arm.com            : MicroOp(mnem, machInst, __opClass),
3797646Sgene.wu@arm.com              ura(_ura), urb(_urb), urc(_urc),
3807646Sgene.wu@arm.com              shiftAmt(_shiftAmt), shiftType(_shiftType)
3817646Sgene.wu@arm.com    {
3827646Sgene.wu@arm.com    }
3837646Sgene.wu@arm.com};
3847646Sgene.wu@arm.com
3857646Sgene.wu@arm.com/**
3866309Sgblack@eecs.umich.edu * Memory microops which use IntReg + Imm addressing
3876309Sgblack@eecs.umich.edu */
3887639Sgblack@eecs.umich.educlass MicroMemOp : public MicroIntImmOp
3896309Sgblack@eecs.umich.edu{
3906309Sgblack@eecs.umich.edu  protected:
3917134Sgblack@eecs.umich.edu    bool up;
3926309Sgblack@eecs.umich.edu    unsigned memAccessFlags;
3936309Sgblack@eecs.umich.edu
3946309Sgblack@eecs.umich.edu    MicroMemOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
3957134Sgblack@eecs.umich.edu               RegIndex _ura, RegIndex _urb, bool _up, uint8_t _imm)
3967639Sgblack@eecs.umich.edu            : MicroIntImmOp(mnem, machInst, __opClass, _ura, _urb, _imm),
3977294Sgblack@eecs.umich.edu              up(_up), memAccessFlags(TLB::MustBeOne | TLB::AlignWord)
3986309Sgblack@eecs.umich.edu    {
3996309Sgblack@eecs.umich.edu    }
4007615Sminkyu.jeong@arm.com
40112616Sgabeblack@google.com    std::string generateDisassembly(
40212616Sgabeblack@google.com            Addr pc, const SymbolTable *symtab) const override;
4036309Sgblack@eecs.umich.edu};
4046309Sgblack@eecs.umich.edu
40510346Smitch.hayenga@arm.comclass MicroMemPairOp : public MicroOp
40610346Smitch.hayenga@arm.com{
40710346Smitch.hayenga@arm.com  protected:
40810346Smitch.hayenga@arm.com    RegIndex dest, dest2, urb;
40910346Smitch.hayenga@arm.com    bool up;
41010346Smitch.hayenga@arm.com    int32_t imm;
41110346Smitch.hayenga@arm.com    unsigned memAccessFlags;
41210346Smitch.hayenga@arm.com
41310346Smitch.hayenga@arm.com    MicroMemPairOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
41410346Smitch.hayenga@arm.com            RegIndex _dreg1, RegIndex _dreg2, RegIndex _base,
41510346Smitch.hayenga@arm.com            bool _up, uint8_t _imm)
41610346Smitch.hayenga@arm.com        : MicroOp(mnem, machInst, __opClass),
41710346Smitch.hayenga@arm.com        dest(_dreg1), dest2(_dreg2), urb(_base), up(_up), imm(_imm),
41810346Smitch.hayenga@arm.com        memAccessFlags(TLB::MustBeOne | TLB::AlignWord)
41910346Smitch.hayenga@arm.com    {
42010346Smitch.hayenga@arm.com    }
42110346Smitch.hayenga@arm.com
42212616Sgabeblack@google.com    std::string generateDisassembly(
42312616Sgabeblack@google.com            Addr pc, const SymbolTable *symtab) const override;
42410346Smitch.hayenga@arm.com};
42510346Smitch.hayenga@arm.com
4267431Sgblack@eecs.umich.edu/**
4277431Sgblack@eecs.umich.edu * Base class for microcoded integer memory instructions.
4287431Sgblack@eecs.umich.edu */
4297170Sgblack@eecs.umich.educlass MacroMemOp : public PredMacroOp
4307170Sgblack@eecs.umich.edu{
4317170Sgblack@eecs.umich.edu  protected:
4327170Sgblack@eecs.umich.edu    MacroMemOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
4337170Sgblack@eecs.umich.edu               IntRegIndex rn, bool index, bool up, bool user,
4347170Sgblack@eecs.umich.edu               bool writeback, bool load, uint32_t reglist);
4357170Sgblack@eecs.umich.edu};
4367170Sgblack@eecs.umich.edu
4377431Sgblack@eecs.umich.edu/**
43810037SARM gem5 Developers * Base class for pair load/store instructions.
43910037SARM gem5 Developers */
44010037SARM gem5 Developersclass PairMemOp : public PredMacroOp
44110037SARM gem5 Developers{
44210037SARM gem5 Developers  public:
44310037SARM gem5 Developers    enum AddrMode {
44410037SARM gem5 Developers        AddrMd_Offset,
44510037SARM gem5 Developers        AddrMd_PreIndex,
44610037SARM gem5 Developers        AddrMd_PostIndex
44710037SARM gem5 Developers    };
44810037SARM gem5 Developers
44910037SARM gem5 Developers  protected:
45010037SARM gem5 Developers    PairMemOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
45110037SARM gem5 Developers              uint32_t size, bool fp, bool load, bool noAlloc, bool signExt,
45210037SARM gem5 Developers              bool exclusive, bool acrel, int64_t imm, AddrMode mode,
45310037SARM gem5 Developers              IntRegIndex rn, IntRegIndex rt, IntRegIndex rt2);
45410037SARM gem5 Developers};
45510037SARM gem5 Developers
45610037SARM gem5 Developersclass BigFpMemImmOp : public PredMacroOp
45710037SARM gem5 Developers{
45810037SARM gem5 Developers  protected:
45910037SARM gem5 Developers    BigFpMemImmOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
46010037SARM gem5 Developers                  bool load, IntRegIndex dest, IntRegIndex base, int64_t imm);
46110037SARM gem5 Developers};
46210037SARM gem5 Developers
46310037SARM gem5 Developersclass BigFpMemPostOp : public PredMacroOp
46410037SARM gem5 Developers{
46510037SARM gem5 Developers  protected:
46610037SARM gem5 Developers    BigFpMemPostOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
46710037SARM gem5 Developers                   bool load, IntRegIndex dest, IntRegIndex base, int64_t imm);
46810037SARM gem5 Developers};
46910037SARM gem5 Developers
47010037SARM gem5 Developersclass BigFpMemPreOp : public PredMacroOp
47110037SARM gem5 Developers{
47210037SARM gem5 Developers  protected:
47310037SARM gem5 Developers    BigFpMemPreOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
47410037SARM gem5 Developers                  bool load, IntRegIndex dest, IntRegIndex base, int64_t imm);
47510037SARM gem5 Developers};
47610037SARM gem5 Developers
47710037SARM gem5 Developersclass BigFpMemRegOp : public PredMacroOp
47810037SARM gem5 Developers{
47910037SARM gem5 Developers  protected:
48010037SARM gem5 Developers    BigFpMemRegOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
48110037SARM gem5 Developers                  bool load, IntRegIndex dest, IntRegIndex base,
48210037SARM gem5 Developers                  IntRegIndex offset, ArmExtendType type, int64_t imm);
48310037SARM gem5 Developers};
48410037SARM gem5 Developers
48510037SARM gem5 Developersclass BigFpMemLitOp : public PredMacroOp
48610037SARM gem5 Developers{
48710037SARM gem5 Developers  protected:
48810037SARM gem5 Developers    BigFpMemLitOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
48910037SARM gem5 Developers                  IntRegIndex dest, int64_t imm);
49010037SARM gem5 Developers};
49110037SARM gem5 Developers
49210037SARM gem5 Developers/**
4937639Sgblack@eecs.umich.edu * Base classes for microcoded integer memory instructions.
4947639Sgblack@eecs.umich.edu */
4957639Sgblack@eecs.umich.educlass VldMultOp : public PredMacroOp
4967639Sgblack@eecs.umich.edu{
4977639Sgblack@eecs.umich.edu  protected:
4987639Sgblack@eecs.umich.edu    VldMultOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
4997639Sgblack@eecs.umich.edu              unsigned elems, RegIndex rn, RegIndex vd, unsigned regs,
5007639Sgblack@eecs.umich.edu              unsigned inc, uint32_t size, uint32_t align, RegIndex rm);
5017639Sgblack@eecs.umich.edu};
5027639Sgblack@eecs.umich.edu
5037639Sgblack@eecs.umich.educlass VldSingleOp : public PredMacroOp
5047639Sgblack@eecs.umich.edu{
5057639Sgblack@eecs.umich.edu  protected:
5067639Sgblack@eecs.umich.edu    VldSingleOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
5077639Sgblack@eecs.umich.edu                bool all, unsigned elems, RegIndex rn, RegIndex vd,
5087639Sgblack@eecs.umich.edu                unsigned regs, unsigned inc, uint32_t size,
5097639Sgblack@eecs.umich.edu                uint32_t align, RegIndex rm, unsigned lane);
5107639Sgblack@eecs.umich.edu};
5117639Sgblack@eecs.umich.edu
5127639Sgblack@eecs.umich.edu/**
5137639Sgblack@eecs.umich.edu * Base class for microcoded integer memory instructions.
5147639Sgblack@eecs.umich.edu */
5157639Sgblack@eecs.umich.educlass VstMultOp : public PredMacroOp
5167639Sgblack@eecs.umich.edu{
5177639Sgblack@eecs.umich.edu  protected:
5187639Sgblack@eecs.umich.edu    VstMultOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
5197639Sgblack@eecs.umich.edu              unsigned width, RegIndex rn, RegIndex vd, unsigned regs,
5207639Sgblack@eecs.umich.edu              unsigned inc, uint32_t size, uint32_t align, RegIndex rm);
5217639Sgblack@eecs.umich.edu};
5227639Sgblack@eecs.umich.edu
5237639Sgblack@eecs.umich.educlass VstSingleOp : public PredMacroOp
5247639Sgblack@eecs.umich.edu{
5257639Sgblack@eecs.umich.edu  protected:
5267639Sgblack@eecs.umich.edu    VstSingleOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
5277639Sgblack@eecs.umich.edu                bool all, unsigned elems, RegIndex rn, RegIndex vd,
5287639Sgblack@eecs.umich.edu                unsigned regs, unsigned inc, uint32_t size,
5297639Sgblack@eecs.umich.edu                uint32_t align, RegIndex rm, unsigned lane);
5307639Sgblack@eecs.umich.edu};
5317639Sgblack@eecs.umich.edu
5327639Sgblack@eecs.umich.edu/**
5337431Sgblack@eecs.umich.edu * Base class for microcoded floating point memory instructions.
5347431Sgblack@eecs.umich.edu */
5357175Sgblack@eecs.umich.educlass MacroVFPMemOp : public PredMacroOp
5367175Sgblack@eecs.umich.edu{
5377175Sgblack@eecs.umich.edu  protected:
5387175Sgblack@eecs.umich.edu    MacroVFPMemOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
5397175Sgblack@eecs.umich.edu                  IntRegIndex rn, RegIndex vd, bool single, bool up,
5407175Sgblack@eecs.umich.edu                  bool writeback, bool load, uint32_t offset);
5417175Sgblack@eecs.umich.edu};
5427175Sgblack@eecs.umich.edu
5436253Sgblack@eecs.umich.edu}
5446253Sgblack@eecs.umich.edu
5456253Sgblack@eecs.umich.edu#endif //__ARCH_ARM_INSTS_MACROMEM_HH__
546