summaryrefslogtreecommitdiff
path: root/rtl/arm
diff options
context:
space:
mode:
authorflorian <florian@3ad0048d-3df7-0310-abae-a5850022a9f2>2017-02-19 19:15:14 +0000
committerflorian <florian@3ad0048d-3df7-0310-abae-a5850022a9f2>2017-02-19 19:15:14 +0000
commitd19e5ead18c11b76dbb220427b8cec7fe34721e7 (patch)
tree736c65e1d3bb47b4d6664ab81d39e54a29b7f276 /rtl/arm
parenteaa1dbbf4e3d67f13f2fe93ef565ba03bc452840 (diff)
downloadfpc-d19e5ead18c11b76dbb220427b8cec7fe34721e7.tar.gz
* split fpc_mul_<64 bit> into separate procedures with and without overflow checking
git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@35454 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'rtl/arm')
-rw-r--r--rtl/arm/int64p.inc37
1 files changed, 31 insertions, 6 deletions
diff --git a/rtl/arm/int64p.inc b/rtl/arm/int64p.inc
index 0190884b9a..9c3655d27f 100644
--- a/rtl/arm/int64p.inc
+++ b/rtl/arm/int64p.inc
@@ -13,9 +13,38 @@
**********************************************************************}
+{$ifndef VER3_0}
{$if (not defined(CPUTHUMB)) and defined(CPUARM_HAS_UMULL)}
{$define FPC_SYSTEM_HAS_MUL_QWORD}
-function fpc_mul_qword(f1,f2 : qword;checkoverflow : longbool) : qword;assembler;nostackframe;[public,alias: 'FPC_MUL_QWORD']; compilerproc;
+function fpc_mul_qword(f1,f2 : qword) : qword;assembler;nostackframe;[public,alias: 'FPC_MUL_QWORD']; compilerproc;
+asm
+ stmfd sp!,{r4,r5,r6,r14}
+ mov r6,#0
+ // r4 = result lo, r5 = result hi
+{$ifdef ENDIAN_LITTLE}
+ // lo(f1)*lo(f2)
+ umull r4,r5,r0,r2
+ // lo(f1)*hi(f2)
+ umlal r5,r6,r0,r3
+ // hi(f1)*lo(f2)
+ umlal r5,r6,r1,r2
+ mov r0,r4
+ mov r1,r5
+{$else}
+ // lo(f1)*lo(f2)
+ umull r4,r5,r1,r3
+ // lo(f1)*hi(f2)
+ umlal r5,r6,r1,r2
+ // hi(f1)*lo(f2)
+ umlal r5,r6,r0,r3
+ mov r1,r4
+ mov r0,r5
+{$endif}
+ ldmfd sp!,{r4,r5,r6,r15}
+end;
+
+
+function fpc_mul_qword_checkoverflow(f1,f2 : qword) : qword;assembler;nostackframe;[public,alias: 'FPC_MUL_QWORD_CHECKOVERFLOW']; compilerproc;
asm
stmfd sp!,{r4,r5,r6,r14}
mov r6,#0
@@ -51,10 +80,6 @@ asm
{$endif}
// no overflow?
beq .Lexit
- // checkoverflow?
- ldr r2,[sp,#16]
- cmp r2,#0
- beq .Lexit
mov r0,#215
mov r1,fp
@@ -63,4 +88,4 @@ asm
ldmfd sp!,{r4,r5,r6,r15}
end;
{$endif (not defined(CPUTHUMB)) and defined(CPUARM_HAS_UMULL)}
-
+{$endif VER3_0}