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