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