macromem.hh revision 12616
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