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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits