+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
(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])
+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
--- /dev/null
+/* { 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;
+}
--- /dev/null
+/* { 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;
+}
--- /dev/null
+/* { 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;
+}