d: Merge upstream dmd 09db0c41e, druntime e68a5ae3.
authorIain Buclaw <ibuclaw@gdcproject.org>
Sat, 25 Apr 2020 00:19:04 +0000 (02:19 +0200)
committerIain Buclaw <ibuclaw@gdcproject.org>
Sat, 25 Apr 2020 00:19:04 +0000 (02:19 +0200)
* New core.math.toPrec templates have been added as an intrinsic.

  Some floating point algorithms, such as Kahan-Babuska-Neumaier
  Summation, require rounding to specific precisions. Rounding to
  precision after every operation, however, loses overall precision in
  the general case and is a runtime performance problem.

  Adding these functions guarantee the rounding at required points in
  the code, and document where in the algorithm the requirement exists.

* Support IBM long double types in core.internal.convert.

* Add missing aliases for 64-bit vectors in core.simd.

* RUNNABLE_PHOBOS_TEST directive has been properly integrated into the
  D2 language testsuite.

Reviewed-on: https://github.com/dlang/druntime/pull/3063
     https://github.com/dlang/dmd/pull/11054

gcc/d/ChangeLog:

* intrinsics.cc (expand_intrinsic_toprec): New function.
(maybe_expand_intrinsic): Handle toPrec intrinsics.
* intrinsics.def (TOPRECF, TOPREC, TOPRECL): Add toPrec intrinsics.

61 files changed:
gcc/d/ChangeLog
gcc/d/dmd/MERGE
gcc/d/intrinsics.cc
gcc/d/intrinsics.def
gcc/testsuite/gdc.test/compilable/interpret3.d
gcc/testsuite/gdc.test/runnable/builtin.d
gcc/testsuite/gdc.test/runnable/complex.d
gcc/testsuite/gdc.test/runnable/constfold.d
gcc/testsuite/gdc.test/runnable/foreach4.d
gcc/testsuite/gdc.test/runnable/ifti.d
gcc/testsuite/gdc.test/runnable/implicit.d
gcc/testsuite/gdc.test/runnable/inner.d
gcc/testsuite/gdc.test/runnable/interpret.d
gcc/testsuite/gdc.test/runnable/issue8671.d
gcc/testsuite/gdc.test/runnable/lazy.d
gcc/testsuite/gdc.test/runnable/mars1.d
gcc/testsuite/gdc.test/runnable/mixin1.d
gcc/testsuite/gdc.test/runnable/mixin2.d
gcc/testsuite/gdc.test/runnable/s2ir.d
gcc/testsuite/gdc.test/runnable/stress.d
gcc/testsuite/gdc.test/runnable/template4.d
gcc/testsuite/gdc.test/runnable/template9.d
gcc/testsuite/gdc.test/runnable/test10942.d
gcc/testsuite/gdc.test/runnable/test11.d
gcc/testsuite/gdc.test/runnable/test12.d
gcc/testsuite/gdc.test/runnable/test12197.d
gcc/testsuite/gdc.test/runnable/test15.d
gcc/testsuite/gdc.test/runnable/test22.d
gcc/testsuite/gdc.test/runnable/test23.d
gcc/testsuite/gdc.test/runnable/test24.d
gcc/testsuite/gdc.test/runnable/test27.d
gcc/testsuite/gdc.test/runnable/test28.d
gcc/testsuite/gdc.test/runnable/test34.d
gcc/testsuite/gdc.test/runnable/test37.d
gcc/testsuite/gdc.test/runnable/test42.d
gcc/testsuite/gdc.test/runnable/test5305.d
gcc/testsuite/gdc.test/runnable/test60.d
gcc/testsuite/gdc.test/runnable/testaa.d
gcc/testsuite/gdc.test/runnable/testbitarray.d
gcc/testsuite/gdc.test/runnable/testdstress.d
gcc/testsuite/gdc.test/runnable/testfile.d
gcc/testsuite/gdc.test/runnable/testformat.d
gcc/testsuite/gdc.test/runnable/testline.d
gcc/testsuite/gdc.test/runnable/testmmfile.d
gcc/testsuite/gdc.test/runnable/testscope2.d
gcc/testsuite/gdc.test/runnable/testsignals.d
gcc/testsuite/gdc.test/runnable/testsocket.d
gcc/testsuite/gdc.test/runnable/teststdio.d
gcc/testsuite/gdc.test/runnable/testthread2.d
gcc/testsuite/gdc.test/runnable/testtypeid.d
gcc/testsuite/gdc.test/runnable/traits.d
gcc/testsuite/gdc.test/runnable/wc.d
gcc/testsuite/gdc.test/runnable/wc2.d
gcc/testsuite/gdc.test/runnable/wc3.d
gcc/testsuite/gdc.test/runnable/xtest46.d
gcc/testsuite/gdc.test/runnable/xtest55.d
libphobos/libdruntime/MERGE
libphobos/libdruntime/core/cpuid.d
libphobos/libdruntime/core/internal/convert.d
libphobos/libdruntime/core/math.d
libphobos/libdruntime/core/simd.d

index b96f0ffb82f5921bd1236ba483d4aa4404581683..7bb38a8b0e740a5777d7dc452fac2f42d7a162d3 100644 (file)
@@ -1,3 +1,9 @@
+2020-04-25  Iain Buclaw  <ibuclaw@gdcproject.org>
+
+       * intrinsics.cc (expand_intrinsic_toprec): New function.
+       (maybe_expand_intrinsic): Handle toPrec intrinsics.
+       * intrinsics.def (TOPRECF, TOPREC, TOPRECL): Add toPrec intrinsics.
+
 2020-04-24  Iain Buclaw  <ibuclaw@gdcproject.org>
 
        * d-spec.cc (need_phobos): Remove.
index 155286dd765541563dc02efcf13ff3541b330de1..a878cb9f42ea85edffe1cb882412bde6233ffd2f 100644 (file)
@@ -1,4 +1,4 @@
-62ce36f3737de691217c21f0173f411734eb1d43
+09db0c41ee922502fa0966bde24c1cb9b15ad436
 
 The first line of this file holds the git revision number of the last
 merge done from the dlang/dmd repository.
index 9a9fd41727fd0b0ae5d6df5863b27b351da226a6..c7bde88e5cdf68423b2477e47e6b36c7e7d01a7e 100644 (file)
@@ -467,6 +467,25 @@ expand_intrinsic_pow (tree callexp)
                          base, exponent);
 }
 
+/* Expand a front-end intrinsic call to toPrec().  This takes one argument, the
+   signature to which can be either:
+
+       T toPrec(T)(float f);
+       T toPrec(T)(double f);
+       T toPrec(T)(real f);
+
+    This rounds the argument F to the precision of the specified floating
+    point type T.  The original call expression is held in CALLEXP.  */
+
+static tree
+expand_intrinsic_toprec (tree callexp)
+{
+  tree f = CALL_EXPR_ARG (callexp, 0);
+  tree type = TREE_TYPE (callexp);
+
+  return convert (type, f);
+}
+
 /* Expand a front-end intrinsic call to va_arg().  This takes either one or two
    arguments, the signature to which can be either:
 
@@ -818,6 +837,9 @@ maybe_expand_intrinsic (tree callexp)
                              CALL_EXPR_ARG (callexp, 1),
                              CALL_EXPR_ARG (callexp, 2));
 
+    case INTRINSIC_TOPREC:
+      return expand_intrinsic_toprec (callexp);
+
     case INTRINSIC_VA_ARG:
     case INTRINSIC_C_VA_ARG:
       return expand_intrinsic_vaarg (callexp);
index 3c8ed101848fbf93d4ae81ab2687d98e7dbfca3a..1782cd7f5078506e9c3a73444c702d81d3cf320d 100644 (file)
@@ -95,6 +95,9 @@ DEF_D_BUILTIN (SIN, SIN, "sin", "core.math", "FNaNbNiNfeZe")
 DEF_D_BUILTIN (SQRTF, SQRTF, "sqrt", "core.math", "FNaNbNiNffZf")
 DEF_D_BUILTIN (SQRT, SQRT, "sqrt", "core.math", "FNaNbNiNfdZd")
 DEF_D_BUILTIN (SQRTL, SQRTL, "sqrt", "core.math", "FNaNbNiNfeZe")
+DEF_D_BUILTIN (TOPRECF, TOPREC, "toPrec", "core.math", "FNaNbNffZI1T")
+DEF_D_BUILTIN (TOPREC, TOPREC, "toPrec", "core.math", "FNaNbNfdZI1T")
+DEF_D_BUILTIN (TOPRECL, TOPREC, "toPrec", "core.math", "FNaNbNfeZI1T")
 
 /* std.math intrinsics.  */
 
index 36cdd13148b9c1c58ad4cadf0eb56cc9c8b4cf95..14d1a12c240bcf7bb9ca0eab22404f2716761b12 100644 (file)
@@ -7742,3 +7742,19 @@ struct RBNode(T)
 
 static assert(!__traits(compiles, { alias bug18057 = RBNode!int; }));
 
+/************************************************/
+// https://issues.dlang.org/show_bug.cgi?id=9937
+
+int test9937()
+{
+    import core.math;
+
+    float x = float.max;
+    x *= 2;
+    x = toPrec!float(x);
+    x /= 2;
+    assert(x == float.infinity);
+    return 1;
+}
+
+static assert(test9937());
index d7ac356757ff6da6059cc6bab404acbc2c579724..44817b16ee0800f02ba2bd062e64018e23ad16a7 100644 (file)
@@ -1,3 +1,4 @@
+// RUNNABLE_PHOBOS_TEST
 
 import std.stdio;
 import std.math;
@@ -116,4 +117,3 @@ int main()
     printf("Success\n");
     return 0;
 }
-// RUNNABLE_PHOBOS_TEST
index 49bb3097aefc3ac6d74b29d8964f6aa26d050077..78fe574b3109d3f400fa0ea3ec066610d07cb66b 100644 (file)
@@ -1,3 +1,4 @@
+// RUNNABLE_PHOBOS_TEST
 // PERMUTE_ARGS:
 
 import std.stdio;
@@ -460,4 +461,3 @@ int main(char[][] args)
     return 0;
 }
 
-// RUNNABLE_PHOBOS_TEST
index d56f6c1357cb22141e0ab8c7fe7d89e328c9a559..42406ea44a57fba494eb942a817360df5952ec72 100644 (file)
@@ -1,5 +1,5 @@
 #! blah
-
+// RUNNABLE_PHOBOS_TEST
 static assert(__LINE__ == 3); // fails as __LINE__ is 2
 
 import std.stdio;
@@ -672,4 +672,3 @@ int main()
     printf("Success\n");
     return 0;
 }
-// RUNNABLE_PHOBOS_TEST
index bf8eab45b0e61830b7d8709d25d80d73041855c2..8c9d4218d6e436b746f6ad77197341a288adf24a 100644 (file)
@@ -1,4 +1,4 @@
-
+// RUNNABLE_PHOBOS_TEST
 import core.stdc.stdio;
 import std.stdio;
 
@@ -928,4 +928,3 @@ int main()
     printf("Success\n");
     return 0;
 }
-// RUNNABLE_PHOBOS_TEST
index 0e4edef89830a0dcf4d0dc7d267fc285f7105365..6d669753123ff969b28070eb98eda0b06b7d6c7c 100644 (file)
@@ -1,3 +1,4 @@
+// RUNNABLE_PHOBOS_TEST
 import std.stdio;
 
 struct S {
@@ -118,4 +119,3 @@ void main() {
     }
 
 }
-// RUNNABLE_PHOBOS_TEST
index 89e6ac11b9fa2ee45b09055e523099d234635de9..9170b04adb03f031f9f06de9a8586635905b8058 100644 (file)
@@ -1,4 +1,4 @@
-
+// RUNNABLE_PHOBOS_TEST
 import std.stdio;
 
 /***********************************/
@@ -479,4 +479,3 @@ void main()
 
     writefln("Success");
 }
-// RUNNABLE_PHOBOS_TEST
index 40eb27d57990861d4ca2005d9eb4fdbd93203fc8..e1be7b9cbad3b99b3670db827e7c3e3f89cb6d66 100644 (file)
@@ -1,4 +1,4 @@
-
+// RUNNABLE_PHOBOS_TEST
 import std.stdio;
 
 /*******************************************************/
@@ -916,4 +916,3 @@ int main()
     printf("Success\n");
     return 0;
 }
-// RUNNABLE_PHOBOS_TEST
index eee3930d34bb07d9bca86b06c8b52a556d91d377..b822cadfcd0d66142b9ea56d1046669241b22948 100644 (file)
@@ -1,4 +1,4 @@
-
+// RUNNABLE_PHOBOS_TEST
 import std.stdio;
 
 template Tuple(A...)
@@ -3480,6 +3480,50 @@ void test15681()
     assert(s2.values[1].value == 1);        // OK
 }
 
+/************************************************/
+// toPrec
+
+void testToPrec()
+{
+    import core.math;
+
+    enum real ctpir = 0xc.90fdaa22168c235p-2;
+    enum double ctpid = 0x1.921fb54442d18p+1;
+    enum float ctpif = 0x1.921fb6p+1;
+    static assert(toPrec!float(ctpir) == ctpif);
+    static assert(toPrec!double(ctpir) == ctpid);
+    static assert(toPrec!real(ctpir) == ctpir);
+    static assert(toPrec!float(ctpid) == ctpif);
+    static assert(toPrec!double(ctpid) == ctpid);
+    static assert(toPrec!real(ctpid) == ctpid);
+    static assert(toPrec!float(ctpif) == ctpif);
+    static assert(toPrec!double(ctpif) == ctpif);
+    static assert(toPrec!real(ctpif) == ctpif);
+
+    assert(toPrec!float(ctpir) == ctpif);
+    assert(toPrec!double(ctpir) == ctpid);
+    assert(toPrec!real(ctpir) == ctpir);
+    assert(toPrec!float(ctpid) == ctpif);
+    assert(toPrec!double(ctpid) == ctpid);
+    assert(toPrec!real(ctpid) == ctpid);
+    assert(toPrec!float(ctpif) == ctpif);
+    assert(toPrec!double(ctpif) == ctpif);
+    assert(toPrec!real(ctpif) == ctpif);
+
+    static real rtpir = 0xc.90fdaa22168c235p-2;
+    static double rtpid = 0x1.921fb54442d18p+1;
+    static float rtpif = 0x1.921fb6p+1;
+    assert(toPrec!float(rtpir) == rtpif);
+    assert(toPrec!double(rtpir) == rtpid);
+    assert(toPrec!real(rtpir) == rtpir);
+    assert(toPrec!float(rtpid) == rtpif);
+    assert(toPrec!double(rtpid) == rtpid);
+    assert(toPrec!real(rtpid) == rtpid);
+    assert(toPrec!float(rtpif) == rtpif);
+    assert(toPrec!double(rtpif) == rtpif);
+    assert(toPrec!real(rtpif) == rtpif);
+}
+
 /************************************************/
 
 int main()
@@ -3609,4 +3653,3 @@ int main()
     printf("Success\n");
     return 0;
 }
-// RUNNABLE_PHOBOS_TEST
index 8097e79d6bfed34b56efadb8e4cf2c267462b1a6..c28e63b275b3f1519fbf7ef8f135411ba2091610 100644 (file)
@@ -1,6 +1,6 @@
+// RUNNABLE_PHOBOS_TEST
 import std.random;
 void main()
 {
     double t = 1.0 - uniform(0.0, 1.0);
 }
-// RUNNABLE_PHOBOS_TEST
index 741877cb9703d30c42faa773d9efc32d685d750d..b9d0fd2afc5f4333ad0f90bf196965f692f42f9a 100644 (file)
@@ -1,3 +1,4 @@
+// RUNNABLE_PHOBOS_TEST
 import core.vararg;
 import std.stdio;
 
@@ -308,4 +309,3 @@ int main()
     printf("Success\n");
     return 0;
 }
-// RUNNABLE_PHOBOS_TEST
index b240745a51383710eeb1d390c7a2c581393d3053..4d17d33aebfc4bbd703a60aa7b05785b44d39ce0 100644 (file)
@@ -1,4 +1,5 @@
 /*
+RUNNABLE_PHOBOS_TEST
 REQUIRED_ARGS: -mcpu=native
 PERMUTE_ARGS: -O -inline
 */
@@ -1723,4 +1724,3 @@ int main()
     printf("Success\n");
     return 0;
 }
-// RUNNABLE_PHOBOS_TEST
index c16d943d20f3faf897c8f476f9a1f0219e1c624a..9d88fbd2841607f97baae1c3090dc71b8e5d2a07 100644 (file)
@@ -1,4 +1,4 @@
-
+// RUNNABLE_PHOBOS_TEST
 module mixin1;
 
 import std.stdio;
@@ -1468,4 +1468,3 @@ int main()
     printf("Success\n");
     return 0;
 }
-// RUNNABLE_PHOBOS_TEST
index 53a64d5f40ec95b89e3f2b6e6173f7f2a8511dd1..3591d1200e0cc32600a08b7f3e4a315c33b91eda 100644 (file)
@@ -1,3 +1,4 @@
+// RUNNABLE_PHOBOS_TEST
 import std.stdio;
 
 /*********************************************/
@@ -361,4 +362,3 @@ void main()
 
     writeln("Success");
 }
-// RUNNABLE_PHOBOS_TEST
index 4c969b4b16f6c2659032753ee5a3de5795e911a9..29cfc9669bbe1e697168ea6ba5301d31361e7f92 100644 (file)
@@ -1,4 +1,4 @@
-
+// RUNNABLE_PHOBOS_TEST
 import std.stdio;
 
 /***********************************/
@@ -95,4 +95,3 @@ int main()
     writefln("Success\n");
     return 0;
 }
-// RUNNABLE_PHOBOS_TEST
index 1b7f6457cf033f8b26619a97367e5d377193a584..b15725369bee98a21edc72d953509e1b8827fbf5 100644 (file)
@@ -1,3 +1,4 @@
+// RUNNABLE_PHOBOS_TEST
 // PERMUTE_ARGS:
 
 import core.stdc.stdio : printf;
@@ -725,4 +726,3 @@ void CLASS()
         }
     }
 }
-// RUNNABLE_PHOBOS_TEST
index 84792dae6ae0bb045860a664da3a37fecce8e17f..77d6254361aba009c61e7cd70cb4dfcbe3b59a09 100644 (file)
@@ -1,3 +1,4 @@
+// RUNNABLE_PHOBOS_TEST
 import std.stdio;
 import core.stdc.stdio;
 
@@ -1164,4 +1165,3 @@ int main()
     printf("Success\n");
     return 0;
 }
-// RUNNABLE_PHOBOS_TEST
index 0b11c6b4fa319b8016b929b498099f5a40dd3433..4f182959cb19791e707d288dcbe89838c323007f 100644 (file)
@@ -1,3 +1,4 @@
+// RUNNABLE_PHOBOS_TEST
 // PERMUTE_ARGS:
 
 module breaker;
@@ -4965,4 +4966,3 @@ int main()
     printf("Success\n");
     return 0;
 }
-// RUNNABLE_PHOBOS_TEST
index 612158fc294376208845362e19525e6c589ea2ed..0d48946383db7ddeb80b9eed55bdf46829f36b59 100644 (file)
@@ -1,3 +1,4 @@
+// RUNNABLE_PHOBOS_TEST
 // REQUIRED_ARGS: -g
 
 import std.string;
@@ -24,4 +25,3 @@ mixin(getEnum(1087));
 
 void main() { }
 
-// RUNNABLE_PHOBOS_TEST
index e62ea97940a54c972258d25ccec5f49ac200f056..0d916c1af6ce272f06b7a5ff8caf38b0b4cda571 100644 (file)
@@ -1,3 +1,4 @@
+// RUNNABLE_PHOBOS_TEST
 // REQUIRED_ARGS:
 
 extern(C) int printf(const char*, ...);
@@ -1390,4 +1391,3 @@ int main(string[] argv)
 }
 
 
-// RUNNABLE_PHOBOS_TEST
index c196361a40143bc22090e9aef2bdad8945f675cd..eb7e422c28b486f8d5ee31fe97a26693dbec07bc 100644 (file)
@@ -1,3 +1,4 @@
+// RUNNABLE_PHOBOS_TEST
 // PERMUTE_ARGS: -unittest -O -release -inline -fPIC -g
 
 extern(C) int printf(const char*, ...);
@@ -1250,4 +1251,3 @@ int main(string[] argv)
     return 0;
 }
 
-// RUNNABLE_PHOBOS_TEST
index 52d44c94a2e25274025d15b3e00bf10b446b2acf..92a0bbddde5a703be5bd486a9b212df742c2ba22 100644 (file)
@@ -1,3 +1,4 @@
+// RUNNABLE_PHOBOS_TEST
 // import std.math;
 
 void foo(T)(T[] b)
@@ -10,4 +11,3 @@ void main()
     foo(a);
     assert(a[0] == 10000);
 }
-// RUNNABLE_PHOBOS_TEST
index 75cd11ee8e7ddc59b86642050ddf71e0d9cfb397..234f50b2749ba61de3bba20c916aac7c1a49c86c 100644 (file)
@@ -1,3 +1,4 @@
+// RUNNABLE_PHOBOS_TEST
 // REQUIRED_ARGS:
 // EXTRA_FILES: extra-files/test15.txt
 
@@ -1439,4 +1440,3 @@ int main()
     printf("Success\n");
     return 0;
 }
-// RUNNABLE_PHOBOS_TEST
index d15db1d86a99c18d51875e25ff17ffaa16544c4e..bd0487845b3a8b7fb334a6ea1247bd798a933e26 100644 (file)
@@ -1,3 +1,4 @@
+// RUNNABLE_PHOBOS_TEST
 // REQUIRED_ARGS:
 
 import std.math: poly;
@@ -1306,4 +1307,3 @@ int main()
     printf("Success\n");
     return 0;
 }
-// RUNNABLE_PHOBOS_TEST
index dda2864fb48da0d39feb9e149c4d8f09fc9ffa99..abf8e37f83de9bd74410a38ec86387dc8205f294 100644 (file)
@@ -1,3 +1,4 @@
+// RUNNABLE_PHOBOS_TEST
 // REQUIRED_ARGS:
 
 module test;
@@ -1566,4 +1567,3 @@ void main()
 
     printf("Success\n");
 }
-// RUNNABLE_PHOBOS_TEST
index cc6d6686d7a33e4c1bb7f94759a62880c48811f0..2f31d757921343c5faecdc507799cfd3b580b9e3 100644 (file)
@@ -1,3 +1,4 @@
+// RUNNABLE_PHOBOS_TEST
 // EXTRA_SOURCES: imports/test24a.d imports/test24b.d
 // PERMUTE_ARGS:
 // REQUIRED_ARGS:
@@ -8,4 +9,3 @@ void main()
 {
     string hi = std.string.format("%s", 3);
 }
-// RUNNABLE_PHOBOS_TEST
index 3e5a462e4a56b32ff4226c079e1d23d5166381e4..a3e76ea8d6259f1f415268ce53e9719ff11ba34e 100644 (file)
@@ -1,3 +1,4 @@
+// RUNNABLE_PHOBOS_TEST
 // COMPILE_SEPARATELY
 // EXTRA_SOURCES: imports/test27a.d
 // PERMUTE_ARGS:
@@ -11,4 +12,3 @@ int main()
     return 0;
 }
 
-// RUNNABLE_PHOBOS_TEST
index 1f7e7e89cf0b034ada4a31fd9aaea308bf46b280..5355c2cb23a2feffd47a5570159489aca23d2c40 100644 (file)
@@ -1,3 +1,4 @@
+// RUNNABLE_PHOBOS_TEST
 module test;
 
 import core.vararg;
@@ -1318,4 +1319,3 @@ void main()
     printf("Success\n");
 }
 
-// RUNNABLE_PHOBOS_TEST
index e92f3d6e3406a6b09ecffc00d3d824fe0c6b7e70..6e2b36846c92b07d69761c4ce76ca8a7c2863c21 100644 (file)
@@ -1,4 +1,4 @@
-
+// RUNNABLE_PHOBOS_TEST
 module test34;
 
 import std.stdio;
@@ -1292,4 +1292,3 @@ void main()
 }
 
 
-// RUNNABLE_PHOBOS_TEST
index c28d30f2ae923aadbbad09a38ab60b3f0a44d008..f4a454747b4c50f060734602407c3441eb25803c 100644 (file)
@@ -1,3 +1,4 @@
+// RUNNABLE_PHOBOS_TEST
 // PERMUTE_ARGS:
 // REQUIRED_ARGS: -Jrunnable/extra-files
 // EXTRA_FILES: extra-files/foo37.txt extra-files/std14198/uni.d
@@ -11,4 +12,3 @@ void main()
     // imports in a subdirectory of the -J path
     writefln(import("std14198/uni.d"));
 }
-// RUNNABLE_PHOBOS_TEST
index 2bb04580a7d93bcdbe938f0f70c2c444dfa53228..66b3c04e0bbfd757d050ffbc58b4b9f43c8a3814 100644 (file)
@@ -1,5 +1,5 @@
+// RUNNABLE_PHOBOS_TEST
 // REQUIRED_ARGS:
-//
 
 module test42;
 
@@ -6438,4 +6438,3 @@ int main()
     return 0;
 }
 
-// RUNNABLE_PHOBOS_TEST
index 9102cba91f21fc4baa6fbb64f843587dcc53962e..ff52936a8dc886eaeab1477d89c29783dbe83d0f 100644 (file)
@@ -1,3 +1,4 @@
+// RUNNABLE_PHOBOS_TEST
 // https://issues.dlang.org/show_bug.cgi?id=5305
 
 import std.math;
@@ -5,4 +6,3 @@ void map(real function(real) f) { }
 int main() { map(&sqrt); return 0; }
 
 
-// RUNNABLE_PHOBOS_TEST
index ab967329f083a0fadf1ed16ac1549db941be42d9..cfd92b225ca0bd70c6a8765d10b575471b28cd55 100644 (file)
@@ -1,3 +1,4 @@
+// RUNNABLE_PHOBOS_TEST
 import std.stdio;
 import std.algorithm;
 
@@ -20,4 +21,3 @@ void main()
 
     writeln("Success");
 }
-// RUNNABLE_PHOBOS_TEST
index 6e28e894cf2f20068cdaf1652adfa2ef81590ac5..75e8172ab491a850ffb117d47922ed40cff2c924 100644 (file)
@@ -1,3 +1,4 @@
+// RUNNABLE_PHOBOS_TEST
 // PERMUTE_ARGS: -fPIC
 
 /* Test associative arrays */
@@ -1383,4 +1384,3 @@ int main()
     printf("Success\n");
     return 0;
 }
-// RUNNABLE_PHOBOS_TEST
index 118388bebd1cbc1fdc2dacac333e7b6557dd516c..8a34f886b056b23e472bf918bbbc8a5cadfd768c 100644 (file)
@@ -1,3 +1,4 @@
+// RUNNABLE_PHOBOS_TEST
 // PERMUTE_ARGS:
 
 import std.bitmanip;
@@ -14,4 +15,3 @@ void main() {
 }
 
 
-// RUNNABLE_PHOBOS_TEST
index 097fc310d3405c90cf143e832f0cad5c31c12179..f06f93982a5e626e41ffa499ffb40191e470d932 100644 (file)
@@ -1,3 +1,4 @@
+// RUNNABLE_PHOBOS_TEST
 // PERMUTE_ARGS:
 
 module dstress.run.module_01;
@@ -930,4 +931,3 @@ int main()
     printf("Success\n");
     return 0;
 }
-// RUNNABLE_PHOBOS_TEST
index e7c3e19a49daba044c096bd504bd5a8197ff60dd..6f568044ea4a734d5652d9f1c2612061895b06c5 100644 (file)
@@ -1,3 +1,4 @@
+// RUNNABLE_PHOBOS_TEST
 // PERMUTE_ARGS:
 
 import std.file;
@@ -22,4 +23,3 @@ int main()
     printf("Success\n");
     return 0;
 }
-// RUNNABLE_PHOBOS_TEST
index 2cb0da9fc4d4f158ea2043d8e371772aa260bacd..74f4095c0093aa702130b89148c3a86e8efbfc9c 100644 (file)
@@ -1,3 +1,4 @@
+// RUNNABLE_PHOBOS_TEST
 // PERMUTE_ARGS:
 
 import std.stdio;
@@ -123,4 +124,3 @@ int main()
     std.stdio.writefln("Success");
     return 0;
 }
-// RUNNABLE_PHOBOS_TEST
index 5001fc2fa681a8b22fc49c0c0e4e4d0fc80c9763..5b84204b78580b3b380f1913ab1000aa8f27ada6 100644 (file)
@@ -1,3 +1,4 @@
+// RUNNABLE_PHOBOS_TEST
 // PERMUTE_ARGS:
 
 // $HeadURL$
@@ -41,4 +42,3 @@ void checkFileSpec(Object o){
 writeln(str);
         assert(str[start .. start+3]=="(1)");
 }
-// RUNNABLE_PHOBOS_TEST
index 1ae98df9178b7db4036d4d008485d8f9400b76b3..6a9d6e9094a725c826a87036130402723b998311 100644 (file)
@@ -1,3 +1,4 @@
+// RUNNABLE_PHOBOS_TEST
 // PERMUTE_ARGS:
 // REQUIRED_ARGS:
 
@@ -117,4 +118,3 @@ int main()
 
     return 0;
 }
-// RUNNABLE_PHOBOS_TEST
index cde02ab405f21d2a8f3c19b3d74704654040136a..6c96fb5873d6dfe3b586e5c054c1e3820cdc8efe 100644 (file)
@@ -1,3 +1,4 @@
+// RUNNABLE_PHOBOS_TEST
 // REQUIRED_ARGS: -dip25
 
 import core.stdc.stdio;
@@ -246,4 +247,3 @@ void main()
     printf("Success\n");
 }
 
-// RUNNABLE_PHOBOS_TEST
index a43f89295e8fce33b0086f445cbf1c10d8647995..c2fbcee45cba94b6891887379d0f5e5e37676571 100644 (file)
@@ -1,3 +1,4 @@
+// RUNNABLE_PHOBOS_TEST
 import std.stdio;
 import std.signals;
 
@@ -111,4 +112,3 @@ int main()
     printf("Success\n");
     return 0;
 }
-// RUNNABLE_PHOBOS_TEST
index 00b757a896b6c73af73186ac04612f7aed52e2fa..d0619299ece09727f37f15de0741f5794e7ecf63 100644 (file)
@@ -1,3 +1,4 @@
+// RUNNABLE_PHOBOS_TEST
 // PERMUTE_ARGS:
 
 import std.stdio;
@@ -48,4 +49,3 @@ int main ()
 }
 
 
-// RUNNABLE_PHOBOS_TEST
index 854dcb5ae382b5216b7ead7e7f5d49982bae5358..d340f21892fe9f5d9ac5dd15f3e83169a62e2d6d 100644 (file)
@@ -1,3 +1,4 @@
+// RUNNABLE_PHOBOS_TEST
 // PERMUTE_ARGS:
 // EXTRA_FILES: extra-files/teststdio.txt
 
@@ -31,4 +32,3 @@ void main()
     } while (!feof(fp));
     //fclose(fp);
 }
-// RUNNABLE_PHOBOS_TEST
index 0ec6e0dbcdcd68ede000179e5764c0bcda7edbe2..93aace6c650cf6608956124dc139a2f24cd3dc8f 100644 (file)
@@ -1,3 +1,4 @@
+// RUNNABLE_PHOBOS_TEST
 // PERMUTE_ARGS:
 
 import std.algorithm : map;
@@ -106,4 +107,3 @@ void main() {
     }
 }
 
-// RUNNABLE_PHOBOS_TEST
index dcaac731fa3182b8cb5bceae0ea464bb9c46b082..ebdda30c1977a5496a2f39fe89a954fe68dcd879 100644 (file)
@@ -1,4 +1,4 @@
-
+// RUNNABLE_PHOBOS_TEST
 import core.vararg;
 import std.stdio;
 
@@ -684,4 +684,3 @@ int main()
 
     return 0;
 }
-// RUNNABLE_PHOBOS_TEST
index 915f16da48efe5f52a320c736bfde1fb720d14d8..547976f659834cc510187b43177395bd69901618 100644 (file)
@@ -1,3 +1,4 @@
+// RUNNABLE_PHOBOS_TEST
 // PERMUTE_ARGS:
 module traits;
 
@@ -1606,4 +1607,3 @@ int main()
     writeln("Success");
     return 0;
 }
-// RUNNABLE_PHOBOS_TEST
index e5fd98a0f835486d2148ccbd769a745788838a27..8f847c5938fb5376eac945b38b6395c36aa5e07d 100644 (file)
@@ -1,3 +1,4 @@
+// RUNNABLE_PHOBOS_TEST
 // PERMUTE_ARGS:
 // EXECUTE_ARGS: runnable/wc.d
 
@@ -48,4 +49,3 @@ int main (string[] args)
     }
     return 0;
 }
-// RUNNABLE_PHOBOS_TEST
index 780f5f160eaf91ee01462c57b652a5c83cb95331..a97c6fa8620c23a3e8153c70bb122bdf06d6b99f 100644 (file)
@@ -1,3 +1,4 @@
+// RUNNABLE_PHOBOS_TEST
 // PERMUTE_ARGS:
 // EXECUTE_ARGS: runnable/wc2.d
 
@@ -72,4 +73,3 @@ int main (string[] args)
     }
     return 0;
 }
-// RUNNABLE_PHOBOS_TEST
index 666bfb99113a5c92252a7b6a0c8195b50b072c61..13beac25aba08d8478a09e40737f98337a85598f 100644 (file)
@@ -1,3 +1,4 @@
+// RUNNABLE_PHOBOS_TEST
 // PERMUTE_ARGS:
 // EXECUTE_ARGS: runnable/extra-files/alice30.txt
 // EXTRA_FILES: extra-files/alice30.txt
@@ -70,4 +71,3 @@ int main (string[] args)
     }
     return 0;
 }
-// RUNNABLE_PHOBOS_TEST
index e1cdbcd1922d8274e664ade9c53506ca4126e97d..8cba4ed4a803c398cd8c23e9cdd62ab8310cded3 100644 (file)
@@ -1,3 +1,4 @@
+// RUNNABLE_PHOBOS_TEST
 // PERMUTE_ARGS: -unittest -O -release -inline -fPIC -g
 
 import std.stdio;
@@ -8283,4 +8284,3 @@ int main()
     printf("Success\n");
     return 0;
 }
-// RUNNABLE_PHOBOS_TEST
index 1062a1a77fc245c7ded633e6424515894d7ac942..4b295d8c6862095bce374dc0de0b9e75be536f61 100644 (file)
@@ -1,3 +1,4 @@
+// RUNNABLE_PHOBOS_TEST
 // PERMUTE_ARGS:
 
 import core.memory, std.stdio;
@@ -22,4 +23,3 @@ int main()
     return 0;
 }
 
-// RUNNABLE_PHOBOS_TEST
index 18d479d54fff39ad8da3cd282c8b81fa87733f7e..8b461f76ad0085761f1aaba5d1aec9e1867cb356 100644 (file)
@@ -1,4 +1,4 @@
-c9c209e2c62ce43a2c08ddd61d647730716b2d0f
+e68a5ae36790fa9dc5bab6155bc450eb6bf8c12c
 
 The first line of this file holds the git revision number of the last
 merge done from the dlang/druntime repository.
index d35e7d5449fffd3bcd123b6bc840843b8d7e8eeb..839605aee1e61774c64ea13650fb1c9151f9ac43 100644 (file)
@@ -822,7 +822,7 @@ void cpuidX86()
         {
             asm pure nothrow @nogc {
                 "cpuid" : "=a" (pnb[0]), "=b" (pnb[1]), "=c" (pnb[ 2]), "=d" (pnb[ 3]) : "a" (0x8000_0002);
-                "cpuid" : "=a" (pnb[4]), "=b" (pnb[5]), "=c" (pnb[ 6]), "=d" (pnb[ 7]) : "a" (0x8000_0003);               
+                "cpuid" : "=a" (pnb[4]), "=b" (pnb[5]), "=c" (pnb[ 6]), "=d" (pnb[ 7]) : "a" (0x8000_0003);
                 "cpuid" : "=a" (pnb[8]), "=b" (pnb[9]), "=c" (pnb[10]), "=d" (pnb[11]) : "a" (0x8000_0004);
             }
         }
index 3b82010ab9cbbc09e2b6a0720a3d65df369fbb6b..3d2cb59a64a3a267abec15049f845ff41c07f735 100644 (file)
@@ -37,76 +37,138 @@ private ubyte[] ctfe_alloc()(size_t n)
 const(ubyte)[] toUbyte(T)(const ref T val) if (is(Unqual!T == float) || is(Unqual!T == double) || is(Unqual!T == real) ||
                                         is(Unqual!T == ifloat) || is(Unqual!T == idouble) || is(Unqual!T == ireal))
 {
-    static const(ubyte)[] reverse_(const(ubyte)[] arr)
-    {
-        ubyte[] buff = ctfe_alloc(arr.length);
-        foreach (k, v; arr)
-        {
-            buff[$-k-1] = v;
-        }
-        return buff;
-    }
     if (__ctfe)
     {
-        auto parsed = parse(val);
-
-        ulong mantissa = parsed.mantissa;
-        uint exp = parsed.exponent;
-        uint sign = parsed.sign;
-
-        ubyte[] buff = ctfe_alloc(T.sizeof);
-        size_t off_bytes = 0;
-        size_t off_bits  = 0;
-        // Quadruples won't fit in one ulong, so check for that.
-        enum mantissaMax = FloatTraits!T.MANTISSA < ulong.sizeof*8 ?
-                           FloatTraits!T.MANTISSA : ulong.sizeof*8;
-
-        for (; off_bytes < mantissaMax/8; ++off_bytes)
+        static if (T.mant_dig == float.mant_dig || T.mant_dig == double.mant_dig)
         {
-            buff[off_bytes] = cast(ubyte)mantissa;
-            mantissa >>= 8;
+            static if (is(T : ireal)) // https://issues.dlang.org/show_bug.cgi?id=19932
+                const f = val.im;
+            else
+                alias f = val;
+            static if (T.sizeof == uint.sizeof)
+                uint bits = *cast(const uint*) &f;
+            else static if (T.sizeof == ulong.sizeof)
+                ulong bits = *cast(const ulong*) &f;
+            ubyte[] result = ctfe_alloc(T.sizeof);
+            version (BigEndian)
+            {
+                foreach_reverse (ref b; result)
+                {
+                    b = cast(ubyte) bits;
+                    bits >>= 8;
+                }
+            }
+            else
+            {
+                foreach (ref b; result)
+                {
+                    b = cast(ubyte) bits;
+                    bits >>= 8;
+                }
+            }
+            return result;
         }
-
-        static if (floatFormat!T == FloatFormat.Quadruple)
+        else static if (floatFormat!T == FloatFormat.DoubleDouble)
         {
-            ulong mantissa2 = parsed.mantissa2;
-            off_bytes--; // go back one, since mantissa only stored data in 56
-                         // bits, ie 7 bytes
-            for (; off_bytes < FloatTraits!T.MANTISSA/8; ++off_bytes)
+            // Parse DoubleDoubles as a pair of doubles.
+            // The layout of the type is:
+            //
+            //   [1|  7  |       56      ][   8    |       56       ]
+            //   [S| Exp | Fraction (hi) ][ Unused | Fraction (low) ]
+            //
+            // We can get the least significant bits by subtracting the IEEE
+            // double precision portion from the real value.
+
+            import core.math : toPrec;
+
+            ubyte[] buff = ctfe_alloc(T.sizeof);
+            enum msbSize = double.sizeof;
+
+            double hi = toPrec!double(val);
+            buff[0 .. msbSize] = toUbyte(hi)[];
+
+            if (val is cast(T)0.0 || val is cast(T)-0.0 ||
+                val is T.nan || val is -T.nan ||
+                val is T.infinity || val > T.max ||
+                val is -T.infinity || val < -T.max)
+            {
+                // Zero, NaN, and Inf are all representable as doubles, so the
+                // least significant part can be 0.0.
+                buff[msbSize .. $] = 0;
+            }
+            else
             {
-                buff[off_bytes] = cast(ubyte)mantissa2;
-                mantissa2 >>= 8;
+                double low = toPrec!double(val - hi);
+                buff[msbSize .. $] = toUbyte(low)[];
             }
+
+            // Arrays don't index differently between little and big-endian targets.
+            return buff;
         }
         else
         {
-            off_bits = FloatTraits!T.MANTISSA%8;
-            buff[off_bytes] = cast(ubyte)mantissa;
-        }
+            auto parsed = parse(val);
 
-        for (size_t i=0; i<FloatTraits!T.EXPONENT/8; ++i)
-        {
-            ubyte cur_exp = cast(ubyte)exp;
-            exp >>= 8;
-            buff[off_bytes] |= (cur_exp << off_bits);
-            ++off_bytes;
-            buff[off_bytes] |= cur_exp >> 8 - off_bits;
-        }
+            ulong mantissa = parsed.mantissa;
+            uint exp = parsed.exponent;
+            uint sign = parsed.sign;
 
+            ubyte[] buff = ctfe_alloc(T.sizeof);
+            size_t off_bytes = 0;
+            size_t off_bits  = 0;
+            // Quadruples won't fit in one ulong, so check for that.
+            enum mantissaMax = FloatTraits!T.MANTISSA < ulong.sizeof*8 ?
+                               FloatTraits!T.MANTISSA : ulong.sizeof*8;
 
-        exp <<= 8 - FloatTraits!T.EXPONENT%8 - 1;
-        buff[off_bytes] |= exp;
-        sign <<= 7;
-        buff[off_bytes] |= sign;
+            for (; off_bytes < mantissaMax/8; ++off_bytes)
+            {
+                buff[off_bytes] = cast(ubyte)mantissa;
+                mantissa >>= 8;
+            }
 
-        version (LittleEndian)
-        {
+            static if (floatFormat!T == FloatFormat.Quadruple)
+            {
+                ulong mantissa2 = parsed.mantissa2;
+                off_bytes--; // go back one, since mantissa only stored data in 56
+                             // bits, ie 7 bytes
+                for (; off_bytes < FloatTraits!T.MANTISSA/8; ++off_bytes)
+                {
+                    buff[off_bytes] = cast(ubyte)mantissa2;
+                    mantissa2 >>= 8;
+                }
+            }
+            else
+            {
+                off_bits = FloatTraits!T.MANTISSA%8;
+                buff[off_bytes] = cast(ubyte)mantissa;
+            }
+
+            for (size_t i=0; i<FloatTraits!T.EXPONENT/8; ++i)
+            {
+                ubyte cur_exp = cast(ubyte)exp;
+                exp >>= 8;
+                buff[off_bytes] |= (cur_exp << off_bits);
+                ++off_bytes;
+                buff[off_bytes] |= cur_exp >> 8 - off_bits;
+            }
+
+
+            exp <<= 8 - FloatTraits!T.EXPONENT%8 - 1;
+            buff[off_bytes] |= exp;
+            sign <<= 7;
+            buff[off_bytes] |= sign;
+
+            version (BigEndian)
+            {
+                for (size_t left = 0, right = buff.length - 1; left < right; left++, right--)
+                {
+                    const swap = buff[left];
+                    buff[left] = buff[right];
+                    buff[right] = swap;
+                }
+            }
             return buff;
         }
-        else
-        {
-            return reverse_(buff);
-        }
     }
     else
     {
index 1b661d365c9cd0be474d094166e792cfedffaa9b..878623258cd3e7dcd7edf6889a762373866cff51 100644 (file)
@@ -164,3 +164,74 @@ unittest
     }
 }
 
+/*************************************
+ * Round argument to a specific precision.
+ *
+ * D language types specify a minimum precision, not a maximum. The
+ * `toPrec()` function forces rounding of the argument `f` to the
+ * precision of the specified floating point type `T`.
+ *
+ * Params:
+ *      T = precision type to round to
+ *      f = value to convert
+ * Returns:
+ *      f in precision of type `T`
+ */
+@safe pure nothrow
+T toPrec(T:float)(float f) { pragma(inline, false); return f; }
+/// ditto
+@safe pure nothrow
+T toPrec(T:float)(double f) { pragma(inline, false); return cast(T) f; }
+/// ditto
+@safe pure nothrow
+T toPrec(T:float)(real f)  { pragma(inline, false); return cast(T) f; }
+/// ditto
+@safe pure nothrow
+T toPrec(T:double)(float f) { pragma(inline, false); return f; }
+/// ditto
+@safe pure nothrow
+T toPrec(T:double)(double f) { pragma(inline, false); return f; }
+/// ditto
+@safe pure nothrow
+T toPrec(T:double)(real f)  { pragma(inline, false); return cast(T) f; }
+/// ditto
+@safe pure nothrow
+T toPrec(T:real)(float f) { pragma(inline, false); return f; }
+/// ditto
+@safe pure nothrow
+T toPrec(T:real)(double f) { pragma(inline, false); return f; }
+/// ditto
+@safe pure nothrow
+T toPrec(T:real)(real f)  { pragma(inline, false); return f; }
+
+@safe unittest
+{
+    static float f = 1.1f;
+    static double d = 1.1;
+    static real r = 1.1L;
+    f = toPrec!float(f + f);
+    f = toPrec!float(d + d);
+    f = toPrec!float(r + r);
+    d = toPrec!double(f + f);
+    d = toPrec!double(d + d);
+    d = toPrec!double(r + r);
+    r = toPrec!real(f + f);
+    r = toPrec!real(d + d);
+    r = toPrec!real(r + r);
+
+    /+ Uncomment these once compiler support has been added.
+    enum real PIR = 0xc.90fdaa22168c235p-2;
+    enum double PID = 0x1.921fb54442d18p+1;
+    enum float PIF = 0x1.921fb6p+1;
+
+    assert(toPrec!float(PIR) == PIF);
+    assert(toPrec!double(PIR) == PID);
+    assert(toPrec!real(PIR) == PIR);
+    assert(toPrec!float(PID) == PIF);
+    assert(toPrec!double(PID) == PID);
+    assert(toPrec!real(PID) == PID);
+    assert(toPrec!float(PIF) == PIF);
+    assert(toPrec!double(PIF) == PIF);
+    assert(toPrec!real(PIF) == PIF);
+    +/
+}
index 780db37c99390290f8c6d1bbcc2b7037a9eef66f..32e2aaf5cfdde16c15b91387db7460a10b468d5f 100644 (file)
@@ -10,9 +10,6 @@
  * Authors:   $(WEB digitalmars.com, Walter Bright),
  */
 
-/* NOTE: This file has been patched from the original DMD distribution to
- * work with the GDC compiler.
- */
 module core.simd;
 
 pure:
@@ -42,6 +39,7 @@ template Vector(T)
 /* Handy aliases
  */
 static if (is(Vector!(void[8])))    alias Vector!(void[8])  void8;          ///
+static if (is(Vector!(double[1])))  alias Vector!(double[1]) double1;       ///
 static if (is(Vector!(float[2])))   alias Vector!(float[2])  float2;        ///
 static if (is(Vector!(byte[8])))    alias Vector!(byte[8])  byte8;          ///
 static if (is(Vector!(ubyte[8])))   alias Vector!(ubyte[8]) ubyte8;         ///
@@ -49,6 +47,8 @@ static if (is(Vector!(short[4])))   alias Vector!(short[4])  short4;        ///
 static if (is(Vector!(ushort[4])))  alias Vector!(ushort[4]) ushort4;       ///
 static if (is(Vector!(int[2])))     alias Vector!(int[2])    int2;          ///
 static if (is(Vector!(uint[2])))    alias Vector!(uint[2])   uint2;         ///
+static if (is(Vector!(long[1])))    alias Vector!(long[1])   long1;         ///
+static if (is(Vector!(ulong[1])))   alias Vector!(ulong[1])  ulong1;        ///
 
 static if (is(Vector!(void[16])))   alias Vector!(void[16])  void16;        ///
 static if (is(Vector!(double[2])))  alias Vector!(double[2]) double2;       ///