PR target/53399
authoruros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 21 May 2012 15:46:25 +0000 (15:46 +0000)
committeruros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 21 May 2012 15:46:25 +0000 (15:46 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@187722 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/i386/i386.md

index 7702970..dc7b1cd 100644 (file)
@@ -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>
        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>
 
 
 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>
 
 
        * 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
 
 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.
 
 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.
 
 
 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>
 
 
 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>
 
        * 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.
 
index 8326ceb..a2e6a52 100644 (file)
 
 (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"
   "!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)))
    (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"