aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Filippov <jcmvbkbc@gmail.com>2017-06-14 17:19:44 +0000
committerMax Filippov <jcmvbkbc@gcc.gnu.org>2017-06-14 17:19:44 +0000
commit1a711a0b5cb291d875acc4b46a4a39ea9185eff3 (patch)
treed2e9392c022dcd73efccb21c1b22c8a1bcee4d11
parente72c4afd99c06e29b4f73f61ee0ff9091bf7fa02 (diff)
downloadgcc-1a711a0b5cb291d875acc4b46a4a39ea9185eff3.zip
gcc-1a711a0b5cb291d875acc4b46a4a39ea9185eff3.tar.gz
gcc-1a711a0b5cb291d875acc4b46a4a39ea9185eff3.tar.bz2
gcc: xtensa: allow XCHAL_* macros to be non-constant
XCHAL_* macros from the xtensa-config.h are used in a number of places that require them to be preprocessor constants. Rewrite these places so that non-constant XCHAL_* definitions could be used there. 2017-06-14 Max Filippov <jcmvbkbc@gmail.com> gcc/ * config/xtensa/xtensa.c (xtensa_option_override): Append MASK_CONST16 to target_flags in the absence of TARGET_L32R. (hwloop_optimize, hwloop_fail, hwloop_pattern_reg, xtensa_doloop_hooks): Define unconditionally. (xtensa_reorg_loops): Only call reorg_loops in the presence of TARGET_LOOPS. * config/xtensa/xtensa.h (TARGET_L32R): New definition. (TARGET_DEFAULT): Remove XCHAL_HAVE_L32R condition and account for it in xtensa_option_override. (HARD_FRAME_POINTER_IS_FRAME_POINTER, HARD_FRAME_POINTER_IS_ARG_POINTER): New definitions. From-SVN: r249202
-rw-r--r--gcc/ChangeLog14
-rw-r--r--gcc/config/xtensa/xtensa.c18
-rw-r--r--gcc/config/xtensa/xtensa.h11
3 files changed, 31 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2987e5e..09435d0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,17 @@
+2017-06-14 Max Filippov <jcmvbkbc@gmail.com>
+
+ * config/xtensa/xtensa.c (xtensa_option_override): Append
+ MASK_CONST16 to target_flags in the absence of TARGET_L32R.
+ (hwloop_optimize, hwloop_fail, hwloop_pattern_reg,
+ xtensa_doloop_hooks): Define unconditionally.
+ (xtensa_reorg_loops): Only call reorg_loops in the presence of
+ TARGET_LOOPS.
+ * config/xtensa/xtensa.h (TARGET_L32R): New definition.
+ (TARGET_DEFAULT): Remove XCHAL_HAVE_L32R condition and account
+ for it in xtensa_option_override.
+ (HARD_FRAME_POINTER_IS_FRAME_POINTER,
+ HARD_FRAME_POINTER_IS_ARG_POINTER): New definitions.
+
2017-06-14 Boris Kolpackov <boris@codesynthesis.com>
* doc/cppopts.texi: Document '-' special value to -MF.
diff --git a/gcc/config/xtensa/xtensa.c b/gcc/config/xtensa/xtensa.c
index 16f8311..cf9a3a7 100644
--- a/gcc/config/xtensa/xtensa.c
+++ b/gcc/config/xtensa/xtensa.c
@@ -2182,6 +2182,13 @@ xtensa_option_override (void)
int regno;
machine_mode mode;
+ /* Use CONST16 in the absence of L32R.
+ Set it in the TARGET_OPTION_OVERRIDE to avoid dependency on xtensa
+ configuration in the xtensa-common.c */
+
+ if (!TARGET_L32R)
+ target_flags |= MASK_CONST16;
+
if (!TARGET_BOOLEANS && TARGET_HARD_FLOAT)
error ("boolean registers required for the floating-point option");
@@ -4078,8 +4085,6 @@ xtensa_invalid_within_doloop (const rtx_insn *insn)
/* Optimize LOOP. */
-#if TARGET_LOOPS
-
static bool
hwloop_optimize (hwloop_info loop)
{
@@ -4266,14 +4271,9 @@ static struct hw_doloop_hooks xtensa_doloop_hooks =
static void
xtensa_reorg_loops (void)
{
- reorg_loops (false, &xtensa_doloop_hooks);
-}
-#else
-static inline void
-xtensa_reorg_loops (void)
-{
+ if (TARGET_LOOPS)
+ reorg_loops (false, &xtensa_doloop_hooks);
}
-#endif
/* Implement the TARGET_MACHINE_DEPENDENT_REORG pass. */
diff --git a/gcc/config/xtensa/xtensa.h b/gcc/config/xtensa/xtensa.h
index 08457a4..06dc82c 100644
--- a/gcc/config/xtensa/xtensa.h
+++ b/gcc/config/xtensa/xtensa.h
@@ -66,10 +66,9 @@ along with GCC; see the file COPYING3. If not see
#define TARGET_LOOPS XCHAL_HAVE_LOOPS
#define TARGET_WINDOWED_ABI (XSHAL_ABI == XTHAL_ABI_WINDOWED)
#define TARGET_DEBUG XCHAL_HAVE_DEBUG
+#define TARGET_L32R XCHAL_HAVE_L32R
-#define TARGET_DEFAULT \
- ((XCHAL_HAVE_L32R ? 0 : MASK_CONST16) | \
- MASK_SERIALIZE_VOLATILE)
+#define TARGET_DEFAULT (MASK_SERIALIZE_VOLATILE)
#ifndef HAVE_AS_TLS
#define HAVE_AS_TLS 0
@@ -362,6 +361,12 @@ extern char xtensa_hard_regno_mode_ok[][FIRST_PSEUDO_REGISTER];
/* Base register for access to arguments of the function. */
#define ARG_POINTER_REGNUM (GP_REG_FIRST + 17)
+/* Hard frame pointer is neither frame nor arg pointer.
+ The definitions are here because actual hard frame pointer register
+ definition is not a preprocessor constant. */
+#define HARD_FRAME_POINTER_IS_FRAME_POINTER 0
+#define HARD_FRAME_POINTER_IS_ARG_POINTER 0
+
/* For now we don't try to use the full set of boolean registers. Without
software pipelining of FP operations, there's not much to gain and it's
a real pain to get them reloaded. */