MSP430: Emulate 16-bit shifts with rotate insn when src operand is in memory

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
This commit is contained in:
Jozef Lawrynowicz 2019-06-06 09:23:10 +00:00 committed by Jozef Lawrynowicz
parent d1b2f85f78
commit e445e4b4fe
6 changed files with 68 additions and 6 deletions

View 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

View File

@ -756,8 +756,9 @@
(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])
@ -828,8 +829,9 @@
(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])
@ -916,8 +918,9 @@
(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])

View 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

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}