mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-08 12:19:29 +02:00
+ assembler implementation of fpc_mul_qword
* fpu exceptions are now generated
This commit is contained in:
parent
f5c99d9e2d
commit
ddb6d0d595
@ -20,6 +20,11 @@
|
|||||||
|
|
||||||
procedure fpc_cpuinit;
|
procedure fpc_cpuinit;
|
||||||
begin
|
begin
|
||||||
|
asm
|
||||||
|
rfs r0
|
||||||
|
orr r0,r0,#0x1f0000
|
||||||
|
wfs r0
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{****************************************************************************
|
{****************************************************************************
|
||||||
@ -117,7 +122,11 @@ end;
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.6 2004-03-14 21:45:11 florian
|
Revision 1.7 2004-03-23 21:03:10 florian
|
||||||
|
+ assembler implementation of fpc_mul_qword
|
||||||
|
* fpu exceptions are now generated
|
||||||
|
|
||||||
|
Revision 1.6 2004/03/14 21:45:11 florian
|
||||||
* draft for qword mul
|
* draft for qword mul
|
||||||
|
|
||||||
Revision 1.5 2004/01/21 23:12:07 florian
|
Revision 1.5 2004/01/21 23:12:07 florian
|
||||||
|
@ -14,26 +14,44 @@
|
|||||||
|
|
||||||
**********************************************************************}
|
**********************************************************************}
|
||||||
|
|
||||||
{!!!!
|
{$define FPC_SYSTEM_HAS_MUL_QWORD}
|
||||||
function fpc_mul_qword(f1,f2 : qword;checkoverflow : longbool) : qword;[public,alias: 'FPC_MUL_QWORD']; {$ifdef hascompilerproc} compilerproc; {$endif}
|
function fpc_mul_qword(f1,f2 : qword;checkoverflow : longbool) : qword;assembler;[public,alias: 'FPC_MUL_QWORD']; {$ifdef hascompilerproc} compilerproc; {$endif}
|
||||||
asm
|
asm
|
||||||
mov r6,#0
|
mov r6,#0
|
||||||
|
// lo(f1)*lo(f2)
|
||||||
umull r4,r5,r0,r2
|
umull r4,r5,r0,r2
|
||||||
|
// lo(f1)*hi(f2)
|
||||||
umlal r5,r6,r0,r3
|
umlal r5,r6,r0,r3
|
||||||
{ overflow? }
|
// overflow?
|
||||||
or r0,r1,r3
|
// hi(f1)*hi(f2)
|
||||||
|
mul r0,r1,r3
|
||||||
|
// hi(f1)*lo(f2)
|
||||||
umlal r5,r6,r1,r2
|
umlal r5,r6,r1,r2
|
||||||
{ check for overflow }
|
// check for overflow
|
||||||
ors r6,r6,r0
|
orrs r6,r6,r0
|
||||||
mov r0,r4
|
mov r0,r4
|
||||||
mov r1,r5
|
mov r1,r5
|
||||||
end;
|
// no overflow?
|
||||||
}
|
beq .Lexit
|
||||||
|
|
||||||
|
ldr r2,checkoverflow
|
||||||
|
cmp r2,r2
|
||||||
|
beq .Lexit
|
||||||
|
|
||||||
|
mov r0,#215
|
||||||
|
mov r1,fp
|
||||||
|
bl HandleErrorFrame
|
||||||
|
.Lexit:
|
||||||
|
end ['r4','r5','r6'];
|
||||||
|
|
||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.2 2004-03-14 21:45:11 florian
|
Revision 1.3 2004-03-23 21:03:11 florian
|
||||||
|
+ assembler implementation of fpc_mul_qword
|
||||||
|
* fpu exceptions are now generated
|
||||||
|
|
||||||
|
Revision 1.2 2004/03/14 21:45:11 florian
|
||||||
* draft for qword mul
|
* draft for qword mul
|
||||||
|
|
||||||
Revision 1.1 2003/11/03 17:28:21 florian
|
Revision 1.1 2003/11/03 17:28:21 florian
|
||||||
|
Loading…
Reference in New Issue
Block a user