Bug 49547 - LZCNT should be enabled only if ABM or LZCNT bits are set
Summary: LZCNT should be enabled only if ABM or LZCNT bits are set
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: target (show other bugs)
Version: 4.6.0
: P3 normal
Target Milestone: 4.7.0
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2011-06-27 16:05 UTC by Yukhin Kirill
Modified: 2011-08-01 13:56 UTC (History)
2 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2011-06-27 16:10:24


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Yukhin Kirill 2011-06-27 16:05:01 UTC
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.
Comment 1 H.J. Lu 2011-06-27 16:10:24 UTC
Assembler takes lzcnt only if ABM or LCNT is enabled.
It has nothing to do with BMI.  AMD spec is incorrect.
Comment 2 Yukhin Kirill 2011-07-27 05:04:04 UTC
Patch prepared.
Discussion is here:
http://gcc.gnu.org/ml/gcc-patches/2011-07/msg02266.html
Comment 3 Yukhin Kirill 2011-07-27 17:58:56 UTC
Changes approved and checked in.
Comment 4 H.J. Lu 2011-07-27 18:02:32 UTC
(In reply to comment #3)
> Changes approved and checked in.

When was it checked in? Where is the approved patch?
Comment 5 Yukhin Kirill 2011-07-27 18:06:59 UTC
(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
Comment 6 hjl@gcc.gnu.org 2011-08-01 13:47:39 UTC
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