disp32 is used if evex
diff --git a/xbyak/xbyak.h b/xbyak/xbyak.h
index 5f9d6ce..7db3a9a 100644
--- a/xbyak/xbyak.h
+++ b/xbyak/xbyak.h
@@ -1376,7 +1376,7 @@
{
db(static_cast<uint8>((mod << 6) | ((r1 & 7) << 3) | (r2 & 7)));
}
- void setSIB(const RegExp& e, int reg)
+ void setSIB(const RegExp& e, int reg, bool disp32 = false)
{
size_t disp64 = e.getDisp();
#ifdef XBYAK64
@@ -1395,7 +1395,7 @@
int mod;
if (!baseBit || ((baseIdx & 7) != Operand::EBP && disp == 0)) {
mod = mod00;
- } else if (inner::IsInDisp8(disp)) {
+ } else if (!disp32 && inner::IsInDisp8(disp)) {
mod = mod01;
} else {
mod = mod10;
@@ -1487,10 +1487,10 @@
}
// reg is reg field of ModRM
// immSize is the size for immediate value
- void opAddr(const Address &addr, int reg, int immSize = 0)
+ void opAddr(const Address &addr, int reg, int immSize = 0, bool disp32 = false)
{
if (addr.getMode() == Address::M_ModRM) {
- setSIB(addr.getRegExp(), reg);
+ setSIB(addr.getRegExp(), reg, disp32);
} else if (addr.getMode() == Address::M_rip) {
setModRM(0, reg, 5);
if (addr.getLabel()) { // [rip + Label]
@@ -1679,13 +1679,15 @@
const Address& addr = static_cast<const Address&>(op2);
const Reg& base = addr.getRegExp().getBase();
if (BIT == 64 && addr.is32bit()) db(0x67);
+ bool disp32 = false;
if (r.hasEvex() || (p1 && p1->hasEvex()) /*|| base.hasEvex()*/) {
evex(r, base, p1, type, code);
+ disp32 = true;
} else {
bool x = addr.getRegExp().getIndex().isExtIdx();
vex(r, base, p1, type, code, x);
}
- opAddr(addr, r.getIdx(), (imm8 != NONE) ? 1 : 0);
+ opAddr(addr, r.getIdx(), (imm8 != NONE) ? 1 : 0, disp32);
} else {
const Reg& base = static_cast<const Reg&>(op2);
if (r.hasEvex() || (p1 && p1->hasEvex()) || base.hasEvex()) {