xref: /OK3568_Linux_fs/kernel/arch/sh/lib/udiv_qrnnd.S (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0+ WITH GCC-exception-2.0
2*4882a593Smuzhiyun
3*4882a593Smuzhiyun   Copyright (C) 1994, 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
4*4882a593Smuzhiyun   2004, 2005, 2006
5*4882a593Smuzhiyun   Free Software Foundation, Inc.
6*4882a593Smuzhiyun*/
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun!! libgcc routines for the Renesas / SuperH SH CPUs.
9*4882a593Smuzhiyun!! Contributed by Steve Chamberlain.
10*4882a593Smuzhiyun!! sac@cygnus.com
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun!! ashiftrt_r4_x, ___ashrsi3, ___ashlsi3, ___lshrsi3 routines
13*4882a593Smuzhiyun!! recoded in assembly by Toshiyasu Morita
14*4882a593Smuzhiyun!! tm@netcom.com
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun/* SH2 optimizations for ___ashrsi3, ___ashlsi3, ___lshrsi3 and
17*4882a593Smuzhiyun   ELF local label prefixes by J"orn Rennecke
18*4882a593Smuzhiyun   amylaar@cygnus.com  */
19*4882a593Smuzhiyun
20*4882a593Smuzhiyun	/* r0: rn r1: qn */ /* r0: n1 r4: n0 r5: d r6: d1 */ /* r2: __m */
21*4882a593Smuzhiyun	/* n1 < d, but n1 might be larger than d1.  */
22*4882a593Smuzhiyun	.global __udiv_qrnnd_16
23*4882a593Smuzhiyun	.balign 8
24*4882a593Smuzhiyun__udiv_qrnnd_16:
25*4882a593Smuzhiyun	div0u
26*4882a593Smuzhiyun	cmp/hi r6,r0
27*4882a593Smuzhiyun	bt .Lots
28*4882a593Smuzhiyun	.rept 16
29*4882a593Smuzhiyun	div1 r6,r0
30*4882a593Smuzhiyun	.endr
31*4882a593Smuzhiyun	extu.w r0,r1
32*4882a593Smuzhiyun	bt 0f
33*4882a593Smuzhiyun	add r6,r0
34*4882a593Smuzhiyun0:	rotcl r1
35*4882a593Smuzhiyun	mulu.w r1,r5
36*4882a593Smuzhiyun	xtrct r4,r0
37*4882a593Smuzhiyun	swap.w r0,r0
38*4882a593Smuzhiyun	sts macl,r2
39*4882a593Smuzhiyun	cmp/hs r2,r0
40*4882a593Smuzhiyun	sub r2,r0
41*4882a593Smuzhiyun	bt 0f
42*4882a593Smuzhiyun	addc r5,r0
43*4882a593Smuzhiyun	add #-1,r1
44*4882a593Smuzhiyun	bt 0f
45*4882a593Smuzhiyun1:	add #-1,r1
46*4882a593Smuzhiyun	rts
47*4882a593Smuzhiyun	add r5,r0
48*4882a593Smuzhiyun	.balign 8
49*4882a593Smuzhiyun.Lots:
50*4882a593Smuzhiyun	sub r5,r0
51*4882a593Smuzhiyun	swap.w r4,r1
52*4882a593Smuzhiyun	xtrct r0,r1
53*4882a593Smuzhiyun	clrt
54*4882a593Smuzhiyun	mov r1,r0
55*4882a593Smuzhiyun	addc r5,r0
56*4882a593Smuzhiyun	mov #-1,r1
57*4882a593Smuzhiyun	bf/s 1b
58*4882a593Smuzhiyun	 shlr16 r1
59*4882a593Smuzhiyun0:	rts
60*4882a593Smuzhiyun	 nop
61