How to muldiv in D?
rumbu via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Tue Nov 22 02:08:00 PST 2016
On Tuesday, 22 November 2016 at 08:54:36 UTC, Kagamin wrote:
> Yep, I need muldiv for long values on x86-64.
Quick and dirty assembler:
version(D_InlineAsm_X86_64):
long muldiv(long a, long b, long c)
{
//windows RCX, RDX, R8
//linux RDI, RSI, RDX
version(Windows)
{
asm
{
naked;
mov RAX, RCX; //RAX = a
imul RDX; //RDX:RAX = a * b
idiv R8; //RAX = a * b / c
ret;
}
}
else version(linux)
{
asm
{
naked;
mov RAX, RDI; //RAX = a;
mov R8, RDX; //R8 = b
imul RSI; //RDX:RAX = a * b
idiv R8; //RAX = a * b / c
ret;
}
}
else
static assert(0);
}
More information about the Digitalmars-d-learn
mailing list