about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAbseil Team <absl-team@google.com>2018-03-06T20·30-0800
committerShaindel Schwartz <shaindel@google.com>2018-03-06T22·21-0500
commit94f0f79ecd2d9e5271a21bc4ededea9b58c60674 (patch)
tree7e1fd953b35cd6961e0d5717e5f465d1931fd1d4
parent5337d2d0e312ce6bce0140b5f1da5548a0b3fed5 (diff)
Changes imported from Abseil "staging" branch:
  - aba727a5943a014392e3873349cee9dd5efc634e Avoid using 128-bit intrinsics for Clang on Windows. by Abseil Team <absl-team@google.com>
  - cdd19f1eda562af8906bff8feff827eb8e8e9797 Utilize the rtems TID infrastructure on myriad2 platforms. by Abseil Team <absl-team@google.com>
  - 52f7f55daa84ea25fa210d1b9d2bd64d128e1d81 Use intrinsic 128 bit integer when available for division... by Alex Strelnikov <strel@google.com>
  - 51f881b1152c0c861cf7fcac53f30d3c7ce12902 Merge GitHub #95: Fix compiler version check for clang-cl... by Derek Mauro <dmauro@google.com>

GitOrigin-RevId: aba727a5943a014392e3873349cee9dd5efc634e
Change-Id: I9b52d84095537acbbc96d3f74917f78da9a51156
-rw-r--r--absl/base/config.h20
-rw-r--r--absl/base/internal/sysinfo.cc12
-rw-r--r--absl/numeric/int128.cc10
3 files changed, 35 insertions, 7 deletions
diff --git a/absl/base/config.h b/absl/base/config.h
index 6703d0eac715..a387041df673 100644
--- a/absl/base/config.h
+++ b/absl/base/config.h
@@ -176,16 +176,22 @@
 // Checks whether the __int128 compiler extension for a 128-bit integral type is
 // supported.
 //
-// Notes: __SIZEOF_INT128__ is defined by Clang and GCC when __int128 is
-// supported, except on ppc64 and aarch64 where __int128 exists but has exhibits
-// a sporadic compiler crashing bug. Nvidia's nvcc also defines __GNUC__ and
-// __SIZEOF_INT128__ but not all versions actually support __int128.
+// Note: __SIZEOF_INT128__ is defined by Clang and GCC when __int128 is
+// supported, but we avoid using it in certain cases:
+// * On Clang:
+//   * Building using Clang for Windows, where the Clang runtime library has
+//     128-bit support only on LP64 architectures, but Windows is LLP64.
+//   * Building for aarch64, where __int128 exists but has exhibits a sporadic
+//     compiler crashing bug.
+// * On Nvidia's nvcc:
+//   * nvcc also defines __GNUC__ and __SIZEOF_INT128__, but not all versions
+//     actually support __int128.
 #ifdef ABSL_HAVE_INTRINSIC_INT128
 #error ABSL_HAVE_INTRINSIC_INT128 cannot be directly set
 #elif defined(__SIZEOF_INT128__)
-#if (defined(__clang__) && !defined(__aarch64__)) ||      \
-    (defined(__CUDACC__) && __CUDACC_VER_MAJOR__ >= 9) || \
-    (!defined(__clang__) && !defined(__CUDACC__) && defined(__GNUC__))
+#if (defined(__clang__) && !defined(_WIN32) && !defined(__aarch64__)) || \
+    (defined(__CUDACC__) && __CUDACC_VER_MAJOR__ >= 9) ||                \
+    (defined(__GNUC__) && !defined(__clang__) && !defined(__CUDACC__))
 #define ABSL_HAVE_INTRINSIC_INT128 1
 #elif defined(__CUDACC__)
 // __CUDACC_VER__ is a full version number before CUDA 9, and is defined to a
diff --git a/absl/base/internal/sysinfo.cc b/absl/base/internal/sysinfo.cc
index dca7d8fdc020..db41bacc844c 100644
--- a/absl/base/internal/sysinfo.cc
+++ b/absl/base/internal/sysinfo.cc
@@ -35,6 +35,10 @@
 #include <sys/sysctl.h>
 #endif
 
+#if defined(__myriad2__)
+#include <rtems.h>
+#endif
+
 #include <string.h>
 #include <cassert>
 #include <cstdint>
@@ -310,6 +314,14 @@ pid_t GetTID() {
   return reinterpret_cast<struct pthread_tcb *>(current_uthread)->id;
 }
 
+#elif defined(__myriad2__)
+
+pid_t GetTID() {
+  uint32_t tid;
+  rtems_task_ident(RTEMS_SELF, 0, &tid);
+  return tid;
+}
+
 #else
 
 // Fallback implementation of GetTID using pthread_getspecific.
diff --git a/absl/numeric/int128.cc b/absl/numeric/int128.cc
index f24b785c04c0..3688e5efef45 100644
--- a/absl/numeric/int128.cc
+++ b/absl/numeric/int128.cc
@@ -130,16 +130,26 @@ uint128::uint128(double v) : uint128(MakeUint128FromFloat(v)) {}
 uint128::uint128(long double v) : uint128(MakeUint128FromFloat(v)) {}
 
 uint128 operator/(uint128 lhs, uint128 rhs) {
+#if defined(ABSL_HAVE_INTRINSIC_INT128)
+  return static_cast<unsigned __int128>(lhs) /
+         static_cast<unsigned __int128>(rhs);
+#else  // ABSL_HAVE_INTRINSIC_INT128
   uint128 quotient = 0;
   uint128 remainder = 0;
   DivModImpl(lhs, rhs, &quotient, &remainder);
   return quotient;
+#endif  // ABSL_HAVE_INTRINSIC_INT128
 }
 uint128 operator%(uint128 lhs, uint128 rhs) {
+#if defined(ABSL_HAVE_INTRINSIC_INT128)
+  return static_cast<unsigned __int128>(lhs) %
+         static_cast<unsigned __int128>(rhs);
+#else  // ABSL_HAVE_INTRINSIC_INT128
   uint128 quotient = 0;
   uint128 remainder = 0;
   DivModImpl(lhs, rhs, &quotient, &remainder);
   return remainder;
+#endif  // ABSL_HAVE_INTRINSIC_INT128
 }
 
 namespace {