www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - divmod assembly implementation

reply Sam Ludacis <samludacis mail.com> writes:
G'day

I'm trying to implement the Python divmod function in D w/ 
assembly. Should look something like this...

     '''
     ulong divmod64(ulong a, ulong b, ulong quot, ulong rem)
     {
         asm {
             xor RDX, RDX;
             mov RAX, a;
             div b;
             mov quot, RAX;
             mov rem, RDX;
         }
     }
     '''

Without doubt this routine will fail. But would anyone have a way?
Nov 23
parent reply Nick Treleaven <nick geany.org> writes:
On Saturday, 23 November 2024 at 19:54:36 UTC, Sam Ludacis wrote:
 G'day

 I'm trying to implement the Python divmod function in D w/ 
 assembly. Should look something like this...

     '''
     ulong divmod64(ulong a, ulong b, ulong quot, ulong rem)
     {
         asm {
             xor RDX, RDX;
             mov RAX, a;
             div b;
             mov quot, RAX;
             mov rem, RDX;
         }
     }
     '''

 Without doubt this routine will fail. But would anyone have a 
 way?
Just to mention that if requiring compiler optimization for fast code is acceptable, you can just write it in D e.g.: ```d ulong[2] div(ulong a, ulong b) { return [a / b, a % b]; } ``` ``` $ dmd -c divmod.d -O -vasm _D6divmod3divFmmZG2m: 0000: 48 83 EC 18 sub RSP,018h 0004: 48 8B C6 mov RAX,RSI 0007: 33 D2 xor EDX,EDX 0009: 48 F7 F7 div RDI 000c: 48 89 04 24 mov [RSP],RAX 0010: 48 89 54 24 08 mov 8[RSP],RDX 0015: 48 8B 54 24 08 mov RDX,8[RSP] 001a: 48 8B 04 24 mov RAX,[RSP] 001e: 48 83 C4 18 add RSP,018h 0022: C3 ret ``` Based on an older request: https://forum.dlang.org/post/jd97nf$1jfj$1 digitalmars.com
Nov 23
parent Sam Ludacis <samludacis mail.com> writes:
On Saturday, 23 November 2024 at 21:36:23 UTC, Nick Treleaven 
wrote:
 On Saturday, 23 November 2024 at 19:54:36 UTC, Sam Ludacis 
 wrote:
 G'day

 I'm trying to implement the Python divmod function in D w/ 
 assembly. Should look something like this...

     '''
     ulong divmod64(ulong a, ulong b, ulong quot, ulong rem)
     {
         asm {
             xor RDX, RDX;
             mov RAX, a;
             div b;
             mov quot, RAX;
             mov rem, RDX;
         }
     }
     '''

 Without doubt this routine will fail. But would anyone have a 
 way?
Just to mention that if requiring compiler optimization for fast code is acceptable, you can just write it in D e.g.: ```d ulong[2] div(ulong a, ulong b) { return [a / b, a % b]; } ``` ``` $ dmd -c divmod.d -O -vasm _D6divmod3divFmmZG2m: 0000: 48 83 EC 18 sub RSP,018h 0004: 48 8B C6 mov RAX,RSI 0007: 33 D2 xor EDX,EDX 0009: 48 F7 F7 div RDI 000c: 48 89 04 24 mov [RSP],RAX 0010: 48 89 54 24 08 mov 8[RSP],RDX 0015: 48 8B 54 24 08 mov RDX,8[RSP] 001a: 48 8B 04 24 mov RAX,[RSP] 001e: 48 83 C4 18 add RSP,018h 0022: C3 ret ``` Based on an older request: https://forum.dlang.org/post/jd97nf$1jfj$1 digitalmars.com
Thank you
Nov 23