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
22825 Postings in 2129 Threads, 402 registered users (1 online)
DOS ain't dead | Admin contact
RSS Feed
powered by my little forum