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 
29         .set noreorder
30         .set noat
31 
32 	.text
33 
34 	.globl __udiv_qrnnd
35 	.ent __udiv_qrnnd
36 __udiv_qrnnd:
37 	.frame $30,0,$26,0
38 	.prologue 0
39 
40 #define cnt	$2
41 #define tmp	$3
42 #define rem_ptr	$16
43 #define n1	$17
44 #define n0	$18
45 #define d	$19
46 #define qb	$20
47 #define AT	$at
48 
49 	ldiq	cnt,16
50 	blt	d,$largedivisor
51 
52 $loop1:	cmplt	n0,0,tmp
53 	addq	n1,n1,n1
54 	bis	n1,tmp,n1
55 	addq	n0,n0,n0
56 	cmpule	d,n1,qb
57 	subq	n1,d,tmp
58 	cmovne	qb,tmp,n1
59 	bis	n0,qb,n0
60 	cmplt	n0,0,tmp
61 	addq	n1,n1,n1
62 	bis	n1,tmp,n1
63 	addq	n0,n0,n0
64 	cmpule	d,n1,qb
65 	subq	n1,d,tmp
66 	cmovne	qb,tmp,n1
67 	bis	n0,qb,n0
68 	cmplt	n0,0,tmp
69 	addq	n1,n1,n1
70 	bis	n1,tmp,n1
71 	addq	n0,n0,n0
72 	cmpule	d,n1,qb
73 	subq	n1,d,tmp
74 	cmovne	qb,tmp,n1
75 	bis	n0,qb,n0
76 	cmplt	n0,0,tmp
77 	addq	n1,n1,n1
78 	bis	n1,tmp,n1
79 	addq	n0,n0,n0
80 	cmpule	d,n1,qb
81 	subq	n1,d,tmp
82 	cmovne	qb,tmp,n1
83 	bis	n0,qb,n0
84 	subq	cnt,1,cnt
85 	bgt	cnt,$loop1
86 	stq	n1,0(rem_ptr)
87 	bis	$31,n0,$0
88 	ret	$31,($26),1
89 
90 $largedivisor:
91 	and	n0,1,$4
92 
93 	srl	n0,1,n0
94 	sll	n1,63,tmp
95 	or	tmp,n0,n0
96 	srl	n1,1,n1
97 
98 	and	d,1,$6
99 	srl	d,1,$5
100 	addq	$5,$6,$5
101 
102 $loop2:	cmplt	n0,0,tmp
103 	addq	n1,n1,n1
104 	bis	n1,tmp,n1
105 	addq	n0,n0,n0
106 	cmpule	$5,n1,qb
107 	subq	n1,$5,tmp
108 	cmovne	qb,tmp,n1
109 	bis	n0,qb,n0
110 	cmplt	n0,0,tmp
111 	addq	n1,n1,n1
112 	bis	n1,tmp,n1
113 	addq	n0,n0,n0
114 	cmpule	$5,n1,qb
115 	subq	n1,$5,tmp
116 	cmovne	qb,tmp,n1
117 	bis	n0,qb,n0
118 	cmplt	n0,0,tmp
119 	addq	n1,n1,n1
120 	bis	n1,tmp,n1
121 	addq	n0,n0,n0
122 	cmpule	$5,n1,qb
123 	subq	n1,$5,tmp
124 	cmovne	qb,tmp,n1
125 	bis	n0,qb,n0
126 	cmplt	n0,0,tmp
127 	addq	n1,n1,n1
128 	bis	n1,tmp,n1
129 	addq	n0,n0,n0
130 	cmpule	$5,n1,qb
131 	subq	n1,$5,tmp
132 	cmovne	qb,tmp,n1
133 	bis	n0,qb,n0
134 	subq	cnt,1,cnt
135 	bgt	cnt,$loop2
136 
137 	addq	n1,n1,n1
138 	addq	$4,n1,n1
139 	bne	$6,$Odd
140 	stq	n1,0(rem_ptr)
141 	bis	$31,n0,$0
142 	ret	$31,($26),1
143 
144 $Odd:
145 	/* q' in n0. r' in n1 */
146 	addq	n1,n0,n1
147 
148 	cmpult	n1,n0,tmp	# tmp := carry from addq
149 	subq	n1,d,AT
150 	addq	n0,tmp,n0
151 	cmovne	tmp,AT,n1
152 
153 	cmpult	n1,d,tmp
154 	addq	n0,1,AT
155 	cmoveq	tmp,AT,n0
156 	subq	n1,d,AT
157 	cmoveq	tmp,AT,n1
158 
159 	stq	n1,0(rem_ptr)
160 	bis	$31,n0,$0
161 	ret	$31,($26),1
162 
163 	.end	__udiv_qrnnd
164