diff options
Diffstat (limited to 'gcc/config/arm/neon-testgen.ml')
-rw-r--r-- | gcc/config/arm/neon-testgen.ml | 54 |
1 files changed, 37 insertions, 17 deletions
diff --git a/gcc/config/arm/neon-testgen.ml b/gcc/config/arm/neon-testgen.ml index df429f59e27..f3898193835 100644 --- a/gcc/config/arm/neon-testgen.ml +++ b/gcc/config/arm/neon-testgen.ml @@ -46,20 +46,19 @@ let open_test_file dir name = failwith ("Could not create test source file " ^ name ^ ": " ^ str) (* Emit prologue code to a test source file. *) -let emit_prologue chan test_name effective_target = +let emit_prologue chan test_name effective_target compile_test_optim = Printf.fprintf chan "/* Test the `%s' ARM Neon intrinsic. */\n" test_name; Printf.fprintf chan "/* This file was autogenerated by neon-testgen. */\n\n"; Printf.fprintf chan "/* { dg-do assemble } */\n"; Printf.fprintf chan "/* { dg-require-effective-target %s_ok } */\n" effective_target; - Printf.fprintf chan "/* { dg-options \"-save-temps -O0\" } */\n"; + Printf.fprintf chan "/* { dg-options \"-save-temps %s\" } */\n" compile_test_optim; Printf.fprintf chan "/* { dg-add-options %s } */\n" effective_target; - Printf.fprintf chan "\n#include \"arm_neon.h\"\n\n"; - Printf.fprintf chan "void test_%s (void)\n{\n" test_name + Printf.fprintf chan "\n#include \"arm_neon.h\"\n\n" -(* Emit declarations of local variables that are going to be passed +(* Emit declarations of 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 features = +let emit_variables chan c_types features spaces = let emit () = ignore ( List.fold_left (fun arg_number -> fun (flags, ty) -> @@ -69,8 +68,8 @@ let emit_automatics chan c_types features = (* Const arguments to builtins are directly written in as constants. *) if not (List.mem Const flags) then - Printf.fprintf chan " %s %sarg%d_%s;\n" - ty pointer_bit arg_number ty; + Printf.fprintf chan "%s%s %sarg%d_%s;\n" + spaces ty pointer_bit arg_number ty; arg_number + 1) 0 (List.tl c_types)) in @@ -81,13 +80,13 @@ let emit_automatics chan c_types features = allocation for vget_low tests or they fail because of copy elimination. *) ((if List.mem Fixed_vector_reg features then - Printf.fprintf chan " register %s out_%s asm (\"d18\");\n" - return_ty return_ty + Printf.fprintf chan "%sregister %s out_%s asm (\"d18\");\n" + spaces return_ty return_ty else if List.mem Fixed_core_reg features then - Printf.fprintf chan " register %s out_%s asm (\"r0\");\n" - return_ty return_ty + Printf.fprintf chan "%sregister %s out_%s asm (\"r0\");\n" + spaces return_ty return_ty else - Printf.fprintf chan " %s out_%s;\n" return_ty return_ty); + Printf.fprintf chan "%s%s out_%s;\n" spaces return_ty return_ty); emit ()) end else (* The intrinsic does not return a value. *) @@ -173,6 +172,17 @@ let effective_target features = | _ -> assert false with Not_found -> "arm_neon" +(* Work out what the testcase optimization level should be, default to -O0. *) +let compile_test_optim features = + try + match List.find (fun feature -> + match feature with Compiler_optim _ -> true + | _ -> false) + features with + Compiler_optim opt -> opt + | _ -> assert false + with Not_found -> "-O0" + (* Given an intrinsic shape, produce a regexp that will match the right-hand sides of instructions generated by an intrinsic of that shape. *) @@ -280,12 +290,22 @@ let test_intrinsic dir opcode features shape name munge elt_ty = "!?\\(\\[ \t\\]+@\\[a-zA-Z0-9 \\]+\\)?\\n") (analyze_all_shapes features shape analyze_shape) in - let effective_target = effective_target features + let effective_target = effective_target features in + let compile_test_optim = compile_test_optim features in (* Emit file and function prologues. *) - emit_prologue chan test_name effective_target; - (* Emit local variable declarations. *) - emit_automatics chan c_types features; + emit_prologue chan test_name effective_target compile_test_optim; + + if (compare compile_test_optim "-O0") <> 0 then + (* Emit variable declarations. *) + emit_variables chan c_types features ""; + + Printf.fprintf chan "void test_%s (void)\n{\n" test_name; + + if compare compile_test_optim "-O0" = 0 then + (* Emit variable declarations. *) + emit_variables chan c_types features " "; + Printf.fprintf chan "\n"; (* Emit the call to the intrinsic. *) emit_call chan const_valuator c_types name elt_ty; |