Commit 947255ed by Richard Henderson Committed by Richard Henderson

* stmt.c (expand_asm_operands): Reload in-out reg-only memory operands.

From-SVN: r26628
parent 7e4e2d26
Sun Apr 25 23:03:32 1999 Richard Henderson <rth@cygnus.com>
* stmt.c (expand_asm_operands): Reload in-out reg-only memory operands.
Sun Apr 25 13:06:13 1999 Richard Henderson <rth@cygnus.com> Sun Apr 25 13:06:13 1999 Richard Henderson <rth@cygnus.com>
* function.c (assign_parms/STACK_BYTES): Revert last change, * function.c (assign_parms/STACK_BYTES): Revert last change,
......
...@@ -1183,6 +1183,7 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line) ...@@ -1183,6 +1183,7 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
/* Vector of RTX's of evaluated output operands. */ /* Vector of RTX's of evaluated output operands. */
rtx *output_rtx = (rtx *) alloca (noutputs * sizeof (rtx)); rtx *output_rtx = (rtx *) alloca (noutputs * sizeof (rtx));
int *inout_opnum = (int *) alloca (noutputs * sizeof (int)); int *inout_opnum = (int *) alloca (noutputs * sizeof (int));
rtx *real_output_rtx = (rtx *) alloca (noutputs * sizeof (rtx));
enum machine_mode *inout_mode enum machine_mode *inout_mode
= (enum machine_mode *) alloca (noutputs * sizeof (enum machine_mode)); = (enum machine_mode *) alloca (noutputs * sizeof (enum machine_mode));
/* The insn we have emitted. */ /* The insn we have emitted. */
...@@ -1360,6 +1361,7 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line) ...@@ -1360,6 +1361,7 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
Make the asm insn write into that, then our caller will copy it to Make the asm insn write into that, then our caller will copy it to
the real output operand. Likewise for promoted variables. */ the real output operand. Likewise for promoted variables. */
real_output_rtx[i] = NULL_RTX;
if ((TREE_CODE (val) == INDIRECT_REF if ((TREE_CODE (val) == INDIRECT_REF
&& allows_mem) && allows_mem)
|| (TREE_CODE_CLASS (TREE_CODE (val)) == 'd' || (TREE_CODE_CLASS (TREE_CODE (val)) == 'd'
...@@ -1379,7 +1381,12 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line) ...@@ -1379,7 +1381,12 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
if (! allows_reg && GET_CODE (output_rtx[i]) != MEM) if (! allows_reg && GET_CODE (output_rtx[i]) != MEM)
error ("output number %d not directly addressable", i); error ("output number %d not directly addressable", i);
if (! allows_mem && GET_CODE (output_rtx[i]) == MEM) if (! allows_mem && GET_CODE (output_rtx[i]) == MEM)
error ("output number %d not restored to memory", i); {
real_output_rtx[i] = protect_from_queue (output_rtx[i], 1);
output_rtx[i] = gen_reg_rtx (GET_MODE (output_rtx[i]));
if (is_inout)
emit_move_insn (output_rtx[i], real_output_rtx[i]);
}
} }
else else
{ {
...@@ -1662,6 +1669,12 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line) ...@@ -1662,6 +1669,12 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
insn = emit_insn (body); insn = emit_insn (body);
} }
/* For any outputs that needed reloading into registers, spill them
back to where they belong. */
for (i = 0; i < noutputs; ++i)
if (real_output_rtx[i])
emit_move_insn (real_output_rtx[i], output_rtx[i]);
free_temp_slots (); free_temp_slots ();
} }
......
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