Thread overview
divmod assembly implementation
Nov 23, 2024
Sam Ludacis
Nov 23, 2024
Nick Treleaven
Nov 23, 2024
Sam Ludacis
November 23, 2024

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?

November 23, 2024

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.:

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

November 23, 2024

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.:

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