]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/powerpc/powerpc32/sub_n.S
Update copyright dates with scripts/update-copyrights.
[thirdparty/glibc.git] / sysdeps / powerpc / powerpc32 / sub_n.S
CommitLineData
9a0a462c 1/* Subtract two limb vectors of equal, non-zero length for PowerPC.
f7a9f785 2 Copyright (C) 1997-2016 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_sub_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 borrow, 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_sub_n, 3, 1)
fa87f403 30
9a0a462c 31/* Set up for loop below. */
217eb19b
UD
32 mtcrf 0x01,r6
33 srwi. r7,r6,1
34 mtctr r7
4e141d64 35 bt 31,L(2)
9a0a462c
UD
36
37/* Set the carry (clear the borrow). */
217eb19b 38 subfc r0,r0,r0
9a0a462c 39/* Adjust pointers for loop. */
217eb19b
UD
40 addi r3,r3,-4
41 addi r4,r4,-4
42 addi r5,r5,-4
4e141d64 43 b L(0)
9a0a462c 44
4e141d64 45L(2): lwz r7,0(r5)
217eb19b
UD
46 lwz r6,0(r4)
47 subfc r6,r7,r6
48 stw r6,0(r3)
4e141d64 49 beq L(1)
9a0a462c
UD
50
51/* Align start of loop to an odd word boundary to guarantee that the
52 last two words can be fetched in one access (for 601). This turns
53 out to be important. */
4e141d64 54L(0):
217eb19b
UD
55 lwz r9,4(r4)
56 lwz r8,4(r5)
57 lwzu r6,8(r4)
58 lwzu r7,8(r5)
59 subfe r8,r8,r9
60 stw r8,4(r3)
61 subfe r6,r7,r6
62 stwu r6,8(r3)
4e141d64 63 bdnz L(0)
9a0a462c 64/* Return the borrow. */
4e141d64 65L(1): subfe r3,r3,r3
217eb19b 66 neg r3,r3
9a0a462c 67 blr
b5510883 68END (__mpn_sub_n)