lshrsi3.S revision 1.4
1;   Copyright (C) 2011-2016 Free Software Foundation, Inc.
2;   Contributed by Red Hat.
3;
4; This file is free software; you can redistribute it and/or modify it
5; under the terms of the GNU General Public License as published by the
6; Free Software Foundation; either version 3, or (at your option) any
7; later version.
8;
9; This file is distributed in the hope that it will be useful, but
10; WITHOUT ANY WARRANTY; without even the implied warranty of
11; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12; General Public License for more details.
13;
14; Under Section 7 of GPL version 3, you are granted additional
15; permissions described in the GCC Runtime Library Exception, version
16; 3.1, as published by the Free Software Foundation.
17;
18; You should have received a copy of the GNU General Public License and
19; a copy of the GCC Runtime Library Exception along with this program;
20; see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
21; <http://www.gnu.org/licenses/>.
22
23#include "vregs.h"
24
25START_FUNC ___lshrsi3
26	;; input:
27	;;
28	;; [zero]
29	;; [count]   <= $sp+8
30	;; [in MSB]
31	;; [in]
32	;; [in]
33	;; [in LSB]  <- $sp+4
34
35	;; output:
36	;;
37	;; [r8..r11] result
38
39	;; registers:
40	;;
41	;; AX - temp for shift/rotate
42	;; B  - count
43
44	mov	a, [sp+8]	; A now contains the count
45	cmp	a, #0x20
46	bc	$.Lcount_is_normal
47
48	;; count is out of bounds, just return zero.
49	movw	r8, #0
50	movw	r10, #0
51	ret
52
53.Lcount_is_normal:
54	cmp0	a
55	bnz	$.Lcount_is_nonzero
56
57	;; count is zero, just copy IN to OUT
58	movw	ax, [sp+4]
59	movw	r8, ax
60	movw	ax, [sp+6]
61	movw	r10, ax
62	ret
63
64.Lcount_is_nonzero:
65	mov	b, a		; B now contains the count also
66	bf	a.4, $.Lcount_lt_16
67
68	;; count >= 16, shift 16 at a time.
69	movw	r10, #0
70	movw	ax, [sp+6]
71	movw	r8, ax
72	mov	a, b
73	and	a, #0x0f
74	sknz
75	ret
76
77	mov	b, a		; B now contains the remaining count
78	inc	b
79	br	$.Lloop_top
80
81.Lcount_lt_16:
82	;; count is nonzero.  Do one
83	movw	ax, [sp+6]
84	shrw	ax,1
85	movw	r10, ax
86	mov	a, [sp+5]
87	rorc	a,1
88	mov	r9, a
89	mov	a, [sp+4]
90	rorc	a,1
91	mov	r8, a
92
93	;; we did one shift above; do as many more as we need now.
94.Lloop_top:
95	dec	b
96	sknz
97	ret
98
99	movw	ax, r10
100	shrw	ax,1
101	movw	r10, ax
102	mov	a, r9
103	rorc	a,1
104	mov	r9, a
105	mov	a, r8
106	rorc	a,1
107	mov	r8, a
108
109	br	$.Lloop_top
110
111END_FUNC ___lshrsi3
112