diff options
author | florian <florian@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2017-02-19 19:15:14 +0000 |
---|---|---|
committer | florian <florian@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2017-02-19 19:15:14 +0000 |
commit | d19e5ead18c11b76dbb220427b8cec7fe34721e7 (patch) | |
tree | 736c65e1d3bb47b4d6664ab81d39e54a29b7f276 /rtl/arm | |
parent | eaa1dbbf4e3d67f13f2fe93ef565ba03bc452840 (diff) | |
download | fpc-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.inc | 37 |
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} |