[clang] c8e6bf0 - [X86] Enable constexpr on BSWAP intrinsics (PR31446)
Simon Pilgrim via cfe-commits
cfe-commits at lists.llvm.org
Fri Aug 21 02:59:11 PDT 2020
Author: Simon Pilgrim
Date: 2020-08-21T10:55:15+01:00
New Revision: c8e6bf0a65fdbda7a611e8047e2a644777f15b24
URL: https://github.com/llvm/llvm-project/commit/c8e6bf0a65fdbda7a611e8047e2a644777f15b24
DIFF: https://github.com/llvm/llvm-project/commit/c8e6bf0a65fdbda7a611e8047e2a644777f15b24.diff
LOG: [X86] Enable constexpr on BSWAP intrinsics (PR31446)
This enables constexpr BSWAP intrinsics defined in ia32intrin.h
Added:
Modified:
clang/docs/ReleaseNotes.rst
clang/lib/Headers/ia32intrin.h
clang/test/CodeGen/x86-bswap.c
Removed:
################################################################################
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 0c864d8b4d14..f19edfe6cfcd 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -160,6 +160,9 @@ X86 Support in Clang
``_popcnt64``, ``__popcntd`` and ``__popcntq`` may now be used within
constexpr expressions.
+- The x86 intrinsics ``__bswap``, ``__bswapd``, ``__bswap64`` and ``__bswapq``
+ may now be used within constexpr expressions.
+
Internal API Changes
--------------------
diff --git a/clang/lib/Headers/ia32intrin.h b/clang/lib/Headers/ia32intrin.h
index bed75e18c4f6..88f031056f2d 100644
--- a/clang/lib/Headers/ia32intrin.h
+++ b/clang/lib/Headers/ia32intrin.h
@@ -69,12 +69,12 @@ __bsrd(int __A) {
* A 32-bit integer operand.
* \returns A 32-bit integer containing the swapped bytes.
*/
-static __inline__ int __DEFAULT_FN_ATTRS
+static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR
__bswapd(int __A) {
return __builtin_bswap32(__A);
}
-static __inline__ int __DEFAULT_FN_ATTRS
+static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR
_bswap(int __A) {
return __builtin_bswap32(__A);
}
@@ -128,7 +128,7 @@ __bsrq(long long __A) {
* A 64-bit integer operand.
* \returns A 64-bit integer containing the swapped bytes.
*/
-static __inline__ long long __DEFAULT_FN_ATTRS
+static __inline__ long long __DEFAULT_FN_ATTRS_CONSTEXPR
__bswapq(long long __A) {
return __builtin_bswap64(__A);
}
diff --git a/clang/test/CodeGen/x86-bswap.c b/clang/test/CodeGen/x86-bswap.c
index adf8b7846a02..e952e4f5b127 100644
--- a/clang/test/CodeGen/x86-bswap.c
+++ b/clang/test/CodeGen/x86-bswap.c
@@ -1,29 +1,45 @@
-// RUN: %clang_cc1 -ffreestanding %s -triple=x86_64-apple-darwin -emit-llvm -o - | FileCheck %s
+// RUN: %clang_cc1 -x c -ffreestanding %s -triple=x86_64-apple-darwin -emit-llvm -o - | FileCheck %s --check-prefixes=CHECK,CHECKC
+// RUN: %clang_cc1 -x c++ -std=c++11 -ffreestanding %s -triple=x86_64-apple-darwin -emit-llvm -o - | FileCheck %s --check-prefixes=CHECK,CHECKCPP
#include <x86intrin.h>
int test__bswapd(int X) {
-// CHECK-LABEL: @test__bswapd
+// CHECKC-LABEL: @test__bswapd
// CHECK: call i32 @llvm.bswap.i32
return __bswapd(X);
}
int test_bswap(int X) {
-// CHECK-LABEL: @test_bswap
+// CHECKC-LABEL: @test_bswap
// CHECK: call i32 @llvm.bswap.i32
return _bswap(X);
}
long test__bswapq(long long X) {
-// CHECK-LABEL: @test__bswapq
+// CHECKC-LABEL: @test__bswapq
// CHECK: call i64 @llvm.bswap.i64
return __bswapq(X);
}
long test_bswap64(long long X) {
-// CHECK-LABEL: @test_bswap64
+// CHECKC-LABEL: @test_bswap64
// CHECK: call i64 @llvm.bswap.i64
return _bswap64(X);
}
+// Test constexpr handling.
+#if defined(__cplusplus) && (__cplusplus >= 201103L)
+char bswapd_0[__bswapd(0x00000000) == 0x00000000 ? 1 : -1];
+char bswapd_1[__bswapd(0x01020304) == 0x04030201 ? 1 : -1];
+
+char bswap_0[_bswap(0x00000000) == 0x00000000 ? 1 : -1];
+char bswap_1[_bswap(0x10203040) == 0x40302010 ? 1 : -1];
+
+char bswapq_0[__bswapq(0x0000000000000000ULL) == 0x0000000000000000 ? 1 : -1];
+char bswapq_1[__bswapq(0x0102030405060708ULL) == 0x0807060504030201 ? 1 : -1];
+
+char bswap64_0[_bswap64(0x0000000000000000ULL) == 0x0000000000000000 ? 1 : -1];
+char bswap64_1[_bswap64(0x1020304050607080ULL) == 0x8070605040302010 ? 1 : -1];
+
+#endif
More information about the cfe-commits
mailing list