1/* sparc rshift
2 *
3 *      Copyright (C) 1995, 1996, 1998,
4 *                    2001, 2002 Free Software Foundation, Inc.
5 *
6 * This file is part of Libgcrypt.
7 *
8 * Libgcrypt is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU Lesser General Public License as
10 * published by the Free Software Foundation; either version 2.1 of
11 * the License, or (at your option) any later version.
12 *
13 * Libgcrypt is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 * GNU Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
21 */
22
23! INPUT PARAMETERS
24! res_ptr	%o0
25! src_ptr	%o1
26! size		%o2
27! cnt		%o3
28
29#include "sysdep.h"
30
31	.text
32	.align	4
33	.global C_SYMBOL_NAME(_gcry_mpih_rshift)
34C_SYMBOL_NAME(_gcry_mpih_rshift):
35	ld	[%o1],%g2	! load first limb
36	sub	%g0,%o3,%o5	! negate shift count
37	add	%o2,-1,%o2
38	andcc	%o2,4-1,%g4	! number of limbs in first loop
39	sll	%g2,%o5,%g1	! compute function result
40	be	L0		! if multiple of 4 limbs, skip first loop
41	st	%g1,[%sp+80]
42
43	sub	%o2,%g4,%o2	! adjust count for main loop
44
45Loop0:	ld	[%o1+4],%g3
46	add	%o0,4,%o0
47	add	%o1,4,%o1
48	addcc	%g4,-1,%g4
49	srl	%g2,%o3,%o4
50	sll	%g3,%o5,%g1
51	mov	%g3,%g2
52	or	%o4,%g1,%o4
53	bne	Loop0
54	 st	%o4,[%o0-4]
55
56L0:	tst	%o2
57	be	Lend
58	 nop
59
60Loop:	ld	[%o1+4],%g3
61	add	%o0,16,%o0
62	addcc	%o2,-4,%o2
63	srl	%g2,%o3,%o4
64	sll	%g3,%o5,%g1
65
66	ld	[%o1+8],%g2
67	srl	%g3,%o3,%g4
68	or	%o4,%g1,%o4
69	st	%o4,[%o0-16]
70	sll	%g2,%o5,%g1
71
72	ld	[%o1+12],%g3
73	srl	%g2,%o3,%o4
74	or	%g4,%g1,%g4
75	st	%g4,[%o0-12]
76	sll	%g3,%o5,%g1
77
78	ld	[%o1+16],%g2
79	srl	%g3,%o3,%g4
80	or	%o4,%g1,%o4
81	st	%o4,[%o0-8]
82	sll	%g2,%o5,%g1
83
84	add	%o1,16,%o1
85	or	%g4,%g1,%g4
86	bne	Loop
87	 st	%g4,[%o0-4]
88
89Lend:	srl	%g2,%o3,%g2
90	st	%g2,[%o0-0]
91	retl
92	ld	[%sp+80],%o0
93
94