xref: /linux/arch/sh/lib/udivsi3_i4i-Os.S (revision 4494ce4f)
1*4494ce4fSKuninori Morimoto/* SPDX-License-Identifier: GPL-2.0+ WITH GCC-exception-2.0
2*4494ce4fSKuninori Morimoto *
3*4494ce4fSKuninori Morimoto * Copyright (C) 2006 Free Software Foundation, Inc.
4*4494ce4fSKuninori Morimoto */
53b041227STakashi YOSHII
63b041227STakashi YOSHII/* Moderately Space-optimized libgcc routines for the Renesas SH /
73b041227STakashi YOSHII   STMicroelectronics ST40 CPUs.
83b041227STakashi YOSHII   Contributed by J"orn Rennecke joern.rennecke@st.com.  */
93b041227STakashi YOSHII
103b041227STakashi YOSHII/* Size: 186 bytes jointly for udivsi3_i4i and sdivsi3_i4i
113b041227STakashi YOSHII   sh4-200 run times:
123b041227STakashi YOSHII   udiv small divisor: 55 cycles
133b041227STakashi YOSHII   udiv large divisor: 52 cycles
143b041227STakashi YOSHII   sdiv small divisor, positive result: 59 cycles
153b041227STakashi YOSHII   sdiv large divisor, positive result: 56 cycles
163b041227STakashi YOSHII   sdiv small divisor, negative result: 65 cycles (*)
173b041227STakashi YOSHII   sdiv large divisor, negative result: 62 cycles (*)
183b041227STakashi YOSHII   (*): r2 is restored in the rts delay slot and has a lingering latency
193b041227STakashi YOSHII        of two more cycles.  */
203b041227STakashi YOSHII	.balign 4
213b041227STakashi YOSHII	.global	__udivsi3_i4i
223b041227STakashi YOSHII	.global	__udivsi3_i4
233b041227STakashi YOSHII	.set	__udivsi3_i4, __udivsi3_i4i
243b041227STakashi YOSHII	.type	__udivsi3_i4i, @function
253b041227STakashi YOSHII	.type	__sdivsi3_i4i, @function
263b041227STakashi YOSHII__udivsi3_i4i:
273b041227STakashi YOSHII	sts pr,r1
283b041227STakashi YOSHII	mov.l r4,@-r15
293b041227STakashi YOSHII	extu.w r5,r0
303b041227STakashi YOSHII	cmp/eq r5,r0
313b041227STakashi YOSHII	swap.w r4,r0
323b041227STakashi YOSHII	shlr16 r4
333b041227STakashi YOSHII	bf/s large_divisor
343b041227STakashi YOSHII	div0u
353b041227STakashi YOSHII	mov.l r5,@-r15
363b041227STakashi YOSHII	shll16 r5
373b041227STakashi YOSHIIsdiv_small_divisor:
383b041227STakashi YOSHII	div1 r5,r4
393b041227STakashi YOSHII	bsr div6
403b041227STakashi YOSHII	div1 r5,r4
413b041227STakashi YOSHII	div1 r5,r4
423b041227STakashi YOSHII	bsr div6
433b041227STakashi YOSHII	div1 r5,r4
443b041227STakashi YOSHII	xtrct r4,r0
453b041227STakashi YOSHII	xtrct r0,r4
463b041227STakashi YOSHII	bsr div7
473b041227STakashi YOSHII	swap.w r4,r4
483b041227STakashi YOSHII	div1 r5,r4
493b041227STakashi YOSHII	bsr div7
503b041227STakashi YOSHII	div1 r5,r4
513b041227STakashi YOSHII	xtrct r4,r0
523b041227STakashi YOSHII	mov.l @r15+,r5
533b041227STakashi YOSHII	swap.w r0,r0
543b041227STakashi YOSHII	mov.l @r15+,r4
553b041227STakashi YOSHII	jmp @r1
563b041227STakashi YOSHII	rotcl r0
573b041227STakashi YOSHIIdiv7:
583b041227STakashi YOSHII	div1 r5,r4
593b041227STakashi YOSHIIdiv6:
603b041227STakashi YOSHII	            div1 r5,r4; div1 r5,r4; div1 r5,r4
613b041227STakashi YOSHII	div1 r5,r4; div1 r5,r4; rts;        div1 r5,r4
623b041227STakashi YOSHII
633b041227STakashi YOSHIIdivx3:
643b041227STakashi YOSHII	rotcl r0
653b041227STakashi YOSHII	div1 r5,r4
663b041227STakashi YOSHII	rotcl r0
673b041227STakashi YOSHII	div1 r5,r4
683b041227STakashi YOSHII	rotcl r0
693b041227STakashi YOSHII	rts
703b041227STakashi YOSHII	div1 r5,r4
713b041227STakashi YOSHII
723b041227STakashi YOSHIIlarge_divisor:
733b041227STakashi YOSHII	mov.l r5,@-r15
743b041227STakashi YOSHIIsdiv_large_divisor:
753b041227STakashi YOSHII	xor r4,r0
763b041227STakashi YOSHII	.rept 4
773b041227STakashi YOSHII	rotcl r0
783b041227STakashi YOSHII	bsr divx3
793b041227STakashi YOSHII	div1 r5,r4
803b041227STakashi YOSHII	.endr
813b041227STakashi YOSHII	mov.l @r15+,r5
823b041227STakashi YOSHII	mov.l @r15+,r4
833b041227STakashi YOSHII	jmp @r1
843b041227STakashi YOSHII	rotcl r0
853b041227STakashi YOSHII
863b041227STakashi YOSHII	.global	__sdivsi3_i4i
873b041227STakashi YOSHII	.global __sdivsi3_i4
883b041227STakashi YOSHII	.global __sdivsi3
893b041227STakashi YOSHII	.set	__sdivsi3_i4, __sdivsi3_i4i
903b041227STakashi YOSHII	.set	__sdivsi3, __sdivsi3_i4i
913b041227STakashi YOSHII__sdivsi3_i4i:
923b041227STakashi YOSHII	mov.l r4,@-r15
933b041227STakashi YOSHII	cmp/pz r5
943b041227STakashi YOSHII	mov.l r5,@-r15
953b041227STakashi YOSHII	bt/s pos_divisor
963b041227STakashi YOSHII	cmp/pz r4
973b041227STakashi YOSHII	neg r5,r5
983b041227STakashi YOSHII	extu.w r5,r0
993b041227STakashi YOSHII	bt/s neg_result
1003b041227STakashi YOSHII	cmp/eq r5,r0
1013b041227STakashi YOSHII	neg r4,r4
1023b041227STakashi YOSHIIpos_result:
1033b041227STakashi YOSHII	swap.w r4,r0
1043b041227STakashi YOSHII	bra sdiv_check_divisor
1053b041227STakashi YOSHII	sts pr,r1
1063b041227STakashi YOSHIIpos_divisor:
1073b041227STakashi YOSHII	extu.w r5,r0
1083b041227STakashi YOSHII	bt/s pos_result
1093b041227STakashi YOSHII	cmp/eq r5,r0
1103b041227STakashi YOSHII	neg r4,r4
1113b041227STakashi YOSHIIneg_result:
1123b041227STakashi YOSHII	mova negate_result,r0
1133b041227STakashi YOSHII	;
1143b041227STakashi YOSHII	mov r0,r1
1153b041227STakashi YOSHII	swap.w r4,r0
1163b041227STakashi YOSHII	lds r2,macl
1173b041227STakashi YOSHII	sts pr,r2
1183b041227STakashi YOSHIIsdiv_check_divisor:
1193b041227STakashi YOSHII	shlr16 r4
1203b041227STakashi YOSHII	bf/s sdiv_large_divisor
1213b041227STakashi YOSHII	div0u
1223b041227STakashi YOSHII	bra sdiv_small_divisor
1233b041227STakashi YOSHII	shll16 r5
1243b041227STakashi YOSHII	.balign 4
1253b041227STakashi YOSHIInegate_result:
1263b041227STakashi YOSHII	neg r0,r0
1273b041227STakashi YOSHII	jmp @r2
1283b041227STakashi YOSHII	sts macl,r2
129