Commit 0149b1b4 by Jozef Lawrynowicz Committed by Jozef Lawrynowicz

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
parent d7caa129
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> 2019-10-30 Martin Jambor <mjambor@suse.cz>
* ipa-prop.c (ipa_compute_jump_functions_for_bb): Fix the call to * ipa-prop.c (ipa_compute_jump_functions_for_bb): Fix the call to
...@@ -3232,10 +3232,37 @@ msp430_print_operand_addr (FILE * file, machine_mode /*mode*/, rtx addr) ...@@ -3232,10 +3232,37 @@ msp430_print_operand_addr (FILE * file, machine_mode /*mode*/, rtx addr)
msp430_print_operand_raw (file, 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 /* 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 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 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 bool
msp430_op_not_in_high_mem (rtx op) msp430_op_not_in_high_mem (rtx op)
{ {
...@@ -3251,11 +3278,15 @@ msp430_op_not_in_high_mem (rtx op) ...@@ -3251,11 +3278,15 @@ msp430_op_not_in_high_mem (rtx op)
memory. */ memory. */
return true; return true;
/* Catch (mem (const (plus ((symbol_ref) (const_int))))) e.g. &addr+2. */ /* Check possibilites for (mem (plus)).
if ((GET_CODE (op0) == CONST) e.g. (mem (const (plus ((symbol_ref) (const_int))))) : &addr+2. */
&& (GET_CODE (XEXP (op0, 0)) == PLUS) if (msp430_check_plus_not_high_mem (op0)
&& (SYMBOL_REF_P (XEXP (XEXP (op0, 0), 0))) || ((GET_CODE (op0) == CONST)
&& (SYMBOL_REF_FLAGS (XEXP (XEXP (op0, 0), 0)) & SYMBOL_FLAG_LOW_MEM)) && 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 true;
/* Return false when undecided. */ /* Return false when undecided. */
......
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> 2019-10-30 Richard Biener <rguenther@suse.de>
PR tree-optimization/92275 PR tree-optimization/92275
......
/* { 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;
}
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