aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2012-05-07 01:07:38 +0200
committerUros Bizjak <uros@gcc.gnu.org>2012-05-07 01:07:38 +0200
commit19010925aa245590393652fdc72df893ee6245e5 (patch)
treed0d1e86845c6acfe590e0fb217cd68dde6d90e4f
parent0345d1dd2aa75e7af92059cb6bb4a0c0e0570d0b (diff)
downloadgcc-19010925aa245590393652fdc72df893ee6245e5.zip
gcc-19010925aa245590393652fdc72df893ee6245e5.tar.gz
gcc-19010925aa245590393652fdc72df893ee6245e5.tar.bz2
i386.md (ctz<mode>2): Emit rep;bsf even for !TARGET_BMI.
* config/i386/i386.md (ctz<mode>2): Emit rep;bsf even for !TARGET_BMI. Emit bsf when optimizing for size. (*ffs<mode>_1): Ditto. Co-Authored-By: Paolo Bonzini <bonzini@gnu.org> From-SVN: r187219
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/i386/i386.md30
2 files changed, 32 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index aa909e3..bba151a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2012-05-07 Uros Bizjak <ubizjak@gmail.com>
+ Paolo Bonzini <bonzini@gnu.org>
+
+ * config/i386/i386.md (ctz<mode>2): Emit rep;bsf even for !TARGET_BMI.
+ Emit bsf when optimizing for size.
+ (*ffs<mode>_1): Ditto.
+
2012-05-07 Oleg Endo <olegendo@gcc.gnu.org>
PR target/53250
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 360bd32..b78054f 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -12112,9 +12112,22 @@
(set (match_operand:SWI48 0 "register_operand" "=r")
(ctz:SWI48 (match_dup 1)))]
""
- "bsf{<imodesuffix>}\t{%1, %0|%0, %1}"
+{
+ if (optimize_function_for_size_p (cfun))
+ return "bsf{<imodesuffix>}\t{%1, %0|%0, %1}";
+ else if (TARGET_BMI)
+ return "tzcnt{<imodesuffix>}\t{%1, %0|%0, %1}";
+ else
+ /* tzcnt expands to rep;bsf and we can use it even if !TARGET_BMI. */
+ return "rep; bsf{<imodesuffix>}\t{%1, %0|%0, %1}";
+}
[(set_attr "type" "alu1")
(set_attr "prefix_0f" "1")
+ (set (attr "prefix_rep")
+ (if_then_else
+ (match_test "optimize_function_for_size_p (cfun)")
+ (const_string "0")
+ (const_string "1")))
(set_attr "mode" "<MODE>")])
(define_insn "ctz<mode>2"
@@ -12123,14 +12136,21 @@
(clobber (reg:CC FLAGS_REG))]
""
{
- if (TARGET_BMI)
- return "tzcnt{<imodesuffix>}\t{%1, %0|%0, %1}";
- else
+ if (optimize_function_for_size_p (cfun))
return "bsf{<imodesuffix>}\t{%1, %0|%0, %1}";
+ else if (TARGET_BMI)
+ return "tzcnt{<imodesuffix>}\t{%1, %0|%0, %1}";
+ else
+ /* tzcnt expands to rep;bsf and we can use it even if !TARGET_BMI. */
+ return "rep; bsf{<imodesuffix>}\t{%1, %0|%0, %1}";
}
[(set_attr "type" "alu1")
(set_attr "prefix_0f" "1")
- (set (attr "prefix_rep") (symbol_ref "TARGET_BMI"))
+ (set (attr "prefix_rep")
+ (if_then_else
+ (match_test "optimize_function_for_size_p (cfun)")
+ (const_string "0")
+ (const_string "1")))
(set_attr "mode" "<MODE>")])
(define_expand "clz<mode>2"