155c2a12cSMichael Clark /* 255c2a12cSMichael Clark * RISC-V emulation for qemu: Instruction decode helpers 355c2a12cSMichael Clark * 455c2a12cSMichael Clark * Copyright (c) 2016-2017 Sagar Karandikar, sagark@eecs.berkeley.edu 555c2a12cSMichael Clark * 655c2a12cSMichael Clark * This program is free software; you can redistribute it and/or modify it 755c2a12cSMichael Clark * under the terms and conditions of the GNU General Public License, 855c2a12cSMichael Clark * version 2 or later, as published by the Free Software Foundation. 955c2a12cSMichael Clark * 1055c2a12cSMichael Clark * This program is distributed in the hope it will be useful, but WITHOUT 1155c2a12cSMichael Clark * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1255c2a12cSMichael Clark * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 1355c2a12cSMichael Clark * more details. 1455c2a12cSMichael Clark * 1555c2a12cSMichael Clark * You should have received a copy of the GNU General Public License along with 1655c2a12cSMichael Clark * this program. If not, see <http://www.gnu.org/licenses/>. 1755c2a12cSMichael Clark */ 1855c2a12cSMichael Clark 19f91005e1SMarkus Armbruster #ifndef TARGET_RISCV_INSTMAP_H 20f91005e1SMarkus Armbruster #define TARGET_RISCV_INSTMAP_H 21f91005e1SMarkus Armbruster 2255c2a12cSMichael Clark #define MASK_OP_MAJOR(op) (op & 0x7F) 2355c2a12cSMichael Clark enum { 2455c2a12cSMichael Clark /* rv32i, rv64i, rv32m */ 2555c2a12cSMichael Clark OPC_RISC_LUI = (0x37), 2655c2a12cSMichael Clark OPC_RISC_AUIPC = (0x17), 2755c2a12cSMichael Clark OPC_RISC_JAL = (0x6F), 2855c2a12cSMichael Clark OPC_RISC_JALR = (0x67), 2955c2a12cSMichael Clark OPC_RISC_BRANCH = (0x63), 3055c2a12cSMichael Clark OPC_RISC_LOAD = (0x03), 3155c2a12cSMichael Clark OPC_RISC_STORE = (0x23), 3255c2a12cSMichael Clark OPC_RISC_ARITH_IMM = (0x13), 3355c2a12cSMichael Clark OPC_RISC_ARITH = (0x33), 3455c2a12cSMichael Clark OPC_RISC_FENCE = (0x0F), 3555c2a12cSMichael Clark OPC_RISC_SYSTEM = (0x73), 3655c2a12cSMichael Clark 3755c2a12cSMichael Clark /* rv64i, rv64m */ 3855c2a12cSMichael Clark OPC_RISC_ARITH_IMM_W = (0x1B), 3955c2a12cSMichael Clark OPC_RISC_ARITH_W = (0x3B), 4055c2a12cSMichael Clark 4155c2a12cSMichael Clark /* rv32a, rv64a */ 4255c2a12cSMichael Clark OPC_RISC_ATOMIC = (0x2F), 4355c2a12cSMichael Clark 4455c2a12cSMichael Clark /* floating point */ 4555c2a12cSMichael Clark OPC_RISC_FP_LOAD = (0x7), 4655c2a12cSMichael Clark OPC_RISC_FP_STORE = (0x27), 4755c2a12cSMichael Clark 4855c2a12cSMichael Clark OPC_RISC_FMADD = (0x43), 4955c2a12cSMichael Clark OPC_RISC_FMSUB = (0x47), 5055c2a12cSMichael Clark OPC_RISC_FNMSUB = (0x4B), 5155c2a12cSMichael Clark OPC_RISC_FNMADD = (0x4F), 5255c2a12cSMichael Clark 5355c2a12cSMichael Clark OPC_RISC_FP_ARITH = (0x53), 5455c2a12cSMichael Clark }; 5555c2a12cSMichael Clark 5655c2a12cSMichael Clark #define MASK_OP_ARITH(op) (MASK_OP_MAJOR(op) | (op & ((0x7 << 12) | \ 5755c2a12cSMichael Clark (0x7F << 25)))) 5855c2a12cSMichael Clark enum { 5955c2a12cSMichael Clark OPC_RISC_ADD = OPC_RISC_ARITH | (0x0 << 12) | (0x00 << 25), 6055c2a12cSMichael Clark OPC_RISC_SUB = OPC_RISC_ARITH | (0x0 << 12) | (0x20 << 25), 6155c2a12cSMichael Clark OPC_RISC_SLL = OPC_RISC_ARITH | (0x1 << 12) | (0x00 << 25), 6255c2a12cSMichael Clark OPC_RISC_SLT = OPC_RISC_ARITH | (0x2 << 12) | (0x00 << 25), 6355c2a12cSMichael Clark OPC_RISC_SLTU = OPC_RISC_ARITH | (0x3 << 12) | (0x00 << 25), 6455c2a12cSMichael Clark OPC_RISC_XOR = OPC_RISC_ARITH | (0x4 << 12) | (0x00 << 25), 6555c2a12cSMichael Clark OPC_RISC_SRL = OPC_RISC_ARITH | (0x5 << 12) | (0x00 << 25), 6655c2a12cSMichael Clark OPC_RISC_SRA = OPC_RISC_ARITH | (0x5 << 12) | (0x20 << 25), 6755c2a12cSMichael Clark OPC_RISC_OR = OPC_RISC_ARITH | (0x6 << 12) | (0x00 << 25), 6855c2a12cSMichael Clark OPC_RISC_AND = OPC_RISC_ARITH | (0x7 << 12) | (0x00 << 25), 6955c2a12cSMichael Clark 7055c2a12cSMichael Clark /* RV64M */ 7155c2a12cSMichael Clark OPC_RISC_MUL = OPC_RISC_ARITH | (0x0 << 12) | (0x01 << 25), 7255c2a12cSMichael Clark OPC_RISC_MULH = OPC_RISC_ARITH | (0x1 << 12) | (0x01 << 25), 7355c2a12cSMichael Clark OPC_RISC_MULHSU = OPC_RISC_ARITH | (0x2 << 12) | (0x01 << 25), 7455c2a12cSMichael Clark OPC_RISC_MULHU = OPC_RISC_ARITH | (0x3 << 12) | (0x01 << 25), 7555c2a12cSMichael Clark 7655c2a12cSMichael Clark OPC_RISC_DIV = OPC_RISC_ARITH | (0x4 << 12) | (0x01 << 25), 7755c2a12cSMichael Clark OPC_RISC_DIVU = OPC_RISC_ARITH | (0x5 << 12) | (0x01 << 25), 7855c2a12cSMichael Clark OPC_RISC_REM = OPC_RISC_ARITH | (0x6 << 12) | (0x01 << 25), 7955c2a12cSMichael Clark OPC_RISC_REMU = OPC_RISC_ARITH | (0x7 << 12) | (0x01 << 25), 8055c2a12cSMichael Clark }; 8155c2a12cSMichael Clark 8255c2a12cSMichael Clark 8355c2a12cSMichael Clark #define MASK_OP_ARITH_IMM(op) (MASK_OP_MAJOR(op) | (op & (0x7 << 12))) 8455c2a12cSMichael Clark enum { 8555c2a12cSMichael Clark OPC_RISC_ADDI = OPC_RISC_ARITH_IMM | (0x0 << 12), 8655c2a12cSMichael Clark OPC_RISC_SLTI = OPC_RISC_ARITH_IMM | (0x2 << 12), 8755c2a12cSMichael Clark OPC_RISC_SLTIU = OPC_RISC_ARITH_IMM | (0x3 << 12), 8855c2a12cSMichael Clark OPC_RISC_XORI = OPC_RISC_ARITH_IMM | (0x4 << 12), 8955c2a12cSMichael Clark OPC_RISC_ORI = OPC_RISC_ARITH_IMM | (0x6 << 12), 9055c2a12cSMichael Clark OPC_RISC_ANDI = OPC_RISC_ARITH_IMM | (0x7 << 12), 9155c2a12cSMichael Clark OPC_RISC_SLLI = OPC_RISC_ARITH_IMM | (0x1 << 12), /* additional part of 9255c2a12cSMichael Clark IMM */ 9355c2a12cSMichael Clark OPC_RISC_SHIFT_RIGHT_I = OPC_RISC_ARITH_IMM | (0x5 << 12) /* SRAI, SRLI */ 9455c2a12cSMichael Clark }; 9555c2a12cSMichael Clark 9655c2a12cSMichael Clark #define MASK_OP_BRANCH(op) (MASK_OP_MAJOR(op) | (op & (0x7 << 12))) 9755c2a12cSMichael Clark enum { 9855c2a12cSMichael Clark OPC_RISC_BEQ = OPC_RISC_BRANCH | (0x0 << 12), 9955c2a12cSMichael Clark OPC_RISC_BNE = OPC_RISC_BRANCH | (0x1 << 12), 10055c2a12cSMichael Clark OPC_RISC_BLT = OPC_RISC_BRANCH | (0x4 << 12), 10155c2a12cSMichael Clark OPC_RISC_BGE = OPC_RISC_BRANCH | (0x5 << 12), 10255c2a12cSMichael Clark OPC_RISC_BLTU = OPC_RISC_BRANCH | (0x6 << 12), 10355c2a12cSMichael Clark OPC_RISC_BGEU = OPC_RISC_BRANCH | (0x7 << 12) 10455c2a12cSMichael Clark }; 10555c2a12cSMichael Clark 10655c2a12cSMichael Clark enum { 10755c2a12cSMichael Clark OPC_RISC_ADDIW = OPC_RISC_ARITH_IMM_W | (0x0 << 12), 10855c2a12cSMichael Clark OPC_RISC_SLLIW = OPC_RISC_ARITH_IMM_W | (0x1 << 12), /* additional part of 10955c2a12cSMichael Clark IMM */ 11055c2a12cSMichael Clark OPC_RISC_SHIFT_RIGHT_IW = OPC_RISC_ARITH_IMM_W | (0x5 << 12) /* SRAI, SRLI 11155c2a12cSMichael Clark */ 11255c2a12cSMichael Clark }; 11355c2a12cSMichael Clark 11455c2a12cSMichael Clark enum { 11555c2a12cSMichael Clark OPC_RISC_ADDW = OPC_RISC_ARITH_W | (0x0 << 12) | (0x00 << 25), 11655c2a12cSMichael Clark OPC_RISC_SUBW = OPC_RISC_ARITH_W | (0x0 << 12) | (0x20 << 25), 11755c2a12cSMichael Clark OPC_RISC_SLLW = OPC_RISC_ARITH_W | (0x1 << 12) | (0x00 << 25), 11855c2a12cSMichael Clark OPC_RISC_SRLW = OPC_RISC_ARITH_W | (0x5 << 12) | (0x00 << 25), 11955c2a12cSMichael Clark OPC_RISC_SRAW = OPC_RISC_ARITH_W | (0x5 << 12) | (0x20 << 25), 12055c2a12cSMichael Clark 12155c2a12cSMichael Clark /* RV64M */ 12255c2a12cSMichael Clark OPC_RISC_MULW = OPC_RISC_ARITH_W | (0x0 << 12) | (0x01 << 25), 12355c2a12cSMichael Clark OPC_RISC_DIVW = OPC_RISC_ARITH_W | (0x4 << 12) | (0x01 << 25), 12455c2a12cSMichael Clark OPC_RISC_DIVUW = OPC_RISC_ARITH_W | (0x5 << 12) | (0x01 << 25), 12555c2a12cSMichael Clark OPC_RISC_REMW = OPC_RISC_ARITH_W | (0x6 << 12) | (0x01 << 25), 12655c2a12cSMichael Clark OPC_RISC_REMUW = OPC_RISC_ARITH_W | (0x7 << 12) | (0x01 << 25), 12755c2a12cSMichael Clark }; 12855c2a12cSMichael Clark 12955c2a12cSMichael Clark #define MASK_OP_LOAD(op) (MASK_OP_MAJOR(op) | (op & (0x7 << 12))) 13055c2a12cSMichael Clark enum { 13155c2a12cSMichael Clark OPC_RISC_LB = OPC_RISC_LOAD | (0x0 << 12), 13255c2a12cSMichael Clark OPC_RISC_LH = OPC_RISC_LOAD | (0x1 << 12), 13355c2a12cSMichael Clark OPC_RISC_LW = OPC_RISC_LOAD | (0x2 << 12), 13455c2a12cSMichael Clark OPC_RISC_LD = OPC_RISC_LOAD | (0x3 << 12), 13555c2a12cSMichael Clark OPC_RISC_LBU = OPC_RISC_LOAD | (0x4 << 12), 13655c2a12cSMichael Clark OPC_RISC_LHU = OPC_RISC_LOAD | (0x5 << 12), 13755c2a12cSMichael Clark OPC_RISC_LWU = OPC_RISC_LOAD | (0x6 << 12), 13855c2a12cSMichael Clark }; 13955c2a12cSMichael Clark 14055c2a12cSMichael Clark #define MASK_OP_STORE(op) (MASK_OP_MAJOR(op) | (op & (0x7 << 12))) 14155c2a12cSMichael Clark enum { 14255c2a12cSMichael Clark OPC_RISC_SB = OPC_RISC_STORE | (0x0 << 12), 14355c2a12cSMichael Clark OPC_RISC_SH = OPC_RISC_STORE | (0x1 << 12), 14455c2a12cSMichael Clark OPC_RISC_SW = OPC_RISC_STORE | (0x2 << 12), 14555c2a12cSMichael Clark OPC_RISC_SD = OPC_RISC_STORE | (0x3 << 12), 14655c2a12cSMichael Clark }; 14755c2a12cSMichael Clark 14855c2a12cSMichael Clark #define MASK_OP_JALR(op) (MASK_OP_MAJOR(op) | (op & (0x7 << 12))) 14955c2a12cSMichael Clark /* no enum since OPC_RISC_JALR is the actual value */ 15055c2a12cSMichael Clark 15155c2a12cSMichael Clark #define MASK_OP_ATOMIC(op) \ 15255c2a12cSMichael Clark (MASK_OP_MAJOR(op) | (op & ((0x7 << 12) | (0x7F << 25)))) 15355c2a12cSMichael Clark #define MASK_OP_ATOMIC_NO_AQ_RL_SZ(op) \ 15455c2a12cSMichael Clark (MASK_OP_MAJOR(op) | (op & (0x1F << 27))) 15555c2a12cSMichael Clark 15655c2a12cSMichael Clark enum { 15755c2a12cSMichael Clark OPC_RISC_LR = OPC_RISC_ATOMIC | (0x02 << 27), 15855c2a12cSMichael Clark OPC_RISC_SC = OPC_RISC_ATOMIC | (0x03 << 27), 15955c2a12cSMichael Clark OPC_RISC_AMOSWAP = OPC_RISC_ATOMIC | (0x01 << 27), 16055c2a12cSMichael Clark OPC_RISC_AMOADD = OPC_RISC_ATOMIC | (0x00 << 27), 16155c2a12cSMichael Clark OPC_RISC_AMOXOR = OPC_RISC_ATOMIC | (0x04 << 27), 16255c2a12cSMichael Clark OPC_RISC_AMOAND = OPC_RISC_ATOMIC | (0x0C << 27), 16355c2a12cSMichael Clark OPC_RISC_AMOOR = OPC_RISC_ATOMIC | (0x08 << 27), 16455c2a12cSMichael Clark OPC_RISC_AMOMIN = OPC_RISC_ATOMIC | (0x10 << 27), 16555c2a12cSMichael Clark OPC_RISC_AMOMAX = OPC_RISC_ATOMIC | (0x14 << 27), 16655c2a12cSMichael Clark OPC_RISC_AMOMINU = OPC_RISC_ATOMIC | (0x18 << 27), 16755c2a12cSMichael Clark OPC_RISC_AMOMAXU = OPC_RISC_ATOMIC | (0x1C << 27), 16855c2a12cSMichael Clark }; 16955c2a12cSMichael Clark 17055c2a12cSMichael Clark #define MASK_OP_SYSTEM(op) (MASK_OP_MAJOR(op) | (op & (0x7 << 12))) 17155c2a12cSMichael Clark enum { 17255c2a12cSMichael Clark OPC_RISC_ECALL = OPC_RISC_SYSTEM | (0x0 << 12), 17355c2a12cSMichael Clark OPC_RISC_EBREAK = OPC_RISC_SYSTEM | (0x0 << 12), 17455c2a12cSMichael Clark OPC_RISC_ERET = OPC_RISC_SYSTEM | (0x0 << 12), 17555c2a12cSMichael Clark OPC_RISC_MRTS = OPC_RISC_SYSTEM | (0x0 << 12), 17655c2a12cSMichael Clark OPC_RISC_MRTH = OPC_RISC_SYSTEM | (0x0 << 12), 17755c2a12cSMichael Clark OPC_RISC_HRTS = OPC_RISC_SYSTEM | (0x0 << 12), 17855c2a12cSMichael Clark OPC_RISC_WFI = OPC_RISC_SYSTEM | (0x0 << 12), 17955c2a12cSMichael Clark OPC_RISC_SFENCEVM = OPC_RISC_SYSTEM | (0x0 << 12), 18055c2a12cSMichael Clark 18155c2a12cSMichael Clark OPC_RISC_CSRRW = OPC_RISC_SYSTEM | (0x1 << 12), 18255c2a12cSMichael Clark OPC_RISC_CSRRS = OPC_RISC_SYSTEM | (0x2 << 12), 18355c2a12cSMichael Clark OPC_RISC_CSRRC = OPC_RISC_SYSTEM | (0x3 << 12), 18455c2a12cSMichael Clark OPC_RISC_CSRRWI = OPC_RISC_SYSTEM | (0x5 << 12), 18555c2a12cSMichael Clark OPC_RISC_CSRRSI = OPC_RISC_SYSTEM | (0x6 << 12), 18655c2a12cSMichael Clark OPC_RISC_CSRRCI = OPC_RISC_SYSTEM | (0x7 << 12), 187*8e2aa21bSAnup Patel 188*8e2aa21bSAnup Patel OPC_RISC_HLVHSV = OPC_RISC_SYSTEM | (0x4 << 12), 18955c2a12cSMichael Clark }; 19055c2a12cSMichael Clark 19155c2a12cSMichael Clark #define MASK_OP_FP_LOAD(op) (MASK_OP_MAJOR(op) | (op & (0x7 << 12))) 19255c2a12cSMichael Clark enum { 19355c2a12cSMichael Clark OPC_RISC_FLW = OPC_RISC_FP_LOAD | (0x2 << 12), 19455c2a12cSMichael Clark OPC_RISC_FLD = OPC_RISC_FP_LOAD | (0x3 << 12), 19555c2a12cSMichael Clark }; 19655c2a12cSMichael Clark 19755c2a12cSMichael Clark #define MASK_OP_FP_STORE(op) (MASK_OP_MAJOR(op) | (op & (0x7 << 12))) 19855c2a12cSMichael Clark enum { 19955c2a12cSMichael Clark OPC_RISC_FSW = OPC_RISC_FP_STORE | (0x2 << 12), 20055c2a12cSMichael Clark OPC_RISC_FSD = OPC_RISC_FP_STORE | (0x3 << 12), 20155c2a12cSMichael Clark }; 20255c2a12cSMichael Clark 20355c2a12cSMichael Clark #define MASK_OP_FP_FMADD(op) (MASK_OP_MAJOR(op) | (op & (0x3 << 25))) 20455c2a12cSMichael Clark enum { 20555c2a12cSMichael Clark OPC_RISC_FMADD_S = OPC_RISC_FMADD | (0x0 << 25), 20655c2a12cSMichael Clark OPC_RISC_FMADD_D = OPC_RISC_FMADD | (0x1 << 25), 20755c2a12cSMichael Clark }; 20855c2a12cSMichael Clark 20955c2a12cSMichael Clark #define MASK_OP_FP_FMSUB(op) (MASK_OP_MAJOR(op) | (op & (0x3 << 25))) 21055c2a12cSMichael Clark enum { 21155c2a12cSMichael Clark OPC_RISC_FMSUB_S = OPC_RISC_FMSUB | (0x0 << 25), 21255c2a12cSMichael Clark OPC_RISC_FMSUB_D = OPC_RISC_FMSUB | (0x1 << 25), 21355c2a12cSMichael Clark }; 21455c2a12cSMichael Clark 21555c2a12cSMichael Clark #define MASK_OP_FP_FNMADD(op) (MASK_OP_MAJOR(op) | (op & (0x3 << 25))) 21655c2a12cSMichael Clark enum { 21755c2a12cSMichael Clark OPC_RISC_FNMADD_S = OPC_RISC_FNMADD | (0x0 << 25), 21855c2a12cSMichael Clark OPC_RISC_FNMADD_D = OPC_RISC_FNMADD | (0x1 << 25), 21955c2a12cSMichael Clark }; 22055c2a12cSMichael Clark 22155c2a12cSMichael Clark #define MASK_OP_FP_FNMSUB(op) (MASK_OP_MAJOR(op) | (op & (0x3 << 25))) 22255c2a12cSMichael Clark enum { 22355c2a12cSMichael Clark OPC_RISC_FNMSUB_S = OPC_RISC_FNMSUB | (0x0 << 25), 22455c2a12cSMichael Clark OPC_RISC_FNMSUB_D = OPC_RISC_FNMSUB | (0x1 << 25), 22555c2a12cSMichael Clark }; 22655c2a12cSMichael Clark 22755c2a12cSMichael Clark #define MASK_OP_FP_ARITH(op) (MASK_OP_MAJOR(op) | (op & (0x7F << 25))) 22855c2a12cSMichael Clark enum { 22955c2a12cSMichael Clark /* float */ 23055c2a12cSMichael Clark OPC_RISC_FADD_S = OPC_RISC_FP_ARITH | (0x0 << 25), 23155c2a12cSMichael Clark OPC_RISC_FSUB_S = OPC_RISC_FP_ARITH | (0x4 << 25), 23255c2a12cSMichael Clark OPC_RISC_FMUL_S = OPC_RISC_FP_ARITH | (0x8 << 25), 23355c2a12cSMichael Clark OPC_RISC_FDIV_S = OPC_RISC_FP_ARITH | (0xC << 25), 23455c2a12cSMichael Clark 23555c2a12cSMichael Clark OPC_RISC_FSGNJ_S = OPC_RISC_FP_ARITH | (0x10 << 25), 23655c2a12cSMichael Clark OPC_RISC_FSGNJN_S = OPC_RISC_FP_ARITH | (0x10 << 25), 23755c2a12cSMichael Clark OPC_RISC_FSGNJX_S = OPC_RISC_FP_ARITH | (0x10 << 25), 23855c2a12cSMichael Clark 23955c2a12cSMichael Clark OPC_RISC_FMIN_S = OPC_RISC_FP_ARITH | (0x14 << 25), 24055c2a12cSMichael Clark OPC_RISC_FMAX_S = OPC_RISC_FP_ARITH | (0x14 << 25), 24155c2a12cSMichael Clark 24255c2a12cSMichael Clark OPC_RISC_FSQRT_S = OPC_RISC_FP_ARITH | (0x2C << 25), 24355c2a12cSMichael Clark 24455c2a12cSMichael Clark OPC_RISC_FEQ_S = OPC_RISC_FP_ARITH | (0x50 << 25), 24555c2a12cSMichael Clark OPC_RISC_FLT_S = OPC_RISC_FP_ARITH | (0x50 << 25), 24655c2a12cSMichael Clark OPC_RISC_FLE_S = OPC_RISC_FP_ARITH | (0x50 << 25), 24755c2a12cSMichael Clark 24855c2a12cSMichael Clark OPC_RISC_FCVT_W_S = OPC_RISC_FP_ARITH | (0x60 << 25), 24955c2a12cSMichael Clark OPC_RISC_FCVT_WU_S = OPC_RISC_FP_ARITH | (0x60 << 25), 25055c2a12cSMichael Clark OPC_RISC_FCVT_L_S = OPC_RISC_FP_ARITH | (0x60 << 25), 25155c2a12cSMichael Clark OPC_RISC_FCVT_LU_S = OPC_RISC_FP_ARITH | (0x60 << 25), 25255c2a12cSMichael Clark 25355c2a12cSMichael Clark OPC_RISC_FCVT_S_W = OPC_RISC_FP_ARITH | (0x68 << 25), 25455c2a12cSMichael Clark OPC_RISC_FCVT_S_WU = OPC_RISC_FP_ARITH | (0x68 << 25), 25555c2a12cSMichael Clark OPC_RISC_FCVT_S_L = OPC_RISC_FP_ARITH | (0x68 << 25), 25655c2a12cSMichael Clark OPC_RISC_FCVT_S_LU = OPC_RISC_FP_ARITH | (0x68 << 25), 25755c2a12cSMichael Clark 25855c2a12cSMichael Clark OPC_RISC_FMV_X_S = OPC_RISC_FP_ARITH | (0x70 << 25), 25955c2a12cSMichael Clark OPC_RISC_FCLASS_S = OPC_RISC_FP_ARITH | (0x70 << 25), 26055c2a12cSMichael Clark 26155c2a12cSMichael Clark OPC_RISC_FMV_S_X = OPC_RISC_FP_ARITH | (0x78 << 25), 26255c2a12cSMichael Clark 26355c2a12cSMichael Clark /* double */ 26455c2a12cSMichael Clark OPC_RISC_FADD_D = OPC_RISC_FP_ARITH | (0x1 << 25), 26555c2a12cSMichael Clark OPC_RISC_FSUB_D = OPC_RISC_FP_ARITH | (0x5 << 25), 26655c2a12cSMichael Clark OPC_RISC_FMUL_D = OPC_RISC_FP_ARITH | (0x9 << 25), 26755c2a12cSMichael Clark OPC_RISC_FDIV_D = OPC_RISC_FP_ARITH | (0xD << 25), 26855c2a12cSMichael Clark 26955c2a12cSMichael Clark OPC_RISC_FSGNJ_D = OPC_RISC_FP_ARITH | (0x11 << 25), 27055c2a12cSMichael Clark OPC_RISC_FSGNJN_D = OPC_RISC_FP_ARITH | (0x11 << 25), 27155c2a12cSMichael Clark OPC_RISC_FSGNJX_D = OPC_RISC_FP_ARITH | (0x11 << 25), 27255c2a12cSMichael Clark 27355c2a12cSMichael Clark OPC_RISC_FMIN_D = OPC_RISC_FP_ARITH | (0x15 << 25), 27455c2a12cSMichael Clark OPC_RISC_FMAX_D = OPC_RISC_FP_ARITH | (0x15 << 25), 27555c2a12cSMichael Clark 27655c2a12cSMichael Clark OPC_RISC_FCVT_S_D = OPC_RISC_FP_ARITH | (0x20 << 25), 27755c2a12cSMichael Clark 27855c2a12cSMichael Clark OPC_RISC_FCVT_D_S = OPC_RISC_FP_ARITH | (0x21 << 25), 27955c2a12cSMichael Clark 28055c2a12cSMichael Clark OPC_RISC_FSQRT_D = OPC_RISC_FP_ARITH | (0x2D << 25), 28155c2a12cSMichael Clark 28255c2a12cSMichael Clark OPC_RISC_FEQ_D = OPC_RISC_FP_ARITH | (0x51 << 25), 28355c2a12cSMichael Clark OPC_RISC_FLT_D = OPC_RISC_FP_ARITH | (0x51 << 25), 28455c2a12cSMichael Clark OPC_RISC_FLE_D = OPC_RISC_FP_ARITH | (0x51 << 25), 28555c2a12cSMichael Clark 28655c2a12cSMichael Clark OPC_RISC_FCVT_W_D = OPC_RISC_FP_ARITH | (0x61 << 25), 28755c2a12cSMichael Clark OPC_RISC_FCVT_WU_D = OPC_RISC_FP_ARITH | (0x61 << 25), 28855c2a12cSMichael Clark OPC_RISC_FCVT_L_D = OPC_RISC_FP_ARITH | (0x61 << 25), 28955c2a12cSMichael Clark OPC_RISC_FCVT_LU_D = OPC_RISC_FP_ARITH | (0x61 << 25), 29055c2a12cSMichael Clark 29155c2a12cSMichael Clark OPC_RISC_FCVT_D_W = OPC_RISC_FP_ARITH | (0x69 << 25), 29255c2a12cSMichael Clark OPC_RISC_FCVT_D_WU = OPC_RISC_FP_ARITH | (0x69 << 25), 29355c2a12cSMichael Clark OPC_RISC_FCVT_D_L = OPC_RISC_FP_ARITH | (0x69 << 25), 29455c2a12cSMichael Clark OPC_RISC_FCVT_D_LU = OPC_RISC_FP_ARITH | (0x69 << 25), 29555c2a12cSMichael Clark 29655c2a12cSMichael Clark OPC_RISC_FMV_X_D = OPC_RISC_FP_ARITH | (0x71 << 25), 29755c2a12cSMichael Clark OPC_RISC_FCLASS_D = OPC_RISC_FP_ARITH | (0x71 << 25), 29855c2a12cSMichael Clark 29955c2a12cSMichael Clark OPC_RISC_FMV_D_X = OPC_RISC_FP_ARITH | (0x79 << 25), 30055c2a12cSMichael Clark }; 30155c2a12cSMichael Clark 30255c2a12cSMichael Clark #define GET_B_IMM(inst) ((extract32(inst, 8, 4) << 1) \ 30355c2a12cSMichael Clark | (extract32(inst, 25, 6) << 5) \ 30455c2a12cSMichael Clark | (extract32(inst, 7, 1) << 11) \ 30555c2a12cSMichael Clark | (sextract64(inst, 31, 1) << 12)) 30655c2a12cSMichael Clark 30755c2a12cSMichael Clark #define GET_STORE_IMM(inst) ((extract32(inst, 7, 5)) \ 30855c2a12cSMichael Clark | (sextract64(inst, 25, 7) << 5)) 30955c2a12cSMichael Clark 31055c2a12cSMichael Clark #define GET_JAL_IMM(inst) ((extract32(inst, 21, 10) << 1) \ 31155c2a12cSMichael Clark | (extract32(inst, 20, 1) << 11) \ 31255c2a12cSMichael Clark | (extract32(inst, 12, 8) << 12) \ 31355c2a12cSMichael Clark | (sextract64(inst, 31, 1) << 20)) 31455c2a12cSMichael Clark 315*8e2aa21bSAnup Patel #define GET_FUNCT3(inst) extract32(inst, 12, 3) 316*8e2aa21bSAnup Patel #define GET_FUNCT7(inst) extract32(inst, 25, 7) 31755c2a12cSMichael Clark #define GET_RM(inst) extract32(inst, 12, 3) 31855c2a12cSMichael Clark #define GET_RS3(inst) extract32(inst, 27, 5) 31955c2a12cSMichael Clark #define GET_RS1(inst) extract32(inst, 15, 5) 32055c2a12cSMichael Clark #define GET_RS2(inst) extract32(inst, 20, 5) 32155c2a12cSMichael Clark #define GET_RD(inst) extract32(inst, 7, 5) 32255c2a12cSMichael Clark #define GET_IMM(inst) sextract64(inst, 20, 12) 323*8e2aa21bSAnup Patel #define SET_RS1(inst, val) deposit32(inst, 15, 5, val) 324*8e2aa21bSAnup Patel #define SET_RS2(inst, val) deposit32(inst, 20, 5, val) 325*8e2aa21bSAnup Patel #define SET_RD(inst, val) deposit32(inst, 7, 5, val) 326*8e2aa21bSAnup Patel #define SET_I_IMM(inst, val) deposit32(inst, 20, 12, val) 327*8e2aa21bSAnup Patel #define SET_S_IMM(inst, val) \ 328*8e2aa21bSAnup Patel deposit32(deposit32(inst, 7, 5, val), 25, 7, (val) >> 5) 32955c2a12cSMichael Clark 33055c2a12cSMichael Clark /* RVC decoding macros */ 33155c2a12cSMichael Clark #define GET_C_IMM(inst) (extract32(inst, 2, 5) \ 33255c2a12cSMichael Clark | (sextract64(inst, 12, 1) << 5)) 33355c2a12cSMichael Clark #define GET_C_ZIMM(inst) (extract32(inst, 2, 5) \ 33455c2a12cSMichael Clark | (extract32(inst, 12, 1) << 5)) 33555c2a12cSMichael Clark #define GET_C_ADDI4SPN_IMM(inst) ((extract32(inst, 6, 1) << 2) \ 33655c2a12cSMichael Clark | (extract32(inst, 5, 1) << 3) \ 33755c2a12cSMichael Clark | (extract32(inst, 11, 2) << 4) \ 33855c2a12cSMichael Clark | (extract32(inst, 7, 4) << 6)) 33955c2a12cSMichael Clark #define GET_C_ADDI16SP_IMM(inst) ((extract32(inst, 6, 1) << 4) \ 34055c2a12cSMichael Clark | (extract32(inst, 2, 1) << 5) \ 34155c2a12cSMichael Clark | (extract32(inst, 5, 1) << 6) \ 34255c2a12cSMichael Clark | (extract32(inst, 3, 2) << 7) \ 34355c2a12cSMichael Clark | (sextract64(inst, 12, 1) << 9)) 34455c2a12cSMichael Clark #define GET_C_LWSP_IMM(inst) ((extract32(inst, 4, 3) << 2) \ 34555c2a12cSMichael Clark | (extract32(inst, 12, 1) << 5) \ 34655c2a12cSMichael Clark | (extract32(inst, 2, 2) << 6)) 34755c2a12cSMichael Clark #define GET_C_LDSP_IMM(inst) ((extract32(inst, 5, 2) << 3) \ 34855c2a12cSMichael Clark | (extract32(inst, 12, 1) << 5) \ 34955c2a12cSMichael Clark | (extract32(inst, 2, 3) << 6)) 35055c2a12cSMichael Clark #define GET_C_SWSP_IMM(inst) ((extract32(inst, 9, 4) << 2) \ 35155c2a12cSMichael Clark | (extract32(inst, 7, 2) << 6)) 35255c2a12cSMichael Clark #define GET_C_SDSP_IMM(inst) ((extract32(inst, 10, 3) << 3) \ 35355c2a12cSMichael Clark | (extract32(inst, 7, 3) << 6)) 35455c2a12cSMichael Clark #define GET_C_LW_IMM(inst) ((extract32(inst, 6, 1) << 2) \ 35555c2a12cSMichael Clark | (extract32(inst, 10, 3) << 3) \ 35655c2a12cSMichael Clark | (extract32(inst, 5, 1) << 6)) 35725139bf7SAlex Bennée #define GET_C_LD_IMM(inst) ((extract16(inst, 10, 3) << 3) \ 35825139bf7SAlex Bennée | (extract16(inst, 5, 2) << 6)) 359*8e2aa21bSAnup Patel #define GET_C_SW_IMM(inst) GET_C_LW_IMM(inst) 360*8e2aa21bSAnup Patel #define GET_C_SD_IMM(inst) GET_C_LD_IMM(inst) 36155c2a12cSMichael Clark #define GET_C_J_IMM(inst) ((extract32(inst, 3, 3) << 1) \ 36255c2a12cSMichael Clark | (extract32(inst, 11, 1) << 4) \ 36355c2a12cSMichael Clark | (extract32(inst, 2, 1) << 5) \ 36455c2a12cSMichael Clark | (extract32(inst, 7, 1) << 6) \ 36555c2a12cSMichael Clark | (extract32(inst, 6, 1) << 7) \ 36655c2a12cSMichael Clark | (extract32(inst, 9, 2) << 8) \ 36755c2a12cSMichael Clark | (extract32(inst, 8, 1) << 10) \ 36855c2a12cSMichael Clark | (sextract64(inst, 12, 1) << 11)) 36955c2a12cSMichael Clark #define GET_C_B_IMM(inst) ((extract32(inst, 3, 2) << 1) \ 37055c2a12cSMichael Clark | (extract32(inst, 10, 2) << 3) \ 37155c2a12cSMichael Clark | (extract32(inst, 2, 1) << 5) \ 37255c2a12cSMichael Clark | (extract32(inst, 5, 2) << 6) \ 37355c2a12cSMichael Clark | (sextract64(inst, 12, 1) << 8)) 37455c2a12cSMichael Clark #define GET_C_SIMM3(inst) extract32(inst, 10, 3) 37555c2a12cSMichael Clark #define GET_C_RD(inst) GET_RD(inst) 37655c2a12cSMichael Clark #define GET_C_RS1(inst) GET_RD(inst) 37755c2a12cSMichael Clark #define GET_C_RS2(inst) extract32(inst, 2, 5) 37825139bf7SAlex Bennée #define GET_C_RS1S(inst) (8 + extract16(inst, 7, 3)) 37925139bf7SAlex Bennée #define GET_C_RS2S(inst) (8 + extract16(inst, 2, 3)) 380f91005e1SMarkus Armbruster 381*8e2aa21bSAnup Patel #define GET_C_FUNC(inst) extract32(inst, 13, 3) 382*8e2aa21bSAnup Patel #define GET_C_OP(inst) extract32(inst, 0, 2) 383*8e2aa21bSAnup Patel 384*8e2aa21bSAnup Patel enum { 385*8e2aa21bSAnup Patel /* RVC Quadrants */ 386*8e2aa21bSAnup Patel OPC_RISC_C_OP_QUAD0 = 0x0, 387*8e2aa21bSAnup Patel OPC_RISC_C_OP_QUAD1 = 0x1, 388*8e2aa21bSAnup Patel OPC_RISC_C_OP_QUAD2 = 0x2 389*8e2aa21bSAnup Patel }; 390*8e2aa21bSAnup Patel 391*8e2aa21bSAnup Patel enum { 392*8e2aa21bSAnup Patel /* RVC Quadrant 0 */ 393*8e2aa21bSAnup Patel OPC_RISC_C_FUNC_ADDI4SPN = 0x0, 394*8e2aa21bSAnup Patel OPC_RISC_C_FUNC_FLD_LQ = 0x1, 395*8e2aa21bSAnup Patel OPC_RISC_C_FUNC_LW = 0x2, 396*8e2aa21bSAnup Patel OPC_RISC_C_FUNC_FLW_LD = 0x3, 397*8e2aa21bSAnup Patel OPC_RISC_C_FUNC_FSD_SQ = 0x5, 398*8e2aa21bSAnup Patel OPC_RISC_C_FUNC_SW = 0x6, 399*8e2aa21bSAnup Patel OPC_RISC_C_FUNC_FSW_SD = 0x7 400*8e2aa21bSAnup Patel }; 401*8e2aa21bSAnup Patel 402*8e2aa21bSAnup Patel enum { 403*8e2aa21bSAnup Patel /* RVC Quadrant 2 */ 404*8e2aa21bSAnup Patel OPC_RISC_C_FUNC_SLLI_SLLI64 = 0x0, 405*8e2aa21bSAnup Patel OPC_RISC_C_FUNC_FLDSP_LQSP = 0x1, 406*8e2aa21bSAnup Patel OPC_RISC_C_FUNC_LWSP = 0x2, 407*8e2aa21bSAnup Patel OPC_RISC_C_FUNC_FLWSP_LDSP = 0x3, 408*8e2aa21bSAnup Patel OPC_RISC_C_FUNC_JR_MV_EBREAK_JALR_ADD = 0x4, 409*8e2aa21bSAnup Patel OPC_RISC_C_FUNC_FSDSP_SQSP = 0x5, 410*8e2aa21bSAnup Patel OPC_RISC_C_FUNC_SWSP = 0x6, 411*8e2aa21bSAnup Patel OPC_RISC_C_FUNC_FSWSP_SDSP = 0x7 412*8e2aa21bSAnup Patel }; 413*8e2aa21bSAnup Patel 414f91005e1SMarkus Armbruster #endif 415