3210 lines
83 KiB
Plaintext
Executable File
3210 lines
83 KiB
Plaintext
Executable File
----------------------------------------------------------------------
|
|
Patch name: patch.pipelined-asm-cclark
|
|
Author: Conn Clark
|
|
Date: Thu Aug 28 2003
|
|
Status: Proposed
|
|
|
|
Detailed description:
|
|
|
|
I have an initial version of my piplined asm patch. I basicaly
|
|
incorporated the flags macros into the inline assembly. This should help
|
|
speed up execution on pentium or newer processors a little bit. In my
|
|
testing some things realy get a boost, others may not get much of one,
|
|
and some programs may suffer a slight decrease in performance. The gains
|
|
out number the losses though. You may not see much of a difference in
|
|
the win95 boot times.
|
|
|
|
I have the patch is against a CVS image I pulled down on 8-13-03 . It
|
|
was generated by a "diff -ur" command. I still have some clean ups. I
|
|
get warnings on the arith16.cc and logical16.cc . I don't think I have
|
|
broke the x86-64 code but I'm not sure because I haven't tested it.
|
|
|
|
|
|
Patch was created with:
|
|
cvs diff -u
|
|
Apply patch to what version:
|
|
cvs checked out on DATE, release version VER
|
|
Instructions:
|
|
To patch, go to main bochs directory.
|
|
Type "patch -p0 < THIS_PATCH_FILE".
|
|
----------------------------------------------------------------------
|
|
diff -ur bochs/cpu/arith16.cc bochs-modified/cpu/arith16.cc
|
|
--- bochs/cpu/arith16.cc Fri Oct 25 11:26:26 2002
|
|
+++ bochs-modified/cpu/arith16.cc Fri Aug 15 14:59:17 2003
|
|
@@ -37,10 +37,7 @@
|
|
BX_CPU_C::INC_RX(bxInstruction_c *i)
|
|
{
|
|
#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
-
|
|
- asmInc16(BX_CPU_THIS_PTR gen_reg[i->opcodeReg()].word.rx, flags32);
|
|
- setEFlagsOSZAP(flags32);
|
|
+ asmInc16PlusFlags(BX_CPU_THIS_PTR gen_reg[i->opcodeReg()].word.rx, BX_CPU_THIS_PTR lf_flags_status, BX_CPU_THIS_PTR eflags.val32);
|
|
#else
|
|
Bit16u rx;
|
|
rx = ++ BX_CPU_THIS_PTR gen_reg[i->opcodeReg()].word.rx;
|
|
@@ -53,10 +50,7 @@
|
|
BX_CPU_C::DEC_RX(bxInstruction_c *i)
|
|
{
|
|
#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
-
|
|
- asmDec16(BX_CPU_THIS_PTR gen_reg[i->opcodeReg()].word.rx, flags32);
|
|
- setEFlagsOSZAP(flags32);
|
|
+ asmDec16PlusFlags(BX_CPU_THIS_PTR gen_reg[i->opcodeReg()].word.rx, BX_CPU_THIS_PTR lf_flags_status, BX_CPU_THIS_PTR eflags.val32);
|
|
#else
|
|
Bit16u rx;
|
|
|
|
@@ -70,6 +64,19 @@
|
|
void
|
|
BX_CPU_C::ADD_EwGw(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+ Bit16u op1_16;
|
|
+
|
|
+ if (i->modC0()) {
|
|
+ asmAdd16PlusFlags(BX_READ_16BIT_REG(i->rm()),BX_READ_16BIT_REG(i->nnn()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ }
|
|
+ else {
|
|
+ read_RMW_virtual_word(i->seg(), RMAddr(i), &op1_16);
|
|
+ asmAdd16PlusFlags(op1_16,BX_READ_16BIT_REG(i->nnn()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_word(op1_16);
|
|
+ }
|
|
+
|
|
+#else
|
|
Bit16u op2_16, op1_16, sum_16;
|
|
|
|
op2_16 = BX_READ_16BIT_REG(i->nnn());
|
|
@@ -86,31 +93,31 @@
|
|
}
|
|
|
|
SET_FLAGS_OSZAPC_16(op1_16, op2_16, sum_16, BX_INSTR_ADD16);
|
|
+#endif
|
|
}
|
|
|
|
|
|
void
|
|
BX_CPU_C::ADD_GwEEw(bxInstruction_c *i)
|
|
{
|
|
- Bit16u op1_16, op2_16, sum_16;
|
|
- unsigned nnn = i->nnn();
|
|
+ Bit16u op2_16;
|
|
|
|
- op1_16 = BX_READ_16BIT_REG(nnn);
|
|
|
|
read_virtual_word(i->seg(), RMAddr(i), &op2_16);
|
|
|
|
#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
+asmAdd16PlusFlags(BX_READ_16BIT_REG(i->nnn()),op2_16,BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
|
|
- asmAdd16(sum_16, op1_16, op2_16, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
#else
|
|
+ Bit16u op1_16, sum_16;
|
|
+ unsigned nnn = i->nnn();
|
|
+
|
|
+ op1_16 = BX_READ_16BIT_REG(nnn);
|
|
+
|
|
sum_16 = op1_16 + op2_16;
|
|
-#endif
|
|
|
|
BX_WRITE_16BIT_REG(nnn, sum_16);
|
|
|
|
-#if !(defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
SET_FLAGS_OSZAPC_16(op1_16, op2_16, sum_16, BX_INSTR_ADD16);
|
|
#endif
|
|
}
|
|
@@ -118,24 +125,19 @@
|
|
void
|
|
BX_CPU_C::ADD_GwEGw(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+asmAdd16PlusFlags(BX_READ_16BIT_REG(i->nnn()),BX_READ_16BIT_REG(i->rm()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+#else
|
|
Bit16u op1_16, op2_16, sum_16;
|
|
unsigned nnn = i->nnn();
|
|
|
|
op1_16 = BX_READ_16BIT_REG(nnn);
|
|
op2_16 = BX_READ_16BIT_REG(i->rm());
|
|
|
|
-#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
-
|
|
- asmAdd16(sum_16, op1_16, op2_16, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
-#else
|
|
sum_16 = op1_16 + op2_16;
|
|
-#endif
|
|
|
|
BX_WRITE_16BIT_REG(nnn, sum_16);
|
|
|
|
-#if !(defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
SET_FLAGS_OSZAPC_16(op1_16, op2_16, sum_16, BX_INSTR_ADD16);
|
|
#endif
|
|
}
|
|
@@ -144,6 +146,9 @@
|
|
void
|
|
BX_CPU_C::ADD_AXIw(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+asmAdd16PlusFlags(AX,i->Iw(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+#else
|
|
Bit16u op1_16, op2_16, sum_16;
|
|
|
|
op1_16 = AX;
|
|
@@ -154,11 +159,36 @@
|
|
AX = sum_16;
|
|
|
|
SET_FLAGS_OSZAPC_16(op1_16, op2_16, sum_16, BX_INSTR_ADD16);
|
|
+#endif
|
|
}
|
|
|
|
void
|
|
BX_CPU_C::ADC_EwGw(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+ Bit16u op1_16;
|
|
+if (getB_CF()){
|
|
+ if (i->modC0()) {
|
|
+ asmAdc16PlusFlags_carry(BX_READ_16BIT_REG(i->rm()),BX_READ_16BIT_REG(i->nnn()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ }
|
|
+ else {
|
|
+ read_RMW_virtual_word(i->seg(), RMAddr(i), &op1_16);
|
|
+ asmAdc16PlusFlags_carry(op1_16,BX_READ_16BIT_REG(i->nnn()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_word(op1_16);
|
|
+ }
|
|
+ }
|
|
+else {
|
|
+ if (i->modC0()) {
|
|
+ asmAdd16PlusFlags(BX_READ_16BIT_REG(i->rm()),BX_READ_16BIT_REG(i->nnn()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ }
|
|
+ else {
|
|
+ read_RMW_virtual_word(i->seg(), RMAddr(i), &op1_16);
|
|
+ asmAdd16PlusFlags(op1_16,BX_READ_16BIT_REG(i->nnn()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_word(op1_16);
|
|
+ }
|
|
+ }
|
|
+
|
|
+#else
|
|
bx_bool temp_CF;
|
|
Bit16u op2_16, op1_16, sum_16;
|
|
|
|
@@ -179,12 +209,34 @@
|
|
|
|
SET_FLAGS_OSZAPC_16_CF(op1_16, op2_16, sum_16, BX_INSTR_ADC16,
|
|
temp_CF);
|
|
+#endif
|
|
}
|
|
|
|
|
|
void
|
|
BX_CPU_C::ADC_GwEw(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+Bit16u op2_16;
|
|
+if (getB_CF()) {
|
|
+ if (i->modC0()) {
|
|
+ op2_16 = BX_READ_16BIT_REG(i->rm());
|
|
+ }
|
|
+ else {
|
|
+ read_virtual_word(i->seg(), RMAddr(i), &op2_16);
|
|
+ }
|
|
+ asmAdc16PlusFlags_carry(BX_READ_16BIT_REG(i->nnn()),op2_16,BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ }
|
|
+else {
|
|
+ if (i->modC0()) {
|
|
+ op2_16 = BX_READ_16BIT_REG(i->rm());
|
|
+ }
|
|
+ else {
|
|
+ read_virtual_word(i->seg(), RMAddr(i), &op2_16);
|
|
+ }
|
|
+ asmAdd16PlusFlags(BX_READ_16BIT_REG(i->nnn()),op2_16,BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ }
|
|
+#else
|
|
bx_bool temp_CF;
|
|
Bit16u op1_16, op2_16, sum_16;
|
|
|
|
@@ -206,12 +258,20 @@
|
|
|
|
SET_FLAGS_OSZAPC_16_CF(op1_16, op2_16, sum_16, BX_INSTR_ADC16,
|
|
temp_CF);
|
|
+#endif
|
|
}
|
|
|
|
|
|
void
|
|
BX_CPU_C::ADC_AXIw(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+if (getB_CF())
|
|
+ asmAdc16PlusFlags_carry(AX,i->Iw(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+else
|
|
+ asmAdd16PlusFlags(AX,i->Iw(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+
|
|
+#else
|
|
bx_bool temp_CF;
|
|
Bit16u op1_16, op2_16, sum_16;
|
|
|
|
@@ -226,6 +286,7 @@
|
|
|
|
SET_FLAGS_OSZAPC_16_CF(op1_16, op2_16, sum_16, BX_INSTR_ADC16,
|
|
temp_CF);
|
|
+#endif
|
|
}
|
|
|
|
|
|
@@ -234,6 +295,29 @@
|
|
void
|
|
BX_CPU_C::SBB_EwGw(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+Bit16u op1_16;
|
|
+if (getB_CF()){
|
|
+ if (i->modC0()) {
|
|
+ asmSbb16PlusFlags_borrow(BX_READ_16BIT_REG(i->rm()),BX_READ_16BIT_REG(i->nnn()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ }
|
|
+ else {
|
|
+ read_RMW_virtual_word(i->seg(), RMAddr(i), &op1_16);
|
|
+ asmSbb16PlusFlags_borrow(op1_16,BX_READ_16BIT_REG(i->nnn()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_word(op1_16);
|
|
+ }
|
|
+ }
|
|
+else {
|
|
+ if (i->modC0()) {
|
|
+ asmSub16PlusFlags(BX_READ_16BIT_REG(i->rm()),BX_READ_16BIT_REG(i->nnn()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ }
|
|
+ else {
|
|
+ read_RMW_virtual_word(i->seg(), RMAddr(i), &op1_16);
|
|
+ asmSub16PlusFlags(op1_16,BX_READ_16BIT_REG(i->nnn()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_word(op1_16);
|
|
+ }
|
|
+ }
|
|
+#else
|
|
bx_bool temp_CF;
|
|
Bit16u op2_16, op1_16, diff_16;
|
|
|
|
@@ -254,12 +338,34 @@
|
|
|
|
SET_FLAGS_OSZAPC_16_CF(op1_16, op2_16, diff_16, BX_INSTR_SBB16,
|
|
temp_CF);
|
|
+#endif
|
|
}
|
|
|
|
|
|
void
|
|
BX_CPU_C::SBB_GwEw(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+Bit16u op2_16;
|
|
+if (getB_CF()) {
|
|
+ if (i->modC0()) {
|
|
+ op2_16 = BX_READ_16BIT_REG(i->rm());
|
|
+ }
|
|
+ else {
|
|
+ read_virtual_word(i->seg(), RMAddr(i), &op2_16);
|
|
+ }
|
|
+ asmSbb16PlusFlags_borrow(BX_READ_16BIT_REG(i->nnn()),op2_16,BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ }
|
|
+else {
|
|
+ if (i->modC0()) {
|
|
+ op2_16 = BX_READ_16BIT_REG(i->rm());
|
|
+ }
|
|
+ else {
|
|
+ read_virtual_word(i->seg(), RMAddr(i), &op2_16);
|
|
+ }
|
|
+ asmSub16PlusFlags(BX_READ_16BIT_REG(i->nnn()),op2_16,BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ }
|
|
+#else
|
|
bx_bool temp_CF;
|
|
|
|
temp_CF = getB_CF();
|
|
@@ -281,12 +387,20 @@
|
|
|
|
SET_FLAGS_OSZAPC_16_CF(op1_16, op2_16, diff_16, BX_INSTR_SBB16,
|
|
temp_CF);
|
|
+#endif
|
|
}
|
|
|
|
|
|
void
|
|
BX_CPU_C::SBB_AXIw(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+if (getB_CF())
|
|
+ asmSbb16PlusFlags_borrow(AX,i->Iw(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+else
|
|
+ asmSub16PlusFlags(AX,i->Iw(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+
|
|
+#else
|
|
bx_bool temp_CF;
|
|
Bit16u op1_16, op2_16, diff_16;
|
|
|
|
@@ -301,6 +415,7 @@
|
|
|
|
SET_FLAGS_OSZAPC_16_CF(op1_16, op2_16, diff_16, BX_INSTR_SBB16,
|
|
temp_CF);
|
|
+#endif
|
|
}
|
|
|
|
|
|
@@ -308,6 +423,29 @@
|
|
void
|
|
BX_CPU_C::SBB_EwIw(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+Bit16u op1_16;
|
|
+if (getB_CF()){
|
|
+ if (i->modC0()) {
|
|
+ asmSbb16PlusFlags_borrow(BX_READ_16BIT_REG(i->rm()),i->Iw(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ }
|
|
+ else {
|
|
+ read_RMW_virtual_word(i->seg(), RMAddr(i), &op1_16);
|
|
+ asmSbb16PlusFlags_borrow(op1_16,i->Iw(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_word(op1_16);
|
|
+ }
|
|
+ }
|
|
+else {
|
|
+ if (i->modC0()) {
|
|
+ asmSub16PlusFlags(BX_READ_16BIT_REG(i->rm()),i->Iw(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ }
|
|
+ else {
|
|
+ read_RMW_virtual_word(i->seg(), RMAddr(i), &op1_16);
|
|
+ asmSub16PlusFlags(op1_16,i->Iw(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_word(op1_16);
|
|
+ }
|
|
+ }
|
|
+#else
|
|
bx_bool temp_CF;
|
|
Bit16u op2_16, op1_16, diff_16;
|
|
|
|
@@ -328,54 +466,48 @@
|
|
|
|
SET_FLAGS_OSZAPC_16_CF(op1_16, op2_16, diff_16, BX_INSTR_SBB16,
|
|
temp_CF);
|
|
+#endif
|
|
}
|
|
|
|
|
|
void
|
|
BX_CPU_C::SUB_EwGw(bxInstruction_c *i)
|
|
{
|
|
- Bit16u op2_16, op1_16, diff_16;
|
|
+ Bit16u op2_16, op1_16;
|
|
|
|
op2_16 = BX_READ_16BIT_REG(i->nnn());
|
|
|
|
if (i->modC0()) {
|
|
- op1_16 = BX_READ_16BIT_REG(i->rm());
|
|
#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
-
|
|
- asmSub16(diff_16, op1_16, op2_16, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
+ asmSub16PlusFlags(BX_READ_16BIT_REG(i->rm()),op2_16,BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
#else
|
|
+Bit16u diff_16;
|
|
+
|
|
+ op1_16 = BX_READ_16BIT_REG(i->rm());
|
|
diff_16 = op1_16 - op2_16;
|
|
-#endif
|
|
BX_WRITE_16BIT_REG(i->rm(), diff_16);
|
|
+ SET_FLAGS_OSZAPC_16(op1_16, op2_16, diff_16, BX_INSTR_SUB16);
|
|
+#endif
|
|
}
|
|
else {
|
|
read_RMW_virtual_word(i->seg(), RMAddr(i), &op1_16);
|
|
#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
-
|
|
- asmSub16(diff_16, op1_16, op2_16, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
+ asmSub16PlusFlags(op1_16,op2_16,BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_word(op1_16);
|
|
#else
|
|
+Bit16u diff_16;
|
|
diff_16 = op1_16 - op2_16;
|
|
-#endif
|
|
Write_RMW_virtual_word(diff_16);
|
|
- }
|
|
-
|
|
-#if !(defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- SET_FLAGS_OSZAPC_16(op1_16, op2_16, diff_16, BX_INSTR_SUB16);
|
|
+ SET_FLAGS_OSZAPC_16(op1_16, op2_16, diff_16, BX_INSTR_SUB16);
|
|
#endif
|
|
+ }
|
|
}
|
|
|
|
|
|
void
|
|
BX_CPU_C::SUB_GwEw(bxInstruction_c *i)
|
|
{
|
|
- Bit16u op1_16, op2_16, diff_16;
|
|
- unsigned nnn = i->nnn();
|
|
-
|
|
- op1_16 = BX_READ_16BIT_REG(nnn);
|
|
+ Bit16u op2_16;
|
|
|
|
if (i->modC0()) {
|
|
op2_16 = BX_READ_16BIT_REG(i->rm());
|
|
@@ -385,17 +517,17 @@
|
|
}
|
|
|
|
#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
-
|
|
- asmSub16(diff_16, op1_16, op2_16, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
+asmSub16PlusFlags(BX_READ_16BIT_REG(i->nnn()),op2_16,BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
#else
|
|
+ Bit16u op1_16, diff_16;
|
|
+ unsigned nnn = i->nnn();
|
|
+
|
|
+ op1_16 = BX_READ_16BIT_REG(nnn);
|
|
+
|
|
diff_16 = op1_16 - op2_16;
|
|
-#endif
|
|
|
|
BX_WRITE_16BIT_REG(nnn, diff_16);
|
|
|
|
-#if !(defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
SET_FLAGS_OSZAPC_16(op1_16, op2_16, diff_16, BX_INSTR_SUB16);
|
|
#endif
|
|
}
|
|
@@ -403,23 +535,18 @@
|
|
void
|
|
BX_CPU_C::SUB_AXIw(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+asmSub16PlusFlags(AX,i->Iw(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+#else
|
|
Bit16u op1_16, op2_16, diff_16;
|
|
|
|
op1_16 = AX;
|
|
op2_16 = i->Iw();
|
|
|
|
-#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
-
|
|
- asmSub16(diff_16, op1_16, op2_16, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
-#else
|
|
diff_16 = op1_16 - op2_16;
|
|
-#endif
|
|
|
|
AX = diff_16;
|
|
|
|
-#if !(defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
SET_FLAGS_OSZAPC_16(op1_16, op2_16, diff_16, BX_INSTR_SUB16);
|
|
#endif
|
|
}
|
|
@@ -428,9 +555,8 @@
|
|
void
|
|
BX_CPU_C::CMP_EwGw(bxInstruction_c *i)
|
|
{
|
|
- Bit16u op2_16, op1_16;
|
|
+ Bit16u op1_16;
|
|
|
|
- op2_16 = BX_READ_16BIT_REG(i->nnn());
|
|
|
|
if (i->modC0()) {
|
|
op1_16 = BX_READ_16BIT_REG(i->rm());
|
|
@@ -440,12 +566,12 @@
|
|
}
|
|
|
|
#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
-
|
|
- asmCmp16(op1_16, op2_16, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
+asmCmp16PlusFlags(op1_16,BX_READ_16BIT_REG(i->nnn()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
#else
|
|
- Bit16u diff_16;
|
|
+ Bit16u op2_16, diff_16;
|
|
+
|
|
+ op2_16 = BX_READ_16BIT_REG(i->nnn());
|
|
+
|
|
diff_16 = op1_16 - op2_16;
|
|
|
|
SET_FLAGS_OSZAPC_16(op1_16, op2_16, diff_16, BX_INSTR_CMP16);
|
|
@@ -453,12 +579,12 @@
|
|
}
|
|
|
|
|
|
+
|
|
void
|
|
BX_CPU_C::CMP_GwEw(bxInstruction_c *i)
|
|
{
|
|
- Bit16u op1_16, op2_16;
|
|
+ Bit16u op2_16;
|
|
|
|
- op1_16 = BX_READ_16BIT_REG(i->nnn());
|
|
|
|
if (i->modC0()) {
|
|
op2_16 = BX_READ_16BIT_REG(i->rm());
|
|
@@ -468,33 +594,29 @@
|
|
}
|
|
|
|
#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
-
|
|
- asmCmp16(op1_16, op2_16, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
+asmCmp16PlusFlags(BX_READ_16BIT_REG(i->nnn()),op2_16,BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
#else
|
|
- Bit16u diff_16;
|
|
+ Bit16u op1_16, diff_16;
|
|
+
|
|
+ op1_16 = BX_READ_16BIT_REG(i->nnn());
|
|
+
|
|
diff_16 = op1_16 - op2_16;
|
|
|
|
SET_FLAGS_OSZAPC_16(op1_16, op2_16, diff_16, BX_INSTR_CMP16);
|
|
#endif
|
|
}
|
|
|
|
-
|
|
- void
|
|
+ void
|
|
BX_CPU_C::CMP_AXIw(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+asmCmp16PlusFlags(AX,i->Iw(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+#else
|
|
Bit16u op1_16, op2_16;
|
|
|
|
op1_16 = AX;
|
|
op2_16 = i->Iw();
|
|
|
|
-#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
-
|
|
- asmCmp16(op1_16, op2_16, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
-#else
|
|
Bit16u diff_16;
|
|
diff_16 = op1_16 - op2_16;
|
|
|
|
@@ -569,23 +691,21 @@
|
|
void
|
|
BX_CPU_C::ADD_EEwIw(bxInstruction_c *i)
|
|
{
|
|
- Bit16u op2_16, op1_16, sum_16;
|
|
-
|
|
- op2_16 = i->Iw();
|
|
+ Bit16u op1_16;
|
|
|
|
read_RMW_virtual_word(i->seg(), RMAddr(i), &op1_16);
|
|
|
|
#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
-
|
|
- asmAdd16(sum_16, op1_16, op2_16, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
+asmAdd16PlusFlags(op1_16,i->Iw(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_word(op1_16);
|
|
#else
|
|
+ Bit16u op2_16, sum_16;
|
|
+
|
|
+ op2_16 = i->Iw();
|
|
sum_16 = op1_16 + op2_16;
|
|
-#endif
|
|
+
|
|
Write_RMW_virtual_word(sum_16);
|
|
|
|
-#if !(defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
SET_FLAGS_OSZAPC_16(op1_16, op2_16, sum_16, BX_INSTR_ADD16);
|
|
#endif
|
|
}
|
|
@@ -593,23 +713,18 @@
|
|
void
|
|
BX_CPU_C::ADD_EGwIw(bxInstruction_c *i)
|
|
{
|
|
- Bit16u op2_16, op1_16, sum_16;
|
|
-
|
|
- op2_16 = i->Iw();
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+asmAdd16PlusFlags(BX_READ_16BIT_REG(i->rm()),i->Iw(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+#else
|
|
+ Bit16u op1_16, op2_16, sum_16;
|
|
|
|
op1_16 = BX_READ_16BIT_REG(i->rm());
|
|
|
|
-#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
+ op2_16 = i->Iw();
|
|
|
|
- asmAdd16(sum_16, op1_16, op2_16, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
-#else
|
|
sum_16 = op1_16 + op2_16;
|
|
-#endif
|
|
BX_WRITE_16BIT_REG(i->rm(), sum_16);
|
|
|
|
-#if !(defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
SET_FLAGS_OSZAPC_16(op1_16, op2_16, sum_16, BX_INSTR_ADD16);
|
|
#endif
|
|
}
|
|
@@ -617,6 +732,29 @@
|
|
void
|
|
BX_CPU_C::ADC_EwIw(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+Bit16u op1_16;
|
|
+if (getB_CF()){
|
|
+ if (i->modC0()) {
|
|
+ asmAdc16PlusFlags_carry(BX_READ_16BIT_REG(i->rm()),i->Iw(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ }
|
|
+ else {
|
|
+ read_RMW_virtual_word(i->seg(), RMAddr(i), &op1_16);
|
|
+ asmAdc16PlusFlags_carry(op1_16,i->Iw(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_word(op1_16);
|
|
+ }
|
|
+ }
|
|
+else {
|
|
+ if (i->modC0()) {
|
|
+ asmAdd16PlusFlags(BX_READ_16BIT_REG(i->rm()),i->Iw(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ }
|
|
+ else {
|
|
+ read_RMW_virtual_word(i->seg(), RMAddr(i), &op1_16);
|
|
+ asmAdd16PlusFlags(op1_16,i->Iw(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_word(op1_16);
|
|
+ }
|
|
+ }
|
|
+#else
|
|
bx_bool temp_CF;
|
|
Bit16u op2_16, op1_16, sum_16;
|
|
|
|
@@ -637,53 +775,46 @@
|
|
|
|
SET_FLAGS_OSZAPC_16_CF(op1_16, op2_16, sum_16, BX_INSTR_ADC16,
|
|
temp_CF);
|
|
+#endif
|
|
}
|
|
|
|
|
|
void
|
|
BX_CPU_C::SUB_EwIw(bxInstruction_c *i)
|
|
{
|
|
- Bit16u op2_16, op1_16, diff_16;
|
|
-
|
|
-
|
|
- op2_16 = i->Iw();
|
|
+ Bit16u op1_16;
|
|
|
|
if (i->modC0()) {
|
|
- op1_16 = BX_READ_16BIT_REG(i->rm());
|
|
#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
-
|
|
- asmSub16(diff_16, op1_16, op2_16, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
+ asmSub16PlusFlags(BX_READ_16BIT_REG(i->rm()),i->Iw(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
#else
|
|
+Bit16u op2_16, diff_16;
|
|
+ op1_16 = BX_READ_16BIT_REG(i->rm());
|
|
+ op2_16 = i->Iw();
|
|
diff_16 = op1_16 - op2_16;
|
|
-#endif
|
|
BX_WRITE_16BIT_REG(i->rm(), diff_16);
|
|
+ SET_FLAGS_OSZAPC_16(op1_16, op2_16, diff_16, BX_INSTR_SUB16);
|
|
+#endif
|
|
}
|
|
else {
|
|
read_RMW_virtual_word(i->seg(), RMAddr(i), &op1_16);
|
|
#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
-
|
|
- asmSub16(diff_16, op1_16, op2_16, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
+ asmSub16PlusFlags(op1_16,i->Iw(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_word(op1_16);
|
|
#else
|
|
+Bit16u op2_16, diff_16;
|
|
+ op2_16 = i->Iw();
|
|
diff_16 = op1_16 - op2_16;
|
|
-#endif
|
|
Write_RMW_virtual_word(diff_16);
|
|
- }
|
|
-
|
|
-#if !(defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- SET_FLAGS_OSZAPC_16(op1_16, op2_16, diff_16, BX_INSTR_SUB16);
|
|
+ SET_FLAGS_OSZAPC_16(op1_16, op2_16, diff_16, BX_INSTR_SUB16);
|
|
#endif
|
|
+ }
|
|
}
|
|
|
|
void
|
|
BX_CPU_C::CMP_EwIw(bxInstruction_c *i)
|
|
{
|
|
- Bit16u op2_16, op1_16;
|
|
-
|
|
- op2_16 = i->Iw();
|
|
+ Bit16u op1_16;
|
|
|
|
if (i->modC0()) {
|
|
op1_16 = BX_READ_16BIT_REG(i->rm());
|
|
@@ -693,11 +824,11 @@
|
|
}
|
|
|
|
#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
-
|
|
- asmCmp16(op1_16, op2_16, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
+asmCmp16PlusFlags(op1_16,i->Iw(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
#else
|
|
+ Bit16u op2_16;
|
|
+
|
|
+ op2_16 = i->Iw();
|
|
Bit16u diff_16;
|
|
diff_16 = op1_16 - op2_16;
|
|
|
|
@@ -732,6 +863,16 @@
|
|
BX_CPU_C::INC_Ew(bxInstruction_c *i)
|
|
{
|
|
Bit16u op1_16;
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+ if (i->modC0()) {
|
|
+ asmInc16PlusFlags(BX_READ_16BIT_REG(i->rm()), BX_CPU_THIS_PTR lf_flags_status, BX_CPU_THIS_PTR eflags.val32);
|
|
+ }
|
|
+ else {
|
|
+ read_RMW_virtual_word(i->seg(), RMAddr(i), &op1_16);
|
|
+ asmInc16PlusFlags(op1_16, BX_CPU_THIS_PTR lf_flags_status, BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_word(op1_16);
|
|
+ }
|
|
+#else
|
|
|
|
if (i->modC0()) {
|
|
op1_16 = BX_READ_16BIT_REG(i->rm());
|
|
@@ -745,6 +886,7 @@
|
|
}
|
|
|
|
SET_FLAGS_OSZAP_16(0, 0, op1_16, BX_INSTR_INC16);
|
|
+#endif
|
|
}
|
|
|
|
|
|
@@ -755,32 +897,25 @@
|
|
|
|
if (i->modC0()) {
|
|
#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
-
|
|
- asmDec16(BX_CPU_THIS_PTR gen_reg[i->rm()].word.rx, flags32);
|
|
- setEFlagsOSZAP(flags32);
|
|
+ asmDec16PlusFlags(BX_READ_16BIT_REG(i->rm()), BX_CPU_THIS_PTR lf_flags_status, BX_CPU_THIS_PTR eflags.val32);
|
|
#else
|
|
op1_16 = BX_READ_16BIT_REG(i->rm());
|
|
op1_16--;
|
|
BX_WRITE_16BIT_REG(i->rm(), op1_16);
|
|
+ SET_FLAGS_OSZAP_16(0, 0, op1_16, BX_INSTR_DEC16);
|
|
#endif
|
|
}
|
|
else {
|
|
read_RMW_virtual_word(i->seg(), RMAddr(i), &op1_16);
|
|
#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
-
|
|
- asmDec16(op1_16, flags32);
|
|
- setEFlagsOSZAP(flags32);
|
|
+ asmDec16PlusFlags(op1_16, BX_CPU_THIS_PTR lf_flags_status, BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_word(op1_16);
|
|
#else
|
|
op1_16--;
|
|
-#endif
|
|
Write_RMW_virtual_word(op1_16);
|
|
- }
|
|
-
|
|
-#if !(defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- SET_FLAGS_OSZAP_16(0, 0, op1_16, BX_INSTR_DEC16);
|
|
+ SET_FLAGS_OSZAP_16(0, 0, op1_16, BX_INSTR_DEC16);
|
|
#endif
|
|
+ }
|
|
}
|
|
|
|
|
|
diff -ur bochs/cpu/arith32.cc bochs-modified/cpu/arith32.cc
|
|
--- bochs/cpu/arith32.cc Sat Apr 5 04:16:48 2003
|
|
+++ bochs-modified/cpu/arith32.cc Mon Aug 18 13:33:56 2003
|
|
@@ -44,21 +44,19 @@
|
|
BX_CPU_C::INC_ERX(bxInstruction_c *i)
|
|
{
|
|
#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
+asmInc32PlusFlags(BX_CPU_THIS_PTR gen_reg[i->opcodeReg()].dword.erx,BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+#if BX_SUPPORT_X86_64
|
|
+ BX_CPU_THIS_PTR gen_reg[i->opcodeReg()].dword.hrx = 0;
|
|
+#endif
|
|
|
|
- asmInc32(BX_CPU_THIS_PTR gen_reg[i->opcodeReg()].dword.erx, flags32);
|
|
- setEFlagsOSZAP(flags32);
|
|
#else
|
|
Bit32u erx;
|
|
|
|
erx = ++ BX_CPU_THIS_PTR gen_reg[i->opcodeReg()].dword.erx;
|
|
-#endif
|
|
-
|
|
#if BX_SUPPORT_X86_64
|
|
BX_CPU_THIS_PTR gen_reg[i->opcodeReg()].dword.hrx = 0;
|
|
#endif
|
|
|
|
-#if !(defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
SET_FLAGS_OSZAP_32(0, 0, erx, BX_INSTR_INC32);
|
|
#endif
|
|
}
|
|
@@ -67,21 +65,21 @@
|
|
BX_CPU_C::DEC_ERX(bxInstruction_c *i)
|
|
{
|
|
#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
|
|
- asmDec32(BX_CPU_THIS_PTR gen_reg[i->opcodeReg()].dword.erx, flags32);
|
|
- setEFlagsOSZAP(flags32);
|
|
+ asmDec32PlusFlags(BX_CPU_THIS_PTR gen_reg[i->opcodeReg()].dword.erx,BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+
|
|
+#if BX_SUPPORT_X86_64
|
|
+ BX_CPU_THIS_PTR gen_reg[i->opcodeReg()].dword.hrx = 0;
|
|
+#endif
|
|
+
|
|
#else
|
|
Bit32u erx;
|
|
|
|
erx = -- BX_CPU_THIS_PTR gen_reg[i->opcodeReg()].dword.erx;
|
|
-#endif
|
|
-
|
|
#if BX_SUPPORT_X86_64
|
|
BX_CPU_THIS_PTR gen_reg[i->opcodeReg()].dword.hrx = 0;
|
|
#endif
|
|
|
|
-#if !(defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
SET_FLAGS_OSZAP_32(0, 0, erx, BX_INSTR_DEC32);
|
|
#endif
|
|
}
|
|
@@ -92,6 +90,20 @@
|
|
void
|
|
BX_CPU_C::ADD_EdGd(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+ Bit32u op1_32;
|
|
+
|
|
+ if (i->modC0()) {
|
|
+ op1_32 = BX_READ_32BIT_REG(i->rm());
|
|
+ asmAdd32PlusFlags(op1_32,BX_READ_32BIT_REG(i->nnn()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ BX_WRITE_32BIT_REGZ(i->rm(), op1_32);
|
|
+ }
|
|
+ else {
|
|
+ read_RMW_virtual_dword(i->seg(), RMAddr(i), &op1_32);
|
|
+ asmAdd32PlusFlags(op1_32,BX_READ_32BIT_REG(i->nnn()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_dword(op1_32);
|
|
+ }
|
|
+#else
|
|
Bit32u op2_32, op1_32, sum_32;
|
|
|
|
op2_32 = BX_READ_32BIT_REG(i->nnn());
|
|
@@ -108,13 +120,14 @@
|
|
}
|
|
|
|
SET_FLAGS_OSZAPC_32(op1_32, op2_32, sum_32, BX_INSTR_ADD32);
|
|
+#endif
|
|
}
|
|
|
|
|
|
void
|
|
BX_CPU_C::ADD_GdEEd(bxInstruction_c *i)
|
|
{
|
|
- Bit32u op1_32, op2_32, sum_32;
|
|
+ Bit32u op1_32, op2_32;
|
|
unsigned nnn = i->nnn();
|
|
|
|
op1_32 = BX_READ_32BIT_REG(nnn);
|
|
@@ -122,17 +135,15 @@
|
|
read_virtual_dword(i->seg(), RMAddr(i), &op2_32);
|
|
|
|
#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
+ asmAdd32PlusFlags(op1_32,op2_32,BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
|
|
- asmAdd32(sum_32, op1_32, op2_32, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
+ BX_WRITE_32BIT_REGZ(nnn, op1_32);
|
|
#else
|
|
+ Bit32u sum_32;
|
|
sum_32 = op1_32 + op2_32;
|
|
-#endif
|
|
|
|
BX_WRITE_32BIT_REGZ(nnn, sum_32);
|
|
|
|
-#if !(defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
SET_FLAGS_OSZAPC_32(op1_32, op2_32, sum_32, BX_INSTR_ADD32);
|
|
#endif
|
|
}
|
|
@@ -140,24 +151,23 @@
|
|
void
|
|
BX_CPU_C::ADD_GdEGd(bxInstruction_c *i)
|
|
{
|
|
- Bit32u op1_32, op2_32, sum_32;
|
|
+ Bit32u op1_32;
|
|
unsigned nnn = i->nnn();
|
|
|
|
op1_32 = BX_READ_32BIT_REG(nnn);
|
|
- op2_32 = BX_READ_32BIT_REG(i->rm());
|
|
|
|
#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
+ asmAdd32PlusFlags(op1_32,BX_READ_32BIT_REG(i->rm()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
|
|
- asmAdd32(sum_32, op1_32, op2_32, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
+ BX_WRITE_32BIT_REGZ(nnn, op1_32);
|
|
#else
|
|
+ Bit32u op2_32, sum_32;
|
|
+
|
|
+ op2_32 = BX_READ_32BIT_REG(i->rm());
|
|
sum_32 = op1_32 + op2_32;
|
|
-#endif
|
|
|
|
BX_WRITE_32BIT_REGZ(nnn, sum_32);
|
|
|
|
-#if !(defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
SET_FLAGS_OSZAPC_32(op1_32, op2_32, sum_32, BX_INSTR_ADD32);
|
|
#endif
|
|
}
|
|
@@ -166,6 +176,14 @@
|
|
void
|
|
BX_CPU_C::ADD_EAXId(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+ Bit32u op1_32;
|
|
+ op1_32 = EAX;
|
|
+
|
|
+ asmAdd32PlusFlags(op1_32, i->Id(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ RAX = op1_32;
|
|
+#else
|
|
+
|
|
Bit32u op1_32, op2_32, sum_32;
|
|
|
|
op1_32 = EAX;
|
|
@@ -176,11 +194,40 @@
|
|
RAX = sum_32;
|
|
|
|
SET_FLAGS_OSZAPC_32(op1_32, op2_32, sum_32, BX_INSTR_ADD32);
|
|
+#endif
|
|
}
|
|
|
|
void
|
|
BX_CPU_C::ADC_EdGd(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+ Bit32u op1_32;
|
|
+
|
|
+ if (getB_CF()){
|
|
+ if (i->modC0()) {
|
|
+ op1_32 = BX_READ_32BIT_REG(i->rm());
|
|
+ asmAdc32PlusFlags_carry(op1_32,BX_READ_32BIT_REG(i->nnn()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ BX_WRITE_32BIT_REGZ(i->rm(), op1_32);
|
|
+ }
|
|
+ else {
|
|
+ read_RMW_virtual_dword(i->seg(), RMAddr(i), &op1_32);
|
|
+ asmAdc32PlusFlags_carry(op1_32,BX_READ_32BIT_REG(i->nnn()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_dword(op1_32);
|
|
+ }
|
|
+ }
|
|
+ else {
|
|
+ if (i->modC0()) {
|
|
+ op1_32 = BX_READ_32BIT_REG(i->rm());
|
|
+ asmAdd32PlusFlags(op1_32,BX_READ_32BIT_REG(i->nnn()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ BX_WRITE_32BIT_REGZ(i->rm(), op1_32);
|
|
+ }
|
|
+ else {
|
|
+ read_RMW_virtual_dword(i->seg(), RMAddr(i), &op1_32);
|
|
+ asmAdd32PlusFlags(op1_32,BX_READ_32BIT_REG(i->nnn()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_dword(op1_32);
|
|
+ }
|
|
+ }
|
|
+#else
|
|
bx_bool temp_CF;
|
|
|
|
temp_CF = getB_CF();
|
|
@@ -202,12 +249,42 @@
|
|
|
|
SET_FLAGS_OSZAPC_32_CF(op1_32, op2_32, sum_32, BX_INSTR_ADC32,
|
|
temp_CF);
|
|
+#endif
|
|
}
|
|
|
|
|
|
void
|
|
BX_CPU_C::ADC_GdEd(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+ Bit32u op1_32, op2_32;
|
|
+
|
|
+ if (getB_CF()) {
|
|
+ if (i->modC0()) {
|
|
+ op2_32 = BX_READ_32BIT_REG(i->rm());
|
|
+ }
|
|
+ else {
|
|
+ read_virtual_dword(i->seg(), RMAddr(i), &op2_32);
|
|
+ }
|
|
+
|
|
+ op1_32 = BX_READ_32BIT_REG(i->nnn());
|
|
+
|
|
+ asmAdc32PlusFlags_carry(op1_32,op2_32,BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ }
|
|
+ else {
|
|
+ if (i->modC0()) {
|
|
+ op2_32 = BX_READ_32BIT_REG(i->rm());
|
|
+ }
|
|
+ else {
|
|
+ read_virtual_dword(i->seg(), RMAddr(i), &op2_32);
|
|
+ }
|
|
+
|
|
+ op1_32 = BX_READ_32BIT_REG(i->nnn());
|
|
+
|
|
+ asmAdd32PlusFlags(op1_32,op2_32,BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ }
|
|
+ BX_WRITE_32BIT_REGZ(i->nnn(), op1_32);
|
|
+#else
|
|
bx_bool temp_CF;
|
|
|
|
temp_CF = getB_CF();
|
|
@@ -229,12 +306,26 @@
|
|
|
|
SET_FLAGS_OSZAPC_32_CF(op1_32, op2_32, sum_32, BX_INSTR_ADC32,
|
|
temp_CF);
|
|
+#endif
|
|
}
|
|
|
|
|
|
void
|
|
BX_CPU_C::ADC_EAXId(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+ Bit32u op1_32;
|
|
+
|
|
+ if (getB_CF()) {
|
|
+ op1_32 = EAX;
|
|
+ asmAdc32PlusFlags_carry(op1_32,i->Id(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ }
|
|
+ else {
|
|
+ op1_32 = EAX;
|
|
+ asmAdd32PlusFlags(op1_32,i->Id(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ }
|
|
+ RAX = op1_32;
|
|
+#else
|
|
bx_bool temp_CF;
|
|
|
|
temp_CF = getB_CF();
|
|
@@ -250,6 +341,7 @@
|
|
|
|
SET_FLAGS_OSZAPC_32_CF(op1_32, op2_32, sum_32, BX_INSTR_ADC32,
|
|
temp_CF);
|
|
+#endif
|
|
}
|
|
|
|
|
|
@@ -258,6 +350,34 @@
|
|
void
|
|
BX_CPU_C::SBB_EdGd(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+ Bit32u op1_32;
|
|
+
|
|
+ if (getB_CF()){
|
|
+ if (i->modC0()) {
|
|
+ op1_32 = BX_READ_32BIT_REG(i->rm());
|
|
+ asmSbb32PlusFlags_borrow(op1_32,BX_READ_32BIT_REG(i->nnn()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ BX_WRITE_32BIT_REGZ(i->rm(), op1_32);
|
|
+ }
|
|
+ else {
|
|
+ read_RMW_virtual_dword(i->seg(), RMAddr(i), &op1_32);
|
|
+ asmSbb32PlusFlags_borrow(op1_32,BX_READ_32BIT_REG(i->nnn()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_dword(op1_32);
|
|
+ }
|
|
+ }
|
|
+ else {
|
|
+ if (i->modC0()) {
|
|
+ op1_32 = BX_READ_32BIT_REG(i->rm());
|
|
+ asmSub32PlusFlags(op1_32,BX_READ_32BIT_REG(i->nnn()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ BX_WRITE_32BIT_REGZ(i->rm(), op1_32);
|
|
+ }
|
|
+ else {
|
|
+ read_RMW_virtual_dword(i->seg(), RMAddr(i), &op1_32);
|
|
+ asmSub32PlusFlags(op1_32,BX_READ_32BIT_REG(i->nnn()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_dword(op1_32);
|
|
+ }
|
|
+ }
|
|
+#else
|
|
bx_bool temp_CF;
|
|
|
|
temp_CF = getB_CF();
|
|
@@ -279,12 +399,38 @@
|
|
|
|
SET_FLAGS_OSZAPC_32_CF(op1_32, op2_32, diff_32, BX_INSTR_SBB32,
|
|
temp_CF);
|
|
+#endif
|
|
}
|
|
|
|
|
|
void
|
|
BX_CPU_C::SBB_GdEd(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+ Bit32u op1_32, op2_32;
|
|
+
|
|
+ if (getB_CF()) {
|
|
+ if (i->modC0()) {
|
|
+ op2_32 = BX_READ_32BIT_REG(i->rm());
|
|
+ }
|
|
+ else {
|
|
+ read_virtual_dword(i->seg(), RMAddr(i), &op2_32);
|
|
+ }
|
|
+ op1_32 = BX_READ_32BIT_REG(i->nnn());
|
|
+ asmSbb32PlusFlags_borrow(op1_32,op2_32,BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ }
|
|
+ else {
|
|
+ if (i->modC0()) {
|
|
+ op2_32 = BX_READ_32BIT_REG(i->rm());
|
|
+ }
|
|
+ else {
|
|
+ read_virtual_dword(i->seg(), RMAddr(i), &op2_32);
|
|
+ }
|
|
+ op1_32 = BX_READ_32BIT_REG(i->nnn());
|
|
+ asmSub32PlusFlags(op1_32,op2_32,BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ }
|
|
+ BX_WRITE_32BIT_REGZ(i->nnn(), op1_32);
|
|
+#else
|
|
bx_bool temp_CF;
|
|
|
|
temp_CF = getB_CF();
|
|
@@ -306,12 +452,26 @@
|
|
|
|
SET_FLAGS_OSZAPC_32_CF(op1_32, op2_32, diff_32, BX_INSTR_SBB32,
|
|
temp_CF);
|
|
+#endif
|
|
}
|
|
|
|
|
|
void
|
|
BX_CPU_C::SBB_EAXId(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+ Bit32u op1_32;
|
|
+
|
|
+ if (getB_CF()) {
|
|
+ op1_32 = EAX;
|
|
+ asmSbb32PlusFlags_borrow(op1_32,i->Id(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ }
|
|
+ else {
|
|
+ op1_32 = EAX;
|
|
+ asmSub32PlusFlags(op1_32,i->Id(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ }
|
|
+ RAX = op1_32;
|
|
+#else
|
|
bx_bool temp_CF;
|
|
|
|
temp_CF = getB_CF();
|
|
@@ -327,6 +487,7 @@
|
|
|
|
SET_FLAGS_OSZAPC_32_CF(op1_32, op2_32, diff_32, BX_INSTR_SBB32,
|
|
temp_CF);
|
|
+#endif
|
|
}
|
|
|
|
|
|
@@ -334,6 +495,34 @@
|
|
void
|
|
BX_CPU_C::SBB_EdId(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+ Bit32u op1_32;
|
|
+
|
|
+ if (getB_CF()){
|
|
+ if (i->modC0()) {
|
|
+ op1_32 = BX_READ_32BIT_REG(i->rm());
|
|
+ asmSbb32PlusFlags_borrow(op1_32,i->Id(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ BX_WRITE_32BIT_REGZ(i->rm(), op1_32);
|
|
+ }
|
|
+ else {
|
|
+ read_RMW_virtual_dword(i->seg(), RMAddr(i), &op1_32);
|
|
+ asmSbb32PlusFlags_borrow(op1_32,i->Id(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_dword(op1_32);
|
|
+ }
|
|
+ }
|
|
+ else {
|
|
+ if (i->modC0()) {
|
|
+ op1_32 = BX_READ_32BIT_REG(i->rm());
|
|
+ asmSub32PlusFlags(op1_32,i->Id(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ BX_WRITE_32BIT_REGZ(i->rm(), op1_32);
|
|
+ }
|
|
+ else {
|
|
+ read_RMW_virtual_dword(i->seg(), RMAddr(i), &op1_32);
|
|
+ asmSub32PlusFlags(op1_32,i->Id(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_dword(op1_32);
|
|
+ }
|
|
+ }
|
|
+#else
|
|
bx_bool temp_CF;
|
|
|
|
temp_CF = getB_CF();
|
|
@@ -355,12 +544,27 @@
|
|
|
|
SET_FLAGS_OSZAPC_32_CF(op1_32, op2_32, diff_32, BX_INSTR_SBB32,
|
|
temp_CF);
|
|
+#endif
|
|
}
|
|
|
|
|
|
void
|
|
BX_CPU_C::SUB_EdGd(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+ Bit32u op1_32;
|
|
+
|
|
+ if (i->modC0()) {
|
|
+ op1_32 = BX_READ_32BIT_REG(i->rm());
|
|
+ asmSub32PlusFlags(op1_32,BX_READ_32BIT_REG(i->nnn()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ BX_WRITE_32BIT_REGZ(i->rm(), op1_32);
|
|
+ }
|
|
+ else {
|
|
+ read_RMW_virtual_dword(i->seg(), RMAddr(i), &op1_32);
|
|
+ asmSub32PlusFlags(op1_32,BX_READ_32BIT_REG(i->nnn()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_dword(op1_32);
|
|
+ }
|
|
+#else
|
|
Bit32u op2_32, op1_32, diff_32;
|
|
|
|
op2_32 = BX_READ_32BIT_REG(i->nnn());
|
|
@@ -377,13 +581,14 @@
|
|
}
|
|
|
|
SET_FLAGS_OSZAPC_32(op1_32, op2_32, diff_32, BX_INSTR_SUB32);
|
|
+#endif
|
|
}
|
|
|
|
|
|
void
|
|
BX_CPU_C::SUB_GdEd(bxInstruction_c *i)
|
|
{
|
|
- Bit32u op1_32, op2_32, diff_32;
|
|
+ Bit32u op1_32, op2_32;
|
|
unsigned nnn = i->nnn();
|
|
|
|
op1_32 = BX_READ_32BIT_REG(nnn);
|
|
@@ -396,17 +601,14 @@
|
|
}
|
|
|
|
#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
+ asmSub32PlusFlags(op1_32,op2_32,BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ BX_WRITE_32BIT_REGZ(nnn, op1_32);
|
|
|
|
- asmSub32(diff_32, op1_32, op2_32, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
#else
|
|
- diff_32 = op1_32 - op2_32;
|
|
-#endif
|
|
+ Bit32u diff_32;
|
|
|
|
+ diff_32 = op1_32 - op2_32;
|
|
BX_WRITE_32BIT_REGZ(nnn, diff_32);
|
|
-
|
|
-#if !(defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
SET_FLAGS_OSZAPC_32(op1_32, op2_32, diff_32, BX_INSTR_SUB32);
|
|
#endif
|
|
}
|
|
@@ -414,6 +616,14 @@
|
|
void
|
|
BX_CPU_C::SUB_EAXId(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+ Bit32u op1_32;
|
|
+ op1_32 = EAX;
|
|
+
|
|
+ asmSub32PlusFlags(op1_32,i->Id(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+
|
|
+ RAX = op1_32;
|
|
+#else
|
|
Bit32u op1_32, op2_32, diff_32;
|
|
|
|
op1_32 = EAX;
|
|
@@ -424,15 +634,15 @@
|
|
RAX = diff_32;
|
|
|
|
SET_FLAGS_OSZAPC_32(op1_32, op2_32, diff_32, BX_INSTR_SUB32);
|
|
+#endif
|
|
}
|
|
|
|
|
|
void
|
|
BX_CPU_C::CMP_EdGd(bxInstruction_c *i)
|
|
{
|
|
- Bit32u op2_32, op1_32;
|
|
+ Bit32u op1_32;
|
|
|
|
- op2_32 = BX_READ_32BIT_REG(i->nnn());
|
|
|
|
if (i->modC0()) {
|
|
op1_32 = BX_READ_32BIT_REG(i->rm());
|
|
@@ -442,12 +652,11 @@
|
|
}
|
|
|
|
#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
-
|
|
- asmCmp32(op1_32, op2_32, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
+ asmCmp32PlusFlags(op1_32,BX_READ_32BIT_REG(i->nnn()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
#else
|
|
- Bit32u diff_32;
|
|
+ Bit32u op2_32, diff_32;
|
|
+
|
|
+ op2_32 = BX_READ_32BIT_REG(i->nnn());
|
|
diff_32 = op1_32 - op2_32;
|
|
|
|
SET_FLAGS_OSZAPC_32(op1_32, op2_32, diff_32, BX_INSTR_CMP32);
|
|
@@ -458,9 +667,8 @@
|
|
void
|
|
BX_CPU_C::CMP_GdEd(bxInstruction_c *i)
|
|
{
|
|
- Bit32u op1_32, op2_32;
|
|
+ Bit32u op2_32;
|
|
|
|
- op1_32 = BX_READ_32BIT_REG(i->nnn());
|
|
|
|
if (i->modC0()) {
|
|
op2_32 = BX_READ_32BIT_REG(i->rm());
|
|
@@ -470,12 +678,12 @@
|
|
}
|
|
|
|
#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
-
|
|
- asmCmp32(op1_32, op2_32, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
+ asmCmp32PlusFlags(BX_READ_32BIT_REG(i->nnn()),op2_32,BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
#else
|
|
- Bit32u diff_32;
|
|
+ Bit32u op1_32, diff_32;
|
|
+
|
|
+ op1_32 = BX_READ_32BIT_REG(i->nnn());
|
|
+
|
|
diff_32 = op1_32 - op2_32;
|
|
|
|
SET_FLAGS_OSZAPC_32(op1_32, op2_32, diff_32, BX_INSTR_CMP32);
|
|
@@ -486,17 +694,14 @@
|
|
void
|
|
BX_CPU_C::CMP_EAXId(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+ asmCmp32PlusFlags(EAX,i->Id(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+#else
|
|
Bit32u op1_32, op2_32;
|
|
|
|
op1_32 = EAX;
|
|
op2_32 = i->Id();
|
|
|
|
-#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
-
|
|
- asmCmp32(op1_32, op2_32, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
-#else
|
|
Bit32u diff_32;
|
|
diff_32 = op1_32 - op2_32;
|
|
|
|
@@ -601,24 +806,21 @@
|
|
void
|
|
BX_CPU_C::ADD_EEdId(bxInstruction_c *i)
|
|
{
|
|
- Bit32u op2_32, op1_32, sum_32;
|
|
-
|
|
- op2_32 = i->Id();
|
|
+ Bit32u op1_32;
|
|
|
|
read_RMW_virtual_dword(i->seg(), RMAddr(i), &op1_32);
|
|
|
|
#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
-
|
|
- asmAdd32(sum_32, op1_32, op2_32, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
+ asmAdd32PlusFlags(op1_32,i->Id(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_dword(op1_32);
|
|
#else
|
|
+ Bit32u op2_32, sum_32;
|
|
+ op2_32 = i->Id();
|
|
+
|
|
sum_32 = op1_32 + op2_32;
|
|
-#endif
|
|
|
|
Write_RMW_virtual_dword(sum_32);
|
|
|
|
-#if !(defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
SET_FLAGS_OSZAPC_32(op1_32, op2_32, sum_32, BX_INSTR_ADD32);
|
|
#endif
|
|
}
|
|
@@ -626,23 +828,21 @@
|
|
void
|
|
BX_CPU_C::ADD_EGdId(bxInstruction_c *i)
|
|
{
|
|
- Bit32u op2_32, op1_32, sum_32;
|
|
+ Bit32u op1_32;
|
|
|
|
- op2_32 = i->Id();
|
|
op1_32 = BX_READ_32BIT_REG(i->rm());
|
|
|
|
#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
-
|
|
- asmAdd32(sum_32, op1_32, op2_32, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
+ asmAdd32PlusFlags(op1_32,i->Id(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ BX_WRITE_32BIT_REGZ(i->rm(), op1_32);
|
|
#else
|
|
+ Bit32u op2_32, sum_32;
|
|
+
|
|
+ op2_32 = i->Id();
|
|
sum_32 = op1_32 + op2_32;
|
|
-#endif
|
|
|
|
BX_WRITE_32BIT_REGZ(i->rm(), sum_32);
|
|
|
|
-#if !(defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
SET_FLAGS_OSZAPC_32(op1_32, op2_32, sum_32, BX_INSTR_ADD32);
|
|
#endif
|
|
}
|
|
@@ -650,6 +850,34 @@
|
|
void
|
|
BX_CPU_C::ADC_EdId(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+ Bit32u op1_32;
|
|
+
|
|
+ if (getB_CF()){
|
|
+ if (i->modC0()) {
|
|
+ op1_32 = BX_READ_32BIT_REG(i->rm());
|
|
+ asmAdc32PlusFlags_carry(op1_32,i->Id(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ BX_WRITE_32BIT_REGZ(i->rm(), op1_32);
|
|
+ }
|
|
+ else {
|
|
+ read_RMW_virtual_dword(i->seg(), RMAddr(i), &op1_32);
|
|
+ asmAdc32PlusFlags_carry(op1_32,i->Id(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_dword(op1_32);
|
|
+ }
|
|
+ }
|
|
+ else {
|
|
+ if (i->modC0()) {
|
|
+ op1_32 = BX_READ_32BIT_REG(i->rm());
|
|
+ asmAdd32PlusFlags(op1_32,i->Id(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ BX_WRITE_32BIT_REGZ(i->rm(), op1_32);
|
|
+ }
|
|
+ else {
|
|
+ read_RMW_virtual_dword(i->seg(), RMAddr(i), &op1_32);
|
|
+ asmAdd32PlusFlags(op1_32,i->Id(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_dword(op1_32);
|
|
+ }
|
|
+ }
|
|
+#else
|
|
bx_bool temp_CF;
|
|
|
|
temp_CF = getB_CF();
|
|
@@ -671,12 +899,27 @@
|
|
|
|
SET_FLAGS_OSZAPC_32_CF(op1_32, op2_32, sum_32, BX_INSTR_ADC32,
|
|
temp_CF);
|
|
+#endif
|
|
}
|
|
|
|
|
|
void
|
|
BX_CPU_C::SUB_EdId(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+ Bit32u op1_32;
|
|
+
|
|
+ if (i->modC0()) {
|
|
+ op1_32 = BX_READ_32BIT_REG(i->rm());
|
|
+ asmSub32PlusFlags(op1_32,i->Id(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ BX_WRITE_32BIT_REGZ(i->rm(), op1_32);
|
|
+ }
|
|
+ else {
|
|
+ read_RMW_virtual_dword(i->seg(), RMAddr(i), &op1_32);
|
|
+ asmSub32PlusFlags(op1_32,i->Id(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_dword(op1_32);
|
|
+ }
|
|
+#else
|
|
Bit32u op2_32, op1_32, diff_32;
|
|
|
|
op2_32 = i->Id();
|
|
@@ -693,6 +936,7 @@
|
|
}
|
|
|
|
SET_FLAGS_OSZAPC_32(op1_32, op2_32, diff_32, BX_INSTR_SUB32);
|
|
+#endif
|
|
}
|
|
|
|
void
|
|
@@ -700,7 +944,6 @@
|
|
{
|
|
Bit32u op2_32, op1_32;
|
|
|
|
- op2_32 = i->Id();
|
|
|
|
if (i->modC0()) {
|
|
op1_32 = BX_READ_32BIT_REG(i->rm());
|
|
@@ -710,12 +953,12 @@
|
|
}
|
|
|
|
#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
-
|
|
- asmCmp32(op1_32, op2_32, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
+ asmCmp32PlusFlags(op1_32,i->Id(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
#else
|
|
Bit32u diff_32;
|
|
+
|
|
+ op2_32 = i->Id();
|
|
+
|
|
diff_32 = op1_32 - op2_32;
|
|
|
|
SET_FLAGS_OSZAPC_32(op1_32, op2_32, diff_32, BX_INSTR_CMP32);
|
|
@@ -749,6 +992,18 @@
|
|
BX_CPU_C::INC_Ed(bxInstruction_c *i)
|
|
{
|
|
Bit32u op1_32;
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+ if (i->modC0()) {
|
|
+ op1_32 = BX_READ_32BIT_REG(i->rm());
|
|
+ asmInc32PlusFlags(op1_32,BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ BX_WRITE_32BIT_REGZ(i->rm(), op1_32);
|
|
+ }
|
|
+ else {
|
|
+ read_RMW_virtual_dword(i->seg(), RMAddr(i), &op1_32);
|
|
+ asmInc32PlusFlags(op1_32,BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_dword(op1_32);
|
|
+ }
|
|
+#else
|
|
|
|
if (i->modC0()) {
|
|
op1_32 = BX_READ_32BIT_REG(i->rm());
|
|
@@ -762,6 +1017,7 @@
|
|
}
|
|
|
|
SET_FLAGS_OSZAP_32(0, 0, op1_32, BX_INSTR_INC32);
|
|
+#endif
|
|
}
|
|
|
|
|
|
@@ -769,6 +1025,18 @@
|
|
BX_CPU_C::DEC_Ed(bxInstruction_c *i)
|
|
{
|
|
Bit32u op1_32;
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+ if (i->modC0()) {
|
|
+ op1_32 = BX_READ_32BIT_REG(i->rm());
|
|
+ asmDec32PlusFlags(op1_32,BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ BX_WRITE_32BIT_REGZ(i->rm(), op1_32);
|
|
+ }
|
|
+ else {
|
|
+ read_RMW_virtual_dword(i->seg(), RMAddr(i), &op1_32);
|
|
+ asmDec32PlusFlags(op1_32,BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_dword(op1_32);
|
|
+ }
|
|
+#else
|
|
|
|
if (i->modC0()) {
|
|
op1_32 = BX_READ_32BIT_REG(i->rm());
|
|
@@ -782,6 +1050,7 @@
|
|
}
|
|
|
|
SET_FLAGS_OSZAP_32(0, 0, op1_32, BX_INSTR_DEC32);
|
|
+#endif
|
|
}
|
|
|
|
|
|
diff -ur bochs/cpu/cpu.h bochs-modified/cpu/cpu.h
|
|
--- bochs/cpu/cpu.h Mon Aug 4 09:18:15 2003
|
|
+++ bochs-modified/cpu/cpu.h Fri Aug 15 13:57:54 2003
|
|
@@ -3300,7 +3300,7 @@
|
|
#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
|
|
// This section defines some convience inline functions which do the
|
|
-// dirty work of asm() statements for arithmetic instructions on x86 hosts.
|
|
+// dirty work of asm() statements for arithmetic instructions on x86 hosts.
|
|
// Essentially these speed up eflags processing since the value of the
|
|
// eflags register can be read directly on x86 hosts, after the
|
|
// arithmetic operations.
|
|
@@ -3331,6 +3331,86 @@
|
|
);
|
|
}
|
|
|
|
+
|
|
+ static inline void
|
|
+asmAdd16PlusFlags(Bit16u &op1_16, Bit16u op2_16, Bit32u &lflags32, Bit32u &flags_val)
|
|
+{
|
|
+ asm (
|
|
+ "addw %3, %2\n\t"
|
|
+ "pushfl \n\t"
|
|
+ "movl $0, %0\n\t"
|
|
+ "popl %3\n\t"
|
|
+ "andl $-2262,%1\n\t"
|
|
+ "andl $2261,%3\n\t"
|
|
+ "orl %3,%1\n\t"
|
|
+
|
|
+ : "=m" (lflags32), "=g" (flags_val), "=g" (op1_16)
|
|
+ : "r" (op2_16), "2" (op1_16)
|
|
+ : "cc"
|
|
+ );
|
|
+}
|
|
+
|
|
+
|
|
+ static inline void
|
|
+asmAdd32PlusFlags(Bit32u &op1_32, Bit32u op2_32, Bit32u &lflags32, Bit32u &flags_val)
|
|
+{
|
|
+ asm (
|
|
+ "addl %3, %2\n\t"
|
|
+ "pushfl \n\t"
|
|
+ "movl $0, %0\n\t"
|
|
+ "popl %3\n\t"
|
|
+ "andl $-2262,%1\n\t"
|
|
+ "andl $2261,%3\n\t"
|
|
+ "orl %3,%1\n\t"
|
|
+
|
|
+ : "=m" (lflags32), "=g" (flags_val), "=g" (op1_32)
|
|
+ : "r" (op2_32), "2" (op1_32)
|
|
+ : "cc"
|
|
+ );
|
|
+}
|
|
+
|
|
+
|
|
+
|
|
+ static inline void
|
|
+asmAdc16PlusFlags_carry(Bit16u &op1_16, Bit16u op2_16, Bit32u &lflags32, Bit32u &flags_val)
|
|
+{
|
|
+
|
|
+ asm (
|
|
+ "stc\n\t"
|
|
+ "adcw %3, %2\n\t"
|
|
+ "pushfl \n\t"
|
|
+ "movl $0, %0\n\t"
|
|
+ "popl %3\n\t"
|
|
+ "andl $-2262,%1\n\t"
|
|
+ "andl $2261,%3\n\t"
|
|
+ "orl %3,%1\n\t"
|
|
+
|
|
+ : "=m" (lflags32), "=g" (flags_val), "=g" (op1_16)
|
|
+ : "r" (op2_16), "2" (op1_16)
|
|
+ : "cc"
|
|
+ );
|
|
+}
|
|
+
|
|
+ static inline void
|
|
+asmAdc32PlusFlags_carry(Bit32u &op1_32, Bit32u op2_32, Bit32u &lflags32, Bit32u &flags_val)
|
|
+{
|
|
+ asm (
|
|
+ "stc\n\t"
|
|
+ "adcl %3, %2\n\t"
|
|
+ "pushfl \n\t"
|
|
+ "movl $0, %0\n\t"
|
|
+ "popl %3\n\t"
|
|
+ "andl $-2262,%1\n\t"
|
|
+ "andl $2261,%3\n\t"
|
|
+ "orl %3,%1\n\t"
|
|
+
|
|
+ : "=m" (lflags32), "=g" (flags_val), "=g" (op1_32)
|
|
+ : "r" (op2_32), "2" (op1_32)
|
|
+ : "cc"
|
|
+ );
|
|
+}
|
|
+
|
|
+
|
|
static inline void
|
|
asmSub16(Bit16u &diff_16, Bit16u op1_16, Bit16u op2_16, Bit32u &flags32)
|
|
{
|
|
@@ -3357,6 +3437,84 @@
|
|
);
|
|
}
|
|
|
|
+
|
|
+
|
|
+
|
|
+ static inline void
|
|
+asmSub16PlusFlags(Bit16u &op1_16, Bit16u op2_16, Bit32u &lflags32, Bit32u &flags_val)
|
|
+{
|
|
+ asm (
|
|
+ "subw %3, %2\n\t"
|
|
+ "pushfl \n\t"
|
|
+ "movl $0, %0\n\t"
|
|
+ "popl %3\n\t"
|
|
+ "andl $-2262,%1\n\t"
|
|
+ "andl $2261,%3\n\t"
|
|
+ "orl %3,%1\n\t"
|
|
+
|
|
+ : "=m" (lflags32), "=g" (flags_val), "=g" (op1_16)
|
|
+ : "r" (op2_16), "2" (op1_16)
|
|
+ : "cc"
|
|
+ );
|
|
+}
|
|
+
|
|
+ static inline void
|
|
+asmSub32PlusFlags(Bit32u &op1_32, Bit32u op2_32, Bit32u &lflags32, Bit32u &flags_val)
|
|
+{
|
|
+ asm (
|
|
+ "subl %3, %2\n\t"
|
|
+ "pushfl \n\t"
|
|
+ "movl $0, %0\n\t"
|
|
+ "popl %3\n\t"
|
|
+ "andl $-2262,%1\n\t"
|
|
+ "andl $2261,%3\n\t"
|
|
+ "orl %3,%1\n\t"
|
|
+
|
|
+ : "=m" (lflags32), "=g" (flags_val), "=g" (op1_32)
|
|
+ : "r" (op2_32), "2" (op1_32)
|
|
+ : "cc"
|
|
+ );
|
|
+}
|
|
+
|
|
+ static inline void
|
|
+asmSbb16PlusFlags_borrow(Bit16u &op1_16, Bit16u op2_16, Bit32u &lflags32, Bit32u &flags_val)
|
|
+{
|
|
+ asm (
|
|
+ "stc\n\t"
|
|
+ "sbbw %3, %2\n\t"
|
|
+ "pushfl \n\t"
|
|
+ "movl $0, %0\n\t"
|
|
+ "popl %3\n\t"
|
|
+ "andl $-2262,%1\n\t"
|
|
+ "andl $2261,%3\n\t"
|
|
+ "orl %3,%1\n\t"
|
|
+
|
|
+ : "=m" (lflags32), "=g" (flags_val), "=g" (op1_16)
|
|
+ : "r" (op2_16), "2" (op1_16)
|
|
+ : "cc"
|
|
+ );
|
|
+}
|
|
+
|
|
+ static inline void
|
|
+asmSbb32PlusFlags_borrow(Bit32u &op1_32, Bit32u op2_32, Bit32u &lflags32, Bit32u &flags_val)
|
|
+{
|
|
+ asm (
|
|
+ "stc\n\t"
|
|
+ "sbbl %3, %2\n\t"
|
|
+ "pushfl \n\t"
|
|
+ "movl $0, %0\n\t"
|
|
+ "popl %3\n\t"
|
|
+ "andl $-2262,%1\n\t"
|
|
+ "andl $2261,%3\n\t"
|
|
+ "orl %3,%1\n\t"
|
|
+
|
|
+ : "=m" (lflags32), "=g" (flags_val), "=g" (op1_32)
|
|
+ : "r" (op2_32), "2" (op1_32)
|
|
+ : "cc"
|
|
+ );
|
|
+}
|
|
+
|
|
+
|
|
static inline void
|
|
asmCmp8(Bit8u op1_8, Bit8u op2_8, Bit32u &flags32)
|
|
{
|
|
@@ -3396,6 +3554,43 @@
|
|
);
|
|
}
|
|
|
|
+
|
|
+ static inline void
|
|
+asmCmp16PlusFlags(Bit16u op1_16, Bit16u op2_16, Bit32u &lflags32, Bit32u &flags_val)
|
|
+{
|
|
+ asm (
|
|
+ "cmpw %3, %2\n\t"
|
|
+ "pushfl \n\t"
|
|
+ "movl $0, %0\n\t"
|
|
+ "popl %3\n\t"
|
|
+ "andl $-2262,%1\n\t"
|
|
+ "andl $2261,%3\n\t"
|
|
+ "orl %3,%1"
|
|
+ : "=m" (lflags32), "=g" (flags_val)
|
|
+ : "r" (op1_16), "r" (op2_16), "1"(flags_val)
|
|
+ : "cc"
|
|
+ );
|
|
+}
|
|
+
|
|
+ static inline void
|
|
+asmCmp32PlusFlags(Bit32u op1_32, Bit32u op2_32, Bit32u &lflags32, Bit32u &flags_val)
|
|
+{
|
|
+ asm (
|
|
+ "cmpl %3, %2\n\t"
|
|
+ "pushfl \n\t"
|
|
+ "movl $0, %0\n\t"
|
|
+ "popl %3\n\t"
|
|
+ "andl $-2262,%1\n\t"
|
|
+ "andl $2261,%3\n\t"
|
|
+ "orl %3,%1"
|
|
+ : "=m" (lflags32), "=g" (flags_val)
|
|
+ : "r" (op1_32), "r" (op2_32), "1"(flags_val)
|
|
+ : "cc"
|
|
+ );
|
|
+}
|
|
+
|
|
+
|
|
+
|
|
static inline void
|
|
asmInc16(Bit16u &op1_16, Bit32u &flags32)
|
|
{
|
|
@@ -3422,6 +3617,45 @@
|
|
);
|
|
}
|
|
|
|
+
|
|
+
|
|
+ static inline void
|
|
+asmInc16PlusFlags(Bit16u &op1_16, Bit32u &lflags32, Bit32u &flags_val)
|
|
+{
|
|
+ asm (
|
|
+ "incw %2\n\t"
|
|
+ "pushfl \n\t"
|
|
+ "andl $15, %0\n\t"
|
|
+ "popl %%eax\n\t"
|
|
+ "andl $-2261,%1\n\t"
|
|
+ "andl $2260,%%eax\n\t"
|
|
+ "orl %%eax,%1\n\t"
|
|
+ : "=m" (lflags32), "=g" (flags_val), "=q" (op1_16)
|
|
+ : "g"(flags_val), "2" (op1_16)
|
|
+ : "cc", "eax"
|
|
+ );
|
|
+}
|
|
+
|
|
+ static inline void
|
|
+asmInc32PlusFlags(Bit32u &op1_32, Bit32u &lflags32, Bit32u &flags_val)
|
|
+{
|
|
+ asm (
|
|
+ "incl %2\n\t"
|
|
+ "pushfl \n\t"
|
|
+ "andl $15, %0\n\t"
|
|
+ "popl %%eax\n\t"
|
|
+ "andl $-2261,%1\n\t"
|
|
+ "andl $2260,%%eax\n\t"
|
|
+ "orl %%eax,%1\n\t"
|
|
+ : "=m" (lflags32), "=g" (flags_val), "=q" (op1_32)
|
|
+ : "g"(flags_val), "2" (op1_32)
|
|
+ : "cc", "eax"
|
|
+ );
|
|
+}
|
|
+
|
|
+
|
|
+
|
|
+
|
|
static inline void
|
|
asmDec16(Bit16u &op1_16, Bit32u &flags32)
|
|
{
|
|
@@ -3448,6 +3682,45 @@
|
|
);
|
|
}
|
|
|
|
+
|
|
+
|
|
+ static inline void
|
|
+asmDec16PlusFlags(Bit16u &op1_16, Bit32u &lflags32, Bit32u &flags_val)
|
|
+{
|
|
+ asm (
|
|
+ "decw %2\n\t"
|
|
+ "pushfl \n\t"
|
|
+ "andl $15, %0\n\t"
|
|
+ "popl %%eax\n\t"
|
|
+ "andl $-2261,%1\n\t"
|
|
+ "andl $2260,%%eax\n\t"
|
|
+ "orl %%eax,%1\n\t"
|
|
+ : "=m" (lflags32), "=g" (flags_val), "=q" (op1_16)
|
|
+ : "g"(flags_val), "2" (op1_16)
|
|
+ : "cc", "eax"
|
|
+ );
|
|
+}
|
|
+
|
|
+ static inline void
|
|
+asmDec32PlusFlags(Bit32u &op1_32, Bit32u &lflags32, Bit32u &flags_val)
|
|
+{
|
|
+ asm (
|
|
+ "decl %2\n\t"
|
|
+ "pushfl \n\t"
|
|
+ "andl $15, %0\n\t"
|
|
+ "popl %%eax\n\t"
|
|
+ "andl $-2261,%1\n\t"
|
|
+ "andl $2260,%%eax\n\t"
|
|
+ "orl %%eax,%1\n\t"
|
|
+ : "=m" (lflags32), "=g" (flags_val), "=q" (op1_32)
|
|
+ : "g"(flags_val), "2" (op1_32)
|
|
+ : "cc", "eax"
|
|
+ );
|
|
+}
|
|
+
|
|
+
|
|
+
|
|
+
|
|
static inline void
|
|
asmXor16(Bit16u &result_16, Bit16u op1_16, Bit16u op2_16, Bit32u &flags32)
|
|
{
|
|
@@ -3474,6 +3747,45 @@
|
|
);
|
|
}
|
|
|
|
+
|
|
+ static inline void
|
|
+asmXor16PlusFlags(Bit16u &op1_16, Bit16u op2_16, Bit32u &lflags32, Bit32u &flags_val)
|
|
+{
|
|
+ asm (
|
|
+ "xorw %3, %2\n\t"
|
|
+ "pushfl \n\t"
|
|
+ "movl $0, %0\n\t"
|
|
+ "popl %3\n\t"
|
|
+ "andl $-2262,%1\n\t"
|
|
+ "andl $2261,%3\n\t"
|
|
+ "orl %3,%1\n\t"
|
|
+
|
|
+ : "=m" (lflags32), "=g" (flags_val), "=g" (op1_16)
|
|
+ : "r" (op2_16), "2" (op1_16)
|
|
+ : "cc"
|
|
+ );
|
|
+}
|
|
+
|
|
+ static inline void
|
|
+asmXor32PlusFlags(Bit32u &op1_32, Bit32u op2_32, Bit32u &lflags32, Bit32u &flags_val)
|
|
+{
|
|
+ asm (
|
|
+ "xorl %3, %2\n\t"
|
|
+ "pushfl \n\t"
|
|
+ "movl $0, %0\n\t"
|
|
+ "popl %3\n\t"
|
|
+ "andl $-2262,%1\n\t"
|
|
+ "andl $2261,%3\n\t"
|
|
+ "orl %3,%1\n\t"
|
|
+
|
|
+ : "=m" (lflags32), "=g" (flags_val), "=g" (op1_32)
|
|
+ : "r" (op2_32), "2" (op1_32)
|
|
+ : "cc"
|
|
+ );
|
|
+}
|
|
+
|
|
+
|
|
+
|
|
static inline void
|
|
asmOr8(Bit8u &result_8, Bit8u op1_8, Bit8u op2_8, Bit32u &flags32)
|
|
{
|
|
@@ -3513,6 +3825,45 @@
|
|
);
|
|
}
|
|
|
|
+
|
|
+ static inline void
|
|
+asmOr16PlusFlags(Bit16u &op1_16, Bit16u op2_16, Bit32u &lflags32, Bit32u &flags_val)
|
|
+{
|
|
+ asm (
|
|
+ "orw %3, %2\n\t"
|
|
+ "pushfl \n\t"
|
|
+ "movl $0, %0\n\t"
|
|
+ "popl %3\n\t"
|
|
+ "andl $-2262,%1\n\t"
|
|
+ "andl $2261,%3\n\t"
|
|
+ "orl %3,%1\n\t"
|
|
+
|
|
+ : "=m" (lflags32), "=g" (flags_val), "=g" (op1_16)
|
|
+ : "r" (op2_16), "2" (op1_16)
|
|
+ : "cc"
|
|
+ );
|
|
+}
|
|
+
|
|
+ static inline void
|
|
+asmOr32PlusFlags(Bit32u &op1_32, Bit32u op2_32, Bit32u &lflags32, Bit32u &flags_val)
|
|
+{
|
|
+ asm (
|
|
+ "orl %3, %2\n\t"
|
|
+ "pushfl \n\t"
|
|
+ "movl $0, %0\n\t"
|
|
+ "popl %3\n\t"
|
|
+ "andl $-2262,%1\n\t"
|
|
+ "andl $2261,%3\n\t"
|
|
+ "orl %3,%1\n\t"
|
|
+
|
|
+ : "=m" (lflags32), "=g" (flags_val), "=g" (op1_32)
|
|
+ : "r" (op2_32), "2" (op1_32)
|
|
+ : "cc"
|
|
+ );
|
|
+}
|
|
+
|
|
+
|
|
+
|
|
static inline void
|
|
asmAnd8(Bit8u &result_8, Bit8u op1_8, Bit8u op2_8, Bit32u &flags32)
|
|
{
|
|
@@ -3552,6 +3903,45 @@
|
|
);
|
|
}
|
|
|
|
+
|
|
+
|
|
+ static inline void
|
|
+asmAnd16PlusFlags(Bit16u &op1_16, Bit16u op2_16, Bit32u &lflags32, Bit32u &flags_val)
|
|
+{
|
|
+ asm (
|
|
+ "andw %3, %2\n\t"
|
|
+ "pushfl \n\t"
|
|
+ "movl $0, %0\n\t"
|
|
+ "popl %3\n\t"
|
|
+ "andl $-2262,%1\n\t"
|
|
+ "andl $2261,%3\n\t"
|
|
+ "orl %3,%1\n\t"
|
|
+
|
|
+ : "=m" (lflags32), "=g" (flags_val), "=g" (op1_16)
|
|
+ : "r" (op2_16), "2" (op1_16)
|
|
+ : "cc"
|
|
+ );
|
|
+}
|
|
+
|
|
+ static inline void
|
|
+asmAnd32PlusFlags(Bit32u &op1_32, Bit32u op2_32, Bit32u &lflags32, Bit32u &flags_val)
|
|
+{
|
|
+ asm (
|
|
+ "andl %3, %2\n\t"
|
|
+ "pushfl \n\t"
|
|
+ "movl $0, %0\n\t"
|
|
+ "popl %3\n\t"
|
|
+ "andl $-2262,%1\n\t"
|
|
+ "andl $2261,%3\n\t"
|
|
+ "orl %3,%1\n\t"
|
|
+
|
|
+ : "=m" (lflags32), "=g" (flags_val), "=g" (op1_32)
|
|
+ : "r" (op2_32), "2" (op1_32)
|
|
+ : "cc"
|
|
+ );
|
|
+}
|
|
+
|
|
+
|
|
static inline void
|
|
asmTest8(Bit8u op1_8, Bit8u op2_8, Bit32u &flags32)
|
|
{
|
|
@@ -3590,6 +3980,61 @@
|
|
: "cc"
|
|
);
|
|
}
|
|
+
|
|
+ static inline void
|
|
+asmTest8PlusFlags(Bit8u op1_8, Bit8u op2_8, Bit32u &lflags32, Bit32u &flags_val)
|
|
+{
|
|
+ asm (
|
|
+ "testb %3, %2\n\t"
|
|
+ "pushfl \n\t"
|
|
+ "movl $0, %0\n\t"
|
|
+ "popl %%eax\n\t"
|
|
+ "andl $-2262,%1\n\t"
|
|
+ "andl $2261,%%eax\n\t"
|
|
+ "orl %%eax,%1\n\t"
|
|
+
|
|
+ : "=m" (lflags32), "=g" (flags_val)
|
|
+ : "q" (op1_8), "q" (op2_8)
|
|
+ : "cc", "eax"
|
|
+ );
|
|
+}
|
|
+
|
|
+ static inline void
|
|
+asmTest16PlusFlags(Bit16u op1_16, Bit16u op2_16, Bit32u &lflags32, Bit32u &flags_val)
|
|
+{
|
|
+ asm (
|
|
+ "testw %3, %2\n\t"
|
|
+ "pushfl \n\t"
|
|
+ "movl $0, %0\n\t"
|
|
+ "popl %%eax\n\t"
|
|
+ "andl $-2262,%1\n\t"
|
|
+ "andl $2261,%%eax\n\t"
|
|
+ "orl %%eax,%1\n\t"
|
|
+
|
|
+ : "=m" (lflags32), "=g" (flags_val)
|
|
+ : "q" (op1_16), "q" (op2_16)
|
|
+ : "cc", "eax"
|
|
+ );
|
|
+}
|
|
+
|
|
+ static inline void
|
|
+asmTest32PlusFlags(Bit32u op1_32, Bit32u op2_32, Bit32u &lflags32, Bit32u &flags_val)
|
|
+{
|
|
+ asm (
|
|
+ "testl %3, %2\n\t"
|
|
+ "pushfl \n\t"
|
|
+ "movl $0, %0\n\t"
|
|
+ "popl %3\n\t"
|
|
+ "andl $-2262,%1\n\t"
|
|
+ "andl $2261,%3\n\t"
|
|
+ "orl %3,%1\n\t"
|
|
+
|
|
+ : "=m" (lflags32), "=g" (flags_val)
|
|
+ : "q" (op1_32), "r" (op2_32)
|
|
+ : "cc"
|
|
+ );
|
|
+}
|
|
+
|
|
|
|
static inline void
|
|
asmShr16(Bit16u &result_16, Bit16u op1_16, unsigned count, Bit32u &flags32)
|
|
diff -ur bochs/cpu/logical16.cc bochs-modified/cpu/logical16.cc
|
|
--- bochs/cpu/logical16.cc Fri Oct 25 11:26:28 2002
|
|
+++ bochs-modified/cpu/logical16.cc Mon Aug 18 15:45:38 2003
|
|
@@ -39,37 +39,33 @@
|
|
void
|
|
BX_CPU_C::XOR_EwGw(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+ Bit16u op1_16;
|
|
+ if (i->modC0()) {
|
|
+ op1_16 = BX_READ_16BIT_REG(i->rm());
|
|
+ asmXor16PlusFlags( op1_16, BX_READ_16BIT_REG(i->nnn()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ BX_WRITE_16BIT_REG(i->rm(), op1_16);
|
|
+ }
|
|
+ else {
|
|
+ read_RMW_virtual_word(i->seg(), RMAddr(i), &op1_16);
|
|
+ asmXor16PlusFlags( op1_16, BX_READ_16BIT_REG(i->nnn()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_word(op1_16);
|
|
+ }
|
|
+#else
|
|
Bit16u op2_16, op1_16, result_16;
|
|
|
|
op2_16 = BX_READ_16BIT_REG(i->nnn());
|
|
|
|
if (i->modC0()) {
|
|
op1_16 = BX_READ_16BIT_REG(i->rm());
|
|
-
|
|
-#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
-
|
|
- asmXor16(result_16, op1_16, op2_16, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
-#else
|
|
result_16 = op1_16 ^ op2_16;
|
|
-#endif
|
|
BX_WRITE_16BIT_REG(i->rm(), result_16);
|
|
}
|
|
else {
|
|
read_RMW_virtual_word(i->seg(), RMAddr(i), &op1_16);
|
|
-#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
-
|
|
- asmXor16(result_16, op1_16, op2_16, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
-#else
|
|
result_16 = op1_16 ^ op2_16;
|
|
-#endif
|
|
Write_RMW_virtual_word(result_16);
|
|
}
|
|
-
|
|
-#if !(defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
SET_FLAGS_OSZAPC_16(op1_16, op2_16, result_16, BX_INSTR_XOR16);
|
|
#endif
|
|
}
|
|
@@ -78,10 +74,7 @@
|
|
void
|
|
BX_CPU_C::XOR_GwEw(bxInstruction_c *i)
|
|
{
|
|
- Bit16u op1_16, op2_16, result_16;
|
|
- unsigned nnn = i->nnn();
|
|
-
|
|
- op1_16 = BX_READ_16BIT_REG(nnn);
|
|
+ Bit16u op2_16;
|
|
|
|
if (i->modC0()) {
|
|
op2_16 = BX_READ_16BIT_REG(i->rm());
|
|
@@ -89,18 +82,32 @@
|
|
else {
|
|
read_virtual_word(i->seg(), RMAddr(i), &op2_16);
|
|
}
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+asmXor16PlusFlags( BX_READ_16BIT_REG(i->nnn()), op2_16,BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+
|
|
+#else
|
|
+ Bit16u op1_16, result_16;
|
|
+
|
|
+ unsigned nnn = i->nnn();
|
|
+
|
|
+ op1_16 = BX_READ_16BIT_REG(nnn);
|
|
|
|
result_16 = op1_16 ^ op2_16;
|
|
|
|
BX_WRITE_16BIT_REG(nnn, result_16);
|
|
|
|
SET_FLAGS_OSZAPC_16(op1_16, op2_16, result_16, BX_INSTR_XOR16);
|
|
+#endif
|
|
}
|
|
|
|
|
|
void
|
|
BX_CPU_C::XOR_AXIw(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+asmXor16PlusFlags( AX, i->Iw(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+
|
|
+#else
|
|
Bit16u op1_16, op2_16, sum_16;
|
|
|
|
op1_16 = AX;
|
|
@@ -111,11 +118,25 @@
|
|
AX = sum_16;
|
|
|
|
SET_FLAGS_OSZAPC_16(op1_16, op2_16, sum_16, BX_INSTR_XOR16);
|
|
+#endif
|
|
}
|
|
|
|
void
|
|
BX_CPU_C::XOR_EwIw(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+ Bit16u op1_16;
|
|
+ if (i->modC0()) {
|
|
+ op1_16 = BX_READ_16BIT_REG(i->rm());
|
|
+ asmXor16PlusFlags( op1_16, i->Iw(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ BX_WRITE_16BIT_REG(i->rm(), op1_16);
|
|
+ }
|
|
+ else {
|
|
+ read_RMW_virtual_word(i->seg(), RMAddr(i), &op1_16);
|
|
+ asmXor16PlusFlags( op1_16, i->Iw(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_word(op1_16);
|
|
+ }
|
|
+#else
|
|
Bit16u op2_16, op1_16, result_16;
|
|
|
|
|
|
@@ -133,12 +154,26 @@
|
|
}
|
|
|
|
SET_FLAGS_OSZAPC_16(op1_16, op2_16, result_16, BX_INSTR_XOR16);
|
|
+#endif
|
|
}
|
|
|
|
|
|
void
|
|
BX_CPU_C::OR_EwIw(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+ Bit16u op1_16;
|
|
+ if (i->modC0()) {
|
|
+ op1_16 = BX_READ_16BIT_REG(i->rm());
|
|
+ asmOr16PlusFlags( op1_16, i->Iw(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ BX_WRITE_16BIT_REG(i->rm(), op1_16);
|
|
+ }
|
|
+ else {
|
|
+ read_RMW_virtual_word(i->seg(), RMAddr(i), &op1_16);
|
|
+ asmOr16PlusFlags( op1_16, i->Iw(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_word(op1_16);
|
|
+ }
|
|
+#else
|
|
Bit16u op2_16, op1_16, result_16;
|
|
|
|
|
|
@@ -156,6 +191,7 @@
|
|
}
|
|
|
|
SET_FLAGS_OSZAPC_16(op1_16, op2_16, result_16, BX_INSTR_OR16);
|
|
+#endif
|
|
}
|
|
|
|
|
|
@@ -180,6 +216,19 @@
|
|
void
|
|
BX_CPU_C::OR_EwGw(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+ Bit16u op1_16;
|
|
+ if (i->modC0()) {
|
|
+ op1_16 = BX_READ_16BIT_REG(i->rm());
|
|
+ asmOr16PlusFlags( op1_16, BX_READ_16BIT_REG(i->nnn()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ BX_WRITE_16BIT_REG(i->rm(), op1_16);
|
|
+ }
|
|
+ else {
|
|
+ read_RMW_virtual_word(i->seg(), RMAddr(i), &op1_16);
|
|
+ asmOr16PlusFlags( op1_16, BX_READ_16BIT_REG(i->nnn()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_word(op1_16);
|
|
+ }
|
|
+#else
|
|
Bit16u op2_16, op1_16, result_16;
|
|
|
|
op2_16 = BX_READ_16BIT_REG(i->nnn());
|
|
@@ -196,15 +245,14 @@
|
|
}
|
|
|
|
SET_FLAGS_OSZAPC_16(op1_16, op2_16, result_16, BX_INSTR_OR16);
|
|
+#endif
|
|
}
|
|
|
|
|
|
void
|
|
BX_CPU_C::OR_GwEw(bxInstruction_c *i)
|
|
{
|
|
- Bit16u op1_16, op2_16, result_16;
|
|
-
|
|
- op1_16 = BX_READ_16BIT_REG(i->nnn());
|
|
+ Bit16u op2_16;
|
|
|
|
if (i->modC0()) {
|
|
op2_16 = BX_READ_16BIT_REG(i->rm());
|
|
@@ -214,17 +262,16 @@
|
|
}
|
|
|
|
#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
+asmOr16PlusFlags( BX_READ_16BIT_REG(i->nnn()), op2_16,BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
|
|
- asmOr16(result_16, op1_16, op2_16, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
#else
|
|
+ Bit16u op1_16, result_16;
|
|
+
|
|
+ op1_16 = BX_READ_16BIT_REG(i->nnn());
|
|
result_16 = op1_16 | op2_16;
|
|
-#endif
|
|
|
|
BX_WRITE_16BIT_REG(i->nnn(), result_16);
|
|
|
|
-#if !(defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
SET_FLAGS_OSZAPC_16(op1_16, op2_16, result_16, BX_INSTR_OR16);
|
|
#endif
|
|
}
|
|
@@ -233,6 +280,10 @@
|
|
void
|
|
BX_CPU_C::OR_AXIw(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+asmOr16PlusFlags( AX, i->Iw(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+
|
|
+#else
|
|
Bit16u op1_16, op2_16, sum_16;
|
|
|
|
op1_16 = AX;
|
|
@@ -243,6 +294,7 @@
|
|
AX = sum_16;
|
|
|
|
SET_FLAGS_OSZAPC_16(op1_16, op2_16, sum_16, BX_INSTR_OR16);
|
|
+#endif
|
|
}
|
|
|
|
|
|
@@ -250,41 +302,35 @@
|
|
void
|
|
BX_CPU_C::AND_EwGw(bxInstruction_c *i)
|
|
{
|
|
- Bit16u op2_16, op1_16, result_16;
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+ Bit16u op1_16;
|
|
+ if (i->modC0()) {
|
|
+ op1_16 = BX_READ_16BIT_REG(i->rm());
|
|
+ asmAnd16PlusFlags( op1_16, BX_READ_16BIT_REG(i->nnn()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ BX_WRITE_16BIT_REG(i->rm(), op1_16);
|
|
+ }
|
|
+ else {
|
|
+ read_RMW_virtual_word(i->seg(), RMAddr(i), &op1_16);
|
|
+ asmAnd16PlusFlags( op1_16, BX_READ_16BIT_REG(i->nnn()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_word(op1_16);
|
|
+ }
|
|
+#else
|
|
+ Bit16u op2_16, op1_16, result_16;;
|
|
|
|
op2_16 = BX_READ_16BIT_REG(i->nnn());
|
|
|
|
if (i->modC0()) {
|
|
op1_16 = BX_READ_16BIT_REG(i->rm());
|
|
-
|
|
-#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
-
|
|
- asmAnd16(result_16, op1_16, op2_16, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
-#else
|
|
result_16 = op1_16 & op2_16;
|
|
-#endif
|
|
-
|
|
BX_WRITE_16BIT_REG(i->rm(), result_16);
|
|
+ SET_FLAGS_OSZAPC_16(op1_16, op2_16, result_16, BX_INSTR_AND16);
|
|
}
|
|
else {
|
|
read_RMW_virtual_word(i->seg(), RMAddr(i), &op1_16);
|
|
-
|
|
-#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
-
|
|
- asmAnd16(result_16, op1_16, op2_16, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
-#else
|
|
result_16 = op1_16 & op2_16;
|
|
-#endif
|
|
-
|
|
+ SET_FLAGS_OSZAPC_16(op1_16, op2_16, result_16, BX_INSTR_AND16);
|
|
Write_RMW_virtual_word(result_16);
|
|
}
|
|
-
|
|
-#if !(defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- SET_FLAGS_OSZAPC_16(op1_16, op2_16, result_16, BX_INSTR_AND16);
|
|
#endif
|
|
}
|
|
|
|
@@ -292,9 +338,8 @@
|
|
void
|
|
BX_CPU_C::AND_GwEw(bxInstruction_c *i)
|
|
{
|
|
- Bit16u op1_16, op2_16, result_16;
|
|
+ Bit16u op2_16;
|
|
|
|
- op1_16 = BX_READ_16BIT_REG(i->nnn());
|
|
|
|
if (i->modC0()) {
|
|
op2_16 = BX_READ_16BIT_REG(i->rm());
|
|
@@ -304,83 +349,74 @@
|
|
}
|
|
|
|
#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
-
|
|
- asmAnd16(result_16, op1_16, op2_16, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
+asmAnd16PlusFlags( BX_READ_16BIT_REG(i->nnn()), op2_16,BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
#else
|
|
+ Bit16u op1_16, result_16;
|
|
+
|
|
+ op1_16 = BX_READ_16BIT_REG(i->nnn());
|
|
result_16 = op1_16 & op2_16;
|
|
-#endif
|
|
|
|
BX_WRITE_16BIT_REG(i->nnn(), result_16);
|
|
|
|
-#if !(defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
SET_FLAGS_OSZAPC_16(op1_16, op2_16, result_16, BX_INSTR_AND16);
|
|
#endif
|
|
}
|
|
|
|
|
|
- void
|
|
+
|
|
+ void
|
|
BX_CPU_C::AND_AXIw(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+asmAnd16PlusFlags( AX, i->Iw(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+#else
|
|
+
|
|
Bit16u op1_16, op2_16, result_16;
|
|
|
|
op1_16 = AX;
|
|
op2_16 = i->Iw();
|
|
|
|
-#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
-
|
|
- asmAnd16(result_16, op1_16, op2_16, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
-#else
|
|
result_16 = op1_16 & op2_16;
|
|
-#endif
|
|
|
|
AX = result_16;
|
|
|
|
-#if !(defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
SET_FLAGS_OSZAPC_16(op1_16, op2_16, result_16, BX_INSTR_AND16);
|
|
#endif
|
|
}
|
|
|
|
+
|
|
+
|
|
void
|
|
BX_CPU_C::AND_EwIw(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+ Bit16u op1_16;
|
|
+ if (i->modC0()) {
|
|
+ op1_16 = BX_READ_16BIT_REG(i->rm());
|
|
+ asmAnd16PlusFlags( op1_16, i->Iw(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ BX_WRITE_16BIT_REG(i->rm(), op1_16);
|
|
+ }
|
|
+ else {
|
|
+ read_RMW_virtual_word(i->seg(), RMAddr(i), &op1_16);
|
|
+ asmAnd16PlusFlags( op1_16, i->Iw(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_word(op1_16);
|
|
+ }
|
|
+#else
|
|
Bit16u op2_16, op1_16, result_16;
|
|
|
|
op2_16 = i->Iw();
|
|
|
|
if (i->modC0()) {
|
|
op1_16 = BX_READ_16BIT_REG(i->rm());
|
|
-
|
|
-#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
-
|
|
- asmAnd16(result_16, op1_16, op2_16, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
-#else
|
|
result_16 = op1_16 & op2_16;
|
|
-#endif
|
|
-
|
|
BX_WRITE_16BIT_REG(i->rm(), result_16);
|
|
}
|
|
else {
|
|
read_RMW_virtual_word(i->seg(), RMAddr(i), &op1_16);
|
|
-
|
|
-#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
-
|
|
- asmAnd16(result_16, op1_16, op2_16, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
-#else
|
|
result_16 = op1_16 & op2_16;
|
|
-#endif
|
|
-
|
|
Write_RMW_virtual_word(result_16);
|
|
}
|
|
|
|
-#if !(defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
SET_FLAGS_OSZAPC_16(op1_16, op2_16, result_16, BX_INSTR_AND16);
|
|
#endif
|
|
}
|
|
@@ -401,10 +437,9 @@
|
|
}
|
|
|
|
#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
|
|
- asmTest16(op1_16, op2_16, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
+ asmTest16PlusFlags(op1_16,op2_16,BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+
|
|
#else
|
|
Bit16u result_16;
|
|
result_16 = op1_16 & op2_16;
|
|
@@ -424,10 +459,9 @@
|
|
op2_16 = i->Iw();
|
|
|
|
#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
|
|
- asmTest16(op1_16, op2_16, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
+ asmTest16PlusFlags(op1_16,op2_16,BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+
|
|
#else
|
|
Bit16u result_16;
|
|
result_16 = op1_16 & op2_16;
|
|
@@ -452,10 +486,9 @@
|
|
}
|
|
|
|
#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
|
|
- asmTest16(op1_16, op2_16, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
+ asmTest16PlusFlags(op1_16,op2_16,BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+
|
|
#else
|
|
Bit16u result_16;
|
|
result_16 = op1_16 & op2_16;
|
|
diff -ur bochs/cpu/logical32.cc bochs-modified/cpu/logical32.cc
|
|
--- bochs/cpu/logical32.cc Fri Oct 25 11:26:28 2002
|
|
+++ bochs-modified/cpu/logical32.cc Mon Aug 18 15:06:13 2003
|
|
@@ -39,6 +39,19 @@
|
|
void
|
|
BX_CPU_C::XOR_EdGd(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+ Bit32u op1_32;
|
|
+ if (i->modC0()) {
|
|
+ op1_32 = BX_READ_32BIT_REG(i->rm());
|
|
+ asmXor32PlusFlags( op1_32, BX_READ_32BIT_REG(i->nnn()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ BX_WRITE_32BIT_REGZ(i->rm(), op1_32);
|
|
+ }
|
|
+ else {
|
|
+ read_RMW_virtual_dword(i->seg(), RMAddr(i), &op1_32);
|
|
+ asmXor32PlusFlags( op1_32, BX_READ_32BIT_REG(i->nnn()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_dword(op1_32);
|
|
+ }
|
|
+#else
|
|
Bit32u op2_32, op1_32, result_32;
|
|
|
|
op2_32 = BX_READ_32BIT_REG(i->nnn());
|
|
@@ -55,17 +68,16 @@
|
|
}
|
|
|
|
SET_FLAGS_OSZAPC_32(op1_32, op2_32, result_32, BX_INSTR_XOR32);
|
|
+#endif
|
|
}
|
|
|
|
|
|
void
|
|
BX_CPU_C::XOR_GdEd(bxInstruction_c *i)
|
|
{
|
|
- Bit32u op1_32, op2_32, result_32;
|
|
+ Bit32u op1_32, op2_32;
|
|
unsigned nnn = i->nnn();
|
|
|
|
- op1_32 = BX_READ_32BIT_REG(nnn);
|
|
-
|
|
if (i->modC0()) {
|
|
op2_32 = BX_READ_32BIT_REG(i->rm());
|
|
}
|
|
@@ -73,17 +85,38 @@
|
|
read_virtual_dword(i->seg(), RMAddr(i), &op2_32);
|
|
}
|
|
|
|
+ op1_32 = BX_READ_32BIT_REG(nnn);
|
|
+
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+ asmXor32PlusFlags( op1_32, op2_32,BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ BX_WRITE_32BIT_REGZ(nnn, op1_32);
|
|
+#else
|
|
+ Bit32u result_32;
|
|
+
|
|
result_32 = op1_32 ^ op2_32;
|
|
|
|
BX_WRITE_32BIT_REGZ(nnn, result_32);
|
|
|
|
SET_FLAGS_OSZAPC_32(op1_32, op2_32, result_32, BX_INSTR_XOR32);
|
|
+#endif
|
|
}
|
|
|
|
|
|
void
|
|
BX_CPU_C::XOR_EAXId(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+
|
|
+ #if BX_SUPPORT_X86_64
|
|
+ Bit32u op1_32;
|
|
+ op1_32 = EAX;
|
|
+ asmXor32PlusFlags( op1_32, i->Id(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ RAX = op1_32;
|
|
+ #else
|
|
+ asmXor32PlusFlags( EAX, i->Id(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ #endif
|
|
+
|
|
+#else
|
|
Bit32u op1_32, op2_32, sum_32;
|
|
|
|
op1_32 = EAX;
|
|
@@ -91,18 +124,32 @@
|
|
|
|
sum_32 = op1_32 ^ op2_32;
|
|
|
|
-#if BX_SUPPORT_X86_64
|
|
+ #if BX_SUPPORT_X86_64
|
|
RAX = sum_32;
|
|
-#else
|
|
+ #else
|
|
EAX = sum_32;
|
|
-#endif
|
|
+ #endif
|
|
|
|
SET_FLAGS_OSZAPC_32(op1_32, op2_32, sum_32, BX_INSTR_XOR32);
|
|
+#endif
|
|
}
|
|
|
|
void
|
|
BX_CPU_C::XOR_EdId(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+ Bit32u op1_32;
|
|
+ if (i->modC0()) {
|
|
+ op1_32 = BX_READ_32BIT_REG(i->rm());
|
|
+ asmXor32PlusFlags( op1_32, i->Id(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ BX_WRITE_32BIT_REGZ(i->rm(), op1_32);
|
|
+ }
|
|
+ else {
|
|
+ read_RMW_virtual_dword(i->seg(), RMAddr(i), &op1_32);
|
|
+ asmXor32PlusFlags( op1_32, i->Id(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_dword(op1_32);
|
|
+ }
|
|
+#else
|
|
Bit32u op2_32, op1_32, result_32;
|
|
|
|
op2_32 = i->Id();
|
|
@@ -119,12 +166,26 @@
|
|
}
|
|
|
|
SET_FLAGS_OSZAPC_32(op1_32, op2_32, result_32, BX_INSTR_XOR32);
|
|
+#endif
|
|
}
|
|
|
|
|
|
void
|
|
BX_CPU_C::OR_EdId(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+ Bit32u op1_32;
|
|
+ if (i->modC0()) {
|
|
+ op1_32 = BX_READ_32BIT_REG(i->rm());
|
|
+ asmOr32PlusFlags( op1_32, i->Id(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ BX_WRITE_32BIT_REGZ(i->rm(), op1_32);
|
|
+ }
|
|
+ else {
|
|
+ read_RMW_virtual_dword(i->seg(), RMAddr(i), &op1_32);
|
|
+ asmOr32PlusFlags( op1_32, i->Id(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_dword(op1_32);
|
|
+ }
|
|
+#else
|
|
Bit32u op2_32, op1_32, result_32;
|
|
|
|
op2_32 = i->Id();
|
|
@@ -141,6 +202,7 @@
|
|
}
|
|
|
|
SET_FLAGS_OSZAPC_32(op1_32, op2_32, result_32, BX_INSTR_OR32);
|
|
+#endif
|
|
}
|
|
|
|
void
|
|
@@ -164,6 +226,19 @@
|
|
void
|
|
BX_CPU_C::OR_EdGd(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+ Bit32u op1_32;
|
|
+ if (i->modC0()) {
|
|
+ op1_32 = BX_READ_32BIT_REG(i->rm());
|
|
+ asmOr32PlusFlags( op1_32, BX_READ_32BIT_REG(i->nnn()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ BX_WRITE_32BIT_REGZ(i->rm(), op1_32);
|
|
+ }
|
|
+ else {
|
|
+ read_RMW_virtual_dword(i->seg(), RMAddr(i), &op1_32);
|
|
+ asmOr32PlusFlags( op1_32, BX_READ_32BIT_REG(i->nnn()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_dword(op1_32);
|
|
+ }
|
|
+#else
|
|
Bit32u op2_32, op1_32, result_32;
|
|
|
|
op2_32 = BX_READ_32BIT_REG(i->nnn());
|
|
@@ -180,15 +255,14 @@
|
|
}
|
|
|
|
SET_FLAGS_OSZAPC_32(op1_32, op2_32, result_32, BX_INSTR_OR32);
|
|
+#endif
|
|
}
|
|
|
|
|
|
void
|
|
BX_CPU_C::OR_GdEd(bxInstruction_c *i)
|
|
{
|
|
- Bit32u op1_32, op2_32, result_32;
|
|
-
|
|
- op1_32 = BX_READ_32BIT_REG(i->nnn());
|
|
+ Bit32u op1_32, op2_32;
|
|
|
|
if (i->modC0()) {
|
|
op2_32 = BX_READ_32BIT_REG(i->rm());
|
|
@@ -197,18 +271,18 @@
|
|
read_virtual_dword(i->seg(), RMAddr(i), &op2_32);
|
|
}
|
|
|
|
-#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
+ op1_32 = BX_READ_32BIT_REG(i->nnn());
|
|
|
|
- asmOr32(result_32, op1_32, op2_32, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+ asmOr32PlusFlags( op1_32, op2_32,BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ BX_WRITE_32BIT_REGZ(i->nnn(), op1_32);
|
|
#else
|
|
+ Bit32u result_32;
|
|
+
|
|
result_32 = op1_32 | op2_32;
|
|
-#endif
|
|
|
|
BX_WRITE_32BIT_REGZ(i->nnn(), result_32);
|
|
|
|
-#if !(defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
SET_FLAGS_OSZAPC_32(op1_32, op2_32, result_32, BX_INSTR_OR32);
|
|
#endif
|
|
}
|
|
@@ -217,6 +291,18 @@
|
|
void
|
|
BX_CPU_C::OR_EAXId(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+
|
|
+ #if BX_SUPPORT_X86_64
|
|
+ Bit32u op1_32;
|
|
+ op1_32 = EAX;
|
|
+ asmOr32PlusFlags( op1_32, i->Id(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ RAX = op1_32;
|
|
+ #else
|
|
+ asmOr32PlusFlags( EAX, i->Id(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ #endif
|
|
+
|
|
+#else
|
|
Bit32u op1_32, op2_32, sum_32;
|
|
|
|
op1_32 = EAX;
|
|
@@ -224,13 +310,14 @@
|
|
|
|
sum_32 = op1_32 | op2_32;
|
|
|
|
-#if BX_SUPPORT_X86_64
|
|
+ #if BX_SUPPORT_X86_64
|
|
RAX = sum_32;
|
|
-#else
|
|
+ #else
|
|
EAX = sum_32;
|
|
-#endif
|
|
+ #endif
|
|
|
|
SET_FLAGS_OSZAPC_32(op1_32, op2_32, sum_32, BX_INSTR_OR32);
|
|
+#endif
|
|
}
|
|
|
|
|
|
@@ -238,40 +325,34 @@
|
|
void
|
|
BX_CPU_C::AND_EdGd(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+ Bit32u op1_32;
|
|
+ if (i->modC0()) {
|
|
+ op1_32 = BX_READ_32BIT_REG(i->rm());
|
|
+ asmAnd32PlusFlags( op1_32, BX_READ_32BIT_REG(i->nnn()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ BX_WRITE_32BIT_REGZ(i->rm(), op1_32);
|
|
+ }
|
|
+ else {
|
|
+ read_RMW_virtual_dword(i->seg(), RMAddr(i), &op1_32);
|
|
+ asmAnd32PlusFlags( op1_32, BX_READ_32BIT_REG(i->nnn()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_dword(op1_32);
|
|
+ }
|
|
+#else
|
|
Bit32u op2_32, op1_32, result_32;
|
|
|
|
op2_32 = BX_READ_32BIT_REG(i->nnn());
|
|
|
|
if (i->modC0()) {
|
|
op1_32 = BX_READ_32BIT_REG(i->rm());
|
|
-
|
|
-#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
-
|
|
- asmAnd32(result_32, op1_32, op2_32, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
-#else
|
|
result_32 = op1_32 & op2_32;
|
|
-#endif
|
|
-
|
|
BX_WRITE_32BIT_REGZ(i->rm(), result_32);
|
|
}
|
|
else {
|
|
read_RMW_virtual_dword(i->seg(), RMAddr(i), &op1_32);
|
|
-
|
|
-#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
-
|
|
- asmAnd32(result_32, op1_32, op2_32, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
-#else
|
|
result_32 = op1_32 & op2_32;
|
|
-#endif
|
|
-
|
|
Write_RMW_virtual_dword(result_32);
|
|
}
|
|
|
|
-#if !(defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
SET_FLAGS_OSZAPC_32(op1_32, op2_32, result_32, BX_INSTR_AND32);
|
|
#endif
|
|
}
|
|
@@ -280,9 +361,7 @@
|
|
void
|
|
BX_CPU_C::AND_GdEd(bxInstruction_c *i)
|
|
{
|
|
- Bit32u op1_32, op2_32, result_32;
|
|
-
|
|
- op1_32 = BX_READ_32BIT_REG(i->nnn());
|
|
+ Bit32u op1_32, op2_32;
|
|
|
|
if (i->modC0()) {
|
|
op2_32 = BX_READ_32BIT_REG(i->rm());
|
|
@@ -291,18 +370,17 @@
|
|
read_virtual_dword(i->seg(), RMAddr(i), &op2_32);
|
|
}
|
|
|
|
-#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
+ op1_32 = BX_READ_32BIT_REG(i->nnn());
|
|
|
|
- asmAnd32(result_32, op1_32, op2_32, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+ asmAnd32PlusFlags( op1_32, op2_32,BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ BX_WRITE_32BIT_REGZ(i->nnn(), op1_32);
|
|
#else
|
|
+ Bit32u result_32;
|
|
result_32 = op1_32 & op2_32;
|
|
-#endif
|
|
|
|
BX_WRITE_32BIT_REGZ(i->nnn(), result_32);
|
|
|
|
-#if !(defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
SET_FLAGS_OSZAPC_32(op1_32, op2_32, result_32, BX_INSTR_AND32);
|
|
#endif
|
|
}
|
|
@@ -311,27 +389,30 @@
|
|
void
|
|
BX_CPU_C::AND_EAXId(bxInstruction_c *i)
|
|
{
|
|
- Bit32u op1_32, op2_32, result_32;
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
|
|
+ #if BX_SUPPORT_X86_64
|
|
+ Bit32u op1_32;
|
|
op1_32 = EAX;
|
|
- op2_32 = i->Id();
|
|
-
|
|
-#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
+ asmAnd32PlusFlags( op1_32, i->Id(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ RAX = op1_32;
|
|
+ #else
|
|
+ asmAnd32PlusFlags( EAX, i->Id(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ #endif
|
|
|
|
- asmAnd32(result_32, op1_32, op2_32, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
#else
|
|
+ Bit32u op1_32, op2_32, result_32;
|
|
+
|
|
+ op2_32 = i->Id();
|
|
+
|
|
result_32 = op1_32 & op2_32;
|
|
-#endif
|
|
|
|
-#if BX_SUPPORT_X86_64
|
|
+ #if BX_SUPPORT_X86_64
|
|
RAX = result_32;
|
|
-#else
|
|
+ #else
|
|
EAX = result_32;
|
|
-#endif
|
|
+ #endif
|
|
|
|
-#if !(defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
SET_FLAGS_OSZAPC_32(op1_32, op2_32, result_32, BX_INSTR_AND32);
|
|
#endif
|
|
}
|
|
@@ -339,40 +420,34 @@
|
|
void
|
|
BX_CPU_C::AND_EdId(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+ Bit32u op1_32;
|
|
+ if (i->modC0()) {
|
|
+ op1_32 = BX_READ_32BIT_REG(i->rm());
|
|
+ asmAnd32PlusFlags( op1_32, i->Id(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ BX_WRITE_32BIT_REGZ(i->rm(), op1_32);
|
|
+ }
|
|
+ else {
|
|
+ read_RMW_virtual_dword(i->seg(), RMAddr(i), &op1_32);
|
|
+ asmAnd32PlusFlags( op1_32, i->Id(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+ Write_RMW_virtual_dword(op1_32);
|
|
+ }
|
|
+#else
|
|
Bit32u op2_32, op1_32, result_32;
|
|
|
|
op2_32 = i->Id();
|
|
|
|
if (i->modC0()) {
|
|
op1_32 = BX_READ_32BIT_REG(i->rm());
|
|
-
|
|
-#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
-
|
|
- asmAnd32(result_32, op1_32, op2_32, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
-#else
|
|
result_32 = op1_32 & op2_32;
|
|
-#endif
|
|
-
|
|
BX_WRITE_32BIT_REGZ(i->rm(), result_32);
|
|
}
|
|
else {
|
|
read_RMW_virtual_dword(i->seg(), RMAddr(i), &op1_32);
|
|
-
|
|
-#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
-
|
|
- asmAnd32(result_32, op1_32, op2_32, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
-#else
|
|
result_32 = op1_32 & op2_32;
|
|
-#endif
|
|
-
|
|
Write_RMW_virtual_dword(result_32);
|
|
}
|
|
|
|
-#if !(defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
SET_FLAGS_OSZAPC_32(op1_32, op2_32, result_32, BX_INSTR_AND32);
|
|
#endif
|
|
}
|
|
@@ -381,9 +456,7 @@
|
|
void
|
|
BX_CPU_C::TEST_EdGd(bxInstruction_c *i)
|
|
{
|
|
- Bit32u op2_32, op1_32;
|
|
-
|
|
- op2_32 = BX_READ_32BIT_REG(i->nnn());
|
|
+ Bit32u op1_32;
|
|
|
|
if (i->modC0()) {
|
|
op1_32 = BX_READ_32BIT_REG(i->rm());
|
|
@@ -393,12 +466,11 @@
|
|
}
|
|
|
|
#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
-
|
|
- asmTest32(op1_32, op2_32, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
+ asmTest32PlusFlags(op1_32,BX_READ_32BIT_REG(i->nnn()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
#else
|
|
- Bit32u result_32;
|
|
+ Bit32u op2_32, result_32;
|
|
+
|
|
+ op2_32 = BX_READ_32BIT_REG(i->nnn());
|
|
result_32 = op1_32 & op2_32;
|
|
|
|
SET_FLAGS_OSZAPC_32(op1_32, op2_32, result_32, BX_INSTR_TEST32);
|
|
@@ -410,17 +482,14 @@
|
|
void
|
|
BX_CPU_C::TEST_EAXId(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+ asmTest32PlusFlags(EAX,i->Id(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+#else
|
|
Bit32u op2_32, op1_32;
|
|
|
|
op1_32 = EAX;
|
|
op2_32 = i->Id();
|
|
|
|
-#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
-
|
|
- asmTest32(op1_32, op2_32, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
-#else
|
|
Bit32u result_32;
|
|
result_32 = op1_32 & op2_32;
|
|
|
|
@@ -432,9 +501,7 @@
|
|
void
|
|
BX_CPU_C::TEST_EdId(bxInstruction_c *i)
|
|
{
|
|
- Bit32u op2_32, op1_32;
|
|
-
|
|
- op2_32 = i->Id();
|
|
+ Bit32u op1_32;
|
|
|
|
if (i->modC0()) {
|
|
op1_32 = BX_READ_32BIT_REG(i->rm());
|
|
@@ -444,12 +511,13 @@
|
|
}
|
|
|
|
#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
|
|
- asmTest32(op1_32, op2_32, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
+ asmTest32PlusFlags(op1_32,i->Id(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+
|
|
#else
|
|
- Bit32u result_32;
|
|
+ Bit32u op2_32, result_32;
|
|
+
|
|
+ op2_32 = i->Id();
|
|
result_32 = op1_32 & op2_32;
|
|
|
|
SET_FLAGS_OSZAPC_32(op1_32, op2_32, result_32, BX_INSTR_TEST32);
|
|
diff -ur bochs/cpu/logical8.cc bochs-modified/cpu/logical8.cc
|
|
--- bochs/cpu/logical8.cc Fri Oct 25 11:26:28 2002
|
|
+++ bochs-modified/cpu/logical8.cc Wed Aug 13 11:48:53 2003
|
|
@@ -383,9 +383,8 @@
|
|
void
|
|
BX_CPU_C::TEST_EbGb(bxInstruction_c *i)
|
|
{
|
|
- Bit8u op2, op1;
|
|
+ Bit8u op1;
|
|
|
|
- op2 = BX_READ_8BIT_REGx(i->nnn(),i->extend8bitL());
|
|
|
|
if (i->modC0()) {
|
|
op1 = BX_READ_8BIT_REGx(i->rm(),i->extend8bitL());
|
|
@@ -395,12 +394,15 @@
|
|
}
|
|
|
|
#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
|
|
- asmTest8(op1, op2, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
+asmTest8PlusFlags(op1,BX_READ_8BIT_REGx(i->nnn(),i->extend8bitL()),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+
|
|
#else
|
|
- Bit8u result;
|
|
+ Bit8u op2, result;
|
|
+
|
|
+ op2 = BX_READ_8BIT_REGx(i->nnn(),i->extend8bitL());
|
|
+
|
|
+
|
|
result = op1 & op2;
|
|
|
|
SET_FLAGS_OSZAPC_8(op1, op2, result, BX_INSTR_TEST8);
|
|
@@ -411,18 +413,17 @@
|
|
void
|
|
BX_CPU_C::TEST_ALIb(bxInstruction_c *i)
|
|
{
|
|
+#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
+
|
|
+asmTest8PlusFlags(AL,i->Ib(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+
|
|
+#else
|
|
+ Bit8u result;
|
|
Bit8u op2, op1;
|
|
|
|
op1 = AL;
|
|
op2 = i->Ib();
|
|
|
|
-#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
-
|
|
- asmTest8(op1, op2, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
-#else
|
|
- Bit8u result;
|
|
result = op1 & op2;
|
|
|
|
SET_FLAGS_OSZAPC_8(op1, op2, result, BX_INSTR_TEST8);
|
|
@@ -434,9 +435,7 @@
|
|
void
|
|
BX_CPU_C::TEST_EbIb(bxInstruction_c *i)
|
|
{
|
|
- Bit8u op2, op1;
|
|
-
|
|
- op2 = i->Ib();
|
|
+ Bit8u op1;
|
|
|
|
if (i->modC0()) {
|
|
op1 = BX_READ_8BIT_REGx(i->rm(),i->extend8bitL());
|
|
@@ -446,12 +445,14 @@
|
|
}
|
|
|
|
#if (defined(__i386__) && defined(__GNUC__) && BX_SupportHostAsms)
|
|
- Bit32u flags32;
|
|
|
|
- asmTest8(op1, op2, flags32);
|
|
- setEFlagsOSZAPC(flags32);
|
|
+asmTest8PlusFlags(op1,i->Ib(),BX_CPU_THIS_PTR lf_flags_status,BX_CPU_THIS_PTR eflags.val32);
|
|
+
|
|
#else
|
|
- Bit8u result;
|
|
+ Bit8u op2, result;
|
|
+
|
|
+ op2 = i->Ib();
|
|
+
|
|
result = op1 & op2;
|
|
|
|
SET_FLAGS_OSZAPC_8(op1, op2, result, BX_INSTR_TEST8);
|