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