BOOLEAN OperandSize, AddressSize;
FAST486_MOD_REG_RM ModRegRm;
LONG Multiplier;
- LONGLONG Product;
/* Make sure this is the right instruction */
ASSERT((Opcode & 0xFD) == 0x69);
if (OperandSize)
{
LONG RegValue, Multiplicand;
+ LONGLONG Product;
/* Read the operands */
if (!Fast486ReadModrmDwordOperands(State,
/* Multiply */
Product = (LONGLONG)Multiplicand * (LONGLONG)Multiplier;
+
+ /* Check for carry/overflow */
+ State->Flags.Cf = State->Flags.Of = ((Product < MINLONG) || (Product > MAXLONG));
+
+ /* Write-back the result */
+ return Fast486WriteModrmDwordOperands(State,
+ &ModRegRm,
+ TRUE,
+ (ULONG)((LONG)Product));
}
else
{
SHORT RegValue, Multiplicand;
+ LONG Product;
/* Read the operands */
if (!Fast486ReadModrmWordOperands(State,
}
/* Multiply */
- Product = (LONGLONG)Multiplicand * (LONGLONG)Multiplier;
- }
+ Product = (LONG)Multiplicand * (LONG)Multiplier;
- /* Check for carry/overflow */
- State->Flags.Cf = State->Flags.Of = ((Product < MINLONG) || (Product > MAXLONG));
+ /* Check for carry/overflow */
+ State->Flags.Cf = State->Flags.Of = ((Product < MINSHORT) || (Product > MAXSHORT));
- /* Write-back the result */
- return Fast486WriteModrmDwordOperands(State,
- &ModRegRm,
- TRUE,
- (ULONG)((LONG)Product));
+ /* Write-back the result */
+ return Fast486WriteModrmWordOperands(State,
+ &ModRegRm,
+ TRUE,
+ (USHORT)((SHORT)Product));
+ }
}
FAST486_OPCODE_HANDLER(Fast486OpcodePushByteImm)