Blame sysdeps/powerpc/powerpc32/add_n.S

Packit Service 82fcde
/* Add two limb vectors of equal, non-zero length for PowerPC.
Packit Service 82fcde
   Copyright (C) 1997-2018 Free Software Foundation, Inc.
Packit Service 82fcde
   This file is part of the GNU C Library.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is free software; you can redistribute it and/or
Packit Service 82fcde
   modify it under the terms of the GNU Lesser General Public
Packit Service 82fcde
   License as published by the Free Software Foundation; either
Packit Service 82fcde
   version 2.1 of the License, or (at your option) any later version.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service 82fcde
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 82fcde
   Lesser General Public License for more details.
Packit Service 82fcde
Packit Service 82fcde
   You should have received a copy of the GNU Lesser General Public
Packit Service 82fcde
   License along with the GNU C Library; if not, see
Packit Service 82fcde
   <http://www.gnu.org/licenses/>.  */
Packit Service 82fcde
Packit Service 82fcde
#include <sysdep.h>
Packit Service 82fcde
Packit Service 82fcde
/* mp_limb_t mpn_add_n (mp_ptr res_ptr, mp_srcptr s1_ptr, mp_srcptr s2_ptr,
Packit Service 82fcde
                        mp_size_t size)
Packit Service 82fcde
   Calculate s1+s2 and put result in res_ptr; return carry, 0 or 1.  */
Packit Service 82fcde
Packit Service 82fcde
/* Note on optimisation: This code is optimal for the 601.  Almost every other
Packit Service 82fcde
   possible 2-unrolled inner loop will not be.  Also, watch out for the
Packit Service 82fcde
   alignment...  */
Packit Service 82fcde
Packit Service 82fcde
EALIGN (__mpn_add_n, 3, 0)
Packit Service 82fcde
Packit Service 82fcde
/* Set up for loop below.  */
Packit Service 82fcde
	mtcrf 0x01,r6
Packit Service 82fcde
	srwi. r7,r6,1
Packit Service 82fcde
	li    r10,0
Packit Service 82fcde
	mtctr r7
Packit Service 82fcde
	bt    31,L(2)
Packit Service 82fcde
Packit Service 82fcde
/* Clear the carry.  */
Packit Service 82fcde
	addic r0,r0,0
Packit Service 82fcde
/* Adjust pointers for loop.  */
Packit Service 82fcde
	addi  r3,r3,-4
Packit Service 82fcde
	addi  r4,r4,-4
Packit Service 82fcde
	addi  r5,r5,-4
Packit Service 82fcde
	b     L(0)
Packit Service 82fcde
Packit Service 82fcde
L(2):	lwz  r7,0(r5)
Packit Service 82fcde
	lwz  r6,0(r4)
Packit Service 82fcde
	addc r6,r6,r7
Packit Service 82fcde
	stw  r6,0(r3)
Packit Service 82fcde
        beq  L(1)
Packit Service 82fcde
Packit Service 82fcde
/* The loop.  */
Packit Service 82fcde
Packit Service 82fcde
/* Align start of loop to an odd word boundary to guarantee that the
Packit Service 82fcde
   last two words can be fetched in one access (for 601).  */
Packit Service 82fcde
L(0):	lwz  r9,4(r4)
Packit Service 82fcde
	lwz  r8,4(r5)
Packit Service 82fcde
	lwzu r6,8(r4)
Packit Service 82fcde
	lwzu r7,8(r5)
Packit Service 82fcde
	adde r8,r9,r8
Packit Service 82fcde
	stw  r8,4(r3)
Packit Service 82fcde
	adde r6,r6,r7
Packit Service 82fcde
	stwu r6,8(r3)
Packit Service 82fcde
	bdnz L(0)
Packit Service 82fcde
/* Return the carry.  */
Packit Service 82fcde
L(1):	addze r3,r10
Packit Service 82fcde
	blr
Packit Service 82fcde
END (__mpn_add_n)