On Mon, May 7, 2012 at 7:43 AM, Jakub Jelinek <[email protected]> wrote:
>> Index: i386.md
>> ===================================================================
>> --- i386.md (revision 187217)
>> +++ i386.md (working copy)
>> @@ -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}";
>> +}
>
> Shouldn't that be done only for generic tuning? If somebody uses
> -mtune=native, then emitting rep; bsf is overkill, the code is intended
> to be run on a CPU without (or with TARGET_BMI with) tzcnt insn support.
Yes, this is a good idea.
Something like attached patch?
Thanks,
Uros.
Index: i386.md
===================================================================
--- i386.md (revision 187223)
+++ i386.md (working copy)
@@ -12114,18 +12114,22 @@
""
{
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
+ 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)")
+ (and (match_test "optimize_function_for_size_p (cfun)")
+ (not (ior (match_test "TARGET_BMI")
+ (match_test "TARGET_GENERIC"))))
(const_string "0")
(const_string "1")))
(set_attr "mode" "<MODE>")])
@@ -12137,18 +12141,22 @@
""
{
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
+ 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)")
+ (and (match_test "optimize_function_for_size_p (cfun)")
+ (not (ior (match_test "TARGET_BMI")
+ (match_test "TARGET_GENERIC"))))
(const_string "0")
(const_string "1")))
(set_attr "mode" "<MODE>")])