> +static bool validate_evex_apx(DisasContext *s, X86DecodedInsn *decode)
> +{
> + X86OpEntry *e = &decode->e;
> + uint8_t evex4_mask = 0;
> +
> + assert(s->has_modrm);
> + switch (e->vex_class) {
> + case 13:
> + /*
> + * APX-EVEX-BMI and APX-EVEX-CMPCCXADD do not define EVEX.ND.
> + * They only differ for checks on NF, which happen elsewhere.
> + */
> + if (!CODE64(s) || !(s->flags & HF_APX_EN_MASK)) {
> + goto illegal;
> + }
> + evex4_mask = 0x0C;
> + break;
> +
> + case X86_EVEX_APX:
> + /* APX-EVEX-INT. Checks on NF happen elsewhere. */
> + assert(e->s0 == e->s1);
This assertion seems too strong, should we only check it for X86_TYPE_B?
Thanks,
Zhao
> + if (!CODE64(s) || !(s->flags & HF_APX_EN_MASK)) {
> + goto illegal;
> + }
> + if (!EVEX_APX_ND(s)) {
> + s->vex_ndd = false;
> + } else if (!s->vex_ndd) {
> + goto illegal;
> + }
> + evex4_mask = 0x1C;
> + break;