summaryrefslogtreecommitdiffstats
path: root/compiler-rt/lib/builtins/int_lib.h
diff options
context:
space:
mode:
authorSaleem Abdulrasool <compnerd@compnerd.org>2015-10-07 02:58:11 +0000
committerSaleem Abdulrasool <compnerd@compnerd.org>2015-10-07 02:58:11 +0000
commit396e79445946f433375e743737af525ac65c6d29 (patch)
tree7aba403b3f4df192df2240cbf62beb048630c30a /compiler-rt/lib/builtins/int_lib.h
parentb0b7c8a8dd2d6800886a7eff5605c3af0ae37811 (diff)
downloadbcm5719-llvm-396e79445946f433375e743737af525ac65c6d29.tar.gz
bcm5719-llvm-396e79445946f433375e743737af525ac65c6d29.zip
builtins: implement instrinics for cl
cl does not support the same intrinsics as clang. Provide implementations for the intrinsics using MSVC builtins. Patch by Tee Hao Wei! llvm-svn: 249515
Diffstat (limited to 'compiler-rt/lib/builtins/int_lib.h')
-rw-r--r--compiler-rt/lib/builtins/int_lib.h28
1 files changed, 28 insertions, 0 deletions
diff --git a/compiler-rt/lib/builtins/int_lib.h b/compiler-rt/lib/builtins/int_lib.h
index 771cc5cfe76..9acf063a4f2 100644
--- a/compiler-rt/lib/builtins/int_lib.h
+++ b/compiler-rt/lib/builtins/int_lib.h
@@ -88,4 +88,32 @@ COMPILER_RT_ABI si_int __clzti2(ti_int a);
COMPILER_RT_ABI tu_int __udivmodti4(tu_int a, tu_int b, tu_int* rem);
#endif
+/* Definitions for builtins unavailable on MSVC */
+#if defined(_MSC_VER) && !defined(__clang__)
+#include <intrin.h>
+
+uint32_t __inline __builtin_ctz(uint32_t value) {
+ uint32_t trailing_zero = 0;
+ if (_BitScanForward(&trailing_zero, value))
+ return trailing_zero;
+ return 32;
+}
+
+uint32_t __inline __builtin_clz(uint32_t value) {
+ uint32_t leading_zero = 0;
+ if (_BitScanReverse(&leading_zero, value))
+ return 31 - leading_zero;
+ return 32;
+}
+
+uint32_t __inline __builtin_clzll(uint64_t value) {
+ uint32_t leading_zero = 0;
+ if (_BitScanReverse64(&leading_zero, value))
+ return 63 - leading_zero;
+ return 64;
+}
+
+#define __builtin_clzl __builtin_clzll
+#endif
+
#endif /* INT_LIB_H */
OpenPOWER on IntegriCloud