Commit 6f93c008 by Jakub Jelinek Committed by Jakub Jelinek

i386.md (rotateinv): New code attr.

	* config/i386/i386.md (rotateinv): New code attr.
	(*<rotate_insn><mode>3_1, *<rotate_insn>si3_1_zext,
	*<rotate_insn>qi3_1_slp): Emit rorl %eax instead of
	roll $31, %eax, etc.

	* gcc.target/i386/rotate-1.c: Accept rolb or rorb instruction.

From-SVN: r198770
parent cb3b8d33
2013-05-10 Jakub Jelinek <jakub@redhat.com> 2013-05-10 Jakub Jelinek <jakub@redhat.com>
* config/i386/i386.md (rotateinv): New code attr.
(*<rotate_insn><mode>3_1, *<rotate_insn>si3_1_zext,
*<rotate_insn>qi3_1_slp): Emit rorl %eax instead of
roll $31, %eax, etc.
PR tree-optimization/45216 PR tree-optimization/45216
PR tree-optimization/57157 PR tree-optimization/57157
* tree-ssa-forwprop.c (simplify_rotate): New function. * tree-ssa-forwprop.c (simplify_rotate): New function.
......
...@@ -761,6 +761,9 @@ ...@@ -761,6 +761,9 @@
;; Base name for insn mnemonic. ;; Base name for insn mnemonic.
(define_code_attr rotate [(rotate "rol") (rotatert "ror")]) (define_code_attr rotate [(rotate "rol") (rotatert "ror")])
;; Base name for insn mnemonic of rotation in the other direction.
(define_code_attr rotateinv [(rotate "ror") (rotatert "rol")])
;; Mapping of abs neg operators ;; Mapping of abs neg operators
(define_code_iterator absneg [abs neg]) (define_code_iterator absneg [abs neg])
...@@ -9736,11 +9739,15 @@ ...@@ -9736,11 +9739,15 @@
return "#"; return "#";
default: default:
if (operands[2] == const1_rtx if (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
&& (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))) {
return "<rotate>{<imodesuffix>}\t%0"; if (operands[2] == const1_rtx)
else return "<rotate>{<imodesuffix>}\t%0";
return "<rotate>{<imodesuffix>}\t{%2, %0|%0, %2}"; if (CONST_INT_P (operands[2])
&& INTVAL (operands[2]) == GET_MODE_BITSIZE (<MODE>mode) - 1)
return "<rotateinv>{<imodesuffix>}\t%0";
}
return "<rotate>{<imodesuffix>}\t{%2, %0|%0, %2}";
} }
} }
[(set_attr "isa" "*,bmi2") [(set_attr "isa" "*,bmi2")
...@@ -9802,11 +9809,14 @@ ...@@ -9802,11 +9809,14 @@
return "#"; return "#";
default: default:
if (operands[2] == const1_rtx if (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
&& (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))) {
return "<rotate>{l}\t%k0"; if (operands[2] == const1_rtx)
else return "<rotate>{l}\t%k0";
return "<rotate>{l}\t{%2, %k0|%k0, %2}"; if (CONST_INT_P (operands[2]) && INTVAL (operands[2]) == 31)
return "<rotateinv>{l}\t%k0";
}
return "<rotate>{l}\t{%2, %k0|%k0, %2}";
} }
} }
[(set_attr "isa" "*,bmi2") [(set_attr "isa" "*,bmi2")
...@@ -9853,11 +9863,15 @@ ...@@ -9853,11 +9863,15 @@
(clobber (reg:CC FLAGS_REG))] (clobber (reg:CC FLAGS_REG))]
"ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)" "ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
{ {
if (operands[2] == const1_rtx if (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
&& (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))) {
return "<rotate>{<imodesuffix>}\t%0"; if (operands[2] == const1_rtx)
else return "<rotate>{<imodesuffix>}\t%0";
return "<rotate>{<imodesuffix>}\t{%2, %0|%0, %2}"; if (CONST_INT_P (operands[2])
&& INTVAL (operands[2]) == GET_MODE_BITSIZE (<MODE>mode) - 1)
return "<rotateinv>{<imodesuffix>}\t%0";
}
return "<rotate>{<imodesuffix>}\t{%2, %0|%0, %2}";
} }
[(set_attr "type" "rotate") [(set_attr "type" "rotate")
(set (attr "length_immediate") (set (attr "length_immediate")
...@@ -9879,11 +9893,14 @@ ...@@ -9879,11 +9893,14 @@
|| (operands[1] == const1_rtx || (operands[1] == const1_rtx
&& TARGET_SHIFT1))" && TARGET_SHIFT1))"
{ {
if (operands[1] == const1_rtx if (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
&& (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))) {
return "<rotate>{b}\t%0"; if (operands[2] == const1_rtx)
else return "<rotate>{b}\t%0";
return "<rotate>{b}\t{%1, %0|%0, %1}"; if (CONST_INT_P (operands[2]) && INTVAL (operands[2]) == 7)
return "<rotateinv>{b}\t%0";
}
return "<rotate>{b}\t{%1, %0|%0, %1}";
} }
[(set_attr "type" "rotate1") [(set_attr "type" "rotate1")
(set (attr "length_immediate") (set (attr "length_immediate")
......
2013-05-10 Jakub Jelinek <jakub@redhat.com> 2013-05-10 Jakub Jelinek <jakub@redhat.com>
* gcc.target/i386/rotate-1.c: Accept rolb or rorb instruction.
PR tree-optimization/45216 PR tree-optimization/45216
PR tree-optimization/57157 PR tree-optimization/57157
* c-c++-common/rotate-1.c: New test. * c-c++-common/rotate-1.c: New test.
......
...@@ -13,4 +13,4 @@ main (void) ...@@ -13,4 +13,4 @@ main (void)
return c; return c;
} }
/* { dg-final { scan-assembler "rolb" } } */ /* { dg-final { scan-assembler "ro\[lr]b" } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment