# S/390 __udiv_qrnnd12# r2 : &__r3# r3 : upper half of 64 bit word n4# r4 : lower half of 64 bit word n5# r5 : divisor d6# the reminder r of the division is to be stored to &__r and7# the quotient q is to be returned89.text10.globl __udiv_qrnnd11__udiv_qrnnd:12st %r2,24(%r15) # store pointer to reminder for later13lr %r0,%r3 # reload n14lr %r1,%r415ltr %r2,%r5 # reload and test divisor16jp 5f17# divisor >= 0x8000000018srdl %r0,2 # n/419srl %r2,1 # d/220slr %r1,%r2 # special case if last bit of d is set21brc 3,0f # (n/4) div (n/2) can overflow by 122ahi %r0,-1 # trick: subtract n/2, then divide230: dr %r0,%r2 # signed division24ahi %r1,1 # trick part 2: add 1 to the quotient25# now (n >> 2) = (d >> 1) * %r1 + %r026lhi %r3,127nr %r3,%r1 # test last bit of q28jz 1f29alr %r0,%r2 # add (d>>1) to r301: srl %r1,1 # q >>= 131# now (n >> 2) = (d&-2) * %r1 + %r032lhi %r3,133nr %r3,%r5 # test last bit of d34jz 2f35slr %r0,%r1 # r -= q36brc 3,2f # borrow ?37alr %r0,%r5 # r += d38ahi %r1,-1392: # now (n >> 2) = d * %r1 + %r040alr %r1,%r1 # q <<= 141alr %r0,%r0 # r <<= 142brc 12,3f # overflow on r ?43slr %r0,%r5 # r -= d44ahi %r1,1 # q += 1453: lhi %r3,246nr %r3,%r4 # test next to last bit of n47jz 4f48ahi %r0,1 # r += 1494: clr %r0,%r5 # r >= d ?50jl 6f51slr %r0,%r5 # r -= d52ahi %r1,1 # q += 153# now (n >> 1) = d * %r1 + %r054j 6f555: # divisor < 0x8000000056srdl %r0,157dr %r0,%r2 # signed division58# now (n >> 1) = d * %r1 + %r0596: alr %r1,%r1 # q <<= 160alr %r0,%r0 # r <<= 161brc 12,7f # overflow on r ?62slr %r0,%r5 # r -= d63ahi %r1,1 # q += 1647: lhi %r3,165nr %r3,%r4 # isolate last bit of n66alr %r0,%r3 # r += (n & 1)67clr %r0,%r5 # r >= d ?68jl 8f69slr %r0,%r5 # r -= d70ahi %r1,1 # q += 1718: # now n = d * %r1 + %r072l %r2,24(%r15)73st %r0,0(%r2)74lr %r2,%r175br %r1476.end __udiv_qrnnd777879