xref: /freebsd-src/sys/libkern/arm/divsi3.S (revision 685dc743dc3b5645e34836464128e1c0558b404b)
103f11029SOlivier Houchard/*	$NetBSD: divsi3.S,v 1.4 2003/04/05 23:27:15 bjh21 Exp $	*/
203f11029SOlivier Houchard
3d6ea0262SWarner Losh/*-
403f11029SOlivier Houchard * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
503f11029SOlivier Houchard * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
603f11029SOlivier Houchard * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
703f11029SOlivier Houchard * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
803f11029SOlivier Houchard * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
903f11029SOlivier Houchard * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
1003f11029SOlivier Houchard * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
1103f11029SOlivier Houchard * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
1203f11029SOlivier Houchard * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
1303f11029SOlivier Houchard * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
1403f11029SOlivier Houchard * SUCH DAMAGE.
1503f11029SOlivier Houchard */
1603f11029SOlivier Houchard
1703f11029SOlivier Houchard#include <machine/asm.h>
1803f11029SOlivier Houchard/*
1903f11029SOlivier Houchard * stack is aligned as there's a possibility of branching to L_overflow
2003f11029SOlivier Houchard * which makes a C call
2103f11029SOlivier Houchard */
2203f11029SOlivier Houchard
23fbaa643eSOlivier HouchardENTRY_NP(__umodsi3)
2403f11029SOlivier Houchard	stmfd	sp!, {lr}
2503f11029SOlivier Houchard	sub	sp, sp, #4	/* align stack */
2603f11029SOlivier Houchard	bl	.L_udivide
2703f11029SOlivier Houchard	add	sp, sp, #4	/* unalign stack */
2803f11029SOlivier Houchard	mov	r0, r1
2903f11029SOlivier Houchard	ldmfd	sp!, {pc}
30a2dee2adSAndrew TurnerEND(__umodsi3)
3103f11029SOlivier Houchard
32fbaa643eSOlivier HouchardENTRY_NP(__modsi3)
3303f11029SOlivier Houchard	stmfd	sp!, {lr}
3403f11029SOlivier Houchard	sub	sp, sp, #4	/* align stack */
3503f11029SOlivier Houchard	bl	.L_divide
3603f11029SOlivier Houchard	add	sp, sp, #4	/* unalign stack */
3703f11029SOlivier Houchard	mov	r0, r1
3803f11029SOlivier Houchard	ldmfd	sp!, {pc}
3903f11029SOlivier Houchard
4003f11029SOlivier Houchard.L_overflow:
4103f11029SOlivier Houchard#if !defined(_KERNEL) && !defined(_STANDALONE)
4203f11029SOlivier Houchard	mov	r0, #8			/* SIGFPE */
4303f11029SOlivier Houchard	bl	PIC_SYM(_C_LABEL(raise), PLT)	/* raise it */
4403f11029SOlivier Houchard	mov	r0, #0
4503f11029SOlivier Houchard#else
4603f11029SOlivier Houchard	/* XXX should cause a fatal error */
4703f11029SOlivier Houchard	mvn	r0, #0
4803f11029SOlivier Houchard#endif
492fd21813SOlivier Houchard	RET
50a2dee2adSAndrew TurnerEND(__modsi3)
5103f11029SOlivier Houchard
52fbaa643eSOlivier HouchardENTRY_NP(__udivsi3)
53*25166187SIan LeporeEENTRY_NP(__aeabi_uidiv)
54*25166187SIan LeporeEENTRY_NP(__aeabi_uidivmod)
5503f11029SOlivier Houchard.L_udivide:				/* r0 = r0 / r1; r1 = r0 % r1 */
5603f11029SOlivier Houchard	eor     r0, r1, r0
5703f11029SOlivier Houchard	eor     r1, r0, r1
5803f11029SOlivier Houchard	eor     r0, r1, r0
5903f11029SOlivier Houchard					/* r0 = r1 / r0; r1 = r1 % r0 */
6003f11029SOlivier Houchard	cmp	r0, #1
6103f11029SOlivier Houchard	bcc	.L_overflow
6203f11029SOlivier Houchard	beq	.L_divide_l0
6303f11029SOlivier Houchard	mov	ip, #0
6403f11029SOlivier Houchard	movs	r1, r1
6503f11029SOlivier Houchard	bpl	.L_divide_l1
6603f11029SOlivier Houchard	orr	ip, ip, #0x20000000	/* ip bit 0x20000000 = -ve r1 */
6703f11029SOlivier Houchard	movs	r1, r1, lsr #1
6803f11029SOlivier Houchard	orrcs	ip, ip, #0x10000000	/* ip bit 0x10000000 = bit 0 of r1 */
6903f11029SOlivier Houchard	b	.L_divide_l1
7003f11029SOlivier Houchard
7103f11029SOlivier Houchard.L_divide_l0:				/* r0 == 1 */
7203f11029SOlivier Houchard	mov	r0, r1
7303f11029SOlivier Houchard	mov	r1, #0
742fd21813SOlivier Houchard	RET
75*25166187SIan LeporeEEND(__aeabi_uidiv)
76*25166187SIan LeporeEEND(__aeabi_uidivmod)
77a2dee2adSAndrew TurnerEND(__udivsi3)
7803f11029SOlivier Houchard
79fbaa643eSOlivier HouchardENTRY_NP(__divsi3)
80*25166187SIan LeporeEENTRY_NP(__aeabi_idiv)
81*25166187SIan LeporeEENTRY_NP(__aeabi_idivmod)
8203f11029SOlivier Houchard.L_divide:				/* r0 = r0 / r1; r1 = r0 % r1 */
8303f11029SOlivier Houchard	eor     r0, r1, r0
8403f11029SOlivier Houchard	eor     r1, r0, r1
8503f11029SOlivier Houchard	eor     r0, r1, r0
8603f11029SOlivier Houchard					/* r0 = r1 / r0; r1 = r1 % r0 */
8703f11029SOlivier Houchard	cmp	r0, #1
8803f11029SOlivier Houchard	bcc	.L_overflow
8903f11029SOlivier Houchard	beq	.L_divide_l0
9003f11029SOlivier Houchard	ands	ip, r0, #0x80000000
9103f11029SOlivier Houchard	rsbmi	r0, r0, #0
9203f11029SOlivier Houchard	ands	r2, r1, #0x80000000
9303f11029SOlivier Houchard	eor	ip, ip, r2
9403f11029SOlivier Houchard	rsbmi	r1, r1, #0
9503f11029SOlivier Houchard	orr	ip, r2, ip, lsr #1	/* ip bit 0x40000000 = -ve division */
9603f11029SOlivier Houchard					/* ip bit 0x80000000 = -ve remainder */
9703f11029SOlivier Houchard
9803f11029SOlivier Houchard.L_divide_l1:
9903f11029SOlivier Houchard	mov	r2, #1
10003f11029SOlivier Houchard	mov	r3, #0
10103f11029SOlivier Houchard
10203f11029SOlivier Houchard	/*
10303f11029SOlivier Houchard	 * If the highest bit of the dividend is set, we have to be
10403f11029SOlivier Houchard	 * careful when shifting the divisor. Test this.
10503f11029SOlivier Houchard	 */
10603f11029SOlivier Houchard	movs	r1,r1
10703f11029SOlivier Houchard	bpl	.L_old_code
10803f11029SOlivier Houchard
10903f11029SOlivier Houchard	/*
11003f11029SOlivier Houchard	 * At this point, the highest bit of r1 is known to be set.
11103f11029SOlivier Houchard	 * We abuse this below in the tst instructions.
11203f11029SOlivier Houchard	 */
11303f11029SOlivier Houchard	tst	r1, r0 /*, lsl #0 */
11403f11029SOlivier Houchard	bmi	.L_divide_b1
11503f11029SOlivier Houchard	tst	r1, r0, lsl #1
11603f11029SOlivier Houchard	bmi	.L_divide_b2
11703f11029SOlivier Houchard	tst	r1, r0, lsl #2
11803f11029SOlivier Houchard	bmi	.L_divide_b3
11903f11029SOlivier Houchard	tst	r1, r0, lsl #3
12003f11029SOlivier Houchard	bmi	.L_divide_b4
12103f11029SOlivier Houchard	tst	r1, r0, lsl #4
12203f11029SOlivier Houchard	bmi	.L_divide_b5
12303f11029SOlivier Houchard	tst	r1, r0, lsl #5
12403f11029SOlivier Houchard	bmi	.L_divide_b6
12503f11029SOlivier Houchard	tst	r1, r0, lsl #6
12603f11029SOlivier Houchard	bmi	.L_divide_b7
12703f11029SOlivier Houchard	tst	r1, r0, lsl #7
12803f11029SOlivier Houchard	bmi	.L_divide_b8
12903f11029SOlivier Houchard	tst	r1, r0, lsl #8
13003f11029SOlivier Houchard	bmi	.L_divide_b9
13103f11029SOlivier Houchard	tst	r1, r0, lsl #9
13203f11029SOlivier Houchard	bmi	.L_divide_b10
13303f11029SOlivier Houchard	tst	r1, r0, lsl #10
13403f11029SOlivier Houchard	bmi	.L_divide_b11
13503f11029SOlivier Houchard	tst	r1, r0, lsl #11
13603f11029SOlivier Houchard	bmi	.L_divide_b12
13703f11029SOlivier Houchard	tst	r1, r0, lsl #12
13803f11029SOlivier Houchard	bmi	.L_divide_b13
13903f11029SOlivier Houchard	tst	r1, r0, lsl #13
14003f11029SOlivier Houchard	bmi	.L_divide_b14
14103f11029SOlivier Houchard	tst	r1, r0, lsl #14
14203f11029SOlivier Houchard	bmi	.L_divide_b15
14303f11029SOlivier Houchard	tst	r1, r0, lsl #15
14403f11029SOlivier Houchard	bmi	.L_divide_b16
14503f11029SOlivier Houchard	tst	r1, r0, lsl #16
14603f11029SOlivier Houchard	bmi	.L_divide_b17
14703f11029SOlivier Houchard	tst	r1, r0, lsl #17
14803f11029SOlivier Houchard	bmi	.L_divide_b18
14903f11029SOlivier Houchard	tst	r1, r0, lsl #18
15003f11029SOlivier Houchard	bmi	.L_divide_b19
15103f11029SOlivier Houchard	tst	r1, r0, lsl #19
15203f11029SOlivier Houchard	bmi	.L_divide_b20
15303f11029SOlivier Houchard	tst	r1, r0, lsl #20
15403f11029SOlivier Houchard	bmi	.L_divide_b21
15503f11029SOlivier Houchard	tst	r1, r0, lsl #21
15603f11029SOlivier Houchard	bmi	.L_divide_b22
15703f11029SOlivier Houchard	tst	r1, r0, lsl #22
15803f11029SOlivier Houchard	bmi	.L_divide_b23
15903f11029SOlivier Houchard	tst	r1, r0, lsl #23
16003f11029SOlivier Houchard	bmi	.L_divide_b24
16103f11029SOlivier Houchard	tst	r1, r0, lsl #24
16203f11029SOlivier Houchard	bmi	.L_divide_b25
16303f11029SOlivier Houchard	tst	r1, r0, lsl #25
16403f11029SOlivier Houchard	bmi	.L_divide_b26
16503f11029SOlivier Houchard	tst	r1, r0, lsl #26
16603f11029SOlivier Houchard	bmi	.L_divide_b27
16703f11029SOlivier Houchard	tst	r1, r0, lsl #27
16803f11029SOlivier Houchard	bmi	.L_divide_b28
16903f11029SOlivier Houchard	tst	r1, r0, lsl #28
17003f11029SOlivier Houchard	bmi	.L_divide_b29
17103f11029SOlivier Houchard	tst	r1, r0, lsl #29
17203f11029SOlivier Houchard	bmi	.L_divide_b30
17303f11029SOlivier Houchard	tst	r1, r0, lsl #30
17403f11029SOlivier Houchard	bmi	.L_divide_b31
17503f11029SOlivier Houchard/*
17603f11029SOlivier Houchard * instead of:
17703f11029SOlivier Houchard *	tst	r1, r0, lsl #31
17803f11029SOlivier Houchard *	bmi	.L_divide_b32
17903f11029SOlivier Houchard */
18003f11029SOlivier Houchard	b	.L_divide_b32
18103f11029SOlivier Houchard
18203f11029SOlivier Houchard.L_old_code:
18303f11029SOlivier Houchard	cmp	r1, r0
18403f11029SOlivier Houchard	bcc	.L_divide_b0
18503f11029SOlivier Houchard	cmp	r1, r0, lsl #1
18603f11029SOlivier Houchard	bcc	.L_divide_b1
18703f11029SOlivier Houchard	cmp	r1, r0, lsl #2
18803f11029SOlivier Houchard	bcc	.L_divide_b2
18903f11029SOlivier Houchard	cmp	r1, r0, lsl #3
19003f11029SOlivier Houchard	bcc	.L_divide_b3
19103f11029SOlivier Houchard	cmp	r1, r0, lsl #4
19203f11029SOlivier Houchard	bcc	.L_divide_b4
19303f11029SOlivier Houchard	cmp	r1, r0, lsl #5
19403f11029SOlivier Houchard	bcc	.L_divide_b5
19503f11029SOlivier Houchard	cmp	r1, r0, lsl #6
19603f11029SOlivier Houchard	bcc	.L_divide_b6
19703f11029SOlivier Houchard	cmp	r1, r0, lsl #7
19803f11029SOlivier Houchard	bcc	.L_divide_b7
19903f11029SOlivier Houchard	cmp	r1, r0, lsl #8
20003f11029SOlivier Houchard	bcc	.L_divide_b8
20103f11029SOlivier Houchard	cmp	r1, r0, lsl #9
20203f11029SOlivier Houchard	bcc	.L_divide_b9
20303f11029SOlivier Houchard	cmp	r1, r0, lsl #10
20403f11029SOlivier Houchard	bcc	.L_divide_b10
20503f11029SOlivier Houchard	cmp	r1, r0, lsl #11
20603f11029SOlivier Houchard	bcc	.L_divide_b11
20703f11029SOlivier Houchard	cmp	r1, r0, lsl #12
20803f11029SOlivier Houchard	bcc	.L_divide_b12
20903f11029SOlivier Houchard	cmp	r1, r0, lsl #13
21003f11029SOlivier Houchard	bcc	.L_divide_b13
21103f11029SOlivier Houchard	cmp	r1, r0, lsl #14
21203f11029SOlivier Houchard	bcc	.L_divide_b14
21303f11029SOlivier Houchard	cmp	r1, r0, lsl #15
21403f11029SOlivier Houchard	bcc	.L_divide_b15
21503f11029SOlivier Houchard	cmp	r1, r0, lsl #16
21603f11029SOlivier Houchard	bcc	.L_divide_b16
21703f11029SOlivier Houchard	cmp	r1, r0, lsl #17
21803f11029SOlivier Houchard	bcc	.L_divide_b17
21903f11029SOlivier Houchard	cmp	r1, r0, lsl #18
22003f11029SOlivier Houchard	bcc	.L_divide_b18
22103f11029SOlivier Houchard	cmp	r1, r0, lsl #19
22203f11029SOlivier Houchard	bcc	.L_divide_b19
22303f11029SOlivier Houchard	cmp	r1, r0, lsl #20
22403f11029SOlivier Houchard	bcc	.L_divide_b20
22503f11029SOlivier Houchard	cmp	r1, r0, lsl #21
22603f11029SOlivier Houchard	bcc	.L_divide_b21
22703f11029SOlivier Houchard	cmp	r1, r0, lsl #22
22803f11029SOlivier Houchard	bcc	.L_divide_b22
22903f11029SOlivier Houchard	cmp	r1, r0, lsl #23
23003f11029SOlivier Houchard	bcc	.L_divide_b23
23103f11029SOlivier Houchard	cmp	r1, r0, lsl #24
23203f11029SOlivier Houchard	bcc	.L_divide_b24
23303f11029SOlivier Houchard	cmp	r1, r0, lsl #25
23403f11029SOlivier Houchard	bcc	.L_divide_b25
23503f11029SOlivier Houchard	cmp	r1, r0, lsl #26
23603f11029SOlivier Houchard	bcc	.L_divide_b26
23703f11029SOlivier Houchard	cmp	r1, r0, lsl #27
23803f11029SOlivier Houchard	bcc	.L_divide_b27
23903f11029SOlivier Houchard	cmp	r1, r0, lsl #28
24003f11029SOlivier Houchard	bcc	.L_divide_b28
24103f11029SOlivier Houchard	cmp	r1, r0, lsl #29
24203f11029SOlivier Houchard	bcc	.L_divide_b29
24303f11029SOlivier Houchard	cmp	r1, r0, lsl #30
24403f11029SOlivier Houchard	bcc	.L_divide_b30
24503f11029SOlivier Houchard.L_divide_b32:
24603f11029SOlivier Houchard	cmp	r1, r0, lsl #31
24703f11029SOlivier Houchard	subhs	r1, r1,r0, lsl #31
24803f11029SOlivier Houchard	addhs	r3, r3,r2, lsl #31
24903f11029SOlivier Houchard.L_divide_b31:
25003f11029SOlivier Houchard	cmp	r1, r0, lsl #30
25103f11029SOlivier Houchard	subhs	r1, r1,r0, lsl #30
25203f11029SOlivier Houchard	addhs	r3, r3,r2, lsl #30
25303f11029SOlivier Houchard.L_divide_b30:
25403f11029SOlivier Houchard	cmp	r1, r0, lsl #29
25503f11029SOlivier Houchard	subhs	r1, r1,r0, lsl #29
25603f11029SOlivier Houchard	addhs	r3, r3,r2, lsl #29
25703f11029SOlivier Houchard.L_divide_b29:
25803f11029SOlivier Houchard	cmp	r1, r0, lsl #28
25903f11029SOlivier Houchard	subhs	r1, r1,r0, lsl #28
26003f11029SOlivier Houchard	addhs	r3, r3,r2, lsl #28
26103f11029SOlivier Houchard.L_divide_b28:
26203f11029SOlivier Houchard	cmp	r1, r0, lsl #27
26303f11029SOlivier Houchard	subhs	r1, r1,r0, lsl #27
26403f11029SOlivier Houchard	addhs	r3, r3,r2, lsl #27
26503f11029SOlivier Houchard.L_divide_b27:
26603f11029SOlivier Houchard	cmp	r1, r0, lsl #26
26703f11029SOlivier Houchard	subhs	r1, r1,r0, lsl #26
26803f11029SOlivier Houchard	addhs	r3, r3,r2, lsl #26
26903f11029SOlivier Houchard.L_divide_b26:
27003f11029SOlivier Houchard	cmp	r1, r0, lsl #25
27103f11029SOlivier Houchard	subhs	r1, r1,r0, lsl #25
27203f11029SOlivier Houchard	addhs	r3, r3,r2, lsl #25
27303f11029SOlivier Houchard.L_divide_b25:
27403f11029SOlivier Houchard	cmp	r1, r0, lsl #24
27503f11029SOlivier Houchard	subhs	r1, r1,r0, lsl #24
27603f11029SOlivier Houchard	addhs	r3, r3,r2, lsl #24
27703f11029SOlivier Houchard.L_divide_b24:
27803f11029SOlivier Houchard	cmp	r1, r0, lsl #23
27903f11029SOlivier Houchard	subhs	r1, r1,r0, lsl #23
28003f11029SOlivier Houchard	addhs	r3, r3,r2, lsl #23
28103f11029SOlivier Houchard.L_divide_b23:
28203f11029SOlivier Houchard	cmp	r1, r0, lsl #22
28303f11029SOlivier Houchard	subhs	r1, r1,r0, lsl #22
28403f11029SOlivier Houchard	addhs	r3, r3,r2, lsl #22
28503f11029SOlivier Houchard.L_divide_b22:
28603f11029SOlivier Houchard	cmp	r1, r0, lsl #21
28703f11029SOlivier Houchard	subhs	r1, r1,r0, lsl #21
28803f11029SOlivier Houchard	addhs	r3, r3,r2, lsl #21
28903f11029SOlivier Houchard.L_divide_b21:
29003f11029SOlivier Houchard	cmp	r1, r0, lsl #20
29103f11029SOlivier Houchard	subhs	r1, r1,r0, lsl #20
29203f11029SOlivier Houchard	addhs	r3, r3,r2, lsl #20
29303f11029SOlivier Houchard.L_divide_b20:
29403f11029SOlivier Houchard	cmp	r1, r0, lsl #19
29503f11029SOlivier Houchard	subhs	r1, r1,r0, lsl #19
29603f11029SOlivier Houchard	addhs	r3, r3,r2, lsl #19
29703f11029SOlivier Houchard.L_divide_b19:
29803f11029SOlivier Houchard	cmp	r1, r0, lsl #18
29903f11029SOlivier Houchard	subhs	r1, r1,r0, lsl #18
30003f11029SOlivier Houchard	addhs	r3, r3,r2, lsl #18
30103f11029SOlivier Houchard.L_divide_b18:
30203f11029SOlivier Houchard	cmp	r1, r0, lsl #17
30303f11029SOlivier Houchard	subhs	r1, r1,r0, lsl #17
30403f11029SOlivier Houchard	addhs	r3, r3,r2, lsl #17
30503f11029SOlivier Houchard.L_divide_b17:
30603f11029SOlivier Houchard	cmp	r1, r0, lsl #16
30703f11029SOlivier Houchard	subhs	r1, r1,r0, lsl #16
30803f11029SOlivier Houchard	addhs	r3, r3,r2, lsl #16
30903f11029SOlivier Houchard.L_divide_b16:
31003f11029SOlivier Houchard	cmp	r1, r0, lsl #15
31103f11029SOlivier Houchard	subhs	r1, r1,r0, lsl #15
31203f11029SOlivier Houchard	addhs	r3, r3,r2, lsl #15
31303f11029SOlivier Houchard.L_divide_b15:
31403f11029SOlivier Houchard	cmp	r1, r0, lsl #14
31503f11029SOlivier Houchard	subhs	r1, r1,r0, lsl #14
31603f11029SOlivier Houchard	addhs	r3, r3,r2, lsl #14
31703f11029SOlivier Houchard.L_divide_b14:
31803f11029SOlivier Houchard	cmp	r1, r0, lsl #13
31903f11029SOlivier Houchard	subhs	r1, r1,r0, lsl #13
32003f11029SOlivier Houchard	addhs	r3, r3,r2, lsl #13
32103f11029SOlivier Houchard.L_divide_b13:
32203f11029SOlivier Houchard	cmp	r1, r0, lsl #12
32303f11029SOlivier Houchard	subhs	r1, r1,r0, lsl #12
32403f11029SOlivier Houchard	addhs	r3, r3,r2, lsl #12
32503f11029SOlivier Houchard.L_divide_b12:
32603f11029SOlivier Houchard	cmp	r1, r0, lsl #11
32703f11029SOlivier Houchard	subhs	r1, r1,r0, lsl #11
32803f11029SOlivier Houchard	addhs	r3, r3,r2, lsl #11
32903f11029SOlivier Houchard.L_divide_b11:
33003f11029SOlivier Houchard	cmp	r1, r0, lsl #10
33103f11029SOlivier Houchard	subhs	r1, r1,r0, lsl #10
33203f11029SOlivier Houchard	addhs	r3, r3,r2, lsl #10
33303f11029SOlivier Houchard.L_divide_b10:
33403f11029SOlivier Houchard	cmp	r1, r0, lsl #9
33503f11029SOlivier Houchard	subhs	r1, r1,r0, lsl #9
33603f11029SOlivier Houchard	addhs	r3, r3,r2, lsl #9
33703f11029SOlivier Houchard.L_divide_b9:
33803f11029SOlivier Houchard	cmp	r1, r0, lsl #8
33903f11029SOlivier Houchard	subhs	r1, r1,r0, lsl #8
34003f11029SOlivier Houchard	addhs	r3, r3,r2, lsl #8
34103f11029SOlivier Houchard.L_divide_b8:
34203f11029SOlivier Houchard	cmp	r1, r0, lsl #7
34303f11029SOlivier Houchard	subhs	r1, r1,r0, lsl #7
34403f11029SOlivier Houchard	addhs	r3, r3,r2, lsl #7
34503f11029SOlivier Houchard.L_divide_b7:
34603f11029SOlivier Houchard	cmp	r1, r0, lsl #6
34703f11029SOlivier Houchard	subhs	r1, r1,r0, lsl #6
34803f11029SOlivier Houchard	addhs	r3, r3,r2, lsl #6
34903f11029SOlivier Houchard.L_divide_b6:
35003f11029SOlivier Houchard	cmp	r1, r0, lsl #5
35103f11029SOlivier Houchard	subhs	r1, r1,r0, lsl #5
35203f11029SOlivier Houchard	addhs	r3, r3,r2, lsl #5
35303f11029SOlivier Houchard.L_divide_b5:
35403f11029SOlivier Houchard	cmp	r1, r0, lsl #4
35503f11029SOlivier Houchard	subhs	r1, r1,r0, lsl #4
35603f11029SOlivier Houchard	addhs	r3, r3,r2, lsl #4
35703f11029SOlivier Houchard.L_divide_b4:
35803f11029SOlivier Houchard	cmp	r1, r0, lsl #3
35903f11029SOlivier Houchard	subhs	r1, r1,r0, lsl #3
36003f11029SOlivier Houchard	addhs	r3, r3,r2, lsl #3
36103f11029SOlivier Houchard.L_divide_b3:
36203f11029SOlivier Houchard	cmp	r1, r0, lsl #2
36303f11029SOlivier Houchard	subhs	r1, r1,r0, lsl #2
36403f11029SOlivier Houchard	addhs	r3, r3,r2, lsl #2
36503f11029SOlivier Houchard.L_divide_b2:
36603f11029SOlivier Houchard	cmp	r1, r0, lsl #1
36703f11029SOlivier Houchard	subhs	r1, r1,r0, lsl #1
36803f11029SOlivier Houchard	addhs	r3, r3,r2, lsl #1
36903f11029SOlivier Houchard.L_divide_b1:
37003f11029SOlivier Houchard	cmp	r1, r0
37103f11029SOlivier Houchard	subhs	r1, r1, r0
37203f11029SOlivier Houchard	addhs	r3, r3, r2
37303f11029SOlivier Houchard.L_divide_b0:
37403f11029SOlivier Houchard
37503f11029SOlivier Houchard	tst	ip, #0x20000000
37603f11029SOlivier Houchard	bne	.L_udivide_l1
37703f11029SOlivier Houchard	mov	r0, r3
37803f11029SOlivier Houchard	cmp	ip, #0
37903f11029SOlivier Houchard	rsbmi	r1, r1, #0
38003f11029SOlivier Houchard	movs	ip, ip, lsl #1
38103f11029SOlivier Houchard	bicmi	r0, r0, #0x80000000	/* Fix incase we divided 0x80000000 */
38203f11029SOlivier Houchard	rsbmi	r0, r0, #0
3832fd21813SOlivier Houchard	RET
38403f11029SOlivier Houchard
38503f11029SOlivier Houchard.L_udivide_l1:
38603f11029SOlivier Houchard	tst	ip, #0x10000000
38703f11029SOlivier Houchard	mov	r1, r1, lsl #1
38803f11029SOlivier Houchard	orrne	r1, r1, #1
38903f11029SOlivier Houchard	mov	r3, r3, lsl #1
39003f11029SOlivier Houchard	cmp	r1, r0
39103f11029SOlivier Houchard	subhs	r1, r1, r0
39203f11029SOlivier Houchard	addhs	r3, r3, r2
39303f11029SOlivier Houchard	mov	r0, r3
3942fd21813SOlivier Houchard	RET
395*25166187SIan LeporeEEND(__aeabi_idiv)
396*25166187SIan LeporeEEND(__aeabi_idivmod)
397a2dee2adSAndrew TurnerEND(__divsi3)
398a2dee2adSAndrew Turner
399