From: Jakub Jelinek Date: Fri, 10 May 2013 08:41:17 +0000 (+0200) Subject: i386.md (rotateinv): New code attr. X-Git-Tag: releases/gcc-4.9.0~5959 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6f93c0089265867666bcf71a659df21a63e0572e;p=thirdparty%2Fgcc.git i386.md (rotateinv): New code attr. * config/i386/i386.md (rotateinv): New code attr. (*3_1, *si3_1_zext, *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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 82b35a1e601f..6739b0d924ae 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2013-05-10 Jakub Jelinek + * config/i386/i386.md (rotateinv): New code attr. + (*3_1, *si3_1_zext, + *qi3_1_slp): Emit rorl %eax instead of + roll $31, %eax, etc. + PR tree-optimization/45216 PR tree-optimization/57157 * tree-ssa-forwprop.c (simplify_rotate): New function. diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index dea5d513e84d..d9179cef9753 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -761,6 +761,9 @@ ;; Base name for insn mnemonic. (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 (define_code_iterator absneg [abs neg]) @@ -9736,11 +9739,15 @@ return "#"; default: - if (operands[2] == const1_rtx - && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))) - return "{}\t%0"; - else - return "{}\t{%2, %0|%0, %2}"; + if (TARGET_SHIFT1 || optimize_function_for_size_p (cfun)) + { + if (operands[2] == const1_rtx) + return "{}\t%0"; + if (CONST_INT_P (operands[2]) + && INTVAL (operands[2]) == GET_MODE_BITSIZE (mode) - 1) + return "{}\t%0"; + } + return "{}\t{%2, %0|%0, %2}"; } } [(set_attr "isa" "*,bmi2") @@ -9802,11 +9809,14 @@ return "#"; default: - if (operands[2] == const1_rtx - && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))) - return "{l}\t%k0"; - else - return "{l}\t{%2, %k0|%k0, %2}"; + if (TARGET_SHIFT1 || optimize_function_for_size_p (cfun)) + { + if (operands[2] == const1_rtx) + return "{l}\t%k0"; + if (CONST_INT_P (operands[2]) && INTVAL (operands[2]) == 31) + return "{l}\t%k0"; + } + return "{l}\t{%2, %k0|%k0, %2}"; } } [(set_attr "isa" "*,bmi2") @@ -9853,11 +9863,15 @@ (clobber (reg:CC FLAGS_REG))] "ix86_binary_operator_ok (, mode, operands)" { - if (operands[2] == const1_rtx - && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))) - return "{}\t%0"; - else - return "{}\t{%2, %0|%0, %2}"; + if (TARGET_SHIFT1 || optimize_function_for_size_p (cfun)) + { + if (operands[2] == const1_rtx) + return "{}\t%0"; + if (CONST_INT_P (operands[2]) + && INTVAL (operands[2]) == GET_MODE_BITSIZE (mode) - 1) + return "{}\t%0"; + } + return "{}\t{%2, %0|%0, %2}"; } [(set_attr "type" "rotate") (set (attr "length_immediate") @@ -9879,11 +9893,14 @@ || (operands[1] == const1_rtx && TARGET_SHIFT1))" { - if (operands[1] == const1_rtx - && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))) - return "{b}\t%0"; - else - return "{b}\t{%1, %0|%0, %1}"; + if (TARGET_SHIFT1 || optimize_function_for_size_p (cfun)) + { + if (operands[2] == const1_rtx) + return "{b}\t%0"; + if (CONST_INT_P (operands[2]) && INTVAL (operands[2]) == 7) + return "{b}\t%0"; + } + return "{b}\t{%1, %0|%0, %1}"; } [(set_attr "type" "rotate1") (set (attr "length_immediate") diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 19e0a5b54011..7f2994135f4f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,7 @@ 2013-05-10 Jakub Jelinek + * gcc.target/i386/rotate-1.c: Accept rolb or rorb instruction. + PR tree-optimization/45216 PR tree-optimization/57157 * c-c++-common/rotate-1.c: New test. diff --git a/gcc/testsuite/gcc.target/i386/rotate-1.c b/gcc/testsuite/gcc.target/i386/rotate-1.c index 23dc2ee670bf..399cbd96cd87 100644 --- a/gcc/testsuite/gcc.target/i386/rotate-1.c +++ b/gcc/testsuite/gcc.target/i386/rotate-1.c @@ -13,4 +13,4 @@ main (void) return c; } -/* { dg-final { scan-assembler "rolb" } } */ +/* { dg-final { scan-assembler "ro\[lr]b" } } */