On 4/10/23 07:13, Mayuresh Chitale wrote:
+#ifndef CONFIG_USER_ONLY +#define smstateen_fcsr_check(ctx) do { \ + if (!ctx->smstateen_fcsr_ok) { \ + if (ctx->virt_enabled) { \ + generate_exception(ctx, RISCV_EXCP_VIRT_INSTRUCTION_FAULT); \ + } else { \ + generate_exception(ctx, RISCV_EXCP_ILLEGAL_INST); \ + } \ + return true; \ + } \ +} while (0) +#else +#define smstateen_fcsr_check(ctx) +#endif + +#define REQUIRE_ZFINX_OR_F(ctx) do { \ + if (!has_ext(ctx, RVF)) { \ + if (!ctx->cfg_ptr->ext_zfinx) { \ + return false; \ + } \ + smstateen_fcsr_check(ctx); \ } \ } while (0)
As a matter of style, I strongly object to a *nested* macro returning from the calling function. These should all be changed to normal functions of the form
if (!require_xyz(ctx) || !require_abc(ctx)) { return something; } etc. insn_trans/trans_rvv.c.inc is much much cleaner in this respect. r~