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);
}

Reply via email to