|
40 | 40 | #define AMO_INSTR_TERNARY(f) f(atomic) |
41 | 41 | #endif |
42 | 42 |
|
43 | | -#ifdef CONFIG_RVH |
44 | | -#ifdef CONFIG_RV_SVINVAL |
45 | | - #define RVH_INST_BINARY(f) f(hfence_vvma) f(hfence_gvma) f(hinval_vvma) f(hinval_gvma) \ |
46 | | - f(hlv_b) f(hlv_bu) f(hlv_h) f(hlv_hu) f(hlvx_hu) f(hlv_w) f(hlvx_wu) f(hlv_wu) f(hlv_d) \ |
47 | | - f(hsv_b) f(hsv_h) f(hsv_w) f(hsv_d) |
48 | | -#else |
49 | | - #define RVH_INST_BINARY(f) f(hfence_vvma) f(hfence_gvma) \ |
50 | | - f(hlv_b) f(hlv_bu) f(hlv_h) f(hlv_hu) f(hlvx_hu) f(hlv_w) f(hlvx_wu) f(hlv_wu) f(hlv_d) \ |
51 | | - f(hsv_b) f(hsv_h) f(hsv_w) f(hsv_d) |
52 | | -#endif // CONFIG_RV_SVINVAL |
53 | | -#else |
54 | | - #define RVH_INST_BINARY(f) |
55 | | -#endif // CONFIG_RVH |
| 43 | +#ifdef CONFIG_RV_ZAWRS |
| 44 | + #define ZAWRS_INSTR_NULLARY(f) \ |
| 45 | + f(wrs_nto) f(wrs_sto) |
| 46 | +#else // CONFIG_RV_ZAWRS |
| 47 | + #define ZAWRS_INSTR_NULLARY(f) |
| 48 | +#endif // CONFIG_RV_ZAWRS |
| 49 | + |
| 50 | +/********************** SYS INSTR NULLARY **********************/ |
56 | 51 |
|
57 | | -#if defined(CONFIG_DEBUG) || defined(CONFIG_SHARE) |
58 | 52 | #ifdef CONFIG_RV_SMRNMI |
59 | | -#define SYS_NMI_NULLARY(f) \ |
60 | | - f(mnret) |
61 | | -#else |
62 | | -#define SYS_NMI_NULLARY(f) |
63 | | -#endif |
64 | | -#ifdef CONFIG_RV_ZAWRS |
65 | | -#define SYS_ZAWRS_NULLARY(f) \ |
66 | | - f(wrs_nto) f(wrs_sto) |
67 | | -#else |
68 | | -#define SYS_ZAWRS_NULLARY(f) |
69 | | -#endif |
| 53 | + #define SYS_SMRNMI_INSTR_NULLARY(f) \ |
| 54 | + f(mnret) |
| 55 | +#else // CONFIG_RV_SMRNMI |
| 56 | + #define SYS_SMRNMI_INSTR_NULLARY(f) |
| 57 | +#endif // CONFIG_RV_SMRNMI |
| 58 | + |
70 | 59 | #ifdef CONFIG_RV_SVINVAL |
| 60 | + #define SYS_SVINVAL_INSTR_NULLARY(f) \ |
| 61 | + f(sfence_w_inval) f(sfence_inval_ir) |
| 62 | +#else // CONFIG_RV_SVINVAL |
| 63 | + #define SYS_SVINVAL_INSTR_NULLARY(f) |
| 64 | +#endif // CONFIG_RV_SVINVAL |
| 65 | + |
71 | 66 | #define SYS_INSTR_NULLARY(f) \ |
72 | 67 | f(ecall) f(ebreak) f(c_ebreak) f(mret) f(sret) f(wfi) \ |
73 | | - SYS_ZAWRS_NULLARY(f) \ |
74 | | - f(sfence_w_inval) f(sfence_inval_ir) |
75 | | -#define SYS_INSTR_BINARY(f) \ |
76 | | - f(sfence_vma) f(sinval_vma) RVH_INST_BINARY(f) |
77 | | -#else |
78 | | -#define SYS_INSTR_NULLARY(f) \ |
79 | | - f(ecall) f(ebreak) f(c_ebreak) f(mret) f(sret) f(wfi) \ |
80 | | - SYS_ZAWRS_NULLARY(f) |
| 68 | + SYS_SMRNMI_INSTR_NULLARY(f) \ |
| 69 | + SYS_SVINVAL_INSTR_NULLARY(f) |
| 70 | + |
| 71 | +/********************** SYS INSTR BINARY (2 op) **********************/ |
| 72 | + |
| 73 | +#ifdef CONFIG_RVH |
| 74 | + #define SYS_RVH_INSTR_BINARY(f) \ |
| 75 | + f(hlv_b) f(hlv_bu) f(hlv_h) f(hlv_hu) f(hlv_w) f(hlv_wu) f(hlv_d) \ |
| 76 | + f(hlvx_hu) f(hlvx_wu) \ |
| 77 | + f(hsv_b) f(hsv_h) f(hsv_w) f(hsv_d) |
| 78 | +#else // CONFIG_RVH |
| 79 | + #define SYS_RVH_INSTR_BINARY(f) |
| 80 | +#endif // CONFIG_RVH |
| 81 | + |
81 | 82 | #define SYS_INSTR_BINARY(f) \ |
82 | | - f(sfence_vma) RVH_INST_BINARY(f) |
83 | | -#endif |
| 83 | + SYS_RVH_INSTR_BINARY(f) |
| 84 | + |
| 85 | +/********************** SYS INSTR TERNARY (3 op) **********************/ |
| 86 | + |
| 87 | +// Instructions sfence.vma / hfence.vvma / hfence.gvma have 2 operands (rs1, rs2), |
| 88 | +// But NEMU's print_asm_template2 is for (rd, rs1). We have to treat them as 3 operands. |
| 89 | + |
| 90 | +#ifdef CONFIG_RV_SVINVAL |
| 91 | + #define SYS_SVINVAL_INSTR_TERNARY(f) \ |
| 92 | + f(sinval_vma) |
| 93 | + #define SYS_SVINVAL_RVH_INSTR_TERNARY(f) \ |
| 94 | + f(hinval_vvma) f(hinval_gvma) |
| 95 | +#else // CONFIG_RV_SVINVAL |
| 96 | + #define SYS_SVINVAL_INSTR_TERNARY(f) |
| 97 | + #define SYS_SVINVAL_RVH_INSTR_TERNARY(f) |
| 98 | +#endif // CONFIG_RV_SVINVAL |
84 | 99 |
|
85 | | -#define SYS_INSTR_TERNARY(f) \ |
86 | | - f(csrrw) f(csrrs) f(csrrc) f(csrrwi) f(csrrsi) f(csrrci) |
87 | | -#else |
88 | 100 | #ifdef CONFIG_RVH |
89 | | -#define SYS_NMI_NULLARY(f) |
90 | | -#define SYS_INSTR_NULLARY(f) f(c_ebreak) |
91 | | -#define SYS_INSTR_BINARY(f) |
92 | | -#define SYS_INSTR_TERNARY(f) f(priv) f(hload) f(hstore) |
93 | | -#else |
94 | | -#define SYS_NMI_NULLARY(f) |
95 | | -#define SYS_INSTR_NULLARY(f) f(c_ebreak) |
96 | | -#define SYS_INSTR_BINARY(f) |
97 | | -#define SYS_INSTR_TERNARY(f) f(system) |
| 101 | + #define SYS_RVH_INSTR_TERNARY(f) \ |
| 102 | + f(hfence_vvma) f(hfence_gvma) \ |
| 103 | + SYS_SVINVAL_RVH_INSTR_TERNARY(f) |
| 104 | +#else // CONFIG_RVH |
| 105 | + #define SYS_RVH_INSTR_TERNARY(f) |
98 | 106 | #endif // CONFIG_RVH |
99 | | -#endif |
100 | | -// TODO: sfence.vma and sinval.vma need two reg operand, only one(addr) now |
| 107 | + |
| 108 | +#define SYS_INSTR_TERNARY(f) \ |
| 109 | + f(sfence_vma) \ |
| 110 | + SYS_SVINVAL_INSTR_TERNARY(f) \ |
| 111 | + SYS_RVH_INSTR_TERNARY(f) |
| 112 | + |
| 113 | + |
| 114 | +/********************** SYS INSTR TERNARY CSR (csr) **********************/ |
| 115 | + |
| 116 | +#define SYS_INSTR_TERNARY_CSR(f) \ |
| 117 | + f(csrrw) f(csrrs) f(csrrc) \ |
| 118 | + f(csrrwi) f(csrrsi) f(csrrci) |
| 119 | + |
101 | 120 |
|
102 | 121 | #ifdef CONFIG_RVV |
103 | 122 | #define VECTOR_INSTR_TERNARY(f) \ |
|
280 | 299 | #endif // CONFIG_FPU_NONE |
281 | 300 |
|
282 | 301 | #ifdef CONFIG_RV_ZIMOP |
283 | | -#define ZIMOP_INSTR_BINARY(f) \ |
284 | | - f(mop_r_n) |
285 | | - |
286 | | -#define ZIMOP_INSTR_TERNARY(f) \ |
287 | | - f(mop_rr_n) |
288 | | - |
| 302 | + #define ZIMOP_INSTR_BINARY(f) \ |
| 303 | + f(mop_r_n) |
| 304 | + #define ZIMOP_INSTR_TERNARY(f) \ |
| 305 | + f(mop_rr_n) |
289 | 306 | #else |
290 | | -#define ZIMOP_INSTR_BINARY(f) |
291 | | -#define ZIMOP_INSTR_TERNARY(f) |
| 307 | + #define ZIMOP_INSTR_BINARY(f) |
| 308 | + #define ZIMOP_INSTR_TERNARY(f) |
292 | 309 | #endif // CONFIG_RV_ZIMOP |
293 | 310 |
|
294 | 311 | #ifdef CONFIG_RV_ZCMOP |
|
320 | 337 | ZIHINTPAUSE_INSTR_NULLARY(f) \ |
321 | 338 | f(fence_i) f(fence) \ |
322 | 339 | SYS_INSTR_NULLARY(f) \ |
323 | | - SYS_NMI_NULLARY(f) \ |
324 | 340 | f(p_ret) \ |
| 341 | + ZAWRS_INSTR_NULLARY(f) \ |
325 | 342 | ZCMOP_INSTR_NULLARY(f) |
326 | 343 |
|
327 | 344 | #define INSTR_UNARY(f) \ |
|
360 | 377 | f(p_inc) f(p_dec) \ |
361 | 378 | AMO_INSTR_TERNARY(f) \ |
362 | 379 | AMO_CAS_INSTR(f) \ |
| 380 | + SYS_INSTR_TERNARY(f) \ |
363 | 381 | FLOAT_INSTR_TERNARY(f) \ |
364 | 382 | BITMANIP_INSTR_TERNARY(f) \ |
365 | 383 | CRYPTO_INSTR_TERNARY(f) \ |
|
373 | 391 | ZCB_INSTR_TERNARY(f) |
374 | 392 |
|
375 | 393 | #define INSTR_TERNARY_CSR(f) \ |
376 | | - SYS_INSTR_TERNARY(f) |
| 394 | + SYS_INSTR_TERNARY_CSR(f) |
377 | 395 |
|
378 | 396 | def_all_EXEC_ID(); |
379 | 397 |
|
|
0 commit comments