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