static bool trans_ADDVL(DisasContext *s, arg_ADDVL *a)
{
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (sve_access_check(s)) {
TCGv_i64 rd = cpu_reg_sp(s, a->rd);
TCGv_i64 rn = cpu_reg_sp(s, a->rn);
static bool trans_ADDPL(DisasContext *s, arg_ADDPL *a)
{
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (sve_access_check(s)) {
TCGv_i64 rd = cpu_reg_sp(s, a->rd);
TCGv_i64 rn = cpu_reg_sp(s, a->rn);
static bool trans_RDVL(DisasContext *s, arg_RDVL *a)
{
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (sve_access_check(s)) {
TCGv_i64 reg = cpu_reg(s, a->rd);
tcg_gen_movi_i64(reg, a->imm * vec_full_reg_size(s));
.prefer_i64 = TCG_TARGET_REG_BITS == 64,
};
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (!a->s) {
if (a->rn == a->rm) {
if (a->pg == a->rn) {
.prefer_i64 = TCG_TARGET_REG_BITS == 64,
};
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (!a->s && a->pg == a->rn) {
return gen_gvec_fn_ppp(s, tcg_gen_gvec_andc, a->rd, a->rn, a->rm);
}
.prefer_i64 = TCG_TARGET_REG_BITS == 64,
};
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
/* Alias NOT (predicate) is EOR Pd.B, Pg/Z, Pn.B, Pg.B */
if (!a->s && a->pg == a->rm) {
return gen_gvec_fn_ppp(s, tcg_gen_gvec_andc, a->rd, a->pg, a->rn);
static bool trans_SEL_pppp(DisasContext *s, arg_rprr_s *a)
{
- if (a->s) {
+ if (a->s || !dc_isar_feature(aa64_sve, s)) {
return false;
}
if (sve_access_check(s)) {
.prefer_i64 = TCG_TARGET_REG_BITS == 64,
};
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (!a->s && a->pg == a->rn && a->rn == a->rm) {
return do_mov_p(s, a->rd, a->rn);
}
.fno = gen_helper_sve_orn_pppp,
.prefer_i64 = TCG_TARGET_REG_BITS == 64,
};
+
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
return do_pppp_flags(s, a, &op);
}
.fno = gen_helper_sve_nor_pppp,
.prefer_i64 = TCG_TARGET_REG_BITS == 64,
};
+
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
return do_pppp_flags(s, a, &op);
}
.fno = gen_helper_sve_nand_pppp,
.prefer_i64 = TCG_TARGET_REG_BITS == 64,
};
+
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
return do_pppp_flags(s, a, &op);
}
static bool trans_PTEST(DisasContext *s, arg_PTEST *a)
{
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (sve_access_check(s)) {
int nofs = pred_full_reg_offset(s, a->rn);
int gofs = pred_full_reg_offset(s, a->pg);
static bool trans_CNT_r(DisasContext *s, arg_CNT_r *a)
{
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (sve_access_check(s)) {
unsigned fullsz = vec_full_reg_size(s);
unsigned numelem = decode_pred_count(fullsz, a->pat, a->esz);
static bool trans_INCDEC_r(DisasContext *s, arg_incdec_cnt *a)
{
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (sve_access_check(s)) {
unsigned fullsz = vec_full_reg_size(s);
unsigned numelem = decode_pred_count(fullsz, a->pat, a->esz);
static bool trans_SINCDEC_r_32(DisasContext *s, arg_incdec_cnt *a)
{
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (!sve_access_check(s)) {
return true;
}
static bool trans_SINCDEC_r_64(DisasContext *s, arg_incdec_cnt *a)
{
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (!sve_access_check(s)) {
return true;
}
static bool trans_INCDEC_v(DisasContext *s, arg_incdec2_cnt *a)
{
- if (a->esz == 0) {
+ if (a->esz == 0 || !dc_isar_feature(aa64_sve, s)) {
return false;
}
static bool trans_SINCDEC_v(DisasContext *s, arg_incdec2_cnt *a)
{
- if (a->esz == 0) {
+ if (a->esz == 0 || !dc_isar_feature(aa64_sve, s)) {
return false;
}
static bool trans_DUPM(DisasContext *s, arg_DUPM *a)
{
uint64_t imm;
+
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (!logic_imm_decode_wmask(&imm, extract32(a->dbm, 12, 1),
extract32(a->dbm, 0, 6),
extract32(a->dbm, 6, 6))) {
static bool trans_FCPY(DisasContext *s, arg_FCPY *a)
{
- if (a->esz == 0) {
+ if (a->esz == 0 || !dc_isar_feature(aa64_sve, s)) {
return false;
}
if (sve_access_check(s)) {
static bool trans_CPY_m_i(DisasContext *s, arg_rpri_esz *a)
{
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (sve_access_check(s)) {
do_cpy_m(s, a->esz, a->rd, a->rn, a->pg, tcg_constant_i64(a->imm));
}
gen_helper_sve_cpy_z_s, gen_helper_sve_cpy_z_d,
};
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (sve_access_check(s)) {
unsigned vsz = vec_full_reg_size(s);
tcg_gen_gvec_2i_ool(vec_full_reg_offset(s, a->rd),
static bool trans_DUP_s(DisasContext *s, arg_DUP_s *a)
{
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (sve_access_check(s)) {
unsigned vsz = vec_full_reg_size(s);
tcg_gen_gvec_dup_i64(a->esz, vec_full_reg_offset(s, a->rd),
static bool trans_DUP_x(DisasContext *s, arg_DUP_x *a)
{
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if ((a->imm & 0x1f) == 0) {
return false;
}
static bool trans_INSR_f(DisasContext *s, arg_rrr_esz *a)
{
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (sve_access_check(s)) {
TCGv_i64 t = tcg_temp_new_i64();
tcg_gen_ld_i64(t, cpu_env, vec_reg_offset(s, a->rm, 0, MO_64));
static bool trans_INSR_r(DisasContext *s, arg_rrr_esz *a)
{
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (sve_access_check(s)) {
do_insr_i64(s, a, cpu_reg(s, a->rm));
}
{ gen_helper_sve_sunpk_d, gen_helper_sve_uunpk_d },
};
- if (a->esz == 0) {
+ if (a->esz == 0 || !dc_isar_feature(aa64_sve, s)) {
return false;
}
if (sve_access_check(s)) {
static bool trans_CPY_m_r(DisasContext *s, arg_rpr_esz *a)
{
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (sve_access_check(s)) {
do_cpy_m(s, a->esz, a->rd, a->rd, a->pg, cpu_reg_sp(s, a->rn));
}
static bool trans_CPY_m_v(DisasContext *s, arg_rpr_esz *a)
{
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (sve_access_check(s)) {
int ofs = vec_reg_offset(s, a->rn, 0, a->esz);
TCGv_i64 t = load_esz(cpu_env, ofs, a->esz);
static bool trans_CNTP(DisasContext *s, arg_CNTP *a)
{
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (sve_access_check(s)) {
do_cntp(s, cpu_reg(s, a->rd), a->esz, a->rn, a->pg);
}
static bool trans_INCDECP_r(DisasContext *s, arg_incdec_pred *a)
{
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (sve_access_check(s)) {
TCGv_i64 reg = cpu_reg(s, a->rd);
TCGv_i64 val = tcg_temp_new_i64();
static bool trans_INCDECP_z(DisasContext *s, arg_incdec2_pred *a)
{
- if (a->esz == 0) {
+ if (a->esz == 0 || !dc_isar_feature(aa64_sve, s)) {
return false;
}
if (sve_access_check(s)) {
static bool trans_SINCDECP_r_32(DisasContext *s, arg_incdec_pred *a)
{
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (sve_access_check(s)) {
TCGv_i64 reg = cpu_reg(s, a->rd);
TCGv_i64 val = tcg_temp_new_i64();
static bool trans_SINCDECP_r_64(DisasContext *s, arg_incdec_pred *a)
{
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (sve_access_check(s)) {
TCGv_i64 reg = cpu_reg(s, a->rd);
TCGv_i64 val = tcg_temp_new_i64();
static bool trans_SINCDECP_z(DisasContext *s, arg_incdec2_pred *a)
{
- if (a->esz == 0) {
+ if (a->esz == 0 || !dc_isar_feature(aa64_sve, s)) {
return false;
}
if (sve_access_check(s)) {
static bool trans_CTERM(DisasContext *s, arg_CTERM *a)
{
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (!sve_access_check(s)) {
return true;
}
bool eq = a->eq == a->lt;
/* The greater-than conditions are all SVE2. */
- if (!a->lt && !dc_isar_feature(aa64_sve2, s)) {
+ if (a->lt
+ ? !dc_isar_feature(aa64_sve, s)
+ : !dc_isar_feature(aa64_sve2, s)) {
return false;
}
if (!sve_access_check(s)) {
static bool trans_FDUP(DisasContext *s, arg_FDUP *a)
{
- if (a->esz == 0) {
+ if (a->esz == 0 || !dc_isar_feature(aa64_sve, s)) {
return false;
}
if (sve_access_check(s)) {
static bool trans_DUP_i(DisasContext *s, arg_DUP_i *a)
{
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (sve_access_check(s)) {
unsigned vsz = vec_full_reg_size(s);
int dofs = vec_full_reg_offset(s, a->rd);
.scalar_first = true }
};
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (sve_access_check(s)) {
unsigned vsz = vec_full_reg_size(s);
tcg_gen_gvec_2s(vec_full_reg_offset(s, a->rd),
TCGv_i64 t_val;
TCGv_i32 t_desc;
- if (a->esz == 0) {
+ if (a->esz == 0 || !dc_isar_feature(aa64_sve, s)) {
return false;
}
if (!sve_access_check(s)) {
static bool trans_LDR_zri(DisasContext *s, arg_rri *a)
{
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (sve_access_check(s)) {
int size = vec_full_reg_size(s);
int off = vec_full_reg_offset(s, a->rd);
static bool trans_LDR_pri(DisasContext *s, arg_rri *a)
{
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (sve_access_check(s)) {
int size = pred_full_reg_size(s);
int off = pred_full_reg_offset(s, a->rd);
static bool trans_STR_zri(DisasContext *s, arg_rri *a)
{
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (sve_access_check(s)) {
int size = vec_full_reg_size(s);
int off = vec_full_reg_offset(s, a->rd);
static bool trans_STR_pri(DisasContext *s, arg_rri *a)
{
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (sve_access_check(s)) {
int size = pred_full_reg_size(s);
int off = pred_full_reg_offset(s, a->rd);
static bool trans_LD_zprr(DisasContext *s, arg_rprr_load *a)
{
- if (a->rm == 31) {
+ if (a->rm == 31 || !dc_isar_feature(aa64_sve, s)) {
return false;
}
if (sve_access_check(s)) {
static bool trans_LD_zpri(DisasContext *s, arg_rpri_load *a)
{
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (sve_access_check(s)) {
int vsz = vec_full_reg_size(s);
int elements = vsz >> dtype_esz[a->dtype];
gen_helper_sve_ldff1dd_be_r_mte } },
};
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (sve_access_check(s)) {
TCGv_i64 addr = new_tmp_a64(s);
tcg_gen_shli_i64(addr, cpu_reg(s, a->rm), dtype_msz(a->dtype));
gen_helper_sve_ldnf1dd_be_r_mte } },
};
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (sve_access_check(s)) {
int vsz = vec_full_reg_size(s);
int elements = vsz >> dtype_esz[a->dtype];
static bool trans_LD1RQ_zprr(DisasContext *s, arg_rprr_load *a)
{
- if (a->rm == 31) {
+ if (a->rm == 31 || !dc_isar_feature(aa64_sve, s)) {
return false;
}
if (sve_access_check(s)) {
static bool trans_LD1RQ_zpri(DisasContext *s, arg_rpri_load *a)
{
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (sve_access_check(s)) {
TCGv_i64 addr = new_tmp_a64(s);
tcg_gen_addi_i64(addr, cpu_reg_sp(s, a->rn), a->imm * 16);
TCGLabel *over;
TCGv_i64 temp, clean_addr;
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (!sve_access_check(s)) {
return true;
}
static bool trans_ST_zprr(DisasContext *s, arg_rprr_store *a)
{
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (a->rm == 31 || a->msz > a->esz) {
return false;
}
static bool trans_ST_zpri(DisasContext *s, arg_rpri_store *a)
{
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (a->msz > a->esz) {
return false;
}
bool be = s->be_data == MO_BE;
bool mte = s->mte_active[0];
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (!sve_access_check(s)) {
return true;
}
if (a->esz < a->msz || (a->esz == a->msz && !a->u)) {
return false;
}
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (!sve_access_check(s)) {
return true;
}
if (a->esz < a->msz || (a->msz == 0 && a->scale)) {
return false;
}
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (!sve_access_check(s)) {
return true;
}
if (a->esz < a->msz) {
return false;
}
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
if (!sve_access_check(s)) {
return true;
}
static bool trans_PRF(DisasContext *s, arg_PRF *a)
{
+ if (!dc_isar_feature(aa64_sve, s)) {
+ return false;
+ }
/* Prefetch is a nop within QEMU. */
(void)sve_access_check(s);
return true;
static bool trans_PRF_rr(DisasContext *s, arg_PRF_rr *a)
{
- if (a->rm == 31) {
+ if (a->rm == 31 || !dc_isar_feature(aa64_sve, s)) {
return false;
}
/* Prefetch is a nop within QEMU. */
gen_helper_gvec_pmull_q, gen_helper_sve2_pmull_h,
NULL, gen_helper_sve2_pmull_d,
};
- if (a->esz == 0 && !dc_isar_feature(aa64_sve2_pmull128, s)) {
+ if (a->esz == 0
+ ? !dc_isar_feature(aa64_sve2_pmull128, s)
+ : !dc_isar_feature(aa64_sve, s)) {
return false;
}
return gen_gvec_ool_arg_zzz(s, fns[a->esz], a, sel);