xref: /netbsd-src/external/lgpl3/gmp/dist/mpn/powerpc32/sublsh1_n.asm (revision 6cd39ddb8550f6fa1bff3fed32053d7f19fd0453)
1dnl  PowerPC-32 mpn_sublsh1_n -- rp[] = up[] - (vp[] << 1)
2
3dnl  Copyright 2003, 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:            4.0
25C 75x (G3):        5.0
26C 7400,7410 (G4):  5.0
27C 744x,745x (G4+): 5.0
28C power4/ppc970:   4.25
29C power5:          5.0
30
31C INPUT PARAMETERS
32C rp	r3
33C up	r4
34C vp	r5
35C n	r6
36
37define(`rp',`r3')
38define(`up',`r4')
39define(`vp',`r5')
40
41define(`s0',`r6')
42define(`s1',`r7')
43define(`u0',`r8')
44define(`v0',`r10')
45define(`v1',`r11')
46
47ASM_START()
48PROLOGUE(mpn_sublsh1_n)
49	mtctr	r6		C copy n in ctr
50
51	lwz	v0, 0(vp)	C load v limb
52	lwz	u0, 0(up)	C load u limb
53	addic	up, up, -4	C update up; set cy
54	addi	rp, rp, -4	C update rp
55	slwi	s1, v0, 1
56	bdz	L(end)		C If done, skip loop
57
58L(loop):
59	lwz	v1, 4(vp)	C load v limb
60	subfe	s1, s1, u0	C add limbs with cy, set cy
61	srwi	s0, v0, 31	C shift down previous v limb
62	stw	s1, 4(rp)	C store result limb
63	lwzu	u0, 8(up)	C load u limb and update up
64	rlwimi	s0, v1, 1, 0,30	C left shift v limb and merge with prev v limb
65
66	bdz	L(exit)		C decrement ctr and exit if done
67
68	lwzu	v0, 8(vp)	C load v limb and update vp
69	subfe	s0, s0, u0	C add limbs with cy, set cy
70	srwi	s1, v1, 31	C shift down previous v limb
71	stwu	s0, 8(rp)	C store result limb and update rp
72	lwz	u0, 4(up)	C load u limb
73	rlwimi	s1, v0, 1, 0,30	C left shift v limb and merge with prev v limb
74
75	bdnz	L(loop)		C decrement ctr and loop back
76
77L(end):	subfe	r7, s1, u0
78	srwi	r4, v0, 31
79	stw	r7, 4(rp)	C store last result limb
80	subfze	r3, r4
81	neg	r3, r3
82	blr
83L(exit):
84	subfe	r7, s0, u0
85	srwi	r4, v1, 31
86	stw	r7, 8(rp)	C store last result limb
87	subfze	r3, r4
88	neg	r3, r3
89	blr
90EPILOGUE()
91