From b3d7e1910fd9146716cc75a562bd59327c79ee58 Mon Sep 17 00:00:00 2001 From: Ramana Radhakrishnan Date: Tue, 19 Jan 2010 14:21:14 +0000 Subject: [PATCH] Fix target/38697 2010-01-19 Ramana Radhakrishnan PR target/38697 * config/arm/neon-testgen.m (emit_automatics): New parameter features. Adjust for Fixed_return_reg feature. (test_intrinsic): Call emit_automatics with new feature. * config/arm/neon.ml: Update copyright years. (features): New Fixed_return_reg feature. (ops): Update feature for Vget_low. 2010-01-19 Ramana Radhakrishnan PR target/38697. * gcc.target/arm/neon/vget_lowf32.c: Regenerate. * gcc.target/arm/neon/vget_lowp16.c: Likewise. * gcc.target/arm/neon/vget_lowp8.c: Likewise. * gcc.target/arm/neon/vget_lows16.c: Likewise. * gcc.target/arm/neon/vget_lows32.c: Likewise. * gcc.target/arm/neon/vget_lows64.c: Likewise. * gcc.target/arm/neon/vget_lows8.c: Likewise. * gcc.target/arm/neon/vget_lowu16.c: Likewise. * gcc.target/arm/neon/vget_lowu32.c: Likewise. * gcc.target/arm/neon/vget_lowu64.c: Likewise. * gcc.target/arm/neon/vget_lowu8.c: Likewise. From-SVN: r156042 --- gcc/ChangeLog | 10 +++++++++ gcc/config/arm/neon-testgen.ml | 22 ++++++++++++------- gcc/config/arm/neon.ml | 11 +++++++--- gcc/testsuite/ChangeLog | 15 +++++++++++++ .../gcc.target/arm/neon/vget_lowf32.c | 2 +- .../gcc.target/arm/neon/vget_lowp16.c | 2 +- .../gcc.target/arm/neon/vget_lowp8.c | 2 +- .../gcc.target/arm/neon/vget_lows16.c | 2 +- .../gcc.target/arm/neon/vget_lows32.c | 2 +- .../gcc.target/arm/neon/vget_lows64.c | 1 - .../gcc.target/arm/neon/vget_lows8.c | 2 +- .../gcc.target/arm/neon/vget_lowu16.c | 2 +- .../gcc.target/arm/neon/vget_lowu32.c | 2 +- .../gcc.target/arm/neon/vget_lowu64.c | 1 - .../gcc.target/arm/neon/vget_lowu8.c | 2 +- 15 files changed, 56 insertions(+), 22 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 18dccd607c7..1b5a0d3ec26 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2010-01-19 Ramana Radhakrishnan + + PR target/38697 + * config/arm/neon-testgen.m (emit_automatics): New parameter + features. Adjust for Fixed_return_reg feature. + (test_intrinsic): Call emit_automatics with new feature. + * config/arm/neon.ml: Update copyright years. + (features): New Fixed_return_reg feature. + (ops): Update feature for Vget_low. + 2010-01-19 Jakub Jelinek PR tree-optimization/42719 diff --git a/gcc/config/arm/neon-testgen.ml b/gcc/config/arm/neon-testgen.ml index f1c431a3841..be86386cbf0 100644 --- a/gcc/config/arm/neon-testgen.ml +++ b/gcc/config/arm/neon-testgen.ml @@ -1,5 +1,5 @@ (* Auto-generate ARM Neon intrinsics tests. - Copyright (C) 2006, 2007 Free Software Foundation, Inc. + Copyright (C) 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. Contributed by CodeSourcery. This file is part of GCC. @@ -58,7 +58,7 @@ let emit_prologue chan test_name = (* Emit declarations of local variables that are going to be passed to an intrinsic, together with one to take a returned value if needed. *) -let emit_automatics chan c_types = +let emit_automatics chan c_types features = let emit () = ignore ( List.fold_left (fun arg_number -> fun (flags, ty) -> @@ -75,11 +75,17 @@ let emit_automatics chan c_types = in match c_types with (_, return_ty) :: tys -> - if return_ty <> "void" then - (* The intrinsic returns a value. *) - (Printf.fprintf chan " %s out_%s;\n" return_ty return_ty; - emit ()) - else + if return_ty <> "void" then begin + (* The intrinsic returns a value. We need to do explict register + allocation for vget_low tests or they fail because of copy + elimination. *) + ((if List.mem Fixed_return_reg features then + Printf.fprintf chan " register %s out_%s asm (\"d18\");\n" + return_ty return_ty + else + Printf.fprintf chan " %s out_%s;\n" return_ty return_ty); + emit ()) + end else (* The intrinsic does not return a value. *) emit () | _ -> assert false @@ -257,7 +263,7 @@ let test_intrinsic dir opcode features shape name munge elt_ty = (* Emit file and function prologues. *) emit_prologue chan test_name; (* Emit local variable declarations. *) - emit_automatics chan c_types; + emit_automatics chan c_types features; Printf.fprintf chan "\n"; (* Emit the call to the intrinsic. *) emit_call chan const_valuator c_types name elt_ty; diff --git a/gcc/config/arm/neon.ml b/gcc/config/arm/neon.ml index 466b06b0fff..f77f05cc825 100644 --- a/gcc/config/arm/neon.ml +++ b/gcc/config/arm/neon.ml @@ -1,7 +1,7 @@ (* Common code for ARM NEON header file, documentation and test case generators. - Copyright (C) 2006, 2007 Free Software Foundation, Inc. + Copyright (C) 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. Contributed by CodeSourcery. This file is part of GCC. @@ -234,6 +234,7 @@ type features = cases. The function supplied must return the integer to be written into the testcase for the argument number (0-based) supplied to it. *) | Const_valuator of (int -> int) + | Fixed_return_reg exception MixedMode of elts * elts @@ -1089,9 +1090,13 @@ let ops = Use_operands [| Dreg; Qreg |], "vget_high", notype_1, pf_su_8_64; Vget_low, [Instruction_name ["vmov"]; - Disassembles_as [Use_operands [| Dreg; Dreg |]]], + Disassembles_as [Use_operands [| Dreg; Dreg |]]; + Fixed_return_reg], Use_operands [| Dreg; Qreg |], "vget_low", - notype_1, pf_su_8_64; + notype_1, pf_su_8_32; + Vget_low, [No_op], + Use_operands [| Dreg; Qreg |], "vget_low", + notype_1, [S64; U64]; (* Conversions. *) Vcvt, [InfoWord], All (2, Dreg), "vcvt", conv_1, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8b7c5eed9bb..8c02782de0e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,18 @@ +2010-01-19 Ramana Radhakrishnan + + PR target/38697. + * gcc.target/arm/neon/vget_lowf32.c: Regenerate. + * gcc.target/arm/neon/vget_lowp16.c: Likewise. + * gcc.target/arm/neon/vget_lowp8.c: Likewise. + * gcc.target/arm/neon/vget_lows16.c: Likewise. + * gcc.target/arm/neon/vget_lows32.c: Likewise. + * gcc.target/arm/neon/vget_lows64.c: Likewise. + * gcc.target/arm/neon/vget_lows8.c: Likewise. + * gcc.target/arm/neon/vget_lowu16.c: Likewise. + * gcc.target/arm/neon/vget_lowu32.c: Likewise. + * gcc.target/arm/neon/vget_lowu64.c: Likewise. + * gcc.target/arm/neon/vget_lowu8.c: Likewise. + 2010-01-19 Janus Weil PR fortran/42545 diff --git a/gcc/testsuite/gcc.target/arm/neon/vget_lowf32.c b/gcc/testsuite/gcc.target/arm/neon/vget_lowf32.c index ae63430f737..a14a57636d0 100644 --- a/gcc/testsuite/gcc.target/arm/neon/vget_lowf32.c +++ b/gcc/testsuite/gcc.target/arm/neon/vget_lowf32.c @@ -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); diff --git a/gcc/testsuite/gcc.target/arm/neon/vget_lowp16.c b/gcc/testsuite/gcc.target/arm/neon/vget_lowp16.c index c24ac0cf12a..5c130f0b44d 100644 --- a/gcc/testsuite/gcc.target/arm/neon/vget_lowp16.c +++ b/gcc/testsuite/gcc.target/arm/neon/vget_lowp16.c @@ -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); diff --git a/gcc/testsuite/gcc.target/arm/neon/vget_lowp8.c b/gcc/testsuite/gcc.target/arm/neon/vget_lowp8.c index 45d65bcafc1..4b4f599fc4e 100644 --- a/gcc/testsuite/gcc.target/arm/neon/vget_lowp8.c +++ b/gcc/testsuite/gcc.target/arm/neon/vget_lowp8.c @@ -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); diff --git a/gcc/testsuite/gcc.target/arm/neon/vget_lows16.c b/gcc/testsuite/gcc.target/arm/neon/vget_lows16.c index 8e6c29aa7fa..ee6e9904b67 100644 --- a/gcc/testsuite/gcc.target/arm/neon/vget_lows16.c +++ b/gcc/testsuite/gcc.target/arm/neon/vget_lows16.c @@ -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); diff --git a/gcc/testsuite/gcc.target/arm/neon/vget_lows32.c b/gcc/testsuite/gcc.target/arm/neon/vget_lows32.c index e018afd7fab..08315286d9b 100644 --- a/gcc/testsuite/gcc.target/arm/neon/vget_lows32.c +++ b/gcc/testsuite/gcc.target/arm/neon/vget_lows32.c @@ -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); diff --git a/gcc/testsuite/gcc.target/arm/neon/vget_lows64.c b/gcc/testsuite/gcc.target/arm/neon/vget_lows64.c index e2e2bd66fb9..9c1440ceb5b 100644 --- a/gcc/testsuite/gcc.target/arm/neon/vget_lows64.c +++ b/gcc/testsuite/gcc.target/arm/neon/vget_lows64.c @@ -15,5 +15,4 @@ void test_vget_lows64 (void) out_int64x1_t = vget_low_s64 (arg0_int64x2_t); } -/* { dg-final { scan-assembler "vmov\[ \]+\[dD\]\[0-9\]+, \[dD\]\[0-9\]+!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ /* { dg-final { cleanup-saved-temps } } */ diff --git a/gcc/testsuite/gcc.target/arm/neon/vget_lows8.c b/gcc/testsuite/gcc.target/arm/neon/vget_lows8.c index 0be24de35e2..7d324f33713 100644 --- a/gcc/testsuite/gcc.target/arm/neon/vget_lows8.c +++ b/gcc/testsuite/gcc.target/arm/neon/vget_lows8.c @@ -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); diff --git a/gcc/testsuite/gcc.target/arm/neon/vget_lowu16.c b/gcc/testsuite/gcc.target/arm/neon/vget_lowu16.c index 67bcd5090e7..b0c4384531f 100644 --- a/gcc/testsuite/gcc.target/arm/neon/vget_lowu16.c +++ b/gcc/testsuite/gcc.target/arm/neon/vget_lowu16.c @@ -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); diff --git a/gcc/testsuite/gcc.target/arm/neon/vget_lowu32.c b/gcc/testsuite/gcc.target/arm/neon/vget_lowu32.c index d21d97acd01..fdd8e79e974 100644 --- a/gcc/testsuite/gcc.target/arm/neon/vget_lowu32.c +++ b/gcc/testsuite/gcc.target/arm/neon/vget_lowu32.c @@ -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); diff --git a/gcc/testsuite/gcc.target/arm/neon/vget_lowu64.c b/gcc/testsuite/gcc.target/arm/neon/vget_lowu64.c index 79cf1c53d20..e6f7627cbd4 100644 --- a/gcc/testsuite/gcc.target/arm/neon/vget_lowu64.c +++ b/gcc/testsuite/gcc.target/arm/neon/vget_lowu64.c @@ -15,5 +15,4 @@ void test_vget_lowu64 (void) out_uint64x1_t = vget_low_u64 (arg0_uint64x2_t); } -/* { dg-final { scan-assembler "vmov\[ \]+\[dD\]\[0-9\]+, \[dD\]\[0-9\]+!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ /* { dg-final { cleanup-saved-temps } } */ diff --git a/gcc/testsuite/gcc.target/arm/neon/vget_lowu8.c b/gcc/testsuite/gcc.target/arm/neon/vget_lowu8.c index 03996493c78..d4e3c714d93 100644 --- a/gcc/testsuite/gcc.target/arm/neon/vget_lowu8.c +++ b/gcc/testsuite/gcc.target/arm/neon/vget_lowu8.c @@ -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); -- 2.30.2