[ARM] PR target/79145 Fix xordi3 expander for immediate operands in iWMMXt

PR target/79145
	* config/arm/arm.md (xordi3): Force constant operand into a register
	for TARGET_IWMMXT.

	* gcc.target/arm/pr79145.c: New test.

From-SVN: r244894
This commit is contained in:
Kyrylo Tkachov 2017-01-25 11:10:30 +00:00 committed by Kyrylo Tkachov
parent a5a2202779
commit 9aa483a2d8
4 changed files with 35 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2016-01-25 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
PR target/79145
* config/arm/arm.md (xordi3): Force constant operand into a register
for TARGET_IWMMXT.
2016-01-25 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* doc/invoke.texi (-fstore-merging): Correct default optimization

View File

@ -3313,7 +3313,14 @@
(xor:DI (match_operand:DI 1 "s_register_operand" "")
(match_operand:DI 2 "arm_xordi_operand" "")))]
"TARGET_32BIT"
""
{
/* The iWMMXt pattern for xordi3 accepts only register operands but we want
to reuse this expander for all TARGET_32BIT targets so just force the
constants into a register. Unlike for the anddi3 and iordi3 there are
no NEON instructions that take an immediate. */
if (TARGET_IWMMXT && !REG_P (operands[2]))
operands[2] = force_reg (DImode, operands[2]);
}
)
(define_insn_and_split "*xordi3_insn"

View File

@ -1,3 +1,8 @@
2016-01-25 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
PR target/79145
* gcc.target/arm/pr79145.c: New test.
2017-01-25 Richard Biener <rguenther@suse.de>
PR debug/78363

View File

@ -0,0 +1,16 @@
/* { dg-do compile } */
/* { dg-skip-if "Test is specific to the iWMMXt" { arm*-*-* } { "-mcpu=*" } { "-mcpu=iwmmxt" } } */
/* { dg-skip-if "Test is specific to the iWMMXt" { arm*-*-* } { "-mabi=*" } { "-mabi=iwmmxt" } } */
/* { dg-skip-if "Test is specific to the iWMMXt" { arm*-*-* } { "-march=*" } { "-march=iwmmxt" } } */
/* { dg-skip-if "Test is specific to ARM mode" { arm*-*-* } { "-mthumb" } { "" } } */
/* { dg-require-effective-target arm32 } */
/* { dg-require-effective-target arm_iwmmxt_ok } */
/* { dg-options "-mcpu=iwmmxt" } */
int
main (void)
{
volatile long long t1;
t1 ^= 0x55;
return 0;
}