gen: don't save variable registers before calls
[neatcc/cc.git] / div.s
bloba14a37da2c7b7867fc5bd82f780900b056769989
1 ; ARM software division implementation
2 ; These functions are assembled using neatas and are included in gen.c
3 .global __udivdi3
4 __udivdi3:
5 mov r2, #0
6 mov r3, #0
8 @ zero divider
9 tst r1, r1
10 beq .end
12 @ shift the operand
13 .shl:
14 movs r12, r1, LSL r2
15 add r2, r2, #1
16 bpl .shl
18 mov r12, #1
20 @ the main division algorithm
21 .shr:
22 subs r2, r2, #1
23 bmi .end
24 cmps r0, r1, LSL r2
25 bcc .shr
26 sub r0, r0, r1, LSL r2
27 add r3, r3, r12, LSL r2
28 b .shr
29 .end:
30 mov r1, r0
31 mov r0, r3
32 mov pc, lr
34 .global __umoddi3
35 __umoddi3:
36 stmfd sp!, {lr}
37 bl __udivdi3
38 mov r0, r1
39 ldmfd sp!, {pc}
41 .global __divdi3
42 __divdi3:
43 stmfd sp!, {r4, lr}
45 tst r0, r0
46 rsbmi r0, r0, #0
47 movmi r4, #1
49 tst r1, r1
50 rsbmi r0, r0, #0
51 submi r4, r4, #1
53 bl __udivdi3
54 tst r4, r4
55 subne r0, r0, #0
57 ldmfd sp!, {r4, pc}
59 .global __moddi3
60 __moddi3:
61 stmfd sp!, {lr}
62 bl __divdi3
63 mov r0, r1
64 ldmfd sp!, {pc}