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