From 19010925aa245590393652fdc72df893ee6245e5 Mon Sep 17 00:00:00 2001 From: Uros Bizjak Date: Mon, 7 May 2012 01:07:38 +0200 Subject: [PATCH] i386.md (ctz2): Emit rep;bsf even for !TARGET_BMI. * config/i386/i386.md (ctz2): Emit rep;bsf even for !TARGET_BMI. Emit bsf when optimizing for size. (*ffs_1): Ditto. Co-Authored-By: Paolo Bonzini From-SVN: r187219 --- gcc/ChangeLog | 7 +++++++ gcc/config/i386/i386.md | 30 +++++++++++++++++++++++++----- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index aa909e35208..bba151a7f77 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2012-05-07 Uros Bizjak + Paolo Bonzini + + * config/i386/i386.md (ctz2): Emit rep;bsf even for !TARGET_BMI. + Emit bsf when optimizing for size. + (*ffs_1): Ditto. + 2012-05-07 Oleg Endo PR target/53250 diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 360bd32b9ab..b78054fd549 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{}\t{%1, %0|%0, %1}" +{ + if (optimize_function_for_size_p (cfun)) + return "bsf{}\t{%1, %0|%0, %1}"; + else if (TARGET_BMI) + return "tzcnt{}\t{%1, %0|%0, %1}"; + else + /* tzcnt expands to rep;bsf and we can use it even if !TARGET_BMI. */ + return "rep; bsf{}\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" "")]) (define_insn "ctz2" @@ -12123,14 +12136,21 @@ (clobber (reg:CC FLAGS_REG))] "" { - if (TARGET_BMI) - return "tzcnt{}\t{%1, %0|%0, %1}"; - else + if (optimize_function_for_size_p (cfun)) return "bsf{}\t{%1, %0|%0, %1}"; + else if (TARGET_BMI) + return "tzcnt{}\t{%1, %0|%0, %1}"; + else + /* tzcnt expands to rep;bsf and we can use it even if !TARGET_BMI. */ + return "rep; bsf{}\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" "")]) (define_expand "clz2" -- 2.30.2