<div dir="ltr">Made a function in r356852<div><br><div><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature">~Craig</div></div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Mar 24, 2019 at 9:59 AM Nico Weber via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr">This breaks Chromium's build. We have a class with a _bswap method, and this adds a _bswap macro expanding to something that gets in the way. Could _bswap be an inline function instead?<div><br></div><div><a href="https://bugs.chromium.org/p/chromium/issues/detail?id=945172" target="_blank">https://bugs.chromium.org/p/chromium/issues/detail?id=945172</a><br></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, Mar 23, 2019 at 8:55 PM Craig Topper via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Author: ctopper<br>
Date: Sat Mar 23 17:56:52 2019<br>
New Revision: 356848<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=356848&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=356848&view=rev</a><br>
Log:<br>
[X86] Add BSR/BSF/BSWAP intrinsics to ia32intrin.h to match gcc.<br>
<br>
Summary:<br>
These are all implemented by icc as well.<br>
<br>
I made bit_scan_forward/reverse forward to the __bsfd/__bsrq since we also have<br>
__bsfq/__bsrq.<br>
<br>
Note, when lzcnt is enabled the bsr intrinsics generates lzcnt+xor instead of bsr.<br>
<br>
Reviewers: RKSimon, spatel<br>
<br>
Subscribers: cfe-commits, llvm-commits<br>
<br>
Tags: #clang<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D59682" rel="noreferrer" target="_blank">https://reviews.llvm.org/D59682</a><br>
<br>
Added:<br>
    cfe/trunk/test/CodeGen/x86-bswap.c<br>
Modified:<br>
    cfe/trunk/lib/Headers/ia32intrin.h<br>
    cfe/trunk/lib/Headers/immintrin.h<br>
    cfe/trunk/test/CodeGen/bitscan-builtins.c<br>
<br>
Modified: cfe/trunk/lib/Headers/ia32intrin.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/ia32intrin.h?rev=356848&r1=356847&r2=356848&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/ia32intrin.h?rev=356848&r1=356847&r2=356848&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Headers/ia32intrin.h (original)<br>
+++ cfe/trunk/lib/Headers/ia32intrin.h Sat Mar 23 17:56:52 2019<br>
@@ -28,6 +28,114 @@<br>
 #ifndef __IA32INTRIN_H<br>
 #define __IA32INTRIN_H<br>
<br>
+/** Find the first set bit starting from the lsb. Result is undefined if<br>
+ *  input is 0.<br>
+ *<br>
+ *  \headerfile <x86intrin.h><br>
+ *<br>
+ *  This intrinsic corresponds to the <c> BSF </c> instruction or the<br>
+ *  <c> TZCNT </c> instruction.<br>
+ *<br>
+ *  \param __A<br>
+ *     A 32-bit integer operand.<br>
+ *  \returns A 32-bit integer containing the bit number.<br>
+ */<br>
+static __inline__ int __attribute__((__always_inline__, __nodebug__))<br>
+__bsfd(int __A) {<br>
+  return __builtin_ctz(__A);<br>
+}<br>
+<br>
+/** Find the first set bit starting from the msb. Result is undefined if<br>
+ *  input is 0.<br>
+ *<br>
+ *  \headerfile <x86intrin.h><br>
+ *<br>
+ *  This intrinsic corresponds to the <c> BSR </c> instruction or the<br>
+ *  <c> LZCNT </c> instruction and an <c> XOR </c>.<br>
+ *<br>
+ *  \param __A<br>
+ *     A 32-bit integer operand.<br>
+ *  \returns A 32-bit integer containing the bit number.<br>
+ */<br>
+static __inline__ int __attribute__((__always_inline__, __nodebug__))<br>
+__bsrd(int __A) {<br>
+  return 31 - __builtin_clz(__A);<br>
+}<br>
+<br>
+/** Swaps the bytes in the input. Converting little endian to big endian or<br>
+ *  vice versa.<br>
+ *<br>
+ *  \headerfile <x86intrin.h><br>
+ *<br>
+ *  This intrinsic corresponds to the <c> BSWAP </c> instruction.<br>
+ *<br>
+ *  \param __A<br>
+ *     A 32-bit integer operand.<br>
+ *  \returns A 32-bit integer containing the swapped bytes.<br>
+ */<br>
+static __inline__ int __attribute__((__always_inline__, __nodebug__))<br>
+__bswapd(int __A) {<br>
+  return __builtin_bswap32(__A);<br>
+}<br>
+<br>
+#define _bswap(A) __bswapd((A))<br>
+#define _bit_scan_forward(A) __bsfd((A))<br>
+#define _bit_scan_reverse(A) __bsrd((A))<br>
+<br>
+#ifdef __x86_64__<br>
+/** Find the first set bit starting from the lsb. Result is undefined if<br>
+ *  input is 0.<br>
+ *<br>
+ *  \headerfile <x86intrin.h><br>
+ *<br>
+ *  This intrinsic corresponds to the <c> BSF </c> instruction or the<br>
+ *  <c> TZCNT </c> instruction.<br>
+ *<br>
+ *  \param __A<br>
+ *     A 64-bit integer operand.<br>
+ *  \returns A 32-bit integer containing the bit number.<br>
+ */<br>
+static __inline__ int __attribute__((__always_inline__, __nodebug__))<br>
+__bsfq(long long __A) {<br>
+  return __builtin_ctzll(__A);<br>
+}<br>
+<br>
+/** Find the first set bit starting from the msb. Result is undefined if<br>
+ *  input is 0.<br>
+ *<br>
+ *  \headerfile <x86intrin.h><br>
+ *<br>
+ *  This intrinsic corresponds to the <c> BSR </c> instruction or the<br>
+ *  <c> LZCNT </c> instruction and an <c> XOR </c>.<br>
+ *<br>
+ *  \param __A<br>
+ *     A 64-bit integer operand.<br>
+ *  \returns A 32-bit integer containing the bit number.<br>
+ */<br>
+static __inline__ int __attribute__((__always_inline__, __nodebug__))<br>
+__bsrq(long long __A) {<br>
+  return 63 - __builtin_clzll(__A);<br>
+}<br>
+<br>
+/** Swaps the bytes in the input. Converting little endian to big endian or<br>
+ *  vice versa.<br>
+ *<br>
+ *  \headerfile <x86intrin.h><br>
+ *<br>
+ *  This intrinsic corresponds to the <c> BSWAP </c> instruction.<br>
+ *<br>
+ *  \param __A<br>
+ *     A 64-bit integer operand.<br>
+ *  \returns A 64-bit integer containing the swapped bytes.<br>
+ */<br>
+static __inline__ long long __attribute__((__always_inline__, __nodebug__))<br>
+__bswapq(long long __A) {<br>
+  return __builtin_bswap64(__A);<br>
+}<br>
+<br>
+#define _bswap64(A) __bswapq((A))<br>
+#endif<br>
+<br>
 /** Counts the number of bits in the source operand having a value of 1.<br>
  *<br>
  *  \headerfile <x86intrin.h><br>
<br>
Modified: cfe/trunk/lib/Headers/immintrin.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/immintrin.h?rev=356848&r1=356847&r2=356848&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/immintrin.h?rev=356848&r1=356847&r2=356848&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Headers/immintrin.h (original)<br>
+++ cfe/trunk/lib/Headers/immintrin.h Sat Mar 23 17:56:52 2019<br>
@@ -241,18 +241,6 @@ _rdrand64_step(unsigned long long *__p)<br>
 #endif<br>
 #endif /* __RDRND__ */<br>
<br>
-/* __bit_scan_forward */<br>
-static __inline__ int __attribute__((__always_inline__, __nodebug__))<br>
-_bit_scan_forward(int __A) {<br>
-  return __builtin_ctz(__A);<br>
-}<br>
-<br>
-/* __bit_scan_reverse */<br>
-static __inline__ int __attribute__((__always_inline__, __nodebug__))<br>
-_bit_scan_reverse(int __A) {<br>
-  return 31 - __builtin_clz(__A);<br>
-}<br>
-<br>
 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__FSGSBASE__)<br>
 #ifdef __x86_64__<br>
 static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))<br>
<br>
Modified: cfe/trunk/test/CodeGen/bitscan-builtins.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/bitscan-builtins.c?rev=356848&r1=356847&r2=356848&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/bitscan-builtins.c?rev=356848&r1=356847&r2=356848&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/CodeGen/bitscan-builtins.c (original)<br>
+++ cfe/trunk/test/CodeGen/bitscan-builtins.c Sat Mar 23 17:56:52 2019<br>
@@ -3,18 +3,45 @@<br>
 // PR33722<br>
 // RUN: %clang_cc1 -ffreestanding -triple x86_64-unknown-unknown -fms-extensions -fms-compatibility-version=19.00 -emit-llvm -o - %s | FileCheck %s<br>
<br>
-#include <immintrin.h><br>
+#include <x86intrin.h><br>
<br>
 int test_bit_scan_forward(int a) {<br>
   return _bit_scan_forward(a);<br>
 // CHECK: @test_bit_scan_forward<br>
-// CHECK: %[[call:.*]] = call i32 @llvm.cttz.i32(<br>
+// CHECK: %[[call:.*]] = call i32 @llvm.cttz.i32(i32 %{{.*}}, i1 true)<br>
 // CHECK: ret i32 %[[call]]<br>
 }<br>
<br>
 int test_bit_scan_reverse(int a) {<br>
   return _bit_scan_reverse(a);<br>
-// CHECK:  %[[call:.*]] = call i32 @llvm.ctlz.i32(<br>
+// CHECK:  %[[call:.*]] = call i32 @llvm.ctlz.i32(i32 %{{.*}}, i1 true)<br>
 // CHECK:  %[[sub:.*]] = sub nsw i32 31, %[[call]]<br>
 // CHECK: ret i32 %[[sub]]<br>
 }<br>
+<br>
+int test__bsfd(int X) {<br>
+// CHECK: @test__bsfd<br>
+// CHECK: %[[call:.*]] = call i32 @llvm.cttz.i32(i32 %{{.*}}, i1 true)<br>
+  return __bsfd(X);<br>
+}<br>
+<br>
+int test__bsfq(long long X) {<br>
+// CHECK: @test__bsfq<br>
+// CHECK: %[[call:.*]] = call i64 @llvm.cttz.i64(i64 %{{.*}}, i1 true)<br>
+  return __bsfq(X);<br>
+}<br>
+<br>
+int test__bsrd(int X) {<br>
+// CHECK: @test__bsrd<br>
+// CHECK:  %[[call:.*]] = call i32 @llvm.ctlz.i32(i32 %{{.*}}, i1 true)<br>
+// CHECK:  %[[sub:.*]] = sub nsw i32 31, %[[call]]<br>
+  return __bsrd(X);<br>
+}<br>
+<br>
+int test__bsrq(long long X) {<br>
+// CHECK: @test__bsrq<br>
+// CHECK:  %[[call:.*]] = call i64 @llvm.ctlz.i64(i64 %{{.*}}, i1 true)<br>
+// CHECK:  %[[cast:.*]] = trunc i64 %[[call]] to i32<br>
+// CHECK:  %[[sub:.*]] = sub nsw i32 63, %[[cast]]<br>
+  return __bsrq(X);<br>
+}<br>
<br>
Added: cfe/trunk/test/CodeGen/x86-bswap.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/x86-bswap.c?rev=356848&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/x86-bswap.c?rev=356848&view=auto</a><br>
==============================================================================<br>
--- cfe/trunk/test/CodeGen/x86-bswap.c (added)<br>
+++ cfe/trunk/test/CodeGen/x86-bswap.c Sat Mar 23 17:56:52 2019<br>
@@ -0,0 +1,29 @@<br>
+// RUN: %clang_cc1 -ffreestanding %s -triple=x86_64-apple-darwin -emit-llvm -o - | FileCheck %s<br>
+<br>
+#include <x86intrin.h><br>
+<br>
+int test__bswapd(int X) {<br>
+// CHECK-LABEL: @test__bswapd<br>
+// CHECK: call i32 @llvm.bswap.i32<br>
+  return __bswapd(X);<br>
+}<br>
+<br>
+int test_bswap(int X) {<br>
+// CHECK-LABEL: @test_bswap<br>
+// CHECK: call i32 @llvm.bswap.i32<br>
+  return _bswap(X);<br>
+}<br>
+<br>
+long test__bswapq(long long X) {<br>
+// CHECK-LABEL: @test__bswapq<br>
+// CHECK: call i64 @llvm.bswap.i64<br>
+  return __bswapq(X);<br>
+}<br>
+<br>
+long test_bswap64(long long X) {<br>
+// CHECK-LABEL: @test_bswap64<br>
+// CHECK: call i64 @llvm.bswap.i64<br>
+  return _bswap64(X);<br>
+}<br>
+<br>
+<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
</blockquote></div>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
</blockquote></div>