Blame mpn/power/add_n.asm

Packit 5c3484
dnl  IBM POWER mpn_add_n -- Add two limb vectors of equal, non-zero length.
Packit 5c3484
Packit 5c3484
dnl  Copyright 1992, 1994-1996, 1999-2001, 2005 Free Software Foundation, Inc.
Packit 5c3484
Packit 5c3484
dnl  This file is part of the GNU MP Library.
Packit 5c3484
dnl
Packit 5c3484
dnl  The GNU MP Library is free software; you can redistribute it and/or modify
Packit 5c3484
dnl  it under the terms of either:
Packit 5c3484
dnl
Packit 5c3484
dnl    * the GNU Lesser General Public License as published by the Free
Packit 5c3484
dnl      Software Foundation; either version 3 of the License, or (at your
Packit 5c3484
dnl      option) any later version.
Packit 5c3484
dnl
Packit 5c3484
dnl  or
Packit 5c3484
dnl
Packit 5c3484
dnl    * the GNU General Public License as published by the Free Software
Packit 5c3484
dnl      Foundation; either version 2 of the License, or (at your option) any
Packit 5c3484
dnl      later version.
Packit 5c3484
dnl
Packit 5c3484
dnl  or both in parallel, as here.
Packit 5c3484
dnl
Packit 5c3484
dnl  The GNU MP Library is distributed in the hope that it will be useful, but
Packit 5c3484
dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
Packit 5c3484
dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
Packit 5c3484
dnl  for more details.
Packit 5c3484
dnl
Packit 5c3484
dnl  You should have received copies of the GNU General Public License and the
Packit 5c3484
dnl  GNU Lesser General Public License along with the GNU MP Library.  If not,
Packit 5c3484
dnl  see https://www.gnu.org/licenses/.
Packit 5c3484
Packit 5c3484
Packit 5c3484
dnl  INPUT PARAMETERS
Packit 5c3484
dnl  res_ptr	r3
Packit 5c3484
dnl  s1_ptr	r4
Packit 5c3484
dnl  s2_ptr	r5
Packit 5c3484
dnl  size	r6
Packit 5c3484
Packit 5c3484
include(`../config.m4')
Packit 5c3484
Packit 5c3484
ASM_START()
Packit 5c3484
PROLOGUE(mpn_add_n)
Packit 5c3484
	andil.	10,6,1		C odd or even number of limbs?
Packit 5c3484
	l	8,0(4)		C load least significant s1 limb
Packit 5c3484
	l	0,0(5)		C load least significant s2 limb
Packit 5c3484
	cal	3,-4(3)		C offset res_ptr, it's updated before it's used
Packit 5c3484
	sri	10,6,1		C count for unrolled loop
Packit 5c3484
	a	7,0,8		C add least significant limbs, set cy
Packit 5c3484
	mtctr	10		C copy count into CTR
Packit 5c3484
	beq	0,Leven		C branch if even # of limbs (# of limbs >= 2)
Packit 5c3484
Packit 5c3484
C We have an odd # of limbs.  Add the first limbs separately.
Packit 5c3484
	cmpi	1,10,0		C is count for unrolled loop zero?
Packit 5c3484
	bc	4,6,L1		C bne cr1,L1 (misassembled by gas)
Packit 5c3484
	st	7,4(3)
Packit 5c3484
	aze	3,10		C use the fact that r10 is zero...
Packit 5c3484
	br			C return
Packit 5c3484
Packit 5c3484
C We added least significant limbs.  Now reload the next limbs to enter loop.
Packit 5c3484
L1:	lu	8,4(4)		C load s1 limb and update s1_ptr
Packit 5c3484
	lu	0,4(5)		C load s2 limb and update s2_ptr
Packit 5c3484
	stu	7,4(3)
Packit 5c3484
	ae	7,0,8		C add limbs, set cy
Packit 5c3484
Leven:	lu	9,4(4)		C load s1 limb and update s1_ptr
Packit 5c3484
	lu	10,4(5)		C load s2 limb and update s2_ptr
Packit 5c3484
	bdz	Lend		C If done, skip loop
Packit 5c3484
Packit 5c3484
Loop:	lu	8,4(4)		C load s1 limb and update s1_ptr
Packit 5c3484
	lu	0,4(5)		C load s2 limb and update s2_ptr
Packit 5c3484
	ae	11,10,9		C add previous limbs with cy, set cy
Packit 5c3484
	stu	7,4(3)		C
Packit 5c3484
	lu	9,4(4)		C load s1 limb and update s1_ptr
Packit 5c3484
	lu	10,4(5)		C load s2 limb and update s2_ptr
Packit 5c3484
	ae	7,0,8		C add previous limbs with cy, set cy
Packit 5c3484
	stu	11,4(3)		C
Packit 5c3484
	bdn	Loop		C decrement CTR and loop back
Packit 5c3484
Packit 5c3484
Lend:	ae	11,10,9		C add limbs with cy, set cy
Packit 5c3484
	st	7,4(3)		C
Packit 5c3484
	st	11,8(3)		C
Packit 5c3484
	lil	3,0		C load cy into ...
Packit 5c3484
	aze	3,3		C ... return value register
Packit 5c3484
	br
Packit 5c3484
EPILOGUE(mpn_add_n)