18c2ecf20Sopenharmony_ci # Alpha 21064 __udiv_qrnnd
28c2ecf20Sopenharmony_ci # Copyright (C) 1992, 1994, 1995, 2000 Free Software Foundation, Inc.
38c2ecf20Sopenharmony_ci
48c2ecf20Sopenharmony_ci # This file is part of GCC.
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci # The GNU MP Library is free software; you can redistribute it and/or modify
78c2ecf20Sopenharmony_ci # it under the terms of the GNU General Public License as published by
88c2ecf20Sopenharmony_ci # the Free Software Foundation; either version 2 of the License, or (at your
98c2ecf20Sopenharmony_ci # option) any later version.
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci # In addition to the permissions in the GNU General Public License, the
128c2ecf20Sopenharmony_ci # Free Software Foundation gives you unlimited permission to link the
138c2ecf20Sopenharmony_ci # compiled version of this file with other programs, and to distribute
148c2ecf20Sopenharmony_ci # those programs without any restriction coming from the use of this
158c2ecf20Sopenharmony_ci # file.  (The General Public License restrictions do apply in other
168c2ecf20Sopenharmony_ci # respects; for example, they cover modification of the file, and
178c2ecf20Sopenharmony_ci # distribution when not linked into another program.)
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci # This file is distributed in the hope that it will be useful, but
208c2ecf20Sopenharmony_ci # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
218c2ecf20Sopenharmony_ci # or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
228c2ecf20Sopenharmony_ci # License for more details.
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ci # You should have received a copy of the GNU General Public License
258c2ecf20Sopenharmony_ci # along with GCC; see the file COPYING.  If not, write to the
268c2ecf20Sopenharmony_ci # Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
278c2ecf20Sopenharmony_ci # MA 02111-1307, USA.
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ci        .set noreorder
308c2ecf20Sopenharmony_ci        .set noat
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_ci	.text
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_ci	.globl __udiv_qrnnd
358c2ecf20Sopenharmony_ci	.ent __udiv_qrnnd
368c2ecf20Sopenharmony_ci__udiv_qrnnd:
378c2ecf20Sopenharmony_ci	.frame $30,0,$26,0
388c2ecf20Sopenharmony_ci	.prologue 0
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_ci#define cnt	$2
418c2ecf20Sopenharmony_ci#define tmp	$3
428c2ecf20Sopenharmony_ci#define rem_ptr	$16
438c2ecf20Sopenharmony_ci#define n1	$17
448c2ecf20Sopenharmony_ci#define n0	$18
458c2ecf20Sopenharmony_ci#define d	$19
468c2ecf20Sopenharmony_ci#define qb	$20
478c2ecf20Sopenharmony_ci#define AT	$at
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_ci	ldiq	cnt,16
508c2ecf20Sopenharmony_ci	blt	d,$largedivisor
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_ci$loop1:	cmplt	n0,0,tmp
538c2ecf20Sopenharmony_ci	addq	n1,n1,n1
548c2ecf20Sopenharmony_ci	bis	n1,tmp,n1
558c2ecf20Sopenharmony_ci	addq	n0,n0,n0
568c2ecf20Sopenharmony_ci	cmpule	d,n1,qb
578c2ecf20Sopenharmony_ci	subq	n1,d,tmp
588c2ecf20Sopenharmony_ci	cmovne	qb,tmp,n1
598c2ecf20Sopenharmony_ci	bis	n0,qb,n0
608c2ecf20Sopenharmony_ci	cmplt	n0,0,tmp
618c2ecf20Sopenharmony_ci	addq	n1,n1,n1
628c2ecf20Sopenharmony_ci	bis	n1,tmp,n1
638c2ecf20Sopenharmony_ci	addq	n0,n0,n0
648c2ecf20Sopenharmony_ci	cmpule	d,n1,qb
658c2ecf20Sopenharmony_ci	subq	n1,d,tmp
668c2ecf20Sopenharmony_ci	cmovne	qb,tmp,n1
678c2ecf20Sopenharmony_ci	bis	n0,qb,n0
688c2ecf20Sopenharmony_ci	cmplt	n0,0,tmp
698c2ecf20Sopenharmony_ci	addq	n1,n1,n1
708c2ecf20Sopenharmony_ci	bis	n1,tmp,n1
718c2ecf20Sopenharmony_ci	addq	n0,n0,n0
728c2ecf20Sopenharmony_ci	cmpule	d,n1,qb
738c2ecf20Sopenharmony_ci	subq	n1,d,tmp
748c2ecf20Sopenharmony_ci	cmovne	qb,tmp,n1
758c2ecf20Sopenharmony_ci	bis	n0,qb,n0
768c2ecf20Sopenharmony_ci	cmplt	n0,0,tmp
778c2ecf20Sopenharmony_ci	addq	n1,n1,n1
788c2ecf20Sopenharmony_ci	bis	n1,tmp,n1
798c2ecf20Sopenharmony_ci	addq	n0,n0,n0
808c2ecf20Sopenharmony_ci	cmpule	d,n1,qb
818c2ecf20Sopenharmony_ci	subq	n1,d,tmp
828c2ecf20Sopenharmony_ci	cmovne	qb,tmp,n1
838c2ecf20Sopenharmony_ci	bis	n0,qb,n0
848c2ecf20Sopenharmony_ci	subq	cnt,1,cnt
858c2ecf20Sopenharmony_ci	bgt	cnt,$loop1
868c2ecf20Sopenharmony_ci	stq	n1,0(rem_ptr)
878c2ecf20Sopenharmony_ci	bis	$31,n0,$0
888c2ecf20Sopenharmony_ci	ret	$31,($26),1
898c2ecf20Sopenharmony_ci
908c2ecf20Sopenharmony_ci$largedivisor:
918c2ecf20Sopenharmony_ci	and	n0,1,$4
928c2ecf20Sopenharmony_ci
938c2ecf20Sopenharmony_ci	srl	n0,1,n0
948c2ecf20Sopenharmony_ci	sll	n1,63,tmp
958c2ecf20Sopenharmony_ci	or	tmp,n0,n0
968c2ecf20Sopenharmony_ci	srl	n1,1,n1
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_ci	and	d,1,$6
998c2ecf20Sopenharmony_ci	srl	d,1,$5
1008c2ecf20Sopenharmony_ci	addq	$5,$6,$5
1018c2ecf20Sopenharmony_ci
1028c2ecf20Sopenharmony_ci$loop2:	cmplt	n0,0,tmp
1038c2ecf20Sopenharmony_ci	addq	n1,n1,n1
1048c2ecf20Sopenharmony_ci	bis	n1,tmp,n1
1058c2ecf20Sopenharmony_ci	addq	n0,n0,n0
1068c2ecf20Sopenharmony_ci	cmpule	$5,n1,qb
1078c2ecf20Sopenharmony_ci	subq	n1,$5,tmp
1088c2ecf20Sopenharmony_ci	cmovne	qb,tmp,n1
1098c2ecf20Sopenharmony_ci	bis	n0,qb,n0
1108c2ecf20Sopenharmony_ci	cmplt	n0,0,tmp
1118c2ecf20Sopenharmony_ci	addq	n1,n1,n1
1128c2ecf20Sopenharmony_ci	bis	n1,tmp,n1
1138c2ecf20Sopenharmony_ci	addq	n0,n0,n0
1148c2ecf20Sopenharmony_ci	cmpule	$5,n1,qb
1158c2ecf20Sopenharmony_ci	subq	n1,$5,tmp
1168c2ecf20Sopenharmony_ci	cmovne	qb,tmp,n1
1178c2ecf20Sopenharmony_ci	bis	n0,qb,n0
1188c2ecf20Sopenharmony_ci	cmplt	n0,0,tmp
1198c2ecf20Sopenharmony_ci	addq	n1,n1,n1
1208c2ecf20Sopenharmony_ci	bis	n1,tmp,n1
1218c2ecf20Sopenharmony_ci	addq	n0,n0,n0
1228c2ecf20Sopenharmony_ci	cmpule	$5,n1,qb
1238c2ecf20Sopenharmony_ci	subq	n1,$5,tmp
1248c2ecf20Sopenharmony_ci	cmovne	qb,tmp,n1
1258c2ecf20Sopenharmony_ci	bis	n0,qb,n0
1268c2ecf20Sopenharmony_ci	cmplt	n0,0,tmp
1278c2ecf20Sopenharmony_ci	addq	n1,n1,n1
1288c2ecf20Sopenharmony_ci	bis	n1,tmp,n1
1298c2ecf20Sopenharmony_ci	addq	n0,n0,n0
1308c2ecf20Sopenharmony_ci	cmpule	$5,n1,qb
1318c2ecf20Sopenharmony_ci	subq	n1,$5,tmp
1328c2ecf20Sopenharmony_ci	cmovne	qb,tmp,n1
1338c2ecf20Sopenharmony_ci	bis	n0,qb,n0
1348c2ecf20Sopenharmony_ci	subq	cnt,1,cnt
1358c2ecf20Sopenharmony_ci	bgt	cnt,$loop2
1368c2ecf20Sopenharmony_ci
1378c2ecf20Sopenharmony_ci	addq	n1,n1,n1
1388c2ecf20Sopenharmony_ci	addq	$4,n1,n1
1398c2ecf20Sopenharmony_ci	bne	$6,$Odd
1408c2ecf20Sopenharmony_ci	stq	n1,0(rem_ptr)
1418c2ecf20Sopenharmony_ci	bis	$31,n0,$0
1428c2ecf20Sopenharmony_ci	ret	$31,($26),1
1438c2ecf20Sopenharmony_ci
1448c2ecf20Sopenharmony_ci$Odd:
1458c2ecf20Sopenharmony_ci	/* q' in n0. r' in n1 */
1468c2ecf20Sopenharmony_ci	addq	n1,n0,n1
1478c2ecf20Sopenharmony_ci
1488c2ecf20Sopenharmony_ci	cmpult	n1,n0,tmp	# tmp := carry from addq
1498c2ecf20Sopenharmony_ci	subq	n1,d,AT
1508c2ecf20Sopenharmony_ci	addq	n0,tmp,n0
1518c2ecf20Sopenharmony_ci	cmovne	tmp,AT,n1
1528c2ecf20Sopenharmony_ci
1538c2ecf20Sopenharmony_ci	cmpult	n1,d,tmp
1548c2ecf20Sopenharmony_ci	addq	n0,1,AT
1558c2ecf20Sopenharmony_ci	cmoveq	tmp,AT,n0
1568c2ecf20Sopenharmony_ci	subq	n1,d,AT
1578c2ecf20Sopenharmony_ci	cmoveq	tmp,AT,n1
1588c2ecf20Sopenharmony_ci
1598c2ecf20Sopenharmony_ci	stq	n1,0(rem_ptr)
1608c2ecf20Sopenharmony_ci	bis	$31,n0,$0
1618c2ecf20Sopenharmony_ci	ret	$31,($26),1
1628c2ecf20Sopenharmony_ci
1638c2ecf20Sopenharmony_ci	.end	__udiv_qrnnd
164