1/* PowerPC64 mpn_lshift --  mpn_add_n/mpn_sub_n -- mpn addition and
2   subtraction.
3   Copyright (C) 2003-2022 Free Software Foundation, Inc.
4   This file is part of the GNU C 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
8   License as published by the Free Software Foundation; either
9   version 2.1 of the 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; if not, see
18   <https://www.gnu.org/licenses/>.  */
19
20#include <sysdep.h>
21
22/*             cycles/limb
23 * POWER7             2.18
24 */
25
26#ifdef USE_AS_SUB
27# define FUNC      __mpn_sub_n
28# define ADDSUBC   subfe
29#else
30# define FUNC      __mpn_add_n
31# define ADDSUBC   adde
32#endif
33
34#define RP  r3
35#define UP  r4
36#define VP  r5
37#define N   r6
38
39ENTRY_TOCLESS (FUNC, 5)
40#ifdef USE_AS_SUB
41	addic	r0, r1, -1
42#else
43	addic	r0, r0, 0
44#endif
45	andi.	r7, N, 1
46	beq	L(bx0)
47
48	ld	r7, 0(UP)
49	ld	r9, 0(VP)
50	ADDSUBC	r11, r9, r7
51	std	r11, 0(RP)
52	cmpldi	N, N, 1
53	beq	N, L(end)
54	addi	UP, UP, 8
55	addi	VP, VP, 8
56	addi	RP, RP, 8
57
58L(bx0):	addi	r0, N, 2
59	srdi	r0, r0, 2
60	mtctr	r0
61
62	andi.	r7, N, 2
63	bne	L(mid)
64
65	addi	UP, UP, 16
66	addi	VP, VP, 16
67	addi	RP, RP, 16
68
69	.align	5
70L(top):	ld	r6, -16(UP)
71	ld	r7, -8(UP)
72	ld	r8, -16(VP)
73	ld	r9, -8(VP)
74	ADDSUBC	r10, r8, N
75	ADDSUBC	r11, r9, r7
76	std	r10, -16(RP)
77	std	r11, -8(RP)
78L(mid):	ld	r6, 0(UP)
79	ld	r7, 8(UP)
80	ld	r8, 0(VP)
81	ld	r9, 8(VP)
82	ADDSUBC	r10, r8, N
83	ADDSUBC	r11, r9, r7
84	std	r10, 0(RP)
85	std	r11, 8(RP)
86	addi	UP, UP, 32
87	addi	VP, VP, 32
88	addi	RP, RP, 32
89	bdnz	L(top)
90
91L(end):	subfe	r3, r0, r0
92#ifdef USE_AS_SUB
93	neg	r3, r3
94#else
95	addi	r3, r3, 1
96#endif
97	blr
98END(FUNC)
99