From 9a8c7e2a048bf13faed21f00aa2076ef95b37b11 Mon Sep 17 00:00:00 2001 From: Aleksandar Andrejevic Date: Fri, 22 Nov 2013 02:47:48 +0000 Subject: [PATCH] [FAST486] Fix CF calculation in SHRD/SHLD. svn path=/branches/ntvdm/; revision=61070 --- lib/fast486/extraops.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/fast486/extraops.c b/lib/fast486/extraops.c index ab7b22260e6..b76aa4302b8 100644 --- a/lib/fast486/extraops.c +++ b/lib/fast486/extraops.c @@ -683,7 +683,9 @@ FAST486_OPCODE_HANDLER(Fast486ExtOpcodeShld) Result = (Destination << Count) | (DoubleSource >> (32 - Count)); /* Update flags */ - State->Flags.Cf = (Destination >> (16 - Count)) & 1; + if (Count <= 16) State->Flags.Cf = (Destination >> (16 - Count)) & 1; + else State->Flags.Cf = (Source >> (32 - Count)) & 1; + if (Count == 1) State->Flags.Of = (Result & SIGN_FLAG_WORD) != (Destination & SIGN_FLAG_WORD); State->Flags.Zf = (Result == 0); @@ -887,7 +889,9 @@ FAST486_OPCODE_HANDLER(Fast486ExtOpcodeShrd) if (Count >= 16) Result |= (ULONG)(Source | (Source << 16)) >> (Count - 16); /* Update flags */ - State->Flags.Cf = (Result >> (Count - 1)) & 1; + if (Count <= 16) State->Flags.Cf = (Destination >> (Count - 1)) & 1; + else State->Flags.Cf = (Source >> (Count - 17)) & 1; + if (Count == 1) State->Flags.Of = (Result & SIGN_FLAG_WORD) != (Destination & SIGN_FLAG_WORD); State->Flags.Zf = (Result == 0);