17110Sgblack@eecs.umich.edu/*
213120SEdmund.Grimley-Evans@arm.com * Copyright (c) 2010, 2012-2013, 2017-2018 ARM Limited
37110Sgblack@eecs.umich.edu * All rights reserved
47110Sgblack@eecs.umich.edu *
57110Sgblack@eecs.umich.edu * The license below extends only to copyright in the software and shall
67110Sgblack@eecs.umich.edu * not be construed as granting a license to any other intellectual
77110Sgblack@eecs.umich.edu * property including but not limited to intellectual property relating
87110Sgblack@eecs.umich.edu * to a hardware implementation of the functionality of the software
97110Sgblack@eecs.umich.edu * licensed hereunder.  You may use the software subject to the license
107110Sgblack@eecs.umich.edu * terms below provided that you ensure that this notice is replicated
117110Sgblack@eecs.umich.edu * unmodified and in its entirety in all distributions of the software,
127110Sgblack@eecs.umich.edu * modified or unmodified, in source code or in binary form.
137110Sgblack@eecs.umich.edu *
147110Sgblack@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_INSTS_PREDINST_HH__
436253Sgblack@eecs.umich.edu#define __ARCH_ARM_INSTS_PREDINST_HH__
446253Sgblack@eecs.umich.edu
456253Sgblack@eecs.umich.edu#include "arch/arm/insts/static_inst.hh"
4613449Sgabeblack@google.com#include "base/logging.hh"
476253Sgblack@eecs.umich.edu#include "base/trace.hh"
486253Sgblack@eecs.umich.edu
496253Sgblack@eecs.umich.edunamespace ArmISA
506253Sgblack@eecs.umich.edu{
516253Sgblack@eecs.umich.edustatic inline uint32_t
5210418Sandreas.hansson@arm.comrotate_imm(uint32_t immValue, uint32_t rotateValue)
536253Sgblack@eecs.umich.edu{
5410418Sandreas.hansson@arm.com    rotateValue &= 31;
5510418Sandreas.hansson@arm.com    return rotateValue == 0 ? immValue :
5610418Sandreas.hansson@arm.com        (immValue >> rotateValue) | (immValue << (32 - rotateValue));
576253Sgblack@eecs.umich.edu}
586253Sgblack@eecs.umich.edu
597140Sgblack@eecs.umich.edustatic inline uint32_t
607140Sgblack@eecs.umich.edumodified_imm(uint8_t ctrlImm, uint8_t dataImm)
617140Sgblack@eecs.umich.edu{
627140Sgblack@eecs.umich.edu    uint32_t bigData = dataImm;
637140Sgblack@eecs.umich.edu    uint32_t bigCtrl = ctrlImm;
647140Sgblack@eecs.umich.edu    if (bigCtrl < 4) {
657140Sgblack@eecs.umich.edu        switch (bigCtrl) {
667140Sgblack@eecs.umich.edu          case 0:
677140Sgblack@eecs.umich.edu            return bigData;
687140Sgblack@eecs.umich.edu          case 1:
697140Sgblack@eecs.umich.edu            return bigData | (bigData << 16);
707140Sgblack@eecs.umich.edu          case 2:
717140Sgblack@eecs.umich.edu            return (bigData << 8) | (bigData << 24);
727140Sgblack@eecs.umich.edu          case 3:
737140Sgblack@eecs.umich.edu            return (bigData << 0) | (bigData << 8) |
747140Sgblack@eecs.umich.edu                   (bigData << 16) | (bigData << 24);
757140Sgblack@eecs.umich.edu        }
767140Sgblack@eecs.umich.edu    }
777140Sgblack@eecs.umich.edu    bigCtrl = (bigCtrl << 1) | ((bigData >> 7) & 0x1);
787140Sgblack@eecs.umich.edu    bigData |= (1 << 7);
797140Sgblack@eecs.umich.edu    return bigData << (32 - bigCtrl);
807140Sgblack@eecs.umich.edu}
817140Sgblack@eecs.umich.edu
827328Sgblack@eecs.umich.edustatic inline uint64_t
8310037SARM gem5 Developerssimd_modified_imm(bool op, uint8_t cmode, uint8_t data, bool &immValid,
8410037SARM gem5 Developers                  bool isAarch64 = false)
857328Sgblack@eecs.umich.edu{
867328Sgblack@eecs.umich.edu    uint64_t bigData = data;
877853SMatt.Horsnell@ARM.com    immValid = true;
887328Sgblack@eecs.umich.edu    switch (cmode) {
897328Sgblack@eecs.umich.edu      case 0x0:
907328Sgblack@eecs.umich.edu      case 0x1:
917328Sgblack@eecs.umich.edu        bigData = (bigData << 0) | (bigData << 32);
927328Sgblack@eecs.umich.edu        break;
937328Sgblack@eecs.umich.edu      case 0x2:
947328Sgblack@eecs.umich.edu      case 0x3:
957328Sgblack@eecs.umich.edu        bigData = (bigData << 8) | (bigData << 40);
967328Sgblack@eecs.umich.edu        break;
977328Sgblack@eecs.umich.edu      case 0x4:
987328Sgblack@eecs.umich.edu      case 0x5:
997328Sgblack@eecs.umich.edu        bigData = (bigData << 16) | (bigData << 48);
1007328Sgblack@eecs.umich.edu        break;
1017328Sgblack@eecs.umich.edu      case 0x6:
1027328Sgblack@eecs.umich.edu      case 0x7:
1037328Sgblack@eecs.umich.edu        bigData = (bigData << 24) | (bigData << 56);
1047328Sgblack@eecs.umich.edu        break;
1057328Sgblack@eecs.umich.edu      case 0x8:
1067328Sgblack@eecs.umich.edu      case 0x9:
1077328Sgblack@eecs.umich.edu        bigData = (bigData << 0) | (bigData << 16) |
1087328Sgblack@eecs.umich.edu                  (bigData << 32) | (bigData << 48);
1097328Sgblack@eecs.umich.edu        break;
1107328Sgblack@eecs.umich.edu      case 0xa:
1117328Sgblack@eecs.umich.edu      case 0xb:
1127328Sgblack@eecs.umich.edu        bigData = (bigData << 8) | (bigData << 24) |
1137328Sgblack@eecs.umich.edu                  (bigData << 40) | (bigData << 56);
1147328Sgblack@eecs.umich.edu        break;
1157328Sgblack@eecs.umich.edu      case 0xc:
1167328Sgblack@eecs.umich.edu        bigData = (0xffULL << 0) | (bigData << 8) |
1177328Sgblack@eecs.umich.edu                  (0xffULL << 32) | (bigData << 40);
1187328Sgblack@eecs.umich.edu        break;
1197328Sgblack@eecs.umich.edu      case 0xd:
1207328Sgblack@eecs.umich.edu        bigData = (0xffffULL << 0) | (bigData << 16) |
1217328Sgblack@eecs.umich.edu                  (0xffffULL << 32) | (bigData << 48);
1227328Sgblack@eecs.umich.edu        break;
1237328Sgblack@eecs.umich.edu      case 0xe:
1247328Sgblack@eecs.umich.edu        if (op) {
1257639Sgblack@eecs.umich.edu            bigData = 0;
1267639Sgblack@eecs.umich.edu            for (int i = 7; i >= 0; i--) {
1277639Sgblack@eecs.umich.edu                if (bits(data, i)) {
1287639Sgblack@eecs.umich.edu                    bigData |= (ULL(0xFF) << (i * 8));
1297639Sgblack@eecs.umich.edu                }
1307639Sgblack@eecs.umich.edu            }
1317639Sgblack@eecs.umich.edu        } else {
1327328Sgblack@eecs.umich.edu            bigData = (bigData << 0)  | (bigData << 8)  |
1337328Sgblack@eecs.umich.edu                      (bigData << 16) | (bigData << 24) |
1347328Sgblack@eecs.umich.edu                      (bigData << 32) | (bigData << 40) |
1357328Sgblack@eecs.umich.edu                      (bigData << 48) | (bigData << 56);
1367328Sgblack@eecs.umich.edu        }
1377639Sgblack@eecs.umich.edu        break;
1387328Sgblack@eecs.umich.edu      case 0xf:
13910037SARM gem5 Developers        {
14010037SARM gem5 Developers            uint64_t bVal = 0;
14110037SARM gem5 Developers            if (!op) {
14210037SARM gem5 Developers                bVal = bits(bigData, 6) ? (0x1F) : (0x20);
14310037SARM gem5 Developers                bigData = (bits(bigData, 5, 0) << 19) |
14410037SARM gem5 Developers                          (bVal << 25) | (bits(bigData, 7) << 31);
14510037SARM gem5 Developers                bigData |= (bigData << 32);
14610037SARM gem5 Developers                break;
14710037SARM gem5 Developers            } else if (isAarch64) {
14810037SARM gem5 Developers                bVal = bits(bigData, 6) ? (0x0FF) : (0x100);
14910037SARM gem5 Developers                bigData = (bits(bigData, 5, 0) << 48) |
15010037SARM gem5 Developers                          (bVal << 54) | (bits(bigData, 7) << 63);
15110037SARM gem5 Developers                break;
15210037SARM gem5 Developers            }
1537328Sgblack@eecs.umich.edu        }
15412595Ssiddhesh.poyarekar@gmail.com        M5_FALLTHROUGH;
1557328Sgblack@eecs.umich.edu      default:
1567853SMatt.Horsnell@ARM.com        immValid = false;
1577853SMatt.Horsnell@ARM.com        break;
1587328Sgblack@eecs.umich.edu    }
1597328Sgblack@eecs.umich.edu    return bigData;
1607328Sgblack@eecs.umich.edu}
1617328Sgblack@eecs.umich.edu
16213120SEdmund.Grimley-Evans@arm.com/** Floating point data types. */
16313120SEdmund.Grimley-Evans@arm.comenum class FpDataType { Fp16, Fp32, Fp64 };
16413120SEdmund.Grimley-Evans@arm.com
1657329Sgblack@eecs.umich.edustatic inline uint64_t
16613120SEdmund.Grimley-Evans@arm.comvfp_modified_imm(uint8_t data, FpDataType dtype)
1677329Sgblack@eecs.umich.edu{
1687329Sgblack@eecs.umich.edu    uint64_t bigData = data;
1697329Sgblack@eecs.umich.edu    uint64_t repData;
17013120SEdmund.Grimley-Evans@arm.com    switch (dtype) {
17113120SEdmund.Grimley-Evans@arm.com      case FpDataType::Fp16:
17213120SEdmund.Grimley-Evans@arm.com        repData = bits(data, 6) ? 0x3 : 0;
17313120SEdmund.Grimley-Evans@arm.com        bigData = (bits(bigData, 5, 0) << 6) |
17413120SEdmund.Grimley-Evans@arm.com                  (repData << 12) | (bits(~bigData, 6) << 14) |
17513120SEdmund.Grimley-Evans@arm.com                  (bits(bigData, 7) << 15);
17613120SEdmund.Grimley-Evans@arm.com        break;
17713120SEdmund.Grimley-Evans@arm.com      case FpDataType::Fp32:
17813120SEdmund.Grimley-Evans@arm.com        repData = bits(data, 6) ? 0x1F : 0;
17913120SEdmund.Grimley-Evans@arm.com        bigData = (bits(bigData, 5, 0) << 19) |
18013120SEdmund.Grimley-Evans@arm.com                  (repData << 25) | (bits(~bigData, 6) << 30) |
18113120SEdmund.Grimley-Evans@arm.com                  (bits(bigData, 7) << 31);
18213120SEdmund.Grimley-Evans@arm.com        break;
18313120SEdmund.Grimley-Evans@arm.com      case FpDataType::Fp64:
1847329Sgblack@eecs.umich.edu        repData = bits(data, 6) ? 0xFF : 0;
1857329Sgblack@eecs.umich.edu        bigData = (bits(bigData, 5, 0) << 48) |
1867329Sgblack@eecs.umich.edu                  (repData << 54) | (bits(~bigData, 6) << 62) |
1877329Sgblack@eecs.umich.edu                  (bits(bigData, 7) << 63);
18813120SEdmund.Grimley-Evans@arm.com        break;
18913120SEdmund.Grimley-Evans@arm.com      default:
19013449Sgabeblack@google.com        panic("Unrecognized FP data type");
1917329Sgblack@eecs.umich.edu    }
1927329Sgblack@eecs.umich.edu    return bigData;
1937329Sgblack@eecs.umich.edu}
1947329Sgblack@eecs.umich.edu
19513120SEdmund.Grimley-Evans@arm.comstatic inline FpDataType
19613120SEdmund.Grimley-Evans@arm.comdecode_fp_data_type(uint8_t encoding)
19713120SEdmund.Grimley-Evans@arm.com{
19813120SEdmund.Grimley-Evans@arm.com    switch (encoding) {
19913120SEdmund.Grimley-Evans@arm.com      case 1: return FpDataType::Fp16;
20013120SEdmund.Grimley-Evans@arm.com      case 2: return FpDataType::Fp32;
20113120SEdmund.Grimley-Evans@arm.com      case 3: return FpDataType::Fp64;
20213120SEdmund.Grimley-Evans@arm.com      default:
20313120SEdmund.Grimley-Evans@arm.com        panic(
20413120SEdmund.Grimley-Evans@arm.com            "Invalid floating point data type in VFP/SIMD or SVE instruction");
20513120SEdmund.Grimley-Evans@arm.com    }
20613120SEdmund.Grimley-Evans@arm.com}
2077140Sgblack@eecs.umich.edu
2086253Sgblack@eecs.umich.edu/**
2096253Sgblack@eecs.umich.edu * Base class for predicated integer operations.
2106253Sgblack@eecs.umich.edu */
2116253Sgblack@eecs.umich.educlass PredOp : public ArmStaticInst
2126253Sgblack@eecs.umich.edu{
2136253Sgblack@eecs.umich.edu  protected:
2146253Sgblack@eecs.umich.edu
2156253Sgblack@eecs.umich.edu    ConditionCode condCode;
2166253Sgblack@eecs.umich.edu
2176253Sgblack@eecs.umich.edu    /// Constructor
2187099Sgblack@eecs.umich.edu    PredOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass) :
21910037SARM gem5 Developers           ArmStaticInst(mnem, _machInst, __opClass)
2206253Sgblack@eecs.umich.edu    {
22110037SARM gem5 Developers        if (machInst.aarch64)
22210037SARM gem5 Developers            condCode = COND_UC;
22310037SARM gem5 Developers        else if (machInst.itstateMask)
22410037SARM gem5 Developers            condCode = (ConditionCode)(uint8_t)machInst.itstateCond;
22510037SARM gem5 Developers        else
22610037SARM gem5 Developers            condCode = (ConditionCode)(unsigned)machInst.condCode;
2276253Sgblack@eecs.umich.edu    }
2286253Sgblack@eecs.umich.edu};
2296253Sgblack@eecs.umich.edu
2306253Sgblack@eecs.umich.edu/**
2316253Sgblack@eecs.umich.edu * Base class for predicated immediate operations.
2326253Sgblack@eecs.umich.edu */
2337143Sgblack@eecs.umich.educlass PredImmOp : public PredOp
2346253Sgblack@eecs.umich.edu{
2356306Sgblack@eecs.umich.edu    protected:
2366253Sgblack@eecs.umich.edu
2376306Sgblack@eecs.umich.edu    uint32_t imm;
2386306Sgblack@eecs.umich.edu    uint32_t rotated_imm;
2396306Sgblack@eecs.umich.edu    uint32_t rotated_carry;
2407110Sgblack@eecs.umich.edu    uint32_t rotate;
2417110Sgblack@eecs.umich.edu
2427110Sgblack@eecs.umich.edu    /// Constructor
2437099Sgblack@eecs.umich.edu    PredImmOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass) :
2447143Sgblack@eecs.umich.edu              PredOp(mnem, _machInst, __opClass),
2457143Sgblack@eecs.umich.edu              imm(machInst.imm), rotated_imm(0), rotated_carry(0),
2467110Sgblack@eecs.umich.edu              rotate(machInst.rotate << 1)
2476306Sgblack@eecs.umich.edu    {
2486306Sgblack@eecs.umich.edu        rotated_imm = rotate_imm(imm, rotate);
2496306Sgblack@eecs.umich.edu        if (rotate != 0)
2507110Sgblack@eecs.umich.edu            rotated_carry = bits(rotated_imm, 31);
2516306Sgblack@eecs.umich.edu    }
2526306Sgblack@eecs.umich.edu
25312616Sgabeblack@google.com    std::string generateDisassembly(
25412616Sgabeblack@google.com            Addr pc, const SymbolTable *symtab) const override;
2556253Sgblack@eecs.umich.edu};
2566253Sgblack@eecs.umich.edu
2576253Sgblack@eecs.umich.edu/**
2586253Sgblack@eecs.umich.edu * Base class for predicated integer operations.
2596253Sgblack@eecs.umich.edu */
2606253Sgblack@eecs.umich.educlass PredIntOp : public PredOp
2616253Sgblack@eecs.umich.edu{
2626306Sgblack@eecs.umich.edu    protected:
2636253Sgblack@eecs.umich.edu
2646306Sgblack@eecs.umich.edu    uint32_t shift_size;
2656306Sgblack@eecs.umich.edu    uint32_t shift;
2666253Sgblack@eecs.umich.edu
2676306Sgblack@eecs.umich.edu    /// Constructor
2687099Sgblack@eecs.umich.edu    PredIntOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass) :
2696306Sgblack@eecs.umich.edu              PredOp(mnem, _machInst, __opClass),
2706306Sgblack@eecs.umich.edu              shift_size(machInst.shiftSize), shift(machInst.shift)
2716306Sgblack@eecs.umich.edu    {
2726306Sgblack@eecs.umich.edu    }
2736306Sgblack@eecs.umich.edu
27412616Sgabeblack@google.com    std::string generateDisassembly(
27512616Sgabeblack@google.com            Addr pc, const SymbolTable *symtab) const override;
2766253Sgblack@eecs.umich.edu};
2776253Sgblack@eecs.umich.edu
2787137Sgblack@eecs.umich.educlass DataImmOp : public PredOp
2797137Sgblack@eecs.umich.edu{
2807137Sgblack@eecs.umich.edu  protected:
2817137Sgblack@eecs.umich.edu    IntRegIndex dest, op1;
2827137Sgblack@eecs.umich.edu    uint32_t imm;
2837137Sgblack@eecs.umich.edu    // Whether the carry flag should be modified if that's an option for
2847137Sgblack@eecs.umich.edu    // this instruction.
2857137Sgblack@eecs.umich.edu    bool rotC;
2867137Sgblack@eecs.umich.edu
2877137Sgblack@eecs.umich.edu    DataImmOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
2887137Sgblack@eecs.umich.edu              IntRegIndex _dest, IntRegIndex _op1, uint32_t _imm, bool _rotC) :
2897137Sgblack@eecs.umich.edu        PredOp(mnem, _machInst, __opClass),
2907137Sgblack@eecs.umich.edu        dest(_dest), op1(_op1), imm(_imm), rotC(_rotC)
2917137Sgblack@eecs.umich.edu    {}
2927142Sgblack@eecs.umich.edu
29312616Sgabeblack@google.com    std::string generateDisassembly(
29412616Sgabeblack@google.com            Addr pc, const SymbolTable *symtab) const override;
2957137Sgblack@eecs.umich.edu};
2967137Sgblack@eecs.umich.edu
2977137Sgblack@eecs.umich.educlass DataRegOp : public PredOp
2987137Sgblack@eecs.umich.edu{
2997137Sgblack@eecs.umich.edu  protected:
3007137Sgblack@eecs.umich.edu    IntRegIndex dest, op1, op2;
3017137Sgblack@eecs.umich.edu    int32_t shiftAmt;
3027137Sgblack@eecs.umich.edu    ArmShiftType shiftType;
3037137Sgblack@eecs.umich.edu
3047137Sgblack@eecs.umich.edu    DataRegOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
3057137Sgblack@eecs.umich.edu              IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _op2,
3067137Sgblack@eecs.umich.edu              int32_t _shiftAmt, ArmShiftType _shiftType) :
3077137Sgblack@eecs.umich.edu        PredOp(mnem, _machInst, __opClass),
3087137Sgblack@eecs.umich.edu        dest(_dest), op1(_op1), op2(_op2),
3097137Sgblack@eecs.umich.edu        shiftAmt(_shiftAmt), shiftType(_shiftType)
3107137Sgblack@eecs.umich.edu    {}
3117142Sgblack@eecs.umich.edu
31212616Sgabeblack@google.com    std::string generateDisassembly(
31312616Sgabeblack@google.com            Addr pc, const SymbolTable *symtab) const override;
3147137Sgblack@eecs.umich.edu};
3157137Sgblack@eecs.umich.edu
3167137Sgblack@eecs.umich.educlass DataRegRegOp : public PredOp
3177137Sgblack@eecs.umich.edu{
3187137Sgblack@eecs.umich.edu  protected:
3197137Sgblack@eecs.umich.edu    IntRegIndex dest, op1, op2, shift;
3207137Sgblack@eecs.umich.edu    ArmShiftType shiftType;
3217137Sgblack@eecs.umich.edu
3227137Sgblack@eecs.umich.edu    DataRegRegOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
3237137Sgblack@eecs.umich.edu                 IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _op2,
3247137Sgblack@eecs.umich.edu                 IntRegIndex _shift, ArmShiftType _shiftType) :
3257137Sgblack@eecs.umich.edu        PredOp(mnem, _machInst, __opClass),
3267137Sgblack@eecs.umich.edu        dest(_dest), op1(_op1), op2(_op2), shift(_shift),
3277137Sgblack@eecs.umich.edu        shiftType(_shiftType)
3287137Sgblack@eecs.umich.edu    {}
3297142Sgblack@eecs.umich.edu
33012616Sgabeblack@google.com    std::string generateDisassembly(
33112616Sgabeblack@google.com            Addr pc, const SymbolTable *symtab) const override;
3327137Sgblack@eecs.umich.edu};
3337137Sgblack@eecs.umich.edu
3346253Sgblack@eecs.umich.edu/**
3356253Sgblack@eecs.umich.edu * Base class for predicated macro-operations.
3366253Sgblack@eecs.umich.edu */
3376253Sgblack@eecs.umich.educlass PredMacroOp : public PredOp
3386253Sgblack@eecs.umich.edu{
3396306Sgblack@eecs.umich.edu    protected:
3406253Sgblack@eecs.umich.edu
3416306Sgblack@eecs.umich.edu    uint32_t numMicroops;
3426306Sgblack@eecs.umich.edu    StaticInstPtr * microOps;
3436253Sgblack@eecs.umich.edu
3446306Sgblack@eecs.umich.edu    /// Constructor
3457099Sgblack@eecs.umich.edu    PredMacroOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass) :
3466306Sgblack@eecs.umich.edu                PredOp(mnem, _machInst, __opClass),
34710537Sandreas.hansson@arm.com                numMicroops(0), microOps(nullptr)
3486306Sgblack@eecs.umich.edu    {
3496306Sgblack@eecs.umich.edu        // We rely on the subclasses of this object to handle the
3506306Sgblack@eecs.umich.edu        // initialization of the micro-operations, since they are
3516306Sgblack@eecs.umich.edu        // all of variable length
3526306Sgblack@eecs.umich.edu        flags[IsMacroop] = true;
3536306Sgblack@eecs.umich.edu    }
3546253Sgblack@eecs.umich.edu
3556306Sgblack@eecs.umich.edu    ~PredMacroOp()
3566306Sgblack@eecs.umich.edu    {
3576306Sgblack@eecs.umich.edu        if (numMicroops)
3586306Sgblack@eecs.umich.edu            delete [] microOps;
3596306Sgblack@eecs.umich.edu    }
3606253Sgblack@eecs.umich.edu
3616306Sgblack@eecs.umich.edu    StaticInstPtr
36212616Sgabeblack@google.com    fetchMicroop(MicroPC microPC) const override
3636306Sgblack@eecs.umich.edu    {
3646306Sgblack@eecs.umich.edu        assert(microPC < numMicroops);
3656306Sgblack@eecs.umich.edu        return microOps[microPC];
3666306Sgblack@eecs.umich.edu    }
3676253Sgblack@eecs.umich.edu
36812236Sgabeblack@google.com    Fault
36912616Sgabeblack@google.com    execute(ExecContext *, Trace::InstRecord *) const override
37012236Sgabeblack@google.com    {
37112236Sgabeblack@google.com        panic("Execute method called when it shouldn't!");
37212236Sgabeblack@google.com    }
37312236Sgabeblack@google.com
37412616Sgabeblack@google.com    std::string generateDisassembly(
37512616Sgabeblack@google.com            Addr pc, const SymbolTable *symtab) const override;
3766253Sgblack@eecs.umich.edu};
3776253Sgblack@eecs.umich.edu
3786253Sgblack@eecs.umich.edu/**
3796253Sgblack@eecs.umich.edu * Base class for predicated micro-operations.
3806253Sgblack@eecs.umich.edu */
3816253Sgblack@eecs.umich.educlass PredMicroop : public PredOp
3826253Sgblack@eecs.umich.edu{
3836306Sgblack@eecs.umich.edu    /// Constructor
3847099Sgblack@eecs.umich.edu    PredMicroop(const char *mnem, ExtMachInst _machInst, OpClass __opClass) :
3856306Sgblack@eecs.umich.edu                PredOp(mnem, _machInst, __opClass)
3866306Sgblack@eecs.umich.edu    {
3876306Sgblack@eecs.umich.edu        flags[IsMicroop] = true;
3886306Sgblack@eecs.umich.edu    }
3897720Sgblack@eecs.umich.edu
3907720Sgblack@eecs.umich.edu    void
3917720Sgblack@eecs.umich.edu    advancePC(PCState &pcState) const
3927720Sgblack@eecs.umich.edu    {
3937720Sgblack@eecs.umich.edu        if (flags[IsLastMicroop])
3947720Sgblack@eecs.umich.edu            pcState.uEnd();
3957720Sgblack@eecs.umich.edu        else
3967720Sgblack@eecs.umich.edu            pcState.uAdvance();
3977720Sgblack@eecs.umich.edu    }
3986253Sgblack@eecs.umich.edu};
3996253Sgblack@eecs.umich.edu}
4006253Sgblack@eecs.umich.edu
4016253Sgblack@eecs.umich.edu#endif //__ARCH_ARM_INSTS_PREDINST_HH__
402