macromem.hh revision 10037
12810Srdreslin@umich.edu/*
211051Sandreas.hansson@arm.com * Copyright (c) 2010-2013 ARM Limited
311051Sandreas.hansson@arm.com * All rights reserved
411051Sandreas.hansson@arm.com *
511051Sandreas.hansson@arm.com * The license below extends only to copyright in the software and shall
611051Sandreas.hansson@arm.com * not be construed as granting a license to any other intellectual
711051Sandreas.hansson@arm.com * property including but not limited to intellectual property relating
811051Sandreas.hansson@arm.com * to a hardware implementation of the functionality of the software
911051Sandreas.hansson@arm.com * licensed hereunder.  You may use the software subject to the license
1011051Sandreas.hansson@arm.com * terms below provided that you ensure that this notice is replicated
1111051Sandreas.hansson@arm.com * unmodified and in its entirety in all distributions of the software,
1211051Sandreas.hansson@arm.com * modified or unmodified, in source code or in binary form.
1311051Sandreas.hansson@arm.com *
1411051Sandreas.hansson@arm.com * Copyright (c) 2007-2008 The Florida State University
1511051Sandreas.hansson@arm.com * All rights reserved.
162810Srdreslin@umich.edu *
172810Srdreslin@umich.edu * Redistribution and use in source and binary forms, with or without
182810Srdreslin@umich.edu * modification, are permitted provided that the following conditions are
192810Srdreslin@umich.edu * met: redistributions of source code must retain the above copyright
202810Srdreslin@umich.edu * notice, this list of conditions and the following disclaimer;
212810Srdreslin@umich.edu * redistributions in binary form must reproduce the above copyright
222810Srdreslin@umich.edu * notice, this list of conditions and the following disclaimer in the
232810Srdreslin@umich.edu * documentation and/or other materials provided with the distribution;
242810Srdreslin@umich.edu * neither the name of the copyright holders nor the names of its
252810Srdreslin@umich.edu * contributors may be used to endorse or promote products derived from
262810Srdreslin@umich.edu * this software without specific prior written permission.
272810Srdreslin@umich.edu *
282810Srdreslin@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
292810Srdreslin@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
302810Srdreslin@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
312810Srdreslin@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
322810Srdreslin@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
332810Srdreslin@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
342810Srdreslin@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
352810Srdreslin@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
362810Srdreslin@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
372810Srdreslin@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
382810Srdreslin@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
392810Srdreslin@umich.edu *
402810Srdreslin@umich.edu * Authors: Stephen Hines
412810Srdreslin@umich.edu */
4211051Sandreas.hansson@arm.com#ifndef __ARCH_ARM_MACROMEM_HH__
4311051Sandreas.hansson@arm.com#define __ARCH_ARM_MACROMEM_HH__
442810Srdreslin@umich.edu
4511051Sandreas.hansson@arm.com#include "arch/arm/insts/pred_inst.hh"
4611051Sandreas.hansson@arm.com#include "arch/arm/tlb.hh"
472810Srdreslin@umich.edu
482810Srdreslin@umich.edunamespace ArmISA
492810Srdreslin@umich.edu{
502810Srdreslin@umich.edu
5111051Sandreas.hansson@arm.comstatic inline unsigned int
522810Srdreslin@umich.edunumber_of_ones(int32_t val)
532810Srdreslin@umich.edu{
5411051Sandreas.hansson@arm.com    uint32_t ones = 0;
552810Srdreslin@umich.edu    for (int i = 0; i < 32; i++ )
5611051Sandreas.hansson@arm.com    {
5711051Sandreas.hansson@arm.com        if ( val & (1<<i) )
5811051Sandreas.hansson@arm.com            ones++;
5911051Sandreas.hansson@arm.com    }
6011051Sandreas.hansson@arm.com    return ones;
6111051Sandreas.hansson@arm.com}
6211051Sandreas.hansson@arm.com
6311051Sandreas.hansson@arm.com/**
6411051Sandreas.hansson@arm.com * Base class for Memory microops
6511051Sandreas.hansson@arm.com */
6611053Sandreas.hansson@arm.comclass MicroOp : public PredOp
6711053Sandreas.hansson@arm.com{
6811051Sandreas.hansson@arm.com  protected:
6911051Sandreas.hansson@arm.com    MicroOp(const char *mnem, ExtMachInst machInst, OpClass __opClass)
7011051Sandreas.hansson@arm.com            : PredOp(mnem, machInst, __opClass)
7111051Sandreas.hansson@arm.com    {
7211051Sandreas.hansson@arm.com    }
7311051Sandreas.hansson@arm.com
7411051Sandreas.hansson@arm.com  public:
7511051Sandreas.hansson@arm.com    void
7611051Sandreas.hansson@arm.com    advancePC(PCState &pcState) const
7711051Sandreas.hansson@arm.com    {
7811051Sandreas.hansson@arm.com        if (flags[IsLastMicroop]) {
7911051Sandreas.hansson@arm.com            pcState.uEnd();
8011051Sandreas.hansson@arm.com        } else if (flags[IsMicroop]) {
8111051Sandreas.hansson@arm.com            pcState.uAdvance();
8211051Sandreas.hansson@arm.com        } else {
8311051Sandreas.hansson@arm.com            pcState.advance();
8411051Sandreas.hansson@arm.com        }
8511051Sandreas.hansson@arm.com    }
8611051Sandreas.hansson@arm.com};
8711051Sandreas.hansson@arm.com
8811051Sandreas.hansson@arm.comclass MicroOpX : public ArmStaticInst
8911051Sandreas.hansson@arm.com{
9011051Sandreas.hansson@arm.com  protected:
9111051Sandreas.hansson@arm.com    MicroOpX(const char *mnem, ExtMachInst machInst, OpClass __opClass)
9211051Sandreas.hansson@arm.com            : ArmStaticInst(mnem, machInst, __opClass)
9311051Sandreas.hansson@arm.com    {}
9411051Sandreas.hansson@arm.com
9511051Sandreas.hansson@arm.com  public:
9611051Sandreas.hansson@arm.com    void
9711051Sandreas.hansson@arm.com    advancePC(PCState &pcState) const
9811051Sandreas.hansson@arm.com    {
9911051Sandreas.hansson@arm.com        if (flags[IsLastMicroop]) {
10011051Sandreas.hansson@arm.com            pcState.uEnd();
10111051Sandreas.hansson@arm.com        } else if (flags[IsMicroop]) {
10211051Sandreas.hansson@arm.com            pcState.uAdvance();
10311051Sandreas.hansson@arm.com        } else {
10411051Sandreas.hansson@arm.com            pcState.advance();
10511051Sandreas.hansson@arm.com        }
10611051Sandreas.hansson@arm.com    }
10711051Sandreas.hansson@arm.com};
10811051Sandreas.hansson@arm.com
10911051Sandreas.hansson@arm.com/**
11011051Sandreas.hansson@arm.com * Microops for Neon loads/stores
11111051Sandreas.hansson@arm.com */
11211051Sandreas.hansson@arm.comclass MicroNeonMemOp : public MicroOp
11311051Sandreas.hansson@arm.com{
11411051Sandreas.hansson@arm.com  protected:
11511051Sandreas.hansson@arm.com    RegIndex dest, ura;
11611051Sandreas.hansson@arm.com    uint32_t imm;
11711051Sandreas.hansson@arm.com    unsigned memAccessFlags;
11811051Sandreas.hansson@arm.com
11911051Sandreas.hansson@arm.com    MicroNeonMemOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
12011051Sandreas.hansson@arm.com                   RegIndex _dest, RegIndex _ura, uint32_t _imm)
12111051Sandreas.hansson@arm.com            : MicroOp(mnem, machInst, __opClass),
12211051Sandreas.hansson@arm.com              dest(_dest), ura(_ura), imm(_imm),
12311051Sandreas.hansson@arm.com              memAccessFlags(TLB::MustBeOne)
12411051Sandreas.hansson@arm.com    {
12511051Sandreas.hansson@arm.com    }
12611051Sandreas.hansson@arm.com};
12711051Sandreas.hansson@arm.com
12811051Sandreas.hansson@arm.com/**
12911051Sandreas.hansson@arm.com * Microops for Neon load/store (de)interleaving
13011051Sandreas.hansson@arm.com */
13111051Sandreas.hansson@arm.comclass MicroNeonMixOp : public MicroOp
13211051Sandreas.hansson@arm.com{
13311051Sandreas.hansson@arm.com  protected:
13411051Sandreas.hansson@arm.com    RegIndex dest, op1;
13511051Sandreas.hansson@arm.com    uint32_t step;
13611051Sandreas.hansson@arm.com
13711051Sandreas.hansson@arm.com    MicroNeonMixOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
13811051Sandreas.hansson@arm.com                   RegIndex _dest, RegIndex _op1, uint32_t _step)
13911051Sandreas.hansson@arm.com            : MicroOp(mnem, machInst, __opClass),
14011051Sandreas.hansson@arm.com              dest(_dest), op1(_op1), step(_step)
14111051Sandreas.hansson@arm.com    {
14211051Sandreas.hansson@arm.com    }
14311051Sandreas.hansson@arm.com};
14411051Sandreas.hansson@arm.com
14511051Sandreas.hansson@arm.comclass MicroNeonMixLaneOp : public MicroNeonMixOp
14611051Sandreas.hansson@arm.com{
14711051Sandreas.hansson@arm.com  protected:
14811051Sandreas.hansson@arm.com    unsigned lane;
14911051Sandreas.hansson@arm.com
15011051Sandreas.hansson@arm.com    MicroNeonMixLaneOp(const char *mnem, ExtMachInst machInst,
15111051Sandreas.hansson@arm.com                       OpClass __opClass, RegIndex _dest, RegIndex _op1,
15211051Sandreas.hansson@arm.com                       uint32_t _step, unsigned _lane)
15311051Sandreas.hansson@arm.com            : MicroNeonMixOp(mnem, machInst, __opClass, _dest, _op1, _step),
15411051Sandreas.hansson@arm.com              lane(_lane)
15511051Sandreas.hansson@arm.com    {
15611051Sandreas.hansson@arm.com    }
15711051Sandreas.hansson@arm.com};
15811051Sandreas.hansson@arm.com
15911051Sandreas.hansson@arm.com/**
16011051Sandreas.hansson@arm.com * Microops for AArch64 NEON load/store (de)interleaving
16111051Sandreas.hansson@arm.com */
16211051Sandreas.hansson@arm.comclass MicroNeonMixOp64 : public MicroOp
16311051Sandreas.hansson@arm.com{
16411051Sandreas.hansson@arm.com  protected:
16511051Sandreas.hansson@arm.com    RegIndex dest, op1;
16611051Sandreas.hansson@arm.com    uint8_t eSize, dataSize, numStructElems, numRegs, step;
16711051Sandreas.hansson@arm.com
16811051Sandreas.hansson@arm.com    MicroNeonMixOp64(const char *mnem, ExtMachInst machInst, OpClass __opClass,
16911051Sandreas.hansson@arm.com                     RegIndex _dest, RegIndex _op1, uint8_t _eSize,
17011051Sandreas.hansson@arm.com                     uint8_t _dataSize, uint8_t _numStructElems,
17111051Sandreas.hansson@arm.com                     uint8_t _numRegs, uint8_t _step)
17211051Sandreas.hansson@arm.com        : MicroOp(mnem, machInst, __opClass), dest(_dest), op1(_op1),
17311051Sandreas.hansson@arm.com          eSize(_eSize), dataSize(_dataSize), numStructElems(_numStructElems),
17411051Sandreas.hansson@arm.com          numRegs(_numRegs), step(_step)
17511051Sandreas.hansson@arm.com    {
17611051Sandreas.hansson@arm.com    }
17711051Sandreas.hansson@arm.com};
17811051Sandreas.hansson@arm.com
17911051Sandreas.hansson@arm.comclass MicroNeonMixLaneOp64 : public MicroOp
18011051Sandreas.hansson@arm.com{
18111051Sandreas.hansson@arm.com  protected:
18211051Sandreas.hansson@arm.com    RegIndex dest, op1;
18311051Sandreas.hansson@arm.com    uint8_t eSize, dataSize, numStructElems, lane, step;
18411051Sandreas.hansson@arm.com    bool replicate;
18511051Sandreas.hansson@arm.com
18611051Sandreas.hansson@arm.com    MicroNeonMixLaneOp64(const char *mnem, ExtMachInst machInst,
18711051Sandreas.hansson@arm.com                         OpClass __opClass, RegIndex _dest, RegIndex _op1,
18811051Sandreas.hansson@arm.com                         uint8_t _eSize, uint8_t _dataSize,
18911051Sandreas.hansson@arm.com                         uint8_t _numStructElems, uint8_t _lane, uint8_t _step,
19011051Sandreas.hansson@arm.com                         bool _replicate = false)
19111051Sandreas.hansson@arm.com        : MicroOp(mnem, machInst, __opClass), dest(_dest), op1(_op1),
19211051Sandreas.hansson@arm.com          eSize(_eSize), dataSize(_dataSize), numStructElems(_numStructElems),
19311051Sandreas.hansson@arm.com          lane(_lane), step(_step), replicate(_replicate)
19411051Sandreas.hansson@arm.com    {
19511051Sandreas.hansson@arm.com    }
19611051Sandreas.hansson@arm.com};
19711051Sandreas.hansson@arm.com
19811051Sandreas.hansson@arm.com/**
19911051Sandreas.hansson@arm.com * Base classes for microcoded AArch64 NEON memory instructions.
20011051Sandreas.hansson@arm.com */
20111051Sandreas.hansson@arm.comclass VldMultOp64 : public PredMacroOp
20211051Sandreas.hansson@arm.com{
20311051Sandreas.hansson@arm.com  protected:
20411051Sandreas.hansson@arm.com    uint8_t eSize, dataSize, numStructElems, numRegs;
20511051Sandreas.hansson@arm.com    bool wb;
20611051Sandreas.hansson@arm.com
20711051Sandreas.hansson@arm.com    VldMultOp64(const char *mnem, ExtMachInst machInst, OpClass __opClass,
20811051Sandreas.hansson@arm.com                RegIndex rn, RegIndex vd, RegIndex rm, uint8_t eSize,
20911051Sandreas.hansson@arm.com                uint8_t dataSize, uint8_t numStructElems, uint8_t numRegs,
21011051Sandreas.hansson@arm.com                bool wb);
21111051Sandreas.hansson@arm.com};
21211051Sandreas.hansson@arm.com
21311051Sandreas.hansson@arm.comclass VstMultOp64 : public PredMacroOp
21411051Sandreas.hansson@arm.com{
21511051Sandreas.hansson@arm.com  protected:
21611051Sandreas.hansson@arm.com    uint8_t eSize, dataSize, numStructElems, numRegs;
21711051Sandreas.hansson@arm.com    bool wb;
21811051Sandreas.hansson@arm.com
21911051Sandreas.hansson@arm.com    VstMultOp64(const char *mnem, ExtMachInst machInst, OpClass __opClass,
22011051Sandreas.hansson@arm.com                RegIndex rn, RegIndex vd, RegIndex rm, uint8_t eSize,
22111051Sandreas.hansson@arm.com                uint8_t dataSize, uint8_t numStructElems, uint8_t numRegs,
22211051Sandreas.hansson@arm.com                bool wb);
22311051Sandreas.hansson@arm.com};
22411051Sandreas.hansson@arm.com
22511051Sandreas.hansson@arm.comclass VldSingleOp64 : public PredMacroOp
22611051Sandreas.hansson@arm.com{
22711051Sandreas.hansson@arm.com  protected:
22811051Sandreas.hansson@arm.com    uint8_t eSize, dataSize, numStructElems, index;
22911051Sandreas.hansson@arm.com    bool wb, replicate;
23011051Sandreas.hansson@arm.com
23111051Sandreas.hansson@arm.com    VldSingleOp64(const char *mnem, ExtMachInst machInst, OpClass __opClass,
23211051Sandreas.hansson@arm.com                  RegIndex rn, RegIndex vd, RegIndex rm, uint8_t eSize,
23311051Sandreas.hansson@arm.com                  uint8_t dataSize, uint8_t numStructElems, uint8_t index,
23411051Sandreas.hansson@arm.com                  bool wb, bool replicate = false);
23511051Sandreas.hansson@arm.com};
23611051Sandreas.hansson@arm.com
23711051Sandreas.hansson@arm.comclass VstSingleOp64 : public PredMacroOp
23811051Sandreas.hansson@arm.com{
23911051Sandreas.hansson@arm.com  protected:
24011051Sandreas.hansson@arm.com    uint8_t eSize, dataSize, numStructElems, index;
24111051Sandreas.hansson@arm.com    bool wb, replicate;
24211051Sandreas.hansson@arm.com
24311051Sandreas.hansson@arm.com    VstSingleOp64(const char *mnem, ExtMachInst machInst, OpClass __opClass,
24411051Sandreas.hansson@arm.com                  RegIndex rn, RegIndex vd, RegIndex rm, uint8_t eSize,
24511051Sandreas.hansson@arm.com                  uint8_t dataSize, uint8_t numStructElems, uint8_t index,
24611051Sandreas.hansson@arm.com                  bool wb, bool replicate = false);
24711051Sandreas.hansson@arm.com};
24811051Sandreas.hansson@arm.com
24911051Sandreas.hansson@arm.com/**
25011051Sandreas.hansson@arm.com * Microops of the form
25111051Sandreas.hansson@arm.com * PC   = IntRegA
25211051Sandreas.hansson@arm.com * CPSR = IntRegB
25311051Sandreas.hansson@arm.com */
25411051Sandreas.hansson@arm.comclass MicroSetPCCPSR : public MicroOp
25511051Sandreas.hansson@arm.com{
25611051Sandreas.hansson@arm.com    protected:
25711051Sandreas.hansson@arm.com    IntRegIndex ura, urb, urc;
25811051Sandreas.hansson@arm.com
25911051Sandreas.hansson@arm.com    MicroSetPCCPSR(const char *mnem, ExtMachInst machInst, OpClass __opClass,
26011051Sandreas.hansson@arm.com                   IntRegIndex _ura, IntRegIndex _urb, IntRegIndex _urc)
26111051Sandreas.hansson@arm.com        : MicroOp(mnem, machInst, __opClass),
26211051Sandreas.hansson@arm.com          ura(_ura), urb(_urb), urc(_urc)
26311051Sandreas.hansson@arm.com    {
26411051Sandreas.hansson@arm.com    }
26511051Sandreas.hansson@arm.com
26611051Sandreas.hansson@arm.com    std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const;
26711051Sandreas.hansson@arm.com};
26811051Sandreas.hansson@arm.com
26911051Sandreas.hansson@arm.com/**
27011051Sandreas.hansson@arm.com * Microops of the form IntRegA = IntRegB
27111051Sandreas.hansson@arm.com */
27211051Sandreas.hansson@arm.comclass MicroIntMov : public MicroOp
27311051Sandreas.hansson@arm.com{
27411051Sandreas.hansson@arm.com  protected:
27511051Sandreas.hansson@arm.com    RegIndex ura, urb;
27611051Sandreas.hansson@arm.com
27711051Sandreas.hansson@arm.com    MicroIntMov(const char *mnem, ExtMachInst machInst, OpClass __opClass,
27811051Sandreas.hansson@arm.com               RegIndex _ura, RegIndex _urb)
27911051Sandreas.hansson@arm.com            : MicroOp(mnem, machInst, __opClass),
28011051Sandreas.hansson@arm.com              ura(_ura), urb(_urb)
28111051Sandreas.hansson@arm.com    {
28211051Sandreas.hansson@arm.com    }
28311051Sandreas.hansson@arm.com
28411051Sandreas.hansson@arm.com    std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const;
28511051Sandreas.hansson@arm.com};
28611051Sandreas.hansson@arm.com
28711051Sandreas.hansson@arm.com/**
28811051Sandreas.hansson@arm.com * Microops of the form IntRegA = IntRegB op Imm
28911051Sandreas.hansson@arm.com */
29011051Sandreas.hansson@arm.comclass MicroIntImmOp : public MicroOp
29111051Sandreas.hansson@arm.com{
29211051Sandreas.hansson@arm.com  protected:
29311051Sandreas.hansson@arm.com    RegIndex ura, urb;
29411051Sandreas.hansson@arm.com    int32_t imm;
29511051Sandreas.hansson@arm.com
29611051Sandreas.hansson@arm.com    MicroIntImmOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
29711051Sandreas.hansson@arm.com                  RegIndex _ura, RegIndex _urb, int32_t _imm)
29811051Sandreas.hansson@arm.com            : MicroOp(mnem, machInst, __opClass),
29911051Sandreas.hansson@arm.com              ura(_ura), urb(_urb), imm(_imm)
30011051Sandreas.hansson@arm.com    {
30111051Sandreas.hansson@arm.com    }
30211051Sandreas.hansson@arm.com
30311051Sandreas.hansson@arm.com    std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const;
30411051Sandreas.hansson@arm.com};
30511051Sandreas.hansson@arm.com
30611051Sandreas.hansson@arm.comclass MicroIntImmXOp : public MicroOpX
30711051Sandreas.hansson@arm.com{
30811051Sandreas.hansson@arm.com  protected:
30911051Sandreas.hansson@arm.com    RegIndex ura, urb;
31011051Sandreas.hansson@arm.com    int64_t imm;
31111051Sandreas.hansson@arm.com
31211051Sandreas.hansson@arm.com    MicroIntImmXOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
31311051Sandreas.hansson@arm.com                   RegIndex _ura, RegIndex _urb, int64_t _imm)
31411051Sandreas.hansson@arm.com            : MicroOpX(mnem, machInst, __opClass),
31511051Sandreas.hansson@arm.com              ura(_ura), urb(_urb), imm(_imm)
31611051Sandreas.hansson@arm.com    {
31711051Sandreas.hansson@arm.com    }
31811051Sandreas.hansson@arm.com
31911051Sandreas.hansson@arm.com    std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const;
32011051Sandreas.hansson@arm.com};
32111051Sandreas.hansson@arm.com
32211051Sandreas.hansson@arm.com/**
32311051Sandreas.hansson@arm.com * Microops of the form IntRegA = IntRegB op IntRegC
32411051Sandreas.hansson@arm.com */
32511051Sandreas.hansson@arm.comclass MicroIntOp : public MicroOp
32611051Sandreas.hansson@arm.com{
32711051Sandreas.hansson@arm.com  protected:
32811051Sandreas.hansson@arm.com    RegIndex ura, urb, urc;
32911051Sandreas.hansson@arm.com
33011051Sandreas.hansson@arm.com    MicroIntOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
33111051Sandreas.hansson@arm.com               RegIndex _ura, RegIndex _urb, RegIndex _urc)
33211051Sandreas.hansson@arm.com            : MicroOp(mnem, machInst, __opClass),
33311051Sandreas.hansson@arm.com              ura(_ura), urb(_urb), urc(_urc)
33411051Sandreas.hansson@arm.com    {
33511051Sandreas.hansson@arm.com    }
33611051Sandreas.hansson@arm.com
33711051Sandreas.hansson@arm.com    std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const;
33811051Sandreas.hansson@arm.com};
33911051Sandreas.hansson@arm.com
34011051Sandreas.hansson@arm.comclass MicroIntRegXOp : public MicroOp
34111051Sandreas.hansson@arm.com{
34211051Sandreas.hansson@arm.com  protected:
34311051Sandreas.hansson@arm.com    RegIndex ura, urb, urc;
34411051Sandreas.hansson@arm.com    ArmExtendType type;
34511051Sandreas.hansson@arm.com    uint32_t shiftAmt;
34611051Sandreas.hansson@arm.com
34711051Sandreas.hansson@arm.com    MicroIntRegXOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
34811051Sandreas.hansson@arm.com                   RegIndex _ura, RegIndex _urb, RegIndex _urc,
34911051Sandreas.hansson@arm.com                   ArmExtendType _type, uint32_t _shiftAmt)
35011051Sandreas.hansson@arm.com            : MicroOp(mnem, machInst, __opClass),
35111051Sandreas.hansson@arm.com              ura(_ura), urb(_urb), urc(_urc),
35211051Sandreas.hansson@arm.com              type(_type), shiftAmt(_shiftAmt)
35311051Sandreas.hansson@arm.com    {
35411051Sandreas.hansson@arm.com    }
35511051Sandreas.hansson@arm.com
35611051Sandreas.hansson@arm.com    std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const;
35711051Sandreas.hansson@arm.com};
35811051Sandreas.hansson@arm.com
35911051Sandreas.hansson@arm.com/**
36011051Sandreas.hansson@arm.com * Microops of the form IntRegA = IntRegB op shifted IntRegC
36111051Sandreas.hansson@arm.com */
36211051Sandreas.hansson@arm.comclass MicroIntRegOp : public MicroOp
36311051Sandreas.hansson@arm.com{
36411051Sandreas.hansson@arm.com  protected:
36511051Sandreas.hansson@arm.com    RegIndex ura, urb, urc;
36611051Sandreas.hansson@arm.com    int32_t shiftAmt;
36711051Sandreas.hansson@arm.com    ArmShiftType shiftType;
36811051Sandreas.hansson@arm.com
36911051Sandreas.hansson@arm.com    MicroIntRegOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
37011051Sandreas.hansson@arm.com               RegIndex _ura, RegIndex _urb, RegIndex _urc,
37111051Sandreas.hansson@arm.com               int32_t _shiftAmt, ArmShiftType _shiftType)
37211051Sandreas.hansson@arm.com            : MicroOp(mnem, machInst, __opClass),
37311051Sandreas.hansson@arm.com              ura(_ura), urb(_urb), urc(_urc),
37411051Sandreas.hansson@arm.com              shiftAmt(_shiftAmt), shiftType(_shiftType)
37511051Sandreas.hansson@arm.com    {
37611051Sandreas.hansson@arm.com    }
37711051Sandreas.hansson@arm.com};
37811051Sandreas.hansson@arm.com
37911051Sandreas.hansson@arm.com/**
38011051Sandreas.hansson@arm.com * Memory microops which use IntReg + Imm addressing
38111051Sandreas.hansson@arm.com */
38211051Sandreas.hansson@arm.comclass MicroMemOp : public MicroIntImmOp
38311051Sandreas.hansson@arm.com{
38411051Sandreas.hansson@arm.com  protected:
38511051Sandreas.hansson@arm.com    bool up;
38611051Sandreas.hansson@arm.com    unsigned memAccessFlags;
38711051Sandreas.hansson@arm.com
38811051Sandreas.hansson@arm.com    MicroMemOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
38911051Sandreas.hansson@arm.com               RegIndex _ura, RegIndex _urb, bool _up, uint8_t _imm)
39011051Sandreas.hansson@arm.com            : MicroIntImmOp(mnem, machInst, __opClass, _ura, _urb, _imm),
39111051Sandreas.hansson@arm.com              up(_up), memAccessFlags(TLB::MustBeOne | TLB::AlignWord)
39211051Sandreas.hansson@arm.com    {
39311051Sandreas.hansson@arm.com    }
39411051Sandreas.hansson@arm.com
39511051Sandreas.hansson@arm.com    std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const;
39611051Sandreas.hansson@arm.com};
39711051Sandreas.hansson@arm.com
39811051Sandreas.hansson@arm.com/**
39911051Sandreas.hansson@arm.com * Base class for microcoded integer memory instructions.
40011051Sandreas.hansson@arm.com */
40111051Sandreas.hansson@arm.comclass MacroMemOp : public PredMacroOp
40211051Sandreas.hansson@arm.com{
40311051Sandreas.hansson@arm.com  protected:
40411051Sandreas.hansson@arm.com    MacroMemOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
40511051Sandreas.hansson@arm.com               IntRegIndex rn, bool index, bool up, bool user,
40611051Sandreas.hansson@arm.com               bool writeback, bool load, uint32_t reglist);
40711051Sandreas.hansson@arm.com};
40811051Sandreas.hansson@arm.com
40911051Sandreas.hansson@arm.com/**
41011051Sandreas.hansson@arm.com * Base class for pair load/store instructions.
41111051Sandreas.hansson@arm.com */
41211051Sandreas.hansson@arm.comclass PairMemOp : public PredMacroOp
41311051Sandreas.hansson@arm.com{
41411051Sandreas.hansson@arm.com  public:
41511051Sandreas.hansson@arm.com    enum AddrMode {
41611051Sandreas.hansson@arm.com        AddrMd_Offset,
41711051Sandreas.hansson@arm.com        AddrMd_PreIndex,
41811051Sandreas.hansson@arm.com        AddrMd_PostIndex
41911051Sandreas.hansson@arm.com    };
42011051Sandreas.hansson@arm.com
42111051Sandreas.hansson@arm.com  protected:
42211051Sandreas.hansson@arm.com    PairMemOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
42311051Sandreas.hansson@arm.com              uint32_t size, bool fp, bool load, bool noAlloc, bool signExt,
42411051Sandreas.hansson@arm.com              bool exclusive, bool acrel, int64_t imm, AddrMode mode,
42511051Sandreas.hansson@arm.com              IntRegIndex rn, IntRegIndex rt, IntRegIndex rt2);
42611051Sandreas.hansson@arm.com};
42711051Sandreas.hansson@arm.com
42811051Sandreas.hansson@arm.comclass BigFpMemImmOp : public PredMacroOp
42911051Sandreas.hansson@arm.com{
43011051Sandreas.hansson@arm.com  protected:
43111051Sandreas.hansson@arm.com    BigFpMemImmOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
43211051Sandreas.hansson@arm.com                  bool load, IntRegIndex dest, IntRegIndex base, int64_t imm);
43311051Sandreas.hansson@arm.com};
43411051Sandreas.hansson@arm.com
43511051Sandreas.hansson@arm.comclass BigFpMemPostOp : public PredMacroOp
43611051Sandreas.hansson@arm.com{
43711051Sandreas.hansson@arm.com  protected:
43811051Sandreas.hansson@arm.com    BigFpMemPostOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
43911051Sandreas.hansson@arm.com                   bool load, IntRegIndex dest, IntRegIndex base, int64_t imm);
44011051Sandreas.hansson@arm.com};
44111051Sandreas.hansson@arm.com
44211051Sandreas.hansson@arm.comclass BigFpMemPreOp : public PredMacroOp
44311051Sandreas.hansson@arm.com{
44411051Sandreas.hansson@arm.com  protected:
44511051Sandreas.hansson@arm.com    BigFpMemPreOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
44611051Sandreas.hansson@arm.com                  bool load, IntRegIndex dest, IntRegIndex base, int64_t imm);
44711051Sandreas.hansson@arm.com};
44811051Sandreas.hansson@arm.com
44911051Sandreas.hansson@arm.comclass BigFpMemRegOp : public PredMacroOp
45011051Sandreas.hansson@arm.com{
45111051Sandreas.hansson@arm.com  protected:
45211051Sandreas.hansson@arm.com    BigFpMemRegOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
45311051Sandreas.hansson@arm.com                  bool load, IntRegIndex dest, IntRegIndex base,
45411051Sandreas.hansson@arm.com                  IntRegIndex offset, ArmExtendType type, int64_t imm);
45511051Sandreas.hansson@arm.com};
45611051Sandreas.hansson@arm.com
45711051Sandreas.hansson@arm.comclass BigFpMemLitOp : public PredMacroOp
45811130Sali.jafri@arm.com{
45911130Sali.jafri@arm.com  protected:
46011130Sali.jafri@arm.com    BigFpMemLitOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
46111130Sali.jafri@arm.com                  IntRegIndex dest, int64_t imm);
46211130Sali.jafri@arm.com};
46311130Sali.jafri@arm.com
46411130Sali.jafri@arm.com/**
46511130Sali.jafri@arm.com * Base classes for microcoded integer memory instructions.
46611130Sali.jafri@arm.com */
46711130Sali.jafri@arm.comclass VldMultOp : public PredMacroOp
46811130Sali.jafri@arm.com{
46911130Sali.jafri@arm.com  protected:
47011130Sali.jafri@arm.com    VldMultOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
47111130Sali.jafri@arm.com              unsigned elems, RegIndex rn, RegIndex vd, unsigned regs,
47211130Sali.jafri@arm.com              unsigned inc, uint32_t size, uint32_t align, RegIndex rm);
47311130Sali.jafri@arm.com};
47411130Sali.jafri@arm.com
47511130Sali.jafri@arm.comclass VldSingleOp : public PredMacroOp
47611130Sali.jafri@arm.com{
47711130Sali.jafri@arm.com  protected:
47811130Sali.jafri@arm.com    VldSingleOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
47911130Sali.jafri@arm.com                bool all, unsigned elems, RegIndex rn, RegIndex vd,
48011130Sali.jafri@arm.com                unsigned regs, unsigned inc, uint32_t size,
48111130Sali.jafri@arm.com                uint32_t align, RegIndex rm, unsigned lane);
48211130Sali.jafri@arm.com};
48311130Sali.jafri@arm.com
48411130Sali.jafri@arm.com/**
48511130Sali.jafri@arm.com * Base class for microcoded integer memory instructions.
48611130Sali.jafri@arm.com */
48711130Sali.jafri@arm.comclass VstMultOp : public PredMacroOp
48811130Sali.jafri@arm.com{
48911130Sali.jafri@arm.com  protected:
49011130Sali.jafri@arm.com    VstMultOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
49111051Sandreas.hansson@arm.com              unsigned width, RegIndex rn, RegIndex vd, unsigned regs,
49211051Sandreas.hansson@arm.com              unsigned inc, uint32_t size, uint32_t align, RegIndex rm);
49311051Sandreas.hansson@arm.com};
49411051Sandreas.hansson@arm.com
49511051Sandreas.hansson@arm.comclass VstSingleOp : public PredMacroOp
49611051Sandreas.hansson@arm.com{
49711051Sandreas.hansson@arm.com  protected:
49811051Sandreas.hansson@arm.com    VstSingleOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
49911051Sandreas.hansson@arm.com                bool all, unsigned elems, RegIndex rn, RegIndex vd,
50011051Sandreas.hansson@arm.com                unsigned regs, unsigned inc, uint32_t size,
50111051Sandreas.hansson@arm.com                uint32_t align, RegIndex rm, unsigned lane);
50211051Sandreas.hansson@arm.com};
50311051Sandreas.hansson@arm.com
50411051Sandreas.hansson@arm.com/**
50511051Sandreas.hansson@arm.com * Base class for microcoded floating point memory instructions.
50611051Sandreas.hansson@arm.com */
50711051Sandreas.hansson@arm.comclass MacroVFPMemOp : public PredMacroOp
50811051Sandreas.hansson@arm.com{
50911051Sandreas.hansson@arm.com  protected:
51011051Sandreas.hansson@arm.com    MacroVFPMemOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
51111051Sandreas.hansson@arm.com                  IntRegIndex rn, RegIndex vd, bool single, bool up,
51211051Sandreas.hansson@arm.com                  bool writeback, bool load, uint32_t offset);
51311051Sandreas.hansson@arm.com};
51411051Sandreas.hansson@arm.com
51511051Sandreas.hansson@arm.com}
51611051Sandreas.hansson@arm.com
51711051Sandreas.hansson@arm.com#endif //__ARCH_ARM_INSTS_MACROMEM_HH__
51811051Sandreas.hansson@arm.com