1*55c2a12cSMichael Clark /* 2*55c2a12cSMichael Clark * RISC-V emulation for qemu: Instruction decode helpers 3*55c2a12cSMichael Clark * 4*55c2a12cSMichael Clark * Copyright (c) 2016-2017 Sagar Karandikar, sagark@eecs.berkeley.edu 5*55c2a12cSMichael Clark * 6*55c2a12cSMichael Clark * This program is free software; you can redistribute it and/or modify it 7*55c2a12cSMichael Clark * under the terms and conditions of the GNU General Public License, 8*55c2a12cSMichael Clark * version 2 or later, as published by the Free Software Foundation. 9*55c2a12cSMichael Clark * 10*55c2a12cSMichael Clark * This program is distributed in the hope it will be useful, but WITHOUT 11*55c2a12cSMichael Clark * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12*55c2a12cSMichael Clark * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 13*55c2a12cSMichael Clark * more details. 14*55c2a12cSMichael Clark * 15*55c2a12cSMichael Clark * You should have received a copy of the GNU General Public License along with 16*55c2a12cSMichael Clark * this program. If not, see <http://www.gnu.org/licenses/>. 17*55c2a12cSMichael Clark */ 18*55c2a12cSMichael Clark 19*55c2a12cSMichael Clark #define MASK_OP_MAJOR(op) (op & 0x7F) 20*55c2a12cSMichael Clark enum { 21*55c2a12cSMichael Clark /* rv32i, rv64i, rv32m */ 22*55c2a12cSMichael Clark OPC_RISC_LUI = (0x37), 23*55c2a12cSMichael Clark OPC_RISC_AUIPC = (0x17), 24*55c2a12cSMichael Clark OPC_RISC_JAL = (0x6F), 25*55c2a12cSMichael Clark OPC_RISC_JALR = (0x67), 26*55c2a12cSMichael Clark OPC_RISC_BRANCH = (0x63), 27*55c2a12cSMichael Clark OPC_RISC_LOAD = (0x03), 28*55c2a12cSMichael Clark OPC_RISC_STORE = (0x23), 29*55c2a12cSMichael Clark OPC_RISC_ARITH_IMM = (0x13), 30*55c2a12cSMichael Clark OPC_RISC_ARITH = (0x33), 31*55c2a12cSMichael Clark OPC_RISC_FENCE = (0x0F), 32*55c2a12cSMichael Clark OPC_RISC_SYSTEM = (0x73), 33*55c2a12cSMichael Clark 34*55c2a12cSMichael Clark /* rv64i, rv64m */ 35*55c2a12cSMichael Clark OPC_RISC_ARITH_IMM_W = (0x1B), 36*55c2a12cSMichael Clark OPC_RISC_ARITH_W = (0x3B), 37*55c2a12cSMichael Clark 38*55c2a12cSMichael Clark /* rv32a, rv64a */ 39*55c2a12cSMichael Clark OPC_RISC_ATOMIC = (0x2F), 40*55c2a12cSMichael Clark 41*55c2a12cSMichael Clark /* floating point */ 42*55c2a12cSMichael Clark OPC_RISC_FP_LOAD = (0x7), 43*55c2a12cSMichael Clark OPC_RISC_FP_STORE = (0x27), 44*55c2a12cSMichael Clark 45*55c2a12cSMichael Clark OPC_RISC_FMADD = (0x43), 46*55c2a12cSMichael Clark OPC_RISC_FMSUB = (0x47), 47*55c2a12cSMichael Clark OPC_RISC_FNMSUB = (0x4B), 48*55c2a12cSMichael Clark OPC_RISC_FNMADD = (0x4F), 49*55c2a12cSMichael Clark 50*55c2a12cSMichael Clark OPC_RISC_FP_ARITH = (0x53), 51*55c2a12cSMichael Clark }; 52*55c2a12cSMichael Clark 53*55c2a12cSMichael Clark #define MASK_OP_ARITH(op) (MASK_OP_MAJOR(op) | (op & ((0x7 << 12) | \ 54*55c2a12cSMichael Clark (0x7F << 25)))) 55*55c2a12cSMichael Clark enum { 56*55c2a12cSMichael Clark OPC_RISC_ADD = OPC_RISC_ARITH | (0x0 << 12) | (0x00 << 25), 57*55c2a12cSMichael Clark OPC_RISC_SUB = OPC_RISC_ARITH | (0x0 << 12) | (0x20 << 25), 58*55c2a12cSMichael Clark OPC_RISC_SLL = OPC_RISC_ARITH | (0x1 << 12) | (0x00 << 25), 59*55c2a12cSMichael Clark OPC_RISC_SLT = OPC_RISC_ARITH | (0x2 << 12) | (0x00 << 25), 60*55c2a12cSMichael Clark OPC_RISC_SLTU = OPC_RISC_ARITH | (0x3 << 12) | (0x00 << 25), 61*55c2a12cSMichael Clark OPC_RISC_XOR = OPC_RISC_ARITH | (0x4 << 12) | (0x00 << 25), 62*55c2a12cSMichael Clark OPC_RISC_SRL = OPC_RISC_ARITH | (0x5 << 12) | (0x00 << 25), 63*55c2a12cSMichael Clark OPC_RISC_SRA = OPC_RISC_ARITH | (0x5 << 12) | (0x20 << 25), 64*55c2a12cSMichael Clark OPC_RISC_OR = OPC_RISC_ARITH | (0x6 << 12) | (0x00 << 25), 65*55c2a12cSMichael Clark OPC_RISC_AND = OPC_RISC_ARITH | (0x7 << 12) | (0x00 << 25), 66*55c2a12cSMichael Clark 67*55c2a12cSMichael Clark /* RV64M */ 68*55c2a12cSMichael Clark OPC_RISC_MUL = OPC_RISC_ARITH | (0x0 << 12) | (0x01 << 25), 69*55c2a12cSMichael Clark OPC_RISC_MULH = OPC_RISC_ARITH | (0x1 << 12) | (0x01 << 25), 70*55c2a12cSMichael Clark OPC_RISC_MULHSU = OPC_RISC_ARITH | (0x2 << 12) | (0x01 << 25), 71*55c2a12cSMichael Clark OPC_RISC_MULHU = OPC_RISC_ARITH | (0x3 << 12) | (0x01 << 25), 72*55c2a12cSMichael Clark 73*55c2a12cSMichael Clark OPC_RISC_DIV = OPC_RISC_ARITH | (0x4 << 12) | (0x01 << 25), 74*55c2a12cSMichael Clark OPC_RISC_DIVU = OPC_RISC_ARITH | (0x5 << 12) | (0x01 << 25), 75*55c2a12cSMichael Clark OPC_RISC_REM = OPC_RISC_ARITH | (0x6 << 12) | (0x01 << 25), 76*55c2a12cSMichael Clark OPC_RISC_REMU = OPC_RISC_ARITH | (0x7 << 12) | (0x01 << 25), 77*55c2a12cSMichael Clark }; 78*55c2a12cSMichael Clark 79*55c2a12cSMichael Clark 80*55c2a12cSMichael Clark #define MASK_OP_ARITH_IMM(op) (MASK_OP_MAJOR(op) | (op & (0x7 << 12))) 81*55c2a12cSMichael Clark enum { 82*55c2a12cSMichael Clark OPC_RISC_ADDI = OPC_RISC_ARITH_IMM | (0x0 << 12), 83*55c2a12cSMichael Clark OPC_RISC_SLTI = OPC_RISC_ARITH_IMM | (0x2 << 12), 84*55c2a12cSMichael Clark OPC_RISC_SLTIU = OPC_RISC_ARITH_IMM | (0x3 << 12), 85*55c2a12cSMichael Clark OPC_RISC_XORI = OPC_RISC_ARITH_IMM | (0x4 << 12), 86*55c2a12cSMichael Clark OPC_RISC_ORI = OPC_RISC_ARITH_IMM | (0x6 << 12), 87*55c2a12cSMichael Clark OPC_RISC_ANDI = OPC_RISC_ARITH_IMM | (0x7 << 12), 88*55c2a12cSMichael Clark OPC_RISC_SLLI = OPC_RISC_ARITH_IMM | (0x1 << 12), /* additional part of 89*55c2a12cSMichael Clark IMM */ 90*55c2a12cSMichael Clark OPC_RISC_SHIFT_RIGHT_I = OPC_RISC_ARITH_IMM | (0x5 << 12) /* SRAI, SRLI */ 91*55c2a12cSMichael Clark }; 92*55c2a12cSMichael Clark 93*55c2a12cSMichael Clark #define MASK_OP_BRANCH(op) (MASK_OP_MAJOR(op) | (op & (0x7 << 12))) 94*55c2a12cSMichael Clark enum { 95*55c2a12cSMichael Clark OPC_RISC_BEQ = OPC_RISC_BRANCH | (0x0 << 12), 96*55c2a12cSMichael Clark OPC_RISC_BNE = OPC_RISC_BRANCH | (0x1 << 12), 97*55c2a12cSMichael Clark OPC_RISC_BLT = OPC_RISC_BRANCH | (0x4 << 12), 98*55c2a12cSMichael Clark OPC_RISC_BGE = OPC_RISC_BRANCH | (0x5 << 12), 99*55c2a12cSMichael Clark OPC_RISC_BLTU = OPC_RISC_BRANCH | (0x6 << 12), 100*55c2a12cSMichael Clark OPC_RISC_BGEU = OPC_RISC_BRANCH | (0x7 << 12) 101*55c2a12cSMichael Clark }; 102*55c2a12cSMichael Clark 103*55c2a12cSMichael Clark enum { 104*55c2a12cSMichael Clark OPC_RISC_ADDIW = OPC_RISC_ARITH_IMM_W | (0x0 << 12), 105*55c2a12cSMichael Clark OPC_RISC_SLLIW = OPC_RISC_ARITH_IMM_W | (0x1 << 12), /* additional part of 106*55c2a12cSMichael Clark IMM */ 107*55c2a12cSMichael Clark OPC_RISC_SHIFT_RIGHT_IW = OPC_RISC_ARITH_IMM_W | (0x5 << 12) /* SRAI, SRLI 108*55c2a12cSMichael Clark */ 109*55c2a12cSMichael Clark }; 110*55c2a12cSMichael Clark 111*55c2a12cSMichael Clark enum { 112*55c2a12cSMichael Clark OPC_RISC_ADDW = OPC_RISC_ARITH_W | (0x0 << 12) | (0x00 << 25), 113*55c2a12cSMichael Clark OPC_RISC_SUBW = OPC_RISC_ARITH_W | (0x0 << 12) | (0x20 << 25), 114*55c2a12cSMichael Clark OPC_RISC_SLLW = OPC_RISC_ARITH_W | (0x1 << 12) | (0x00 << 25), 115*55c2a12cSMichael Clark OPC_RISC_SRLW = OPC_RISC_ARITH_W | (0x5 << 12) | (0x00 << 25), 116*55c2a12cSMichael Clark OPC_RISC_SRAW = OPC_RISC_ARITH_W | (0x5 << 12) | (0x20 << 25), 117*55c2a12cSMichael Clark 118*55c2a12cSMichael Clark /* RV64M */ 119*55c2a12cSMichael Clark OPC_RISC_MULW = OPC_RISC_ARITH_W | (0x0 << 12) | (0x01 << 25), 120*55c2a12cSMichael Clark OPC_RISC_DIVW = OPC_RISC_ARITH_W | (0x4 << 12) | (0x01 << 25), 121*55c2a12cSMichael Clark OPC_RISC_DIVUW = OPC_RISC_ARITH_W | (0x5 << 12) | (0x01 << 25), 122*55c2a12cSMichael Clark OPC_RISC_REMW = OPC_RISC_ARITH_W | (0x6 << 12) | (0x01 << 25), 123*55c2a12cSMichael Clark OPC_RISC_REMUW = OPC_RISC_ARITH_W | (0x7 << 12) | (0x01 << 25), 124*55c2a12cSMichael Clark }; 125*55c2a12cSMichael Clark 126*55c2a12cSMichael Clark #define MASK_OP_LOAD(op) (MASK_OP_MAJOR(op) | (op & (0x7 << 12))) 127*55c2a12cSMichael Clark enum { 128*55c2a12cSMichael Clark OPC_RISC_LB = OPC_RISC_LOAD | (0x0 << 12), 129*55c2a12cSMichael Clark OPC_RISC_LH = OPC_RISC_LOAD | (0x1 << 12), 130*55c2a12cSMichael Clark OPC_RISC_LW = OPC_RISC_LOAD | (0x2 << 12), 131*55c2a12cSMichael Clark OPC_RISC_LD = OPC_RISC_LOAD | (0x3 << 12), 132*55c2a12cSMichael Clark OPC_RISC_LBU = OPC_RISC_LOAD | (0x4 << 12), 133*55c2a12cSMichael Clark OPC_RISC_LHU = OPC_RISC_LOAD | (0x5 << 12), 134*55c2a12cSMichael Clark OPC_RISC_LWU = OPC_RISC_LOAD | (0x6 << 12), 135*55c2a12cSMichael Clark }; 136*55c2a12cSMichael Clark 137*55c2a12cSMichael Clark #define MASK_OP_STORE(op) (MASK_OP_MAJOR(op) | (op & (0x7 << 12))) 138*55c2a12cSMichael Clark enum { 139*55c2a12cSMichael Clark OPC_RISC_SB = OPC_RISC_STORE | (0x0 << 12), 140*55c2a12cSMichael Clark OPC_RISC_SH = OPC_RISC_STORE | (0x1 << 12), 141*55c2a12cSMichael Clark OPC_RISC_SW = OPC_RISC_STORE | (0x2 << 12), 142*55c2a12cSMichael Clark OPC_RISC_SD = OPC_RISC_STORE | (0x3 << 12), 143*55c2a12cSMichael Clark }; 144*55c2a12cSMichael Clark 145*55c2a12cSMichael Clark #define MASK_OP_JALR(op) (MASK_OP_MAJOR(op) | (op & (0x7 << 12))) 146*55c2a12cSMichael Clark /* no enum since OPC_RISC_JALR is the actual value */ 147*55c2a12cSMichael Clark 148*55c2a12cSMichael Clark #define MASK_OP_ATOMIC(op) \ 149*55c2a12cSMichael Clark (MASK_OP_MAJOR(op) | (op & ((0x7 << 12) | (0x7F << 25)))) 150*55c2a12cSMichael Clark #define MASK_OP_ATOMIC_NO_AQ_RL_SZ(op) \ 151*55c2a12cSMichael Clark (MASK_OP_MAJOR(op) | (op & (0x1F << 27))) 152*55c2a12cSMichael Clark 153*55c2a12cSMichael Clark enum { 154*55c2a12cSMichael Clark OPC_RISC_LR = OPC_RISC_ATOMIC | (0x02 << 27), 155*55c2a12cSMichael Clark OPC_RISC_SC = OPC_RISC_ATOMIC | (0x03 << 27), 156*55c2a12cSMichael Clark OPC_RISC_AMOSWAP = OPC_RISC_ATOMIC | (0x01 << 27), 157*55c2a12cSMichael Clark OPC_RISC_AMOADD = OPC_RISC_ATOMIC | (0x00 << 27), 158*55c2a12cSMichael Clark OPC_RISC_AMOXOR = OPC_RISC_ATOMIC | (0x04 << 27), 159*55c2a12cSMichael Clark OPC_RISC_AMOAND = OPC_RISC_ATOMIC | (0x0C << 27), 160*55c2a12cSMichael Clark OPC_RISC_AMOOR = OPC_RISC_ATOMIC | (0x08 << 27), 161*55c2a12cSMichael Clark OPC_RISC_AMOMIN = OPC_RISC_ATOMIC | (0x10 << 27), 162*55c2a12cSMichael Clark OPC_RISC_AMOMAX = OPC_RISC_ATOMIC | (0x14 << 27), 163*55c2a12cSMichael Clark OPC_RISC_AMOMINU = OPC_RISC_ATOMIC | (0x18 << 27), 164*55c2a12cSMichael Clark OPC_RISC_AMOMAXU = OPC_RISC_ATOMIC | (0x1C << 27), 165*55c2a12cSMichael Clark }; 166*55c2a12cSMichael Clark 167*55c2a12cSMichael Clark #define MASK_OP_SYSTEM(op) (MASK_OP_MAJOR(op) | (op & (0x7 << 12))) 168*55c2a12cSMichael Clark enum { 169*55c2a12cSMichael Clark OPC_RISC_ECALL = OPC_RISC_SYSTEM | (0x0 << 12), 170*55c2a12cSMichael Clark OPC_RISC_EBREAK = OPC_RISC_SYSTEM | (0x0 << 12), 171*55c2a12cSMichael Clark OPC_RISC_ERET = OPC_RISC_SYSTEM | (0x0 << 12), 172*55c2a12cSMichael Clark OPC_RISC_MRTS = OPC_RISC_SYSTEM | (0x0 << 12), 173*55c2a12cSMichael Clark OPC_RISC_MRTH = OPC_RISC_SYSTEM | (0x0 << 12), 174*55c2a12cSMichael Clark OPC_RISC_HRTS = OPC_RISC_SYSTEM | (0x0 << 12), 175*55c2a12cSMichael Clark OPC_RISC_WFI = OPC_RISC_SYSTEM | (0x0 << 12), 176*55c2a12cSMichael Clark OPC_RISC_SFENCEVM = OPC_RISC_SYSTEM | (0x0 << 12), 177*55c2a12cSMichael Clark 178*55c2a12cSMichael Clark OPC_RISC_CSRRW = OPC_RISC_SYSTEM | (0x1 << 12), 179*55c2a12cSMichael Clark OPC_RISC_CSRRS = OPC_RISC_SYSTEM | (0x2 << 12), 180*55c2a12cSMichael Clark OPC_RISC_CSRRC = OPC_RISC_SYSTEM | (0x3 << 12), 181*55c2a12cSMichael Clark OPC_RISC_CSRRWI = OPC_RISC_SYSTEM | (0x5 << 12), 182*55c2a12cSMichael Clark OPC_RISC_CSRRSI = OPC_RISC_SYSTEM | (0x6 << 12), 183*55c2a12cSMichael Clark OPC_RISC_CSRRCI = OPC_RISC_SYSTEM | (0x7 << 12), 184*55c2a12cSMichael Clark }; 185*55c2a12cSMichael Clark 186*55c2a12cSMichael Clark #define MASK_OP_FP_LOAD(op) (MASK_OP_MAJOR(op) | (op & (0x7 << 12))) 187*55c2a12cSMichael Clark enum { 188*55c2a12cSMichael Clark OPC_RISC_FLW = OPC_RISC_FP_LOAD | (0x2 << 12), 189*55c2a12cSMichael Clark OPC_RISC_FLD = OPC_RISC_FP_LOAD | (0x3 << 12), 190*55c2a12cSMichael Clark }; 191*55c2a12cSMichael Clark 192*55c2a12cSMichael Clark #define MASK_OP_FP_STORE(op) (MASK_OP_MAJOR(op) | (op & (0x7 << 12))) 193*55c2a12cSMichael Clark enum { 194*55c2a12cSMichael Clark OPC_RISC_FSW = OPC_RISC_FP_STORE | (0x2 << 12), 195*55c2a12cSMichael Clark OPC_RISC_FSD = OPC_RISC_FP_STORE | (0x3 << 12), 196*55c2a12cSMichael Clark }; 197*55c2a12cSMichael Clark 198*55c2a12cSMichael Clark #define MASK_OP_FP_FMADD(op) (MASK_OP_MAJOR(op) | (op & (0x3 << 25))) 199*55c2a12cSMichael Clark enum { 200*55c2a12cSMichael Clark OPC_RISC_FMADD_S = OPC_RISC_FMADD | (0x0 << 25), 201*55c2a12cSMichael Clark OPC_RISC_FMADD_D = OPC_RISC_FMADD | (0x1 << 25), 202*55c2a12cSMichael Clark }; 203*55c2a12cSMichael Clark 204*55c2a12cSMichael Clark #define MASK_OP_FP_FMSUB(op) (MASK_OP_MAJOR(op) | (op & (0x3 << 25))) 205*55c2a12cSMichael Clark enum { 206*55c2a12cSMichael Clark OPC_RISC_FMSUB_S = OPC_RISC_FMSUB | (0x0 << 25), 207*55c2a12cSMichael Clark OPC_RISC_FMSUB_D = OPC_RISC_FMSUB | (0x1 << 25), 208*55c2a12cSMichael Clark }; 209*55c2a12cSMichael Clark 210*55c2a12cSMichael Clark #define MASK_OP_FP_FNMADD(op) (MASK_OP_MAJOR(op) | (op & (0x3 << 25))) 211*55c2a12cSMichael Clark enum { 212*55c2a12cSMichael Clark OPC_RISC_FNMADD_S = OPC_RISC_FNMADD | (0x0 << 25), 213*55c2a12cSMichael Clark OPC_RISC_FNMADD_D = OPC_RISC_FNMADD | (0x1 << 25), 214*55c2a12cSMichael Clark }; 215*55c2a12cSMichael Clark 216*55c2a12cSMichael Clark #define MASK_OP_FP_FNMSUB(op) (MASK_OP_MAJOR(op) | (op & (0x3 << 25))) 217*55c2a12cSMichael Clark enum { 218*55c2a12cSMichael Clark OPC_RISC_FNMSUB_S = OPC_RISC_FNMSUB | (0x0 << 25), 219*55c2a12cSMichael Clark OPC_RISC_FNMSUB_D = OPC_RISC_FNMSUB | (0x1 << 25), 220*55c2a12cSMichael Clark }; 221*55c2a12cSMichael Clark 222*55c2a12cSMichael Clark #define MASK_OP_FP_ARITH(op) (MASK_OP_MAJOR(op) | (op & (0x7F << 25))) 223*55c2a12cSMichael Clark enum { 224*55c2a12cSMichael Clark /* float */ 225*55c2a12cSMichael Clark OPC_RISC_FADD_S = OPC_RISC_FP_ARITH | (0x0 << 25), 226*55c2a12cSMichael Clark OPC_RISC_FSUB_S = OPC_RISC_FP_ARITH | (0x4 << 25), 227*55c2a12cSMichael Clark OPC_RISC_FMUL_S = OPC_RISC_FP_ARITH | (0x8 << 25), 228*55c2a12cSMichael Clark OPC_RISC_FDIV_S = OPC_RISC_FP_ARITH | (0xC << 25), 229*55c2a12cSMichael Clark 230*55c2a12cSMichael Clark OPC_RISC_FSGNJ_S = OPC_RISC_FP_ARITH | (0x10 << 25), 231*55c2a12cSMichael Clark OPC_RISC_FSGNJN_S = OPC_RISC_FP_ARITH | (0x10 << 25), 232*55c2a12cSMichael Clark OPC_RISC_FSGNJX_S = OPC_RISC_FP_ARITH | (0x10 << 25), 233*55c2a12cSMichael Clark 234*55c2a12cSMichael Clark OPC_RISC_FMIN_S = OPC_RISC_FP_ARITH | (0x14 << 25), 235*55c2a12cSMichael Clark OPC_RISC_FMAX_S = OPC_RISC_FP_ARITH | (0x14 << 25), 236*55c2a12cSMichael Clark 237*55c2a12cSMichael Clark OPC_RISC_FSQRT_S = OPC_RISC_FP_ARITH | (0x2C << 25), 238*55c2a12cSMichael Clark 239*55c2a12cSMichael Clark OPC_RISC_FEQ_S = OPC_RISC_FP_ARITH | (0x50 << 25), 240*55c2a12cSMichael Clark OPC_RISC_FLT_S = OPC_RISC_FP_ARITH | (0x50 << 25), 241*55c2a12cSMichael Clark OPC_RISC_FLE_S = OPC_RISC_FP_ARITH | (0x50 << 25), 242*55c2a12cSMichael Clark 243*55c2a12cSMichael Clark OPC_RISC_FCVT_W_S = OPC_RISC_FP_ARITH | (0x60 << 25), 244*55c2a12cSMichael Clark OPC_RISC_FCVT_WU_S = OPC_RISC_FP_ARITH | (0x60 << 25), 245*55c2a12cSMichael Clark OPC_RISC_FCVT_L_S = OPC_RISC_FP_ARITH | (0x60 << 25), 246*55c2a12cSMichael Clark OPC_RISC_FCVT_LU_S = OPC_RISC_FP_ARITH | (0x60 << 25), 247*55c2a12cSMichael Clark 248*55c2a12cSMichael Clark OPC_RISC_FCVT_S_W = OPC_RISC_FP_ARITH | (0x68 << 25), 249*55c2a12cSMichael Clark OPC_RISC_FCVT_S_WU = OPC_RISC_FP_ARITH | (0x68 << 25), 250*55c2a12cSMichael Clark OPC_RISC_FCVT_S_L = OPC_RISC_FP_ARITH | (0x68 << 25), 251*55c2a12cSMichael Clark OPC_RISC_FCVT_S_LU = OPC_RISC_FP_ARITH | (0x68 << 25), 252*55c2a12cSMichael Clark 253*55c2a12cSMichael Clark OPC_RISC_FMV_X_S = OPC_RISC_FP_ARITH | (0x70 << 25), 254*55c2a12cSMichael Clark OPC_RISC_FCLASS_S = OPC_RISC_FP_ARITH | (0x70 << 25), 255*55c2a12cSMichael Clark 256*55c2a12cSMichael Clark OPC_RISC_FMV_S_X = OPC_RISC_FP_ARITH | (0x78 << 25), 257*55c2a12cSMichael Clark 258*55c2a12cSMichael Clark /* double */ 259*55c2a12cSMichael Clark OPC_RISC_FADD_D = OPC_RISC_FP_ARITH | (0x1 << 25), 260*55c2a12cSMichael Clark OPC_RISC_FSUB_D = OPC_RISC_FP_ARITH | (0x5 << 25), 261*55c2a12cSMichael Clark OPC_RISC_FMUL_D = OPC_RISC_FP_ARITH | (0x9 << 25), 262*55c2a12cSMichael Clark OPC_RISC_FDIV_D = OPC_RISC_FP_ARITH | (0xD << 25), 263*55c2a12cSMichael Clark 264*55c2a12cSMichael Clark OPC_RISC_FSGNJ_D = OPC_RISC_FP_ARITH | (0x11 << 25), 265*55c2a12cSMichael Clark OPC_RISC_FSGNJN_D = OPC_RISC_FP_ARITH | (0x11 << 25), 266*55c2a12cSMichael Clark OPC_RISC_FSGNJX_D = OPC_RISC_FP_ARITH | (0x11 << 25), 267*55c2a12cSMichael Clark 268*55c2a12cSMichael Clark OPC_RISC_FMIN_D = OPC_RISC_FP_ARITH | (0x15 << 25), 269*55c2a12cSMichael Clark OPC_RISC_FMAX_D = OPC_RISC_FP_ARITH | (0x15 << 25), 270*55c2a12cSMichael Clark 271*55c2a12cSMichael Clark OPC_RISC_FCVT_S_D = OPC_RISC_FP_ARITH | (0x20 << 25), 272*55c2a12cSMichael Clark 273*55c2a12cSMichael Clark OPC_RISC_FCVT_D_S = OPC_RISC_FP_ARITH | (0x21 << 25), 274*55c2a12cSMichael Clark 275*55c2a12cSMichael Clark OPC_RISC_FSQRT_D = OPC_RISC_FP_ARITH | (0x2D << 25), 276*55c2a12cSMichael Clark 277*55c2a12cSMichael Clark OPC_RISC_FEQ_D = OPC_RISC_FP_ARITH | (0x51 << 25), 278*55c2a12cSMichael Clark OPC_RISC_FLT_D = OPC_RISC_FP_ARITH | (0x51 << 25), 279*55c2a12cSMichael Clark OPC_RISC_FLE_D = OPC_RISC_FP_ARITH | (0x51 << 25), 280*55c2a12cSMichael Clark 281*55c2a12cSMichael Clark OPC_RISC_FCVT_W_D = OPC_RISC_FP_ARITH | (0x61 << 25), 282*55c2a12cSMichael Clark OPC_RISC_FCVT_WU_D = OPC_RISC_FP_ARITH | (0x61 << 25), 283*55c2a12cSMichael Clark OPC_RISC_FCVT_L_D = OPC_RISC_FP_ARITH | (0x61 << 25), 284*55c2a12cSMichael Clark OPC_RISC_FCVT_LU_D = OPC_RISC_FP_ARITH | (0x61 << 25), 285*55c2a12cSMichael Clark 286*55c2a12cSMichael Clark OPC_RISC_FCVT_D_W = OPC_RISC_FP_ARITH | (0x69 << 25), 287*55c2a12cSMichael Clark OPC_RISC_FCVT_D_WU = OPC_RISC_FP_ARITH | (0x69 << 25), 288*55c2a12cSMichael Clark OPC_RISC_FCVT_D_L = OPC_RISC_FP_ARITH | (0x69 << 25), 289*55c2a12cSMichael Clark OPC_RISC_FCVT_D_LU = OPC_RISC_FP_ARITH | (0x69 << 25), 290*55c2a12cSMichael Clark 291*55c2a12cSMichael Clark OPC_RISC_FMV_X_D = OPC_RISC_FP_ARITH | (0x71 << 25), 292*55c2a12cSMichael Clark OPC_RISC_FCLASS_D = OPC_RISC_FP_ARITH | (0x71 << 25), 293*55c2a12cSMichael Clark 294*55c2a12cSMichael Clark OPC_RISC_FMV_D_X = OPC_RISC_FP_ARITH | (0x79 << 25), 295*55c2a12cSMichael Clark }; 296*55c2a12cSMichael Clark 297*55c2a12cSMichael Clark #define GET_B_IMM(inst) ((extract32(inst, 8, 4) << 1) \ 298*55c2a12cSMichael Clark | (extract32(inst, 25, 6) << 5) \ 299*55c2a12cSMichael Clark | (extract32(inst, 7, 1) << 11) \ 300*55c2a12cSMichael Clark | (sextract64(inst, 31, 1) << 12)) 301*55c2a12cSMichael Clark 302*55c2a12cSMichael Clark #define GET_STORE_IMM(inst) ((extract32(inst, 7, 5)) \ 303*55c2a12cSMichael Clark | (sextract64(inst, 25, 7) << 5)) 304*55c2a12cSMichael Clark 305*55c2a12cSMichael Clark #define GET_JAL_IMM(inst) ((extract32(inst, 21, 10) << 1) \ 306*55c2a12cSMichael Clark | (extract32(inst, 20, 1) << 11) \ 307*55c2a12cSMichael Clark | (extract32(inst, 12, 8) << 12) \ 308*55c2a12cSMichael Clark | (sextract64(inst, 31, 1) << 20)) 309*55c2a12cSMichael Clark 310*55c2a12cSMichael Clark #define GET_RM(inst) extract32(inst, 12, 3) 311*55c2a12cSMichael Clark #define GET_RS3(inst) extract32(inst, 27, 5) 312*55c2a12cSMichael Clark #define GET_RS1(inst) extract32(inst, 15, 5) 313*55c2a12cSMichael Clark #define GET_RS2(inst) extract32(inst, 20, 5) 314*55c2a12cSMichael Clark #define GET_RD(inst) extract32(inst, 7, 5) 315*55c2a12cSMichael Clark #define GET_IMM(inst) sextract64(inst, 20, 12) 316*55c2a12cSMichael Clark 317*55c2a12cSMichael Clark /* RVC decoding macros */ 318*55c2a12cSMichael Clark #define GET_C_IMM(inst) (extract32(inst, 2, 5) \ 319*55c2a12cSMichael Clark | (sextract64(inst, 12, 1) << 5)) 320*55c2a12cSMichael Clark #define GET_C_ZIMM(inst) (extract32(inst, 2, 5) \ 321*55c2a12cSMichael Clark | (extract32(inst, 12, 1) << 5)) 322*55c2a12cSMichael Clark #define GET_C_ADDI4SPN_IMM(inst) ((extract32(inst, 6, 1) << 2) \ 323*55c2a12cSMichael Clark | (extract32(inst, 5, 1) << 3) \ 324*55c2a12cSMichael Clark | (extract32(inst, 11, 2) << 4) \ 325*55c2a12cSMichael Clark | (extract32(inst, 7, 4) << 6)) 326*55c2a12cSMichael Clark #define GET_C_ADDI16SP_IMM(inst) ((extract32(inst, 6, 1) << 4) \ 327*55c2a12cSMichael Clark | (extract32(inst, 2, 1) << 5) \ 328*55c2a12cSMichael Clark | (extract32(inst, 5, 1) << 6) \ 329*55c2a12cSMichael Clark | (extract32(inst, 3, 2) << 7) \ 330*55c2a12cSMichael Clark | (sextract64(inst, 12, 1) << 9)) 331*55c2a12cSMichael Clark #define GET_C_LWSP_IMM(inst) ((extract32(inst, 4, 3) << 2) \ 332*55c2a12cSMichael Clark | (extract32(inst, 12, 1) << 5) \ 333*55c2a12cSMichael Clark | (extract32(inst, 2, 2) << 6)) 334*55c2a12cSMichael Clark #define GET_C_LDSP_IMM(inst) ((extract32(inst, 5, 2) << 3) \ 335*55c2a12cSMichael Clark | (extract32(inst, 12, 1) << 5) \ 336*55c2a12cSMichael Clark | (extract32(inst, 2, 3) << 6)) 337*55c2a12cSMichael Clark #define GET_C_SWSP_IMM(inst) ((extract32(inst, 9, 4) << 2) \ 338*55c2a12cSMichael Clark | (extract32(inst, 7, 2) << 6)) 339*55c2a12cSMichael Clark #define GET_C_SDSP_IMM(inst) ((extract32(inst, 10, 3) << 3) \ 340*55c2a12cSMichael Clark | (extract32(inst, 7, 3) << 6)) 341*55c2a12cSMichael Clark #define GET_C_LW_IMM(inst) ((extract32(inst, 6, 1) << 2) \ 342*55c2a12cSMichael Clark | (extract32(inst, 10, 3) << 3) \ 343*55c2a12cSMichael Clark | (extract32(inst, 5, 1) << 6)) 344*55c2a12cSMichael Clark #define GET_C_LD_IMM(inst) ((extract32(inst, 10, 3) << 3) \ 345*55c2a12cSMichael Clark | (extract32(inst, 5, 2) << 6)) 346*55c2a12cSMichael Clark #define GET_C_J_IMM(inst) ((extract32(inst, 3, 3) << 1) \ 347*55c2a12cSMichael Clark | (extract32(inst, 11, 1) << 4) \ 348*55c2a12cSMichael Clark | (extract32(inst, 2, 1) << 5) \ 349*55c2a12cSMichael Clark | (extract32(inst, 7, 1) << 6) \ 350*55c2a12cSMichael Clark | (extract32(inst, 6, 1) << 7) \ 351*55c2a12cSMichael Clark | (extract32(inst, 9, 2) << 8) \ 352*55c2a12cSMichael Clark | (extract32(inst, 8, 1) << 10) \ 353*55c2a12cSMichael Clark | (sextract64(inst, 12, 1) << 11)) 354*55c2a12cSMichael Clark #define GET_C_B_IMM(inst) ((extract32(inst, 3, 2) << 1) \ 355*55c2a12cSMichael Clark | (extract32(inst, 10, 2) << 3) \ 356*55c2a12cSMichael Clark | (extract32(inst, 2, 1) << 5) \ 357*55c2a12cSMichael Clark | (extract32(inst, 5, 2) << 6) \ 358*55c2a12cSMichael Clark | (sextract64(inst, 12, 1) << 8)) 359*55c2a12cSMichael Clark #define GET_C_SIMM3(inst) extract32(inst, 10, 3) 360*55c2a12cSMichael Clark #define GET_C_RD(inst) GET_RD(inst) 361*55c2a12cSMichael Clark #define GET_C_RS1(inst) GET_RD(inst) 362*55c2a12cSMichael Clark #define GET_C_RS2(inst) extract32(inst, 2, 5) 363*55c2a12cSMichael Clark #define GET_C_RS1S(inst) (8 + extract32(inst, 7, 3)) 364*55c2a12cSMichael Clark #define GET_C_RS2S(inst) (8 + extract32(inst, 2, 3)) 365