aboutsummaryrefslogtreecommitdiff
path: root/target-i386/op.c
diff options
context:
space:
mode:
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2003-11-23 23:09:40 +0000
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2003-11-23 23:09:40 +0000
commit4136f33c7e3c034b17bb0032fa5d4297ae2f317a (patch)
treee56d20e93e79ef871bb47d9654d664377ab2cec1 /target-i386/op.c
parent6dca2016fc0cca49ce866b7f2fcfffe011c1f496 (diff)
fixed eflags IF/IOPL update
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@476 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'target-i386/op.c')
-rw-r--r--target-i386/op.c32
1 files changed, 15 insertions, 17 deletions
diff --git a/target-i386/op.c b/target-i386/op.c
index 04046fc0b5..8988e061cb 100644
--- a/target-i386/op.c
+++ b/target-i386/op.c
@@ -1138,38 +1138,36 @@ void OPPROTO op_set_cc_op(void)
CC_OP = PARAM1;
}
-#define FL_UPDATE_MASK16 (FL_UPDATE_MASK32 & 0xffff)
+/* XXX: clear VIF/VIP in all ops ? */
void OPPROTO op_movl_eflags_T0(void)
{
- int eflags;
- eflags = T0;
- CC_SRC = eflags & (CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C);
- DF = 1 - (2 * ((eflags >> 10) & 1));
- /* we also update some system flags as in user mode */
- env->eflags = (env->eflags & ~FL_UPDATE_MASK32) |
- (eflags & FL_UPDATE_MASK32);
+ load_eflags(T0, (TF_MASK | AC_MASK | ID_MASK));
}
void OPPROTO op_movw_eflags_T0(void)
{
- int eflags;
- eflags = T0;
- CC_SRC = eflags & (CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C);
- DF = 1 - (2 * ((eflags >> 10) & 1));
- /* we also update some system flags as in user mode */
- env->eflags = (env->eflags & ~FL_UPDATE_MASK16) |
- (eflags & FL_UPDATE_MASK16);
+ load_eflags(T0, (TF_MASK | AC_MASK | ID_MASK) & 0xffff);
+}
+
+void OPPROTO op_movl_eflags_T0_io(void)
+{
+ load_eflags(T0, (TF_MASK | AC_MASK | ID_MASK | IF_MASK));
+}
+
+void OPPROTO op_movw_eflags_T0_io(void)
+{
+ load_eflags(T0, (TF_MASK | AC_MASK | ID_MASK | IF_MASK) & 0xffff);
}
void OPPROTO op_movl_eflags_T0_cpl0(void)
{
- load_eflags(T0, FL_UPDATE_CPL0_MASK);
+ load_eflags(T0, (TF_MASK | AC_MASK | ID_MASK | IF_MASK | IOPL_MASK));
}
void OPPROTO op_movw_eflags_T0_cpl0(void)
{
- load_eflags(T0, FL_UPDATE_CPL0_MASK & 0xffff);
+ load_eflags(T0, (TF_MASK | AC_MASK | ID_MASK | IF_MASK | IOPL_MASK) & 0xffff);
}
#if 0