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