Thread overview
divmod assembly implementation
November 23

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

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

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