store modrm() for x87 in Ib() byte because x87 have no Ib()
This commit is contained in:
parent
2583f8549a
commit
c6d07ae1b5
@ -1362,6 +1362,7 @@ fetch_b1:
|
||||
#if BX_SUPPORT_FPU
|
||||
i->setVL(BX_NO_VL);
|
||||
#endif
|
||||
i->modRMForm.Id = 0;
|
||||
|
||||
unsigned index = b1 + (os_32 << 9); // *512
|
||||
|
||||
@ -1457,13 +1458,12 @@ fetch_b1:
|
||||
vvv = nnn;
|
||||
i->setVvv(vvv);
|
||||
|
||||
i->setModRM(b2); /* for x87 */
|
||||
|
||||
// MOVs with CRx and DRx always use register ops and ignore the mod field.
|
||||
if ((b1 & ~3) == 0x120)
|
||||
mod = 0xc0;
|
||||
|
||||
if ((b1 & 0xff8) == 0xd8)
|
||||
i->setModRM(b2);
|
||||
|
||||
if (mod == 0xc0) { // mod == 11b
|
||||
i->assertModC0();
|
||||
i->setRm(rm);
|
||||
@ -1737,7 +1737,6 @@ modrm_done:
|
||||
}
|
||||
}
|
||||
|
||||
i->modRMForm.Id = 0;
|
||||
unsigned imm_mode = attr & BxImmediate;
|
||||
if (imm_mode) {
|
||||
// make sure iptr was advanced after Ib(), Iw() and Id()
|
||||
|
@ -1817,6 +1817,7 @@ fetch_b1:
|
||||
|
||||
i->setB1(b1);
|
||||
i->setVL(BX_NO_VL);
|
||||
i->modRMForm.Id = 0;
|
||||
|
||||
unsigned index = b1+offset;
|
||||
|
||||
@ -1918,13 +1919,12 @@ fetch_b1:
|
||||
vvv = nnn;
|
||||
i->setVvv(vvv);
|
||||
|
||||
i->setModRM(b2); /* for x87 */
|
||||
|
||||
// MOVs with CRx and DRx always use register ops and ignore the mod field.
|
||||
if ((b1 & ~3) == 0x120)
|
||||
mod = 0xc0;
|
||||
|
||||
if ((b1 & 0xff8) == 0xd8)
|
||||
i->setModRM(b2);
|
||||
|
||||
if (mod == 0xc0) { // mod == 11b
|
||||
i->setRm(rm);
|
||||
i->assertModC0();
|
||||
@ -2147,7 +2147,6 @@ modrm_done:
|
||||
}
|
||||
}
|
||||
|
||||
i->modRMForm.Id = 0;
|
||||
unsigned imm_mode = attr & BxImmediate;
|
||||
if (imm_mode) {
|
||||
// make sure iptr was advanced after Ib(), Iw() and Id()
|
||||
|
@ -128,7 +128,6 @@ public:
|
||||
#define BX_INSTR_METADATA_BASE 4
|
||||
#define BX_INSTR_METADATA_INDEX 5
|
||||
#define BX_INSTR_METADATA_SCALE 6
|
||||
#define BX_INSTR_METADATA_MODRM 7 /* modrm for FPU only */
|
||||
#define BX_INSTR_METADATA_VVV 7
|
||||
|
||||
// using 5-bit field for registers (16 regs in 64-bit, RIP, NIL)
|
||||
@ -184,10 +183,11 @@ public:
|
||||
metaData[BX_INSTR_METADATA_B1] = b1 & 0xff;
|
||||
}
|
||||
BX_CPP_INLINE void setModRM(unsigned modrm) {
|
||||
metaData[BX_INSTR_METADATA_MODRM] = modrm;
|
||||
// none of x87 instructions has immediate
|
||||
modRMForm.Ib = modrm;
|
||||
}
|
||||
BX_CPP_INLINE unsigned modrm() const {
|
||||
return metaData[BX_INSTR_METADATA_MODRM];
|
||||
return modRMForm.Ib;
|
||||
}
|
||||
BX_CPP_INLINE void setNnn(unsigned nnn) {
|
||||
metaData[BX_INSTR_METADATA_NNN] = nnn;
|
||||
|
Loading…
x
Reference in New Issue
Block a user