[Gmp-commit] /var/hg/gmp: Provide addaddmul_1msb0 for Apple M1.
mercurial at gmplib.org
mercurial at gmplib.org
Sat Oct 16 16:03:30 UTC 2021
details: /var/hg/gmp/rev/6bcc8412027f
changeset: 18261:6bcc8412027f
user: Torbjorn Granlund <tg at gmplib.org>
date: Sat Oct 16 18:03:13 2021 +0200
description:
Provide addaddmul_1msb0 for Apple M1.
diffstat:
mpn/arm64/applem1/addaddmul_1msb0.asm | 92 +++++++++++++++++++++++++++++++++++
1 files changed, 92 insertions(+), 0 deletions(-)
diffs (96 lines):
diff -r dda3b1c12cd4 -r 6bcc8412027f mpn/arm64/applem1/addaddmul_1msb0.asm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mpn/arm64/applem1/addaddmul_1msb0.asm Sat Oct 16 18:03:13 2021 +0200
@@ -0,0 +1,92 @@
+dnl ARM64 mpn_addaddmul_1msb0, R = Au + Bv, u,v < 2^63.
+
+dnl Copyright 2021 Free Software Foundation, Inc.
+
+dnl This file is part of the GNU MP Library.
+dnl
+dnl The GNU MP Library is free software; you can redistribute it and/or modify
+dnl it under the terms of either:
+dnl
+dnl * the GNU Lesser General Public License as published by the Free
+dnl Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl or
+dnl
+dnl * the GNU General Public License as published by the Free Software
+dnl Foundation; either version 2 of the License, or (at your option) any
+dnl later version.
+dnl
+dnl or both in parallel, as here.
+dnl
+dnl The GNU MP Library is distributed in the hope that it will be useful, but
+dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received copies of the GNU General Public License and the
+dnl GNU Lesser General Public License along with the GNU MP Library. If not,
+dnl see https://www.gnu.org/licenses/.
+
+include(`../config.m4')
+
+C cycles/limb
+C Cortex-A53
+C Cortex-A55
+C Cortex-A57
+C Cortex-A72
+C Cortex-A73
+C X-Gene
+C Apple M1 2.0
+
+changecom(blah)
+
+define(`rp', x0)
+define(`ap', x1)
+define(`bp', x2)
+define(`n', x3)
+define(`u0', x4)
+define(`v0', x5)
+
+C TODO
+C * Use fewer distinct registers, should be trivial.
+
+PROLOGUE(mpn_addaddmul_1msb0)
+ lsr x7, n, #1
+ adds x6, xzr, xzr
+ tbz n, #0, L(top)
+
+ ldr x11, [ap], #8 C 0
+ ldr x15, [bp], #8 C 0
+ mul x10, x11, u0 C 0
+ umulh x11, x11, u0 C 1
+ mul x14, x15, v0 C 0
+ umulh x15, x15, v0 C 1
+ adds x10, x10, x14 C 0
+ adcs x6, x11, x15 C 1
+ str x10, [rp], #8 C 0
+ cbz x7, L(end)
+
+L(top): ldp x11, x13, [ap], #16 C 0 1
+ ldp x15, x17, [bp], #16 C 0 1
+ mul x10, x11, u0 C 0
+ umulh x11, x11, u0 C 1
+ mul x14, x15, v0 C 0
+ umulh x15, x15, v0 C 1
+ adcs x10, x10, x14 C 0
+ adc x11, x11, x15 C 1
+ adds x10, x10, x6 C 0
+ mul x12, x13, u0 C 1
+ umulh x13, x13, u0 C 2
+ mul x14, x17, v0 C 1
+ umulh x17, x17, v0 C 2
+ adcs x12, x12, x14 C 1
+ adc x6, x13, x17 C 2
+ adds x11, x12, x11 C 1
+ stp x10, x11, [rp], #16 C 0 1
+ sub x7, x7, #1
+ cbnz x7, L(top)
+
+L(end): adc x0, x6, xzr
+ ret
+EPILOGUE()
More information about the gmp-commit
mailing list