1dnl  PowerPC-32 mpn_add_n and mpn_sub_n.
2
3dnl  Copyright 2002, 2005, 2007 Free Software Foundation, Inc.
4
5dnl  This file is part of the GNU MP Library.
6
7dnl  The GNU MP Library is free software; you can redistribute it and/or modify
8dnl  it under the terms of the GNU Lesser General Public License as published
9dnl  by the Free Software Foundation; either version 3 of the License, or (at
10dnl  your option) any later version.
11
12dnl  The GNU MP Library is distributed in the hope that it will be useful, but
13dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
15dnl  License for more details.
16
17dnl  You should have received a copy of the GNU Lesser General Public License
18dnl  along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
19
20include(`../config.m4')
21
22C                cycles/limb
23C 603e:              ?
24C 604e:              ?		old: 3.25
25C 75x (G3):          ?		old: 3.5
26C 7400,7410 (G4):    3.25
27C 744x,745x (G4+):   4
28C power4/ppc970:     ?		old: 2.0
29C power5:            ?		old: 2.5
30
31C INPUT PARAMETERS
32define(`rp',	`r3')
33define(`up',	`r4')
34define(`vp',	`r5')
35define(`n',	`r6')
36define(`cy',	`r7')
37
38ifdef(`OPERATION_add_n', `
39	define(ADCSBC,	adde)
40	define(func,	mpn_add_n)
41	define(func_nc,	mpn_add_nc)
42	define(IFADD,	`$1')
43	define(IFSUB,	`')')
44ifdef(`OPERATION_sub_n', `
45	define(ADCSBC,	subfe)
46	define(func,	mpn_sub_n)
47	define(func_nc,	mpn_sub_nc)
48	define(IFADD,	`')
49	define(IFSUB,	`$1')')
50
51MULFUNC_PROLOGUE(mpn_add_n mpn_add_nc mpn_sub_n mpn_sub_nc)
52
53ASM_START()
54
55PROLOGUE(func_nc)
56IFADD(`	addic	r0, cy, -1')		C set carry from argument
57IFSUB(`	subfic	r0, cy, 0')		C set carry from argument
58	b	L(ent)
59EPILOGUE()
60
61PROLOGUE(func)
62IFADD(`	addic	r0, n, 0')		C clear carry
63IFSUB(`	addic	r0, n, -1')		C set carry
64L(ent):	andi.	r0, n, 3
65	addi	r3, r3, -12
66	addi	n, n, 1
67	cmpwi	cr7, r0, 2
68	srwi	r0, n, 2
69	sub	r4, r4, r3
70	sub	r5, r5, r3
71	mtctr	r0
72	bne	cr0, L(n00)
73
74	lwzx	r7, r4, r3		C n = 4, 8, 12, ...
75	lwzx	r8, r5, r3
76	addi	r3, r3, 4
77	lwzx	r9, r4, r3
78	ADCSBC	r7, r8, r7
79	lwzx	r10, r5, r3
80	addi	r3, r3, 4
81	b	L(00)
82
83L(n00):	bge	cr7, L(n01)
84	cmpwi	cr0, r0, 0		C n = 1, 5, 9, 13, ...
85	lwzx	r0, r4, r3
86	lwzx	r6, r5, r3
87	addi	r3, r3, 4
88	ADCSBC	r0, r6, r0
89	ble	L(ret)
90L(gt1):	lwzx	r7, r4, r3
91	lwzx	r8, r5, r3
92	addi	r3, r3, 4
93	b	L(01)
94
95L(n10):
96	lwzx	r9, r4, r3		C n = 3, 7, 11, 15, ...
97	lwzx	r10, r5, r3
98	addi	r3, r3, 4
99	lwzx	r11, r4, r3
100	ADCSBC	r9, r10, r9
101	lwzx	r12, r5, r3
102	addi	r3, r3, 4
103	b	L(11)
104
105L(n01):	bne	cr7, L(n10)
106	cmpwi	cr0, r0, 0		C n = 2, 6, 10, 14, ...
107	lwzx	r11, r4, r3
108	lwzx	r12, r5, r3
109	addi	r3, r3, 4
110	lwzx	r0, r4, r3
111	ADCSBC	r11, r12, r11
112	lwzx	r6, r5, r3
113	addi	r3, r3, 4
114	ble	cr0, L(end)
115
116
117L(lp):	lwzx	r7, r4, r3
118	ADCSBC	r0, r6, r0
119	lwzx	r8, r5, r3
120	stwu	r11, 4(r3)
121L(01):	lwzx	r9, r4, r3
122	ADCSBC	r7, r8, r7
123	lwzx	r10, r5, r3
124	stwu	r0, 4(r3)
125L(00):	lwzx	r11, r4, r3
126	ADCSBC	r9, r10, r9
127	lwzx	r12, r5, r3
128	stwu	r7, 4(r3)
129L(11):	lwzx	r0, r4, r3
130	ADCSBC	r11, r12, r11
131	lwzx	r6, r5, r3
132	stwu	r9, 4(r3)
133	bdnz	L(lp)
134
135L(end):	ADCSBC	r0, r6, r0
136	stw	r11, 4(r3)
137L(ret):	stw	r0, 8(r3)
138IFADD(`	li	r3, 0	')
139IFADD(`	addze	r3, r3	')
140IFSUB(`	subfe	r3, r0, r0')
141IFSUB(`	neg	r3, r3')
142	blr
143EPILOGUE()
144