[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