2.9
[glibc/nacl-glibc.git] / sysdeps / s390 / s390-64 / sub_n.S
blob65d1c9f79f671eedd3a940a2aa8049400865f170
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 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    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20    Boston, MA 02111-1307, USA.  */
22 /* INPUT PARAMETERS
23      %r2 = res_ptr
24      %r3 = s1_ptr
25      %r4 = s2_ptr
26      %r5 = size.  */
27         
28 #include "sysdep.h"
29 #include "asm-syntax.h"
31 ENTRY(__mpn_sub_n)
32         stg    %r6,48(%r15)   # save register 6
33         cfi_offset (%r6,-112)
34         sgr    %r1,%r1
35         lghi   %r0,1          # cannot use ahi to add carry, use slr
36 .L0:    lg     %r6,0(%r1,%r3) # .L0 -> no carry from last sub
37         slg    %r6,0(%r1,%r4)
38         stg    %r6,0(%r1,%r2)
39         la     %r1,8(%r1)
40         brc    4,.L3
41 .L1:    brct   %r5,.L0
42         slgr   %r2,%r2        # no last carry to return
43         j      .Lexit
44 .L2:    lg     %r6,0(%r1,%r3) # .L2 -> carry from last sub
45         slg    %r6,0(%r1,%r4)
46         brc    4,.L4
47         slgr   %r6,%r0        # no carry yet, add carry from last sub
48         stg    %r6,0(%r1,%r2)
49         la     %r1,8(%r1)
50         brc    11,.L1         # new carry ?
51 .L3:    brct   %r5,.L2
52         lgr    %r2,%r0        # return last carry
53         j      .Lexit
54 .L4:    slgr   %r6,%r0        # already a carry, add carry from last sub
55         stg    %r6,0(%r1,%r2)
56         la     %r1,8(%r1)
57         brct   %r5,.L2
58         lgr    %r2,%r0        # return last carry
59 .Lexit: lg     %r6,48(%r15)   # restore register 6
60         br     %r14
61 END(__mpn_sub_n)