those need to be normalized when extending from float/double to binary128.
Unified · Split
| @@ -387,7 +387,12 @@ long double __extendsftf2(float f) · 386 unmodified lines | ||
| 387 | 387 | else if (a << 1 >> 24 == 255) |
| 388 | 388 | x.x1 = (0x7fff000000000000 | aa >> 31 << 63 | aa << 41 >> 16 | |
| 389 | 389 | (uint64_t)!!(a << 9) << 47); |
| 390 | − else | |
| 390 | + else if (a << 1 >> 24 == 0) { | |
| 391 | + uint64_t adj = 0; | |
| 392 | + while (!(a << 1 >> 1 >> (23 - adj))) | |
| 393 | + adj++; | |
| 394 | + x.x1 = aa >> 31 << 63 | (16256 - adj + 1) << 48 | aa << adj << 41 >> 16; | |
| 395 | + } else | |
| 391 | 396 | x.x1 = (aa >> 31 << 63 | ((aa >> 23 & 255) + 16256) << 48 | |
| 392 | 397 | aa << 41 >> 16); |
| 393 | 398 | memcpy(&fx, &x, 16); |
| @@ -406,7 +411,13 @@ long double __extenddftf2(double f) · 12 unmodified lines | ||
| 406 | 411 | else if (a << 1 >> 53 == 2047) |
| 407 | 412 | x.x1 = (0x7fff000000000000 | a >> 63 << 63 | a << 12 >> 16 | |
| 408 | 413 | (uint64_t)!!(a << 12) << 47); |
| 409 | − else | |
| 414 | + else if (a << 1 >> 53 == 0) { | |
| 415 | + uint64_t adj = 0; | |
| 416 | + while (!(a << 1 >> 1 >> (52 - adj))) | |
| 417 | + adj++; | |
| 418 | + x.x0 <<= adj; | |
| 419 | + x.x1 = a >> 63 << 63 | (15360 - adj + 1) << 48 | a << adj << 12 >> 16; | |
| 420 | + } else | |
| 410 | 421 | x.x1 = a >> 63 << 63 | ((a >> 52 & 2047) + 15360) << 48 | a << 12 >> 16; |
| 411 | 422 | memcpy(&fx, &x, 16); |
| 412 | 423 | return fx; |
| @@ -2215,13 +2215,14 @@ double ftab1[3] = { 1.2, 3.4, -5.6 }; · 2214 unmodified lines | ||
| 2215 | 2215 | void float_test(void) |
| 2216 | 2216 | { |
| 2217 | 2217 | #if !defined(__arm__) || defined(__ARM_PCS_VFP) |
| 2218 | − float fa, fb; | |
| 2219 | − double da, db; | |
| 2218 | + volatile float fa, fb; | |
| 2219 | + volatile double da, db; | |
| 2220 | 2220 | int a; |
| 2221 | 2221 | unsigned int b; |
| 2222 | 2222 | static double nan2 = 0.0/0.0; |
| 2223 | 2223 | static double inf1 = 1.0/0.0; |
| 2224 | 2224 | static double inf2 = 1e5000; |
| 2225 | + volatile LONG_DOUBLE la; | |
| 2225 | 2226 | |
| 2226 | 2227 | printf("sizeof(float) = %d\n", sizeof(float)); |
| 2227 | 2228 | printf("sizeof(double) = %d\n", sizeof(double)); |
| @@ -2243,6 +2244,30 @@ void float_test(void) · 15 unmodified lines | ||
| 2243 | 2244 | db = b; |
| 2244 | 2245 | printf("db = %f\n", db); |
| 2245 | 2246 | printf("nan != nan = %d, inf1 = %f, inf2 = %f\n", nan2 != nan2, inf1, inf2); |
| 2247 | + da = 0x0.88p-1022; /* a subnormal */ | |
| 2248 | + la = da; | |
| 2249 | + printf ("da subnormal = %a\n", da); | |
| 2250 | + printf ("da subnormal = %.40g\n", da); | |
| 2251 | + printf ("la subnormal = %La\n", la); | |
| 2252 | + printf ("la subnormal = %.40Lg\n", la); | |
| 2253 | + da /= 2; | |
| 2254 | + la = da; | |
| 2255 | + printf ("da/2 subnormal = %a\n", da); | |
| 2256 | + printf ("da/2 subnormal = %.40g\n", da); | |
| 2257 | + printf ("la/2 subnormal = %La\n", la); | |
| 2258 | + printf ("la/2 subnormal = %.40Lg\n", la); | |
| 2259 | + fa = 0x0.88p-126f; /* a subnormal */ | |
| 2260 | + la = fa; | |
| 2261 | + printf ("fa subnormal = %a\n", fa); | |
| 2262 | + printf ("fa subnormal = %.40g\n", fa); | |
| 2263 | + printf ("la subnormal = %La\n", la); | |
| 2264 | + printf ("la subnormal = %.40Lg\n", la); | |
| 2265 | + fa /= 2; | |
| 2266 | + la = fa; | |
| 2267 | + printf ("fa/2 subnormal = %a\n", fa); | |
| 2268 | + printf ("fa/2 subnormal = %.40g\n", fa); | |
| 2269 | + printf ("la/2 subnormal = %La\n", la); | |
| 2270 | + printf ("la/2 subnormal = %.40Lg\n", la); | |
| 2246 | 2271 | #endif |
| 2247 | 2272 | } |
| 2248 | 2273 | |