On 13/10/11 00:21, Janis Johnson wrote:
> Tests gcc.target/arm/pr48252.c and gcc.target/arm/neon-vset_lanes8.c
> expect little-endian code and fail when compiled with -mbig-endian.
> This patch skips the test if the current multilib does not generate
> little-endian code.
>
> I'm not able to run execution tests for -mbig-endian for GCC mainline
> but have tested this patch with CodeSourcery's GCC 4.6. OK for trunk?
>
>
> gcc-20111012-003
>
>
> 2011-10-12 Janis Johnson <[email protected]>
>
> * gcc.target/arm/pr48252.c: Require arm_little_endian.
> * gcc.target/arm/neon-vset_lanes8.c: Likewise.
>
> Index: gcc/testsuite/gcc.target/arm/pr48252.c
> ===================================================================
> --- gcc/testsuite/gcc.target/arm/pr48252.c (revision 344214)
> +++ gcc/testsuite/gcc.target/arm/pr48252.c (working copy)
> @@ -1,5 +1,6 @@
> /* { dg-do run } */
> /* { dg-require-effective-target arm_neon_hw } */
> +/* { dg-require-effective-target arm_little_endian } */
> /* { dg-options "-O2" } */
> /* { dg-add-options arm_neon } */
>
I can't think of any obvious reason why this should fail in big-endian.
> Index: gcc/testsuite/gcc.target/arm/neon-vset_lanes8.c
> ===================================================================
> --- gcc/testsuite/gcc.target/arm/neon-vset_lanes8.c (revision 344214)
> +++ gcc/testsuite/gcc.target/arm/neon-vset_lanes8.c (working copy)
> @@ -2,6 +2,7 @@
>
> /* { dg-do run } */
> /* { dg-require-effective-target arm_neon_hw } */
> +/* { dg-require-effective-target arm_little_endian } */
> /* { dg-options "-O0" } */
> /* { dg-add-options arm_neon } */
>
I can see why this fails at present, the test is based on the assumption
that
int8x8_t x = {...}
puts the first element in lane 0 and subsequent elements in consecutive
lanes, *and* that this is equivalent to casting char[8] into a vector.
However, this isn't the case for big-endian.
There's two ways this could be sorted.
1) Change the testcase to:
#include "arm_neon.h"
#include <stdlib.h>
#include <string.h>
signed char x_init[8] = { 1, 2, 3, 4, 5, 6, 7, 8 };
signed char y_init[8] = { 1, 2, 3, 16, 5, 6, 7, 8 };
int main (void)
{
int8x8_t x = vld1_s8(x_init);
int8x8_t y = vld1_s8(y_init);
x = vset_lane_s8 (16, x, 3);
if (memcmp (&x, &y, sizeof (x)) != 0)
abort();
return 0;
}
2) Change the compiler to make initializers of vectors assign elements
of initializers to consecutive lanes in a vector, rather than the
current behaviour of 'casting' an array of elements to a vector.
While the second would be my preferred change, I suspect it's too hard
to fix, and may well cause code written for other targets to break on
big-endian (altivec for example).
R.