Update copyright notices with scripts/update-copyrights
[glibc.git] / sysdeps / s390 / s390-64 / sub_n.S
blob65223d00501ce75d2135a1fefdbadac89333cd76
1 /* __mpn_sub_n -- Add two limb vectors of the same length > 0 and store
2    sum in a third limb vector.  64 bit S/390 version.
3    Copyright (C) 2001-2014 Free Software Foundation, Inc.
4    Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
5    This file is part of the GNU MP Library.
7    The GNU C Library is free software; you can redistribute it and/or
8    modify it under the terms of the GNU Lesser General Public License as
9    published by the Free Software Foundation; either version 2.1 of the
10    License, or (at your option) any later version.
12    The GNU C Library is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15    Lesser General Public License for more details.
17    You should have received a copy of the GNU Lesser General Public
18    License along with the GNU C Library; see the file COPYING.LIB.  If not,
19    see <http://www.gnu.org/licenses/>.  */
21 /* INPUT PARAMETERS
22      %r2 = res_ptr
23      %r3 = s1_ptr
24      %r4 = s2_ptr
25      %r5 = size.  */
27 #include "sysdep.h"
28 #include "asm-syntax.h"
30 ENTRY(__mpn_sub_n)
31         stg    %r6,48(%r15)   # save register 6
32         cfi_offset (%r6,-112)
33         sgr    %r1,%r1
34         lghi   %r0,1          # cannot use ahi to add carry, use slr
35 .L0:    lg     %r6,0(%r1,%r3) # .L0 -> no carry from last sub
36         slg    %r6,0(%r1,%r4)
37         stg    %r6,0(%r1,%r2)
38         la     %r1,8(%r1)
39         brc    4,.L3
40 .L1:    brct   %r5,.L0
41         slgr   %r2,%r2        # no last carry to return
42         j      .Lexit
43 .L2:    lg     %r6,0(%r1,%r3) # .L2 -> carry from last sub
44         slg    %r6,0(%r1,%r4)
45         brc    4,.L4
46         slgr   %r6,%r0        # no carry yet, add carry from last sub
47         stg    %r6,0(%r1,%r2)
48         la     %r1,8(%r1)
49         brc    11,.L1         # new carry ?
50 .L3:    brct   %r5,.L2
51         lgr    %r2,%r0        # return last carry
52         j      .Lexit
53 .L4:    slgr   %r6,%r0        # already a carry, add carry from last sub
54         stg    %r6,0(%r1,%r2)
55         la     %r1,8(%r1)
56         brct   %r5,.L2
57         lgr    %r2,%r0        # return last carry
58 .Lexit: lg     %r6,48(%r15)   # restore register 6
59         br     %r14
60 END(__mpn_sub_n)