mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-02 05:50:26 +08:00
Add basic armv8-a support
2012-10-17 Matthew Gretton-Dann <matthew.gretton-dann@arm.com> * config/arm/lib1funcs.S (__ARM_ARCH__): Define for ARMv8-A. 2012-10-17 Matthew Gretton-Dann <matthew.gretton-dann@arm.com> * gcc.target/arm/ftest-armv8a-arm.c: New testcase. * gcc.target/arm/ftest-armv8a-thumb.c: Likewise. * gcc.target/arm/ftest-support-arm.h (feature_matrix): Add ARMv8-A row. * gcc.target/arm/ftest-support-thumb.h (feature_matrix): Likewise. * gcc.target/arm/ftest-support.h (architecture): Add ARMv8-A. * lib/target-supports.exp: Add ARMv8-A architecture expectation. 2012-10-17 Matthew Gretton-Dann <matthew.gretton-dann@arm.com> Ramana Radhakrishnan <ramana.radhakrishnan@arm.com> * config.gcc: Add support for ARMv8 for arm*-*-* targets. * config/arm/arm-arches.def: Add armv8-a * config/arm/arm-fpus.def: Add fp-armv8, neon-fp-armv8, crypto-neon-fp-armv8. Add crypto field. * config/arm/arm-tables.opt: Regenerate. * config/arm/arm.c (FL_FOR_ARCH8A): Likewise. (arm_arch8): New global variable. (ARM_FPU): Add crypto parameter. (arm_option_override): Set arm_arch8, update comments. * config/arm/arm.h (TARGET_CRYPTO): New macro. (arm_fpu_desc): Add crypto field. (base_architecture): Add ARMv8 entry. (arm_arch8): New variable declaration. * config/arm/bpabi.h: ARMv8 supports BE8. * doc/invoke.texi: Document ARMv8 options. Co-Authored-By: Ramana Radhakrishnan <ramana.radhakrishnan@arm.com> From-SVN: r192558
This commit is contained in:
parent
a9ba8ba56c
commit
595fefee5d
@ -1,3 +1,22 @@
|
||||
2012-10-17 Matthew Gretton-Dann <matthew.gretton-dann@arm.com>
|
||||
Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
|
||||
|
||||
* config.gcc: Add support for ARMv8 for arm*-*-* targets.
|
||||
* config/arm/arm-arches.def: Add armv8-a
|
||||
* config/arm/arm-fpus.def: Add fp-armv8, neon-fp-armv8,
|
||||
crypto-neon-fp-armv8. Add crypto field.
|
||||
* config/arm/arm-tables.opt: Regenerate.
|
||||
* config/arm/arm.c (FL_FOR_ARCH8A): Likewise.
|
||||
(arm_arch8): New global variable.
|
||||
(ARM_FPU): Add crypto parameter.
|
||||
(arm_option_override): Set arm_arch8, update comments.
|
||||
* config/arm/arm.h (TARGET_CRYPTO): New macro.
|
||||
(arm_fpu_desc): Add crypto field.
|
||||
(base_architecture): Add ARMv8 entry.
|
||||
(arm_arch8): New variable declaration.
|
||||
* config/arm/bpabi.h: ARMv8 supports BE8.
|
||||
* doc/invoke.texi: Document ARMv8 options.
|
||||
|
||||
2012-10-17 Aldy Hernandez <aldyh@redhat.com>
|
||||
|
||||
PR middle-end/54893
|
||||
|
@ -3040,7 +3040,7 @@ case "${target}" in
|
||||
"" \
|
||||
| armv[23456] | armv2a | armv3m | armv4t | armv5t \
|
||||
| armv5te | armv6j |armv6k | armv6z | armv6zk | armv6-m \
|
||||
| armv7 | armv7-a | armv7-r | armv7-m \
|
||||
| armv7 | armv7-a | armv7-r | armv7-m | armv8-a \
|
||||
| iwmmxt | ep9312)
|
||||
# OK
|
||||
;;
|
||||
@ -3066,7 +3066,8 @@ case "${target}" in
|
||||
| vfp | vfp3 | vfpv3 \
|
||||
| vfpv3-fp16 | vfpv3-d16 | vfpv3-d16-fp16 | vfpv3xd \
|
||||
| vfpv3xd-fp16 | neon | neon-fp16 | vfpv4 | vfpv4-d16 \
|
||||
| fpv4-sp-d16 | neon-vfpv4)
|
||||
| fpv4-sp-d16 | neon-vfpv4 | fp-arm-v8 | neon-fp-armv8 \
|
||||
| crypto-neon-fp-armv8)
|
||||
# OK
|
||||
;;
|
||||
*)
|
||||
|
@ -55,5 +55,6 @@ ARM_ARCH("armv7-a", cortexa8, 7A, FL_CO_PROC | FL_FOR_ARCH7A)
|
||||
ARM_ARCH("armv7-r", cortexr4, 7R, FL_CO_PROC | FL_FOR_ARCH7R)
|
||||
ARM_ARCH("armv7-m", cortexm3, 7M, FL_CO_PROC | FL_FOR_ARCH7M)
|
||||
ARM_ARCH("armv7e-m", cortexm4, 7EM, FL_CO_PROC | FL_FOR_ARCH7EM)
|
||||
ARM_ARCH("armv8-a", cortexa15, 8A, FL_CO_PROC | FL_FOR_ARCH8A)
|
||||
ARM_ARCH("iwmmxt", iwmmxt, 5TE, FL_LDSCHED | FL_STRONG | FL_FOR_ARCH5TE | FL_XSCALE | FL_IWMMXT)
|
||||
ARM_ARCH("iwmmxt2", iwmmxt2, 5TE, FL_LDSCHED | FL_STRONG | FL_FOR_ARCH5TE | FL_XSCALE | FL_IWMMXT | FL_IWMMXT2)
|
||||
|
@ -21,24 +21,28 @@
|
||||
|
||||
/* Before using #include to read this file, define a macro:
|
||||
|
||||
ARM_FPU(NAME, MODEL, REV, VFP_REGS, NEON, FP16)
|
||||
ARM_FPU(NAME, MODEL, REV, VFP_REGS, NEON, FP16, CRYPTO)
|
||||
|
||||
The arguments are the fields of struct arm_fpu_desc.
|
||||
|
||||
genopt.sh assumes no whitespace up to the first "," in each entry. */
|
||||
|
||||
ARM_FPU("vfp", ARM_FP_MODEL_VFP, 2, VFP_REG_D16, false, false)
|
||||
ARM_FPU("vfpv3", ARM_FP_MODEL_VFP, 3, VFP_REG_D32, false, false)
|
||||
ARM_FPU("vfpv3-fp16", ARM_FP_MODEL_VFP, 3, VFP_REG_D32, false, true)
|
||||
ARM_FPU("vfpv3-d16", ARM_FP_MODEL_VFP, 3, VFP_REG_D16, false, false)
|
||||
ARM_FPU("vfpv3-d16-fp16", ARM_FP_MODEL_VFP, 3, VFP_REG_D16, false, true)
|
||||
ARM_FPU("vfpv3xd", ARM_FP_MODEL_VFP, 3, VFP_REG_SINGLE, false, false)
|
||||
ARM_FPU("vfpv3xd-fp16", ARM_FP_MODEL_VFP, 3, VFP_REG_SINGLE, false, true)
|
||||
ARM_FPU("neon", ARM_FP_MODEL_VFP, 3, VFP_REG_D32, true , false)
|
||||
ARM_FPU("neon-fp16", ARM_FP_MODEL_VFP, 3, VFP_REG_D32, true, true)
|
||||
ARM_FPU("vfpv4", ARM_FP_MODEL_VFP, 4, VFP_REG_D32, false, true)
|
||||
ARM_FPU("vfpv4-d16", ARM_FP_MODEL_VFP, 4, VFP_REG_D16, false, true)
|
||||
ARM_FPU("fpv4-sp-d16", ARM_FP_MODEL_VFP, 4, VFP_REG_SINGLE, false, true)
|
||||
ARM_FPU("neon-vfpv4", ARM_FP_MODEL_VFP, 4, VFP_REG_D32, true, true)
|
||||
ARM_FPU("vfp", ARM_FP_MODEL_VFP, 2, VFP_REG_D16, false, false, false)
|
||||
ARM_FPU("vfpv3", ARM_FP_MODEL_VFP, 3, VFP_REG_D32, false, false, false)
|
||||
ARM_FPU("vfpv3-fp16", ARM_FP_MODEL_VFP, 3, VFP_REG_D32, false, true, false)
|
||||
ARM_FPU("vfpv3-d16", ARM_FP_MODEL_VFP, 3, VFP_REG_D16, false, false, false)
|
||||
ARM_FPU("vfpv3-d16-fp16", ARM_FP_MODEL_VFP, 3, VFP_REG_D16, false, true, false)
|
||||
ARM_FPU("vfpv3xd", ARM_FP_MODEL_VFP, 3, VFP_REG_SINGLE, false, false, false)
|
||||
ARM_FPU("vfpv3xd-fp16", ARM_FP_MODEL_VFP, 3, VFP_REG_SINGLE, false, true, false)
|
||||
ARM_FPU("neon", ARM_FP_MODEL_VFP, 3, VFP_REG_D32, true , false, false)
|
||||
ARM_FPU("neon-fp16", ARM_FP_MODEL_VFP, 3, VFP_REG_D32, true, true, false)
|
||||
ARM_FPU("vfpv4", ARM_FP_MODEL_VFP, 4, VFP_REG_D32, false, true, false)
|
||||
ARM_FPU("vfpv4-d16", ARM_FP_MODEL_VFP, 4, VFP_REG_D16, false, true, false)
|
||||
ARM_FPU("fpv4-sp-d16", ARM_FP_MODEL_VFP, 4, VFP_REG_SINGLE, false, true, false)
|
||||
ARM_FPU("neon-vfpv4", ARM_FP_MODEL_VFP, 4, VFP_REG_D32, true, true, false)
|
||||
ARM_FPU("fp-armv8", ARM_FP_MODEL_VFP, 8, VFP_REG_D32, false, true, false)
|
||||
ARM_FPU("neon-fp-armv8",ARM_FP_MODEL_VFP, 8, VFP_REG_D32, true, true, false)
|
||||
ARM_FPU("crypto-neon-fp-armv8",
|
||||
ARM_FP_MODEL_VFP, 8, VFP_REG_D32, true, true, true)
|
||||
/* Compatibility aliases. */
|
||||
ARM_FPU("vfp3", ARM_FP_MODEL_VFP, 3, VFP_REG_D32, false, false)
|
||||
ARM_FPU("vfp3", ARM_FP_MODEL_VFP, 3, VFP_REG_D32, false, false, false)
|
||||
|
@ -347,10 +347,13 @@ EnumValue
|
||||
Enum(arm_arch) String(armv7e-m) Value(22)
|
||||
|
||||
EnumValue
|
||||
Enum(arm_arch) String(iwmmxt) Value(23)
|
||||
Enum(arm_arch) String(armv8-a) Value(23)
|
||||
|
||||
EnumValue
|
||||
Enum(arm_arch) String(iwmmxt2) Value(24)
|
||||
Enum(arm_arch) String(iwmmxt) Value(24)
|
||||
|
||||
EnumValue
|
||||
Enum(arm_arch) String(iwmmxt2) Value(25)
|
||||
|
||||
Enum
|
||||
Name(arm_fpu) Type(int)
|
||||
@ -396,5 +399,14 @@ EnumValue
|
||||
Enum(arm_fpu) String(neon-vfpv4) Value(12)
|
||||
|
||||
EnumValue
|
||||
Enum(arm_fpu) String(vfp3) Value(13)
|
||||
Enum(arm_fpu) String(fp-armv8) Value(13)
|
||||
|
||||
EnumValue
|
||||
Enum(arm_fpu) String(neon-fp-armv8) Value(14)
|
||||
|
||||
EnumValue
|
||||
Enum(arm_fpu) String(crypto-neon-fp-armv8) Value(15)
|
||||
|
||||
EnumValue
|
||||
Enum(arm_fpu) String(vfp3) Value(16)
|
||||
|
||||
|
@ -686,6 +686,7 @@ static int thumb_call_reg_needed;
|
||||
architecture. */
|
||||
#define FL_ARCH7 (1 << 22) /* Architecture 7. */
|
||||
#define FL_ARM_DIV (1 << 23) /* Hardware divide (ARM mode). */
|
||||
#define FL_ARCH8 (1 << 24) /* Architecture 8. */
|
||||
|
||||
#define FL_IWMMXT (1 << 29) /* XScale v2 or "Intel Wireless MMX technology". */
|
||||
#define FL_IWMMXT2 (1 << 30) /* "Intel Wireless MMX2 technology". */
|
||||
@ -716,6 +717,8 @@ static int thumb_call_reg_needed;
|
||||
#define FL_FOR_ARCH7R (FL_FOR_ARCH7A | FL_THUMB_DIV)
|
||||
#define FL_FOR_ARCH7M (FL_FOR_ARCH7 | FL_THUMB_DIV)
|
||||
#define FL_FOR_ARCH7EM (FL_FOR_ARCH7M | FL_ARCH7EM)
|
||||
#define FL_FOR_ARCH8A (FL_FOR_ARCH7 | FL_ARCH6K | FL_ARCH8 | FL_THUMB_DIV \
|
||||
| FL_ARM_DIV | FL_NOTM)
|
||||
|
||||
/* The bits in this mask specify which
|
||||
instructions we are allowed to generate. */
|
||||
@ -765,6 +768,9 @@ int arm_arch_notm = 0;
|
||||
/* Nonzero if instructions present in ARMv7E-M can be used. */
|
||||
int arm_arch7em = 0;
|
||||
|
||||
/* Nonzero if instructions present in ARMv8 can be used. */
|
||||
int arm_arch8 = 0;
|
||||
|
||||
/* Nonzero if this chip can benefit from load scheduling. */
|
||||
int arm_ld_sched = 0;
|
||||
|
||||
@ -1059,8 +1065,8 @@ char arm_arch_name[] = "__ARM_ARCH_0UNK__";
|
||||
|
||||
static const struct arm_fpu_desc all_fpus[] =
|
||||
{
|
||||
#define ARM_FPU(NAME, MODEL, REV, VFP_REGS, NEON, FP16) \
|
||||
{ NAME, MODEL, REV, VFP_REGS, NEON, FP16 },
|
||||
#define ARM_FPU(NAME, MODEL, REV, VFP_REGS, NEON, FP16, CRYPTO) \
|
||||
{ NAME, MODEL, REV, VFP_REGS, NEON, FP16, CRYPTO },
|
||||
#include "arm-fpus.def"
|
||||
#undef ARM_FPU
|
||||
};
|
||||
@ -1743,6 +1749,7 @@ arm_option_override (void)
|
||||
arm_arch6m = arm_arch6 && !arm_arch_notm;
|
||||
arm_arch7 = (insn_flags & FL_ARCH7) != 0;
|
||||
arm_arch7em = (insn_flags & FL_ARCH7EM) != 0;
|
||||
arm_arch8 = (insn_flags & FL_ARCH8) != 0;
|
||||
arm_arch_thumb2 = (insn_flags & FL_THUMB2) != 0;
|
||||
arm_arch_xscale = (insn_flags & FL_XSCALE) != 0;
|
||||
|
||||
@ -1959,6 +1966,7 @@ arm_option_override (void)
|
||||
/* Enable -munaligned-access by default for
|
||||
- all ARMv6 architecture-based processors
|
||||
- ARMv7-A, ARMv7-R, and ARMv7-M architecture-based processors.
|
||||
- ARMv8 architecture-base processors.
|
||||
|
||||
Disable -munaligned-access by default for
|
||||
- all pre-ARMv6 architecture-based processors
|
||||
|
@ -296,6 +296,9 @@ extern void (*arm_lang_output_object_attributes_hook)(void);
|
||||
/* FPU supports fused-multiply-add operations. */
|
||||
#define TARGET_FMA (TARGET_VFP && arm_fpu_desc->rev >= 4)
|
||||
|
||||
/* FPU supports Crypto extensions. */
|
||||
#define TARGET_CRYPTO (TARGET_VFP && arm_fpu_desc->crypto)
|
||||
|
||||
/* FPU supports Neon instructions. The setting of this macro gets
|
||||
revealed via __ARM_NEON__ so we add extra guards upon TARGET_32BIT
|
||||
and TARGET_HARD_FLOAT to ensure that NEON instructions are
|
||||
@ -400,6 +403,7 @@ extern const struct arm_fpu_desc
|
||||
enum vfp_reg_type regs;
|
||||
int neon;
|
||||
int fp16;
|
||||
int crypto;
|
||||
} *arm_fpu_desc;
|
||||
|
||||
/* Which floating point hardware to schedule for. */
|
||||
@ -443,7 +447,8 @@ enum base_architecture
|
||||
BASE_ARCH_7A = 7,
|
||||
BASE_ARCH_7R = 7,
|
||||
BASE_ARCH_7M = 7,
|
||||
BASE_ARCH_7EM = 7
|
||||
BASE_ARCH_7EM = 7,
|
||||
BASE_ARCH_8A = 8
|
||||
};
|
||||
|
||||
/* The major revision number of the ARM Architecture implemented by the target. */
|
||||
@ -482,6 +487,9 @@ extern int arm_arch_notm;
|
||||
/* Nonzero if instructions present in ARMv7E-M can be used. */
|
||||
extern int arm_arch7em;
|
||||
|
||||
/* Nonzero if this chip supports the ARM Architecture 8 extensions. */
|
||||
extern int arm_arch8;
|
||||
|
||||
/* Nonzero if this chip can benefit from load scheduling. */
|
||||
extern int arm_ld_sched;
|
||||
|
||||
|
@ -64,6 +64,7 @@
|
||||
|march=armv7-m|mcpu=cortex-m3 \
|
||||
|march=armv7e-m|mcpu=cortex-m4 \
|
||||
|march=armv6-m|mcpu=cortex-m0 \
|
||||
|march=armv8-a \
|
||||
:%{!r:--be8}}}"
|
||||
#else
|
||||
#define BE8_LINK_SPEC \
|
||||
@ -74,6 +75,7 @@
|
||||
|march=armv7-m|mcpu=cortex-m3 \
|
||||
|march=armv7e-m|mcpu=cortex-m4 \
|
||||
|march=armv6-m|mcpu=cortex-m0 \
|
||||
|march=armv8-a \
|
||||
:%{!r:--be8}}}"
|
||||
#endif
|
||||
|
||||
|
@ -972,6 +972,38 @@
|
||||
|
||||
|
||||
|
||||
@subsubsection Fused-multiply-accumulate
|
||||
|
||||
@itemize @bullet
|
||||
@item float32x2_t vfma_f32 (float32x2_t, float32x2_t, float32x2_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vfma.f32 @var{d0}, @var{d0}, @var{d0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
@itemize @bullet
|
||||
@item float32x4_t vfmaq_f32 (float32x4_t, float32x4_t, float32x4_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vfma.f32 @var{q0}, @var{q0}, @var{q0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
|
||||
|
||||
@subsubsection Fused-multiply-subtract
|
||||
|
||||
@itemize @bullet
|
||||
@item float32x2_t vfms_f32 (float32x2_t, float32x2_t, float32x2_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vfms.f32 @var{d0}, @var{d0}, @var{d0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
@itemize @bullet
|
||||
@item float32x4_t vfmsq_f32 (float32x4_t, float32x4_t, float32x4_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vfms.f32 @var{q0}, @var{q0}, @var{q0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
|
||||
|
||||
@subsubsection Subtraction
|
||||
|
||||
@itemize @bullet
|
||||
@ -1496,24 +1528,6 @@
|
||||
|
||||
@subsubsection Comparison (greater-than-or-equal-to)
|
||||
|
||||
@itemize @bullet
|
||||
@item uint32x2_t vcge_u32 (uint32x2_t, uint32x2_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcge.u32 @var{d0}, @var{d0}, @var{d0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
@itemize @bullet
|
||||
@item uint16x4_t vcge_u16 (uint16x4_t, uint16x4_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcge.u16 @var{d0}, @var{d0}, @var{d0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
@itemize @bullet
|
||||
@item uint8x8_t vcge_u8 (uint8x8_t, uint8x8_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcge.u8 @var{d0}, @var{d0}, @var{d0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
@itemize @bullet
|
||||
@item uint32x2_t vcge_s32 (int32x2_t, int32x2_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcge.s32 @var{d0}, @var{d0}, @var{d0}}
|
||||
@ -1539,20 +1553,20 @@
|
||||
|
||||
|
||||
@itemize @bullet
|
||||
@item uint32x4_t vcgeq_u32 (uint32x4_t, uint32x4_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcge.u32 @var{q0}, @var{q0}, @var{q0}}
|
||||
@item uint32x2_t vcge_u32 (uint32x2_t, uint32x2_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcge.u32 @var{d0}, @var{d0}, @var{d0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
@itemize @bullet
|
||||
@item uint16x8_t vcgeq_u16 (uint16x8_t, uint16x8_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcge.u16 @var{q0}, @var{q0}, @var{q0}}
|
||||
@item uint16x4_t vcge_u16 (uint16x4_t, uint16x4_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcge.u16 @var{d0}, @var{d0}, @var{d0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
@itemize @bullet
|
||||
@item uint8x16_t vcgeq_u8 (uint8x16_t, uint8x16_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcge.u8 @var{q0}, @var{q0}, @var{q0}}
|
||||
@item uint8x8_t vcge_u8 (uint8x8_t, uint8x8_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcge.u8 @var{d0}, @var{d0}, @var{d0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
@ -1580,28 +1594,28 @@
|
||||
@end itemize
|
||||
|
||||
|
||||
@itemize @bullet
|
||||
@item uint32x4_t vcgeq_u32 (uint32x4_t, uint32x4_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcge.u32 @var{q0}, @var{q0}, @var{q0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
@itemize @bullet
|
||||
@item uint16x8_t vcgeq_u16 (uint16x8_t, uint16x8_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcge.u16 @var{q0}, @var{q0}, @var{q0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
@itemize @bullet
|
||||
@item uint8x16_t vcgeq_u8 (uint8x16_t, uint8x16_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcge.u8 @var{q0}, @var{q0}, @var{q0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
|
||||
|
||||
@subsubsection Comparison (less-than-or-equal-to)
|
||||
|
||||
@itemize @bullet
|
||||
@item uint32x2_t vcle_u32 (uint32x2_t, uint32x2_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcge.u32 @var{d0}, @var{d0}, @var{d0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
@itemize @bullet
|
||||
@item uint16x4_t vcle_u16 (uint16x4_t, uint16x4_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcge.u16 @var{d0}, @var{d0}, @var{d0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
@itemize @bullet
|
||||
@item uint8x8_t vcle_u8 (uint8x8_t, uint8x8_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcge.u8 @var{d0}, @var{d0}, @var{d0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
@itemize @bullet
|
||||
@item uint32x2_t vcle_s32 (int32x2_t, int32x2_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcge.s32 @var{d0}, @var{d0}, @var{d0}}
|
||||
@ -1627,20 +1641,20 @@
|
||||
|
||||
|
||||
@itemize @bullet
|
||||
@item uint32x4_t vcleq_u32 (uint32x4_t, uint32x4_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcge.u32 @var{q0}, @var{q0}, @var{q0}}
|
||||
@item uint32x2_t vcle_u32 (uint32x2_t, uint32x2_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcge.u32 @var{d0}, @var{d0}, @var{d0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
@itemize @bullet
|
||||
@item uint16x8_t vcleq_u16 (uint16x8_t, uint16x8_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcge.u16 @var{q0}, @var{q0}, @var{q0}}
|
||||
@item uint16x4_t vcle_u16 (uint16x4_t, uint16x4_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcge.u16 @var{d0}, @var{d0}, @var{d0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
@itemize @bullet
|
||||
@item uint8x16_t vcleq_u8 (uint8x16_t, uint8x16_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcge.u8 @var{q0}, @var{q0}, @var{q0}}
|
||||
@item uint8x8_t vcle_u8 (uint8x8_t, uint8x8_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcge.u8 @var{d0}, @var{d0}, @var{d0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
@ -1668,28 +1682,28 @@
|
||||
@end itemize
|
||||
|
||||
|
||||
@itemize @bullet
|
||||
@item uint32x4_t vcleq_u32 (uint32x4_t, uint32x4_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcge.u32 @var{q0}, @var{q0}, @var{q0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
@itemize @bullet
|
||||
@item uint16x8_t vcleq_u16 (uint16x8_t, uint16x8_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcge.u16 @var{q0}, @var{q0}, @var{q0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
@itemize @bullet
|
||||
@item uint8x16_t vcleq_u8 (uint8x16_t, uint8x16_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcge.u8 @var{q0}, @var{q0}, @var{q0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
|
||||
|
||||
@subsubsection Comparison (greater-than)
|
||||
|
||||
@itemize @bullet
|
||||
@item uint32x2_t vcgt_u32 (uint32x2_t, uint32x2_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcgt.u32 @var{d0}, @var{d0}, @var{d0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
@itemize @bullet
|
||||
@item uint16x4_t vcgt_u16 (uint16x4_t, uint16x4_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcgt.u16 @var{d0}, @var{d0}, @var{d0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
@itemize @bullet
|
||||
@item uint8x8_t vcgt_u8 (uint8x8_t, uint8x8_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcgt.u8 @var{d0}, @var{d0}, @var{d0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
@itemize @bullet
|
||||
@item uint32x2_t vcgt_s32 (int32x2_t, int32x2_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcgt.s32 @var{d0}, @var{d0}, @var{d0}}
|
||||
@ -1715,20 +1729,20 @@
|
||||
|
||||
|
||||
@itemize @bullet
|
||||
@item uint32x4_t vcgtq_u32 (uint32x4_t, uint32x4_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcgt.u32 @var{q0}, @var{q0}, @var{q0}}
|
||||
@item uint32x2_t vcgt_u32 (uint32x2_t, uint32x2_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcgt.u32 @var{d0}, @var{d0}, @var{d0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
@itemize @bullet
|
||||
@item uint16x8_t vcgtq_u16 (uint16x8_t, uint16x8_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcgt.u16 @var{q0}, @var{q0}, @var{q0}}
|
||||
@item uint16x4_t vcgt_u16 (uint16x4_t, uint16x4_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcgt.u16 @var{d0}, @var{d0}, @var{d0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
@itemize @bullet
|
||||
@item uint8x16_t vcgtq_u8 (uint8x16_t, uint8x16_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcgt.u8 @var{q0}, @var{q0}, @var{q0}}
|
||||
@item uint8x8_t vcgt_u8 (uint8x8_t, uint8x8_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcgt.u8 @var{d0}, @var{d0}, @var{d0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
@ -1756,28 +1770,28 @@
|
||||
@end itemize
|
||||
|
||||
|
||||
@itemize @bullet
|
||||
@item uint32x4_t vcgtq_u32 (uint32x4_t, uint32x4_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcgt.u32 @var{q0}, @var{q0}, @var{q0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
@itemize @bullet
|
||||
@item uint16x8_t vcgtq_u16 (uint16x8_t, uint16x8_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcgt.u16 @var{q0}, @var{q0}, @var{q0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
@itemize @bullet
|
||||
@item uint8x16_t vcgtq_u8 (uint8x16_t, uint8x16_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcgt.u8 @var{q0}, @var{q0}, @var{q0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
|
||||
|
||||
@subsubsection Comparison (less-than)
|
||||
|
||||
@itemize @bullet
|
||||
@item uint32x2_t vclt_u32 (uint32x2_t, uint32x2_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcgt.u32 @var{d0}, @var{d0}, @var{d0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
@itemize @bullet
|
||||
@item uint16x4_t vclt_u16 (uint16x4_t, uint16x4_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcgt.u16 @var{d0}, @var{d0}, @var{d0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
@itemize @bullet
|
||||
@item uint8x8_t vclt_u8 (uint8x8_t, uint8x8_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcgt.u8 @var{d0}, @var{d0}, @var{d0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
@itemize @bullet
|
||||
@item uint32x2_t vclt_s32 (int32x2_t, int32x2_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcgt.s32 @var{d0}, @var{d0}, @var{d0}}
|
||||
@ -1803,20 +1817,20 @@
|
||||
|
||||
|
||||
@itemize @bullet
|
||||
@item uint32x4_t vcltq_u32 (uint32x4_t, uint32x4_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcgt.u32 @var{q0}, @var{q0}, @var{q0}}
|
||||
@item uint32x2_t vclt_u32 (uint32x2_t, uint32x2_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcgt.u32 @var{d0}, @var{d0}, @var{d0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
@itemize @bullet
|
||||
@item uint16x8_t vcltq_u16 (uint16x8_t, uint16x8_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcgt.u16 @var{q0}, @var{q0}, @var{q0}}
|
||||
@item uint16x4_t vclt_u16 (uint16x4_t, uint16x4_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcgt.u16 @var{d0}, @var{d0}, @var{d0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
@itemize @bullet
|
||||
@item uint8x16_t vcltq_u8 (uint8x16_t, uint8x16_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcgt.u8 @var{q0}, @var{q0}, @var{q0}}
|
||||
@item uint8x8_t vclt_u8 (uint8x8_t, uint8x8_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcgt.u8 @var{d0}, @var{d0}, @var{d0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
@ -1844,6 +1858,24 @@
|
||||
@end itemize
|
||||
|
||||
|
||||
@itemize @bullet
|
||||
@item uint32x4_t vcltq_u32 (uint32x4_t, uint32x4_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcgt.u32 @var{q0}, @var{q0}, @var{q0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
@itemize @bullet
|
||||
@item uint16x8_t vcltq_u16 (uint16x8_t, uint16x8_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcgt.u16 @var{q0}, @var{q0}, @var{q0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
@itemize @bullet
|
||||
@item uint8x16_t vcltq_u8 (uint8x16_t, uint8x16_t)
|
||||
@*@emph{Form of expected instruction(s):} @code{vcgt.u8 @var{q0}, @var{q0}, @var{q0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
|
||||
|
||||
@subsubsection Comparison (absolute greater-than-or-equal-to)
|
||||
@ -4810,13 +4842,13 @@
|
||||
|
||||
@itemize @bullet
|
||||
@item uint64_t vgetq_lane_u64 (uint64x2_t, const int)
|
||||
@*@emph{Form of expected instruction(s):} @code{vmov @var{r0}, @var{r0}, @var{d0}}
|
||||
@*@emph{Form of expected instruction(s):} @code{vmov @var{r0}, @var{r0}, @var{d0}} @emph{or} @code{fmrrd @var{r0}, @var{r0}, @var{d0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
@itemize @bullet
|
||||
@item int64_t vgetq_lane_s64 (int64x2_t, const int)
|
||||
@*@emph{Form of expected instruction(s):} @code{vmov @var{r0}, @var{r0}, @var{d0}}
|
||||
@*@emph{Form of expected instruction(s):} @code{vmov @var{r0}, @var{r0}, @var{d0}} @emph{or} @code{fmrrd @var{r0}, @var{r0}, @var{d0}}
|
||||
@end itemize
|
||||
|
||||
|
||||
|
@ -11004,6 +11004,7 @@ of the @option{-mcpu=} option. Permissible names are: @samp{armv2},
|
||||
@samp{armv6}, @samp{armv6j},
|
||||
@samp{armv6t2}, @samp{armv6z}, @samp{armv6zk}, @samp{armv6-m},
|
||||
@samp{armv7}, @samp{armv7-a}, @samp{armv7-r}, @samp{armv7-m},
|
||||
@samp{armv8-a},
|
||||
@samp{iwmmxt}, @samp{iwmmxt2}, @samp{ep9312}.
|
||||
|
||||
@option{-march=native} causes the compiler to auto-detect the architecture
|
||||
@ -11017,7 +11018,8 @@ This specifies what floating-point hardware (or hardware emulation) is
|
||||
available on the target. Permissible names are: @samp{vfp}, @samp{vfpv3},
|
||||
@samp{vfpv3-fp16}, @samp{vfpv3-d16}, @samp{vfpv3-d16-fp16}, @samp{vfpv3xd},
|
||||
@samp{vfpv3xd-fp16}, @samp{neon}, @samp{neon-fp16}, @samp{vfpv4},
|
||||
@samp{vfpv4-d16}, @samp{fpv4-sp-d16} and @samp{neon-vfpv4}.
|
||||
@samp{vfpv4-d16}, @samp{fpv4-sp-d16}, @samp{neon-vfpv4},
|
||||
@samp{fp-armv8}, @samp{neon-fp-armv8}, and @samp{crypto-neon-fp-armv8}.
|
||||
|
||||
If @option{-msoft-float} is specified this specifies the format of
|
||||
floating-point values.
|
||||
|
@ -1,3 +1,14 @@
|
||||
2012-10-17 Matthew Gretton-Dann <matthew.gretton-dann@arm.com>
|
||||
|
||||
* gcc.target/arm/ftest-armv8a-arm.c: New testcase.
|
||||
* gcc.target/arm/ftest-armv8a-thumb.c: Likewise.
|
||||
* gcc.target/arm/ftest-support-arm.h (feature_matrix): Add
|
||||
ARMv8-A row.
|
||||
* gcc.target/arm/ftest-support-thumb.h (feature_matrix):
|
||||
Likewise.
|
||||
* gcc.target/arm/ftest-support.h (architecture): Add ARMv8-A.
|
||||
* lib/target-supports.exp: Add ARMv8-A architecture expectation.
|
||||
|
||||
2012-10-16 Jan Hubicka <jh@suse.cz>
|
||||
|
||||
* gcc.target/i386/l_fma_float_?.c: Update.
|
||||
|
14
gcc/testsuite/gcc.target/arm/ftest-armv8a-arm.c
Normal file
14
gcc/testsuite/gcc.target/arm/ftest-armv8a-arm.c
Normal file
@ -0,0 +1,14 @@
|
||||
/* { dg-do run } */
|
||||
/* { dg-require-effective-target arm_nothumb } */
|
||||
/* { dg-require-effective-target arm_arch_v8a_multilib } */
|
||||
/* { dg-options "-marm" } */
|
||||
/* { dg-add-options arm_arch_v8a } */
|
||||
|
||||
#include "ftest-support-arm.h"
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
return ftest (ARCH_V8A);
|
||||
}
|
||||
|
14
gcc/testsuite/gcc.target/arm/ftest-armv8a-thumb.c
Normal file
14
gcc/testsuite/gcc.target/arm/ftest-armv8a-thumb.c
Normal file
@ -0,0 +1,14 @@
|
||||
/* { dg-do run } */
|
||||
/* { dg-require-effective-target arm_eabi } */
|
||||
/* { dg-require-effective-target arm_arch_v8a_multilib } */
|
||||
/* { dg-options "-mthumb" } */
|
||||
/* { dg-add-options arm_arch_v8a } */
|
||||
|
||||
#include "ftest-support-thumb.h"
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
return ftest (ARCH_V8A);
|
||||
}
|
||||
|
@ -26,4 +26,5 @@ int feature_matrix[ARCH_COUNT][NUM_FEATURES] =
|
||||
{7, 1, 2, 'A', 1, 15, 1, 1, 1, 1, 1}, /* ARCH_V7A. */
|
||||
{7, 1, 2, 'R', 1, 15, 1, 1, 1, 1, 1}, /* ARCH_V7R. */
|
||||
{7, 0, 2, 'M', 1, 7, 1, 0, 0, 1, 1}, /* ARCH_V7M. */
|
||||
{7, 0, 2, 'M', 1, 7, 1, 1, 0, 1, 1}}; /* ARCH_V7EM. */
|
||||
{7, 0, 2, 'M', 1, 7, 1, 1, 0, 1, 1}, /* ARCH_V7EM. */
|
||||
{8, 1, 2, 'A', 1, 15, 1, 1, 1, 1, 1}}; /* ARCH_V8A. */
|
||||
|
@ -26,4 +26,5 @@ int feature_matrix[ARCH_COUNT][NUM_FEATURES] =
|
||||
{7, 1, 2, 'A', 1, 15, 1, 1, 1, 1, 1}, /* ARCH_V7A. */
|
||||
{7, 1, 2, 'R', 1, 15, 1, 1, 1, 1, 1}, /* ARCH_V7R. */
|
||||
{7, 0, 2, 'M', 1, 7, 1, 0, 0, 1, 1}, /* ARCH_V7M. */
|
||||
{7, 0, 2, 'M', 1, 7, 1, 1, 1, 1, 1}}; /* ARCH_V7EM. */
|
||||
{7, 0, 2, 'M', 1, 7, 1, 1, 1, 1, 1}, /* ARCH_V7EM. */
|
||||
{8, 1, 2, 'A', 1, 15, 1, 1, 1, 1, 1}}; /* ARCH_V8A. */
|
||||
|
@ -22,6 +22,7 @@ enum architecture {
|
||||
ARCH_V7R,
|
||||
ARCH_V7M,
|
||||
ARCH_V7EM,
|
||||
ARCH_V8A,
|
||||
ARCH_COUNT
|
||||
};
|
||||
|
||||
|
@ -2246,7 +2246,8 @@ foreach { armfunc armflag armdef } { v4 "-march=armv4 -marm" __ARM_ARCH_4__
|
||||
v7a "-march=armv7-a" __ARM_ARCH_7A__
|
||||
v7r "-march=armv7-r" __ARM_ARCH_7R__
|
||||
v7m "-march=armv7-m -mthumb" __ARM_ARCH_7M__
|
||||
v7em "-march=armv7e-m -mthumb" __ARM_ARCH_7EM__ } {
|
||||
v7em "-march=armv7e-m -mthumb" __ARM_ARCH_7EM__
|
||||
v8a "-march=armv8-a" __ARM_ARCH_8A__ } {
|
||||
eval [string map [list FUNC $armfunc FLAG $armflag DEF $armdef ] {
|
||||
proc check_effective_target_arm_arch_FUNC_ok { } {
|
||||
if { [ string match "*-marm*" "FLAG" ] &&
|
||||
|
@ -1,3 +1,7 @@
|
||||
2012-10-17 Matthew Gretton-Dann <matthew.gretton-dann@arm.com>
|
||||
|
||||
* config/arm/lib1funcs.S (__ARM_ARCH__): Define for ARMv8-A.
|
||||
|
||||
2012-10-15 Matthias Klose <doko@ubuntu.com>
|
||||
|
||||
* config.host: Match arm*-*-linux-* for ARM Linux/GNU.
|
||||
|
@ -109,6 +109,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
||||
# define __ARM_ARCH__ 7
|
||||
#endif
|
||||
|
||||
#if defined(__ARM_ARCH_8A__)
|
||||
# define __ARM_ARCH__ 8
|
||||
#endif
|
||||
|
||||
#ifndef __ARM_ARCH__
|
||||
#error Unable to determine architecture.
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user