;  Low level integer divide, multiply, remainder, etc routines for the HPPA.
;  Copyright (C) 1995 Free Software Foundation, Inc.

;  This file is part of GNU CC.

;  GNU CC is free software; you can redistribute it and/or modify
;  it under the terms of the GNU General Public License as published by
;  the Free Software Foundation; either version 2, or (at your option)
;  any later version.

; In addition to the permissions in the GNU General Public License, the
; Free Software Foundation gives you unlimited permission to link the
; compiled version of this file with other programs, and to distribute
; those programs without any restriction coming from the use of this
; file.  (The General Public License restrictions do apply in other
; respects; for example, they cover modification of the file, and
; distribution when not linked into another program.)

;  GNU CC is distributed in the hope that it will be useful,
;  but WITHOUT ANY WARRANTY; without even the implied warranty of
;  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;  GNU General Public License for more details.

;  You should have received a copy of the GNU General Public License
;  along with GNU CC; see the file COPYING.  If not, write to
;  the Free Software Foundation, 59 Temple Place - Suite 330,
;  Boston, MA 02111-1307, USA.

#ifdef L_dyncall
	.space	$TEXT$
	.subspa	$MILLICODE$,quad=0,align=8,access=0x2c,sort=8
	.export	$$dyncall
$$dyncall
	.proc
	.callinfo	frame=0,no_calls
	.entry
	bb,>=,n	%r22,30,L$1		; branch if not plabel address
	depi	0,31,2,%r22		; clear the two least significant bits
	ldw	4(%sr0,%r22),%r19	; load new LTP value
	ldw	0(%sr0,%r22),%r22	; load address of target
L$1	ldsid	(%sr0,%r22),%r1		; get the "space ident" selected by r22
	mtsp	%r1,%sr0		; move that space identifier into sr0
	be	0(%sr0,%r22)		; branch to the real target
	stw	%r2,-24(%sr0,%r30)	; save return address into frame marker
	.exit
	.procend
#endif


#ifdef L_multiply
#define	op0	%r26
#define	op1	%r25
#define res	%r29
#define ret	%r31
#define tmp	%r1
	.space	$TEXT$
	.subspa	$MILLICODE$,quad=0,align=8,access=0x2c,sort=8
	.align 4
	.export	$$mulU
	.export	$$mulI
$$mulU
$$mulI
	.proc
	.callinfo	frame=0,no_calls
	.entry
	addi,tr		0,%r0,res	; clear out res, skip next insn
L$loop	zdep		op1,26,27,op1	; shift up op1 by 5
L$lo	zdep		op0,30,5,tmp	; extract next 5 bits and shift up
	blr		tmp,%r0
	extru		op0,26,27,op0	; shift down op0 by 5
L$0	comib,<>	0,op0,L$lo
	zdep		op1,26,27,op1	; shift up op1 by 5
	bv		%r0(ret)
	nop
L$1	b		L$loop
	addl		op1,res,res
	nop
	nop
L$2	b		L$loop
	sh1addl		op1,res,res
	nop
	nop
L$3	sh1addl		op1,op1,tmp	; 3x
	b		L$loop
	addl		tmp,res,res
	nop
L$4	b		L$loop
	sh2addl		op1,res,res
	nop
	nop
L$5	sh2addl		op1,op1,tmp	; 5x
	b		L$loop
	addl		tmp,res,res
	nop
L$6	sh1addl		op1,op1,tmp	; 3x
	b		L$loop
	sh1addl		tmp,res,res
	nop
L$7	zdep		op1,28,29,tmp	; 8x
	sub		tmp,op1,tmp	; 7x
	b		L$loop
	addl		tmp,res,res
L$8	b		L$loop
	sh3addl		op1,res,res
	nop
	nop
L$9	sh3addl		op1,op1,tmp	; 9x
	b		L$loop
	addl		tmp,res,res
	nop
L$10	sh2addl		op1,op1,tmp	; 5x
	b		L$loop
	sh1addl		tmp,res,res
	nop
L$11	sh2addl		op1,op1,tmp	; 5x
	sh1addl		tmp,op1,tmp	; 11x
	b		L$loop
	addl		tmp,res,res
L$12	sh1addl		op1,op1,tmp	; 3x
	b		L$loop
	sh2addl		tmp,res,res
	nop
L$13	sh1addl		op1,op1,tmp	; 3x
	sh2addl		tmp,op1,tmp	; 13x
	b		L$loop
	addl		tmp,res,res
L$14	zdep		op1,28,29,tmp	; 8x
	sub		tmp,op1,tmp	; 7x
	b		L$loop
	sh1addl		tmp,res,res
L$15	zdep		op1,27,28,tmp	; 16x
	sub		tmp,op1,tmp	; 15x
	b		L$loop
	addl		tmp,res,res
L$16	zdep		op1,27,28,tmp	; 16x
	b		L$loop
	addl		tmp,res,res
	nop
L$17	zdep		op1,27,28,tmp	; 16x
	addl		tmp,op1,tmp	; 17x
	b		L$loop
	addl		tmp,res,res
L$18	sh3addl		op1,op1,tmp	; 9x
	b		L$loop
	sh1addl		tmp,res,res
	nop
L$19	sh3addl		op1,op1,tmp	; 9x
	sh1addl		tmp,op1,tmp	; 19x
	b		L$loop
	addl		tmp,res,res
L$20	sh2addl		op1,op1,tmp	; 5x
	b		L$loop
	sh2addl		tmp,res,res
	nop
L$21	sh2addl		op1,op1,tmp	; 5x
	sh2addl		tmp,op1,tmp	; 21x
	b		L$loop
	addl		tmp,res,res
L$22	sh2addl		op1,op1,tmp	; 5x
	sh1addl		tmp,op1,tmp	; 11x
	b		L$loop
	sh1addl		tmp,res,res
L$23	sh1addl		op1,op1,tmp	; 3x
	sh3addl		tmp,res,res	; += 8x3
	b		L$loop
	sub		res,op1,res	; -= x
L$24	sh1addl		op1,op1,tmp	; 3x
	b		L$loop
	sh3addl		tmp,res,res	; += 8x3
	nop
L$25	sh2addl		op1,op1,tmp	; 5x
	sh2addl		tmp,tmp,tmp	; 25x
	b		L$loop
	addl		tmp,res,res
L$26	sh1addl		op1,op1,tmp	; 3x
	sh2addl		tmp,op1,tmp	; 13x
	b		L$loop
	sh1addl		tmp,res,res	; += 2x13
L$27	sh1addl		op1,op1,tmp	; 3x
	sh3addl		tmp,tmp,tmp	; 27x
	b		L$loop
	addl		tmp,res,res
L$28	zdep		op1,28,29,tmp	; 8x
	sub		tmp,op1,tmp	; 7x
	b		L$loop
	sh2addl		tmp,res,res	; += 4x7
L$29	sh1addl		op1,op1,tmp	; 3x
	sub		res,tmp,res	; -= 3x
	b		L$foo
	zdep		op1,26,27,tmp	; 32x
L$30	zdep		op1,27,28,tmp	; 16x
	sub		tmp,op1,tmp	; 15x
	b		L$loop
	sh1addl		tmp,res,res	; += 2x15
L$31	zdep		op1,26,27,tmp	; 32x
	sub		tmp,op1,tmp	; 31x
L$foo	b		L$loop
	addl		tmp,res,res
	.exit
	.procend
#endif


#ifdef L_divU
#define dividend %r26
#define divisor %r25
#define tmp %r1
#define quotient %r29
#define ret %r31
	.space	$TEXT$
	.subspa	$MILLICODE$,quad=0,align=8,access=0x2c,sort=8
	.align 4
	.export	$$divU
$$divU
	.proc
	.callinfo	frame=0,no_calls
	.entry
	comb,<		divisor,0,L$largedivisor
	 sub		%r0,divisor,%r1		; clear cy as side-effect
	ds		%r0,%r1,%r0
	addc		dividend,dividend,dividend
	ds		%r0,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,quotient
	ds		%r1,divisor,%r1
	bv		0(ret)
	addc		quotient,quotient,quotient
L$largedivisor
	comclr,<<	dividend,divisor,quotient
	ldi		1,quotient
	bv,n		0(ret)
	.exit
	.procend
#endif


#ifdef L_remU
#define dividend %r26
#define divisor %r25
#define quotient %r29
#define tmp %r1
#define ret %r31
	.space	$TEXT$
	.subspa	$MILLICODE$,quad=0,align=8,access=0x2c,sort=8
	.align 4
	.export	$$remU
$$remU
	.proc
	.callinfo	frame=0,no_calls
	.entry
	comb,<		divisor,0,L$largedivisor
	 sub		%r0,divisor,%r1		; clear cy as side-effect
	ds		%r0,%r1,%r0
	addc		dividend,dividend,dividend
	ds		%r0,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,quotient
	ds		%r1,divisor,%r1
	comclr,>=	%r1,%r0,%r0
	addl		%r1,divisor,%r1
	bv		0(ret)
	copy		%r1,quotient
L$largedivisor
	sub,>>=		dividend,divisor,quotient
	copy		dividend,quotient
	bv,n		0(ret)
	.exit
	.procend
#endif


#ifdef L_divI
#define dividend %r26
#define divisor %r25
#define quotient %r29
#define tmp %r1
#define ret %r31
	.space	$TEXT$
	.subspa	$MILLICODE$,quad=0,align=8,access=0x2c,sort=8
	.align 4
	.export	$$divI
$$divI
	.proc
	.callinfo	frame=0,no_calls
	.entry
	xor		dividend,divisor,quotient	; result sign
	comclr,>=	divisor,%r0,%r0			; get absolute values
	sub		%r0,divisor,divisor
	comclr,>=	dividend,%r0,%r0
	sub		%r0,dividend,dividend

	comb,<		divisor,0,L$largedivisor
	 sub		%r0,divisor,%r1		; clear cy as side-effect
	ds		%r0,%r1,%r0
	addc		dividend,dividend,dividend
	ds		%r0,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	comclr,>=	%r1,%r0,%r0
	addl		%r1,divisor,%r1
	comclr,>=	quotient,%r0,%r0	; skip of no need to negate
	sub		%r0,dividend,dividend
	bv		0(ret)
	copy		dividend,quotient
L$largedivisor
	comclr,<<	dividend,divisor,quotient
	ldi		1,quotient
	bv,n		0(ret)
	.exit
	.procend
#endif


#ifdef L_remI
#define dividend %r26
#define divisor %r25
#define quotient %r29
#define tmp %r1
#define ret %r31
	.space	$TEXT$
	.subspa	$MILLICODE$,quad=0,align=8,access=0x2c,sort=8
	.align 4
	.export	$$remI
$$remI
	.proc
	.callinfo	frame=0,no_calls
	.entry
	xor		dividend,%r0,quotient		; result sign
	comclr,>=	divisor,%r0,%r0			; get absolute values
	sub		%r0,divisor,divisor
	comclr,>=	dividend,%r0,%r0
	sub		%r0,dividend,dividend

	comb,<		divisor,0,L$largedivisor
	 sub		%r0,divisor,%r1		; clear cy as side-effect
	ds		%r0,%r1,%r0
	addc		dividend,dividend,dividend
	ds		%r0,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	ds		%r1,divisor,%r1
	addc		dividend,dividend,dividend
	comclr,>=	%r1,%r0,%r0
	addl		%r1,divisor,%r1
	comclr,>=	quotient,%r0,%r0	; skip of no need to negate
	sub		%r0,%r1,%r1
	bv		0(ret)
	copy		%r1,quotient
L$largedivisor
	sub,>>=		dividend,divisor,quotient
	copy		dividend,quotient
	bv,n		0(ret)
	.exit
	.procend
#endif


#if defined (L_divU_3) && !defined (SMALL_LIB)
#undef L_divU_3
#define dividend %r26
#define divisor %r25
#define tmp %r1
#define result %r29
#define ret %r31
	.space	$TEXT$
	.subspa	$MILLICODE$,quad=0,align=8,access=0x2c,sort=8
	.align 4
	.export	$$divU_3
$$divU_3
	.proc
	.callinfo	frame=0,no_calls
	.entry
	sh2add	%r26,%r26,%r29		; r29 = lo(101 x r)
	shd	%r0,%r26,30,%r1		;  r1 = hi(100 x r)
	addc	%r1,%r0,%r1		;  r1 = hi(101 x r)
; r in r1,,r29
	zdep	%r29,27,28,%r25		; r25 = lo(10000 x r)
	add	%r25,%r29,%r25		; r25 = lo(10001 x r)
	shd	%r1,%r29,28,%r29	; r29 = hi(10000 x r)
	addc	%r29,%r1,%r29		; r29 = hi(10001 x r)
; r in r29,,r25
	zdep	%r25,23,24,%r1		;  r1 = lo(100000000 x r)
	add	%r1,%r25,%r1		;  r1 = lo(100000001 x r)
	shd	%r29,%r25,24,%r25	; r25 = hi(100000000 x r)
	addc	%r25,%r29,%r25		; r25 = hi(100000001 x r)
; r in r25,,r1
	zdep	%r1,15,16,%r29
	add	%r29,%r1,%r29
	shd	%r25,%r1,16,%r1
	addc	%r1,%r25,%r1
; r in r1,,r29
	sh1add	%r29,%r26,%r0		;  r0 = lo(10 x r) + dividend
	shd	%r1,%r29,31,%r29	; r29 = hi(10 x r)
	addc	%r29,%r0,%r29
	bv	0(ret)
	extru	%r29,30,31,result
	.exit
	.procend
#endif


#if defined (L_divU_5) && !defined (SMALL_LIB)
#undef L_divU_5
#define dividend %r26
#define divisor %r25
#define tmp %r1
#define result %r29
#define ret %r31
	.space	$TEXT$
	.subspa	$MILLICODE$,quad=0,align=8,access=0x2c,sort=8
	.align 4
	.export	$$divU_5
$$divU_5
	.proc
	.callinfo	frame=0,no_calls
	.entry
	sh1add	%r26,%r26,%r29		; r29 = lo(11 x r)
	shd	%r0,%r26,31,%r1		;  r1 = hi(10 x r)
	addc	%r1,%r0,%r1		;  r1 = hi(11 x r)
; r in r1,,r29
	zdep	%r29,27,28,%r25		; r25 = lo(10000 x r)
	add	%r25,%r29,%r25		; r25 = lo(10001 x r)
	shd	%r1,%r29,28,%r29	; r29 = hi(10000 x r)
	addc	%r29,%r1,%r29		; r29 = hi(10001 x r)
; r in r29,,r25
	zdep	%r25,23,24,%r1		;  r1 = lo(100000000 x r)
	add	%r1,%r25,%r1		;  r1 = lo(100000001 x r)
	shd	%r29,%r25,24,%r25	; r25 = hi(100000000 x r)
	addc	%r25,%r29,%r25		; r25 = hi(100000001 x r)
; r in r25,,r1
	zdep	%r1,15,16,%r29
	add	%r29,%r1,%r29
	shd	%r25,%r1,16,%r1
	addc	%r1,%r25,%r1
; r in r1,,r29
	sh2add	%r29,%r26,%r0		;  r0 = lo(1000 x r) + dividend
	shd	%r1,%r29,30,%r29	; r29 = hi(1000 x r)
	addc	%r29,%r0,%r29
	bv	0(ret)
	extru	%r29,29,30,result
	.exit
	.procend
#endif


#if defined (L_divU_6) && !defined (SMALL_LIB)
#undef L_divU_6
#define dividend %r26
#define divisor %r25
#define tmp %r1
#define result %r29
#define ret %r31
	.space	$TEXT$
	.subspa	$MILLICODE$,quad=0,align=8,access=0x2c,sort=8
	.align 4
	.export	$$divU_6
$$divU_6
	.proc
	.callinfo	frame=0,no_calls
	.entry
	sh2add	%r26,%r26,%r29		; r29 = lo(101 x r)
	shd	%r0,%r26,30,%r1		;  r1 = hi(100 x r)
	addc	%r1,%r0,%r1		;  r1 = hi(101 x r)
; r in r1,,r29
	zdep	%r29,27,28,%r25		; r25 = lo(10000 x r)
	add	%r25,%r29,%r25		; r25 = lo(10001 x r)
	shd	%r1,%r29,28,%r29	; r29 = hi(10000 x r)
	addc	%r29,%r1,%r29		; r29 = hi(10001 x r)
; r in r29,,r25
	zdep	%r25,23,24,%r1		;  r1 = lo(100000000 x r)
	add	%r1,%r25,%r1		;  r1 = lo(100000001 x r)
	shd	%r29,%r25,24,%r25	; r25 = hi(100000000 x r)
	addc	%r25,%r29,%r25		; r25 = hi(100000001 x r)
; r in r25,,r1
	zdep	%r1,15,16,%r29
	add	%r29,%r1,%r29
	shd	%r25,%r1,16,%r1
	addc	%r1,%r25,%r1
; r in r1,,r29
	sh1add	%r29,%r26,%r0		;  r0 = lo(10 x r) + dividend
	shd	%r1,%r29,31,%r29	; r29 = hi(10 x r)
	addc	%r29,%r0,%r29
	bv	0(ret)
	extru	%r29,29,30,result
	.exit
	.procend
#endif


#if defined (L_divU_9) && !defined (SMALL_LIB)
#undef L_divU_9
#define dividend %r26
#define divisor %r25
#define tmp %r1
#define result %r29
#define ret %r31
	.space	$TEXT$
	.subspa	$MILLICODE$,quad=0,align=8,access=0x2c,sort=8
	.align 4
	.export	$$divU_9
$$divU_9
	.proc
	.callinfo	frame=0,no_calls
	.entry
	zdep	%r26,28,29,%r29
	sub	%r29,%r26,%r29
	shd	0,%r26,29,%r1
	subb	%r1,0,%r1		/* 111 */

	zdep	%r29,25,26,%r25
	add	%r25,%r29,%r25
	shd	%r1,%r29,26,%r29
	addc	%r29,%r1,%r29		/* 111000111 */

	sh3add	%r25,%r26,%r1
	shd	%r29,%r25,29,%r25
	addc	%r25,0,%r25		/* 111000111001 */

	zdep	%r1,16,17,%r29
	sub	%r29,%r1,%r29
	shd	%r25,%r1,17,%r1
	subb	%r1,%r25,%r1		/* 111000111000111000111000111 */

	sh3add	%r29,%r26,%r0
	shd	%r1,%r29,29,%r29
	addc	%r29,0,%r29		/* 111000111000111000111000111001 */
	bv	0(ret)
	extru	%r29,30,31,result
	.exit
	.procend
#endif


#if defined (L_divU_10) && !defined (SMALL_LIB)
#undef L_divU_10
#define dividend %r26
#define divisor %r25
#define tmp %r1
#define result %r29
#define ret %r31
	.space	$TEXT$
	.subspa	$MILLICODE$,quad=0,align=8,access=0x2c,sort=8
	.align 4
	.export	$$divU_10
$$divU_10
	.proc
	.callinfo	frame=0,no_calls
	.entry
	sh1add	%r26,%r26,%r29		; r29 = lo(11 x r)
	shd	%r0,%r26,31,%r1		;  r1 = hi(10 x r)
	addc	%r1,%r0,%r1		;  r1 = hi(11 x r)
; r in r1,,r29
	zdep	%r29,27,28,%r25		; r25 = lo(10000 x r)
	add	%r25,%r29,%r25		; r25 = lo(10001 x r)
	shd	%r1,%r29,28,%r29	; r29 = hi(10000 x r)
	addc	%r29,%r1,%r29		; r29 = hi(10001 x r)
; r in r29,,r25
	zdep	%r25,23,24,%r1		;  r1 = lo(100000000 x r)
	add	%r1,%r25,%r1		;  r1 = lo(100000001 x r)
	shd	%r29,%r25,24,%r25	; r25 = hi(100000000 x r)
	addc	%r25,%r29,%r25		; r25 = hi(100000001 x r)
; r in r25,,r1
	zdep	%r1,15,16,%r29
	add	%r29,%r1,%r29
	shd	%r25,%r1,16,%r1
	addc	%r1,%r25,%r1
; r in r1,,r29
	sh2add	%r29,%r26,%r0		;  r0 = lo(1000 x r) + dividend
	shd	%r1,%r29,30,%r29	; r29 = hi(1000 x r)
	addc	%r29,%r0,%r29
	bv	0(ret)
	extru	%r29,28,29,result
	.exit
	.procend
#endif


#if defined (L_divU_12) && !defined (SMALL_LIB)
#undef L_divU_12
#define dividend %r26
#define divisor %r25
#define tmp %r1
#define result %r29
#define ret %r31
	.space	$TEXT$
	.subspa	$MILLICODE$,quad=0,align=8,access=0x2c,sort=8
	.align 4
	.export	$$divU_12
$$divU_12
	.proc
	.callinfo	frame=0,no_calls
	.entry
	sh2add	%r26,%r26,%r29		; r29 = lo(101 x r)
	shd	%r0,%r26,30,%r1		;  r1 = hi(100 x r)
	addc	%r1,%r0,%r1		;  r1 = hi(101 x r)
; r in r1,,r29
	zdep	%r29,27,28,%r25		; r25 = lo(10000 x r)
	add	%r25,%r29,%r25		; r25 = lo(10001 x r)
	shd	%r1,%r29,28,%r29	; r29 = hi(10000 x r)
	addc	%r29,%r1,%r29		; r29 = hi(10001 x r)
; r in r29,,r25
	zdep	%r25,23,24,%r1		;  r1 = lo(100000000 x r)
	add	%r1,%r25,%r1		;  r1 = lo(100000001 x r)
	shd	%r29,%r25,24,%r25	; r25 = hi(100000000 x r)
	addc	%r25,%r29,%r25		; r25 = hi(100000001 x r)
; r in r25,,r1
	zdep	%r1,15,16,%r29
	add	%r29,%r1,%r29
	shd	%r25,%r1,16,%r1
	addc	%r1,%r25,%r1
; r in r1,,r29
	sh1add	%r29,%r26,%r0		;  r0 = lo(10 x r) + dividend
	shd	%r1,%r29,31,%r29	; r29 = hi(10 x r)
	addc	%r29,%r0,%r29
	bv	0(ret)
	extru	%r29,28,29,result
	.exit
	.procend
#endif


#ifdef L_divU_3
	.space	$TEXT$
	.subspa	$MILLICODE$,quad=0,align=8,access=0x2c,sort=8
	.align	4
	.export	$$divU_3
$$divU_3
	.proc
	.callinfo	frame=0,no_calls
	.entry
	b		$$divU
	ldi		3,%r25
	.exit
	.procend
	.import		$$divU,MILLICODE
#endif

#ifdef L_divU_5
	.space	$TEXT$
	.subspa	$MILLICODE$,quad=0,align=8,access=0x2c,sort=8
	.align	4
	.export	$$divU_5
$$divU_5
	.proc
	.callinfo	frame=0,no_calls
	.entry
	b		$$divU
	ldi		5,%r25
	.exit
	.procend
	.import		$$divU,MILLICODE
#endif

#ifdef L_divU_6
	.space	$TEXT$
	.subspa	$MILLICODE$,quad=0,align=8,access=0x2c,sort=8
	.align	4
	.export	$$divU_6
$$divU_6
	.proc
	.callinfo	frame=0,no_calls
	.entry
	b		$$divU
	ldi		6,%r25
	.exit
	.procend
	.import		$$divU,MILLICODE
#endif

#ifdef L_divU_7
	.space	$TEXT$
	.subspa	$MILLICODE$,quad=0,align=8,access=0x2c,sort=8
	.align	4
	.export	$$divU_7
$$divU_7
	.proc
	.callinfo	frame=0,no_calls
	.entry
	b		$$divU
	ldi		7,%r25
	.exit
	.procend
	.import		$$divU,MILLICODE
#endif

#ifdef L_divU_9
	.space	$TEXT$
	.subspa	$MILLICODE$,quad=0,align=8,access=0x2c,sort=8
	.align	4
	.export	$$divU_9
$$divU_9
	.proc
	.callinfo	frame=0,no_calls
	.entry
	b		$$divU
	ldi		9,%r25
	.exit
	.procend
	.import		$$divU,MILLICODE
#endif

#ifdef L_divU_10
	.space	$TEXT$
	.subspa	$MILLICODE$,quad=0,align=8,access=0x2c,sort=8
	.align	4
	.export	$$divU_10
$$divU_10
	.proc
	.callinfo	frame=0,no_calls
	.entry
	b		$$divU
	ldi		10,%r25
	.exit
	.procend
	.import		$$divU,MILLICODE
#endif

#ifdef L_divU_12
	.space	$TEXT$
	.subspa	$MILLICODE$,quad=0,align=8,access=0x2c,sort=8
	.align	4
	.export	$$divU_12
$$divU_12
	.proc
	.callinfo	frame=0,no_calls
	.entry
	b		$$divU
	ldi		12,%r25
	.exit
	.procend
	.import		$$divU,MILLICODE
#endif

#ifdef L_divU_14
	.space	$TEXT$
	.subspa	$MILLICODE$,quad=0,align=8,access=0x2c,sort=8
	.align	4
	.export	$$divU_14
$$divU_14
	.proc
	.callinfo	frame=0,no_calls
	.entry
	b		$$divU
	ldi		14,%r25
	.exit
	.procend
	.import		$$divU,MILLICODE
#endif

#ifdef L_divU_15
	.space	$TEXT$
	.subspa	$MILLICODE$,quad=0,align=8,access=0x2c,sort=8
	.align	4
	.export	$$divU_15
$$divU_15
	.proc
	.callinfo	frame=0,no_calls
	.entry
	b		$$divU
	ldi		15,%r25
	.exit
	.procend
	.import		$$divU,MILLICODE
#endif

#ifdef L_divI_3
	.space	$TEXT$
	.subspa	$MILLICODE$,quad=0,align=8,access=0x2c,sort=8
	.align	4
	.export	$$divI_3
$$divI_3
	.proc
	.callinfo	frame=0,no_calls
	.entry
	b		$$divI
	ldi		3,%r25
	.exit
	.procend
	.import		$$divI,MILLICODE
#endif

#ifdef L_divI_5
	.space	$TEXT$
	.subspa	$MILLICODE$,quad=0,align=8,access=0x2c,sort=8
	.align	4
	.export	$$divI_5
$$divI_5
	.proc
	.callinfo	frame=0,no_calls
	.entry
	b		$$divI
	ldi		5,%r25
	.exit
	.procend
	.import		$$divI,MILLICODE
#endif

#ifdef L_divI_6
	.space	$TEXT$
	.subspa	$MILLICODE$,quad=0,align=8,access=0x2c,sort=8
	.align	4
	.export	$$divI_6
$$divI_6
	.proc
	.callinfo	frame=0,no_calls
	.entry
	b		$$divI
	ldi		6,%r25
	.exit
	.procend
	.import		$$divI,MILLICODE
#endif

#ifdef L_divI_7
	.space	$TEXT$
	.subspa	$MILLICODE$,quad=0,align=8,access=0x2c,sort=8
	.align	4
	.export	$$divI_7
$$divI_7
	.proc
	.callinfo	frame=0,no_calls
	.entry
	b		$$divI
	ldi		7,%r25
	.exit
	.procend
	.import		$$divI,MILLICODE
#endif

#ifdef L_divI_9
	.space	$TEXT$
	.subspa	$MILLICODE$,quad=0,align=8,access=0x2c,sort=8
	.align	4
	.export	$$divI_9
$$divI_9
	.proc
	.callinfo	frame=0,no_calls
	.entry
	b		$$divI
	ldi		9,%r25
	.exit
	.procend
	.import		$$divI,MILLICODE
#endif

#ifdef L_divI_10
	.space	$TEXT$
	.subspa	$MILLICODE$,quad=0,align=8,access=0x2c,sort=8
	.align	4
	.export	$$divI_10
$$divI_10
	.proc
	.callinfo	frame=0,no_calls
	.entry
	b		$$divI
	ldi		10,%r25
	.exit
	.procend
	.import		$$divI,MILLICODE
#endif

#ifdef L_divI_12
	.space	$TEXT$
	.subspa	$MILLICODE$,quad=0,align=8,access=0x2c,sort=8
	.align	4
	.export	$$divI_12
$$divI_12
	.proc
	.callinfo	frame=0,no_calls
	.entry
	b		$$divI
	ldi		12,%r25
	.exit
	.procend
	.import		$$divI,MILLICODE
#endif

#ifdef L_divI_14
	.space	$TEXT$
	.subspa	$MILLICODE$,quad=0,align=8,access=0x2c,sort=8
	.align	4
	.export	$$divI_14
$$divI_14
	.proc
	.callinfo	frame=0,no_calls
	.entry
	b		$$divI
	ldi		14,%r25
	.exit
	.procend
	.import		$$divI,MILLICODE
#endif

#ifdef L_divI_15
	.space	$TEXT$
	.subspa	$MILLICODE$,quad=0,align=8,access=0x2c,sort=8
	.align	4
	.export	$$divI_15
$$divI_15
	.proc
	.callinfo	frame=0,no_calls
	.entry
	b		$$divI
	ldi		15,%r25
	.exit
	.procend
	.import		$$divI,MILLICODE
#endif
