[PATCH][ARM] Fix broken NEON tests vget_low*.c
Doug Kwan (關振德)
dougkwan@google.com
Fri Jul 31 01:29:00 GMT 2009
[cc Julian, who checked in these tests]
This patch fixes a number of NEON tests with file names of the form
vget_low*.c. Every one of these checks for generation of a vmov
instruction in gcc's output. However, in neon.md:
(define_insn "neon_vget_low<mode>"
[(set (match_operand:<V_HALF> 0 "s_register_operand" "=w")
(unspec:<V_HALF> [(match_operand:VQX 1 "s_register_operand" "w")]
UNSPEC_VGET_LOW))]
"TARGET_NEON"
{
int dest = REGNO (operands[0]);
int src = REGNO (operands[1]);
if (dest != src)
return "vmov\t%P0, %e1";
else
return "";
}
[(set_attr "neon_type" "neon_bp_simple")]
)
If an RTL matching the above instrunction has the same register for
both input and output, a vmov instruction is not generated. That
casues failure of the tests. I verified that by removing the check
and always generating a vmov. All previously failing vget_low*.c
tests passed with that modification. Obviously, we do not want to
make gcc generating inefficient code just to make these tests pass.
To make these tests pass in this patch, I forced register allocation
of the output operands of the vget_low_* intrinsics. Unfortunately
this does not for the 64-bit cases and only 9 of the 11 tests got
fixed. The tests vget_lows64.c and vect_lowu64.c still fail. It
seems that these 11 tests have been failing since they were checked in
at rev 126911. If we cannot make the 64-bit tests working, may be we
should remove them to reduce noise in testing.
-Doug
2009-07-30 Doug Kwan <dougkwan@google.com>
* gcc.target/arm/neon/vget_lowp8.c: Change test to prevent vmov
instruction from being eliminated.
* gcc.target/arm/neon/vget_lowp16.c: Same.
* gcc.target/arm/neon/vget_lows8.c: Same.
* gcc.target/arm/neon/vget_lowu8.c: Same.
* gcc.target/arm/neon/vget_lows32.c: Same.
* gcc.target/arm/neon/vget_lows16.c: Same.
* gcc.target/arm/neon/vget_lowu32.c: Same.
* gcc.target/arm/neon/vget_lowu16.c: Same.
* gcc.target/arm/neon/vget_lowf32.c: Same.
-------------- next part --------------
Index: gcc/testsuite/gcc.target/arm/neon/vget_lowp8.c
===================================================================
--- gcc/testsuite/gcc.target/arm/neon/vget_lowp8.c (revision 150276)
+++ gcc/testsuite/gcc.target/arm/neon/vget_lowp8.c (working copy)
@@ -9,7 +9,7 @@
void test_vget_lowp8 (void)
{
- poly8x8_t out_poly8x8_t;
+ register poly8x8_t out_poly8x8_t asm ("d18");
poly8x16_t arg0_poly8x16_t;
out_poly8x8_t = vget_low_p8 (arg0_poly8x16_t);
Index: gcc/testsuite/gcc.target/arm/neon/vget_lowp16.c
===================================================================
--- gcc/testsuite/gcc.target/arm/neon/vget_lowp16.c (revision 150276)
+++ gcc/testsuite/gcc.target/arm/neon/vget_lowp16.c (working copy)
@@ -9,7 +9,7 @@
void test_vget_lowp16 (void)
{
- poly16x4_t out_poly16x4_t;
+ register poly16x4_t out_poly16x4_t asm ("d18");
poly16x8_t arg0_poly16x8_t;
out_poly16x4_t = vget_low_p16 (arg0_poly16x8_t);
Index: gcc/testsuite/gcc.target/arm/neon/vget_lows8.c
===================================================================
--- gcc/testsuite/gcc.target/arm/neon/vget_lows8.c (revision 150276)
+++ gcc/testsuite/gcc.target/arm/neon/vget_lows8.c (working copy)
@@ -9,7 +9,7 @@
void test_vget_lows8 (void)
{
- int8x8_t out_int8x8_t;
+ register int8x8_t out_int8x8_t asm ("d18");
int8x16_t arg0_int8x16_t;
out_int8x8_t = vget_low_s8 (arg0_int8x16_t);
Index: gcc/testsuite/gcc.target/arm/neon/vget_lowu8.c
===================================================================
--- gcc/testsuite/gcc.target/arm/neon/vget_lowu8.c (revision 150276)
+++ gcc/testsuite/gcc.target/arm/neon/vget_lowu8.c (working copy)
@@ -9,7 +9,7 @@
void test_vget_lowu8 (void)
{
- uint8x8_t out_uint8x8_t;
+ register uint8x8_t out_uint8x8_t asm ("d18");
uint8x16_t arg0_uint8x16_t;
out_uint8x8_t = vget_low_u8 (arg0_uint8x16_t);
Index: gcc/testsuite/gcc.target/arm/neon/vget_lows32.c
===================================================================
--- gcc/testsuite/gcc.target/arm/neon/vget_lows32.c (revision 150276)
+++ gcc/testsuite/gcc.target/arm/neon/vget_lows32.c (working copy)
@@ -9,7 +9,7 @@
void test_vget_lows32 (void)
{
- int32x2_t out_int32x2_t;
+ register int32x2_t out_int32x2_t asm ("d18");
int32x4_t arg0_int32x4_t;
out_int32x2_t = vget_low_s32 (arg0_int32x4_t);
Index: gcc/testsuite/gcc.target/arm/neon/vget_lows16.c
===================================================================
--- gcc/testsuite/gcc.target/arm/neon/vget_lows16.c (revision 150276)
+++ gcc/testsuite/gcc.target/arm/neon/vget_lows16.c (working copy)
@@ -9,7 +9,7 @@
void test_vget_lows16 (void)
{
- int16x4_t out_int16x4_t;
+ register int16x4_t out_int16x4_t asm ("d18");
int16x8_t arg0_int16x8_t;
out_int16x4_t = vget_low_s16 (arg0_int16x8_t);
Index: gcc/testsuite/gcc.target/arm/neon/vget_lowu32.c
===================================================================
--- gcc/testsuite/gcc.target/arm/neon/vget_lowu32.c (revision 150276)
+++ gcc/testsuite/gcc.target/arm/neon/vget_lowu32.c (working copy)
@@ -9,7 +9,7 @@
void test_vget_lowu32 (void)
{
- uint32x2_t out_uint32x2_t;
+ register uint32x2_t out_uint32x2_t asm ("d18");
uint32x4_t arg0_uint32x4_t;
out_uint32x2_t = vget_low_u32 (arg0_uint32x4_t);
Index: gcc/testsuite/gcc.target/arm/neon/vget_lowu16.c
===================================================================
--- gcc/testsuite/gcc.target/arm/neon/vget_lowu16.c (revision 150276)
+++ gcc/testsuite/gcc.target/arm/neon/vget_lowu16.c (working copy)
@@ -9,7 +9,7 @@
void test_vget_lowu16 (void)
{
- uint16x4_t out_uint16x4_t;
+ register uint16x4_t out_uint16x4_t asm ("d18");
uint16x8_t arg0_uint16x8_t;
out_uint16x4_t = vget_low_u16 (arg0_uint16x8_t);
Index: gcc/testsuite/gcc.target/arm/neon/vget_lowf32.c
===================================================================
--- gcc/testsuite/gcc.target/arm/neon/vget_lowf32.c (revision 150276)
+++ gcc/testsuite/gcc.target/arm/neon/vget_lowf32.c (working copy)
@@ -9,7 +9,7 @@
void test_vget_lowf32 (void)
{
- float32x2_t out_float32x2_t;
+ register float32x2_t out_float32x2_t asm ("d18");
float32x4_t arg0_float32x4_t;
out_float32x2_t = vget_low_f32 (arg0_float32x4_t);
More information about the Gcc-patches
mailing list