glibcextract.py: Add compile_c_snippet
[glibc.git] / sysdeps / arm / submul_1.S
blob02ebd7df4da45084c840ffdabb53c9dfbca05ac4
1 /* mpn_submul_1 -- multiply and subtract bignums.
2    Copyright (C) 2013-2022 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
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.
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.
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/>.  */
19 #include <sysdep.h>
21         .syntax unified
22         .text
24 @               cycles/limb
25 @ StrongArm        ?
26 @ Cortex-A8        ?
27 @ Cortex-A9        ?
28 @ Cortex-A15       4
30 /* mp_limb_t mpn_submul_1(res_ptr, src1_ptr, size, s2_limb) */
32 ENTRY (__mpn_submul_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)
40         ldr     r6, [r1], #4
41         ldr     r7, [r0]
42         mov     r4, #0                  /* init carry in */
43         b       1f
45         ldr     r6, [r1], #4            /* load next ul */
46         adds    r5, r5, r4              /* (lpl, c) = lpl + cl */
47         adc     r4, ip, #0              /* cl = hpl + c */
48         subs    r5, r7, r5              /* (lpl, !c) = rl - lpl */
49         ldr     r7, [r0, #4]            /* load next rl */
50         it      cc
51         addcc   r4, r4, #1              /* cl += !c */
52         str     r5, [r0], #4
54         umull   r5, ip, r6, r3          /* (hpl, lpl) = ul * vl */
55         subs    r2, r2, #1
56         bne     0b
58         adds    r5, r5, r4              /* (lpl, c) = lpl + cl */
59         adc     r4, ip, #0              /* cl = hpl + c */
60         subs    r5, r7, r5              /* (lpl, !c) = rl - lpl */
61         str     r5, [r0], #4
62         it      cc
63         addcc   r4, r4, #1              /* cl += !c */
64         mov     r0, r4                  /* return carry */
66         pop     { r4, r5, r6, r7 }
67         DO_RET  (lr)
68 END (__mpn_submul_1)