Subversion Repositories general

Compare Revisions

Ignore whitespace Rev 1076 → Rev 1077

/Delphi/akPi/Source/LongIntegerUnit.pas
0,0 → 1,332
// akPi v2.2
// Copyright (c) 1997-98 Anatoli Klassen
 
unit LongIntegerUnit;
 
interface
 
const
MaxLongDigit = 100040 div 4;
NumDWord : longint = MaxLongDigit div 4;
 
type
PLongInteger = ^LongInteger;
LongInteger = array[1..MaxLongDigit] of Cardinal;
 
procedure MovLong(var A, B : LongInteger); { B := A }
procedure LetLong(var A : LongInteger; B : longint); { A := B }
procedure AddLong(var A, B : LongInteger); { A := A + B }
procedure SubLong(var A, B : LongInteger); { A := A - B }
procedure MulLong(var A : LongInteger; B : longint); { A := A * B }
procedure DivLong(var A : LongInteger; B : longint); { A := A div B }
 
procedure MovLongLim(var A, B : LongInteger; Lim : longint); { B := A }
procedure AddLongLim(var A, B : LongInteger; Lim : longint); { A := A + B }
procedure SubLongLim(var A, B : LongInteger; Lim : longint); { A := A - B }
procedure MulLongLim(var A : LongInteger; B, Lim : longint); { A := A * B }
procedure DivLongLim(var A : LongInteger; B, Lim : longint); { A := A div B }
 
procedure MulLongLenLim(var A : LongInteger; B, Lim : longint); { A := A * B }
 
// (Lim - in bytes)
 
implementation
 
procedure MovLong(var A, B : LongInteger); { B := A }
asm
PUSHAD
PUSHF
 
MOV ESI,A
MOV EDI,B
 
MOV ECX,NumDWord
CLD
REP MOVSD
 
POPF
POPAD
end;
 
procedure LetLong(var A : LongInteger; B : longint); { A := B }
asm
PUSHAD
PUSHF
MOV EDI,A
 
CLD
MOV ECX,NumDWord
DEC ECX
MOV EAX,0
REP STOSD
 
MOV EAX,B
MOV [EDI],EAX
 
POPF
POPAD
end;
 
procedure AddLong(var A, B : LongInteger); { A := A + B }
asm
PUSHAD
PUSHF
MOV ESI,A
MOV EDI,B
 
MOV ECX,NumDWord
MOV EBX,0
CLC
 
@ADDL:
MOV EAX,[EDI+EBX*4]
ADC [ESI+EBX*4],EAX
INC EBX
DEC ECX
JNZ @ADDL
 
POPF
POPAD
end;
 
procedure SubLong(var A, B : LongInteger); { A := A - B }
asm
PUSHAD
PUSHF
MOV ESI,A
MOV EDI,B
 
MOV ECX,NumDWord
MOV EBX,0
CLC
 
@SUBL:
MOV EAX,[EDI+EBX*4]
SBB [ESI+EBX*4],EAX
INC EBX
DEC ECX
JNZ @SUBL
 
POPF
POPAD
end;
 
procedure MulLong(var A : LongInteger; B : longint); { A := A * B }
asm
PUSHAD
PUSHF
MOV EDI,A
 
MOV ECX,NumDWord
MOV EBX,B
MOV EBP,0
CLD
 
@MULL:
MOV EAX,[EDI]
MUL EBX
ADD EAX,EBP
MOV EBP,EDX
STOSD
DEC ECX
JNZ @MULL
 
POPF
POPAD
end;
 
procedure DivLong(var A : LongInteger; B : longint); { A := A div B }
asm
PUSHAD
PUSHF
MOV EDI,A
MOV EBX,B
 
MOV ECX,NumDWord { EDX := A + NumDWord * 4 - 4 }
MOV EDX,ECX
SHL EDX,2
SUB EDX,4
ADD EDI,EDX
 
MOV EDX,0
STD
 
@DIVL:
MOV EAX,[EDI]
DIV EBX
STOSD
DEC ECX
JNZ @DIVL
CLD
 
POPF
POPAD
end;
 
//===========================================================================
 
procedure MovLongLim; { B := A }
asm
PUSHAD
PUSHF
 
MOV ESI,A
MOV EDI,B
MOV EAX,Lim
SHR EAX,2
 
MOV ECX,NumDWord
SUB ECX,EAX
CLD
REP MOVSD
 
POPF
POPAD
end;
 
procedure AddLongLim; { A := A + B }
asm
PUSHAD
PUSHF
MOV ESI,A
MOV EDI,B
MOV EAX,Lim
SHR EAX,2
 
MOV ECX,NumDWord
SUB ECX,EAX
MOV EBX,0
CLC
 
@ADDL:
MOV EAX,[EDI+EBX*4]
ADC [ESI+EBX*4],EAX
INC EBX
DEC ECX
JNZ @ADDL
JC @ADDL
 
POPF
POPAD
end;
 
procedure SubLongLim; { A := A - B }
asm
PUSHAD
PUSHF
MOV ESI,A
MOV EDI,B
MOV EAX,Lim
SHR EAX,2
 
MOV ECX,NumDWord
SUB ECX,EAX
MOV EBX,0
CLC
 
@SUBL:
MOV EAX,[EDI+EBX*4]
SBB [ESI+EBX*4],EAX
INC EBX
DEC ECX
JNZ @SUBL
JC @SUBL
 
POPF
POPAD
end;
 
procedure MulLongLim; { A := A * B }
asm
PUSHAD
PUSHF
MOV EDI,A
MOV EBX,B
MOV EAX,Lim
SHR EAX,2
 
MOV ECX,NumDWord
SUB ECX,EAX
MOV EBP,0
CLD
 
@MULL:
MOV EAX,[EDI]
MUL EBX
ADD EAX,EBP
MOV EBP,EDX
STOSD
DEC ECX
JNZ @MULL
JC @MULL
 
POPF
POPAD
end;
 
procedure DivLongLim; { A := A div B }
asm
PUSHAD
PUSHF
MOV EDI,A
MOV EBX,B
MOV EAX,Lim
SHR EAX,2
 
MOV ECX,NumDWord
SUB ECX,EAX
MOV EDX,ECX { EDI := A + NumDWord * 4 - 4 }
SHL EDX,2
SUB EDX,4
ADD EDI,EDX
 
MOV EDX,0
STD
 
@DIVL:
MOV EAX,[EDI]
DIV EBX
STOSD
DEC ECX
JNZ @DIVL
CLD
 
POPF
POPAD
end;
 
//===========================================================================
 
procedure MulLongLenLim; { A := A * B }
asm
PUSHAD
PUSHF
MOV EDI,A
MOV EBX,B
MOV EAX,Lim
SHR EAX,2
 
MOV ECX,NumDWord
SUB ECX,EAX
SHL EAX,2
ADD EDI,EAX
 
MOV EBP,0
CLD
 
@MULL:
MOV EAX,[EDI]
MUL EBX
ADD EAX,EBP
MOV EBP,EDX
STOSD
DEC ECX
JNZ @MULL
JC @MULL
 
POPF
POPAD
end;
 
end.