From: Christian Bruel Date: Mon, 16 Nov 2015 09:00:09 +0000 (+0100) Subject: re PR target/65837 ([arm-linux-gnueabihf] lto1 target specific builtin not available) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=00c02a701007b5bc1c26ffef68abc5ae3c0bab93;p=gcc.git re PR target/65837 ([arm-linux-gnueabihf] lto1 target specific builtin not available) 2015-11-16 Christian Bruel PR target/65837 * config/arm/arm-protos.h (arm_init_neon_builtins): Declare. * config/arm/arm.c (arm_valid_target_attribute_tree): Call arm_init_neon_builtins. * config/arm/arm-builtins.c (arm_init_neon_builtins): Split into... (arm_init_neon_builtins_internal) (arm_init_crypto_builtins_internal): Test and set neon_set_p, neon_crypto_set_p. (neon_set_p, neon_crypto_set_p): New static booleans. From-SVN: r230406 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3d8679b4635..2febfca57c2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2015-11-16 Christian Bruel + + PR target/65837 + * config/arm/arm-protos.h (arm_init_neon_builtins): Declare. + * config/arm/arm.c (arm_valid_target_attribute_tree): Call + arm_init_neon_builtins. + * config/arm/arm-builtins.c (arm_init_neon_builtins): Split into... + (arm_init_neon_builtins_internal) + (arm_init_crypto_builtins_internal): + Test and set neon_set_p, neon_crypto_set_p. + (neon_set_p, neon_crypto_set_p): New static booleans. + 2015-11-16 Christian Bruel PR target/65837 diff --git a/gcc/config/arm/arm-builtins.c b/gcc/config/arm/arm-builtins.c index f73afc269c3..d0074051a94 100644 --- a/gcc/config/arm/arm-builtins.c +++ b/gcc/config/arm/arm-builtins.c @@ -893,7 +893,7 @@ arm_init_simd_builtin_scalar_types (void) } static void -arm_init_neon_builtins (void) +arm_init_neon_builtins_internal (void) { unsigned int i, fcode = ARM_BUILTIN_NEON_PATTERN_START; @@ -1014,87 +1014,105 @@ arm_init_neon_builtins (void) NULL, NULL_TREE); arm_builtin_decls[fcode] = fndecl; } +} - if (TARGET_CRYPTO && TARGET_HARD_FLOAT) - { - tree V16UQI_type_node = arm_simd_builtin_type (V16QImode, - true, - false); +static void +arm_init_crypto_builtins_internal (void) +{ + tree V16UQI_type_node + = arm_simd_builtin_type (V16QImode, true, false); - tree V4USI_type_node = arm_simd_builtin_type (V4SImode, - true, - false); + tree V4USI_type_node + = arm_simd_builtin_type (V4SImode, true, false); - tree v16uqi_ftype_v16uqi - = build_function_type_list (V16UQI_type_node, V16UQI_type_node, - NULL_TREE); + tree v16uqi_ftype_v16uqi + = build_function_type_list (V16UQI_type_node, V16UQI_type_node, + NULL_TREE); - tree v16uqi_ftype_v16uqi_v16uqi + tree v16uqi_ftype_v16uqi_v16uqi = build_function_type_list (V16UQI_type_node, V16UQI_type_node, V16UQI_type_node, NULL_TREE); - tree v4usi_ftype_v4usi - = build_function_type_list (V4USI_type_node, V4USI_type_node, - NULL_TREE); - - tree v4usi_ftype_v4usi_v4usi - = build_function_type_list (V4USI_type_node, V4USI_type_node, - V4USI_type_node, NULL_TREE); - - tree v4usi_ftype_v4usi_v4usi_v4usi - = build_function_type_list (V4USI_type_node, V4USI_type_node, - V4USI_type_node, V4USI_type_node, - NULL_TREE); - - tree uti_ftype_udi_udi - = build_function_type_list (unsigned_intTI_type_node, - unsigned_intDI_type_node, - unsigned_intDI_type_node, - NULL_TREE); - - #undef CRYPTO1 - #undef CRYPTO2 - #undef CRYPTO3 - #undef C - #undef N - #undef CF - #undef FT1 - #undef FT2 - #undef FT3 - - #define C(U) \ - ARM_BUILTIN_CRYPTO_##U - #define N(L) \ - "__builtin_arm_crypto_"#L - #define FT1(R, A) \ - R##_ftype_##A - #define FT2(R, A1, A2) \ - R##_ftype_##A1##_##A2 - #define FT3(R, A1, A2, A3) \ - R##_ftype_##A1##_##A2##_##A3 - #define CRYPTO1(L, U, R, A) \ - arm_builtin_decls[C (U)] \ - = add_builtin_function (N (L), FT1 (R, A), \ - C (U), BUILT_IN_MD, NULL, NULL_TREE); - #define CRYPTO2(L, U, R, A1, A2) \ - arm_builtin_decls[C (U)] \ - = add_builtin_function (N (L), FT2 (R, A1, A2), \ - C (U), BUILT_IN_MD, NULL, NULL_TREE); + tree v4usi_ftype_v4usi + = build_function_type_list (V4USI_type_node, V4USI_type_node, + NULL_TREE); + + tree v4usi_ftype_v4usi_v4usi + = build_function_type_list (V4USI_type_node, V4USI_type_node, + V4USI_type_node, NULL_TREE); + + tree v4usi_ftype_v4usi_v4usi_v4usi + = build_function_type_list (V4USI_type_node, V4USI_type_node, + V4USI_type_node, V4USI_type_node, + NULL_TREE); - #define CRYPTO3(L, U, R, A1, A2, A3) \ - arm_builtin_decls[C (U)] \ - = add_builtin_function (N (L), FT3 (R, A1, A2, A3), \ + tree uti_ftype_udi_udi + = build_function_type_list (unsigned_intTI_type_node, + unsigned_intDI_type_node, + unsigned_intDI_type_node, + NULL_TREE); + + #undef CRYPTO1 + #undef CRYPTO2 + #undef CRYPTO3 + #undef C + #undef N + #undef CF + #undef FT1 + #undef FT2 + #undef FT3 + + #define C(U) \ + ARM_BUILTIN_CRYPTO_##U + #define N(L) \ + "__builtin_arm_crypto_"#L + #define FT1(R, A) \ + R##_ftype_##A + #define FT2(R, A1, A2) \ + R##_ftype_##A1##_##A2 + #define FT3(R, A1, A2, A3) \ + R##_ftype_##A1##_##A2##_##A3 + #define CRYPTO1(L, U, R, A) \ + arm_builtin_decls[C (U)] \ + = add_builtin_function (N (L), FT1 (R, A), \ + C (U), BUILT_IN_MD, NULL, NULL_TREE); + #define CRYPTO2(L, U, R, A1, A2) \ + arm_builtin_decls[C (U)] \ + = add_builtin_function (N (L), FT2 (R, A1, A2), \ + C (U), BUILT_IN_MD, NULL, NULL_TREE); + + #define CRYPTO3(L, U, R, A1, A2, A3) \ + arm_builtin_decls[C (U)] \ + = add_builtin_function (N (L), FT3 (R, A1, A2, A3), \ C (U), BUILT_IN_MD, NULL, NULL_TREE); - #include "crypto.def" - - #undef CRYPTO1 - #undef CRYPTO2 - #undef CRYPTO3 - #undef C - #undef N - #undef FT1 - #undef FT2 - #undef FT3 + #include "crypto.def" + + #undef CRYPTO1 + #undef CRYPTO2 + #undef CRYPTO3 + #undef C + #undef N + #undef FT1 + #undef FT2 + #undef FT3 +} + +static bool neon_set_p = false; +static bool neon_crypto_set_p = false; + +void +arm_init_neon_builtins (void) +{ + if (! neon_set_p) + { + neon_set_p = true; + arm_init_neon_builtins_internal (); + } + + if (!neon_crypto_set_p && TARGET_CRYPTO && TARGET_HARD_FLOAT) + { + neon_crypto_set_p = true; + arm_init_crypto_builtins_internal (); } } diff --git a/gcc/config/arm/arm-protos.h b/gcc/config/arm/arm-protos.h index f9b12764b09..8e737539e99 100644 --- a/gcc/config/arm/arm-protos.h +++ b/gcc/config/arm/arm-protos.h @@ -214,6 +214,7 @@ extern void arm_mark_dllimport (tree); extern bool arm_change_mode_p (tree); #endif +extern void arm_init_neon_builtins (void); extern tree arm_valid_target_attribute_tree (tree, struct gcc_options *, struct gcc_options *); extern void arm_pr_long_calls (struct cpp_reader *); diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 10c4348d7f3..98b5c8258dc 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -29846,6 +29846,9 @@ arm_valid_target_attribute_tree (tree args, struct gcc_options *opts, /* Do any overrides, such as global options arch=xxx. */ arm_option_override_internal (opts, opts_set); + if (TARGET_NEON) + arm_init_neon_builtins (); + return build_target_option_node (opts); }