mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-12 20:49:26 +02:00
* improved qword*qword code, if no overflow checking is done
This commit is contained in:
parent
d680066e7c
commit
042cb265c0
@ -123,7 +123,8 @@
|
||||
{ can the fpu do the work? }
|
||||
if fpuint64 then
|
||||
begin
|
||||
c:=comp(z)/comp(n);
|
||||
// the c:=comp(...) is necessary to shut up the compiler
|
||||
c:=comp(comp(z)/comp(n));
|
||||
divint64:=qword(c);
|
||||
end
|
||||
else
|
||||
@ -161,27 +162,58 @@
|
||||
_f1,bitpos : qword;
|
||||
l : longint;
|
||||
|
||||
{$ifdef i386}
|
||||
r : qword;
|
||||
{$endif i386}
|
||||
|
||||
begin
|
||||
mulqword:=0;
|
||||
bitpos:=1;
|
||||
|
||||
// store f1 for overflow checking
|
||||
_f1:=f1;
|
||||
|
||||
for l:=0 to 63 do
|
||||
{$ifdef i386}
|
||||
if not(checkoverflow) then
|
||||
begin
|
||||
if (f2 and bitpos)<>0 then
|
||||
mulqword:=mulqword+f1;
|
||||
asm
|
||||
movl f1+4,%edx
|
||||
movl f2+4,%ecx
|
||||
orl %ecx,%edx
|
||||
movl f2,%edx
|
||||
movl f1,%eax
|
||||
jnz .Lqwordmultwomul
|
||||
mull %edx
|
||||
jmp .Lqwordmulready
|
||||
.Lqwordmultwomul:
|
||||
imul f1+4,%edx
|
||||
imul %eax,%ecx
|
||||
addl %edx,%ecx
|
||||
mull f2
|
||||
add %ecx,%edx
|
||||
.Lqwordmulready:
|
||||
movl %eax,r
|
||||
movl %edx,r+4
|
||||
end;
|
||||
mulqword:=r;
|
||||
end
|
||||
else
|
||||
{$endif i386}
|
||||
begin
|
||||
mulqword:=0;
|
||||
bitpos:=1;
|
||||
|
||||
f1:=f1 shl 1;
|
||||
bitpos:=bitpos shl 1;
|
||||
// store f1 for overflow checking
|
||||
_f1:=f1;
|
||||
|
||||
for l:=0 to 63 do
|
||||
begin
|
||||
if (f2 and bitpos)<>0 then
|
||||
mulqword:=mulqword+f1;
|
||||
|
||||
f1:=f1 shl 1;
|
||||
bitpos:=bitpos shl 1;
|
||||
end;
|
||||
|
||||
{ if one of the operands is greater than the result an }
|
||||
{ overflow occurs }
|
||||
if checkoverflow and ((_f1>mulqword) or (f2>mulqword)) then
|
||||
HandleErrorFrame(215,get_frame);
|
||||
end;
|
||||
|
||||
{ if one of the operands is greater than the result an }
|
||||
{ overflow occurs }
|
||||
if checkoverflow and ((_f1>mulqword) or (f2>mulqword)) then
|
||||
HandleErrorFrame(215,get_frame);
|
||||
end;
|
||||
|
||||
{ multiplies two int64 ....
|
||||
@ -202,7 +234,8 @@
|
||||
{ can the fpu do the work ? }
|
||||
if fpuint64 and not(checkoverflow) then
|
||||
begin
|
||||
c:=comp(f1)*comp(f2);
|
||||
// the c:=comp(...) is necessary to shut up the compiler
|
||||
c:=comp(comp(f1)*comp(f2));
|
||||
mulint64:=int64(c);
|
||||
end
|
||||
else
|
||||
@ -400,7 +433,10 @@
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.16 2000-01-23 12:27:39 florian
|
||||
Revision 1.17 2000-01-27 15:43:02 florian
|
||||
* improved qword*qword code, if no overflow checking is done
|
||||
|
||||
Revision 1.16 2000/01/23 12:27:39 florian
|
||||
* int64/int64 and int64*int64 is now done by the fpu if possible
|
||||
|
||||
Revision 1.15 2000/01/23 12:22:37 florian
|
||||
@ -451,4 +487,4 @@
|
||||
|
||||
Revision 1.1 1998/12/12 12:15:41 florian
|
||||
+ first implementation
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user