131ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky# S/390 __udiv_qrnnd 231ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky 3144d634a21caff1d54cb4bb0d073774e88130045Jan Glauber#include <linux/linkage.h> 4144d634a21caff1d54cb4bb0d073774e88130045Jan Glauber 531ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky# r2 : &__r 631ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky# r3 : upper half of 64 bit word n 731ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky# r4 : lower half of 64 bit word n 831ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky# r5 : divisor d 931ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky# the reminder r of the division is to be stored to &__r and 1031ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky# the quotient q is to be returned 1131ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky 1231ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky .text 13144d634a21caff1d54cb4bb0d073774e88130045Jan GlauberENTRY(__udiv_qrnnd) 1431ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky st %r2,24(%r15) # store pointer to reminder for later 1531ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky lr %r0,%r3 # reload n 1631ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky lr %r1,%r4 1731ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky ltr %r2,%r5 # reload and test divisor 1831ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky jp 5f 1931ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky # divisor >= 0x80000000 2031ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky srdl %r0,2 # n/4 2131ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky srl %r2,1 # d/2 2231ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky slr %r1,%r2 # special case if last bit of d is set 2331ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky brc 3,0f # (n/4) div (n/2) can overflow by 1 2431ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky ahi %r0,-1 # trick: subtract n/2, then divide 2531ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky0: dr %r0,%r2 # signed division 2631ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky ahi %r1,1 # trick part 2: add 1 to the quotient 2731ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky # now (n >> 2) = (d >> 1) * %r1 + %r0 2831ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky lhi %r3,1 2931ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky nr %r3,%r1 # test last bit of q 3031ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky jz 1f 3131ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky alr %r0,%r2 # add (d>>1) to r 3231ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky1: srl %r1,1 # q >>= 1 3331ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky # now (n >> 2) = (d&-2) * %r1 + %r0 3431ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky lhi %r3,1 3531ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky nr %r3,%r5 # test last bit of d 3631ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky jz 2f 3731ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky slr %r0,%r1 # r -= q 3831ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky brc 3,2f # borrow ? 3931ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky alr %r0,%r5 # r += d 4031ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky ahi %r1,-1 4131ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky2: # now (n >> 2) = d * %r1 + %r0 4231ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky alr %r1,%r1 # q <<= 1 4331ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky alr %r0,%r0 # r <<= 1 4431ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky brc 12,3f # overflow on r ? 4531ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky slr %r0,%r5 # r -= d 4631ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky ahi %r1,1 # q += 1 4731ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky3: lhi %r3,2 4831ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky nr %r3,%r4 # test next to last bit of n 4931ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky jz 4f 5031ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky ahi %r0,1 # r += 1 5131ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky4: clr %r0,%r5 # r >= d ? 5231ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky jl 6f 5331ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky slr %r0,%r5 # r -= d 5431ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky ahi %r1,1 # q += 1 5531ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky # now (n >> 1) = d * %r1 + %r0 5631ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky j 6f 5731ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky5: # divisor < 0x80000000 5831ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky srdl %r0,1 5931ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky dr %r0,%r2 # signed division 6031ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky # now (n >> 1) = d * %r1 + %r0 6131ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky6: alr %r1,%r1 # q <<= 1 6231ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky alr %r0,%r0 # r <<= 1 6331ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky brc 12,7f # overflow on r ? 6431ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky slr %r0,%r5 # r -= d 6531ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky ahi %r1,1 # q += 1 6631ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky7: lhi %r3,1 6731ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky nr %r3,%r4 # isolate last bit of n 6831ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky alr %r0,%r3 # r += (n & 1) 6931ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky clr %r0,%r5 # r >= d ? 7031ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky jl 8f 7131ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky slr %r0,%r5 # r -= d 7231ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky ahi %r1,1 # q += 1 7331ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky8: # now n = d * %r1 + %r0 7431ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky l %r2,24(%r15) 7531ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky st %r0,0(%r2) 7631ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky lr %r2,%r1 7731ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky br %r14 7831ee4b2f40994e8b21691f85cdd4052551a789b7Martin Schwidefsky .end __udiv_qrnnd 79