1  # Alpha 21064 __udiv_qrnnd
2  # Copyright (C) 1992, 1994, 1995, 2000 Free Software Foundation, Inc.
3 
4  # This file is part of GCC.
5 
6  # The GNU MP Library is free software; you can redistribute it and/or modify
7  # it under the terms of the GNU General Public License as published by
8  # the Free Software Foundation; either version 2 of the License, or (at your
9  # option) any later version.
10 
11  # In addition to the permissions in the GNU General Public License, the
12  # Free Software Foundation gives you unlimited permission to link the
13  # compiled version of this file with other programs, and to distribute
14  # those programs without any restriction coming from the use of this
15  # file.  (The General Public License restrictions do apply in other
16  # respects; for example, they cover modification of the file, and
17  # distribution when not linked into another program.)
18 
19  # This file is distributed in the hope that it will be useful, but
20  # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
21  # or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
22  # License for more details.
23 
24  # You should have received a copy of the GNU General Public License
25  # along with GCC; see the file COPYING.  If not, write to the
26  # Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
27  # MA 02111-1307, USA.
28 #include <linux/export.h>
29 
30         .set noreorder
31         .set noat
32 
33 	.text
34 
35 	.globl __udiv_qrnnd
36 	.ent __udiv_qrnnd
37 __udiv_qrnnd:
38 	.frame $30,0,$26,0
39 	.prologue 0
40 
41 #define cnt	$2
42 #define tmp	$3
43 #define rem_ptr	$16
44 #define n1	$17
45 #define n0	$18
46 #define d	$19
47 #define qb	$20
48 #define AT	$at
49 
50 	ldiq	cnt,16
51 	blt	d,$largedivisor
52 
53 $loop1:	cmplt	n0,0,tmp
54 	addq	n1,n1,n1
55 	bis	n1,tmp,n1
56 	addq	n0,n0,n0
57 	cmpule	d,n1,qb
58 	subq	n1,d,tmp
59 	cmovne	qb,tmp,n1
60 	bis	n0,qb,n0
61 	cmplt	n0,0,tmp
62 	addq	n1,n1,n1
63 	bis	n1,tmp,n1
64 	addq	n0,n0,n0
65 	cmpule	d,n1,qb
66 	subq	n1,d,tmp
67 	cmovne	qb,tmp,n1
68 	bis	n0,qb,n0
69 	cmplt	n0,0,tmp
70 	addq	n1,n1,n1
71 	bis	n1,tmp,n1
72 	addq	n0,n0,n0
73 	cmpule	d,n1,qb
74 	subq	n1,d,tmp
75 	cmovne	qb,tmp,n1
76 	bis	n0,qb,n0
77 	cmplt	n0,0,tmp
78 	addq	n1,n1,n1
79 	bis	n1,tmp,n1
80 	addq	n0,n0,n0
81 	cmpule	d,n1,qb
82 	subq	n1,d,tmp
83 	cmovne	qb,tmp,n1
84 	bis	n0,qb,n0
85 	subq	cnt,1,cnt
86 	bgt	cnt,$loop1
87 	stq	n1,0(rem_ptr)
88 	bis	$31,n0,$0
89 	ret	$31,($26),1
90 
91 $largedivisor:
92 	and	n0,1,$4
93 
94 	srl	n0,1,n0
95 	sll	n1,63,tmp
96 	or	tmp,n0,n0
97 	srl	n1,1,n1
98 
99 	and	d,1,$6
100 	srl	d,1,$5
101 	addq	$5,$6,$5
102 
103 $loop2:	cmplt	n0,0,tmp
104 	addq	n1,n1,n1
105 	bis	n1,tmp,n1
106 	addq	n0,n0,n0
107 	cmpule	$5,n1,qb
108 	subq	n1,$5,tmp
109 	cmovne	qb,tmp,n1
110 	bis	n0,qb,n0
111 	cmplt	n0,0,tmp
112 	addq	n1,n1,n1
113 	bis	n1,tmp,n1
114 	addq	n0,n0,n0
115 	cmpule	$5,n1,qb
116 	subq	n1,$5,tmp
117 	cmovne	qb,tmp,n1
118 	bis	n0,qb,n0
119 	cmplt	n0,0,tmp
120 	addq	n1,n1,n1
121 	bis	n1,tmp,n1
122 	addq	n0,n0,n0
123 	cmpule	$5,n1,qb
124 	subq	n1,$5,tmp
125 	cmovne	qb,tmp,n1
126 	bis	n0,qb,n0
127 	cmplt	n0,0,tmp
128 	addq	n1,n1,n1
129 	bis	n1,tmp,n1
130 	addq	n0,n0,n0
131 	cmpule	$5,n1,qb
132 	subq	n1,$5,tmp
133 	cmovne	qb,tmp,n1
134 	bis	n0,qb,n0
135 	subq	cnt,1,cnt
136 	bgt	cnt,$loop2
137 
138 	addq	n1,n1,n1
139 	addq	$4,n1,n1
140 	bne	$6,$Odd
141 	stq	n1,0(rem_ptr)
142 	bis	$31,n0,$0
143 	ret	$31,($26),1
144 
145 $Odd:
146 	/* q' in n0. r' in n1 */
147 	addq	n1,n0,n1
148 
149 	cmpult	n1,n0,tmp	# tmp := carry from addq
150 	subq	n1,d,AT
151 	addq	n0,tmp,n0
152 	cmovne	tmp,AT,n1
153 
154 	cmpult	n1,d,tmp
155 	addq	n0,1,AT
156 	cmoveq	tmp,AT,n0
157 	subq	n1,d,AT
158 	cmoveq	tmp,AT,n1
159 
160 	stq	n1,0(rem_ptr)
161 	bis	$31,n0,$0
162 	ret	$31,($26),1
163 
164 	.end	__udiv_qrnnd
165 EXPORT_SYMBOL(__udiv_qrnnd)
166