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