123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 |
- #define xl r0
- #define xh r1
- #define yl r2
- #define yh r3
- #define UNWIND(x...)
- #define ARM(x...) x
- #define THUMB(x...)
- #define ENTRY(__f) \
- .align 3
- .globl __f
- .type __f,%function
- __f:
- #define ENDPROC(__f)
- .size __f, . - __f
- ENTRY(__DivU64x32)
- stmfd sp!, {r4-r6, lr}
- mov r5, r4
- mov r4, r2
- bl __do_div64
- teq r5, #0
- strne xh, [r5]
- mov r0, yl
- mov r1, yh
- ldmfd sp!, {r4-r6, pc}
- ENDPROC(__DivU64x32)
- ENTRY(__do_div64)
- UNWIND(.fnstart)
-
- subs ip, r4, #1
- bls 9f
- tst ip, r4
- beq 8f
-
- cmp xh, r4
- mov yh, #0
- blo 3f
-
-
-
- clz yl, r4
- clz ip, xh
- sub yl, yl, ip
- mov ip, #1
- mov ip, ip, lsl yl
- mov yl, r4, lsl yl
-
-
- 2: cmp xh, yl
- orrcs yh, yh, ip
- subcss xh, xh, yl
- movnes ip, ip, lsr #1
- mov yl, yl, lsr #1
- bne 2b
-
- 3: cmp xh, #0
- mov yl, #0
- cmpeq xl, r4
- movlo xh, xl
- movlo pc, lr
-
-
-
- mov ip, #0x80000000
- 4: movs xl, xl, lsl #1
- adcs xh, xh, xh
- beq 6f
- cmpcc xh, r4
- 5: orrcs yl, yl, ip
- subcs xh, xh, r4
- movs ip, ip, lsr #1
- bne 4b
- mov pc, lr
-
-
-
- 6: bcs 5b
- cmp xl, #0
- moveq pc, lr
-
- clz xh, xl
- add xh, xh, #1
- mov xl, xl, lsl xh
- mov ip, ip, lsr xh
-
-
-
-
- movs ip, ip, lsr #1
- mov xh, #1
- bne 4b
- mov pc, lr
- 8:
-
- clz ip, r4
- rsb ip, ip, #31
- mov yh, xh, lsr ip
- mov yl, xl, lsr ip
- rsb ip, ip, #32
- ARM( orr yl, yl, xh, lsl ip )
- THUMB( lsl xh, xh, ip )
- THUMB( orr yl, yl, xh )
- mov xh, xl, lsl ip
- mov xh, xh, lsr ip
- mov pc, lr
-
- 9: moveq yl, xl
- moveq yh, xh
- moveq xh, #0
- moveq pc, lr
- UNWIND(.fnend)
- UNWIND(.fnstart)
- UNWIND(.pad #4)
- UNWIND(.save {lr})
- Ldiv0_64:
-
- str lr, [sp, #-8]!
- bl __div0
-
- mov yl, #0
- mov yh, #0
- mov xh, #0
- ldr pc, [sp], #8
- UNWIND(.fnend)
- ENDPROC(__do_div64)
|