2014-11-10 Thomas Preud'homme <thomas.preudhomme@arm.com>
authorthopre01 <thopre01@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 10 Nov 2014 17:18:23 +0000 (17:18 +0000)
committerthopre01 <thopre01@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 10 Nov 2014 17:18:23 +0000 (17:18 +0000)
    * expmed.c (expand_shift_1): Expand 8 bit rotate of 16 bit value to
    bswaphi if available.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@217302 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/expmed.c

index c170e69..4b70b62 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 af14b99..b099dc2 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;