On 08/12/15 13:53, Christian Bruel wrote: > >> >> The __builtin_neon* aren't published anywhere and people really >> shouldn't be using that directly in source code and only use the >> interface in arm_neon.h which implements pretty much all the Neon >> intrinsics in the ACLE document. >> > > yes, I see. I wanted to reduce the problem as well, not to confuse anything > by exposing those. sorry about this. > > Here is the amended patch that use the arm_neon.h interface instead of the > builtins. Still fixes the same issues > > Thanks > > Christian >
> lto-neon.patch > > 2015-12-07 Christian Bruel <christian.br...@st.com> > > * config/arm/arm-builtins.c (ARM_BUILTIN_CRYPTO_BASE): New enum tag. > (arm_init_neon_builtins_internal): Rename arm_init_neon_builtins, > (arm_init_crypto_builtins_internal): Rename arm_init_crypto_builtins. > use add_builtin_function_ext_scope instead of add_builtin_function. > (neon_set_p, neon_crypto_set_p): Remove. > (arm_init_builtins): Always call arm_init_neon_builtins and > arm_init_crypto_builtins. > (arm_expand_builtin): Check ARM_BUILTIN_NEON_BASE and > ARM_BUILTIN_CRYPTO_BASE. > * config/arm/arm-protos.h (arm_init_neon_builtins): Remove proto. > * config/arm/arm.c (arm_can_inline_p): Return OK for builtins. > (arm_valid_target_attribute_tree) : Remove arm_init_neon_builtins call. > > 2015-12-07 Christian Bruel <christian.br...@st.com> > > PR target/pr68784 > PR target/pr65837 > * gcc.target/arm/pr68784.c: New test. > * gcc.target/arm/lto/pr65837_0_attr.c: New test. > * gcc.target/arm/lto/pr65837_0.c: Force float-abi. > > Index: gcc/config/arm/arm-builtins.c > =================================================================== > --- gcc/config/arm/arm-builtins.c (revision 231363) > +++ gcc/config/arm/arm-builtins.c (working copy) > @@ -526,6 +526,8 @@ enum arm_builtins > #define CRYPTO3(L, U, M1, M2, M3, M4) \ > ARM_BUILTIN_CRYPTO_##U, > > + ARM_BUILTIN_CRYPTO_BASE, > + > #include "crypto.def" > > #undef CRYPTO1 > @@ -894,7 +896,7 @@ arm_init_simd_builtin_scalar_types (void > } > > static void > -arm_init_neon_builtins_internal (void) > +arm_init_neon_builtins (void) > { > unsigned int i, fcode = ARM_BUILTIN_NEON_PATTERN_START; > > @@ -1018,7 +1020,7 @@ arm_init_neon_builtins_internal (void) > } > > static void > -arm_init_crypto_builtins_internal (void) > +arm_init_crypto_builtins (void) > { > tree V16UQI_type_node > = arm_simd_builtin_type (V16QImode, true, false); > @@ -1098,25 +1100,6 @@ arm_init_crypto_builtins_internal (void) > #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 (); > - } > -} > - > #undef NUM_DREG_TYPES > #undef NUM_QREG_TYPES > > @@ -1777,8 +1760,9 @@ arm_init_builtins (void) > arm_init_neon_builtins which uses it. */ > arm_init_fp16_builtins (); > > - if (TARGET_NEON) > - arm_init_neon_builtins (); > + arm_init_neon_builtins (); > + > + arm_init_crypto_builtins (); > > if (TARGET_CRC32) > arm_init_crc32_builtins (); > @@ -2332,9 +2316,26 @@ arm_expand_builtin (tree exp, > int mask; > int imm; > > + /* Check in the context of the function making the call whether the > + builtin is supported. */ > + if (fcode >= ARM_BUILTIN_NEON_BASE && !TARGET_NEON) > + { > + error ("%qE neon builtin is not supported in this configuration.", > + fndecl); > + return const0_rtx; > + } Can we make this error message more user friendly. "You must enable NEON instructions (e.g. -mfloat-abi=softfp -mfpu=neon) to use these intrinsics" > + > if (fcode >= ARM_BUILTIN_NEON_BASE) > return arm_expand_neon_builtin (fcode, exp, target); > > + if (fcode >= ARM_BUILTIN_CRYPTO_BASE > + && (!TARGET_CRYPTO || !TARGET_HARD_FLOAT)) > + { > + error ("%qE crypto builtin is not supported in this configuration.", > + fndecl); > + return const0_rtx; > + } "You must enable crypto intrinsics (e.g. -mfloat-abi=softfp -mfpu=crypto-neon...) to use these intrinsics" I'm still playing with this patch. regards Ramana > + > switch (fcode) > { > case ARM_BUILTIN_GET_FPSCR: > Index: gcc/config/arm/arm-protos.h > =================================================================== > --- gcc/config/arm/arm-protos.h (revision 231363) > +++ gcc/config/arm/arm-protos.h (working copy) > @@ -213,7 +213,6 @@ 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 *); > Index: gcc/config/arm/arm.c > =================================================================== > --- gcc/config/arm/arm.c (revision 231363) > +++ gcc/config/arm/arm.c (working copy) > @@ -26542,16 +26542,10 @@ thumb_set_return_address (rtx source, rt > bool > arm_vector_mode_supported_p (machine_mode mode) > { > - /* Neon also supports V2SImode, etc. listed in the clause below. */ > - if (TARGET_NEON && (mode == V2SFmode || mode == V4SImode || mode == > V8HImode > + if (mode == V2SFmode || mode == V4SImode || mode == V8HImode > || mode == V4HFmode || mode == V16QImode || mode == V4SFmode > - || mode == V2DImode || mode == V8HFmode)) > - return true; > - > - if ((TARGET_NEON || TARGET_IWMMXT) > - && ((mode == V2SImode) > - || (mode == V4HImode) > - || (mode == V8QImode))) > + || mode == V2DImode || mode == V8HFmode > + || mode == V2SImode || mode == V4HImode || mode == V8QImode) > return true; > > if (TARGET_INT_SIMD && (mode == V4UQQmode || mode == V4QQmode > @@ -29926,9 +29920,6 @@ arm_valid_target_attribute_tree (tree ar > /* 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); > } > > Index: gcc/testsuite/gcc.target/arm/attr-crypto.c > =================================================================== > --- gcc/testsuite/gcc.target/arm/attr-crypto.c (revision 231363) > +++ gcc/testsuite/gcc.target/arm/attr-crypto.c (working copy) > @@ -1,6 +1,6 @@ > /* { dg-do compile } */ > /* { dg-require-effective-target arm_crypto_ok } */ > -/* { dg-options "-O2 -mfloat-abi=softfp" } */ > +/* { dg-additional-options "-mfpu=vfp -mfloat-abi=softfp" } */ > > #pragma GCC target ("fpu=crypto-neon-fp-armv8") > > Index: gcc/testsuite/gcc.target/arm/attr_thumb-static.c > =================================================================== > --- gcc/testsuite/gcc.target/arm/attr_thumb-static.c (revision 231363) > +++ gcc/testsuite/gcc.target/arm/attr_thumb-static.c (working copy) > @@ -1,5 +1,6 @@ > /* Check that a change mode to a static function is correctly handled. */ > /* { dg-do run } */ > +/* { dg-skip-if "Need thumb support" { ! { arm_thumb1_ok || arm_thumb2_ok } > } { "*" } { "" } } */ > > static void > __attribute__((__noinline__)) > Index: gcc/testsuite/gcc.target/arm/lto/pr65837_0.c > =================================================================== > --- gcc/testsuite/gcc.target/arm/lto/pr65837_0.c (revision 231363) > +++ gcc/testsuite/gcc.target/arm/lto/pr65837_0.c (working copy) > @@ -1,5 +1,7 @@ > /* { dg-lto-do run } */ > -/* { dg-lto-options {{-flto -mfpu=neon}} } */ > +/* { dg-require-effective-target arm_neon_ok } */ > +/* { dg-skip-if "need hardfp ABI" { *-*-* } { "-mfloat-abi=soft" } { "" } } > */ > +/* { dg-lto-options {{-flto -mfpu=neon -mfloat-abi=hard}} } */ > /* { dg-suppress-ld-options {-mfpu=neon} } */ > > #include "arm_neon.h" > @@ -8,7 +10,7 @@ float32x2_t a, b, c, e; > > int main() > { > - e = __builtin_neon_vmls_lanev2sf (a, b, c, 0); > + e = vmls_lane_f32 (a, b, c, 0); > return 0; > } > > Index: gcc/testsuite/gcc.target/arm/lto/pr65837_0_attr.c > =================================================================== > --- gcc/testsuite/gcc.target/arm/lto/pr65837_0_attr.c (revision 0) > +++ gcc/testsuite/gcc.target/arm/lto/pr65837_0_attr.c (working copy) > @@ -0,0 +1,16 @@ > +/* { dg-lto-do run } */ > +/* { dg-require-effective-target arm_neon_ok } */ > +/* { dg-skip-if "need hardfp ABI" { *-*-* } { "-mfloat-abi=soft" } { "" } } > */ > +/* { dg-lto-options {{-flto -mfloat-abi=hard}} } */ > + > +#include "arm_neon.h" > + > +float32x2_t a, b, c, e; > + > +int __attribute__ ((target("fpu=neon"))) > +main() > +{ > + e = vmls_lane_f32 (a, b, c, 0); > + return 0; > +} > + > Index: gcc/testsuite/gcc.target/arm/pr68784.c > =================================================================== > --- gcc/testsuite/gcc.target/arm/pr68784.c (revision 0) > +++ gcc/testsuite/gcc.target/arm/pr68784.c (working copy) > @@ -0,0 +1,16 @@ > +/* { dg-do compile } */ > +/* { dg-require-effective-target arm_neon_ok } */ > +/* { dg-options "-O2 -mfloat-abi=softfp" } */ > + > +#include "arm_neon.h" > + > +int8x8_t a, b; > +int16x8_t e; > + > +void > +__attribute__ ((target("fpu=neon"))) > +foo(void) > +{ > + e = (int16x8_t) vaddl_s8(a, b); > +} > +