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