Annotation of qemu/roms/openbios/arch/sparc32/udiv.S, revision 1.1.1.1

1.1       root        1: /* $Id: udiv.S,v 1.4 1996/09/30 02:22:38 davem Exp $
                      2:  * udiv.S:      This routine was taken from glibc-1.09 and is covered
                      3:  *              by the GNU Library General Public License Version 2.
                      4:  */
                      5: 
                      6: 
                      7: /* This file is generated from divrem.m4; DO NOT EDIT! */
                      8: /*
                      9:  * Division and remainder, from Appendix E of the Sparc Version 8
                     10:  * Architecture Manual, with fixes from Gordon Irlam.
                     11:  */
                     12: 
                     13: /*
                     14:  * Input: dividend and divisor in %o0 and %o1 respectively.
                     15:  *
                     16:  * m4 parameters:
                     17:  *  .udiv      name of function to generate
                     18:  *  div                div=div => %o0 / %o1; div=rem => %o0 % %o1
                     19:  *  false              false=true => signed; false=false => unsigned
                     20:  *
                     21:  * Algorithm parameters:
                     22:  *  N          how many bits per iteration we try to get (4)
                     23:  *  WORDSIZE   total number of bits (32)
                     24:  *
                     25:  * Derived constants:
                     26:  *  TOPBITS    number of bits in the top decade of a number
                     27:  *
                     28:  * Important variables:
                     29:  *  Q          the partial quotient under development (initially 0)
                     30:  *  R          the remainder so far, initially the dividend
                     31:  *  ITER       number of main division loop iterations required;
                     32:  *             equal to ceil(log2(quotient) / N).  Note that this
                     33:  *             is the log base (2^N) of the quotient.
                     34:  *  V          the current comparand, initially divisor*2^(ITER*N-1)
                     35:  *
                     36:  * Cost:
                     37:  *  Current estimate for non-large dividend is
                     38:  *     ceil(log2(quotient) / N) * (10 + 7N/2) + C
                     39:  *  A large dividend is one greater than 2^(31-TOPBITS) and takes a
                     40:  *  different path, as the upper bits of the quotient must be developed
                     41:  *  one bit at a time.
                     42:  */
                     43: 
                     44: 
                     45:        .globl .udiv
                     46:        .globl _Udiv
                     47: .udiv:
                     48: _Udiv: /* needed for export */
                     49: 
                     50:        ! Ready to divide.  Compute size of quotient; scale comparand.
                     51:        orcc    %o1, %g0, %o5
                     52:        bne     1f
                     53:         mov    %o0, %o3
                     54: 
                     55:                ! Divide by zero trap.  If it returns, return 0 (about as
                     56:                ! wrong as possible, but that is what SunOS does...).
                     57:                ta      0x2
                     58:                retl
                     59:                 clr    %o0
                     60: 
                     61: 1:
                     62:        cmp     %o3, %o5                        ! if %o1 exceeds %o0, done
                     63:        blu     Lgot_result             ! (and algorithm fails otherwise)
                     64:         clr    %o2
                     65: 
                     66:        sethi   %hi(1 << (32 - 4 - 1)), %g1
                     67: 
                     68:        cmp     %o3, %g1
                     69:        blu     Lnot_really_big
                     70:         clr    %o4
                     71: 
                     72:        ! Here the dividend is >= 2**(31-N) or so.  We must be careful here,
                     73:        ! as our usual N-at-a-shot divide step will cause overflow and havoc.
                     74:        ! The number of bits in the result here is N*ITER+SC, where SC <= N.
                     75:        ! Compute ITER in an unorthodox manner: know we need to shift V into
                     76:        ! the top decade: so do not even bother to compare to R.
                     77:        1:
                     78:                cmp     %o5, %g1
                     79:                bgeu    3f
                     80:                 mov    1, %g7
                     81: 
                     82:                sll     %o5, 4, %o5
                     83: 
                     84:                b       1b
                     85:                 add    %o4, 1, %o4
                     86: 
                     87:        ! Now compute %g7.
                     88:        2:
                     89:                addcc   %o5, %o5, %o5
                     90:                bcc     Lnot_too_big
                     91:                 add    %g7, 1, %g7
                     92: 
                     93:                ! We get here if the %o1 overflowed while shifting.
                     94:                ! This means that %o3 has the high-order bit set.
                     95:                ! Restore %o5 and subtract from %o3.
                     96:                sll     %g1, 4, %g1     ! high order bit
                     97:                srl     %o5, 1, %o5             ! rest of %o5
                     98:                add     %o5, %g1, %o5
                     99: 
                    100:                b       Ldo_single_div
                    101:                 sub    %g7, 1, %g7
                    102: 
                    103:        Lnot_too_big:
                    104:        3:
                    105:                cmp     %o5, %o3
                    106:                blu     2b
                    107:                 nop
                    108: 
                    109:                be      Ldo_single_div
                    110:                 nop
                    111:        /* NB: these are commented out in the V8-Sparc manual as well */
                    112:        /* (I do not understand this) */
                    113:        ! %o5 > %o3: went too far: back up 1 step
                    114:        !       srl     %o5, 1, %o5
                    115:        !       dec     %g7
                    116:        ! do single-bit divide steps
                    117:        !
                    118:        ! We have to be careful here.  We know that %o3 >= %o5, so we can do the
                    119:        ! first divide step without thinking.  BUT, the others are conditional,
                    120:        ! and are only done if %o3 >= 0.  Because both %o3 and %o5 may have the high-
                    121:        ! order bit set in the first step, just falling into the regular
                    122:        ! division loop will mess up the first time around.
                    123:        ! So we unroll slightly...
                    124:        Ldo_single_div:
                    125:                subcc   %g7, 1, %g7
                    126:                bl      Lend_regular_divide
                    127:                 nop
                    128: 
                    129:                sub     %o3, %o5, %o3
                    130:                mov     1, %o2
                    131: 
                    132:                b       Lend_single_divloop
                    133:                 nop
                    134:        Lsingle_divloop:
                    135:                sll     %o2, 1, %o2
                    136:                bl      1f
                    137:                 srl    %o5, 1, %o5
                    138:                ! %o3 >= 0
                    139:                sub     %o3, %o5, %o3
                    140:                b       2f
                    141:                 add    %o2, 1, %o2
                    142:        1:      ! %o3 < 0
                    143:                add     %o3, %o5, %o3
                    144:                sub     %o2, 1, %o2
                    145:        2:
                    146:        Lend_single_divloop:
                    147:                subcc   %g7, 1, %g7
                    148:                bge     Lsingle_divloop
                    149:                 tst    %o3
                    150: 
                    151:                b,a     Lend_regular_divide
                    152: 
                    153: Lnot_really_big:
                    154: 1:
                    155:        sll     %o5, 4, %o5
                    156: 
                    157:        cmp     %o5, %o3
                    158:        bleu    1b
                    159:         addcc  %o4, 1, %o4
                    160: 
                    161:        be      Lgot_result
                    162:         sub    %o4, 1, %o4
                    163: 
                    164:        tst     %o3     ! set up for initial iteration
                    165: Ldivloop:
                    166:        sll     %o2, 4, %o2
                    167:                ! depth 1, accumulated bits 0
                    168:        bl      L.1.16
                    169:         srl    %o5,1,%o5
                    170:        ! remainder is positive
                    171:        subcc   %o3,%o5,%o3
                    172:                        ! depth 2, accumulated bits 1
                    173:        bl      L.2.17
                    174:         srl    %o5,1,%o5
                    175:        ! remainder is positive
                    176:        subcc   %o3,%o5,%o3
                    177:                        ! depth 3, accumulated bits 3
                    178:        bl      L.3.19
                    179:         srl    %o5,1,%o5
                    180:        ! remainder is positive
                    181:        subcc   %o3,%o5,%o3
                    182:                        ! depth 4, accumulated bits 7
                    183:        bl      L.4.23
                    184:         srl    %o5,1,%o5
                    185:        ! remainder is positive
                    186:        subcc   %o3,%o5,%o3
                    187:        b       9f
                    188:         add    %o2, (7*2+1), %o2
                    189: 
                    190: L.4.23:
                    191:        ! remainder is negative
                    192:        addcc   %o3,%o5,%o3
                    193:        b       9f
                    194:         add    %o2, (7*2-1), %o2
                    195: 
                    196: L.3.19:
                    197:        ! remainder is negative
                    198:        addcc   %o3,%o5,%o3
                    199:                        ! depth 4, accumulated bits 5
                    200:        bl      L.4.21
                    201:         srl    %o5,1,%o5
                    202:        ! remainder is positive
                    203:        subcc   %o3,%o5,%o3
                    204:        b       9f
                    205:         add    %o2, (5*2+1), %o2
                    206: 
                    207: L.4.21:
                    208:        ! remainder is negative
                    209:        addcc   %o3,%o5,%o3
                    210:        b       9f
                    211:         add    %o2, (5*2-1), %o2
                    212: 
                    213: L.2.17:
                    214:        ! remainder is negative
                    215:        addcc   %o3,%o5,%o3
                    216:                        ! depth 3, accumulated bits 1
                    217:        bl      L.3.17
                    218:         srl    %o5,1,%o5
                    219:        ! remainder is positive
                    220:        subcc   %o3,%o5,%o3
                    221:                        ! depth 4, accumulated bits 3
                    222:        bl      L.4.19
                    223:         srl    %o5,1,%o5
                    224:        ! remainder is positive
                    225:        subcc   %o3,%o5,%o3
                    226:        b       9f
                    227:         add    %o2, (3*2+1), %o2
                    228: 
                    229: L.4.19:
                    230:        ! remainder is negative
                    231:        addcc   %o3,%o5,%o3
                    232:        b       9f
                    233:         add    %o2, (3*2-1), %o2
                    234: 
                    235: L.3.17:
                    236:        ! remainder is negative
                    237:        addcc   %o3,%o5,%o3
                    238:                        ! depth 4, accumulated bits 1
                    239:        bl      L.4.17
                    240:         srl    %o5,1,%o5
                    241:        ! remainder is positive
                    242:        subcc   %o3,%o5,%o3
                    243:        b       9f
                    244:         add    %o2, (1*2+1), %o2
                    245: 
                    246: L.4.17:
                    247:        ! remainder is negative
                    248:        addcc   %o3,%o5,%o3
                    249:        b       9f
                    250:         add    %o2, (1*2-1), %o2
                    251: 
                    252: L.1.16:
                    253:        ! remainder is negative
                    254:        addcc   %o3,%o5,%o3
                    255:                        ! depth 2, accumulated bits -1
                    256:        bl      L.2.15
                    257:         srl    %o5,1,%o5
                    258:        ! remainder is positive
                    259:        subcc   %o3,%o5,%o3
                    260:                        ! depth 3, accumulated bits -1
                    261:        bl      L.3.15
                    262:         srl    %o5,1,%o5
                    263:        ! remainder is positive
                    264:        subcc   %o3,%o5,%o3
                    265:                        ! depth 4, accumulated bits -1
                    266:        bl      L.4.15
                    267:         srl    %o5,1,%o5
                    268:        ! remainder is positive
                    269:        subcc   %o3,%o5,%o3
                    270:        b       9f
                    271:         add    %o2, (-1*2+1), %o2
                    272: 
                    273: L.4.15:
                    274:        ! remainder is negative
                    275:        addcc   %o3,%o5,%o3
                    276:        b       9f
                    277:         add    %o2, (-1*2-1), %o2
                    278: 
                    279: L.3.15:
                    280:        ! remainder is negative
                    281:        addcc   %o3,%o5,%o3
                    282:                        ! depth 4, accumulated bits -3
                    283:        bl      L.4.13
                    284:         srl    %o5,1,%o5
                    285:        ! remainder is positive
                    286:        subcc   %o3,%o5,%o3
                    287:        b       9f
                    288:         add    %o2, (-3*2+1), %o2
                    289: 
                    290: L.4.13:
                    291:        ! remainder is negative
                    292:        addcc   %o3,%o5,%o3
                    293:        b       9f
                    294:         add    %o2, (-3*2-1), %o2
                    295: 
                    296: L.2.15:
                    297:        ! remainder is negative
                    298:        addcc   %o3,%o5,%o3
                    299:                        ! depth 3, accumulated bits -3
                    300:        bl      L.3.13
                    301:         srl    %o5,1,%o5
                    302:        ! remainder is positive
                    303:        subcc   %o3,%o5,%o3
                    304:                        ! depth 4, accumulated bits -5
                    305:        bl      L.4.11
                    306:         srl    %o5,1,%o5
                    307:        ! remainder is positive
                    308:        subcc   %o3,%o5,%o3
                    309:        b       9f
                    310:         add    %o2, (-5*2+1), %o2
                    311: 
                    312: L.4.11:
                    313:        ! remainder is negative
                    314:        addcc   %o3,%o5,%o3
                    315:        b       9f
                    316:         add    %o2, (-5*2-1), %o2
                    317: 
                    318: L.3.13:
                    319:        ! remainder is negative
                    320:        addcc   %o3,%o5,%o3
                    321:                        ! depth 4, accumulated bits -7
                    322:        bl      L.4.9
                    323:         srl    %o5,1,%o5
                    324:        ! remainder is positive
                    325:        subcc   %o3,%o5,%o3
                    326:        b       9f
                    327:         add    %o2, (-7*2+1), %o2
                    328: 
                    329: L.4.9:
                    330:        ! remainder is negative
                    331:        addcc   %o3,%o5,%o3
                    332:        b       9f
                    333:         add    %o2, (-7*2-1), %o2
                    334: 
                    335:        9:
                    336: Lend_regular_divide:
                    337:        subcc   %o4, 1, %o4
                    338:        bge     Ldivloop
                    339:         tst    %o3
                    340: 
                    341:        bl,a    Lgot_result
                    342:        ! non-restoring fixup here (one instruction only!)
                    343:        sub     %o2, 1, %o2
                    344: 
                    345: Lgot_result:
                    346: 
                    347:        retl
                    348:         mov %o2, %o0
                    349: 
                    350:        .globl  .udiv_patch
                    351: .udiv_patch:
                    352:        wr      %g0, 0x0, %y
                    353:        nop
                    354:        nop
                    355:        retl
                    356:         udiv   %o0, %o1, %o0
                    357:        nop

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.