xref: /freebsd-src/lib/libc/arm/gen/divsi3.S (revision 1d386b48a555f61cb7325543adbbb5c3f3407a66)
12357939bSOlivier Houchard/*	$NetBSD: divsi3.S,v 1.4 2003/04/05 23:27:15 bjh21 Exp $	*/
22357939bSOlivier Houchard
32357939bSOlivier Houchard/*
42357939bSOlivier Houchard * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
52357939bSOlivier Houchard * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
62357939bSOlivier Houchard * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
72357939bSOlivier Houchard * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
82357939bSOlivier Houchard * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
92357939bSOlivier Houchard * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
102357939bSOlivier Houchard * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
112357939bSOlivier Houchard * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
122357939bSOlivier Houchard * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
132357939bSOlivier Houchard * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
142357939bSOlivier Houchard * SUCH DAMAGE.
152357939bSOlivier Houchard */
162357939bSOlivier Houchard
172357939bSOlivier Houchard#include <machine/asm.h>
182357939bSOlivier Houchard/*
192357939bSOlivier Houchard * stack is aligned as there's a possibility of branching to L_overflow
202357939bSOlivier Houchard * which makes a C call
212357939bSOlivier Houchard */
222357939bSOlivier Houchard
232357939bSOlivier HouchardENTRY(__umodsi3)
242357939bSOlivier Houchard	stmfd	sp!, {lr}
252357939bSOlivier Houchard	sub	sp, sp, #4	/* align stack */
262357939bSOlivier Houchard	bl	.L_udivide
272357939bSOlivier Houchard	add	sp, sp, #4	/* unalign stack */
282357939bSOlivier Houchard	mov	r0, r1
292357939bSOlivier Houchard	ldmfd	sp!, {pc}
30f2e71517SIan LeporeEND(__umodsi3)
312357939bSOlivier Houchard
322357939bSOlivier HouchardENTRY(__modsi3)
332357939bSOlivier Houchard	stmfd	sp!, {lr}
342357939bSOlivier Houchard	sub	sp, sp, #4	/* align stack */
352357939bSOlivier Houchard	bl	.L_divide
362357939bSOlivier Houchard	add	sp, sp, #4	/* unalign stack */
372357939bSOlivier Houchard	mov	r0, r1
382357939bSOlivier Houchard	ldmfd	sp!, {pc}
392357939bSOlivier Houchard
402357939bSOlivier Houchard.L_overflow:
412357939bSOlivier Houchard#if !defined(_KERNEL) && !defined(_STANDALONE)
422357939bSOlivier Houchard	mov	r0, #8			/* SIGFPE */
432357939bSOlivier Houchard	bl	PIC_SYM(_C_LABEL(raise), PLT)	/* raise it */
442357939bSOlivier Houchard	mov	r0, #0
452357939bSOlivier Houchard#else
462357939bSOlivier Houchard	/* XXX should cause a fatal error */
472357939bSOlivier Houchard	mvn	r0, #0
482357939bSOlivier Houchard#endif
4931489a9aSOlivier Houchard	RET
50f2e71517SIan LeporeEND(__modsi3)
512357939bSOlivier Houchard
522357939bSOlivier HouchardENTRY(__udivsi3)
532357939bSOlivier Houchard.L_udivide:				/* r0 = r0 / r1; r1 = r0 % r1 */
542357939bSOlivier Houchard	eor     r0, r1, r0
552357939bSOlivier Houchard	eor     r1, r0, r1
562357939bSOlivier Houchard	eor     r0, r1, r0
572357939bSOlivier Houchard					/* r0 = r1 / r0; r1 = r1 % r0 */
582357939bSOlivier Houchard	cmp	r0, #1
592357939bSOlivier Houchard	bcc	.L_overflow
602357939bSOlivier Houchard	beq	.L_divide_l0
612357939bSOlivier Houchard	mov	ip, #0
622357939bSOlivier Houchard	movs	r1, r1
632357939bSOlivier Houchard	bpl	.L_divide_l1
642357939bSOlivier Houchard	orr	ip, ip, #0x20000000	/* ip bit 0x20000000 = -ve r1 */
652357939bSOlivier Houchard	movs	r1, r1, lsr #1
662357939bSOlivier Houchard	orrcs	ip, ip, #0x10000000	/* ip bit 0x10000000 = bit 0 of r1 */
672357939bSOlivier Houchard	b	.L_divide_l1
682357939bSOlivier Houchard
692357939bSOlivier Houchard.L_divide_l0:				/* r0 == 1 */
702357939bSOlivier Houchard	mov	r0, r1
712357939bSOlivier Houchard	mov	r1, #0
7231489a9aSOlivier Houchard	RET
73f2e71517SIan LeporeEND(__udivsi3)
742357939bSOlivier Houchard
752357939bSOlivier HouchardENTRY(__divsi3)
762357939bSOlivier Houchard.L_divide:				/* r0 = r0 / r1; r1 = r0 % r1 */
772357939bSOlivier Houchard	eor     r0, r1, r0
782357939bSOlivier Houchard	eor     r1, r0, r1
792357939bSOlivier Houchard	eor     r0, r1, r0
802357939bSOlivier Houchard					/* r0 = r1 / r0; r1 = r1 % r0 */
812357939bSOlivier Houchard	cmp	r0, #1
822357939bSOlivier Houchard	bcc	.L_overflow
832357939bSOlivier Houchard	beq	.L_divide_l0
842357939bSOlivier Houchard	ands	ip, r0, #0x80000000
852357939bSOlivier Houchard	rsbmi	r0, r0, #0
862357939bSOlivier Houchard	ands	r2, r1, #0x80000000
872357939bSOlivier Houchard	eor	ip, ip, r2
882357939bSOlivier Houchard	rsbmi	r1, r1, #0
892357939bSOlivier Houchard	orr	ip, r2, ip, lsr #1	/* ip bit 0x40000000 = -ve division */
902357939bSOlivier Houchard					/* ip bit 0x80000000 = -ve remainder */
912357939bSOlivier Houchard
922357939bSOlivier Houchard.L_divide_l1:
932357939bSOlivier Houchard	mov	r2, #1
942357939bSOlivier Houchard	mov	r3, #0
952357939bSOlivier Houchard
962357939bSOlivier Houchard	/*
972357939bSOlivier Houchard	 * If the highest bit of the dividend is set, we have to be
982357939bSOlivier Houchard	 * careful when shifting the divisor. Test this.
992357939bSOlivier Houchard	 */
1002357939bSOlivier Houchard	movs	r1,r1
1012357939bSOlivier Houchard	bpl	.L_old_code
1022357939bSOlivier Houchard
1032357939bSOlivier Houchard	/*
1042357939bSOlivier Houchard	 * At this point, the highest bit of r1 is known to be set.
1052357939bSOlivier Houchard	 * We abuse this below in the tst instructions.
1062357939bSOlivier Houchard	 */
1072357939bSOlivier Houchard	tst	r1, r0 /*, lsl #0 */
1082357939bSOlivier Houchard	bmi	.L_divide_b1
1092357939bSOlivier Houchard	tst	r1, r0, lsl #1
1102357939bSOlivier Houchard	bmi	.L_divide_b2
1112357939bSOlivier Houchard	tst	r1, r0, lsl #2
1122357939bSOlivier Houchard	bmi	.L_divide_b3
1132357939bSOlivier Houchard	tst	r1, r0, lsl #3
1142357939bSOlivier Houchard	bmi	.L_divide_b4
1152357939bSOlivier Houchard	tst	r1, r0, lsl #4
1162357939bSOlivier Houchard	bmi	.L_divide_b5
1172357939bSOlivier Houchard	tst	r1, r0, lsl #5
1182357939bSOlivier Houchard	bmi	.L_divide_b6
1192357939bSOlivier Houchard	tst	r1, r0, lsl #6
1202357939bSOlivier Houchard	bmi	.L_divide_b7
1212357939bSOlivier Houchard	tst	r1, r0, lsl #7
1222357939bSOlivier Houchard	bmi	.L_divide_b8
1232357939bSOlivier Houchard	tst	r1, r0, lsl #8
1242357939bSOlivier Houchard	bmi	.L_divide_b9
1252357939bSOlivier Houchard	tst	r1, r0, lsl #9
1262357939bSOlivier Houchard	bmi	.L_divide_b10
1272357939bSOlivier Houchard	tst	r1, r0, lsl #10
1282357939bSOlivier Houchard	bmi	.L_divide_b11
1292357939bSOlivier Houchard	tst	r1, r0, lsl #11
1302357939bSOlivier Houchard	bmi	.L_divide_b12
1312357939bSOlivier Houchard	tst	r1, r0, lsl #12
1322357939bSOlivier Houchard	bmi	.L_divide_b13
1332357939bSOlivier Houchard	tst	r1, r0, lsl #13
1342357939bSOlivier Houchard	bmi	.L_divide_b14
1352357939bSOlivier Houchard	tst	r1, r0, lsl #14
1362357939bSOlivier Houchard	bmi	.L_divide_b15
1372357939bSOlivier Houchard	tst	r1, r0, lsl #15
1382357939bSOlivier Houchard	bmi	.L_divide_b16
1392357939bSOlivier Houchard	tst	r1, r0, lsl #16
1402357939bSOlivier Houchard	bmi	.L_divide_b17
1412357939bSOlivier Houchard	tst	r1, r0, lsl #17
1422357939bSOlivier Houchard	bmi	.L_divide_b18
1432357939bSOlivier Houchard	tst	r1, r0, lsl #18
1442357939bSOlivier Houchard	bmi	.L_divide_b19
1452357939bSOlivier Houchard	tst	r1, r0, lsl #19
1462357939bSOlivier Houchard	bmi	.L_divide_b20
1472357939bSOlivier Houchard	tst	r1, r0, lsl #20
1482357939bSOlivier Houchard	bmi	.L_divide_b21
1492357939bSOlivier Houchard	tst	r1, r0, lsl #21
1502357939bSOlivier Houchard	bmi	.L_divide_b22
1512357939bSOlivier Houchard	tst	r1, r0, lsl #22
1522357939bSOlivier Houchard	bmi	.L_divide_b23
1532357939bSOlivier Houchard	tst	r1, r0, lsl #23
1542357939bSOlivier Houchard	bmi	.L_divide_b24
1552357939bSOlivier Houchard	tst	r1, r0, lsl #24
1562357939bSOlivier Houchard	bmi	.L_divide_b25
1572357939bSOlivier Houchard	tst	r1, r0, lsl #25
1582357939bSOlivier Houchard	bmi	.L_divide_b26
1592357939bSOlivier Houchard	tst	r1, r0, lsl #26
1602357939bSOlivier Houchard	bmi	.L_divide_b27
1612357939bSOlivier Houchard	tst	r1, r0, lsl #27
1622357939bSOlivier Houchard	bmi	.L_divide_b28
1632357939bSOlivier Houchard	tst	r1, r0, lsl #28
1642357939bSOlivier Houchard	bmi	.L_divide_b29
1652357939bSOlivier Houchard	tst	r1, r0, lsl #29
1662357939bSOlivier Houchard	bmi	.L_divide_b30
1672357939bSOlivier Houchard	tst	r1, r0, lsl #30
1682357939bSOlivier Houchard	bmi	.L_divide_b31
1692357939bSOlivier Houchard/*
1702357939bSOlivier Houchard * instead of:
1712357939bSOlivier Houchard *	tst	r1, r0, lsl #31
1722357939bSOlivier Houchard *	bmi	.L_divide_b32
1732357939bSOlivier Houchard */
1742357939bSOlivier Houchard	b	.L_divide_b32
1752357939bSOlivier Houchard
1762357939bSOlivier Houchard.L_old_code:
1772357939bSOlivier Houchard	cmp	r1, r0
1782357939bSOlivier Houchard	bcc	.L_divide_b0
1792357939bSOlivier Houchard	cmp	r1, r0, lsl #1
1802357939bSOlivier Houchard	bcc	.L_divide_b1
1812357939bSOlivier Houchard	cmp	r1, r0, lsl #2
1822357939bSOlivier Houchard	bcc	.L_divide_b2
1832357939bSOlivier Houchard	cmp	r1, r0, lsl #3
1842357939bSOlivier Houchard	bcc	.L_divide_b3
1852357939bSOlivier Houchard	cmp	r1, r0, lsl #4
1862357939bSOlivier Houchard	bcc	.L_divide_b4
1872357939bSOlivier Houchard	cmp	r1, r0, lsl #5
1882357939bSOlivier Houchard	bcc	.L_divide_b5
1892357939bSOlivier Houchard	cmp	r1, r0, lsl #6
1902357939bSOlivier Houchard	bcc	.L_divide_b6
1912357939bSOlivier Houchard	cmp	r1, r0, lsl #7
1922357939bSOlivier Houchard	bcc	.L_divide_b7
1932357939bSOlivier Houchard	cmp	r1, r0, lsl #8
1942357939bSOlivier Houchard	bcc	.L_divide_b8
1952357939bSOlivier Houchard	cmp	r1, r0, lsl #9
1962357939bSOlivier Houchard	bcc	.L_divide_b9
1972357939bSOlivier Houchard	cmp	r1, r0, lsl #10
1982357939bSOlivier Houchard	bcc	.L_divide_b10
1992357939bSOlivier Houchard	cmp	r1, r0, lsl #11
2002357939bSOlivier Houchard	bcc	.L_divide_b11
2012357939bSOlivier Houchard	cmp	r1, r0, lsl #12
2022357939bSOlivier Houchard	bcc	.L_divide_b12
2032357939bSOlivier Houchard	cmp	r1, r0, lsl #13
2042357939bSOlivier Houchard	bcc	.L_divide_b13
2052357939bSOlivier Houchard	cmp	r1, r0, lsl #14
2062357939bSOlivier Houchard	bcc	.L_divide_b14
2072357939bSOlivier Houchard	cmp	r1, r0, lsl #15
2082357939bSOlivier Houchard	bcc	.L_divide_b15
2092357939bSOlivier Houchard	cmp	r1, r0, lsl #16
2102357939bSOlivier Houchard	bcc	.L_divide_b16
2112357939bSOlivier Houchard	cmp	r1, r0, lsl #17
2122357939bSOlivier Houchard	bcc	.L_divide_b17
2132357939bSOlivier Houchard	cmp	r1, r0, lsl #18
2142357939bSOlivier Houchard	bcc	.L_divide_b18
2152357939bSOlivier Houchard	cmp	r1, r0, lsl #19
2162357939bSOlivier Houchard	bcc	.L_divide_b19
2172357939bSOlivier Houchard	cmp	r1, r0, lsl #20
2182357939bSOlivier Houchard	bcc	.L_divide_b20
2192357939bSOlivier Houchard	cmp	r1, r0, lsl #21
2202357939bSOlivier Houchard	bcc	.L_divide_b21
2212357939bSOlivier Houchard	cmp	r1, r0, lsl #22
2222357939bSOlivier Houchard	bcc	.L_divide_b22
2232357939bSOlivier Houchard	cmp	r1, r0, lsl #23
2242357939bSOlivier Houchard	bcc	.L_divide_b23
2252357939bSOlivier Houchard	cmp	r1, r0, lsl #24
2262357939bSOlivier Houchard	bcc	.L_divide_b24
2272357939bSOlivier Houchard	cmp	r1, r0, lsl #25
2282357939bSOlivier Houchard	bcc	.L_divide_b25
2292357939bSOlivier Houchard	cmp	r1, r0, lsl #26
2302357939bSOlivier Houchard	bcc	.L_divide_b26
2312357939bSOlivier Houchard	cmp	r1, r0, lsl #27
2322357939bSOlivier Houchard	bcc	.L_divide_b27
2332357939bSOlivier Houchard	cmp	r1, r0, lsl #28
2342357939bSOlivier Houchard	bcc	.L_divide_b28
2352357939bSOlivier Houchard	cmp	r1, r0, lsl #29
2362357939bSOlivier Houchard	bcc	.L_divide_b29
2372357939bSOlivier Houchard	cmp	r1, r0, lsl #30
2382357939bSOlivier Houchard	bcc	.L_divide_b30
2392357939bSOlivier Houchard.L_divide_b32:
2402357939bSOlivier Houchard	cmp	r1, r0, lsl #31
2412357939bSOlivier Houchard	subhs	r1, r1,r0, lsl #31
2422357939bSOlivier Houchard	addhs	r3, r3,r2, lsl #31
2432357939bSOlivier Houchard.L_divide_b31:
2442357939bSOlivier Houchard	cmp	r1, r0, lsl #30
2452357939bSOlivier Houchard	subhs	r1, r1,r0, lsl #30
2462357939bSOlivier Houchard	addhs	r3, r3,r2, lsl #30
2472357939bSOlivier Houchard.L_divide_b30:
2482357939bSOlivier Houchard	cmp	r1, r0, lsl #29
2492357939bSOlivier Houchard	subhs	r1, r1,r0, lsl #29
2502357939bSOlivier Houchard	addhs	r3, r3,r2, lsl #29
2512357939bSOlivier Houchard.L_divide_b29:
2522357939bSOlivier Houchard	cmp	r1, r0, lsl #28
2532357939bSOlivier Houchard	subhs	r1, r1,r0, lsl #28
2542357939bSOlivier Houchard	addhs	r3, r3,r2, lsl #28
2552357939bSOlivier Houchard.L_divide_b28:
2562357939bSOlivier Houchard	cmp	r1, r0, lsl #27
2572357939bSOlivier Houchard	subhs	r1, r1,r0, lsl #27
2582357939bSOlivier Houchard	addhs	r3, r3,r2, lsl #27
2592357939bSOlivier Houchard.L_divide_b27:
2602357939bSOlivier Houchard	cmp	r1, r0, lsl #26
2612357939bSOlivier Houchard	subhs	r1, r1,r0, lsl #26
2622357939bSOlivier Houchard	addhs	r3, r3,r2, lsl #26
2632357939bSOlivier Houchard.L_divide_b26:
2642357939bSOlivier Houchard	cmp	r1, r0, lsl #25
2652357939bSOlivier Houchard	subhs	r1, r1,r0, lsl #25
2662357939bSOlivier Houchard	addhs	r3, r3,r2, lsl #25
2672357939bSOlivier Houchard.L_divide_b25:
2682357939bSOlivier Houchard	cmp	r1, r0, lsl #24
2692357939bSOlivier Houchard	subhs	r1, r1,r0, lsl #24
2702357939bSOlivier Houchard	addhs	r3, r3,r2, lsl #24
2712357939bSOlivier Houchard.L_divide_b24:
2722357939bSOlivier Houchard	cmp	r1, r0, lsl #23
2732357939bSOlivier Houchard	subhs	r1, r1,r0, lsl #23
2742357939bSOlivier Houchard	addhs	r3, r3,r2, lsl #23
2752357939bSOlivier Houchard.L_divide_b23:
2762357939bSOlivier Houchard	cmp	r1, r0, lsl #22
2772357939bSOlivier Houchard	subhs	r1, r1,r0, lsl #22
2782357939bSOlivier Houchard	addhs	r3, r3,r2, lsl #22
2792357939bSOlivier Houchard.L_divide_b22:
2802357939bSOlivier Houchard	cmp	r1, r0, lsl #21
2812357939bSOlivier Houchard	subhs	r1, r1,r0, lsl #21
2822357939bSOlivier Houchard	addhs	r3, r3,r2, lsl #21
2832357939bSOlivier Houchard.L_divide_b21:
2842357939bSOlivier Houchard	cmp	r1, r0, lsl #20
2852357939bSOlivier Houchard	subhs	r1, r1,r0, lsl #20
2862357939bSOlivier Houchard	addhs	r3, r3,r2, lsl #20
2872357939bSOlivier Houchard.L_divide_b20:
2882357939bSOlivier Houchard	cmp	r1, r0, lsl #19
2892357939bSOlivier Houchard	subhs	r1, r1,r0, lsl #19
2902357939bSOlivier Houchard	addhs	r3, r3,r2, lsl #19
2912357939bSOlivier Houchard.L_divide_b19:
2922357939bSOlivier Houchard	cmp	r1, r0, lsl #18
2932357939bSOlivier Houchard	subhs	r1, r1,r0, lsl #18
2942357939bSOlivier Houchard	addhs	r3, r3,r2, lsl #18
2952357939bSOlivier Houchard.L_divide_b18:
2962357939bSOlivier Houchard	cmp	r1, r0, lsl #17
2972357939bSOlivier Houchard	subhs	r1, r1,r0, lsl #17
2982357939bSOlivier Houchard	addhs	r3, r3,r2, lsl #17
2992357939bSOlivier Houchard.L_divide_b17:
3002357939bSOlivier Houchard	cmp	r1, r0, lsl #16
3012357939bSOlivier Houchard	subhs	r1, r1,r0, lsl #16
3022357939bSOlivier Houchard	addhs	r3, r3,r2, lsl #16
3032357939bSOlivier Houchard.L_divide_b16:
3042357939bSOlivier Houchard	cmp	r1, r0, lsl #15
3052357939bSOlivier Houchard	subhs	r1, r1,r0, lsl #15
3062357939bSOlivier Houchard	addhs	r3, r3,r2, lsl #15
3072357939bSOlivier Houchard.L_divide_b15:
3082357939bSOlivier Houchard	cmp	r1, r0, lsl #14
3092357939bSOlivier Houchard	subhs	r1, r1,r0, lsl #14
3102357939bSOlivier Houchard	addhs	r3, r3,r2, lsl #14
3112357939bSOlivier Houchard.L_divide_b14:
3122357939bSOlivier Houchard	cmp	r1, r0, lsl #13
3132357939bSOlivier Houchard	subhs	r1, r1,r0, lsl #13
3142357939bSOlivier Houchard	addhs	r3, r3,r2, lsl #13
3152357939bSOlivier Houchard.L_divide_b13:
3162357939bSOlivier Houchard	cmp	r1, r0, lsl #12
3172357939bSOlivier Houchard	subhs	r1, r1,r0, lsl #12
3182357939bSOlivier Houchard	addhs	r3, r3,r2, lsl #12
3192357939bSOlivier Houchard.L_divide_b12:
3202357939bSOlivier Houchard	cmp	r1, r0, lsl #11
3212357939bSOlivier Houchard	subhs	r1, r1,r0, lsl #11
3222357939bSOlivier Houchard	addhs	r3, r3,r2, lsl #11
3232357939bSOlivier Houchard.L_divide_b11:
3242357939bSOlivier Houchard	cmp	r1, r0, lsl #10
3252357939bSOlivier Houchard	subhs	r1, r1,r0, lsl #10
3262357939bSOlivier Houchard	addhs	r3, r3,r2, lsl #10
3272357939bSOlivier Houchard.L_divide_b10:
3282357939bSOlivier Houchard	cmp	r1, r0, lsl #9
3292357939bSOlivier Houchard	subhs	r1, r1,r0, lsl #9
3302357939bSOlivier Houchard	addhs	r3, r3,r2, lsl #9
3312357939bSOlivier Houchard.L_divide_b9:
3322357939bSOlivier Houchard	cmp	r1, r0, lsl #8
3332357939bSOlivier Houchard	subhs	r1, r1,r0, lsl #8
3342357939bSOlivier Houchard	addhs	r3, r3,r2, lsl #8
3352357939bSOlivier Houchard.L_divide_b8:
3362357939bSOlivier Houchard	cmp	r1, r0, lsl #7
3372357939bSOlivier Houchard	subhs	r1, r1,r0, lsl #7
3382357939bSOlivier Houchard	addhs	r3, r3,r2, lsl #7
3392357939bSOlivier Houchard.L_divide_b7:
3402357939bSOlivier Houchard	cmp	r1, r0, lsl #6
3412357939bSOlivier Houchard	subhs	r1, r1,r0, lsl #6
3422357939bSOlivier Houchard	addhs	r3, r3,r2, lsl #6
3432357939bSOlivier Houchard.L_divide_b6:
3442357939bSOlivier Houchard	cmp	r1, r0, lsl #5
3452357939bSOlivier Houchard	subhs	r1, r1,r0, lsl #5
3462357939bSOlivier Houchard	addhs	r3, r3,r2, lsl #5
3472357939bSOlivier Houchard.L_divide_b5:
3482357939bSOlivier Houchard	cmp	r1, r0, lsl #4
3492357939bSOlivier Houchard	subhs	r1, r1,r0, lsl #4
3502357939bSOlivier Houchard	addhs	r3, r3,r2, lsl #4
3512357939bSOlivier Houchard.L_divide_b4:
3522357939bSOlivier Houchard	cmp	r1, r0, lsl #3
3532357939bSOlivier Houchard	subhs	r1, r1,r0, lsl #3
3542357939bSOlivier Houchard	addhs	r3, r3,r2, lsl #3
3552357939bSOlivier Houchard.L_divide_b3:
3562357939bSOlivier Houchard	cmp	r1, r0, lsl #2
3572357939bSOlivier Houchard	subhs	r1, r1,r0, lsl #2
3582357939bSOlivier Houchard	addhs	r3, r3,r2, lsl #2
3592357939bSOlivier Houchard.L_divide_b2:
3602357939bSOlivier Houchard	cmp	r1, r0, lsl #1
3612357939bSOlivier Houchard	subhs	r1, r1,r0, lsl #1
3622357939bSOlivier Houchard	addhs	r3, r3,r2, lsl #1
3632357939bSOlivier Houchard.L_divide_b1:
3642357939bSOlivier Houchard	cmp	r1, r0
3652357939bSOlivier Houchard	subhs	r1, r1, r0
3662357939bSOlivier Houchard	addhs	r3, r3, r2
3672357939bSOlivier Houchard.L_divide_b0:
3682357939bSOlivier Houchard
3692357939bSOlivier Houchard	tst	ip, #0x20000000
3702357939bSOlivier Houchard	bne	.L_udivide_l1
3712357939bSOlivier Houchard	mov	r0, r3
3722357939bSOlivier Houchard	cmp	ip, #0
3732357939bSOlivier Houchard	rsbmi	r1, r1, #0
3742357939bSOlivier Houchard	movs	ip, ip, lsl #1
3752357939bSOlivier Houchard	bicmi	r0, r0, #0x80000000	/* Fix incase we divided 0x80000000 */
3762357939bSOlivier Houchard	rsbmi	r0, r0, #0
37731489a9aSOlivier Houchard	RET
3782357939bSOlivier Houchard
3792357939bSOlivier Houchard.L_udivide_l1:
3802357939bSOlivier Houchard	tst	ip, #0x10000000
3812357939bSOlivier Houchard	mov	r1, r1, lsl #1
3822357939bSOlivier Houchard	orrne	r1, r1, #1
3832357939bSOlivier Houchard	mov	r3, r3, lsl #1
3842357939bSOlivier Houchard	cmp	r1, r0
3852357939bSOlivier Houchard	subhs	r1, r1, r0
3862357939bSOlivier Houchard	addhs	r3, r3, r2
3872357939bSOlivier Houchard	mov	r0, r3
38831489a9aSOlivier Houchard	RET
389f2e71517SIan LeporeEND(__divsi3)
390*96cdb0abSKonstantin Belousov
391*96cdb0abSKonstantin Belousov	.section .note.GNU-stack,"",%progbits
392