History

Fix conversions of subnormals to long double

those need to be normalized when extending from float/double to binary128.

Michael Matz committed 6 years ago

Commit 2e798521 parent a6142692 files · +40 −4Browse files

Unified · Split

2 files
  1. lib/lib-arm64.c +13 −2
  2. tests/tcctest.c +27 −2
lib/lib-arm64.c+13−2
@@ -387,7 +387,12 @@ long double __extendsftf2(float f) · 386 unmodified lines
387387 else if (a << 1 >> 24 == 255)
388388 x.x1 = (0x7fff000000000000 | aa >> 31 << 63 | aa << 41 >> 16 |
389389 (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
391396 x.x1 = (aa >> 31 << 63 | ((aa >> 23 & 255) + 16256) << 48 |
392397 aa << 41 >> 16);
393398 memcpy(&fx, &x, 16);
@@ -406,7 +411,13 @@ long double __extenddftf2(double f) · 12 unmodified lines
406411 else if (a << 1 >> 53 == 2047)
407412 x.x1 = (0x7fff000000000000 | a >> 63 << 63 | a << 12 >> 16 |
408413 (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
410421 x.x1 = a >> 63 << 63 | ((a >> 52 & 2047) + 15360) << 48 | a << 12 >> 16;
411422 memcpy(&fx, &x, 16);
412423 return fx;
tests/tcctest.c+27−2
@@ -2215,13 +2215,14 @@ double ftab1[3] = { 1.2, 3.4, -5.6 }; · 2214 unmodified lines
22152215 void float_test(void)
22162216 {
22172217 #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;
22202220 int a;
22212221 unsigned int b;
22222222 static double nan2 = 0.0/0.0;
22232223 static double inf1 = 1.0/0.0;
22242224 static double inf2 = 1e5000;
2225+ volatile LONG_DOUBLE la;
22252226
22262227 printf("sizeof(float) = %d\n", sizeof(float));
22272228 printf("sizeof(double) = %d\n", sizeof(double));
@@ -2243,6 +2244,30 @@ void float_test(void) · 15 unmodified lines
22432244 db = b;
22442245 printf("db = %f\n", db);
22452246 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);
22462271 #endif
22472272 }
22482273

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t