|
@@ -174,82 +174,6 @@ TYPE
|
|
|
STR R0, [R3,#0] ; remainder := R0
|
|
|
END DivModU32;
|
|
|
|
|
|
- (**
|
|
|
- Signed 64-bit multiplication. Adapted version based on the original code
|
|
|
- from "Runtime ABI for the ARM Cortex-M0" (https://github.com/bobbl/libaeabi-cortexm0/blob/master/lmul.S)
|
|
|
-
|
|
|
- /* Runtime ABI for the ARM Cortex-M0
|
|
|
- * lmul.S: 64 bit multiplication
|
|
|
- *
|
|
|
- * Copyright (c) 2013 Jörg Mische <bobbl@gmx.de>
|
|
|
- *
|
|
|
- * Permission to use, copy, modify, and/or distribute this software for any
|
|
|
- * purpose with or without fee is hereby granted, provided that the above
|
|
|
- * copyright notice and this permission notice appear in all copies.
|
|
|
- *
|
|
|
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
|
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
|
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
|
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
|
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
|
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
|
|
- * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
|
- */
|
|
|
-
|
|
|
- Multiply r1:r0 and r3:r2 and return the product in r1:r0
|
|
|
- Can also be used for unsigned long product
|
|
|
- *)
|
|
|
- PROCEDURE MulS64*(x, y: HUGEINT): HUGEINT;
|
|
|
- CODE
|
|
|
- ldr r0, [FP,#x]
|
|
|
- ldr r1, [FP,#x+4]
|
|
|
-
|
|
|
- ldr r2, [FP,#y]
|
|
|
- ldr r3, [FP,#y+4]
|
|
|
-
|
|
|
- muls r1, r1, r2
|
|
|
- muls r3, r3, r0
|
|
|
- adds r1, r1, r3
|
|
|
-
|
|
|
- lsrs r3, r0, #16
|
|
|
- lsrs r4, r2, #16
|
|
|
- muls r3, r3, r4
|
|
|
- adds r1, r1, r3
|
|
|
-
|
|
|
- lsrs r3, r0, #16
|
|
|
- uxth r0, r0
|
|
|
- uxth r2, r2
|
|
|
- muls r3, r3, r2
|
|
|
- muls r4, r4, r0
|
|
|
- muls r0, r0, r2
|
|
|
-
|
|
|
- movs r2, #0
|
|
|
- adds r3, r3, r4
|
|
|
- adcs r2, r2, r2
|
|
|
- lsls r2, r2, #16
|
|
|
- adds r1, r1, r2
|
|
|
-
|
|
|
- lsls r2, r3, #16
|
|
|
- lsrs r3, r3, #16
|
|
|
- adds r0, r0, r2
|
|
|
- adcs r1, r1, r3
|
|
|
-
|
|
|
- END MulS64;
|
|
|
-
|
|
|
- PROCEDURE MulU64*(x, y: UHUGEINT): UHUGEINT;
|
|
|
- CODE
|
|
|
- ldr r0, [FP,#x]
|
|
|
- ldr r1, [FP,#x+4]
|
|
|
-
|
|
|
- ldr r2, [FP,#y]
|
|
|
- ldr r3, [FP,#y+4]
|
|
|
-
|
|
|
- mul r3, r0, r3 ; r3 := xlo * yhi
|
|
|
- mla r3, r1, r2, r3 ; r3 := r3 + xhi * ylo
|
|
|
- umull r0, r1, r0, r2 ; r0 := lo(xlo * ylo); r1 := hi(xlo * ylo)
|
|
|
- add r1, r1, r3 ; r1 := r1 + r3
|
|
|
- END MulU64;
|
|
|
-
|
|
|
(* signed division and modulus
|
|
|
- note: this implements the mathematical definition of DIV and MOD in contrast to the symmetric one
|
|
|
*)
|