Commit d7cf3dc7 by Christophe Lyon Committed by Christophe Lyon

[ARM target attributes] Fix effective_target tests

2016-01-20  Christophe Lyon  <christophe.lyon@linaro.org>

	gcc/
	* doc/sourcebuild.texi (arm_crypto_pragma_ok): Document new entry.
	(arm_fp_ok): Likewise.
	(arm_fp): Likewise.
	(arm_crypto): Likewise.

	gcc/testsuite/
	* lib/target-supports.exp
	(check_effective_target_arm_fp_ok_nocache): New.
	(check_effective_target_arm_fp_ok): New.
	(add_options_for_arm_fp): New.
	(check_effective_target_arm_crypto_ok_nocache): Require
	target_arm_v8_neon_ok instead of arm32.
	(check_effective_target_arm_crypto_pragma_ok_nocache): New.
	(check_effective_target_arm_crypto_pragma_ok): New.
	(add_options_for_arm_vfp): New.
	* gcc.target/arm/attr-crypto.c: Use arm_crypto_pragma_ok effective
	target. Do not force -mfloat-abi=softfp, use arm_fp_ok effective
	target instead. Force initial fpu to vfp.
	* gcc.target/arm/attr-neon-builtin-fail.c: Do not force
	-mfloat-abi=softfp, use arm_fp_ok effective target instead.
	* gcc.target/arm/attr-neon-fp16.c: Likewise. Remove arm_neon_ok
	dependency.
	* gcc.target/arm/attr-neon2.c: Do not force -mfloat-abi=softfp,
	use arm_vfp effective target instead. Force initial fpu to vfp.
	* gcc.target/arm/attr-neon3.c: Likewise.
	* gcc.target/arm/cmp-2.c: Use arm_fp_ok effective target instead of
	arm_vfp_ok.
	* gcc.target/arm/unsigned-float.c: Likewise.
	* gcc.target/arm/vfp-1.c: Likewise.
	* gcc.target/arm/vfp-ldmdbd.c: Likewise.
	* gcc.target/arm/vfp-ldmdbs.c: Likewise.
	* gcc.target/arm/vfp-ldmiad.c: Likewise.
	* gcc.target/arm/vfp-ldmias.c: Likewise.
	* gcc.target/arm/vfp-stmdbd.c: Likewise.
	* gcc.target/arm/vfp-stmdbs.c: Likewise.
	* gcc.target/arm/vfp-stmiad.c: Likewise.
	* gcc.target/arm/vfp-stmias.c: Likewise.
	* gcc.target/arm/vnmul-1.c: Likewise.
	* gcc.target/arm/vnmul-2.c: Likewise.
	* gcc.target/arm/vnmul-3.c: Likewise.
	* gcc.target/arm/vnmul-4.c: Likewise.

From-SVN: r232616
parent b03c990f
2016-01-20 Christophe Lyon <christophe.lyon@linaro.org>
* doc/sourcebuild.texi (arm_crypto_pragma_ok): Document new entry.
(arm_fp_ok): Likewise.
(arm_fp): Likewise.
(arm_crypto): Likewise.
2016-01-20 Ilya Enkovich <enkovich.gnu@gmail.com> 2016-01-20 Ilya Enkovich <enkovich.gnu@gmail.com>
Richard Biener <rguenther@suse.de> Richard Biener <rguenther@suse.de>
......
...@@ -1511,9 +1511,21 @@ Target generates decimal floating point instructions with current options. ...@@ -1511,9 +1511,21 @@ Target generates decimal floating point instructions with current options.
@item arm32 @item arm32
ARM target generates 32-bit code. ARM target generates 32-bit code.
@item arm_crypto_pragma_ok
@anchor{arm_crypto_pragma_ok}
ARM target supports pragma target @code{fpu=crypto-neon-fp-armv8}.
This may need @code{-mfpu=crypto-neon-fp-armv8} or equivalent options.
Some multilibs may be incompatible with these options.
@item arm_eabi @item arm_eabi
ARM target adheres to the ABI for the ARM Architecture. ARM target adheres to the ABI for the ARM Architecture.
@item arm_fp_ok
@anchor{arm_fp_ok}
ARM target defines @code{__ARM_FP} using @code{-mfloat-abi=softfp} or
equivalent options. Some multilibs may be incompatible with these
options.
@item arm_hf_eabi @item arm_hf_eabi
ARM target adheres to the VFP and Advanced SIMD Register Arguments ARM target adheres to the VFP and Advanced SIMD Register Arguments
variant of the ABI for the ARM Architecture (as selected with variant of the ABI for the ARM Architecture (as selected with
...@@ -2047,6 +2059,17 @@ The supported values of @var{feature} for directive @code{dg-add-options} ...@@ -2047,6 +2059,17 @@ The supported values of @var{feature} for directive @code{dg-add-options}
are: are:
@table @code @table @code
@item arm_crypto_pragma
Crypto extension pragma support. Only ARM targets support this
feature, and only then in certain modes; see the
@ref{arm_crypto_pragma_ok,,arm_crypto_pragma_ok effective target
keyword}.
@item arm_fp
@code{__ARM_FP} definition. Only ARM targets support this feature, and only then
in certain modes; see the @ref{arm_fp_ok,,arm_fp_ok effective target
keyword}.
@item arm_neon @item arm_neon
NEON support. Only ARM targets support this feature, and only then NEON support. Only ARM targets support this feature, and only then
in certain modes; see the @ref{arm_neon_ok,,arm_neon_ok effective target in certain modes; see the @ref{arm_neon_ok,,arm_neon_ok effective target
......
2016-01-20 Christophe Lyon <christophe.lyon@linaro.org>
* lib/target-supports.exp
(check_effective_target_arm_fp_ok_nocache): New.
(check_effective_target_arm_fp_ok): New.
(add_options_for_arm_fp): New.
(check_effective_target_arm_crypto_ok_nocache): Require
target_arm_v8_neon_ok instead of arm32.
(check_effective_target_arm_crypto_pragma_ok_nocache): New.
(check_effective_target_arm_crypto_pragma_ok): New.
(add_options_for_arm_vfp): New.
* gcc.target/arm/attr-crypto.c: Use arm_crypto_pragma_ok effective
target. Do not force -mfloat-abi=softfp, use arm_fp_ok effective
target instead. Force initial fpu to vfp.
* gcc.target/arm/attr-neon-builtin-fail.c: Do not force
-mfloat-abi=softfp, use arm_fp_ok effective target instead.
* gcc.target/arm/attr-neon-fp16.c: Likewise. Remove arm_neon_ok
dependency.
* gcc.target/arm/attr-neon2.c: Do not force -mfloat-abi=softfp,
use arm_vfp effective target instead. Force initial fpu to vfp.
* gcc.target/arm/attr-neon3.c: Likewise.
* gcc.target/arm/cmp-2.c: Use arm_fp_ok effective target instead of
arm_vfp_ok.
* gcc.target/arm/unsigned-float.c: Likewise.
* gcc.target/arm/vfp-1.c: Likewise.
* gcc.target/arm/vfp-ldmdbd.c: Likewise.
* gcc.target/arm/vfp-ldmdbs.c: Likewise.
* gcc.target/arm/vfp-ldmiad.c: Likewise.
* gcc.target/arm/vfp-ldmias.c: Likewise.
* gcc.target/arm/vfp-stmdbd.c: Likewise.
* gcc.target/arm/vfp-stmdbs.c: Likewise.
* gcc.target/arm/vfp-stmiad.c: Likewise.
* gcc.target/arm/vfp-stmias.c: Likewise.
* gcc.target/arm/vnmul-1.c: Likewise.
* gcc.target/arm/vnmul-2.c: Likewise.
* gcc.target/arm/vnmul-3.c: Likewise.
* gcc.target/arm/vnmul-4.c: Likewise.
2016-01-20 H.J. Lu <hongjiu.lu@intel.com> 2016-01-20 H.J. Lu <hongjiu.lu@intel.com>
PR testsuite/69366 PR testsuite/69366
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-require-effective-target arm_crypto_ok } */ /* Make sure we can force fpu=vfp before switching using the
/* { dg-options "-O2 -mfloat-abi=softfp" } */ pragma. */
/* { dg-require-effective-target arm_fp_ok } */
/* { dg-require-effective-target arm_crypto_pragma_ok } */
/* { dg-options "-O2 -march=armv8-a" } */
/* { dg-add-options arm_fp } */
/* Reset fpu to a value compatible with the next pragmas. */
#pragma GCC target ("fpu=vfp")
#pragma GCC push_options
#pragma GCC target ("fpu=crypto-neon-fp-armv8") #pragma GCC target ("fpu=crypto-neon-fp-armv8")
...@@ -28,7 +36,7 @@ foo (void) ...@@ -28,7 +36,7 @@ foo (void)
return res[0]; return res[0];
} }
#pragma GCC reset_options #pragma GCC pop_options
/* Check that the FP version is correctly reset. */ /* Check that the FP version is correctly reset. */
......
/* Check that calling a neon builtin from a function compiled with vfp fails. */ /* Check that calling a neon builtin from a function compiled with vfp fails. */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-require-effective-target arm_fp_ok } */
/* { dg-require-effective-target arm_neon_ok } */ /* { dg-require-effective-target arm_neon_ok } */
/* { dg-options "-O2 -mfloat-abi=softfp" } */ /* { dg-options "-O2" } */
/* { dg-add-options arm_fp } */
#include <arm_neon.h> #include <arm_neon.h>
...@@ -12,6 +14,5 @@ foo (uint8x16_t *p) ...@@ -12,6 +14,5 @@ foo (uint8x16_t *p)
*p = vmovq_n_u8 (3); /* { dg-message "called from here" } */ *p = vmovq_n_u8 (3); /* { dg-message "called from here" } */
} }
/* { dg-error "inlining failed in call to always_inline" "" { target *-*-* } 0 } /* { dg-error "inlining failed in call to always_inline" "" { target *-*-* } 0 } */
*/
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-require-effective-target arm_neon_ok } */ /* { dg-require-effective-target arm_fp_ok } */
/* { dg-options "-mfp16-format=ieee -mfloat-abi=softfp" } */ /* { dg-options "-mfp16-format=ieee" } */
/* { dg-add-options arm_fp } */
#include "arm_neon.h" #include "arm_neon.h"
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-require-effective-target arm_neon_ok } */ /* { dg-require-effective-target arm_neon_ok } */
/* { dg-options "-O2 -mfloat-abi=softfp -mfpu=vfp" } */ /* { dg-require-effective-target arm_fp_ok } */
/* { dg-options "-O2" } */
/* { dg-add-options arm_fp } */
/* Reset fpu to a value compatible with the next pragmas. */
#pragma GCC target ("fpu=vfp")
#pragma GCC push_options
#pragma GCC target ("fpu=neon") #pragma GCC target ("fpu=neon")
#include <arm_neon.h> #include <arm_neon.h>
...@@ -12,7 +18,7 @@ my (int8x8_t __a, int8x8_t __b) ...@@ -12,7 +18,7 @@ my (int8x8_t __a, int8x8_t __b)
return __a + __b; return __a + __b;
} }
#pragma GCC reset_options #pragma GCC pop_options
/* Check that command line option is restored. */ /* Check that command line option is restored. */
int8x8_t int8x8_t
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-require-effective-target arm_crypto_ok } */ /* { dg-require-effective-target arm_crypto_ok } */
/* { dg-options "-O2 -mfloat-abi=softfp -mfpu=vfp" } */ /* { dg-require-effective-target arm_fp_ok } */
/* { dg-options "-O2" } */
/* { dg-add-options arm_fp } */
/* Reset fpu to a value compatible with the next pragmas. */
#pragma GCC target ("fpu=vfp")
#pragma GCC push_options
#include <arm_neon.h> #include <arm_neon.h>
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-require-effective-target arm_vfp_ok } */ /* { dg-require-effective-target arm_fp_ok } */
/* { dg-skip-if "need fp instructions" { *-*-* } { "-mfloat-abi=soft" } { "" } } */ /* { dg-skip-if "need fp instructions" { *-*-* } { "-mfloat-abi=soft" } { "" } } */
/* { dg-options "-O -mfpu=vfp -mfloat-abi=softfp" } */ /* { dg-options "-O" } */
/* { dg-add-options arm_fp } */
/* { dg-final { scan-assembler-not "\tbl\t" } } */ /* { dg-final { scan-assembler-not "\tbl\t" } } */
/* { dg-final { scan-assembler-not "__aeabi" } } */ /* { dg-final { scan-assembler-not "__aeabi" } } */
int x, y; int x, y;
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-require-effective-target arm_vfp_ok } */ /* { dg-require-effective-target arm_fp_ok } */
/* { dg-skip-if "need fp instructions" { *-*-* } { "-mfloat-abi=soft" } { "" } } */ /* { dg-skip-if "need fp instructions" { *-*-* } { "-mfloat-abi=soft" } { "" } } */
/* { dg-options "-march=armv7-a -O1" } */ /* { dg-options "-march=armv7-a -O1" } */
/* { dg-additional-options "-mfloat-abi=softfp" { target { ! { arm_hf_eabi } } } } */ /* { dg-add-options arm_fp } */
#include <stdint.h> #include <stdint.h>
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -mfpu=vfp -mfloat-abi=softfp -ffp-contract=off" } */ /* { dg-require-effective-target arm_fp_ok } */
/* { dg-require-effective-target arm_vfp_ok } */ /* { dg-options "-O2 -ffp-contract=off" } */
/* { dg-add-options arm_fp } */
/* { dg-skip-if "need fp instructions" { *-*-* } { "-mfloat-abi=soft" } { "" } } */ /* { dg-skip-if "need fp instructions" { *-*-* } { "-mfloat-abi=soft" } { "" } } */
extern float fabsf (float); extern float fabsf (float);
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-require-effective-target arm_vfp_ok } */ /* { dg-require-effective-target arm_fp_ok } */
/* { dg-skip-if "need fp instructions" { *-*-* } { "-mfloat-abi=soft" } { "" } } */ /* { dg-skip-if "need fp instructions" { *-*-* } { "-mfloat-abi=soft" } { "" } } */
/* { dg-options "-O2 -mfpu=vfp -mfloat-abi=softfp" } */ /* { dg-options "-O2" } */
/* { dg-add-options arm_fp } */
extern void bar (double); extern void bar (double);
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-require-effective-target arm_vfp_ok } */ /* { dg-require-effective-target arm_fp_ok } */
/* { dg-skip-if "need fp instructions" { *-*-* } { "-mfloat-abi=soft" } { "" } } */ /* { dg-skip-if "need fp instructions" { *-*-* } { "-mfloat-abi=soft" } { "" } } */
/* { dg-options "-O2 -mfpu=vfp -mfloat-abi=softfp" } */ /* { dg-options "-O2" } */
/* { dg-add-options arm_fp } */
extern void bar (float); extern void bar (float);
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-require-effective-target arm_vfp_ok } */ /* { dg-require-effective-target arm_fp_ok } */
/* { dg-skip-if "need fp instructions" { *-*-* } { "-mfloat-abi=soft" } { "" } } */ /* { dg-skip-if "need fp instructions" { *-*-* } { "-mfloat-abi=soft" } { "" } } */
/* { dg-options "-O2 -mfpu=vfp -mfloat-abi=softfp" } */ /* { dg-options "-O2" } */
/* { dg-add-options arm_fp } */
extern void bar (double); extern void bar (double);
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-require-effective-target arm_vfp_ok } */ /* { dg-require-effective-target arm_fp_ok } */
/* { dg-skip-if "need fp instructions" { *-*-* } { "-mfloat-abi=soft" } { "" } } */ /* { dg-skip-if "need fp instructions" { *-*-* } { "-mfloat-abi=soft" } { "" } } */
/* { dg-options "-O2 -mfpu=vfp -mfloat-abi=softfp" } */ /* { dg-options "-O2" } */
/* { dg-add-options arm_fp } */
extern void bar (float); extern void bar (float);
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-require-effective-target arm_vfp_ok } */ /* { dg-require-effective-target arm_fp_ok } */
/* { dg-skip-if "need fp instructions" { *-*-* } { "-mfloat-abi=soft" } { "" } } */ /* { dg-skip-if "need fp instructions" { *-*-* } { "-mfloat-abi=soft" } { "" } } */
/* { dg-options "-O2 -mfpu=vfp -mfloat-abi=softfp" } */ /* { dg-options "-O2" } */
/* { dg-add-options arm_fp } */
void void
foo (double *p, double a, double b, int n) foo (double *p, double a, double b, int n)
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-require-effective-target arm_vfp_ok } */ /* { dg-require-effective-target arm_fp_ok } */
/* { dg-skip-if "need fp instructions" { *-*-* } { "-mfloat-abi=soft" } { "" } } */ /* { dg-skip-if "need fp instructions" { *-*-* } { "-mfloat-abi=soft" } { "" } } */
/* { dg-options "-O2 -mfpu=vfp -mfloat-abi=softfp" } */ /* { dg-options "-O2" } */
/* { dg-add-options arm_fp } */
void void
foo (float *p, float a, float b, int n) foo (float *p, float a, float b, int n)
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-require-effective-target arm_vfp_ok } */ /* { dg-require-effective-target arm_fp_ok } */
/* { dg-skip-if "need fp instructions" { *-*-* } { "-mfloat-abi=soft" } { "" } } */ /* { dg-skip-if "need fp instructions" { *-*-* } { "-mfloat-abi=soft" } { "" } } */
/* { dg-options "-O2 -mfpu=vfp -mfloat-abi=softfp" } */ /* { dg-options "-O2" } */
/* { dg-add-options arm_fp } */
void void
foo (double *p, double a, double b, int n) foo (double *p, double a, double b, int n)
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-require-effective-target arm_vfp_ok } */ /* { dg-require-effective-target arm_fp_ok } */
/* { dg-skip-if "need fp instructions" { *-*-* } { "-mfloat-abi=soft" } { "" } } */ /* { dg-skip-if "need fp instructions" { *-*-* } { "-mfloat-abi=soft" } { "" } } */
/* { dg-options "-O2 -mfpu=vfp -mfloat-abi=softfp" } */ /* { dg-options "-O2" } */
/* { dg-add-options arm_fp } */
void void
foo (float *p, float a, float b, int n) foo (float *p, float a, float b, int n)
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-require-effective-target arm_vfp_ok } */ /* { dg-require-effective-target arm_fp_ok } */
/* { dg-skip-if "need fp instructions" { *-*-* } { "-mfloat-abi=soft" } { "" } } */ /* { dg-skip-if "need fp instructions" { *-*-* } { "-mfloat-abi=soft" } { "" } } */
/* { dg-options "-O2 -fno-rounding-math -mfpu=vfp -mfloat-abi=hard" } */ /* { dg-options "-O2 -fno-rounding-math" } */
/* { dg-add-options arm_fp } */
double double
foo_d (double a, double b) foo_d (double a, double b)
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-require-effective-target arm_vfp_ok } */ /* { dg-require-effective-target arm_fp_ok } */
/* { dg-skip-if "need fp instructions" { *-*-* } { "-mfloat-abi=soft" } { "" } } */ /* { dg-skip-if "need fp instructions" { *-*-* } { "-mfloat-abi=soft" } { "" } } */
/* { dg-options "-O2 -frounding-math -mfpu=vfp -mfloat-abi=hard" } */ /* { dg-options "-O2 -frounding-math" } */
/* { dg-add-options arm_fp } */
double double
foo_d (double a, double b) foo_d (double a, double b)
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-require-effective-target arm_vfp_ok } */ /* { dg-require-effective-target arm_fp_ok } */
/* { dg-skip-if "need fp instructions" { *-*-* } { "-mfloat-abi=soft" } { "" } } */ /* { dg-skip-if "need fp instructions" { *-*-* } { "-mfloat-abi=soft" } { "" } } */
/* { dg-options "-O2 -fno-rounding-math -mfpu=vfp -mfloat-abi=hard" } */ /* { dg-options "-O2 -fno-rounding-math" } */
/* { dg-add-options arm_fp } */
double double
foo_d (double a, double b) foo_d (double a, double b)
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-require-effective-target arm_vfp_ok } */ /* { dg-require-effective-target arm_fp_ok } */
/* { dg-skip-if "need fp instructions" { *-*-* } { "-mfloat-abi=soft" } { "" } } */ /* { dg-skip-if "need fp instructions" { *-*-* } { "-mfloat-abi=soft" } { "" } } */
/* { dg-options "-O2 -frounding-math -mfpu=vfp -mfloat-abi=hard" } */ /* { dg-options "-O2 -frounding-math" } */
/* { dg-add-options arm_fp } */
double double
foo_d (double a, double b) foo_d (double a, double b)
......
...@@ -2744,6 +2744,47 @@ proc check_effective_target_arm_hard_vfp_ok { } { ...@@ -2744,6 +2744,47 @@ proc check_effective_target_arm_hard_vfp_ok { } {
} }
} }
# Return 1 if this is an ARM target defining __ARM_FP. We may need
# -mfloat-abi=softfp or equivalent options. Some multilibs may be
# incompatible with these options. Also set et_arm_fp_flags to the
# best options to add.
proc check_effective_target_arm_fp_ok_nocache { } {
global et_arm_fp_flags
set et_arm_fp_flags ""
if { [check_effective_target_arm32] } {
foreach flags {"" "-mfloat-abi=softfp" "-mfloat-abi=hard"} {
if { [check_no_compiler_messages_nocache arm_fp_ok object {
#ifndef __ARM_FP
#error __ARM_FP not defined
#endif
} "$flags"] } {
set et_arm_fp_flags $flags
return 1
}
}
}
return 0
}
proc check_effective_target_arm_fp_ok { } {
return [check_cached_effective_target arm_fp_ok \
check_effective_target_arm_fp_ok_nocache]
}
# Add the options needed to define __ARM_FP. We need either
# -mfloat-abi=softfp or -mfloat-abi=hard, but if one is already
# specified by the multilib, use it.
proc add_options_for_arm_fp { flags } {
if { ! [check_effective_target_arm_fp_ok] } {
return "$flags"
}
global et_arm_fp_flags
return "$flags $et_arm_fp_flags"
}
# Return 1 if this is an ARM target that supports DSP multiply with # Return 1 if this is an ARM target that supports DSP multiply with
# current multilib flags. # current multilib flags.
...@@ -2776,7 +2817,7 @@ proc check_effective_target_arm_unaligned { } { ...@@ -2776,7 +2817,7 @@ proc check_effective_target_arm_unaligned { } {
proc check_effective_target_arm_crypto_ok_nocache { } { proc check_effective_target_arm_crypto_ok_nocache { } {
global et_arm_crypto_flags global et_arm_crypto_flags
set et_arm_crypto_flags "" set et_arm_crypto_flags ""
if { [check_effective_target_arm32] } { if { [check_effective_target_arm_v8_neon_ok] } {
foreach flags {"" "-mfloat-abi=softfp" "-mfpu=crypto-neon-fp-armv8" "-mfpu=crypto-neon-fp-armv8 -mfloat-abi=softfp"} { foreach flags {"" "-mfloat-abi=softfp" "-mfpu=crypto-neon-fp-armv8" "-mfpu=crypto-neon-fp-armv8 -mfloat-abi=softfp"} {
if { [check_no_compiler_messages_nocache arm_crypto_ok object { if { [check_no_compiler_messages_nocache arm_crypto_ok object {
#include "arm_neon.h" #include "arm_neon.h"
...@@ -2811,6 +2852,52 @@ proc add_options_for_arm_crypto { flags } { ...@@ -2811,6 +2852,52 @@ proc add_options_for_arm_crypto { flags } {
return "$flags $et_arm_crypto_flags" return "$flags $et_arm_crypto_flags"
} }
# Return 1 if this is an ARM target supporting pragma target
# fpu=crypto-neon-fp-armv8, possibly needing -mfloat-abi=softfp or
# equivalent options. Some multilibs may be incompatible with these
# options. Also set et_arm_crypto_pragma_flags to the best options to
# add.
proc check_effective_target_arm_crypto_pragma_ok_nocache { } {
global et_arm_crypto_pragma_flags
set et_arm_crypto_pragma_flags ""
if { [check_effective_target_arm_v8_neon_ok] } {
foreach flags {"" "-mfloat-abi=softfp" "-mfpu=crypto-neon-fp-armv8" "-mfpu=crypto-neon-fp-armv8 -mfloat-abi=softfp"} {
if { [check_no_compiler_messages_nocache arm_crypto_pragmaok object {
#pragma GCC target ("fpu=crypto-neon-fp-armv8")
#include "arm_neon.h"
uint8x16_t
foo (uint8x16_t a, uint8x16_t b)
{
return vaeseq_u8 (a, b);
}
} "[add_options_for_arm_v8_neon ""] $flags"] } {
set et_arm_crypto_pragma_flags "[add_options_for_arm_v8_neon ""] $flags"
return 1
}
}
}
return 0
}
# Return 1 if this is an ARM target supporting pragma target
# -mfpu=crypto-neon-fp-armv8.
proc check_effective_target_arm_crypto_pragma_ok { } {
return [check_cached_effective_target arm_crypto_pragma_ok \
check_effective_target_arm_crypto_pragma_ok_nocache]
}
# Add options for crypto extensions pragma.
proc add_options_for_arm_crypto_pragma { flags } {
if { ! [check_effective_target_arm_crypto_pragma_ok] } {
return "$flags"
}
global et_arm_crypto_pragma_flags
return "$flags $et_arm_crypto_pragma_flags"
}
# Add the options needed for NEON. We need either -mfloat-abi=softfp # Add the options needed for NEON. We need either -mfloat-abi=softfp
# or -mfloat-abi=hard, but if one is already specified by the # or -mfloat-abi=hard, but if one is already specified by the
# multilib, use it. Similarly, if a -mfpu option already enables # multilib, use it. Similarly, if a -mfpu option already enables
...@@ -2931,8 +3018,8 @@ proc check_effective_target_arm_crc_ok { } { ...@@ -2931,8 +3018,8 @@ proc check_effective_target_arm_crc_ok { } {
# Return 1 if this is an ARM target supporting -mfpu=neon-fp16 # Return 1 if this is an ARM target supporting -mfpu=neon-fp16
# -mfloat-abi=softfp or equivalent options. Some multilibs may be # -mfloat-abi=softfp or equivalent options. Some multilibs may be
# incompatible with these options. Also set et_arm_neon_flags to the # incompatible with these options. Also set et_arm_neon_fp16_flags to
# best options to add. # the best options to add.
proc check_effective_target_arm_neon_fp16_ok_nocache { } { proc check_effective_target_arm_neon_fp16_ok_nocache { } {
global et_arm_neon_fp16_flags global et_arm_neon_fp16_flags
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment