Organize bxInstruction fields differently
This commit is contained in:
parent
65adf7014b
commit
255d512e29
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: bit.cc,v 1.53 2008-03-27 21:04:39 sshwarts Exp $
|
||||
// $Id: bit.cc,v 1.54 2008-03-31 17:33:30 sshwarts Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2001 MandrakeSoft S.A.
|
||||
@ -293,45 +293,43 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::BSWAP_RRX(bxInstruction_c *i)
|
||||
|
||||
#if (BX_SUPPORT_SSE >= 5) || (BX_SUPPORT_SSE >= 4 && BX_SUPPORT_SSE_EXTENSION > 0)
|
||||
// primitives for CRC32 usage
|
||||
static Bit8u BitReflect8(Bit8u val8)
|
||||
BX_CPP_INLINE Bit8u BitReflect8(Bit8u val8)
|
||||
{
|
||||
return ((val8 & 0x80) >> 7) |
|
||||
((val8 & 0x40) >> 5) |
|
||||
((val8 & 0x20) >> 3) |
|
||||
((val8 & 0x10) >> 1) |
|
||||
((val8 & 0x08) << 1) |
|
||||
((val8 & 0x04) << 3) |
|
||||
((val8 & 0x02) << 5) |
|
||||
((val8 & 0x01) << 7);
|
||||
return ((val8 & 0x80) >> 7) |
|
||||
((val8 & 0x40) >> 5) |
|
||||
((val8 & 0x20) >> 3) |
|
||||
((val8 & 0x10) >> 1) |
|
||||
((val8 & 0x08) << 1) |
|
||||
((val8 & 0x04) << 3) |
|
||||
((val8 & 0x02) << 5) |
|
||||
((val8 & 0x01) << 7);
|
||||
}
|
||||
|
||||
BX_CPP_INLINE Bit16u BitReflect16(Bit16u val16)
|
||||
{
|
||||
return ((Bit16u)(BitReflect8(val16 & 0xff)) << 8) | BitReflect8(val16 >> 8);
|
||||
return ((Bit16u)(BitReflect8(val16 & 0xff)) << 8) | BitReflect8(val16 >> 8);
|
||||
}
|
||||
|
||||
BX_CPP_INLINE Bit32u BitReflect32(Bit32u val32)
|
||||
{
|
||||
return ((Bit32u)(BitReflect16(val32 & 0xffff)) << 16) | BitReflect16(val32 >> 16);
|
||||
return ((Bit32u)(BitReflect16(val32 & 0xffff)) << 16) | BitReflect16(val32 >> 16);
|
||||
}
|
||||
|
||||
static Bit32u mod2_64bit(Bit64u divisor, Bit64u dividend)
|
||||
{
|
||||
Bit64u remainder = dividend >> 32;
|
||||
Bit64u remainder = dividend >> 32;
|
||||
|
||||
for (int bitpos=31; bitpos>=0; bitpos--)
|
||||
{
|
||||
// copy one more bit from the dividend
|
||||
remainder = (remainder << 1) | ((dividend >> bitpos) & 1);
|
||||
for (int bitpos=31; bitpos>=0; bitpos--) {
|
||||
// copy one more bit from the dividend
|
||||
remainder = (remainder << 1) | ((dividend >> bitpos) & 1);
|
||||
|
||||
// if MSB is set, then XOR divisor and get new remainder
|
||||
if (((remainder >> 32) & 1) == 1)
|
||||
{
|
||||
remainder ^= divisor;
|
||||
}
|
||||
// if MSB is set, then XOR divisor and get new remainder
|
||||
if (((remainder >> 32) & 1) == 1) {
|
||||
remainder ^= divisor;
|
||||
}
|
||||
}
|
||||
|
||||
return remainder;
|
||||
return remainder;
|
||||
}
|
||||
#endif // (BX_SUPPORT_SSE >= 5) || (BX_SUPPORT_SSE >= 4 && BX_SUPPORT_SSE_EXTENSION > 0)
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: fetchdecode.cc,v 1.174 2008-03-29 09:58:23 sshwarts Exp $
|
||||
// $Id: fetchdecode.cc,v 1.175 2008-03-31 17:33:30 sshwarts Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2001 MandrakeSoft S.A.
|
||||
@ -2597,8 +2597,8 @@ fetch_b1:
|
||||
mod = 0xc0;
|
||||
|
||||
i->setModRM(b2);
|
||||
i->metaData.metaData1 = rm;
|
||||
i->metaData.metaData5 = nnn;
|
||||
i->setRm(rm);
|
||||
i->setNnn(nnn);
|
||||
|
||||
if (mod == 0xc0) { // mod == 11b
|
||||
i->assertModC0();
|
||||
|
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: fetchdecode64.cc,v 1.181 2008-03-29 09:58:23 sshwarts Exp $
|
||||
// $Id: fetchdecode64.cc,v 1.182 2008-03-31 17:33:33 sshwarts Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2001 MandrakeSoft S.A.
|
||||
@ -3533,8 +3533,8 @@ fetch_b1:
|
||||
mod = 0xc0;
|
||||
|
||||
i->setModRM(b2);
|
||||
i->metaData.metaData1 = rm;
|
||||
i->metaData.metaData5 = nnn;
|
||||
i->setRm(rm);
|
||||
i->setNnn(nnn);
|
||||
|
||||
if (mod == 0xc0) { // mod == 11b
|
||||
i->assertModC0();
|
||||
|
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: instr.h,v 1.7 2008-03-22 21:29:40 sshwarts Exp $
|
||||
// $Id: instr.h,v 1.8 2008-03-31 17:33:34 sshwarts Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2008 Stanislav Shwartsman
|
||||
@ -66,39 +66,17 @@ public:
|
||||
Bit8u metaInfo1;
|
||||
} metaInfo;
|
||||
|
||||
// using 5-bit index for registers (16 regs in 64-bit and RIP)
|
||||
struct {
|
||||
// (unused, keep for alignment)
|
||||
// (will be used for SSE5 destination override later)
|
||||
Bit8u metaData8;
|
||||
#define BX_INSTR_METADATA_SEG 0
|
||||
#define BX_INSTR_METADATA_DEST 1
|
||||
#define BX_INSTR_METADATA_NNN 2
|
||||
#define BX_INSTR_METADATA_RM 3
|
||||
#define BX_INSTR_METADATA_BASE 4
|
||||
#define BX_INSTR_METADATA_INDEX 5
|
||||
#define BX_INSTR_METADATA_SCALE 6
|
||||
#define BX_INSTR_METADATA_MODRM 7
|
||||
|
||||
// 7...0 modrm
|
||||
Bit8u metaData7;
|
||||
|
||||
// 7...3 (unused)
|
||||
// 2...0 seg
|
||||
Bit8u metaData6;
|
||||
|
||||
// 7...5 (unused)
|
||||
// 4...0 nnn (modrm)
|
||||
Bit8u metaData5;
|
||||
|
||||
// 7...5 (unused)
|
||||
// 4...0 base (sib)
|
||||
Bit8u metaData4;
|
||||
|
||||
// 7...5 (unused)
|
||||
// 4...0 index (sib)
|
||||
Bit8u metaData3;
|
||||
|
||||
// 7...2 (unused)
|
||||
// 1...0 scale (sib)
|
||||
Bit8u metaData2;
|
||||
|
||||
// 7...5 (unused)
|
||||
// 4...0 rm (modrm) // also used for opcodeReg()
|
||||
Bit8u metaData1;
|
||||
} metaData;
|
||||
// using 5-bit field for registers (16 regs in 64-bit, RIP, NIL)
|
||||
Bit8u metaData[8];
|
||||
|
||||
union {
|
||||
// Form (longest case): [opcode+modrm+sib/displacement32/immediate32]
|
||||
@ -134,20 +112,6 @@ public:
|
||||
#endif
|
||||
};
|
||||
|
||||
BX_CPP_INLINE void setOpcodeReg(unsigned opreg) {
|
||||
// The opcodeReg form (low 3 bits of the opcode byte (extended
|
||||
// by REX.B on x86-64) to be used with IxIxForm or IqForm.
|
||||
metaData.metaData1 = opreg;
|
||||
}
|
||||
BX_CPP_INLINE unsigned opcodeReg() {
|
||||
return metaData.metaData1;
|
||||
}
|
||||
BX_CPP_INLINE void setModRM(unsigned modrm) {
|
||||
metaData.metaData7 = modrm;
|
||||
}
|
||||
BX_CPP_INLINE unsigned modrm() {
|
||||
return metaData.metaData7;
|
||||
}
|
||||
BX_CPP_INLINE unsigned modC0()
|
||||
{
|
||||
// This is a cheaper way to test for modRM instructions where
|
||||
@ -159,29 +123,49 @@ public:
|
||||
{
|
||||
return metaInfo.metaInfo1 |= (1<<2);
|
||||
}
|
||||
BX_CPP_INLINE void setOpcodeReg(unsigned opreg) {
|
||||
// The opcodeReg form (low 3 bits of the opcode byte (extended
|
||||
// by REX.B on x86-64) to be used with IxIxForm or IqForm.
|
||||
metaData[BX_INSTR_METADATA_RM] = opreg;
|
||||
}
|
||||
BX_CPP_INLINE unsigned opcodeReg() {
|
||||
return metaData[BX_INSTR_METADATA_RM];
|
||||
}
|
||||
BX_CPP_INLINE void setModRM(unsigned modrm) {
|
||||
metaData[BX_INSTR_METADATA_MODRM] = modrm;
|
||||
}
|
||||
BX_CPP_INLINE unsigned modrm() {
|
||||
return metaData[BX_INSTR_METADATA_MODRM];
|
||||
}
|
||||
BX_CPP_INLINE void setNnn(unsigned nnn) {
|
||||
metaData[BX_INSTR_METADATA_NNN] = nnn;
|
||||
}
|
||||
BX_CPP_INLINE unsigned nnn() {
|
||||
return metaData.metaData5;
|
||||
return metaData[BX_INSTR_METADATA_NNN];
|
||||
}
|
||||
BX_CPP_INLINE void setRm(unsigned rm) {
|
||||
metaData[BX_INSTR_METADATA_RM] = rm;
|
||||
}
|
||||
BX_CPP_INLINE unsigned rm() {
|
||||
return metaData.metaData1;
|
||||
return metaData[BX_INSTR_METADATA_RM];
|
||||
}
|
||||
BX_CPP_INLINE void setSibScale(unsigned scale) {
|
||||
metaData.metaData2 = scale;
|
||||
metaData[BX_INSTR_METADATA_SCALE] = scale;
|
||||
}
|
||||
BX_CPP_INLINE unsigned sibScale() {
|
||||
return metaData.metaData2;
|
||||
return metaData[BX_INSTR_METADATA_SCALE];
|
||||
}
|
||||
BX_CPP_INLINE void setSibIndex(unsigned index) {
|
||||
metaData.metaData3 = index;
|
||||
metaData[BX_INSTR_METADATA_INDEX] = index;
|
||||
}
|
||||
BX_CPP_INLINE unsigned sibIndex() {
|
||||
return metaData.metaData3;
|
||||
return metaData[BX_INSTR_METADATA_INDEX];
|
||||
}
|
||||
BX_CPP_INLINE void setSibBase(unsigned base) {
|
||||
metaData.metaData4 = base;
|
||||
metaData[BX_INSTR_METADATA_BASE] = base;
|
||||
}
|
||||
BX_CPP_INLINE unsigned sibBase() {
|
||||
return metaData.metaData4;
|
||||
return metaData[BX_INSTR_METADATA_BASE];
|
||||
}
|
||||
BX_CPP_INLINE Bit32u displ32u() { return modRMForm.displ32u; }
|
||||
BX_CPP_INLINE Bit16u displ16u() { return modRMForm.displ16u; }
|
||||
@ -204,13 +188,13 @@ public:
|
||||
metaInfo.metaInfo1 = (os32<<3) | (as32<<4) | (os64<<5) | (as64<<6);
|
||||
metaInfo.metaInfo2 = 0;
|
||||
metaInfo.metaInfo3 = 0;
|
||||
metaData.metaData6 = BX_SEG_REG_NULL;
|
||||
metaData[BX_INSTR_METADATA_SEG] = BX_SEG_REG_NULL;
|
||||
}
|
||||
BX_CPP_INLINE unsigned seg(void) {
|
||||
return metaData.metaData6;
|
||||
return metaData[BX_INSTR_METADATA_SEG];
|
||||
}
|
||||
BX_CPP_INLINE void setSeg(unsigned val) {
|
||||
metaData.metaData6 = val;
|
||||
metaData[BX_INSTR_METADATA_SEG] = val;
|
||||
}
|
||||
|
||||
BX_CPP_INLINE unsigned os32L(void) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user