support V4 in evex
diff --git a/xbyak/xbyak.h b/xbyak/xbyak.h
index 73c3728..ed1b9a5 100644
--- a/xbyak/xbyak.h
+++ b/xbyak/xbyak.h
@@ -1347,7 +1347,7 @@
inline XBYAK_CONSTEXPR bool Operand::hasRex2() const
{
- return (isREG() && (getIdx() >= 16)) || (isMEM() && static_cast<const Address&>(*this).hasRex2());
+ return (isREG() && isExtIdx2()) || (isMEM() && static_cast<const Address&>(*this).hasRex2());
}
class AddressFrame {
@@ -1881,7 +1881,7 @@
bool R = reg.isExtIdx();
bool X3 = (x && x->isExtIdx()) || (base.isSIMD() && base.isExtIdx2());
- bool B4 = !base.isSIMD() && base.isExtIdx2();
+ bool B4 = base.isREG() && base.isExtIdx2();
#if 0
printf("X3=%d B4=%d\n", X3, B4);
printf("reg=%s\n", reg.toString());
@@ -1889,7 +1889,7 @@
if (v) printf("v=%s\n", v->toString());
if (x) printf("x=%s\n", x->toString());
#endif
- bool X4 = false;//(x && x->isExtIdx2()) ? false : !(!base.isSIMD() && base.isExtIdx2());
+ bool X4 = x && (x->isREG() && x->isExtIdx2());
bool B = base.isExtIdx();
bool Rp = reg.isExtIdx2();
int LL;
@@ -1921,15 +1921,15 @@
}
}
}
- bool Vp = !((v ? v->isExtIdx2() : 0) | Hi16Vidx);
-//printf("Vp=%d Hi16Vidx=%d\n", Vp, Hi16Vidx);
+ bool Vp = ((v ? v->isExtIdx2() : 0) || Hi16Vidx);
+//if (v) printf("v=%s Vp=%d Hi16Vidx=%d\n", v->toString(), Vp, Hi16Vidx);
bool z = reg.hasZero() || base.hasZero() || (v ? v->hasZero() : false);
if (aaa == 0) aaa = verifyDuplicate(base.getOpmaskIdx(), reg.getOpmaskIdx(), (v ? v->getOpmaskIdx() : 0), ERR_OPMASK_IS_ALREADY_SET);
if (aaa == 0) z = 0; // clear T_z if mask is not set
db(0x62);
db((R ? 0 : 0x80) | (X3 ? 0 : 0x40) | (B ? 0 : 0x20) | (Rp ? 0 : 0x10) | (B4 ? 8 : 0) | mmm);
db((w == 1 ? 0x80 : 0) | ((vvvv & 15) << 3) | (X4 ? 0 : 4) | (pp & 3));
- db((z ? 0x80 : 0) | ((LL & 3) << 5) | (b ? 0x10 : 0) | (Vp ? 8 : 0) | (aaa & 7));
+ db((z ? 0x80 : 0) | ((LL & 3) << 5) | (b ? 0x10 : 0) | (Vp ? 0 : 8) | (aaa & 7));
db(code);
return disp8N;
}
@@ -2456,7 +2456,7 @@
b = true;
}
int VL = regExp.isVsib() ? index.getBit() : 0;
- disp8N = evex(r, base, p1, type, code, &index, b, aaa, VL, index.isExtIdx2());
+ disp8N = evex(r, base, p1, type, code, &index, b, aaa, VL, index.isSIMD() && index.isExtIdx2());
} else {
vex(r, base, p1, type, code, index.isExtIdx());
}