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