Annotation of researchv9/libc/sun/Fadds.s, revision 1.1.1.1

1.1       root        1:        .data
                      2:        .asciz  "@(#)Fadds.s 1.1 86/02/03 Copyr 1985 Sun Micro"
                      3:        .even
                      4:        .text
                      5: 
                      6: |      Copyright (c) 1985 by Sun Microsystems, Inc.
                      7: 
                      8: #include "fpcrtdefs.h"
                      9: 
                     10: /*
                     11:  *     ieee single floating run-time support
                     12:  *     copyright 1981, Richard E. James III
                     13:  *     translated to SUN idiom 14 March 1983 rt
                     14:  */
                     15: 
                     16: /*     single floating addition and subtraction        */
                     17: /*
                     18:  *     entry conditions:
                     19:  *         first argument in d0
                     20:  *         second argument in d1
                     21:  *     exit conditions:
                     22:  *         result (4 bytes) in d0
                     23:  *
                     24:  *     register conventions:
                     25:  *         d0          operand 1
                     26:  *         d1          operand 2/sum
                     27:  *         d2          sign of operand 1
                     28:  *         d3          sign of operand 2
                     29:  *         d4          exponent of operand 1
                     30:  *         d5          exponent of operand 2
                     31:  *         d6          difference of exponents
                     32:  *         d7          reserved for sticky
                     33:  */
                     34:        SAVEMASK = 0x3f00       | registers d2-d7
                     35:        RESTMASK = 0xfc
                     36:        NSAVED   = 6*4          | 6 registers * sizeof(register)
                     37: 
                     38: RTENTRY(Fsubs)
                     39:        bchg    #31,d1
                     40:        jra     adding
                     41: RTENTRY(Fadds)
                     42: adding:
                     43: |      save registers and load operands into registers
                     44:        moveml  #SAVEMASK,sp@-  | registers d2-d7
                     45:        | extract signs
                     46:        asll    #1,d0   | sign ->c
                     47:        scs     d2      | c -> d4
                     48:        asll    #1,d1
                     49:        scs     d3
                     50:        | compare and exchange to put larger in d0
                     51:        cmpl    d1,d0
                     52:        blss    1$
                     53:        exg     d0,d1
                     54:        exg     d2,d3
                     55:        | extract exponents
                     56: 1$:    roll    #8,d1
                     57:        roll    #8,d0
                     58:        clrl    d5
                     59:        movb    d1,d5           | larger exp
                     60:        clrw    d4
                     61:        movb    d0,d4           | smaller exp
                     62:        bnes    3$              | not zero or denormalized
                     63:        | smaller is 0 or is denormalized
                     64:        tstl    d0              | if smaller == 0
                     65:        jeq     signofzero      | then use larger (sign of 0-0 unpredictable)
                     66:        tstb    d5              | larger exponent
                     67:        bnes    4$              | not gu
                     68:        | both are denormalized
                     69:        cmpb    d3,d2           | compare signs
                     70:        bnes    2$
                     71:        addl    d0,d1
                     72:        addxb   d1,d1           | incr exp to 1 if overflow
                     73:        jra     asbuild
                     74: 2$:    subl    d0,d1           | subtract
                     75:        jne     asbuild
                     76:        jra     cancel
                     77: | neither is denormalized
                     78: 3$:    movb    #1,d0           | clear exp and
                     79:        rorl    #1,d0
                     80: 4$:    movb    #1,d1           | ... clr hidden bit
                     81:        rorl    #1,d1
                     82:        cmpb    #0xff,d5
                     83:        jeq     ovfl            | inf or nan
                     84:        | align smaller
                     85:        movw    d5,d6
                     86:        subw    d4,d6           | difference of exponents
                     87:        cmpw    #16,d6
                     88:        bges    bigshift        | Branch if shift 26 or more places.
                     89: check8:        cmpw    #8,d6
                     90:        blts    shortshift      | exit when <8 *s
                     91:        tstb    d0
                     92:        beqs    shift8          | Branch if no bits to be lost.
                     93:        bset    #8,d0           | Sticky bit on.
                     94: shift8:
                     95:        subqw   #8,d6
                     96:        lsrl    #8,d0           | align
                     97:        bra     check8          | loop
                     98: bigshift:
                     99:        cmpw    #26,d6
                    100:        bges    greatshift      | Branch if only sticky left.
                    101:        tstw    d0
                    102:        beqs    1$
                    103:        bset    #16,d0          | Set sticky bit.
                    104: 1$:
                    105:        clrw    d0
                    106:        swap    d0
                    107:        subw    #16,d6
                    108:        bras    check8
                    109: greatshift:
                    110:        moveq   #1,d0           | Here's a sticky bit.
                    111:        bras    addorsub
                    112: shortshift: 
                    113:        movb    d0,d7
                    114:        lsrl    d6,d0           | finish align
                    115:        cmpw    #2,d6
                    116:        bges    stickit         | Branch if shift >=2 so whole byte sticky.
                    117:        andb    #1,d7           | Shift = 0 or 1 so only lsb sticks.
                    118: stickit:
                    119:        tstb    d7
                    120:        beqs    addorsub        | Branch if no bits to stick.
                    121:        bset    #0,d0           | Set a sticky bit on.
                    122: addorsub:
                    123:        cmpb    d3,d2           | cmp signs
                    124:        bnes    diff            | decide whether to add or subtract
                    125: 
                    126:        | add them
                    127:        addl    d0,d1           | sum
                    128:        bccs    endas           | no carry here
                    129:        roxrl   #1,d1           | pull in overflow *s
                    130:        addqw   #1,d5
                    131:        cmpw    #0xff,d5
                    132:        blts    endas           | no ofl
                    133:        bras    a_geninf
                    134: 
                    135:        
                    136: signofzero:                    | Set proper sign of zero.
                    137:        cmpb    d2,d3
                    138:        beqs    usel            | If signs are equal, use d3.
                    139:        tstl    d1
                    140:        bnes    usel            | Branch if not zero.
                    141:        clrb    d3              | Sign if positive otherwise.
                    142:        bras    usel
                    143: 
                    144: | subtract them
                    145: diff:  subl    d0,d1
                    146:        bmis    endas           | if normalized
                    147:        beqs    cancel          | result == 0
                    148: 9$:    asll    #1,d1           | normalize
                    149:        dbmi    d5,9$           | dec exponent
                    150:        subqw   #1,d5
                    151:        bgts    endas           | not gu
                    152:        beqs    10$
                    153:        clrw    d5
                    154:        lsrl    #1,d1           | grad und
                    155: 10$:   lsrl    #1,d1
                    156: 
                    157: endas: | round (NOT FULLY  STANDARD)
                    158:        addl    #0x80,d1        | round
                    159:        bccs    testeven        | round did not cause mantissa to ofl
                    160:        roxrl   #1,d1
                    161:        addqw   #1,d5
                    162:        cmpw    #0xff,d5
                    163:        beqs    a_geninf        | round caused exp to overflow
                    164:        bras    rebuild
                    165: testeven:                      | Test if ambiguous case.
                    166:        tstb    d1
                    167:        bnes    rebuild         | Branch if not ambiguous.
                    168:        bclr    #8,d1           | Force round to even.
                    169: rebuild:                       | rebuild answer
                    170:        lsll    #1,d1           | toss hidden
                    171: usel:  movb    d5,d1           | insert exponent
                    172: asbuild:rorl   #8,d1
                    173:        roxrb   #1,d3
                    174:        roxrl   #1,d1           | apply sign
                    175:        | d1 now has answer
                    176:        movl    d1,d0
                    177: asexit:
                    178:        moveml  sp@+,#RESTMASK
                    179:        RET
                    180: 
                    181:        | EXCEPTION CASES
                    182: ovfl:  | largest exponent = 255
                    183:        lsll    #1,d1
                    184:        tstl    d1              | larger mantissa
                    185:        bnes    usel            | larger == nan
                    186:        cmpb    d4,d5           | exps
                    187:        bnes    usel            | larger == inf
                    188:        | AFFINE MODE ASSUMED IN THIS IMPLEMENTATION
                    189:        cmpb    d3,d2           | signs
                    190:        beqs    usel            | inf+inf = inf
                    191: |gennan:
                    192:        movl    #0x7f800001,d0
                    193:        bras    asexit
                    194: 
                    195:        | complete cancellation
                    196: cancel:        clrl    d0              | result == 0
                    197:        | need minus 0 for (-0)+(-0), round to -inf
                    198:        bras    asexit
                    199:        | result overflows:
                    200: a_geninf:movl  #0xff,d1
                    201:        bras    asbuild
                    202: 
                    203: 
                    204: /*
                    205:  *     ieee single floating compare
                    206:  *     copyright 1981, Richard E. James III
                    207:  *     translated to SUN idiom 29 March 1983 rt
                    208:  */
                    209: 
                    210: /*
                    211:  *     entry conditions:
                    212:  *         first argument in d0
                    213:  *         second argument in d1
                    214:  *     exit conditions:
                    215:  *         result in condition code
                    216:  *         d0/d1 trashed
                    217:  *
                    218:  *     register conventions:
                    219:  *         d0          operand 1
                    220:  *         d1          operand 2
                    221:  *         d2          scratch
                    222:  */
                    223:        NSAVED  = 4
                    224:        CODE    = NSAVED
                    225: 
                    226: RTENTRY(Fcmps)
                    227: #ifdef PROF
                    228:        unlk    a6              | don't get in the way of the cc.
                    229: #endif
                    230:        subqw   #2,sp           | save space for condition code return
                    231:        movl    d2,sp@-         | save register
                    232: 
                    233:        movl    d1,d2
                    234:        andl    d0,d2           | compare signs
                    235:        bpls    1$
                    236:        exg     d0,d1           | both minus
                    237: 1$:    cmpl    d1,d0           | main compare
                    238:        bgts    1f
                    239:        blts    2f
                    240:        movw    #FEQ,sp@(CODE)
                    241:        bras    3f
                    242: 1:
                    243:        movw    #FGT,sp@(CODE)
                    244:        bras    3f
                    245: 2:
                    246:        movw    #FLT,sp@(CODE)
                    247: 3:
                    248:        lsll    #1,d0
                    249:        lsll    #1,d1
                    250:        cmpl    d1,d0
                    251:        bccs    2$
                    252:        exg     d0,d1   | find larger
                    253: 2$:    cmpl    #0xff000000,d0
                    254:        blss    3$
                    255:        | nan
                    256:        movw    #FUN,sp@(CODE)  | c for unordered
                    257: 3$:    tstl    d0
                    258:        bnes    4$
                    259:        movw    #FEQ,sp@(CODE)  | -0 == 0
                    260:        | result is in sp@(CODE)
                    261: 4$:    | restore saved register and go
                    262:        movl    sp@+,d2
                    263:        rtr

unix.superglobalmegacorp.com

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