Root/
1 | # S/390 __udiv_qrnnd |
2 | |
3 | # r2 : &__r |
4 | # r3 : upper half of 64 bit word n |
5 | # r4 : lower half of 64 bit word n |
6 | # r5 : divisor d |
7 | # the reminder r of the division is to be stored to &__r and |
8 | # the quotient q is to be returned |
9 | |
10 | .text |
11 | .globl __udiv_qrnnd |
12 | __udiv_qrnnd: |
13 | st %r2,24(%r15) # store pointer to reminder for later |
14 | lr %r0,%r3 # reload n |
15 | lr %r1,%r4 |
16 | ltr %r2,%r5 # reload and test divisor |
17 | jp 5f |
18 | # divisor >= 0x80000000 |
19 | srdl %r0,2 # n/4 |
20 | srl %r2,1 # d/2 |
21 | slr %r1,%r2 # special case if last bit of d is set |
22 | brc 3,0f # (n/4) div (n/2) can overflow by 1 |
23 | ahi %r0,-1 # trick: subtract n/2, then divide |
24 | 0: dr %r0,%r2 # signed division |
25 | ahi %r1,1 # trick part 2: add 1 to the quotient |
26 | # now (n >> 2) = (d >> 1) * %r1 + %r0 |
27 | lhi %r3,1 |
28 | nr %r3,%r1 # test last bit of q |
29 | jz 1f |
30 | alr %r0,%r2 # add (d>>1) to r |
31 | 1: srl %r1,1 # q >>= 1 |
32 | # now (n >> 2) = (d&-2) * %r1 + %r0 |
33 | lhi %r3,1 |
34 | nr %r3,%r5 # test last bit of d |
35 | jz 2f |
36 | slr %r0,%r1 # r -= q |
37 | brc 3,2f # borrow ? |
38 | alr %r0,%r5 # r += d |
39 | ahi %r1,-1 |
40 | 2: # now (n >> 2) = d * %r1 + %r0 |
41 | alr %r1,%r1 # q <<= 1 |
42 | alr %r0,%r0 # r <<= 1 |
43 | brc 12,3f # overflow on r ? |
44 | slr %r0,%r5 # r -= d |
45 | ahi %r1,1 # q += 1 |
46 | 3: lhi %r3,2 |
47 | nr %r3,%r4 # test next to last bit of n |
48 | jz 4f |
49 | ahi %r0,1 # r += 1 |
50 | 4: clr %r0,%r5 # r >= d ? |
51 | jl 6f |
52 | slr %r0,%r5 # r -= d |
53 | ahi %r1,1 # q += 1 |
54 | # now (n >> 1) = d * %r1 + %r0 |
55 | j 6f |
56 | 5: # divisor < 0x80000000 |
57 | srdl %r0,1 |
58 | dr %r0,%r2 # signed division |
59 | # now (n >> 1) = d * %r1 + %r0 |
60 | 6: alr %r1,%r1 # q <<= 1 |
61 | alr %r0,%r0 # r <<= 1 |
62 | brc 12,7f # overflow on r ? |
63 | slr %r0,%r5 # r -= d |
64 | ahi %r1,1 # q += 1 |
65 | 7: lhi %r3,1 |
66 | nr %r3,%r4 # isolate last bit of n |
67 | alr %r0,%r3 # r += (n & 1) |
68 | clr %r0,%r5 # r >= d ? |
69 | jl 8f |
70 | slr %r0,%r5 # r -= d |
71 | ahi %r1,1 # q += 1 |
72 | 8: # now n = d * %r1 + %r0 |
73 | l %r2,24(%r15) |
74 | st %r0,0(%r2) |
75 | lr %r2,%r1 |
76 | br %r14 |
77 | .end __udiv_qrnnd |
78 |
Branches:
ben-wpan
ben-wpan-stefan
javiroman/ks7010
jz-2.6.34
jz-2.6.34-rc5
jz-2.6.34-rc6
jz-2.6.34-rc7
jz-2.6.35
jz-2.6.36
jz-2.6.37
jz-2.6.38
jz-2.6.39
jz-3.0
jz-3.1
jz-3.11
jz-3.12
jz-3.13
jz-3.15
jz-3.16
jz-3.18-dt
jz-3.2
jz-3.3
jz-3.4
jz-3.5
jz-3.6
jz-3.6-rc2-pwm
jz-3.9
jz-3.9-clk
jz-3.9-rc8
jz47xx
jz47xx-2.6.38
master
Tags:
od-2011-09-04
od-2011-09-18
v2.6.34-rc5
v2.6.34-rc6
v2.6.34-rc7
v3.9