Changeset 1d83419 in mainline for softfloat/generic/common.c


Ignore:
Timestamp:
2006-02-24T17:27:19Z (19 years ago)
Author:
Josef Cejka <malyzelenyhnus@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
ba5870d
Parents:
a82695c
Message:

32 bit integers to float type conversions.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • softfloat/generic/common.c

    ra82695c r1d83419  
    3030#include<common.h>
    3131
     32/* Table for fast leading zeroes counting */
     33char zeroTable[256] = {
     34        8, 7, 7, 6, 6, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, \
     35        3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, \
     36        2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \
     37        2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \
     38        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
     39        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
     40        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
     41        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
     42        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
     43        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
     44        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
     45        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
     46        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
     47        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
     48        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
     49        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
     50};
     51
     52
     53
    3254/** Take fraction shifted by 10 bits to left, round it, normalize it and detect exceptions
    3355 * @param exp exponent with bias
     
    6385                cfrac += (0x1 << (64 - FLOAT64_FRACTION_SIZE - 3));
    6486               
    65                 if (!(cfrac & (FLOAT64_HIDDEN_BIT_MASK << (64 - FLOAT64_HIDDEN_BIT_MASK - 1)))) {
     87                if (!(cfrac & (FLOAT64_HIDDEN_BIT_MASK << (64 - FLOAT64_FRACTION_SIZE - 1)))) {
    6688                       
    6789                        result.parts.fraction = ((cfrac >>(64 - FLOAT64_FRACTION_SIZE - 2) ) & (~FLOAT64_HIDDEN_BIT_MASK));
     
    94116}
    95117
     118/** Counts leading zeroes in 64bit unsigned integer
     119 * @param i
     120 */
     121int countZeroes64(__u64 i)
     122{
     123        int j;
     124        for (j =0; j < 64; j += 8) {
     125                if ( i & (0xFFll << (56 - j))) {
     126                        return (j + countZeroes8(i >> (56 - j)));
     127                }
     128        }
     129
     130        return 64;
     131}
     132
     133/** Counts leading zeroes in 32bit unsigned integer
     134 * @param i
     135 */
     136int countZeroes32(__u32 i)
     137{
     138        int j;
     139        for (j =0; j < 32; j += 8) {
     140                if ( i & (0xFF << (24 - j))) {
     141                        return (j + countZeroes8(i >> (24 - j)));
     142                }
     143        }
     144
     145        return 32;
     146}
     147
     148/** Counts leading zeroes in byte
     149 * @param i
     150 */
     151int countZeroes8(__u8 i)
     152{
     153        return zeroTable[i];
     154}
     155
     156/** Round and normalize number expressed by exponent and fraction with first bit (equal to hidden bit) at 30. bit
     157 * @param exp exponent
     158 * @param fraction part with hidden bit shifted to 30. bit
     159 */
     160void roundFloat32(__s32 *exp, __u32 *fraction)
     161{
     162        /* rounding - if first bit after fraction is set then round up */
     163        (*fraction) += (0x1 << 6);
     164       
     165        if ((*fraction) & (FLOAT32_HIDDEN_BIT_MASK << 8)) {
     166                /* rounding overflow */
     167                ++(*exp);
     168                (*fraction) >>= 1;
     169        };
     170       
     171        if (((*exp) >= FLOAT32_MAX_EXPONENT ) || ((*exp) < 0)) {
     172                /* overflow - set infinity as result */
     173                (*exp) = FLOAT32_MAX_EXPONENT;
     174                (*fraction) = 0;
     175                return;
     176        }
     177
     178        return;
     179}
     180
     181/** Round and normalize number expressed by exponent and fraction with first bit (equal to hidden bit) at 62. bit
     182 * @param exp exponent
     183 * @param fraction part with hidden bit shifted to 62. bit
     184 */
     185void roundFloat64(__s32 *exp, __u64 *fraction)
     186{
     187        /* rounding - if first bit after fraction is set then round up */
     188        (*fraction) += (0x1 << 9);
     189       
     190        if ((*fraction) & (FLOAT64_HIDDEN_BIT_MASK << 11)) {
     191                /* rounding overflow */
     192                ++(*exp);
     193                (*fraction) >>= 1;
     194        };
     195       
     196        if (((*exp) >= FLOAT64_MAX_EXPONENT ) || ((*exp) < 0)) {
     197                /* overflow - set infinity as result */
     198                (*exp) = FLOAT64_MAX_EXPONENT;
     199                (*fraction) = 0;
     200                return;
     201        }
     202
     203        return;
     204}
     205
Note: See TracChangeset for help on using the changeset viewer.