Blame sysdeps/arm/add_n.S

Packit Service 82fcde
/* mpn_add_n -- add (or subtract) bignums.
Packit Service 82fcde
   Copyright (C) 2013-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
#include <arm-features.h>
Packit Service 82fcde
Packit Service 82fcde
	.syntax unified
Packit Service 82fcde
	.text
Packit Service 82fcde
Packit Service 82fcde
#ifdef USE_AS_SUB_N
Packit Service 82fcde
# define INITC	cmp r0, r0
Packit Service 82fcde
# define OPC	sbcs
Packit Service 82fcde
# define RETC	sbc r0, r0, r0; neg r0, r0
Packit Service 82fcde
# define FUNC	__mpn_sub_n
Packit Service 82fcde
#else
Packit Service 82fcde
# define INITC	cmn r0, #0
Packit Service 82fcde
# define OPC	adcs
Packit Service 82fcde
# define RETC	mov r0, #0; adc r0, r0, r0
Packit Service 82fcde
# define FUNC	__mpn_add_n
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
/* mp_limb_t mpn_add_n(res_ptr, src1_ptr, src2_ptr, size) */
Packit Service 82fcde
Packit Service 82fcde
ENTRY (FUNC)
Packit Service 82fcde
	push	{ r4, r5, r6, r7, r8, r10, lr }
Packit Service 82fcde
	cfi_adjust_cfa_offset (28)
Packit Service 82fcde
	cfi_rel_offset (r4, 0)
Packit Service 82fcde
	cfi_rel_offset (r5, 4)
Packit Service 82fcde
	cfi_rel_offset (r6, 8)
Packit Service 82fcde
	cfi_rel_offset (r7, 12)
Packit Service 82fcde
	cfi_rel_offset (r8, 16)
Packit Service 82fcde
	cfi_rel_offset (r10, 20)
Packit Service 82fcde
	cfi_rel_offset (lr, 24)
Packit Service 82fcde
Packit Service 82fcde
	INITC				/* initialize carry flag */
Packit Service 82fcde
	tst	r3, #1			/* count & 1 == 1? */
Packit Service 82fcde
	add	lr, r1, r3, lsl #2	/* compute end src1 */
Packit Service 82fcde
	beq	1f
Packit Service 82fcde
Packit Service 82fcde
	ldr	r4, [r1], #4		/* do one to make count even */
Packit Service 82fcde
	ldr	r5, [r2], #4
Packit Service 82fcde
	OPC	r4, r4, r5
Packit Service 82fcde
	teq	r1, lr			/* end of count? (preserve carry) */
Packit Service 82fcde
	str	r4, [r0], #4
Packit Service 82fcde
	beq	9f
Packit Service 82fcde
1:
Packit Service 82fcde
	tst	r3, #2			/* count & 2 == 2?  */
Packit Service 82fcde
	beq	2f
Packit Service 82fcde
	ldm	r1!, { r4, r5 }		/* do two to make count 0 mod 4 */
Packit Service 82fcde
	ldm	r2!, { r6, r7 }
Packit Service 82fcde
	OPC	r4, r4, r6
Packit Service 82fcde
	OPC	r5, r5, r7
Packit Service 82fcde
	teq	r1, lr			/* end of count? */
Packit Service 82fcde
	stm	r0!, { r4, r5 }
Packit Service 82fcde
	beq	9f
Packit Service 82fcde
2:
Packit Service 82fcde
	ldm	r1!, { r3, r5, r7, r10 }	/* do four each loop */
Packit Service 82fcde
	ldm	r2!, { r4, r6, r8, ip }
Packit Service 82fcde
	OPC	r3, r3, r4
Packit Service 82fcde
	OPC	r5, r5, r6
Packit Service 82fcde
	OPC	r7, r7, r8
Packit Service 82fcde
	OPC	r10, r10, ip
Packit Service 82fcde
	teq	r1, lr
Packit Service 82fcde
	stm	r0!, { r3, r5, r7, r10 }
Packit Service 82fcde
	bne	2b
Packit Service 82fcde
Packit Service 82fcde
9:
Packit Service 82fcde
	RETC				/* copy carry out */
Packit Service 82fcde
#ifndef ARM_ALWAYS_BX
Packit Service 82fcde
	pop	{ r4, r5, r6, r7, r8, r10, pc }
Packit Service 82fcde
#else
Packit Service 82fcde
	pop	{ r4, r5, r6, r7, r8, r10, lr }
Packit Service 82fcde
	bx	lr
Packit Service 82fcde
#endif
Packit Service 82fcde
END (FUNC)