forked from OSchip/llvm-project
[X86] Enable constexpr on BITSCAN intrinsics (PR31446)
This enables constexpr BSF/BSR intrinsics defined in ia32intrin.h
This commit is contained in:
parent
9e6c09c0d9
commit
9ffc412e1a
|
@ -160,6 +160,12 @@ X86 Support in Clang
|
|||
``_popcnt64``, ``__popcntd`` and ``__popcntq`` may now be used within
|
||||
constexpr expressions.
|
||||
|
||||
- The x86 intrinsics ``_bit_scan_forward``, ``__bsfd`` and ``__bsfq`` may now
|
||||
be used within constexpr expressions.
|
||||
|
||||
- The x86 intrinsics ``_bit_scan_reverse``, ``__bsrd`` and ``__bsrq`` may now
|
||||
be used within constexpr expressions.
|
||||
|
||||
- The x86 intrinsics ``__bswap``, ``__bswapd``, ``__bswap64`` and ``__bswapq``
|
||||
may now be used within constexpr expressions.
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
* A 32-bit integer operand.
|
||||
* \returns A 32-bit integer containing the bit number.
|
||||
*/
|
||||
static __inline__ int __DEFAULT_FN_ATTRS
|
||||
static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR
|
||||
__bsfd(int __A) {
|
||||
return __builtin_ctz(__A);
|
||||
}
|
||||
|
@ -53,7 +53,7 @@ __bsfd(int __A) {
|
|||
* A 32-bit integer operand.
|
||||
* \returns A 32-bit integer containing the bit number.
|
||||
*/
|
||||
static __inline__ int __DEFAULT_FN_ATTRS
|
||||
static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR
|
||||
__bsrd(int __A) {
|
||||
return 31 - __builtin_clz(__A);
|
||||
}
|
||||
|
@ -95,7 +95,7 @@ _bswap(int __A) {
|
|||
* A 64-bit integer operand.
|
||||
* \returns A 32-bit integer containing the bit number.
|
||||
*/
|
||||
static __inline__ int __DEFAULT_FN_ATTRS
|
||||
static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR
|
||||
__bsfq(long long __A) {
|
||||
return __builtin_ctzll(__A);
|
||||
}
|
||||
|
@ -112,7 +112,7 @@ __bsfq(long long __A) {
|
|||
* A 64-bit integer operand.
|
||||
* \returns A 32-bit integer containing the bit number.
|
||||
*/
|
||||
static __inline__ int __DEFAULT_FN_ATTRS
|
||||
static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR
|
||||
__bsrq(long long __A) {
|
||||
return 63 - __builtin_clzll(__A);
|
||||
}
|
||||
|
|
|
@ -1,47 +1,74 @@
|
|||
// RUN: %clang_cc1 -ffreestanding -triple x86_64-unknown-unknown -emit-llvm -o - %s | FileCheck %s
|
||||
// RUN: %clang_cc1 -x c -ffreestanding %s -triple=x86_64-unknown-unknown -emit-llvm -o - | FileCheck %s --check-prefixes=CHECK,CHECKC
|
||||
// RUN: %clang_cc1 -x c++ -std=c++11 -ffreestanding %s -triple=x86_64-unknown-unknown -emit-llvm -o - | FileCheck %s --check-prefixes=CHECK,CHECKCPP
|
||||
|
||||
|
||||
// PR33722
|
||||
// RUN: %clang_cc1 -ffreestanding -triple x86_64-unknown-unknown -fms-extensions -fms-compatibility-version=19.00 -emit-llvm -o - %s | FileCheck %s
|
||||
// RUN: %clang_cc1 -x c -ffreestanding %s -triple x86_64-unknown-unknown -fms-extensions -fms-compatibility-version=19.00 -emit-llvm -o - | FileCheck %s --check-prefixes=CHECK,CHECKC
|
||||
// RUN: %clang_cc1 -x c++ -ffreestanding %s -triple x86_64-unknown-unknown -fms-extensions -fms-compatibility-version=19.00 -emit-llvm -o - | FileCheck %s --check-prefixes=CHECK,CHECKCPP
|
||||
|
||||
#include <x86intrin.h>
|
||||
|
||||
int test_bit_scan_forward(int a) {
|
||||
return _bit_scan_forward(a);
|
||||
// CHECK: @test_bit_scan_forward
|
||||
// CHECKC-LABEL: @test_bit_scan_forward
|
||||
// CHECK: %[[call:.*]] = call i32 @llvm.cttz.i32(i32 %{{.*}}, i1 true)
|
||||
// CHECK: ret i32 %[[call]]
|
||||
}
|
||||
|
||||
int test_bit_scan_reverse(int a) {
|
||||
return _bit_scan_reverse(a);
|
||||
// CHECKC-LABEL: @test_bit_scan_reverse
|
||||
// CHECK: %[[call:.*]] = call i32 @llvm.ctlz.i32(i32 %{{.*}}, i1 true)
|
||||
// CHECK: %[[sub:.*]] = sub nsw i32 31, %[[call]]
|
||||
// CHECK: ret i32 %[[sub]]
|
||||
}
|
||||
|
||||
int test__bsfd(int X) {
|
||||
// CHECK: @test__bsfd
|
||||
// CHECKC-LABEL: @test__bsfd
|
||||
// CHECK: %[[call:.*]] = call i32 @llvm.cttz.i32(i32 %{{.*}}, i1 true)
|
||||
return __bsfd(X);
|
||||
}
|
||||
|
||||
int test__bsfq(long long X) {
|
||||
// CHECK: @test__bsfq
|
||||
// CHECKC-LABEL: @test__bsfq
|
||||
// CHECK: %[[call:.*]] = call i64 @llvm.cttz.i64(i64 %{{.*}}, i1 true)
|
||||
return __bsfq(X);
|
||||
}
|
||||
|
||||
int test__bsrd(int X) {
|
||||
// CHECK: @test__bsrd
|
||||
// CHECKC-LABEL: @test__bsrd
|
||||
// CHECK: %[[call:.*]] = call i32 @llvm.ctlz.i32(i32 %{{.*}}, i1 true)
|
||||
// CHECK: %[[sub:.*]] = sub nsw i32 31, %[[call]]
|
||||
return __bsrd(X);
|
||||
}
|
||||
|
||||
int test__bsrq(long long X) {
|
||||
// CHECK: @test__bsrq
|
||||
// CHECKC-LABEL: @test__bsrq
|
||||
// CHECK: %[[call:.*]] = call i64 @llvm.ctlz.i64(i64 %{{.*}}, i1 true)
|
||||
// CHECK: %[[cast:.*]] = trunc i64 %[[call]] to i32
|
||||
// CHECK: %[[sub:.*]] = sub nsw i32 63, %[[cast]]
|
||||
return __bsrq(X);
|
||||
}
|
||||
|
||||
// Test constexpr handling.
|
||||
#if defined(__cplusplus) && (__cplusplus >= 201103L)
|
||||
|
||||
char bsf_0[_bit_scan_forward(0x00000001) == 0 ? 1 : -1];
|
||||
char bsf_1[_bit_scan_forward(0x10000000) == 28 ? 1 : -1];
|
||||
|
||||
char bsr_0[_bit_scan_reverse(0x00000001) == 0 ? 1 : -1];
|
||||
char bsr_1[_bit_scan_reverse(0x01000000) == 24 ? 1 : -1];
|
||||
|
||||
char bsfd_0[__bsfd(0x00000008) == 3 ? 1 : -1];
|
||||
char bsfd_1[__bsfd(0x00010008) == 3 ? 1 : -1];
|
||||
|
||||
char bsrd_0[__bsrd(0x00000010) == 4 ? 1 : -1];
|
||||
char bsrd_1[__bsrd(0x00100100) == 20 ? 1 : -1];
|
||||
|
||||
char bsfq_0[__bsfq(0x0000000800000000ULL) == 35 ? 1 : -1];
|
||||
char bsfq_1[__bsfq(0x0004000000000000ULL) == 50 ? 1 : -1];
|
||||
|
||||
char bsrq_0[__bsrq(0x0000100800000000ULL) == 44 ? 1 : -1];
|
||||
char bsrq_1[__bsrq(0x0004000100000000ULL) == 50 ? 1 : -1];
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue