MSP430: Emulate 16-bit shifts with rotate insn when src operand is in memory
authorJozef Lawrynowicz <jozef.l@mittosystems.com>
Thu, 6 Jun 2019 09:23:10 +0000 (09:23 +0000)
committerJozef Lawrynowicz <jozefl@gcc.gnu.org>
Thu, 6 Jun 2019 09:23:10 +0000 (09:23 +0000)
gcc/ChangeLog

2019-06-06  Jozef Lawrynowicz  <jozef.l@mittosystems.com>

* config/msp430/msp430.md (ashlhi3): Force shift src operand into a
register if it is in memory, so the shift can be emulated with a rotate
instruction.
(ashrhi3): Likewise.
(lshrhi3): Likewise.

gcc/testsuite/ChangeLog

2019-06-06  Jozef Lawrynowicz  <jozef.l@mittosystems.com>

* gcc.target/msp430/emulate-slli.c: New test.
* gcc.target/msp430/emulate-srai.c: New test.
* gcc.target/msp430/emulate-srli.c: New test.

From-SVN: r271993

gcc/ChangeLog
gcc/config/msp430/msp430.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/msp430/emulate-slli.c [new file with mode: 0644]
gcc/testsuite/gcc.target/msp430/emulate-srai.c [new file with mode: 0644]
gcc/testsuite/gcc.target/msp430/emulate-srli.c [new file with mode: 0644]

index e6dd35a8eaae2b86c3e23528a939dd642b29e468..7ddc942bd7a32e6ed855fcf34524196d3a3798be 100644 (file)
@@ -1,3 +1,11 @@
+2019-06-06  Jozef Lawrynowicz  <jozef.l@mittosystems.com>
+
+       * config/msp430/msp430.md (ashlhi3): Force shift src operand into a
+       register if it is in memory, so the shift can be emulated with a rotate
+       instruction.
+       (ashrhi3): Likewise.
+       (lshrhi3): Likewise.
+
 2019-06-06  Martin Liska  <mliska@suse.cz>
 
        PR tree-optimization/87954
index 344d21d9378b0b8c94a2a3caadeaf4afb79443a9..58c1f4edc9cf149ab9bf31c464994d24bba63ad1 100644 (file)
                   (match_operand:HI 2 "general_operand")))]
   ""
   {
-    if (GET_CODE (operands[1]) == SUBREG
-        && REG_P (XEXP (operands[1], 0)))
+    if ((GET_CODE (operands[1]) == SUBREG
+        && REG_P (XEXP (operands[1], 0)))
+       || MEM_P (operands[1]))
       operands[1] = force_reg (HImode, operands[1]);
     if (msp430x
         && REG_P (operands[0])
                     (match_operand:HI 2 "general_operand")))]
   ""
   {
-    if (GET_CODE (operands[1]) == SUBREG
-        && REG_P (XEXP (operands[1], 0)))
+    if ((GET_CODE (operands[1]) == SUBREG
+        && REG_P (XEXP (operands[1], 0)))
+       || MEM_P (operands[1]))
       operands[1] = force_reg (HImode, operands[1]);
     if (msp430x
         && REG_P (operands[0])
                     (match_operand:HI 2 "general_operand")))]
   ""
   {
-    if (GET_CODE (operands[1]) == SUBREG
-        && REG_P (XEXP (operands[1], 0)))
+    if ((GET_CODE (operands[1]) == SUBREG
+        && REG_P (XEXP (operands[1], 0)))
+       || MEM_P (operands[1]))
       operands[1] = force_reg (HImode, operands[1]);
     if (msp430x
         && REG_P (operands[0])
index 4bc2c2906672c40bd583161375fd8f19369b9663..c08d228b613cccd9a61b9b496a38dbb777138c2d 100644 (file)
@@ -1,3 +1,9 @@
+2019-06-06  Jozef Lawrynowicz  <jozef.l@mittosystems.com>
+
+       * gcc.target/msp430/emulate-slli.c: New test.
+       * gcc.target/msp430/emulate-srai.c: New test.
+       * gcc.target/msp430/emulate-srli.c: New test.
+
 2019-06-06  Martin Liska  <mliska@suse.cz>
 
        PR tree-optimization/87954
diff --git a/gcc/testsuite/gcc.target/msp430/emulate-slli.c b/gcc/testsuite/gcc.target/msp430/emulate-slli.c
new file mode 100644 (file)
index 0000000..0ed09d5
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-Os" } */
+/* { dg-final { scan-assembler-not "mspabi_slli" } } */
+/* { dg-final { scan-assembler "rlax" } } */
+
+/* Ensure that HImode shifts with source operand in memory are emulated with a
+   rotate instructions.  */
+
+int a;
+
+void
+foo (void)
+{
+  a = a << 4;
+}
diff --git a/gcc/testsuite/gcc.target/msp430/emulate-srai.c b/gcc/testsuite/gcc.target/msp430/emulate-srai.c
new file mode 100644 (file)
index 0000000..6629171
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-Os" } */
+/* { dg-final { scan-assembler-not "mspabi_srai" } } */
+/* { dg-final { scan-assembler "rrax" } } */
+
+/* Ensure that HImode shifts with source operand in memory are emulated with a
+   rotate instructions.  */
+
+int a;
+
+void
+foo (void)
+{
+  a = a >> 4;
+}
diff --git a/gcc/testsuite/gcc.target/msp430/emulate-srli.c b/gcc/testsuite/gcc.target/msp430/emulate-srli.c
new file mode 100644 (file)
index 0000000..c10f30b
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-Os" } */
+/* { dg-final { scan-assembler-not "mspabi_srli" } } */
+/* { dg-final { scan-assembler "rrum" } } */
+
+/* Ensure that HImode shifts with source operand in memory are emulated with a
+   rotate instructions.  */
+
+unsigned int a;
+
+void
+foo (void)
+{
+  a = a >> 4;
+}