neon.md (neon_vget_lanev2di): Handle big-endian targets.

2015-08-04  Christophe Lyon  <christophe.lyon@linaro.org>

	* config/arm/neon.md (neon_vget_lanev2di): Handle big-endian
	targets.

From-SVN: r226574
This commit is contained in:
Christophe Lyon 2015-08-04 13:24:26 +00:00 committed by Christophe Lyon
parent c56df3e924
commit 69b23ad67f
2 changed files with 21 additions and 1 deletions

View File

@ -1,3 +1,8 @@
2015-08-04 Christophe Lyon <christophe.lyon@linaro.org>
* config/arm/neon.md (neon_vget_lanev2di): Handle big-endian
targets.
2015-08-04 Nathan Sidwell <nathan@codesourcery.com>
* config/nvptx/nvptx.h (struct nvptx_pseudo_info): Delete.

View File

@ -2731,7 +2731,22 @@
(match_operand:SI 2 "immediate_operand" "")]
"TARGET_NEON"
{
int lane = INTVAL (operands[2]);
int lane;
if (BYTES_BIG_ENDIAN)
{
/* The intrinsics are defined in terms of a model where the
element ordering in memory is vldm order, whereas the generic
RTL is defined in terms of a model where the element ordering
in memory is array order. Convert the lane number to conform
to this model. */
unsigned int elt = INTVAL (operands[2]);
unsigned int reg_nelts = 2;
elt ^= reg_nelts - 1;
operands[2] = GEN_INT (elt);
}
lane = INTVAL (operands[2]);
gcc_assert ((lane ==0) || (lane == 1));
emit_move_insn (operands[0], lane == 0
? gen_lowpart (DImode, operands[1])