aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJozef Lawrynowicz <jozef.l@mittosystems.com>2019-10-30 14:01:12 +0000
committerJozef Lawrynowicz <jozefl@gcc.gnu.org>2019-10-30 14:01:12 +0000
commit0149b1b4d7f0d3456e77c036a56c7003ca8a1b64 (patch)
treec51c5ea93982819333f75bf3d235c56192f090a8 /gcc
parentd7caa12927dff2ff9c5dd60dd38fb833066afdf6 (diff)
downloadgcc-0149b1b4d7f0d3456e77c036a56c7003ca8a1b64.zip
gcc-0149b1b4d7f0d3456e77c036a56c7003ca8a1b64.tar.gz
gcc-0149b1b4d7f0d3456e77c036a56c7003ca8a1b64.tar.bz2
msp430.c (msp430_check_index_not_high_mem): New.
gcc/ChangeLog: 2019-10-30 Jozef Lawrynowicz <jozef.l@mittosystems.com> * config/msp430/msp430.c (msp430_check_index_not_high_mem): New. (msp430_check_plus_not_high_mem): New. (msp430_op_not_in_high_mem): Use new functions to check if the operand might be in low memory. Indicate that a 16-bit absolute address is in lower memory. gcc/testsuite/ChangeLog: 2019-10-30 Jozef Lawrynowicz <jozef.l@mittosystems.com> * gcc.target/msp430/mlarge-use-430-insn.c: New test. From-SVN: r277623
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/config/msp430/msp430.c43
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.target/msp430/mlarge-use-430-insn.c33
4 files changed, 82 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b48bb4d..7b90915 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2019-10-30 Jozef Lawrynowicz <jozef.l@mittosystems.com>
+
+ * config/msp430/msp430.c (msp430_check_index_not_high_mem): New.
+ (msp430_check_plus_not_high_mem): New.
+ (msp430_op_not_in_high_mem): Use new functions to check if the operand
+ might be in low memory.
+ Indicate that a 16-bit absolute address is in lower memory.
+
2019-10-30 Martin Jambor <mjambor@suse.cz>
* ipa-prop.c (ipa_compute_jump_functions_for_bb): Fix the call to
diff --git a/gcc/config/msp430/msp430.c b/gcc/config/msp430/msp430.c
index fe1fcc0..a3d0d9c 100644
--- a/gcc/config/msp430/msp430.c
+++ b/gcc/config/msp430/msp430.c
@@ -3232,10 +3232,37 @@ msp430_print_operand_addr (FILE * file, machine_mode /*mode*/, rtx addr)
msp430_print_operand_raw (file, addr);
}
+/* We can only allow signed 15-bit indexes i.e. +/-32K. */
+static bool
+msp430_check_index_not_high_mem (rtx op)
+{
+ if (CONST_INT_P (op)
+ && IN_RANGE (INTVAL (op), HOST_WIDE_INT_M1U << 15, (1 << 15) - 1))
+ return true;
+ return false;
+}
+
+/* If this returns true, we don't need a 430X insn. */
+static bool
+msp430_check_plus_not_high_mem (rtx op)
+{
+ if (GET_CODE (op) != PLUS)
+ return false;
+ rtx op0 = XEXP (op, 0);
+ rtx op1 = XEXP (op, 1);
+ if (SYMBOL_REF_P (op0)
+ && (SYMBOL_REF_FLAGS (op0) & SYMBOL_FLAG_LOW_MEM)
+ && msp430_check_index_not_high_mem (op1))
+ return true;
+ return false;
+}
+
/* Determine whether an RTX is definitely not a MEM referencing an address in
the upper memory region. Returns true if we've decided the address will be
in the lower memory region, or the RTX is not a MEM. Returns false
- otherwise. */
+ otherwise.
+ The Ys constraint will catch (mem (plus (const/reg)) but we catch cases
+ involving a symbol_ref here. */
bool
msp430_op_not_in_high_mem (rtx op)
{
@@ -3251,11 +3278,15 @@ msp430_op_not_in_high_mem (rtx op)
memory. */
return true;
- /* Catch (mem (const (plus ((symbol_ref) (const_int))))) e.g. &addr+2. */
- if ((GET_CODE (op0) == CONST)
- && (GET_CODE (XEXP (op0, 0)) == PLUS)
- && (SYMBOL_REF_P (XEXP (XEXP (op0, 0), 0)))
- && (SYMBOL_REF_FLAGS (XEXP (XEXP (op0, 0), 0)) & SYMBOL_FLAG_LOW_MEM))
+ /* Check possibilites for (mem (plus)).
+ e.g. (mem (const (plus ((symbol_ref) (const_int))))) : &addr+2. */
+ if (msp430_check_plus_not_high_mem (op0)
+ || ((GET_CODE (op0) == CONST)
+ && msp430_check_plus_not_high_mem (XEXP (op0, 0))))
+ return true;
+
+ /* An absolute 16-bit address is allowed. */
+ if ((CONST_INT_P (op0) && (IN_RANGE (INTVAL (op0), 0, (1 << 16) - 1))))
return true;
/* Return false when undecided. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 10cf941..889e33b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2019-10-30 Jozef Lawrynowicz <jozef.l@mittosystems.com>
+
+ * gcc.target/msp430/mlarge-use-430-insn.c: New test.
+
2019-10-30 Richard Biener <rguenther@suse.de>
PR tree-optimization/92275
diff --git a/gcc/testsuite/gcc.target/msp430/mlarge-use-430-insn.c b/gcc/testsuite/gcc.target/msp430/mlarge-use-430-insn.c
new file mode 100644
index 0000000..efa598b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/msp430/mlarge-use-430-insn.c
@@ -0,0 +1,33 @@
+/* { dg-do compile } */
+/* { dg-skip-if "" { *-*-* } { "-mcpu=msp430" "-mcpu=430" "-msmall" } { "" } } */
+/* { dg-options "-mlarge -O1" } */
+/* { dg-final { check-function-bodies "**" "" } } */
+
+/* Test to verify cases where we can use a 430 insn even in the large memory
+ model. */
+
+int foo[2];
+
+/*
+** func: { target msp430_region_lower }
+** ...
+** MOV.W #-4088, &foo
+** MOV.W #-8531, &40960
+** MOVX.W #-16657, &106496
+** ...
+*/
+/*
+** func: { target msp430_region_not_lower }
+** ...
+** MOVX.W #-4088, &foo
+** MOV.W #-8531, &40960
+** MOVX.W #-16657, &106496
+** ...
+*/
+void
+func (void)
+{
+ foo[0] = 0xF008;
+ (*(int *)0xA000) = 0xDEAD;
+ (*(int *)0x1A000) = 0xBEEF;
+}