diff options
author | Uros Bizjak <ubizjak@gmail.com> | 2012-05-07 01:07:38 +0200 |
---|---|---|
committer | Uros Bizjak <uros@gcc.gnu.org> | 2012-05-07 01:07:38 +0200 |
commit | 19010925aa245590393652fdc72df893ee6245e5 (patch) | |
tree | d0d1e86845c6acfe590e0fb217cd68dde6d90e4f | |
parent | 0345d1dd2aa75e7af92059cb6bb4a0c0e0570d0b (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/i386/i386.md | 30 |
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" |