diff options
author | Hans Wennborg <hans@hanshq.net> | 2015-11-17 18:46:48 +0000 |
---|---|---|
committer | Hans Wennborg <hans@hanshq.net> | 2015-11-17 18:46:48 +0000 |
commit | b016519fe108cb4bf1e2f0981ee6f1892d16c0e7 (patch) | |
tree | 2a6f6e2abe13a063c2a7008c0bfbe58518b37c7d /lib/Headers/bmiintrin.h | |
parent | b149f9998c8120fd0ceec9d3eb0bec47654c1c74 (diff) |
bmiintrin.h: Allow using the tzcnt intrinsics for non-BMI targets
The tzcnt intrinsics are used non non-BMI targets by code (e.g. ffmpeg)
that uses it as a potentially faster BSF.
The TZCNT instruction is special in that it's encoded in a
backward-compatible way and behaves as BSF on non-BMI targets.
Differential Revision: http://reviews.llvm.org/D14748
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@253358 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Headers/bmiintrin.h')
-rw-r--r-- | lib/Headers/bmiintrin.h | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/lib/Headers/bmiintrin.h b/lib/Headers/bmiintrin.h index dc2f83f3e2..da98792d83 100644 --- a/lib/Headers/bmiintrin.h +++ b/lib/Headers/bmiintrin.h @@ -39,7 +39,12 @@ /* Define the default attributes for the functions in this file. */ #define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("bmi"))) -static __inline__ unsigned short __DEFAULT_FN_ATTRS +/* Allow using the tzcnt intrinsics even for non-BMI targets. Since the TZCNT + instruction behaves as BSF on non-BMI targets, there is code that expects + to use it as a potentially faster version of BSF. */ +#define __RELAXED_FN_ATTRS __attribute__((__always_inline__, __nodebug__)) + +static __inline__ unsigned short __RELAXED_FN_ATTRS __tzcnt_u16(unsigned short __X) { return __X ? __builtin_ctzs(__X) : 16; @@ -83,7 +88,7 @@ __blsr_u32(unsigned int __X) return __X & (__X - 1); } -static __inline__ unsigned int __DEFAULT_FN_ATTRS +static __inline__ unsigned int __RELAXED_FN_ATTRS __tzcnt_u32(unsigned int __X) { return __X ? __builtin_ctz(__X) : 32; @@ -136,7 +141,7 @@ __blsr_u64(unsigned long long __X) return __X & (__X - 1); } -static __inline__ unsigned long long __DEFAULT_FN_ATTRS +static __inline__ unsigned long long __RELAXED_FN_ATTRS __tzcnt_u64(unsigned long long __X) { return __X ? __builtin_ctzll(__X) : 64; @@ -145,5 +150,6 @@ __tzcnt_u64(unsigned long long __X) #endif /* __x86_64__ */ #undef __DEFAULT_FN_ATTRS +#undef __RELAXED_FN_ATTRS #endif /* __BMIINTRIN_H */ |