Module Name: src
Committed By: rin
Date: Sat Oct 7 11:57:56 UTC 2023
Modified Files:
src/external/gpl3/gcc.old/dist/gcc/config/vax: vax.c
Log Message:
gcc.old: vax: PR port-vax/57646 patch provided by Kalvis Duckmanton [3/21]
Reduce expressions specifying an address of a 64 bit quantity to
a sequence of assignments to temporary variables; this allows virtual
registers to be inst antiated properly.
To generate a diff of this commit:
cvs rdiff -u -r1.14 -r1.15 \
src/external/gpl3/gcc.old/dist/gcc/config/vax/vax.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/external/gpl3/gcc.old/dist/gcc/config/vax/vax.c
diff -u src/external/gpl3/gcc.old/dist/gcc/config/vax/vax.c:1.14 src/external/gpl3/gcc.old/dist/gcc/config/vax/vax.c:1.15
--- src/external/gpl3/gcc.old/dist/gcc/config/vax/vax.c:1.14 Sat Oct 7 11:57:27 2023
+++ src/external/gpl3/gcc.old/dist/gcc/config/vax/vax.c Sat Oct 7 11:57:56 2023
@@ -2050,6 +2050,46 @@ vax_mode_dependent_address_p (const_rtx
}
static rtx
+decompose_address_operand(rtx addr)
+{
+ enum rtx_code code = GET_CODE (addr);
+
+ switch (code)
+ {
+ case CONST:
+ return decompose_address_operand (XEXP (addr, 0));
+ case PLUS:
+ case MULT:
+ {
+ rtx op0, op1;
+ rtx temp;
+ /*
+ * Generate a temporary register, assign the result of
+ * decomposing op0 to it, then generate an op code opping (PLUS
+ * or MULT) the result of decomposing op1 to it.
+ * Return the temporary register.
+ */
+ temp = gen_reg_rtx (Pmode);
+ op0 = decompose_address_operand (XEXP (addr, 0));
+ op1 = decompose_address_operand (XEXP (addr, 1));
+
+ emit_move_insn (temp, op0);
+
+ if (code == PLUS)
+ temp = gen_rtx_PLUS (Pmode, temp, op1);
+ else if (code == MULT)
+ temp = gen_rtx_MULT (Pmode, temp, op1);
+
+ return temp;
+ }
+ break;
+ default:
+ break;
+ }
+ return addr;
+}
+
+static rtx
fixup_mathdi_operand (rtx x, machine_mode mode)
{
if (illegal_addsub_di_memory_operand (x, mode))
@@ -2064,7 +2104,7 @@ fixup_mathdi_operand (rtx x, machine_mod
addr = XEXP (XEXP (addr, 0), 0);
}
#endif
- emit_move_insn (temp, addr);
+ emit_move_insn (temp, decompose_address_operand (addr));
if (offset)
temp = gen_rtx_PLUS (Pmode, temp, offset);
x = gen_rtx_MEM (DImode, temp);