[compiler-rt] r249515 - builtins: implement instrinics for cl

Saleem Abdulrasool via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 6 19:58:11 PDT 2015


Author: compnerd
Date: Tue Oct  6 21:58:11 2015
New Revision: 249515

URL: http://llvm.org/viewvc/llvm-project?rev=249515&view=rev
Log:
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!

Modified:
    compiler-rt/trunk/lib/builtins/int_lib.h

Modified: compiler-rt/trunk/lib/builtins/int_lib.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/builtins/int_lib.h?rev=249515&r1=249514&r2=249515&view=diff
==============================================================================
--- compiler-rt/trunk/lib/builtins/int_lib.h (original)
+++ compiler-rt/trunk/lib/builtins/int_lib.h Tue Oct  6 21:58:11 2015
@@ -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 */




More information about the llvm-commits mailing list