1/* mpn_addmul_1 -- multiply and accumulate bignums. 2 Copyright (C) 2013-2021 Free Software Foundation, Inc. 3 This file is part of the GNU C Library. 4 5 The GNU C Library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 10 The GNU C Library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with the GNU C Library. If not, see 17 <https://www.gnu.org/licenses/>. */ 18 19#include <sysdep.h> 20 21 .syntax unified 22 .text 23 24@ cycles/limb 25@ StrongArm ? 26@ Cortex-A8 ? 27@ Cortex-A9 ? 28@ Cortex-A15 4 29 30/* mp_limb_t mpn_addmul_1(res_ptr, src1_ptr, size, s2_limb) */ 31 32ENTRY (__mpn_addmul_1) 33 push { r4, r5, r6, r7 } 34 cfi_adjust_cfa_offset (16) 35 cfi_rel_offset (r4, 0) 36 cfi_rel_offset (r5, 4) 37 cfi_rel_offset (r6, 8) 38 cfi_rel_offset (r7, 12) 39 40 ldr r6, [r1], #4 41 ldr r5, [r0] 42 mov r4, #0 /* init carry in */ 43 b 1f 440: 45 ldr r6, [r1], #4 /* load next ul */ 46 adds r7, r4, r5 /* (out, c) = cl + lpl */ 47 ldr r5, [r0, #4] /* load next rl */ 48 adc r4, ip, #0 /* cl = hpl + c */ 49 str r7, [r0], #4 501: 51 mov ip, #0 /* zero-extend rl */ 52 umlal r5, ip, r6, r3 /* (hpl, lpl) = ul * vl + rl */ 53 subs r2, r2, #1 54 bne 0b 55 56 adds r4, r4, r5 /* (out, c) = cl + llpl */ 57 str r4, [r0] 58 adc r0, ip, #0 /* return hpl + c */ 59 60 pop { r4, r5, r6, r7 } 61 cfi_adjust_cfa_offset (-16) 62 cfi_restore (r4) 63 cfi_restore (r5) 64 cfi_restore (r6) 65 cfi_restore (r7) 66 DO_RET (lr) 67END (__mpn_addmul_1) 68