re PR target/63503 ([AArch64] A57 executes fused multiply-add poorly in some situations)
2015-04-28 Thomas Preud'homme <thomas.preudhomme@arm.com> gcc/ PR target/63503 * config.gcc: Add cortex-a57-fma-steering.o to extra_objs for aarch64-*-*. * config/aarch64/t-aarch64: Add a rule for cortex-a57-fma-steering.o. * config/aarch64/aarch64.h (AARCH64_FL_USE_FMA_STEERING_PASS): Define. (AARCH64_TUNE_FMA_STEERING): Likewise. * config/aarch64/aarch64-cores.def: Set AARCH64_FL_USE_FMA_STEERING_PASS for cores with dynamic steering of FMUL/FMADD instructions. * config/aarch64/aarch64.c (aarch64_register_fma_steering): Declare. (aarch64_override_options): Include cortex-a57-fma-steering.h. Call aarch64_register_fma_steering () if AARCH64_TUNE_FMA_STEERING is true. * config/aarch64/cortex-a57-fma-steering.h: New file. * config/aarch64/cortex-a57-fma-steering.c: Likewise. From-SVN: r222512
This commit is contained in:
parent
0060d7d71e
commit
fde9b31b61
@ -1,3 +1,20 @@
|
||||
2015-04-28 Thomas Preud'homme <thomas.preudhomme@arm.com>
|
||||
|
||||
PR target/63503
|
||||
* config.gcc: Add cortex-a57-fma-steering.o to extra_objs for
|
||||
aarch64-*-*.
|
||||
* config/aarch64/t-aarch64: Add a rule for cortex-a57-fma-steering.o.
|
||||
* config/aarch64/aarch64.h (AARCH64_FL_USE_FMA_STEERING_PASS): Define.
|
||||
(AARCH64_TUNE_FMA_STEERING): Likewise.
|
||||
* config/aarch64/aarch64-cores.def: Set
|
||||
AARCH64_FL_USE_FMA_STEERING_PASS for cores with dynamic steering of
|
||||
FMUL/FMADD instructions.
|
||||
* config/aarch64/aarch64.c (aarch64_register_fma_steering): Declare.
|
||||
(aarch64_override_options): Include cortex-a57-fma-steering.h. Call
|
||||
aarch64_register_fma_steering () if AARCH64_TUNE_FMA_STEERING is true.
|
||||
* config/aarch64/cortex-a57-fma-steering.h: New file.
|
||||
* config/aarch64/cortex-a57-fma-steering.c: Likewise.
|
||||
|
||||
2015-04-28 Richard Sandiford <richard.sandiford@arm.com>
|
||||
|
||||
* gensupport.c (std_preds): Add missing codes to address_operand entry.
|
||||
|
@ -302,7 +302,7 @@ m32c*-*-*)
|
||||
aarch64*-*-*)
|
||||
cpu_type=aarch64
|
||||
extra_headers="arm_neon.h arm_acle.h"
|
||||
extra_objs="aarch64-builtins.o aarch-common.o"
|
||||
extra_objs="aarch64-builtins.o aarch-common.o cortex-a57-fma-steering.o"
|
||||
target_gtfiles="\$(srcdir)/config/aarch64/aarch64-builtins.c"
|
||||
target_has_targetm_common=yes
|
||||
;;
|
||||
|
@ -40,7 +40,7 @@
|
||||
/* V8 Architecture Processors. */
|
||||
|
||||
AARCH64_CORE("cortex-a53", cortexa53, cortexa53, 8, AARCH64_FL_FOR_ARCH8 | AARCH64_FL_CRC, cortexa53, "0x41", "0xd03")
|
||||
AARCH64_CORE("cortex-a57", cortexa57, cortexa57, 8, AARCH64_FL_FOR_ARCH8 | AARCH64_FL_CRC, cortexa57, "0x41", "0xd07")
|
||||
AARCH64_CORE("cortex-a57", cortexa57, cortexa57, 8, AARCH64_FL_FOR_ARCH8 | AARCH64_FL_CRC | AARCH64_FL_USE_FMA_STEERING_PASS, cortexa57, "0x41", "0xd07")
|
||||
AARCH64_CORE("cortex-a72", cortexa72, cortexa57, 8, AARCH64_FL_FOR_ARCH8 | AARCH64_FL_CRC, cortexa57, "0x41", "0xd08")
|
||||
AARCH64_CORE("exynos-m1", exynosm1, cortexa57, 8, AARCH64_FL_FOR_ARCH8 | AARCH64_FL_CRC | AARCH64_FL_CRYPTO, cortexa57, "0x53", "0x001")
|
||||
AARCH64_CORE("thunderx", thunderx, thunderx, 8, AARCH64_FL_FOR_ARCH8 | AARCH64_FL_CRC | AARCH64_FL_CRYPTO, thunderx, "0x43", "0x0a1")
|
||||
@ -48,5 +48,5 @@ AARCH64_CORE("xgene1", xgene1, xgene1, 8, AARCH64_FL_FOR_ARCH8, xgen
|
||||
|
||||
/* V8 big.LITTLE implementations. */
|
||||
|
||||
AARCH64_CORE("cortex-a57.cortex-a53", cortexa57cortexa53, cortexa53, 8, AARCH64_FL_FOR_ARCH8 | AARCH64_FL_CRC, cortexa57, "0x41", "0xd07.0xd03")
|
||||
AARCH64_CORE("cortex-a57.cortex-a53", cortexa57cortexa53, cortexa53, 8, AARCH64_FL_FOR_ARCH8 | AARCH64_FL_CRC | AARCH64_FL_USE_FMA_STEERING_PASS, cortexa57, "0x41", "0xd07.0xd03")
|
||||
AARCH64_CORE("cortex-a72.cortex-a53", cortexa72cortexa53, cortexa53, 8, AARCH64_FL_FOR_ARCH8 | AARCH64_FL_CRC, cortexa57, "0x41", "0xd08.0xd03")
|
||||
|
@ -95,6 +95,7 @@
|
||||
#include "rtl-iter.h"
|
||||
#include "tm-constrs.h"
|
||||
#include "sched-int.h"
|
||||
#include "cortex-a57-fma-steering.h"
|
||||
|
||||
/* Defined for convenience. */
|
||||
#define POINTER_BYTES (POINTER_SIZE / BITS_PER_UNIT)
|
||||
@ -6884,6 +6885,9 @@ aarch64_override_options (void)
|
||||
align_functions = aarch64_tune_params->function_align;
|
||||
}
|
||||
|
||||
if (AARCH64_TUNE_FMA_STEERING)
|
||||
aarch64_register_fma_steering ();
|
||||
|
||||
aarch64_override_options_after_change ();
|
||||
}
|
||||
|
||||
|
@ -200,6 +200,8 @@ extern unsigned aarch64_architecture_version;
|
||||
#define AARCH64_FL_CRYPTO (1 << 2) /* Has crypto. */
|
||||
#define AARCH64_FL_SLOWMUL (1 << 3) /* A slow multiply core. */
|
||||
#define AARCH64_FL_CRC (1 << 4) /* Has CRC. */
|
||||
/* Has static dispatch of FMA. */
|
||||
#define AARCH64_FL_USE_FMA_STEERING_PASS (1 << 5)
|
||||
|
||||
/* Has FP and SIMD. */
|
||||
#define AARCH64_FL_FPSIMD (AARCH64_FL_FP | AARCH64_FL_SIMD)
|
||||
@ -220,6 +222,8 @@ extern unsigned long aarch64_isa_flags;
|
||||
/* Macros to test tuning flags. */
|
||||
extern unsigned long aarch64_tune_flags;
|
||||
#define AARCH64_TUNE_SLOWMUL (aarch64_tune_flags & AARCH64_FL_SLOWMUL)
|
||||
#define AARCH64_TUNE_FMA_STEERING \
|
||||
(aarch64_tune_flags & AARCH64_FL_USE_FMA_STEERING_PASS)
|
||||
|
||||
/* Crypto is an optional extension to AdvSIMD. */
|
||||
#define TARGET_CRYPTO (TARGET_SIMD && AARCH64_ISA_CRYPTO)
|
||||
|
1088
gcc/config/aarch64/cortex-a57-fma-steering.c
Normal file
1088
gcc/config/aarch64/cortex-a57-fma-steering.c
Normal file
File diff suppressed because it is too large
Load Diff
22
gcc/config/aarch64/cortex-a57-fma-steering.h
Normal file
22
gcc/config/aarch64/cortex-a57-fma-steering.h
Normal file
@ -0,0 +1,22 @@
|
||||
/* This file contains declarations for the FMA steering optimization
|
||||
pass for Cortex-A57.
|
||||
Copyright (C) 2015 Free Software Foundation, Inc.
|
||||
Contributed by ARM Ltd.
|
||||
|
||||
This file is part of GCC.
|
||||
|
||||
GCC is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3, or (at your option)
|
||||
any later version.
|
||||
|
||||
GCC is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GCC; see the file COPYING3. If not see
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
void aarch64_register_fma_steering (void);
|
@ -48,6 +48,15 @@ aarch-common.o: $(srcdir)/config/arm/aarch-common.c $(CONFIG_H) $(SYSTEM_H) \
|
||||
$(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
|
||||
$(srcdir)/config/arm/aarch-common.c
|
||||
|
||||
cortex-a57-fma-steering.o: $(srcdir)/config/aarch64/cortex-a57-fma-steering.c \
|
||||
$(CONFIG_H) $(SYSTEM_H) $(TM_H) $(REGS_H) insn-config.h $(RTL_BASE_H) \
|
||||
dominance.h cfg.h cfganal.h $(BASIC_BLOCK_H) $(INSN_ATTR_H) $(RECOG_H) \
|
||||
output.h hash-map.h $(DF_H) $(OBSTACK_H) $(TARGET_H) $(RTL_H) \
|
||||
$(CONTEXT_H) $(TREE_PASS_H) regrename.h \
|
||||
$(srcdir)/config/aarch64/cortex-a57-fma-steering.h
|
||||
$(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
|
||||
$(srcdir)/config/aarch64/cortex-a57-fma-steering.c
|
||||
|
||||
comma=,
|
||||
MULTILIB_OPTIONS = $(subst $(comma),/, $(patsubst %, mabi=%, $(subst $(comma),$(comma)mabi=,$(TM_MULTILIB_CONFIG))))
|
||||
MULTILIB_DIRNAMES = $(subst $(comma), ,$(TM_MULTILIB_CONFIG))
|
||||
|
Loading…
Reference in New Issue
Block a user