]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/powerpc/add_n.S
Update.
[thirdparty/glibc.git] / sysdeps / powerpc / add_n.S
CommitLineData
9a0a462c 1/* Add two limb vectors of equal, non-zero length for PowerPC.
4e141d64 2 Copyright (C) 1997, 1999, 2000 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
6 modify it under the terms of the GNU Library General Public License as
7 published by the Free Software Foundation; either version 2 of the
8 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 Library General Public License for more details.
14
15 You should have received a copy of the GNU Library General Public
16 License along with the GNU C Library; see the file COPYING.LIB. If not,
17 write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. */
19
20#include <sysdep.h>
fa87f403
GM
21#include <bp-sym.h>
22#include <bp-asm.h>
9a0a462c
UD
23
24/* mp_limb_t mpn_add_n (mp_ptr res_ptr, mp_srcptr s1_ptr, mp_srcptr s2_ptr,
25 mp_size_t size)
26 Calculate s1+s2 and put result in res_ptr; return carry, 0 or 1. */
27
28/* Note on optimisation: This code is optimal for the 601. Almost every other
29 possible 2-unrolled inner loop will not be. Also, watch out for the
30 alignment... */
31
fa87f403
GM
32EALIGN (BP_SYM (__mpn_add_n), 3, 0)
33
34#if __BOUNDED_POINTERS__
35 slwi r10,r6,2 /* convert limbs to bytes */
36 CHECK_BOUNDS_BOTH_WIDE (r3, r8, r9, r10)
37 CHECK_BOUNDS_BOTH_WIDE (r4, r8, r9, r10)
38 CHECK_BOUNDS_BOTH_WIDE (r5, r8, r9, r10)
39#endif
9a0a462c 40/* Set up for loop below. */
217eb19b
UD
41 mtcrf 0x01,r6
42 srwi. r7,r6,1
43 li r10,0
44 mtctr r7
4e141d64 45 bt 31,L(2)
9a0a462c
UD
46
47/* Clear the carry. */
217eb19b 48 addic r0,r0,0
9a0a462c 49/* Adjust pointers for loop. */
217eb19b
UD
50 addi r3,r3,-4
51 addi r4,r4,-4
52 addi r5,r5,-4
4e141d64 53 b L(0)
9a0a462c 54
4e141d64 55L(2): lwz r7,0(r5)
217eb19b
UD
56 lwz r6,0(r4)
57 addc r6,r6,r7
58 stw r6,0(r3)
4e141d64 59 beq L(1)
9a0a462c
UD
60
61/* The loop. */
62
63/* Align start of loop to an odd word boundary to guarantee that the
64 last two words can be fetched in one access (for 601). */
4e141d64 65L(0): lwz r9,4(r4)
217eb19b
UD
66 lwz r8,4(r5)
67 lwzu r6,8(r4)
68 lwzu r7,8(r5)
69 adde r8,r9,r8
70 stw r8,4(r3)
71 adde r6,r6,r7
72 stwu r6,8(r3)
4e141d64 73 bdnz L(0)
9a0a462c 74/* Return the carry. */
4e141d64 75L(1): addze r3,r10
9a0a462c 76 blr
fa87f403 77END (BP_SYM (__mpn_add_n))