1dnl  PowerPC-64 mpn_lshift -- rp[] = up[] << cnt
2
3dnl  Copyright 2003, 2005 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 POWER3/PPC630:     1.5
24C POWER4/PPC970:     3.0
25
26C INPUT PARAMETERS
27define(`rp',`r3')
28define(`up',`r4')
29define(`n',`r5')
30define(`cnt',`r6')
31
32define(`tnc',`r5')
33define(`v0',`r0')
34define(`v1',`r7')
35define(`u0',`r8')
36define(`u1',`r9')
37define(`h0',`r10')
38define(`h1',`r11')
39
40
41ASM_START()
42PROLOGUE(mpn_lshift)
43ifdef(`HAVE_ABI_mode32',
44`	rldicl	r7, r5, 0, 32	C zero extend n
45	mtctr	r7',		C copy n to count register
46`	mtctr	n')		C copy n to count register
47
48ifdef(`HAVE_ABI_mode32',
49`	rldic	r0, n, 3, 32',	C byte count corresponding to n
50`	rldicr	r0, n, 3, 60')	C byte count corresponding to n
51
52	add	rp, rp, r0	C rp = rp + n
53	add	up, up, r0	C up = up + n
54	addi	rp, rp, 8	C rp now points 16 beyond end
55	addi	up, up, -8	C up now points to last limb
56	subfic	tnc, cnt, 64	C reverse shift count
57
58	ld	u0, 0(up)
59	sld	h0, u0, cnt
60	srd	r12, u0, tnc	C return value
61	bdz	L(1)		C jump for n = 1
62
63	ld	u1, -8(up)
64	bdz	L(2)		C jump for n = 2
65
66	ldu	u0, -16(up)
67	bdz	L(end)		C jump for n = 3
68
69L(oop):	srd	v1, u1, tnc
70	sld	h1, u1, cnt
71	ld	u1, -8(up)
72	or	h0, v1, h0
73	stdu	h0, -16(rp)
74
75	bdz	L(exit)
76
77	srd	v0, u0, tnc
78	sld	h0, u0, cnt
79	ldu	u0, -16(up)
80	or	h1, v0, h1
81	std	h1, -8(rp)
82
83	bdnz	L(oop)
84
85L(end):	srd	v1, u1, tnc
86	sld	h1, u1, cnt
87	or	h0, v1, h0
88	stdu	h0, -16(rp)
89	srd	v0, u0, tnc
90	sld	h0, u0, cnt
91	or	h1, v0, h1
92	std	h1, -8(rp)
93L(1):	std	h0, -16(rp)
94ifdef(`HAVE_ABI_mode32',
95`	srdi	r3, r12, 32
96	mr	r4, r12
97',`	mr	r3, r12
98')
99	blr
100
101L(exit):	srd	v0, u0, tnc
102	sld	h0, u0, cnt
103	or	h1, v0, h1
104	std	h1, -8(rp)
105L(2):	srd	v1, u1, tnc
106	sld	h1, u1, cnt
107	or	h0, v1, h0
108	stdu	h0, -16(rp)
109	std	h1, -8(rp)
110ifdef(`HAVE_ABI_mode32',
111`	srdi	r3, r12, 32
112	mr	r4, r12
113',`	mr	r3, r12
114')
115	blr
116EPILOGUE()
117