Blame sysdeps/alpha/udiv_qrnnd.S

Packit 6c4009
 # Alpha 21064 __udiv_qrnnd
Packit 6c4009
Packit 6c4009
 # Copyright (C) 1992-2018 Free Software Foundation, Inc.
Packit 6c4009
Packit 6c4009
 # This file is part of the GNU MP Library.
Packit 6c4009
Packit 6c4009
 # The GNU MP Library is free software; you can redistribute it and/or modify
Packit 6c4009
 # it under the terms of the GNU Lesser General Public License as published by
Packit 6c4009
 # the Free Software Foundation; either version 2.1 of the License, or (at your
Packit 6c4009
 # option) any later version.
Packit 6c4009
Packit 6c4009
 # The GNU MP Library is distributed in the hope that it will be useful, but
Packit 6c4009
 # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
Packit 6c4009
 # or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
Packit 6c4009
 # License for more details.
Packit 6c4009
Packit 6c4009
 # You should have received a copy of the GNU Lesser General Public License
Packit 6c4009
 # along with the GNU MP Library.  If not, see <http://www.gnu.org/licenses/>.
Packit 6c4009
Packit 6c4009
#include <sysdep.h>
Packit 6c4009
Packit 6c4009
        .set noreorder
Packit 6c4009
        .set noat
Packit 6c4009
Packit 6c4009
	.text
Packit 6c4009
Packit 6c4009
LEAF(__udiv_qrnnd, 0)
Packit 6c4009
#ifdef PROF
Packit 6c4009
	ldgp	gp, 0(pv)
Packit 6c4009
	lda	AT, _mcount
Packit 6c4009
	jsr	AT, (AT), _mcount
Packit 6c4009
	.prologue 1
Packit 6c4009
#else
Packit 6c4009
        .prologue 0
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#define cnt	$2
Packit 6c4009
#define tmp	$3
Packit 6c4009
#define rem_ptr	$16
Packit 6c4009
#define n1	$17
Packit 6c4009
#define n0	$18
Packit 6c4009
#define d	$19
Packit 6c4009
#define qb	$20
Packit 6c4009
Packit 6c4009
	ldiq	cnt,16
Packit 6c4009
	blt	d,$largedivisor
Packit 6c4009
Packit 6c4009
$loop1:	cmplt	n0,0,tmp
Packit 6c4009
	addq	n1,n1,n1
Packit 6c4009
	bis	n1,tmp,n1
Packit 6c4009
	addq	n0,n0,n0
Packit 6c4009
	cmpule	d,n1,qb
Packit 6c4009
	subq	n1,d,tmp
Packit 6c4009
	cmovne	qb,tmp,n1
Packit 6c4009
	bis	n0,qb,n0
Packit 6c4009
	cmplt	n0,0,tmp
Packit 6c4009
	addq	n1,n1,n1
Packit 6c4009
	bis	n1,tmp,n1
Packit 6c4009
	addq	n0,n0,n0
Packit 6c4009
	cmpule	d,n1,qb
Packit 6c4009
	subq	n1,d,tmp
Packit 6c4009
	cmovne	qb,tmp,n1
Packit 6c4009
	bis	n0,qb,n0
Packit 6c4009
	cmplt	n0,0,tmp
Packit 6c4009
	addq	n1,n1,n1
Packit 6c4009
	bis	n1,tmp,n1
Packit 6c4009
	addq	n0,n0,n0
Packit 6c4009
	cmpule	d,n1,qb
Packit 6c4009
	subq	n1,d,tmp
Packit 6c4009
	cmovne	qb,tmp,n1
Packit 6c4009
	bis	n0,qb,n0
Packit 6c4009
	cmplt	n0,0,tmp
Packit 6c4009
	addq	n1,n1,n1
Packit 6c4009
	bis	n1,tmp,n1
Packit 6c4009
	addq	n0,n0,n0
Packit 6c4009
	cmpule	d,n1,qb
Packit 6c4009
	subq	n1,d,tmp
Packit 6c4009
	cmovne	qb,tmp,n1
Packit 6c4009
	bis	n0,qb,n0
Packit 6c4009
	subq	cnt,1,cnt
Packit 6c4009
	bgt	cnt,$loop1
Packit 6c4009
	stq	n1,0(rem_ptr)
Packit 6c4009
	bis	$31,n0,$0
Packit 6c4009
	ret	$31,($26),1
Packit 6c4009
Packit 6c4009
$largedivisor:
Packit 6c4009
	and	n0,1,$4
Packit 6c4009
Packit 6c4009
	srl	n0,1,n0
Packit 6c4009
	sll	n1,63,tmp
Packit 6c4009
	or	tmp,n0,n0
Packit 6c4009
	srl	n1,1,n1
Packit 6c4009
Packit 6c4009
	and	d,1,$6
Packit 6c4009
	srl	d,1,$5
Packit 6c4009
	addq	$5,$6,$5
Packit 6c4009
Packit 6c4009
$loop2:	cmplt	n0,0,tmp
Packit 6c4009
	addq	n1,n1,n1
Packit 6c4009
	bis	n1,tmp,n1
Packit 6c4009
	addq	n0,n0,n0
Packit 6c4009
	cmpule	$5,n1,qb
Packit 6c4009
	subq	n1,$5,tmp
Packit 6c4009
	cmovne	qb,tmp,n1
Packit 6c4009
	bis	n0,qb,n0
Packit 6c4009
	cmplt	n0,0,tmp
Packit 6c4009
	addq	n1,n1,n1
Packit 6c4009
	bis	n1,tmp,n1
Packit 6c4009
	addq	n0,n0,n0
Packit 6c4009
	cmpule	$5,n1,qb
Packit 6c4009
	subq	n1,$5,tmp
Packit 6c4009
	cmovne	qb,tmp,n1
Packit 6c4009
	bis	n0,qb,n0
Packit 6c4009
	cmplt	n0,0,tmp
Packit 6c4009
	addq	n1,n1,n1
Packit 6c4009
	bis	n1,tmp,n1
Packit 6c4009
	addq	n0,n0,n0
Packit 6c4009
	cmpule	$5,n1,qb
Packit 6c4009
	subq	n1,$5,tmp
Packit 6c4009
	cmovne	qb,tmp,n1
Packit 6c4009
	bis	n0,qb,n0
Packit 6c4009
	cmplt	n0,0,tmp
Packit 6c4009
	addq	n1,n1,n1
Packit 6c4009
	bis	n1,tmp,n1
Packit 6c4009
	addq	n0,n0,n0
Packit 6c4009
	cmpule	$5,n1,qb
Packit 6c4009
	subq	n1,$5,tmp
Packit 6c4009
	cmovne	qb,tmp,n1
Packit 6c4009
	bis	n0,qb,n0
Packit 6c4009
	subq	cnt,1,cnt
Packit 6c4009
	bgt	cnt,$loop2
Packit 6c4009
Packit 6c4009
	addq	n1,n1,n1
Packit 6c4009
	addq	$4,n1,n1
Packit 6c4009
	bne	$6,$Odd
Packit 6c4009
	stq	n1,0(rem_ptr)
Packit 6c4009
	bis	$31,n0,$0
Packit 6c4009
	ret	$31,($26),1
Packit 6c4009
Packit 6c4009
$Odd:
Packit 6c4009
	/* q' in n0. r' in n1 */
Packit 6c4009
	addq	n1,n0,n1
Packit 6c4009
Packit 6c4009
	cmpult	n1,n0,tmp	# tmp := carry from addq
Packit 6c4009
	subq	n1,d,AT
Packit 6c4009
	addq	n0,tmp,n0
Packit 6c4009
	cmovne	tmp,AT,n1
Packit 6c4009
Packit 6c4009
	cmpult	n1,d,tmp
Packit 6c4009
	addq	n0,1,AT
Packit 6c4009
	cmoveq	tmp,AT,n0
Packit 6c4009
	subq	n1,d,AT
Packit 6c4009
	cmoveq	tmp,AT,n1
Packit 6c4009
Packit 6c4009
	stq	n1,0(rem_ptr)
Packit 6c4009
	bis	$31,n0,$0
Packit 6c4009
	ret	$31,($26),1
Packit 6c4009
Packit 6c4009
	.end	__udiv_qrnnd