mirror of
https://github.com/bitdefender/bddisasm.git
synced 2024-11-21 23:18:09 +00:00
Added 64-bit mul test case + made the code more readable.
This commit is contained in:
parent
270587903e
commit
54a2027333
@ -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]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Binary file not shown.
Loading…
Reference in New Issue
Block a user