2010-01-19 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
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 <ramana.radhakrishnan@arm.com>
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@156042
138bc75d-0d04-0410-961f-
82ee72b054a4
+2010-01-19 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
+
+ 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 <jakub@redhat.com>
PR tree-optimization/42719
(* 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.
(* 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) ->
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
(* 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;
(* 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.
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
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,
+2010-01-19 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
+
+ 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 <janus@gcc.gnu.org>
PR fortran/42545
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);
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);
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);
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);
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);
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 } } */
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);
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);
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);
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 } } */
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);