]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/powerpc/powerpc32/add_n.S
Update copyright dates with scripts/update-copyrights.
[thirdparty/glibc.git] / sysdeps / powerpc / powerpc32 / add_n.S
CommitLineData
9a0a462c 1/* Add two limb vectors of equal, non-zero length for PowerPC.
b168057a 2 Copyright (C) 1997-2015 Free Software Foundation, Inc.
9a0a462c
UD
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
41bdb6e2
AJ
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.
9a0a462c
UD
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
41bdb6e2 13 Lesser General Public License for more details.
9a0a462c 14
41bdb6e2 15 You should have received a copy of the GNU Lesser General Public
59ba27a6
PE
16 License along with the GNU C Library; if not, see
17 <http://www.gnu.org/licenses/>. */
9a0a462c
UD
18
19#include <sysdep.h>
20
21/* mp_limb_t mpn_add_n (mp_ptr res_ptr, mp_srcptr s1_ptr, mp_srcptr s2_ptr,
22 mp_size_t size)
23 Calculate s1+s2 and put result in res_ptr; return carry, 0 or 1. */
24
25/* Note on optimisation: This code is optimal for the 601. Almost every other
26 possible 2-unrolled inner loop will not be. Also, watch out for the
27 alignment... */
28
b5510883 29EALIGN (__mpn_add_n, 3, 0)
fa87f403 30
9a0a462c 31/* Set up for loop below. */
217eb19b
UD
32 mtcrf 0x01,r6
33 srwi. r7,r6,1
34 li r10,0
35 mtctr r7
4e141d64 36 bt 31,L(2)
9a0a462c
UD
37
38/* Clear the carry. */
217eb19b 39 addic r0,r0,0
9a0a462c 40/* Adjust pointers for loop. */
217eb19b
UD
41 addi r3,r3,-4
42 addi r4,r4,-4
43 addi r5,r5,-4
4e141d64 44 b L(0)
9a0a462c 45
4e141d64 46L(2): lwz r7,0(r5)
217eb19b
UD
47 lwz r6,0(r4)
48 addc r6,r6,r7
49 stw r6,0(r3)
4e141d64 50 beq L(1)
9a0a462c
UD
51
52/* The loop. */
53
54/* Align start of loop to an odd word boundary to guarantee that the
55 last two words can be fetched in one access (for 601). */
4e141d64 56L(0): lwz r9,4(r4)
217eb19b
UD
57 lwz r8,4(r5)
58 lwzu r6,8(r4)
59 lwzu r7,8(r5)
60 adde r8,r9,r8
61 stw r8,4(r3)
62 adde r6,r6,r7
63 stwu r6,8(r3)
4e141d64 64 bdnz L(0)
9a0a462c 65/* Return the carry. */
4e141d64 66L(1): addze r3,r10
9a0a462c 67 blr
b5510883 68END (__mpn_add_n)