i386.md (rotateinv): New code attr.
authorJakub Jelinek <jakub@redhat.com>
Fri, 10 May 2013 08:41:17 +0000 (10:41 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 10 May 2013 08:41:17 +0000 (10:41 +0200)
* 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

gcc/ChangeLog
gcc/config/i386/i386.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/rotate-1.c

index 82b35a1..6739b0d 100644 (file)
@@ -1,5 +1,10 @@
 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/57157
        * tree-ssa-forwprop.c (simplify_rotate): New function.
index dea5d51..d9179ce 100644 (file)
 ;; 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])
 
       return "#";
 
     default:
-      if (operands[2] == const1_rtx
-         && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun)))
-       return "<rotate>{<imodesuffix>}\t%0";
-      else
-       return "<rotate>{<imodesuffix>}\t{%2, %0|%0, %2}";
+      if (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
+       {
+         if (operands[2] == const1_rtx)
+           return "<rotate>{<imodesuffix>}\t%0";
+         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")
       return "#";
 
     default:
-      if (operands[2] == const1_rtx
-         && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun)))
-       return "<rotate>{l}\t%k0";
-      else
-       return "<rotate>{l}\t{%2, %k0|%k0, %2}";
+      if (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
+       {
+         if (operands[2] == const1_rtx)
+           return "<rotate>{l}\t%k0";
+         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")
    (clobber (reg:CC FLAGS_REG))]
   "ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
 {
-  if (operands[2] == const1_rtx
-      && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun)))
-    return "<rotate>{<imodesuffix>}\t%0";
-  else
-    return "<rotate>{<imodesuffix>}\t{%2, %0|%0, %2}";
+  if (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
+    {
+      if (operands[2] == const1_rtx)
+       return "<rotate>{<imodesuffix>}\t%0";
+      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 "length_immediate")
     || (operands[1] == const1_rtx
        && TARGET_SHIFT1))"
 {
-  if (operands[1] == const1_rtx
-      && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun)))
-    return "<rotate>{b}\t%0";
-  else
-    return "<rotate>{b}\t{%1, %0|%0, %1}";
+  if (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
+    {
+      if (operands[2] == const1_rtx)
+       return "<rotate>{b}\t%0";
+      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 "length_immediate")
index 19e0a5b..7f29941 100644 (file)
@@ -1,5 +1,7 @@
 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/57157
        * c-c++-common/rotate-1.c: New test.
index 23dc2ee..399cbd9 100644 (file)
@@ -13,4 +13,4 @@ main (void)
   return c;
 }
 
-/* { dg-final { scan-assembler "rolb" } } */
+/* { dg-final { scan-assembler "ro\[lr]b" } } */