1
0
mirror of https://github.com/bitdefender/bddisasm.git synced 2024-11-22 07:28:07 +00:00

Added 64-bit mul test case + made the code more readable.

This commit is contained in:
Andrei Vlad LUTAS 2024-06-05 00:52:51 +03:00
parent 270587903e
commit 54a2027333
2 changed files with 22 additions and 31 deletions

View File

@ -1442,29 +1442,23 @@ ShemuX86SetOperandValue(
// //
static void static void
ShemuX86Multiply64Unsigned( ShemuX86Multiply64Unsigned(
ND_UINT64 Operand1, SHEMU_VALUE *Operand1,
ND_UINT64 Operand2, SHEMU_VALUE *Operand2,
ND_UINT64 *ResHigh, SHEMU_VALUE *Result
ND_UINT64 *ResLow
) )
{ {
ND_UINT64 xLow, xHigh, yLow, yHigh, p0, p1, p2, p3, ps; ND_UINT64 p0, p1, p2, p3, p4;
xLow = Operand1 & 0xFFFFFFFF; // Multiply the 4 32-bit parts into 4 partial products.
xHigh = Operand1 >> 32; p0 = (ND_UINT64)Operand1->Value.Dwords[0] * (ND_UINT64)Operand2->Value.Dwords[0];
yLow = Operand2 & 0xFFFFFFFF; p1 = (ND_UINT64)Operand1->Value.Dwords[0] * (ND_UINT64)Operand2->Value.Dwords[1];
yHigh = Operand2 >> 32; p2 = (ND_UINT64)Operand1->Value.Dwords[1] * (ND_UINT64)Operand2->Value.Dwords[0];
p3 = (ND_UINT64)Operand1->Value.Dwords[1] * (ND_UINT64)Operand2->Value.Dwords[1];
// Multiply the 4 parts into 4 partial products. p4 = (((p0 >> 32) + (p1 & 0xFFFFFFFF) + (p2 & 0xFFFFFFFF)) >> 32) & 0xFFFFFFFF;
p0 = xLow * yLow;
p1 = xLow * yHigh;
p2 = xHigh * yLow;
p3 = xHigh * yHigh;
ps = (((p0 >> 32) + (p1 & 0xFFFFFFFF) + (p2 & 0xFFFFFFFF)) >> 32) & 0xFFFFFFFF;
// Fill in the final result (low & high 64-bit parts). // Fill in the final result (low & high 64-bit parts).
*ResLow = p0 + (p1 << 32) + (p2 << 32); Result->Value.Qwords[0] = p0 + (p1 << 32) + (p2 << 32);
*ResHigh = p3 + (p1 >> 32) + (p2 >> 32) + ps; Result->Value.Qwords[1] = p3 + (p1 >> 32) + (p2 >> 32) + p4;
} }
@ -1473,24 +1467,23 @@ ShemuX86Multiply64Unsigned(
// //
static void static void
ShemuX86Multiply64Signed( ShemuX86Multiply64Signed(
ND_SINT64 Operand1, SHEMU_VALUE *Operand1,
ND_SINT64 Operand2, SHEMU_VALUE *Operand2,
ND_SINT64 *ResHigh, SHEMU_VALUE *Result
ND_SINT64 *ResLow
) )
{ {
ShemuX86Multiply64Unsigned((ND_UINT64)Operand1, (ND_UINT64)Operand2, (ND_UINT64 *)ResHigh, (ND_UINT64 *)ResLow); ShemuX86Multiply64Unsigned(Operand1, Operand2, Result);
// Negate, if needed. // Negate, if needed.
if (Operand1 < 0) if (ND_GET_SIGN(8, Operand1->Value.Qwords[0]))
{ {
*ResHigh -= Operand2; Result->Value.Qwords[1] -= Operand2->Value.Qwords[0];
} }
// Negate, if needed. // Negate, if needed.
if (Operand2 < 0) if (ND_GET_SIGN(8, Operand2->Value.Qwords[0]))
{ {
*ResHigh -= Operand1; Result->Value.Qwords[1] -= Operand1->Value.Qwords[0];
} }
} }
@ -2797,13 +2790,11 @@ check_far_branch:
{ {
if (ND_INS_MUL == Context->Arch.X86.Instruction.Instruction) if (ND_INS_MUL == Context->Arch.X86.Instruction.Instruction)
{ {
ShemuX86Multiply64Unsigned(dst.Value.Qwords[0], src.Value.Qwords[0], ShemuX86Multiply64Unsigned(&dst, &src, &res);
&res.Value.Qwords[1], &res.Value.Qwords[0]);
} }
else else
{ {
ShemuX86Multiply64Signed((ND_SINT64)dst.Value.Qwords[0], (ND_SINT64)src.Value.Qwords[0], ShemuX86Multiply64Signed(&dst, &src, &res);
(ND_SINT64*)&res.Value.Qwords[1], (ND_SINT64*)&res.Value.Qwords[0]);
} }
} }