expmed.c (expand_shift_1): Expand 8 bit rotate of 16 bit value to bswaphi if available.
authorThomas Preud'homme <thomas.preudhomme@arm.com>
Mon, 10 Nov 2014 17:18:23 +0000 (17:18 +0000)
committerThomas Preud'homme <thopre01@gcc.gnu.org>
Mon, 10 Nov 2014 17:18:23 +0000 (17:18 +0000)
2014-11-10  Thomas Preud'homme  <thomas.preudhomme@arm.com>

    * expmed.c (expand_shift_1): Expand 8 bit rotate of 16 bit value to
    bswaphi if available.

From-SVN: r217302

gcc/ChangeLog
gcc/expmed.c

index c170e69f25177cbaef85defb1d92f1bba83c3ee8..4b70b6208691545d9970a3faad630f9b6cda02d2 100644 (file)
@@ -1,3 +1,8 @@
+2014-11-10  Thomas Preud'homme  <thomas.preudhomme@arm.com>
+
+       * expmed.c (expand_shift_1): Expand 8 bit rotate of 16 bit value to
+       bswaphi if available.
+
 2014-11-10  Bernd Schmidt  <bernds@codesourcery.com>
 
        * config/nvptx/nvptx.c: New file.
index af14b990794fb8c61aa4cbdc6d1742cc8cfe6e16..b099dc2555dd19221e29d7f71eab320f920246c3 100644 (file)
@@ -2164,6 +2164,18 @@ expand_shift_1 (enum tree_code code, machine_mode mode, rtx shifted,
       code = left ? LROTATE_EXPR : RROTATE_EXPR;
     }
 
+  /* Rotation of 16bit values by 8 bits is effectively equivalent to a bswaphi.
+     Note that this is not the case for bigger values.  For instance a rotation
+     of 0x01020304 by 16 bits gives 0x03040102 which is different from
+     0x04030201 (bswapsi).  */
+  if (rotate
+      && CONST_INT_P (op1)
+      && INTVAL (op1) == BITS_PER_UNIT
+      && GET_MODE_SIZE (scalar_mode) == 2
+      && optab_handler (bswap_optab, HImode) != CODE_FOR_nothing)
+    return expand_unop (HImode, bswap_optab, shifted, NULL_RTX,
+                                 unsignedp);
+
   if (op1 == const0_rtx)
     return shifted;