Commit 05702110 by Andreas Krebbel Committed by Andreas Krebbel

S/390 Fix secondary reload issue with store/load relative operands.

We need a scratch register for loading from or storing to a symbolic
memory reference where we cannot use the load/store relative
instructions for.  However, the check currently fails to handle
floating point modes in GPRs correctly.

gcc/
	* config/s390/s390.c (s390_secondary_reload): Fix check for
          load/store relative.

From-SVN: r223368
parent 376ee136
2015-05-19 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
* config/s390/s390.c (s390_secondary_reload): Fix check for
load/store relative.
2015-05-19 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
* recog.h: Increase MAX_RECOG_ALTERNATIVES. Change type of
alternative_mask to uint64_t.
......
......@@ -3141,17 +3141,15 @@ s390_secondary_reload (bool in_p, rtx x, reg_class_t rclass_i,
sri->icode = ((mode == DImode) ? CODE_FOR_reloaddi_larl_odd_addend_z10
: CODE_FOR_reloadsi_larl_odd_addend_z10);
/* On z10 we need a scratch register when moving QI, TI or floating
point mode values from or to a memory location with a SYMBOL_REF
or if the symref addend of a SI or DI move is not aligned to the
width of the access. */
/* Handle all the (mem (symref)) accesses we cannot use the z10
instructions for. */
if (MEM_P (x)
&& s390_loadrelative_operand_p (XEXP (x, 0), NULL, NULL)
&& (mode == QImode || mode == TImode || FLOAT_MODE_P (mode)
|| (!TARGET_ZARCH && mode == DImode)
|| ((mode == HImode || mode == SImode || mode == DImode)
&& (!s390_check_symref_alignment (XEXP (x, 0),
GET_MODE_SIZE (mode))))))
&& (mode == QImode
|| !reg_classes_intersect_p (GENERAL_REGS, rclass)
|| GET_MODE_SIZE (mode) > UNITS_PER_WORD
|| !s390_check_symref_alignment (XEXP (x, 0),
GET_MODE_SIZE (mode))))
{
#define __SECONDARY_RELOAD_CASE(M,m) \
case M##mode: \
......
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