Hi, according to freshest Specs, we need to enable LZCNT only when ABM or LZCNT bits of CPUID (leaf 8000_0001h) is set. However config/i386/i386.md has: (define_insn "clz<mode>2_abm" [(set (match_operand:SWI248 0 "register_operand" "=r") (clz:SWI248 (match_operand:SWI248 1 "nonimmediate_operand" "rm"))) (clobber (reg:CC FLAGS_REG))] "TARGET_ABM || TARGET_BMI" "lzcnt{<imodesuffix>}\t{%1, %0|%0, %1}" [(set_attr "prefix_rep" "1") (set_attr "type" "bitmanip") (set_attr "mode" "<MODE>")]) There is no connection to BMI anymore.
Assembler takes lzcnt only if ABM or LCNT is enabled. It has nothing to do with BMI. AMD spec is incorrect.
Patch prepared. Discussion is here: http://gcc.gnu.org/ml/gcc-patches/2011-07/msg02266.html
Changes approved and checked in.
(In reply to comment #3) > Changes approved and checked in. When was it checked in? Where is the approved patch?
(In reply to comment #4) > (In reply to comment #3) > > Changes approved and checked in. > > When was it checked in? Where is the approved patch? My fault, I mix it up with BMI testcases which were recently approved. Sorry
Author: hjl Date: Mon Aug 1 13:47:31 2011 New Revision: 177034 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=177034 Log: Add -mlzcnt. gcc/ 2011-08-01 Kirill Yukhin <kirill.yukhin@intel.com> PR target/49547 * config.gcc (i[34567]86-*-*): Replace abmintrin.h with lzcntintrin.h. (x86_64-*-*): Likewise. * config/i386/i386.opt (mlzcnt): New. * config/i386/abmintrin.h: File removed. (__lzcnt_u16, __lzcnt, __lzcnt_u64): Moved to ... * config/i386/lzcntintrin.h: ... here. New file. (__lzcnt): Rename to ... (__lzcnt32): ... this. * config/i386/bmiintrin.h (head): Update copyright year. (__lzcnt_u16): Removed. (__lzcnt_u32): Likewise. (__lzcnt_u64): Likewise. * config/i386/x86intrin.h: Include lzcntintrin.h when __LZCNT__ is defined, remove abmintrin.h. * config/i386/cpuid.h (bit_LZCNT): New. * config/i386/driver-i386.c (host_detect_local_cpu): Detect LZCNT feature. * config/i386/i386-c.c (ix86_target_macros_internal): Define __LZCNT__ if needed. * config/i386/i386.c (ix86_target_string): New option -mlzcnt. (ix86_option_override_internal): Handle LZCNT option. (ix86_valid_target_attribute_inner_p): Likewise. (struct builtin_description bdesc_args) <IX86_BUILTIN_CLZS>: Update. * config/i386/i386.h (TARGET_LZCNT): New. (CLZ_DEFINED_VALUE_AT_ZERO): Update. * config/i386/i386.md (clz<mode>2): Update insn constraint. (clz<mode>2_lzcnt): Likewise. * doc/invoke.texi: Mention -mlzcnt option. * doc/extend.texi: Likewise. gcc/testsuite/ 2011-08-01 Kirill Yukhin <kirill.yukhin@intel.com> * gcc.target/i386/i386.exp (check_effective_target_lzcnt): New. * gcc.target/i386/lzcnt-1.c: New test. * gcc.target/i386/lzcnt-2.c: Likewise. * gcc.target/i386/lzcnt-2a.c: Likewise. * gcc.target/i386/lzcnt-3.c: Likewise. * gcc.target/i386/lzcnt-4.c: Likewise. * gcc.target/i386/lzcnt-4a.c: Likewise. * gcc.target/i386/lzcnt-5.c: Likewise. * gcc.target/i386/lzcnt-6.c: Likewise. * gcc.target/i386/lzcnt-6a.c: Likewise. * gcc.target/i386/lzcnt-check.h: Likewise. * gcc.target/i386/sse-12.c (dg-compile): Add -mlzcnt. * gcc.target/i386/sse-13.c: Likewise. * gcc.target/i386/sse-14.c: Likewise. * g++.dg/other/i386-2.C: Likewise. * g++.dg/other/i386-3.C: Likewise. Added: trunk/gcc/config/i386/lzcntintrin.h trunk/gcc/testsuite/gcc.target/i386/lzcnt-1.c trunk/gcc/testsuite/gcc.target/i386/lzcnt-2.c trunk/gcc/testsuite/gcc.target/i386/lzcnt-2a.c trunk/gcc/testsuite/gcc.target/i386/lzcnt-3.c trunk/gcc/testsuite/gcc.target/i386/lzcnt-4.c trunk/gcc/testsuite/gcc.target/i386/lzcnt-4a.c trunk/gcc/testsuite/gcc.target/i386/lzcnt-5.c trunk/gcc/testsuite/gcc.target/i386/lzcnt-6.c trunk/gcc/testsuite/gcc.target/i386/lzcnt-6a.c trunk/gcc/testsuite/gcc.target/i386/lzcnt-check.h Removed: trunk/gcc/config/i386/abmintrin.h Modified: trunk/gcc/ChangeLog trunk/gcc/config.gcc trunk/gcc/config/i386/bmiintrin.h trunk/gcc/config/i386/cpuid.h trunk/gcc/config/i386/driver-i386.c trunk/gcc/config/i386/i386-c.c trunk/gcc/config/i386/i386.c trunk/gcc/config/i386/i386.h trunk/gcc/config/i386/i386.md trunk/gcc/config/i386/i386.opt trunk/gcc/config/i386/x86intrin.h trunk/gcc/doc/extend.texi trunk/gcc/doc/invoke.texi trunk/gcc/testsuite/ChangeLog trunk/gcc/testsuite/g++.dg/other/i386-2.C trunk/gcc/testsuite/g++.dg/other/i386-3.C trunk/gcc/testsuite/gcc.target/i386/i386.exp trunk/gcc/testsuite/gcc.target/i386/sse-12.c trunk/gcc/testsuite/gcc.target/i386/sse-13.c trunk/gcc/testsuite/gcc.target/i386/sse-14.c