aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2012-05-07 16:38:41 +0200
committerUros Bizjak <uros@gcc.gnu.org>2012-05-07 16:38:41 +0200
commit60197adbfd6b91e997c61ead24e925f65be3fcbe (patch)
tree9f4d2b1fae8ac80107e6f294c1bfa990fafb1bb0
parent198fc9f199b905c51873bf17a0a3f05afe11c2c5 (diff)
downloadgcc-60197adbfd6b91e997c61ead24e925f65be3fcbe.zip
gcc-60197adbfd6b91e997c61ead24e925f65be3fcbe.tar.gz
gcc-60197adbfd6b91e997c61ead24e925f65be3fcbe.tar.bz2
i386.md (ctz<mode>2): Emit rep;bsf only for TARGET_GENERIC, when not optimizing for size.
* config/i386/i386.md (ctz<mode>2): Emit rep;bsf only for TARGET_GENERIC, when not optimizing for size. (*ffs<mode>_1): Ditto. From-SVN: r187247
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/i386/i386.md36
2 files changed, 28 insertions, 14 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 47ede16..133719b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2012-05-07 Uros Bizjak <ubizjak@gmail.com>
+
+ * config/i386/i386.md (ctz<mode>2): Emit rep;bsf
+ only for TARGET_GENERIC, when not optimizing for size.
+ (*ffs<mode>_1): Ditto.
+
2012-05-07 Steven Bosscher <steven@gcc.gnu.org>
* tree-cfg.c (verify_gimple_switch): Tighten checks.
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index b78054f..80f1ec4 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -12113,21 +12113,25 @@
(ctz:SWI48 (match_dup 1)))]
""
{
- if (optimize_function_for_size_p (cfun))
- return "bsf{<imodesuffix>}\t{%1, %0|%0, %1}";
- else if (TARGET_BMI)
+ if (TARGET_BMI)
return "tzcnt{<imodesuffix>}\t{%1, %0|%0, %1}";
- else
+ 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}";
}
[(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")))
+ (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"
@@ -12136,21 +12140,25 @@
(clobber (reg:CC FLAGS_REG))]
""
{
- if (optimize_function_for_size_p (cfun))
- return "bsf{<imodesuffix>}\t{%1, %0|%0, %1}";
- else if (TARGET_BMI)
+ if (TARGET_BMI)
return "tzcnt{<imodesuffix>}\t{%1, %0|%0, %1}";
- else
+ 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}";
}
[(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")))
+ (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_expand "clz<mode>2"