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

1.1       root        1:        .data
                      2:        .asciz  "@(#)Fflts.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:  *     single-precision coersions
                     12:  */
                     13: 
                     14: /*
                     15:  * single integer to floating conversion:
                     16:  * input:
                     17:  *     d0      integer value
                     18:  * output:
                     19:  *     d0      floating value
                     20:  */
                     21: 
                     22: RTENTRY(Fflts)
                     23:        movel   d0,a0           | a0 saves x.
                     24:        movel   d2,a1           | a1 saves d2.
                     25:        movel   #0x9e,d1        | d1 accumulates exponent.
                     26:        tstl    d0
                     27:        bpls    3f              | Branch if x is non-negative.
                     28:        negl    d0              | d0 gets abs(x).
                     29: 3:
                     30:        bmis    2f              | Branch if d0 is normalized.
                     31:        beqs    Ffltsdone       | Branch if zero.
                     32: 1:
                     33:        subqw   #1,d1           | Adjust exponent.
                     34:        lsll    #1,d0           | Normalize.
                     35:        bpls    1b              | Branch if already normalized.
                     36: 2:
                     37:        bclr    #31,d0          | Clear I bit.
                     38:        movel   d0,d2           | d2 gets significand.
                     39:        lsrl    #8,d0           | Align high order bits.
                     40:        swap    d1
                     41:        lsll    #7,d1           | Align exponent.
                     42:        orl     d1,d0           | Stick exponent.
                     43:        movel   #24,d1
                     44:        lsll    d1,d2           | Align rounding bits.
                     45:        addl    #0x80000000,d2
                     46:        bccs    1f              | Branch if no carry out.
                     47:        tstl    d2
                     48:        bnes    1f              | Branch if not ambiguous.
                     49:        bclr    #0,d0           | Force even.
                     50: 1:
                     51:        cmpl    #0,a0
                     52:        bges    Ffltsdone       | Branch if x was non-negative.
                     53:        bset    #31,d0          | Set sign if negative.
                     54: Ffltsdone:
                     55:        movel   a1,d2           | Restore d2.
                     56:        RET
                     57: 
                     58: /*
                     59:  * single floating to integer conversion:
                     60:  * input:
                     61:  *     d0      floating value
                     62:  * output:
                     63:  *     d0      integer value
                     64:  */
                     65: 
                     66: RTENTRY(Fints)
                     67:         movel   d0,d1           | d1 gets x.
                     68:         bclr    #31,d1          | d1 gets abs(x).
                     69:         cmpl    #0x3f800000,d1
                     70:         bges    ge1             | Branch if abs(x) >= 1.
                     71:         clrl    d0             | Result is zero.
                     72:         bras    Fintsdone
                     73: ge1:
                     74:         cmpl    #0x4f000000,d1
                     75:         bles    1f        | Branch if 1 <= |x| <= 2**31.
                     76:         movel  #0x80000000,d0  | Max negative integer.
                     77:         bras    Fintsdone
                     78: 1:
                     79:         movel   d0,a0           | Save x.
                     80:        andl    #0x7fffff,d0    | Clear sign and exponent.
                     81:        bset    #23,d0          | Set I bit.
                     82:        roll    #1,d1
                     83:         roll    #8,d1
                     84:         andw    #0xff,d1        | d1 gets biased exponent.
                     85:         subw    #23+0x7f,d1     | d1 gets unbiased exponent - 23 = left shift count.
                     86:         beqs   Fintsign        | Branch if no shift indicated.
                     87:        bmis    Fintsright      | Branch if right shift indicated.
                     88: Fintsleft:
                     89:        lsll    d1,d0           | Left shift.
                     90:        bras    Fintsign
                     91: Fintsright:
                     92:        negw    d1              | Reverse count.
                     93:        lsrl    d1,d0           | Right shift.
                     94: Fintsign:
                     95:        cmpl    #0,a0
                     96:        bges    Fintsdone       | Branch if x was non-negative.
                     97:        negl    d0              | Negate result.
                     98: Fintsdone:
                     99:         RET
                    100: 
                    101: RTENTRY(Fnints)
                    102:         movel   d0,d1           | d1 gets x.
                    103:         bclr    #31,d1          | d1 gets abs(x).
                    104:         cmpl    #0x3f000000,d1
                    105:         bges    gehalf          | Branch if abs(x) >= 0.5.
                    106:         clrl    d0             | Result is zero.
                    107:         bras    Fintsdone
                    108: gehalf:
                    109:         cmpl    #0x4f000000,d1
                    110:         bles    1f        | Branch if 0.5 <= |x| <= 2**31.
                    111:         movel  #0x80000000,d0  | Max negative integer.
                    112:         bras    Fintsdone
                    113: 1:
                    114:         movel   d0,a0           | Save x.
                    115:        andl    #0x7fffff,d0    | Clear sign and exponent.
                    116:        bset    #23,d0          | Set I bit.
                    117:        roll    #1,d1
                    118:         roll    #8,d1
                    119:         andw    #0xff,d1        | d1 gets biased exponent.
                    120:         subw    #23+0x7f,d1     | d1 gets unbiased exponent - 23 = left shift count.
                    121:         beqs   Fintsign        | Branch if no shift indicated.
                    122:        bpls    Fintsleft       | Branch if right shift indicated.
                    123:        negw    d1              | Reverse count.
                    124:        subqw   #1,d1           | Decrement for rounding position.
                    125:        lsrl    d1,d0           | Right shift.
                    126:        addql   #1,d0           | Round.
                    127:        lsrl    #1,d0           | Finish shift.
                    128:        jra     Fintsign
                    129:  
                    130: RTENTRY(Frints)
                    131:         movel   d0,d1           | d1 gets x.
                    132:         bclr    #31,d1          | d1 gets abs(x).
                    133:         cmpl    #0x3f000000,d1
                    134:         bgts    gthalf          | Branch if abs(x) > 0.5.
                    135:         clrl    d0             | Result is zero.
                    136:         jra    Fintsdone
                    137: gthalf:
                    138:         cmpl    #0x4f000000,d1
                    139:         bles    1f             | Branch if 0.5 < |x| <= 2**31.
                    140:         movel  #0x80000000,d0  | Max negative integer.
                    141:         jra    Fintsdone
                    142: 1:
                    143:         movel   d0,a0           | Save x.
                    144:        andl    #0x7fffff,d0    | Clear sign and exponent.
                    145:        bset    #23,d0          | Set I bit.
                    146:        roll    #1,d1
                    147:         roll    #8,d1
                    148:         andw    #0xff,d1        | d1 gets biased exponent.
                    149:         subw    #23+0x7f,d1     | d1 gets unbiased exponent - 23 = left shift count.
                    150:         jeq    Fintsign        | Branch if no shift indicated.
                    151:        jpl     Fintsleft       | Branch if right shift indicated.
                    152:        movel   d2,a1           | a1 saves d2.
                    153:        movel   d0,d2
                    154:        negw    d1              | Reverse count.
                    155:        lsrl    d1,d0           | Right shift.
                    156:        negw    d1
                    157:        addw    #32,d1
                    158:        lsll    d1,d2           | d2 gets round and sticky bits.
                    159:        addl    #0x80000000,d2  | Round.
                    160:        bccs    2f              | Branch if no carry out.
                    161:        addl    #1,d0           | Propagate carry.
                    162:        tstl    d2
                    163:        bnes    2f              | Branch if not ambiguous.
                    164:        bclr    #0,d0           | Force even.
                    165: 2:
                    166:        movel   a1,d2           | Restore d2.
                    167:        jra     Fintsign
                    168:  

unix.superglobalmegacorp.com

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