xref: /openbmc/qemu/target/riscv/instmap.h (revision e46e2628e9fcce39e7ae28ac8c24bcc643ac48eb)
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