Changeset 1266543 in mainline for softfloat/generic/add.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/add.c
rb7e65d4 r1266543 36 36 { 37 37 int expdiff; 38 __u32 exp1, exp2, mant1, mant2;38 __u32 exp1, exp2,frac1, frac2; 39 39 40 40 expdiff = a.parts.exp - b.parts.exp; 41 41 if (expdiff < 0) { 42 42 if (isFloat32NaN(b)) { 43 / /TODO: fix SigNaN43 /* TODO: fix SigNaN */ 44 44 if (isFloat32SigNaN(b)) { 45 45 }; … … 52 52 } 53 53 54 mant1 = b.parts.mantisa;54 frac1 = b.parts.fraction; 55 55 exp1 = b.parts.exp; 56 mant2 = a.parts.mantisa;56 frac2 = a.parts.fraction; 57 57 exp2 = a.parts.exp; 58 58 expdiff *= -1; 59 59 } else { 60 if ( isFloat32NaN(a)) {61 / /TODO: fix SigNaN60 if ((isFloat32NaN(a)) || (isFloat32NaN(b))) { 61 /* TODO: fix SigNaN */ 62 62 if (isFloat32SigNaN(a) || isFloat32SigNaN(b)) { 63 63 }; 64 return a;64 return (isFloat32NaN(a)?a:b); 65 65 }; 66 66 … … 69 69 } 70 70 71 mant1 = a.parts.mantisa;71 frac1 = a.parts.fraction; 72 72 exp1 = a.parts.exp; 73 mant2 = b.parts.mantisa;73 frac2 = b.parts.fraction; 74 74 exp2 = b.parts.exp; 75 75 }; … … 77 77 if (exp1 == 0) { 78 78 /* both are denormalized */ 79 mant1 += mant2;80 if ( mant1 & FLOAT32_HIDDEN_BIT_MASK ) {79 frac1 += frac2; 80 if (frac1 & FLOAT32_HIDDEN_BIT_MASK ) { 81 81 /* result is not denormalized */ 82 82 a.parts.exp = 1; 83 83 }; 84 a.parts. mantisa = mant1;84 a.parts.fraction = frac1; 85 85 return a; 86 86 }; 87 87 88 mant1 |= FLOAT32_HIDDEN_BIT_MASK; //add hidden bit88 frac1 |= FLOAT32_HIDDEN_BIT_MASK; /* add hidden bit */ 89 89 90 90 if (exp2 == 0) { … … 93 93 } else { 94 94 /* add hidden bit to second operand */ 95 mant2 |= FLOAT32_HIDDEN_BIT_MASK;95 frac2 |= FLOAT32_HIDDEN_BIT_MASK; 96 96 }; 97 97 98 98 /* create some space for rounding */ 99 mant1 <<= 6; 100 mant2 <<= 6; 101 102 if (expdiff > (FLOAT32_MANTISA_SIZE + 1) ) { 103 goto done; 104 }; 105 106 mant2 >>= expdiff; 107 mant1 += mant2; 108 done: 109 if (mant1 & (FLOAT32_HIDDEN_BIT_MASK << 7) ) { 110 ++exp1; 111 mant1 >>= 1; 112 }; 113 114 /* rounding - if first bit after mantisa is set then round up */ 115 mant1 += (0x1 << 5); 116 117 if (mant1 & (FLOAT32_HIDDEN_BIT_MASK << 7)) { 118 ++exp1; 119 mant1 >>= 1; 120 }; 99 frac1 <<= 6; 100 frac2 <<= 6; 101 102 if (expdiff < (FLOAT32_FRACTION_SIZE + 2) ) { 103 frac2 >>= expdiff; 104 frac1 += frac2; 105 }; 106 107 if (frac1 & (FLOAT32_HIDDEN_BIT_MASK << 7) ) { 108 ++exp1; 109 frac1 >>= 1; 110 }; 111 112 /* rounding - if first bit after fraction is set then round up */ 113 frac1 += (0x1 << 5); 114 115 if (frac1 & (FLOAT32_HIDDEN_BIT_MASK << 7)) { 116 /* rounding overflow */ 117 ++exp1; 118 frac1 >>= 1; 119 }; 120 121 if ((a.parts.exp == FLOAT32_MAX_EXPONENT ) || (a.parts.exp < exp1)) { 122 /* overflow - set infinity as result */ 123 a.parts.exp = FLOAT32_MAX_EXPONENT; 124 a.parts.fraction = 0; 125 return a; 126 } 121 127 122 128 a.parts.exp = exp1; 123 129 124 130 /*Clear hidden bit and shift */ 125 a.parts. mantisa = ((mant1 >> 6) & (~FLOAT32_HIDDEN_BIT_MASK)) ;131 a.parts.fraction = ((frac1 >> 6) & (~FLOAT32_HIDDEN_BIT_MASK)) ; 126 132 return a; 127 133 } … … 134 140 int expdiff; 135 141 __u32 exp1, exp2; 136 __u64 mant1, mant2;142 __u64 frac1, frac2; 137 143 138 144 expdiff = a.parts.exp - b.parts.exp; 139 145 if (expdiff < 0) { 140 146 if (isFloat64NaN(b)) { 141 / /TODO: fix SigNaN147 /* TODO: fix SigNaN */ 142 148 if (isFloat64SigNaN(b)) { 143 149 }; … … 151 157 } 152 158 153 mant1 = b.parts.mantisa;159 frac1 = b.parts.fraction; 154 160 exp1 = b.parts.exp; 155 mant2 = a.parts.mantisa;161 frac2 = a.parts.fraction; 156 162 exp2 = a.parts.exp; 157 163 expdiff *= -1; 158 164 } else { 159 165 if (isFloat64NaN(a)) { 160 / /TODO: fix SigNaN166 /* TODO: fix SigNaN */ 161 167 if (isFloat64SigNaN(a) || isFloat64SigNaN(b)) { 162 168 }; … … 169 175 } 170 176 171 mant1 = a.parts.mantisa;177 frac1 = a.parts.fraction; 172 178 exp1 = a.parts.exp; 173 mant2 = b.parts.mantisa;179 frac2 = b.parts.fraction; 174 180 exp2 = b.parts.exp; 175 181 }; … … 177 183 if (exp1 == 0) { 178 184 /* both are denormalized */ 179 mant1 += mant2;180 if ( mant1 & FLOAT64_HIDDEN_BIT_MASK) {185 frac1 += frac2; 186 if (frac1 & FLOAT64_HIDDEN_BIT_MASK) { 181 187 /* result is not denormalized */ 182 188 a.parts.exp = 1; 183 189 }; 184 a.parts. mantisa = mant1;190 a.parts.fraction = frac1; 185 191 return a; 186 192 }; 187 193 188 /* add hidden bit - mant1 is sure not denormalized */189 mant1 |= FLOAT64_HIDDEN_BIT_MASK;194 /* add hidden bit - frac1 is sure not denormalized */ 195 frac1 |= FLOAT64_HIDDEN_BIT_MASK; 190 196 191 197 /* second operand ... */ … … 195 201 } else { 196 202 /* is not denormalized */ 197 mant2 |= FLOAT64_HIDDEN_BIT_MASK;203 frac2 |= FLOAT64_HIDDEN_BIT_MASK; 198 204 }; 199 205 200 206 /* create some space for rounding */ 201 mant1 <<= 6; 202 mant2 <<= 6; 203 204 if (expdiff > (FLOAT64_MANTISA_SIZE + 1) ) { 205 goto done; 206 }; 207 208 mant2 >>= expdiff; 209 mant1 += mant2; 210 done: 211 if (mant1 & (FLOAT64_HIDDEN_BIT_MASK << 7) ) { 212 ++exp1; 213 mant1 >>= 1; 214 }; 215 216 /* rounding - if first bit after mantisa is set then round up */ 217 mant1 += (0x1 << 5); 218 219 if (mant1 & (FLOAT64_HIDDEN_BIT_MASK << 7)) { 220 ++exp1; 221 mant1 >>= 1; 222 }; 207 frac1 <<= 6; 208 frac2 <<= 6; 209 210 if (expdiff < (FLOAT64_FRACTION_SIZE + 2) ) { 211 frac2 >>= expdiff; 212 frac1 += frac2; 213 }; 214 215 if (frac1 & (FLOAT64_HIDDEN_BIT_MASK << 7) ) { 216 ++exp1; 217 frac1 >>= 1; 218 }; 219 220 /* rounding - if first bit after fraction is set then round up */ 221 frac1 += (0x1 << 5); 222 223 if (frac1 & (FLOAT64_HIDDEN_BIT_MASK << 7)) { 224 /* rounding overflow */ 225 ++exp1; 226 frac1 >>= 1; 227 }; 228 229 if ((a.parts.exp == FLOAT64_MAX_EXPONENT ) || (a.parts.exp < exp1)) { 230 /* overflow - set infinity as result */ 231 a.parts.exp = FLOAT64_MAX_EXPONENT; 232 a.parts.fraction = 0; 233 return a; 234 } 223 235 224 236 a.parts.exp = exp1; 225 237 /*Clear hidden bit and shift */ 226 a.parts. mantisa = ( (mant1 >> 6 ) & (~FLOAT64_HIDDEN_BIT_MASK));238 a.parts.fraction = ( (frac1 >> 6 ) & (~FLOAT64_HIDDEN_BIT_MASK)); 227 239 return a; 228 240 }
Note:
See TracChangeset
for help on using the changeset viewer.