hans created this revision. hans added reviewers: thakis, echristo. hans added a subscriber: cfe-commits.
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. http://reviews.llvm.org/D14748 Files: lib/Headers/bmiintrin.h Index: lib/Headers/bmiintrin.h =================================================================== --- lib/Headers/bmiintrin.h +++ 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 @@ 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,14 +141,15 @@ 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; } #endif /* __x86_64__ */ #undef __DEFAULT_FN_ATTRS +#undef __RELAXED_FN_ATTRS #endif /* __BMIINTRIN_H */
Index: lib/Headers/bmiintrin.h =================================================================== --- lib/Headers/bmiintrin.h +++ 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 @@ 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,14 +141,15 @@ 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; } #endif /* __x86_64__ */ #undef __DEFAULT_FN_ATTRS +#undef __RELAXED_FN_ATTRS #endif /* __BMIINTRIN_H */
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits