| Index: gcc/gcc/config/arm/neon-testgen.ml
|
| diff --git a/gcc/gcc/config/arm/neon-testgen.ml b/gcc/gcc/config/arm/neon-testgen.ml
|
| index 00a8e5332f49e073149a11b04b0c482c649bcef3..be86386cbf03646e9e5a304dceedb41c7e5906cc 100644
|
| --- a/gcc/gcc/config/arm/neon-testgen.ml
|
| +++ b/gcc/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
|
| @@ -175,6 +181,7 @@ let rec analyze_shape shape =
|
| | Element_of_dreg -> (analyze_shape_elt Dreg) ^ "\\\\\\[\\[0-9\\]+\\\\\\]"
|
| | Element_of_qreg -> (analyze_shape_elt Qreg) ^ "\\\\\\[\\[0-9\\]+\\\\\\]"
|
| | All_elements_of_dreg -> (analyze_shape_elt Dreg) ^ "\\\\\\[\\\\\\]"
|
| + | Alternatives (elts) -> "(" ^ (String.concat "|" (List.map analyze_shape_elt elts)) ^ ")"
|
| in
|
| match shape with
|
| All (n, elt) -> commas analyze_shape_elt (n_things n elt) ""
|
| @@ -256,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;
|
|
|