Re: [PATCH] D21373: [Clang][bmi][intrinsics] Adding _mm_tzcnt_64 _mm_tzcnt_32 intrinsics to clang.
This revision was automatically updated to reflect the committed changes. Closed by commit rL273401: [Clang][bmi][intrinsics] Adding _mm_tzcnt_64 _mm_tzcnt_32 intrinsics to clang. (authored by mzuckerm). Changed prior to commit: http://reviews.llvm.org/D21373?vs=61351=61536#toc Repository: rL LLVM http://reviews.llvm.org/D21373 Files: cfe/trunk/lib/Headers/bmiintrin.h cfe/trunk/test/CodeGen/bmi-builtins.c Index: cfe/trunk/test/CodeGen/bmi-builtins.c === --- cfe/trunk/test/CodeGen/bmi-builtins.c +++ cfe/trunk/test/CodeGen/bmi-builtins.c @@ -64,6 +64,13 @@ return __tzcnt_u32(__X); } +int test_mm_tzcnt_32(unsigned int __X) { + // CHECK-LABEL: test_mm_tzcnt_32 + // CHECK: icmp ne i32 %{{.*}}, 0 + // CHECK: i32 @llvm.cttz.i32(i32 %{{.*}}, i1 true) + return _mm_tzcnt_32(__X); +} + unsigned long long test__andn_u64(unsigned long __X, unsigned long __Y) { // CHECK-LABEL: test__andn_u64 // CHECK: xor i64 %{{.*}}, -1 @@ -105,6 +112,13 @@ return __tzcnt_u64(__X); } +long long test_mm_tzcnt_64(unsigned long long __X) { + // CHECK-LABEL: test_mm_tzcnt_64 + // CHECK: icmp ne i64 %{{.*}}, 0 + // CHECK: i64 @llvm.cttz.i64(i64 %{{.*}}, i1 true) + return _mm_tzcnt_64(__X); +} + // Intel intrinsics unsigned short test_tzcnt_u16(unsigned short __X) { Index: cfe/trunk/lib/Headers/bmiintrin.h === --- cfe/trunk/lib/Headers/bmiintrin.h +++ cfe/trunk/lib/Headers/bmiintrin.h @@ -287,6 +287,22 @@ return __X ? __builtin_ctz(__X) : 32; } +/// \brief Counts the number of trailing zero bits in the operand. +/// +/// \headerfile +/// +/// This intrinsic corresponds to the \c TZCNT instruction. +/// +/// \param __X +///An unsigned 32-bit integer whose trailing zeros are to be counted. +/// \returns An 32-bit integer containing the number of trailing zero +///bits in the operand. +static __inline__ int __RELAXED_FN_ATTRS +_mm_tzcnt_32(unsigned int __X) +{ + return __X ? __builtin_ctz(__X) : 32; +} + #ifdef __x86_64__ /// \brief Performs a bitwise AND of the second operand with the one's @@ -508,6 +524,22 @@ return __X ? __builtin_ctzll(__X) : 64; } +/// \brief Counts the number of trailing zero bits in the operand. +/// +/// \headerfile +/// +/// This intrinsic corresponds to the \c TZCNT instruction. +/// +/// \param __X +///An unsigned 64-bit integer whose trailing zeros are to be counted. +/// \returns An 64-bit integer containing the number of trailing zero +///bits in the operand. +static __inline__ long long __RELAXED_FN_ATTRS +_mm_tzcnt_64(unsigned long long __X) +{ + return __X ? __builtin_ctzll(__X) : 64; +} + #endif /* __x86_64__ */ #undef __DEFAULT_FN_ATTRS Index: cfe/trunk/test/CodeGen/bmi-builtins.c === --- cfe/trunk/test/CodeGen/bmi-builtins.c +++ cfe/trunk/test/CodeGen/bmi-builtins.c @@ -64,6 +64,13 @@ return __tzcnt_u32(__X); } +int test_mm_tzcnt_32(unsigned int __X) { + // CHECK-LABEL: test_mm_tzcnt_32 + // CHECK: icmp ne i32 %{{.*}}, 0 + // CHECK: i32 @llvm.cttz.i32(i32 %{{.*}}, i1 true) + return _mm_tzcnt_32(__X); +} + unsigned long long test__andn_u64(unsigned long __X, unsigned long __Y) { // CHECK-LABEL: test__andn_u64 // CHECK: xor i64 %{{.*}}, -1 @@ -105,6 +112,13 @@ return __tzcnt_u64(__X); } +long long test_mm_tzcnt_64(unsigned long long __X) { + // CHECK-LABEL: test_mm_tzcnt_64 + // CHECK: icmp ne i64 %{{.*}}, 0 + // CHECK: i64 @llvm.cttz.i64(i64 %{{.*}}, i1 true) + return _mm_tzcnt_64(__X); +} + // Intel intrinsics unsigned short test_tzcnt_u16(unsigned short __X) { Index: cfe/trunk/lib/Headers/bmiintrin.h === --- cfe/trunk/lib/Headers/bmiintrin.h +++ cfe/trunk/lib/Headers/bmiintrin.h @@ -287,6 +287,22 @@ return __X ? __builtin_ctz(__X) : 32; } +/// \brief Counts the number of trailing zero bits in the operand. +/// +/// \headerfile +/// +/// This intrinsic corresponds to the \c TZCNT instruction. +/// +/// \param __X +///An unsigned 32-bit integer whose trailing zeros are to be counted. +/// \returns An 32-bit integer containing the number of trailing zero +///bits in the operand. +static __inline__ int __RELAXED_FN_ATTRS +_mm_tzcnt_32(unsigned int __X) +{ + return __X ? __builtin_ctz(__X) : 32; +} + #ifdef __x86_64__ /// \brief Performs a bitwise AND of the second operand with the one's @@ -508,6 +524,22 @@ return __X ? __builtin_ctzll(__X) : 64; } +/// \brief Counts the number of trailing zero bits in the operand. +/// +/// \headerfile +/// +/// This intrinsic corresponds to the \c TZCNT instruction. +/// +/// \param __X +///An unsigned 64-bit integer whose trailing zeros are to be counted. +/// \returns An 64-bit integer containing the number of trailing zero +///bits in the operand. +static __inline__
Re: [PATCH] D21373: [Clang][bmi][intrinsics] Adding _mm_tzcnt_64 _mm_tzcnt_32 intrinsics to clang.
RKSimon accepted this revision. RKSimon added a comment. This revision is now accepted and ready to land. LGTM Comment at: lib/Headers/bmiintrin.h:284 @@ -283,2 +283,3 @@ ///bits in the operand. + static __inline__ unsigned int __RELAXED_FN_ATTRS Why the newlines? It doesn't match the rest of the header. Comment at: lib/Headers/bmiintrin.h:296 @@ +295,3 @@ +/// This intrinsic corresponds to the \c TZCNT instruction. +/// +/// \param __X m_zuckerman wrote: > We can't use #define Here. The __mm_tzcnt_32(a) intrinsics is deferent from > __tzcnt_u32 in the return value. The __mm_tzcnt_32 intrinsic return sign int > while the __tzcnt_u32 return unsign value. Ah! Missed that bit - thats fine. http://reviews.llvm.org/D21373 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D21373: [Clang][bmi][intrinsics] Adding _mm_tzcnt_64 _mm_tzcnt_32 intrinsics to clang.
m_zuckerman added inline comments. Comment at: lib/Headers/bmiintrin.h:296 @@ +295,3 @@ +/// This intrinsic corresponds to the \c TZCNT instruction. +/// +/// \param __X We can't use #define Here. The __mm_tzcnt_32(a) intrinsics is deferent from __tzcnt_u32 in the return value. The __mm_tzcnt_32 intrinsic return sign int while the __tzcnt_u32 return unsign value. http://reviews.llvm.org/D21373 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D21373: [Clang][bmi][intrinsics] Adding _mm_tzcnt_64 _mm_tzcnt_32 intrinsics to clang.
m_zuckerman updated this revision to Diff 61351. http://reviews.llvm.org/D21373 Files: lib/Headers/bmiintrin.h test/CodeGen/bmi-builtins.c Index: test/CodeGen/bmi-builtins.c === --- test/CodeGen/bmi-builtins.c +++ test/CodeGen/bmi-builtins.c @@ -64,6 +64,13 @@ return __tzcnt_u32(__X); } +int test_mm_tzcnt_32(unsigned int __X) { + // CHECK-LABEL: test_mm_tzcnt_32 + // CHECK: icmp ne i32 %{{.*}}, 0 + // CHECK: i32 @llvm.cttz.i32(i32 %{{.*}}, i1 true) + return _mm_tzcnt_32(__X); +} + unsigned long long test__andn_u64(unsigned long __X, unsigned long __Y) { // CHECK-LABEL: test__andn_u64 // CHECK: xor i64 %{{.*}}, -1 @@ -105,6 +112,13 @@ return __tzcnt_u64(__X); } +long long test_mm_tzcnt_64(unsigned long long __X) { + // CHECK-LABEL: test_mm_tzcnt_64 + // CHECK: icmp ne i64 %{{.*}}, 0 + // CHECK: i64 @llvm.cttz.i64(i64 %{{.*}}, i1 true) + return _mm_tzcnt_64(__X); +} + // Intel intrinsics unsigned short test_tzcnt_u16(unsigned short __X) { Index: lib/Headers/bmiintrin.h === --- lib/Headers/bmiintrin.h +++ lib/Headers/bmiintrin.h @@ -281,12 +281,30 @@ ///An unsigned 32-bit integer whose trailing zeros are to be counted. /// \returns An unsigned 32-bit integer containing the number of trailing zero ///bits in the operand. + static __inline__ unsigned int __RELAXED_FN_ATTRS __tzcnt_u32(unsigned int __X) { return __X ? __builtin_ctz(__X) : 32; } +/// \brief Counts the number of trailing zero bits in the operand. +/// +/// \headerfile +/// +/// This intrinsic corresponds to the \c TZCNT instruction. +/// +/// \param __X +///An unsigned 32-bit integer whose trailing zeros are to be counted. +/// \returns An 32-bit integer containing the number of trailing zero +///bits in the operand. + +static __inline__ int __RELAXED_FN_ATTRS +_mm_tzcnt_32(unsigned int __X) +{ + return __X ? __builtin_ctz(__X) : 32; +} + #ifdef __x86_64__ /// \brief Performs a bitwise AND of the second operand with the one's @@ -502,12 +520,30 @@ ///An unsigned 64-bit integer whose trailing zeros are to be counted. /// \returns An unsigned 64-bit integer containing the number of trailing zero ///bits in the operand. + static __inline__ unsigned long long __RELAXED_FN_ATTRS __tzcnt_u64(unsigned long long __X) { return __X ? __builtin_ctzll(__X) : 64; } +/// \brief Counts the number of trailing zero bits in the operand. +/// +/// \headerfile +/// +/// This intrinsic corresponds to the \c TZCNT instruction. +/// +/// \param __X +///An unsigned 64-bit integer whose trailing zeros are to be counted. +/// \returns An 64-bit integer containing the number of trailing zero +///bits in the operand. + +static __inline__ long long __RELAXED_FN_ATTRS +_mm_tzcnt_64(unsigned long long __X) +{ + return __X ? __builtin_ctzll(__X) : 64; +} + #endif /* __x86_64__ */ #undef __DEFAULT_FN_ATTRS Index: test/CodeGen/bmi-builtins.c === --- test/CodeGen/bmi-builtins.c +++ test/CodeGen/bmi-builtins.c @@ -64,6 +64,13 @@ return __tzcnt_u32(__X); } +int test_mm_tzcnt_32(unsigned int __X) { + // CHECK-LABEL: test_mm_tzcnt_32 + // CHECK: icmp ne i32 %{{.*}}, 0 + // CHECK: i32 @llvm.cttz.i32(i32 %{{.*}}, i1 true) + return _mm_tzcnt_32(__X); +} + unsigned long long test__andn_u64(unsigned long __X, unsigned long __Y) { // CHECK-LABEL: test__andn_u64 // CHECK: xor i64 %{{.*}}, -1 @@ -105,6 +112,13 @@ return __tzcnt_u64(__X); } +long long test_mm_tzcnt_64(unsigned long long __X) { + // CHECK-LABEL: test_mm_tzcnt_64 + // CHECK: icmp ne i64 %{{.*}}, 0 + // CHECK: i64 @llvm.cttz.i64(i64 %{{.*}}, i1 true) + return _mm_tzcnt_64(__X); +} + // Intel intrinsics unsigned short test_tzcnt_u16(unsigned short __X) { Index: lib/Headers/bmiintrin.h === --- lib/Headers/bmiintrin.h +++ lib/Headers/bmiintrin.h @@ -281,12 +281,30 @@ ///An unsigned 32-bit integer whose trailing zeros are to be counted. /// \returns An unsigned 32-bit integer containing the number of trailing zero ///bits in the operand. + static __inline__ unsigned int __RELAXED_FN_ATTRS __tzcnt_u32(unsigned int __X) { return __X ? __builtin_ctz(__X) : 32; } +/// \brief Counts the number of trailing zero bits in the operand. +/// +/// \headerfile +/// +/// This intrinsic corresponds to the \c TZCNT instruction. +/// +/// \param __X +///An unsigned 32-bit integer whose trailing zeros are to be counted. +/// \returns An 32-bit integer containing the number of trailing zero +///bits in the operand. + +static __inline__ int __RELAXED_FN_ATTRS +_mm_tzcnt_32(unsigned int __X) +{ + return __X ? __builtin_ctz(__X) : 32; +} + #ifdef __x86_64__ /// \brief Performs a bitwise AND of the second operand with the one's @@
Re: [PATCH] D21373: [Clang][bmi][intrinsics] Adding _mm_tzcnt_64 _mm_tzcnt_32 intrinsics to clang.
RKSimon added a subscriber: RKSimon. RKSimon added a reviewer: RKSimon. Comment at: lib/Headers/bmiintrin.h:296 @@ -290,1 +295,3 @@ +} + #ifdef __x86_64__ Why not just #define to __tzcnt_u32 like the (many) other duplicate tzcnt intrinsics we have: ``` #define _mm_tzcnt_32(a) (__tzcnt_u32((a))) ``` Same for _mm_tzcnt_64 Also, please can you copy/paste/edit the doxygen comment so that its properly documented? http://reviews.llvm.org/D21373 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D21373: [Clang][bmi][intrinsics] Adding _mm_tzcnt_64 _mm_tzcnt_32 intrinsics to clang.
m_zuckerman created this revision. m_zuckerman added reviewers: AsafBadouh, igorb, delena. m_zuckerman added a subscriber: cfe-commits. http://reviews.llvm.org/D21373 Files: lib/Headers/bmiintrin.h test/CodeGen/bmi-builtins.c Index: test/CodeGen/bmi-builtins.c === --- test/CodeGen/bmi-builtins.c +++ test/CodeGen/bmi-builtins.c @@ -64,6 +64,13 @@ return __tzcnt_u32(__X); } +int test_mm_tzcnt_32(unsigned int __X) { + // CHECK-LABEL: test_mm_tzcnt_32 + // CHECK: icmp ne i32 %{{.*}}, 0 + // CHECK: i32 @llvm.cttz.i32(i32 %{{.*}}, i1 true) + return _mm_tzcnt_32(__X); +} + unsigned long long test__andn_u64(unsigned long __X, unsigned long __Y) { // CHECK-LABEL: test__andn_u64 // CHECK: xor i64 %{{.*}}, -1 @@ -105,6 +112,13 @@ return __tzcnt_u64(__X); } +long long test_mm_tzcnt_64(unsigned long long __X) { + // CHECK-LABEL: test_mm_tzcnt_64 + // CHECK: icmp ne i64 %{{.*}}, 0 + // CHECK: i64 @llvm.cttz.i64(i64 %{{.*}}, i1 true) + return _mm_tzcnt_64(__X); +} + // Intel intrinsics unsigned short test_tzcnt_u16(unsigned short __X) { Index: lib/Headers/bmiintrin.h === --- lib/Headers/bmiintrin.h +++ lib/Headers/bmiintrin.h @@ -281,12 +281,19 @@ ///An unsigned 32-bit integer whose trailing zeros are to be counted. /// \returns An unsigned 32-bit integer containing the number of trailing zero ///bits in the operand. + static __inline__ unsigned int __RELAXED_FN_ATTRS __tzcnt_u32(unsigned int __X) { return __X ? __builtin_ctz(__X) : 32; } +static __inline__ int __RELAXED_FN_ATTRS +_mm_tzcnt_32(unsigned int __X) +{ + return __X ? __builtin_ctz(__X) : 32; +} + #ifdef __x86_64__ /// \brief Performs a bitwise AND of the second operand with the one's @@ -502,12 +509,19 @@ ///An unsigned 64-bit integer whose trailing zeros are to be counted. /// \returns An unsigned 64-bit integer containing the number of trailing zero ///bits in the operand. + static __inline__ unsigned long long __RELAXED_FN_ATTRS __tzcnt_u64(unsigned long long __X) { return __X ? __builtin_ctzll(__X) : 64; } +static __inline__ long long __RELAXED_FN_ATTRS +_mm_tzcnt_64(unsigned long long __X) +{ + return __X ? __builtin_ctzll(__X) : 64; +} + #endif /* __x86_64__ */ #undef __DEFAULT_FN_ATTRS Index: test/CodeGen/bmi-builtins.c === --- test/CodeGen/bmi-builtins.c +++ test/CodeGen/bmi-builtins.c @@ -64,6 +64,13 @@ return __tzcnt_u32(__X); } +int test_mm_tzcnt_32(unsigned int __X) { + // CHECK-LABEL: test_mm_tzcnt_32 + // CHECK: icmp ne i32 %{{.*}}, 0 + // CHECK: i32 @llvm.cttz.i32(i32 %{{.*}}, i1 true) + return _mm_tzcnt_32(__X); +} + unsigned long long test__andn_u64(unsigned long __X, unsigned long __Y) { // CHECK-LABEL: test__andn_u64 // CHECK: xor i64 %{{.*}}, -1 @@ -105,6 +112,13 @@ return __tzcnt_u64(__X); } +long long test_mm_tzcnt_64(unsigned long long __X) { + // CHECK-LABEL: test_mm_tzcnt_64 + // CHECK: icmp ne i64 %{{.*}}, 0 + // CHECK: i64 @llvm.cttz.i64(i64 %{{.*}}, i1 true) + return _mm_tzcnt_64(__X); +} + // Intel intrinsics unsigned short test_tzcnt_u16(unsigned short __X) { Index: lib/Headers/bmiintrin.h === --- lib/Headers/bmiintrin.h +++ lib/Headers/bmiintrin.h @@ -281,12 +281,19 @@ ///An unsigned 32-bit integer whose trailing zeros are to be counted. /// \returns An unsigned 32-bit integer containing the number of trailing zero ///bits in the operand. + static __inline__ unsigned int __RELAXED_FN_ATTRS __tzcnt_u32(unsigned int __X) { return __X ? __builtin_ctz(__X) : 32; } +static __inline__ int __RELAXED_FN_ATTRS +_mm_tzcnt_32(unsigned int __X) +{ + return __X ? __builtin_ctz(__X) : 32; +} + #ifdef __x86_64__ /// \brief Performs a bitwise AND of the second operand with the one's @@ -502,12 +509,19 @@ ///An unsigned 64-bit integer whose trailing zeros are to be counted. /// \returns An unsigned 64-bit integer containing the number of trailing zero ///bits in the operand. + static __inline__ unsigned long long __RELAXED_FN_ATTRS __tzcnt_u64(unsigned long long __X) { return __X ? __builtin_ctzll(__X) : 64; } +static __inline__ long long __RELAXED_FN_ATTRS +_mm_tzcnt_64(unsigned long long __X) +{ + return __X ? __builtin_ctzll(__X) : 64; +} + #endif /* __x86_64__ */ #undef __DEFAULT_FN_ATTRS ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits