repo.or.cz
/
neatcc
/
cc.git
/
blob
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
log
|
graphiclog1
|
graphiclog2
|
commit
|
commitdiff
|
tree
|
refs
|
edit
|
fork
blame
|
history
|
raw
|
HEAD
gen: don't save variable registers before calls
[neatcc/cc.git]
/
div.s
blob
a14a37da2c7b7867fc5bd82f780900b056769989
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
7
8
@ zero divider
9
tst
r1
,
r1
10
beq
.end
11
12
@ shift the operand
13
.shl:
14
movs
r12
,
r1
,
LSL
r2
15
add
r2
,
r2
,
#1
16
bpl
.shl
17
18
mov
r12
,
#1
19
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
33
34
.global __umoddi3
35
__umoddi3
:
36
stmfd sp
!, {
lr
}
37
bl
__udivdi3
38
mov
r0
,
r1
39
ldmfd sp
!, {
pc
}
40
41
.global __divdi3
42
__divdi3
:
43
stmfd sp
!, {
r4
,
lr
}
44
45
tst
r0
,
r0
46
rsbmi
r0
,
r0
,
#0
47
movmi
r4
,
#1
48
49
tst
r1
,
r1
50
rsbmi
r0
,
r0
,
#0
51
submi
r4
,
r4
,
#1
52
53
bl
__udivdi3
54
tst
r4
,
r4
55
subne
r0
,
r0
,
#0
56
57
ldmfd sp
!, {
r4
,
pc
}
58
59
.global __moddi3
60
__moddi3
:
61
stmfd sp
!, {
lr
}
62
bl
__divdi3
63
mov
r0
,
r1
64
ldmfd sp
!, {
pc
}