Changeset 1266543 in mainline for softfloat/generic/sub.c
- Timestamp:
- 2006-02-07T00:41:18Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 1a030b8
- Parents:
- b7e65d4
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
softfloat/generic/sub.c
rb7e65d4 r1266543 36 36 { 37 37 int expdiff; 38 __u32 exp1, exp2, mant1, mant2;38 __u32 exp1, exp2, frac1, frac2; 39 39 float32 result; 40 40 … … 42 42 43 43 expdiff = a.parts.exp - b.parts.exp; 44 if ((expdiff < 0 ) || ((expdiff == 0) && (a.parts. mantisa < b.parts.mantisa))) {44 if ((expdiff < 0 ) || ((expdiff == 0) && (a.parts.fraction < b.parts.fraction))) { 45 45 if (isFloat32NaN(b)) { 46 / /TODO: fix SigNaN46 /* TODO: fix SigNaN */ 47 47 if (isFloat32SigNaN(b)) { 48 48 }; … … 57 57 result.parts.sign = !a.parts.sign; 58 58 59 mant1 = b.parts.mantisa;59 frac1 = b.parts.fraction; 60 60 exp1 = b.parts.exp; 61 mant2 = a.parts.mantisa;61 frac2 = a.parts.fraction; 62 62 exp2 = a.parts.exp; 63 63 expdiff *= -1; 64 64 } else { 65 65 if (isFloat32NaN(a)) { 66 / /TODO: fix SigNaN66 /* TODO: fix SigNaN */ 67 67 if (isFloat32SigNaN(a) || isFloat32SigNaN(b)) { 68 68 }; … … 73 73 if (b.parts.exp == FLOAT32_MAX_EXPONENT) { 74 74 /* inf - inf => nan */ 75 / /TODO: fix exception75 /* TODO: fix exception */ 76 76 result.binary = FLOAT32_NAN; 77 77 return result; … … 82 82 result.parts.sign = a.parts.sign; 83 83 84 mant1 = a.parts.mantisa;84 frac1 = a.parts.fraction; 85 85 exp1 = a.parts.exp; 86 mant2 = b.parts.mantisa;86 frac2 = b.parts.fraction; 87 87 exp2 = b.parts.exp; 88 88 }; 89 89 90 90 if (exp1 == 0) { 91 / /both are denormalized92 result.parts. mantisa = mant1-mant2;93 if (result.parts. mantisa > mant1) {94 / /TODO: underflow exception91 /* both are denormalized */ 92 result.parts.fraction = frac1-frac2; 93 if (result.parts.fraction > frac1) { 94 /* TODO: underflow exception */ 95 95 return result; 96 96 }; … … 100 100 101 101 /* add hidden bit */ 102 mant1 |= FLOAT32_HIDDEN_BIT_MASK;102 frac1 |= FLOAT32_HIDDEN_BIT_MASK; 103 103 104 104 if (exp2 == 0) { … … 107 107 } else { 108 108 /* normalized */ 109 mant2 |= FLOAT32_HIDDEN_BIT_MASK;109 frac2 |= FLOAT32_HIDDEN_BIT_MASK; 110 110 }; 111 111 112 112 /* create some space for rounding */ 113 mant1 <<= 6;114 mant2 <<= 6;115 116 if (expdiff > FLOAT32_ MANTISA_SIZE + 1) {113 frac1 <<= 6; 114 frac2 <<= 6; 115 116 if (expdiff > FLOAT32_FRACTION_SIZE + 1) { 117 117 goto done; 118 118 }; 119 119 120 mant1 = mant1 - (mant2 >> expdiff);120 frac1 = frac1 - (frac2 >> expdiff); 121 121 done: 122 / /TODO: find first nonzero digit and shift result and detect possibly underflow123 while ((exp1 > 0) && (!( mant1 & (FLOAT32_HIDDEN_BIT_MASK << 6 )))) {122 /* TODO: find first nonzero digit and shift result and detect possibly underflow */ 123 while ((exp1 > 0) && (!(frac1 & (FLOAT32_HIDDEN_BIT_MASK << 6 )))) { 124 124 --exp1; 125 mant1 <<= 1;126 /* TODO: fix underflow - mant1 == 0 does not necessary means underflow... */127 }; 128 129 /* rounding - if first bit after mantisais set then round up */130 mant1 += 0x20;131 132 if ( mant1 & (FLOAT32_HIDDEN_BIT_MASK << 7)) {125 frac1 <<= 1; 126 /* TODO: fix underflow - frac1 == 0 does not necessary means underflow... */ 127 }; 128 129 /* rounding - if first bit after fraction is set then round up */ 130 frac1 += 0x20; 131 132 if (frac1 & (FLOAT32_HIDDEN_BIT_MASK << 7)) { 133 133 ++exp1; 134 mant1 >>= 1;134 frac1 >>= 1; 135 135 }; 136 136 137 137 /*Clear hidden bit and shift */ 138 result.parts. mantisa = ((mant1 >> 6) & (~FLOAT32_HIDDEN_BIT_MASK));138 result.parts.fraction = ((frac1 >> 6) & (~FLOAT32_HIDDEN_BIT_MASK)); 139 139 result.parts.exp = exp1; 140 140 … … 148 148 int expdiff; 149 149 __u32 exp1, exp2; 150 __u64 mant1, mant2;150 __u64 frac1, frac2; 151 151 float64 result; 152 152 … … 154 154 155 155 expdiff = a.parts.exp - b.parts.exp; 156 if ((expdiff < 0 ) || ((expdiff == 0) && (a.parts. mantisa < b.parts.mantisa))) {156 if ((expdiff < 0 ) || ((expdiff == 0) && (a.parts.fraction < b.parts.fraction))) { 157 157 if (isFloat64NaN(b)) { 158 / /TODO: fix SigNaN158 /* TODO: fix SigNaN */ 159 159 if (isFloat64SigNaN(b)) { 160 160 }; … … 169 169 result.parts.sign = !a.parts.sign; 170 170 171 mant1 = b.parts.mantisa;171 frac1 = b.parts.fraction; 172 172 exp1 = b.parts.exp; 173 mant2 = a.parts.mantisa;173 frac2 = a.parts.fraction; 174 174 exp2 = a.parts.exp; 175 175 expdiff *= -1; 176 176 } else { 177 177 if (isFloat64NaN(a)) { 178 / /TODO: fix SigNaN178 /* TODO: fix SigNaN */ 179 179 if (isFloat64SigNaN(a) || isFloat64SigNaN(b)) { 180 180 }; … … 185 185 if (b.parts.exp == FLOAT64_MAX_EXPONENT) { 186 186 /* inf - inf => nan */ 187 / /TODO: fix exception187 /* TODO: fix exception */ 188 188 result.binary = FLOAT64_NAN; 189 189 return result; … … 194 194 result.parts.sign = a.parts.sign; 195 195 196 mant1 = a.parts.mantisa;196 frac1 = a.parts.fraction; 197 197 exp1 = a.parts.exp; 198 mant2 = b.parts.mantisa;198 frac2 = b.parts.fraction; 199 199 exp2 = b.parts.exp; 200 200 }; 201 201 202 202 if (exp1 == 0) { 203 / /both are denormalized204 result.parts. mantisa = mant1 - mant2;205 if (result.parts. mantisa > mant1) {206 / /TODO: underflow exception203 /* both are denormalized */ 204 result.parts.fraction = frac1 - frac2; 205 if (result.parts.fraction > frac1) { 206 /* TODO: underflow exception */ 207 207 return result; 208 208 }; … … 212 212 213 213 /* add hidden bit */ 214 mant1 |= FLOAT64_HIDDEN_BIT_MASK;214 frac1 |= FLOAT64_HIDDEN_BIT_MASK; 215 215 216 216 if (exp2 == 0) { … … 219 219 } else { 220 220 /* normalized */ 221 mant2 |= FLOAT64_HIDDEN_BIT_MASK;221 frac2 |= FLOAT64_HIDDEN_BIT_MASK; 222 222 }; 223 223 224 224 /* create some space for rounding */ 225 mant1 <<= 6;226 mant2 <<= 6;227 228 if (expdiff > FLOAT64_ MANTISA_SIZE + 1) {225 frac1 <<= 6; 226 frac2 <<= 6; 227 228 if (expdiff > FLOAT64_FRACTION_SIZE + 1) { 229 229 goto done; 230 230 }; 231 231 232 mant1 = mant1 - (mant2 >> expdiff);232 frac1 = frac1 - (frac2 >> expdiff); 233 233 done: 234 / /TODO: find first nonzero digit and shift result and detect possibly underflow235 while ((exp1 > 0) && (!( mant1 & (FLOAT64_HIDDEN_BIT_MASK << 6 )))) {234 /* TODO: find first nonzero digit and shift result and detect possibly underflow */ 235 while ((exp1 > 0) && (!(frac1 & (FLOAT64_HIDDEN_BIT_MASK << 6 )))) { 236 236 --exp1; 237 mant1 <<= 1;238 /* TODO: fix underflow - mant1 == 0 does not necessary means underflow... */239 }; 240 241 /* rounding - if first bit after mantisais set then round up */242 mant1 += 0x20;243 244 if ( mant1 & (FLOAT64_HIDDEN_BIT_MASK << 7)) {237 frac1 <<= 1; 238 /* TODO: fix underflow - frac1 == 0 does not necessary means underflow... */ 239 }; 240 241 /* rounding - if first bit after fraction is set then round up */ 242 frac1 += 0x20; 243 244 if (frac1 & (FLOAT64_HIDDEN_BIT_MASK << 7)) { 245 245 ++exp1; 246 mant1 >>= 1;246 frac1 >>= 1; 247 247 }; 248 248 249 249 /*Clear hidden bit and shift */ 250 result.parts. mantisa = ((mant1 >> 6) & (~FLOAT64_HIDDEN_BIT_MASK));250 result.parts.fraction = ((frac1 >> 6) & (~FLOAT64_HIDDEN_BIT_MASK)); 251 251 result.parts.exp = exp1; 252 252
Note:
See TracChangeset
for help on using the changeset viewer.