CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutSign UpSign In
hrydgard

CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!

GitHub Repository: hrydgard/ppsspp
Path: blob/master/ext/riscv-disas.h
Views: 1401
1
/*
2
* RISC-V Disassembler
3
*
4
* Copyright (c) 2016-2017 Michael Clark <[email protected]>
5
* Copyright (c) 2017-2018 SiFive, Inc.
6
*
7
* Permission is hereby granted, free of charge, to any person obtaining a copy
8
* of this software and associated documentation files (the "Software"), to deal
9
* in the Software without restriction, including without limitation the rights
10
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
* copies of the Software, and to permit persons to whom the Software is
12
* furnished to do so, subject to the following conditions:
13
*
14
* The above copyright notice and this permission notice shall be included in
15
* all copies or substantial portions of the Software.
16
*
17
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
* THE SOFTWARE.
24
*/
25
26
#ifndef RISCV_DISASSEMBLER_H
27
#define RISCV_DISASSEMBLER_H
28
29
#include <cstdint>
30
31
/* types */
32
33
typedef uint64_t rv_inst;
34
typedef uint16_t rv_opcode;
35
36
/* enums */
37
38
typedef enum {
39
rv32,
40
rv64,
41
rv128
42
} rv_isa;
43
44
typedef enum {
45
rv_rm_rne = 0,
46
rv_rm_rtz = 1,
47
rv_rm_rdn = 2,
48
rv_rm_rup = 3,
49
rv_rm_rmm = 4,
50
rv_rm_dyn = 7,
51
} rv_rm;
52
53
typedef enum {
54
rv_fence_i = 8,
55
rv_fence_o = 4,
56
rv_fence_r = 2,
57
rv_fence_w = 1,
58
} rv_fence;
59
60
typedef enum {
61
rv_ireg_zero,
62
rv_ireg_ra,
63
rv_ireg_sp,
64
rv_ireg_gp,
65
rv_ireg_tp,
66
rv_ireg_t0,
67
rv_ireg_t1,
68
rv_ireg_t2,
69
rv_ireg_s0,
70
rv_ireg_s1,
71
rv_ireg_a0,
72
rv_ireg_a1,
73
rv_ireg_a2,
74
rv_ireg_a3,
75
rv_ireg_a4,
76
rv_ireg_a5,
77
rv_ireg_a6,
78
rv_ireg_a7,
79
rv_ireg_s2,
80
rv_ireg_s3,
81
rv_ireg_s4,
82
rv_ireg_s5,
83
rv_ireg_s6,
84
rv_ireg_s7,
85
rv_ireg_s8,
86
rv_ireg_s9,
87
rv_ireg_s10,
88
rv_ireg_s11,
89
rv_ireg_t3,
90
rv_ireg_t4,
91
rv_ireg_t5,
92
rv_ireg_t6,
93
} rv_ireg;
94
95
typedef enum {
96
rvc_end,
97
rvc_rd_eq_ra,
98
rvc_rd_eq_x0,
99
rvc_rs1_eq_x0,
100
rvc_rs2_eq_x0,
101
rvc_rs2_eq_rs1,
102
rvc_rs1_eq_ra,
103
rvc_imm_eq_zero,
104
rvc_imm_eq_n1,
105
rvc_imm_eq_p1,
106
rvc_csr_eq_0x001,
107
rvc_csr_eq_0x002,
108
rvc_csr_eq_0x003,
109
rvc_csr_eq_0xc00,
110
rvc_csr_eq_0xc01,
111
rvc_csr_eq_0xc02,
112
rvc_csr_eq_0xc80,
113
rvc_csr_eq_0xc81,
114
rvc_csr_eq_0xc82,
115
} rvc_constraint;
116
117
typedef enum {
118
rv_codec_illegal,
119
rv_codec_none,
120
rv_codec_u,
121
rv_codec_uj,
122
rv_codec_i,
123
rv_codec_i_sh5,
124
rv_codec_i_sh6,
125
rv_codec_i_sh7,
126
rv_codec_i_csr,
127
rv_codec_s,
128
rv_codec_sb,
129
rv_codec_r,
130
rv_codec_r_m,
131
rv_codec_r4_m,
132
rv_codec_r_a,
133
rv_codec_r_l,
134
rv_codec_r_f,
135
rv_codec_cb,
136
rv_codec_cb_imm,
137
rv_codec_cb_sh5,
138
rv_codec_cb_sh6,
139
rv_codec_ci,
140
rv_codec_ci_sh5,
141
rv_codec_ci_sh6,
142
rv_codec_ci_16sp,
143
rv_codec_ci_lwsp,
144
rv_codec_ci_ldsp,
145
rv_codec_ci_lqsp,
146
rv_codec_ci_li,
147
rv_codec_ci_lui,
148
rv_codec_ci_none,
149
rv_codec_ciw_4spn,
150
rv_codec_cj,
151
rv_codec_cj_jal,
152
rv_codec_cl_lw,
153
rv_codec_cl_ld,
154
rv_codec_cl_lq,
155
rv_codec_cr,
156
rv_codec_cr_mv,
157
rv_codec_cr_jalr,
158
rv_codec_cr_jr,
159
rv_codec_cs,
160
rv_codec_cs_sw,
161
rv_codec_cs_sd,
162
rv_codec_cs_sq,
163
rv_codec_css_swsp,
164
rv_codec_css_sdsp,
165
rv_codec_css_sqsp,
166
} rv_codec;
167
168
typedef enum {
169
rv_op_illegal,
170
rv_op_lui,
171
rv_op_auipc,
172
rv_op_jal,
173
rv_op_jalr,
174
rv_op_beq,
175
rv_op_bne,
176
rv_op_blt,
177
rv_op_bge,
178
rv_op_bltu,
179
rv_op_bgeu,
180
rv_op_lb,
181
rv_op_lh,
182
rv_op_lw,
183
rv_op_lbu,
184
rv_op_lhu,
185
rv_op_sb,
186
rv_op_sh,
187
rv_op_sw,
188
rv_op_addi,
189
rv_op_slti,
190
rv_op_sltiu,
191
rv_op_xori,
192
rv_op_ori,
193
rv_op_andi,
194
rv_op_slli,
195
rv_op_srli,
196
rv_op_srai,
197
rv_op_add,
198
rv_op_sub,
199
rv_op_sll,
200
rv_op_slt,
201
rv_op_sltu,
202
rv_op_xor,
203
rv_op_srl,
204
rv_op_sra,
205
rv_op_or,
206
rv_op_and,
207
rv_op_fence,
208
rv_op_fence_i,
209
rv_op_lwu,
210
rv_op_ld,
211
rv_op_sd,
212
rv_op_addiw,
213
rv_op_slliw,
214
rv_op_srliw,
215
rv_op_sraiw,
216
rv_op_addw,
217
rv_op_subw,
218
rv_op_sllw,
219
rv_op_srlw,
220
rv_op_sraw,
221
rv_op_ldu,
222
rv_op_lq,
223
rv_op_sq,
224
rv_op_addid,
225
rv_op_sllid,
226
rv_op_srlid,
227
rv_op_sraid,
228
rv_op_addd,
229
rv_op_subd,
230
rv_op_slld,
231
rv_op_srld,
232
rv_op_srad,
233
rv_op_mul,
234
rv_op_mulh,
235
rv_op_mulhsu,
236
rv_op_mulhu,
237
rv_op_div,
238
rv_op_divu,
239
rv_op_rem,
240
rv_op_remu,
241
rv_op_mulw,
242
rv_op_divw,
243
rv_op_divuw,
244
rv_op_remw,
245
rv_op_remuw,
246
rv_op_muld,
247
rv_op_divd,
248
rv_op_divud,
249
rv_op_remd,
250
rv_op_remud,
251
rv_op_lr_w,
252
rv_op_sc_w,
253
rv_op_amoswap_w,
254
rv_op_amoadd_w,
255
rv_op_amoxor_w,
256
rv_op_amoor_w,
257
rv_op_amoand_w,
258
rv_op_amomin_w,
259
rv_op_amomax_w,
260
rv_op_amominu_w,
261
rv_op_amomaxu_w,
262
rv_op_lr_d,
263
rv_op_sc_d,
264
rv_op_amoswap_d,
265
rv_op_amoadd_d,
266
rv_op_amoxor_d,
267
rv_op_amoor_d,
268
rv_op_amoand_d,
269
rv_op_amomin_d,
270
rv_op_amomax_d,
271
rv_op_amominu_d,
272
rv_op_amomaxu_d,
273
rv_op_lr_q,
274
rv_op_sc_q,
275
rv_op_amoswap_q,
276
rv_op_amoadd_q,
277
rv_op_amoxor_q,
278
rv_op_amoor_q,
279
rv_op_amoand_q,
280
rv_op_amomin_q,
281
rv_op_amomax_q,
282
rv_op_amominu_q,
283
rv_op_amomaxu_q,
284
rv_op_ecall,
285
rv_op_ebreak,
286
rv_op_uret,
287
rv_op_sret,
288
rv_op_hret,
289
rv_op_mret,
290
rv_op_dret,
291
rv_op_sfence_vm,
292
rv_op_sfence_vma,
293
rv_op_wfi,
294
rv_op_csrrw,
295
rv_op_csrrs,
296
rv_op_csrrc,
297
rv_op_csrrwi,
298
rv_op_csrrsi,
299
rv_op_csrrci,
300
rv_op_flh,
301
rv_op_fsh,
302
rv_op_fmadd_h,
303
rv_op_fmsub_h,
304
rv_op_fnmsub_h,
305
rv_op_fnmadd_h,
306
rv_op_fadd_h,
307
rv_op_fsub_h,
308
rv_op_fmul_h,
309
rv_op_fdiv_h,
310
rv_op_fsgnj_h,
311
rv_op_fsgnjn_h,
312
rv_op_fsgnjx_h,
313
rv_op_fmin_h,
314
rv_op_fmax_h,
315
rv_op_fsqrt_h,
316
rv_op_fle_h,
317
rv_op_flt_h,
318
rv_op_feq_h,
319
rv_op_fcvt_w_h,
320
rv_op_fcvt_wu_h,
321
rv_op_fcvt_h_w,
322
rv_op_fcvt_h_wu,
323
rv_op_fclass_h,
324
rv_op_fcvt_l_h,
325
rv_op_fcvt_lu_h,
326
rv_op_fmv_x_h,
327
rv_op_fcvt_h_l,
328
rv_op_fcvt_h_lu,
329
rv_op_fmv_h_x,
330
rv_op_fcvt_s_h,
331
rv_op_fcvt_h_s,
332
rv_op_fcvt_d_h,
333
rv_op_fcvt_h_d,
334
rv_op_fcvt_q_h,
335
rv_op_fcvt_h_q,
336
rv_op_fmv_h,
337
rv_op_fabs_h,
338
rv_op_fneg_h,
339
rv_op_flw,
340
rv_op_fsw,
341
rv_op_fmadd_s,
342
rv_op_fmsub_s,
343
rv_op_fnmsub_s,
344
rv_op_fnmadd_s,
345
rv_op_fadd_s,
346
rv_op_fsub_s,
347
rv_op_fmul_s,
348
rv_op_fdiv_s,
349
rv_op_fsgnj_s,
350
rv_op_fsgnjn_s,
351
rv_op_fsgnjx_s,
352
rv_op_fmin_s,
353
rv_op_fmax_s,
354
rv_op_fsqrt_s,
355
rv_op_fle_s,
356
rv_op_flt_s,
357
rv_op_feq_s,
358
rv_op_fcvt_w_s,
359
rv_op_fcvt_wu_s,
360
rv_op_fcvt_s_w,
361
rv_op_fcvt_s_wu,
362
rv_op_fmv_x_s,
363
rv_op_fclass_s,
364
rv_op_fmv_s_x,
365
rv_op_fcvt_l_s,
366
rv_op_fcvt_lu_s,
367
rv_op_fcvt_s_l,
368
rv_op_fcvt_s_lu,
369
rv_op_fld,
370
rv_op_fsd,
371
rv_op_fmadd_d,
372
rv_op_fmsub_d,
373
rv_op_fnmsub_d,
374
rv_op_fnmadd_d,
375
rv_op_fadd_d,
376
rv_op_fsub_d,
377
rv_op_fmul_d,
378
rv_op_fdiv_d,
379
rv_op_fsgnj_d,
380
rv_op_fsgnjn_d,
381
rv_op_fsgnjx_d,
382
rv_op_fmin_d,
383
rv_op_fmax_d,
384
rv_op_fcvt_s_d,
385
rv_op_fcvt_d_s,
386
rv_op_fsqrt_d,
387
rv_op_fle_d,
388
rv_op_flt_d,
389
rv_op_feq_d,
390
rv_op_fcvt_w_d,
391
rv_op_fcvt_wu_d,
392
rv_op_fcvt_d_w,
393
rv_op_fcvt_d_wu,
394
rv_op_fclass_d,
395
rv_op_fcvt_l_d,
396
rv_op_fcvt_lu_d,
397
rv_op_fmv_x_d,
398
rv_op_fcvt_d_l,
399
rv_op_fcvt_d_lu,
400
rv_op_fmv_d_x,
401
rv_op_flq,
402
rv_op_fsq,
403
rv_op_fmadd_q,
404
rv_op_fmsub_q,
405
rv_op_fnmsub_q,
406
rv_op_fnmadd_q,
407
rv_op_fadd_q,
408
rv_op_fsub_q,
409
rv_op_fmul_q,
410
rv_op_fdiv_q,
411
rv_op_fsgnj_q,
412
rv_op_fsgnjn_q,
413
rv_op_fsgnjx_q,
414
rv_op_fmin_q,
415
rv_op_fmax_q,
416
rv_op_fcvt_s_q,
417
rv_op_fcvt_q_s,
418
rv_op_fcvt_d_q,
419
rv_op_fcvt_q_d,
420
rv_op_fsqrt_q,
421
rv_op_fle_q,
422
rv_op_flt_q,
423
rv_op_feq_q,
424
rv_op_fcvt_w_q,
425
rv_op_fcvt_wu_q,
426
rv_op_fcvt_q_w,
427
rv_op_fcvt_q_wu,
428
rv_op_fclass_q,
429
rv_op_fcvt_l_q,
430
rv_op_fcvt_lu_q,
431
rv_op_fcvt_q_l,
432
rv_op_fcvt_q_lu,
433
rv_op_fmv_x_q,
434
rv_op_fmv_q_x,
435
rv_op_c_addi4spn,
436
rv_op_c_fld,
437
rv_op_c_lw,
438
rv_op_c_flw,
439
rv_op_c_fsd,
440
rv_op_c_sw,
441
rv_op_c_fsw,
442
rv_op_c_nop,
443
rv_op_c_addi,
444
rv_op_c_jal,
445
rv_op_c_li,
446
rv_op_c_addi16sp,
447
rv_op_c_lui,
448
rv_op_c_srli,
449
rv_op_c_srai,
450
rv_op_c_andi,
451
rv_op_c_sub,
452
rv_op_c_xor,
453
rv_op_c_or,
454
rv_op_c_and,
455
rv_op_c_subw,
456
rv_op_c_addw,
457
rv_op_c_j,
458
rv_op_c_beqz,
459
rv_op_c_bnez,
460
rv_op_c_slli,
461
rv_op_c_fldsp,
462
rv_op_c_lwsp,
463
rv_op_c_flwsp,
464
rv_op_c_jr,
465
rv_op_c_mv,
466
rv_op_c_ebreak,
467
rv_op_c_jalr,
468
rv_op_c_add,
469
rv_op_c_fsdsp,
470
rv_op_c_swsp,
471
rv_op_c_fswsp,
472
rv_op_c_ld,
473
rv_op_c_sd,
474
rv_op_c_addiw,
475
rv_op_c_ldsp,
476
rv_op_c_sdsp,
477
rv_op_c_lq,
478
rv_op_c_sq,
479
rv_op_c_lqsp,
480
rv_op_c_sqsp,
481
rv_op_nop,
482
rv_op_mv,
483
rv_op_not,
484
rv_op_neg,
485
rv_op_negw,
486
rv_op_sext_w,
487
rv_op_seqz,
488
rv_op_snez,
489
rv_op_sltz,
490
rv_op_sgtz,
491
rv_op_fmv_s,
492
rv_op_fabs_s,
493
rv_op_fneg_s,
494
rv_op_fmv_d,
495
rv_op_fabs_d,
496
rv_op_fneg_d,
497
rv_op_fmv_q,
498
rv_op_fabs_q,
499
rv_op_fneg_q,
500
rv_op_beqz,
501
rv_op_bnez,
502
rv_op_blez,
503
rv_op_bgez,
504
rv_op_bltz,
505
rv_op_bgtz,
506
rv_op_ble,
507
rv_op_bleu,
508
rv_op_bgt,
509
rv_op_bgtu,
510
rv_op_j,
511
rv_op_ret,
512
rv_op_jr,
513
rv_op_rdcycle,
514
rv_op_rdtime,
515
rv_op_rdinstret,
516
rv_op_rdcycleh,
517
rv_op_rdtimeh,
518
rv_op_rdinstreth,
519
rv_op_frcsr,
520
rv_op_frrm,
521
rv_op_frflags,
522
rv_op_fscsr,
523
rv_op_fsrm,
524
rv_op_fsflags,
525
rv_op_fsrmi,
526
rv_op_fsflagsi,
527
rv_op_add_uw,
528
rv_op_andn,
529
rv_op_bclr,
530
rv_op_bclri,
531
rv_op_bext,
532
rv_op_bexti,
533
rv_op_binv,
534
rv_op_binvi,
535
rv_op_bset,
536
rv_op_bseti,
537
rv_op_clmul,
538
rv_op_clmulh,
539
rv_op_clmulr,
540
rv_op_clz,
541
rv_op_clzw,
542
rv_op_cpop,
543
rv_op_cpopw,
544
rv_op_ctz,
545
rv_op_ctzw,
546
rv_op_max,
547
rv_op_maxu,
548
rv_op_min,
549
rv_op_minu,
550
rv_op_orc_b,
551
rv_op_orn,
552
rv_op_rev8,
553
rv_op_rol,
554
rv_op_rolw,
555
rv_op_ror,
556
rv_op_rori,
557
rv_op_roriw,
558
rv_op_rorw,
559
rv_op_sext_b,
560
rv_op_sext_h,
561
rv_op_sh1add,
562
rv_op_sh1add_uw,
563
rv_op_sh2add,
564
rv_op_sh2add_uw,
565
rv_op_sh3add,
566
rv_op_sh3add_uw,
567
rv_op_slli_uw,
568
rv_op_xnor,
569
rv_op_zext_h,
570
} rv_op;
571
572
/* structures */
573
574
typedef struct {
575
uint64_t pc;
576
uint64_t inst;
577
int32_t imm;
578
uint16_t op;
579
uint8_t codec;
580
uint8_t rd;
581
uint8_t rs1;
582
uint8_t rs2;
583
uint8_t rs3;
584
uint8_t rm;
585
uint8_t pred;
586
uint8_t succ;
587
uint8_t aq;
588
uint8_t rl;
589
} rv_decode;
590
591
/* functions */
592
593
size_t riscv_inst_length(rv_inst inst);
594
void riscv_inst_fetch(const uint8_t *data, rv_inst *instp, size_t *length);
595
void riscv_disasm_inst(char *buf, size_t buflen, rv_isa isa, uint64_t pc, rv_inst inst);
596
597
#endif
598
599