diff options
author | Uros Bizjak <uros@gcc.gnu.org> | 2012-05-21 17:46:25 +0200 |
---|---|---|
committer | Uros Bizjak <uros@gcc.gnu.org> | 2012-05-21 17:46:25 +0200 |
commit | 89ac11d833317faa6c74bee89ddbe18ae93fe272 (patch) | |
tree | c9d5c232390be3b1203c79f171d2c205e2aa3cd9 /gcc | |
parent | 94ccc95d412bb6a8765737ad153a780bc03d6294 (diff) | |
download | gcc-89ac11d833317faa6c74bee89ddbe18ae93fe272.zip gcc-89ac11d833317faa6c74bee89ddbe18ae93fe272.tar.gz gcc-89ac11d833317faa6c74bee89ddbe18ae93fe272.tar.bz2 |
re PR target/53399 ("*ffs" pattern generates wrong code with BMI enabled)
PR target/53399
* config/i386/i386.md (ffs<mode>2): Generate CCCmode compare
for TARGET_BMI.
(ffssi2_no_cmove): Ditto.
(*ffs<mode>_1): Remove insn pattern.
(*tzcnt<mode>_1): New insn pattern.
(*bsf<mode>1): Ditto.
From-SVN: r187722
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 45 | ||||
-rw-r--r-- | gcc/config/i386/i386.md | 61 |
2 files changed, 60 insertions, 46 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7702970..dc7b1cd 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2012-05-21 Uros Bizjak <ubizjak@gmail.com> + + PR target/53399 + * config/i386/i386.md (ffs<mode>2): Generate CCCmode compare + for TARGET_BMI. + (ffssi2_no_cmove): Ditto. + (*ffs<mode>_1): Remove insn pattern. + (*tzcnt<mode>_1): New insn pattern. + (*bsf<mode>1): Ditto. + 2012-05-21 Richard Guenther <rguenther@suse.de> * tree-dfa.c (add_referenced_var): Do not walk DECL_INITIAL for @@ -70,7 +80,7 @@ 2012-05-21 Razya Ladelsky <razya@il.ibm.com> - * tree-parloops.c : Add myself to contributors, update + * tree-parloops.c : Add myself to contributors, update TODO list, add link to wiki. 2012-05-21 Alan Modra <amodra@gmail.com> @@ -126,8 +136,9 @@ call_val_symref_64bit, call_val_reg_pic, call_val_reg_64bit): Likewise. 2012-05-20 Razya Ladelsky <razya@il.ibm.com> - - * tree-parloops.c (gen_parallel_loop): Change many_iterations_cond for outer loops. + + * tree-parloops.c (gen_parallel_loop): Change many_iterations_cond + for outer loops. 2012-05-18 Jan Hubicka <jh@suse.cz> @@ -145,7 +156,8 @@ 2012-05-18 Jan Hubicka <jh@suse.cz> - * cgraphunit.c (handle_alias_pairs): Cleanup; handle all types of aliases. + * cgraphunit.c (handle_alias_pairs): Cleanup; handle all types of + aliases. 2012-05-18 Jan Hubicka <jh@suse.cz> @@ -205,15 +217,13 @@ * cgraphunit.c (varpool_finalize_decl): Allow external decls. (mark_functions_to_output): Fix sanity check. - * ipa.c (function_and_variable_visibility): Remove TREE_STATIC - check. + * ipa.c (function_and_variable_visibility): Remove TREE_STATIC check. 2012-05-18 Richard Guenther <rguenther@suse.de> * tree-flow.h (mark_symbols_for_renaming): Remove. * tree-dfa.c (mark_symbols_for_renaming): Likewise. - * tree-inline.c (copy_edges_for_bb): Do not mark symbols for - renaming. + * tree-inline.c (copy_edges_for_bb): Do not mark symbols for renaming. (copy_debug_stmt): Likewise. (expand_call_inline): Likewise. (declare_return_variable): Mark the return variable for renaming @@ -248,13 +258,14 @@ 2012-05-17 Jan Hubicka <jh@suse.cz> - * lto-symtab.c (lto_symtab_resolve_symbols): Preffer decl with constructor - over decl without. + * lto-symtab.c (lto_symtab_resolve_symbols): Preffer decl with + constructor over decl without. * cgraph.c (cgraph_remove_node): Clear also body of unanalyzed nodes. * cgraph.h (varpool_can_remove_if_no_refs): Handle external correctly. - * cgraphunit.c (process_function_and_variable_attributes): Finalize + * cgraphunit.c (process_function_and_variable_attributes): Finalize extrnal decls. - (mark_functions_to_output): Also accept bodies for functions with clones. + (mark_functions_to_output): Also accept bodies for functions with + clones. (output_in_order): Skip external vars. * lto-cgraph.c (lto_output_node): External functions are never in other partition. @@ -287,8 +298,7 @@ 2012-05-17 Kwok Cheung Yeung <kcy@codesourcery.com> - * config/m68k/m68k-devices.def: Add 51ag, 51je, 51jf, 51jg, 51mm, - 51qm. + * config/m68k/m68k-devices.def: Add 51ag, 51je, 51jf, 51jg, 51mm, 51qm. * config/m68k/m68k-tables.opt: Regenerated. * doc/invoke.texi (M680x0 Options): Document. @@ -468,7 +478,7 @@ 2012-05-15 Tristan Gingold <gingold@adacore.com> - * tree-ssa-strlen.c (get_string_length): Convert lhs if needed. + * tree-ssa-strlen.c (get_string_length): Convert lhs if needed. 2012-05-15 Richard Guenther <rguenther@suse.de> @@ -496,8 +506,7 @@ 2012-05-15 Kenneth Zadeck <zadeck@naturalbridge.com> - * doc/md.texi (fma): Define to only be applicable for single - rounding. + * doc/md.texi (fma): Define to only be applicable for single rounding. 2012-05-14 Uros Bizjak <ubizjak@gmail.com> @@ -552,7 +561,7 @@ * config/avr/avr.c (avr_const_address_lo16): Remove. (avr_assemble_integer): Print ".byte lo8(x)", ".byte hi8(x)", ".byte hh8(x)" instead of emit an assembler - .warning if 3-byte address is assembled. + .warning if 3-byte address is assembled. * doc/extend.texi (AVR Named Address Spaces): Document that binutils 2.23 is needed to assemble 3-byte addresses. diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 8326ceb..a2e6a52 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -12132,26 +12132,31 @@ (define_expand "ffs<mode>2" [(set (match_dup 2) (const_int -1)) - (parallel [(set (reg:CCZ FLAGS_REG) - (compare:CCZ - (match_operand:SWI48 1 "nonimmediate_operand") - (const_int 0))) + (parallel [(set (match_dup 3) (match_dup 4)) (set (match_operand:SWI48 0 "register_operand") - (ctz:SWI48 (match_dup 1)))]) + (ctz:SWI48 + (match_operand:SWI48 1 "nonimmediate_operand")))]) (set (match_dup 0) (if_then_else:SWI48 - (eq (reg:CCZ FLAGS_REG) (const_int 0)) + (eq (match_dup 3) (const_int 0)) (match_dup 2) (match_dup 0))) (parallel [(set (match_dup 0) (plus:SWI48 (match_dup 0) (const_int 1))) (clobber (reg:CC FLAGS_REG))])] "" { + enum machine_mode flags_mode; + if (<MODE>mode == SImode && !TARGET_CMOVE) { emit_insn (gen_ffssi2_no_cmove (operands[0], operands [1])); DONE; } + + flags_mode = TARGET_BMI ? CCCmode : CCZmode; + operands[2] = gen_reg_rtx (<MODE>mode); + operands[3] = gen_rtx_REG (flags_mode, FLAGS_REG); + operands[4] = gen_rtx_COMPARE (flags_mode, operands[1], const0_rtx); }) (define_insn_and_split "ffssi2_no_cmove" @@ -12162,11 +12167,10 @@ "!TARGET_CMOVE" "#" "&& reload_completed" - [(parallel [(set (reg:CCZ FLAGS_REG) - (compare:CCZ (match_dup 1) (const_int 0))) + [(parallel [(set (match_dup 4) (match_dup 5)) (set (match_dup 0) (ctz:SI (match_dup 1)))]) (set (strict_low_part (match_dup 3)) - (eq:QI (reg:CCZ FLAGS_REG) (const_int 0))) + (eq:QI (match_dup 4) (const_int 0))) (parallel [(set (match_dup 2) (neg:SI (match_dup 2))) (clobber (reg:CC FLAGS_REG))]) (parallel [(set (match_dup 0) (ior:SI (match_dup 0) (match_dup 2))) @@ -12174,37 +12178,38 @@ (parallel [(set (match_dup 0) (plus:SI (match_dup 0) (const_int 1))) (clobber (reg:CC FLAGS_REG))])] { + enum machine_mode flags_mode = TARGET_BMI ? CCCmode : CCZmode; + operands[3] = gen_lowpart (QImode, operands[2]); + operands[4] = gen_rtx_REG (flags_mode, FLAGS_REG); + operands[5] = gen_rtx_COMPARE (flags_mode, operands[1], const0_rtx); + ix86_expand_clear (operands[2]); }) -(define_insn "*ffs<mode>_1" +(define_insn "*tzcnt<mode>_1" + [(set (reg:CCC FLAGS_REG) + (compare:CCC (match_operand:SWI48 1 "nonimmediate_operand" "rm") + (const_int 0))) + (set (match_operand:SWI48 0 "register_operand" "=r") + (ctz:SWI48 (match_dup 1)))] + "TARGET_BMI" + "tzcnt{<imodesuffix>}\t{%1, %0|%0, %1}" + [(set_attr "type" "alu1") + (set_attr "prefix_0f" "1") + (set_attr "prefix_rep" "1") + (set_attr "mode" "<MODE>")]) + +(define_insn "*bsf<mode>_1" [(set (reg:CCZ FLAGS_REG) (compare:CCZ (match_operand:SWI48 1 "nonimmediate_operand" "rm") (const_int 0))) (set (match_operand:SWI48 0 "register_operand" "=r") (ctz:SWI48 (match_dup 1)))] "" -{ - if (TARGET_BMI) - return "tzcnt{<imodesuffix>}\t{%1, %0|%0, %1}"; - else if (optimize_function_for_size_p (cfun)) - ; - else if (TARGET_GENERIC) - /* tzcnt expands to rep;bsf and we can use it even if !TARGET_BMI. */ - return "rep; bsf{<imodesuffix>}\t{%1, %0|%0, %1}"; - - return "bsf{<imodesuffix>}\t{%1, %0|%0, %1}"; -} + "bsf{<imodesuffix>}\t{%1, %0|%0, %1}" [(set_attr "type" "alu1") (set_attr "prefix_0f" "1") - (set (attr "prefix_rep") - (if_then_else - (ior (match_test "TARGET_BMI") - (and (not (match_test "optimize_function_for_size_p (cfun)")) - (match_test "TARGET_GENERIC"))) - (const_string "1") - (const_string "0"))) (set_attr "mode" "<MODE>")]) (define_insn "ctz<mode>2" |