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