mod_34lsub1.asm revision 1.1.1.1
1dnl ARM mpn_mod_34lsub1 -- remainder modulo 2^24-1. 2 3dnl Copyright 2012, 2013, 2018 Free Software Foundation, Inc. 4 5dnl This file is part of the GNU MP Library. 6dnl 7dnl The GNU MP Library is free software; you can redistribute it and/or modify 8dnl it under the terms of either: 9dnl 10dnl * the GNU Lesser General Public License as published by the Free 11dnl Software Foundation; either version 3 of the License, or (at your 12dnl option) any later version. 13dnl 14dnl or 15dnl 16dnl * the GNU General Public License as published by the Free Software 17dnl Foundation; either version 2 of the License, or (at your option) any 18dnl later version. 19dnl 20dnl or both in parallel, as here. 21dnl 22dnl The GNU MP Library is distributed in the hope that it will be useful, but 23dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 24dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 25dnl for more details. 26dnl 27dnl You should have received copies of the GNU General Public License and the 28dnl GNU Lesser General Public License along with the GNU MP Library. If not, 29dnl see https://www.gnu.org/licenses/. 30 31include(`../config.m4') 32 33C cycles/limb 34C StrongARM ? 35C XScale ? 36C Cortex-A5 2.67 37C Cortex-A7 2.37 38C Cortex-A8 2.34 39C Cortex-A9 ? 40C Cortex-A15 1.39 41C Cortex-A17 1.60 42C Cortex-A53 2.51 43 44define(`ap', r0) 45define(`n', r1) 46 47C mp_limb_t mpn_mod_34lsub1 (mp_srcptr up, mp_size_t n) 48 49C TODO 50C * Write cleverer summation code. 51C * Consider loading 6 64-bit aligned registers at a time, to approach 1 c/l. 52 53ASM_START() 54 TEXT 55 ALIGN(32) 56PROLOGUE(mpn_mod_34lsub1) 57 push { r4, r5, r6, r7 } 58 59 subs n, n, #3 60 mov r7, #0 61 blt L(le2) C n <= 2 62 63 ldmia ap!, { r2, r3, r12 } 64 subs n, n, #3 65 blt L(sum) C n <= 5 66 mov r7, #0 67 b L(mid) 68 69L(top): adds r2, r2, r4 70 adcs r3, r3, r5 71 adcs r12, r12, r6 72 adc r7, r7, #0 73L(mid): ldmia ap!, { r4, r5, r6 } 74 subs n, n, #3 75 bpl L(top) 76 77 adds r2, r2, r4 78 adcs r3, r3, r5 79 adcs r12, r12, r6 80 adc r7, r7, #0 C r7 <= 1 81 82L(sum): cmn n, #2 83 movlo r4, #0 84 ldrhs r4, [ap], #4 85 movls r5, #0 86 ldrhi r5, [ap], #4 87 88 adds r2, r2, r4 89 adcs r3, r3, r5 90 adcs r12, r12, #0 91 adc r7, r7, #0 C r7 <= 2 92 93L(sum2): 94 bic r0, r2, #0xff000000 95 add r0, r0, r2, lsr #24 96 add r0, r0, r7 97 98 mov r7, r3, lsl #8 99 bic r2, r7, #0xff000000 100 add r0, r0, r2 101 add r0, r0, r3, lsr #16 102 103 mov r2, r12, lsl #16 104 bic r1, r2, #0xff000000 105 add r0, r0, r1 106 add r0, r0, r12, lsr #8 107 108 pop { r4, r5, r6, r7 } 109 return lr 110 111L(le2): cmn n, #1 112 bne L(1) 113 ldmia ap!, { r2, r3 } 114 mov r12, #0 115 b L(sum2) 116L(1): ldr r2, [ap] 117 bic r0, r2, #0xff000000 118 add r0, r0, r2, lsr #24 119 pop { r4, r5, r6, r7 } 120 return lr 121EPILOGUE() 122