Back to home page

DOS ain't dead

Forum index page

Log in | Register

Back to the forum
Board view  Mix view

New version DRDOS 7.01.7 & 7.01.8 (Announce)

posted by CandyMan, 13.12.2023, 16:58

> > I first thought that the xor cx,cx can be eliminated too, by clearing
> the
> > result after the xor dx,dx. But the xor cx,cx leaves the flags in a
> defined
> > state, which the div does not. So I think it is safer to leave this xor
> > cx,cx in.
>
> It probably IS save. Because everytime div32 is used in the source, an
> addition follows that sets the flags anyway. So I will try to further
> optimize this and incorporate your suggestion regarding the two divisions
> on 16-bit divisor.

You can convert the code below for Int64 to Int32 and replace the 32-bit registers with 16-bit registers to skip the 32-time loop.

function ModU(const A,B:Int64):Int64;
assembler;{&FRAME-}{&USES EBX,ESI,EDI}
var
  I:Int64;
  J:Int64;
asm
        MOV     EBX,A
        MOV     EAX,[EBX+0]
        MOV     EDX,[EBX+4]
        MOV     DWORD [I+0],EAX
        MOV     DWORD [I+4],EDX
        MOV     EBX,B
        MOV     ECX,[EBX+4]
        MOV     EBX,[EBX+0]
        MOV     DWORD [J+0],EBX
        MOV     DWORD [J+4],ECX
        MOV     EAX,EBX
        OR      EAX,ECX
        JZ      DivisionByZero
        MOV     EAX,DWORD [I+0]
        TEST    ECX,ECX
        JNZ     @@BigDivisor
        CMP     EDX,EBX
        JAE     @@TwoDivs
        DIV     EBX
        MOV     EAX,EDX
        MOV     EDX,ECX
        JMP     @@Done
@@TwoDivs:
        MOV     ECX,EAX
        MOV     EAX,EDX
        XOR     EDX,EDX
        DIV     EBX
        MOV     EAX,ECX
        DIV     EBX
        MOV     EAX,EDX
        XOR     EDX,EDX
        JMP     @@Done
@@BigDivisor:
        MOV     EDI,ECX
        SHR     EDX,1
        RCR     EAX,1
        ROR     EDI,1
        RCR     EBX,1
        BSR     ECX,ECX
        SHRD    EBX,EDI,CL
        SHRD    EAX,EDX,CL
        SHR     EDX,CL
        ROL     EDI,1
        DIV     EBX
        MOV     EBX,DWORD [I+4]
        MOV     ECX,EAX
        IMUL    EDI,EAX
        MUL     DWORD [J+0]
        ADD     EDX,EDI
        SUB     EBX,EAX
        MOV     ECX,DWORD [I+4]
        MOV     EAX,DWORD [J+0]
        SBB     ECX,EDX
        SBB     EDX,EDX
        AND     EAX,EDX
        AND     EDX,DWORD [J+4]
        ADD     EAX,EBX
        ADC     EDX,ECX
@@Done: MOV     ECX,@Result
        MOV     [ECX+0],EAX
        MOV     [ECX+4],EDX
end;

function DivU(const A,B:Int64):Int64;
assembler;{&FRAME-}{&USES EBX,ESI,EDI}
var
  I:Int64;
  J:Int64;
asm
        MOV     EBX,A
        MOV     EAX,[EBX+0]
        MOV     EDX,[EBX+4]
        MOV     DWORD [I+0],EAX
        MOV     DWORD [I+4],EDX
        MOV     EBX,B
        MOV     ECX,[EBX+4]
        MOV     EBX,[EBX+0]
        MOV     DWORD [J+0],EBX
        MOV     DWORD [J+4],ECX
        MOV     EAX,EBX
        OR      EAX,ECX
        JZ      DivisionByZero
        MOV     EAX,DWORD [I+0]
        TEST    ECX,ECX
        JNZ     @@BigDivisor
        CMP     EDX,EBX
        JAE     @@TwoDivs
        DIV     EBX
        MOV     EDX,ECX
        JMP     @@Done
@@TwoDivs:
        MOV     ECX,EAX
        MOV     EAX,EDX
        XOR     EDX,EDX
        DIV     EBX
        XCHG    EAX,ECX
        DIV     EBX
        MOV     EDX,ECX
        JMP     @@Done
@@BigDivisor:
        MOV     EDI,ECX
        SHR     EDX,1
        RCR     EAX,1
        ROR     EDI,1
        RCR     EBX,1
        BSR     ECX,ECX
        SHRD    EBX,EDI,CL
        SHRD    EAX,EDX,CL
        SHR     EDX,CL
        ROL     EDI,1
        DIV     EBX
        MOV     EBX,DWORD [I+0]
        MOV     ECX,EAX
        IMUL    EDI,EAX
        MUL     DWORD [J+0]
        ADD     EDX,EDI
        SUB     EBX,EAX
        MOV     EAX,ECX
        MOV     ECX,DWORD [I+4]
        SBB     ECX,EDX
        SBB     EAX,0
        XOR     EDX,EDX
@@Done: MOV     ECX,@Result
        MOV     [ECX+0],EAX
        MOV     [ECX+4],EDX
end;

 

Complete thread:

Back to the forum
Board view  Mix view
22049 Postings in 2034 Threads, 396 registered users, 277 users online (0 registered, 277 guests)
DOS ain't dead | Admin contact
RSS Feed
powered by my little forum