162306a36Sopenharmony_ci # Alpha 21064 __udiv_qrnnd
262306a36Sopenharmony_ci # Copyright (C) 1992, 1994, 1995, 2000 Free Software Foundation, Inc.
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci # This file is part of GCC.
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci # The GNU MP Library is free software; you can redistribute it and/or modify
762306a36Sopenharmony_ci # it under the terms of the GNU General Public License as published by
862306a36Sopenharmony_ci # the Free Software Foundation; either version 2 of the License, or (at your
962306a36Sopenharmony_ci # option) any later version.
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci # In addition to the permissions in the GNU General Public License, the
1262306a36Sopenharmony_ci # Free Software Foundation gives you unlimited permission to link the
1362306a36Sopenharmony_ci # compiled version of this file with other programs, and to distribute
1462306a36Sopenharmony_ci # those programs without any restriction coming from the use of this
1562306a36Sopenharmony_ci # file.  (The General Public License restrictions do apply in other
1662306a36Sopenharmony_ci # respects; for example, they cover modification of the file, and
1762306a36Sopenharmony_ci # distribution when not linked into another program.)
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci # This file is distributed in the hope that it will be useful, but
2062306a36Sopenharmony_ci # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
2162306a36Sopenharmony_ci # or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
2262306a36Sopenharmony_ci # License for more details.
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci # You should have received a copy of the GNU General Public License
2562306a36Sopenharmony_ci # along with GCC; see the file COPYING.  If not, write to the
2662306a36Sopenharmony_ci # Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
2762306a36Sopenharmony_ci # MA 02111-1307, USA.
2862306a36Sopenharmony_ci#include <linux/export.h>
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci        .set noreorder
3162306a36Sopenharmony_ci        .set noat
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci	.text
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci	.globl __udiv_qrnnd
3662306a36Sopenharmony_ci	.ent __udiv_qrnnd
3762306a36Sopenharmony_ci__udiv_qrnnd:
3862306a36Sopenharmony_ci	.frame $30,0,$26,0
3962306a36Sopenharmony_ci	.prologue 0
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci#define cnt	$2
4262306a36Sopenharmony_ci#define tmp	$3
4362306a36Sopenharmony_ci#define rem_ptr	$16
4462306a36Sopenharmony_ci#define n1	$17
4562306a36Sopenharmony_ci#define n0	$18
4662306a36Sopenharmony_ci#define d	$19
4762306a36Sopenharmony_ci#define qb	$20
4862306a36Sopenharmony_ci#define AT	$at
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci	ldiq	cnt,16
5162306a36Sopenharmony_ci	blt	d,$largedivisor
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci$loop1:	cmplt	n0,0,tmp
5462306a36Sopenharmony_ci	addq	n1,n1,n1
5562306a36Sopenharmony_ci	bis	n1,tmp,n1
5662306a36Sopenharmony_ci	addq	n0,n0,n0
5762306a36Sopenharmony_ci	cmpule	d,n1,qb
5862306a36Sopenharmony_ci	subq	n1,d,tmp
5962306a36Sopenharmony_ci	cmovne	qb,tmp,n1
6062306a36Sopenharmony_ci	bis	n0,qb,n0
6162306a36Sopenharmony_ci	cmplt	n0,0,tmp
6262306a36Sopenharmony_ci	addq	n1,n1,n1
6362306a36Sopenharmony_ci	bis	n1,tmp,n1
6462306a36Sopenharmony_ci	addq	n0,n0,n0
6562306a36Sopenharmony_ci	cmpule	d,n1,qb
6662306a36Sopenharmony_ci	subq	n1,d,tmp
6762306a36Sopenharmony_ci	cmovne	qb,tmp,n1
6862306a36Sopenharmony_ci	bis	n0,qb,n0
6962306a36Sopenharmony_ci	cmplt	n0,0,tmp
7062306a36Sopenharmony_ci	addq	n1,n1,n1
7162306a36Sopenharmony_ci	bis	n1,tmp,n1
7262306a36Sopenharmony_ci	addq	n0,n0,n0
7362306a36Sopenharmony_ci	cmpule	d,n1,qb
7462306a36Sopenharmony_ci	subq	n1,d,tmp
7562306a36Sopenharmony_ci	cmovne	qb,tmp,n1
7662306a36Sopenharmony_ci	bis	n0,qb,n0
7762306a36Sopenharmony_ci	cmplt	n0,0,tmp
7862306a36Sopenharmony_ci	addq	n1,n1,n1
7962306a36Sopenharmony_ci	bis	n1,tmp,n1
8062306a36Sopenharmony_ci	addq	n0,n0,n0
8162306a36Sopenharmony_ci	cmpule	d,n1,qb
8262306a36Sopenharmony_ci	subq	n1,d,tmp
8362306a36Sopenharmony_ci	cmovne	qb,tmp,n1
8462306a36Sopenharmony_ci	bis	n0,qb,n0
8562306a36Sopenharmony_ci	subq	cnt,1,cnt
8662306a36Sopenharmony_ci	bgt	cnt,$loop1
8762306a36Sopenharmony_ci	stq	n1,0(rem_ptr)
8862306a36Sopenharmony_ci	bis	$31,n0,$0
8962306a36Sopenharmony_ci	ret	$31,($26),1
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci$largedivisor:
9262306a36Sopenharmony_ci	and	n0,1,$4
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci	srl	n0,1,n0
9562306a36Sopenharmony_ci	sll	n1,63,tmp
9662306a36Sopenharmony_ci	or	tmp,n0,n0
9762306a36Sopenharmony_ci	srl	n1,1,n1
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci	and	d,1,$6
10062306a36Sopenharmony_ci	srl	d,1,$5
10162306a36Sopenharmony_ci	addq	$5,$6,$5
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_ci$loop2:	cmplt	n0,0,tmp
10462306a36Sopenharmony_ci	addq	n1,n1,n1
10562306a36Sopenharmony_ci	bis	n1,tmp,n1
10662306a36Sopenharmony_ci	addq	n0,n0,n0
10762306a36Sopenharmony_ci	cmpule	$5,n1,qb
10862306a36Sopenharmony_ci	subq	n1,$5,tmp
10962306a36Sopenharmony_ci	cmovne	qb,tmp,n1
11062306a36Sopenharmony_ci	bis	n0,qb,n0
11162306a36Sopenharmony_ci	cmplt	n0,0,tmp
11262306a36Sopenharmony_ci	addq	n1,n1,n1
11362306a36Sopenharmony_ci	bis	n1,tmp,n1
11462306a36Sopenharmony_ci	addq	n0,n0,n0
11562306a36Sopenharmony_ci	cmpule	$5,n1,qb
11662306a36Sopenharmony_ci	subq	n1,$5,tmp
11762306a36Sopenharmony_ci	cmovne	qb,tmp,n1
11862306a36Sopenharmony_ci	bis	n0,qb,n0
11962306a36Sopenharmony_ci	cmplt	n0,0,tmp
12062306a36Sopenharmony_ci	addq	n1,n1,n1
12162306a36Sopenharmony_ci	bis	n1,tmp,n1
12262306a36Sopenharmony_ci	addq	n0,n0,n0
12362306a36Sopenharmony_ci	cmpule	$5,n1,qb
12462306a36Sopenharmony_ci	subq	n1,$5,tmp
12562306a36Sopenharmony_ci	cmovne	qb,tmp,n1
12662306a36Sopenharmony_ci	bis	n0,qb,n0
12762306a36Sopenharmony_ci	cmplt	n0,0,tmp
12862306a36Sopenharmony_ci	addq	n1,n1,n1
12962306a36Sopenharmony_ci	bis	n1,tmp,n1
13062306a36Sopenharmony_ci	addq	n0,n0,n0
13162306a36Sopenharmony_ci	cmpule	$5,n1,qb
13262306a36Sopenharmony_ci	subq	n1,$5,tmp
13362306a36Sopenharmony_ci	cmovne	qb,tmp,n1
13462306a36Sopenharmony_ci	bis	n0,qb,n0
13562306a36Sopenharmony_ci	subq	cnt,1,cnt
13662306a36Sopenharmony_ci	bgt	cnt,$loop2
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_ci	addq	n1,n1,n1
13962306a36Sopenharmony_ci	addq	$4,n1,n1
14062306a36Sopenharmony_ci	bne	$6,$Odd
14162306a36Sopenharmony_ci	stq	n1,0(rem_ptr)
14262306a36Sopenharmony_ci	bis	$31,n0,$0
14362306a36Sopenharmony_ci	ret	$31,($26),1
14462306a36Sopenharmony_ci
14562306a36Sopenharmony_ci$Odd:
14662306a36Sopenharmony_ci	/* q' in n0. r' in n1 */
14762306a36Sopenharmony_ci	addq	n1,n0,n1
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci	cmpult	n1,n0,tmp	# tmp := carry from addq
15062306a36Sopenharmony_ci	subq	n1,d,AT
15162306a36Sopenharmony_ci	addq	n0,tmp,n0
15262306a36Sopenharmony_ci	cmovne	tmp,AT,n1
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_ci	cmpult	n1,d,tmp
15562306a36Sopenharmony_ci	addq	n0,1,AT
15662306a36Sopenharmony_ci	cmoveq	tmp,AT,n0
15762306a36Sopenharmony_ci	subq	n1,d,AT
15862306a36Sopenharmony_ci	cmoveq	tmp,AT,n1
15962306a36Sopenharmony_ci
16062306a36Sopenharmony_ci	stq	n1,0(rem_ptr)
16162306a36Sopenharmony_ci	bis	$31,n0,$0
16262306a36Sopenharmony_ci	ret	$31,($26),1
16362306a36Sopenharmony_ci
16462306a36Sopenharmony_ci	.end	__udiv_qrnnd
16562306a36Sopenharmony_ciEXPORT_SYMBOL(__udiv_qrnnd)
166