summaryrefslogtreecommitdiff
path: root/gcc/stmt.c
diff options
context:
space:
mode:
authorgeoffk <geoffk@138bc75d-0d04-0410-961f-82ee72b054a4>2000-09-01 01:03:29 +0000
committergeoffk <geoffk@138bc75d-0d04-0410-961f-82ee72b054a4>2000-09-01 01:03:29 +0000
commit316bc009df44b63977cb0f1e4a51678920a6e8f3 (patch)
tree72e5e800965de1a0aefec76ff7020c0d0810bdc1 /gcc/stmt.c
parente424e632b56a0536f9a4ee300716fc05e07cf48d (diff)
downloadgcc-316bc009df44b63977cb0f1e4a51678920a6e8f3.tar.gz
* stmt.c (expand_asm_operands): Twiddle generating_concat_p
so that CONCATs are not generated for ASMs. * emit-rtl.c (gen_reg_rtx): Don't generate CONCATs when not generating_concat_p. * function.c (pop_function_context_from): Reset generating_concat_p. (prepare_function_start): Likewise. * rtl.c (generating_concat_p): Define. * rtl.h (generating_concat_p): Declare. * toplev.c (rest_of_compilation): No CONCATs after RTL generation. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@36088 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/stmt.c')
-rw-r--r--gcc/stmt.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/gcc/stmt.c b/gcc/stmt.c
index af4c08f293f..f2763e7396f 100644
--- a/gcc/stmt.c
+++ b/gcc/stmt.c
@@ -1330,6 +1330,7 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
= (enum machine_mode *) alloca (noutputs * sizeof (enum machine_mode));
/* The insn we have emitted. */
rtx insn;
+ int old_generating_concat_p = generating_concat_p;
/* An ASM with no outputs needs to be treated as volatile, for now. */
if (noutputs == 0)
@@ -1537,6 +1538,8 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
Make the asm insn write into that, then our caller will copy it to
the real output operand. Likewise for promoted variables. */
+ generating_concat_p = 0;
+
real_output_rtx[i] = NULL_RTX;
if ((TREE_CODE (val) == INDIRECT_REF
&& allows_mem)
@@ -1556,7 +1559,8 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
if (! allows_reg && GET_CODE (output_rtx[i]) != MEM)
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)
+ || GET_CODE (output_rtx[i]) == CONCAT)
{
real_output_rtx[i] = protect_from_queue (output_rtx[i], 1);
output_rtx[i] = gen_reg_rtx (GET_MODE (output_rtx[i]));
@@ -1570,6 +1574,8 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
TREE_VALUE (tail) = make_tree (type, output_rtx[i]);
}
+ generating_concat_p = old_generating_concat_p;
+
if (is_inout)
{
inout_mode[ninout] = TYPE_MODE (TREE_TYPE (TREE_VALUE (tail)));
@@ -1727,6 +1733,11 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
op = expand_expr (TREE_VALUE (tail), NULL_RTX, VOIDmode, 0);
+ /* Never pass a CONCAT to an ASM. */
+ generating_concat_p = 0;
+ if (GET_CODE (op) == CONCAT)
+ op = force_reg (GET_MODE (op), op);
+
if (asm_operand_ok (op, constraint) <= 0)
{
if (allows_reg)
@@ -1759,6 +1770,7 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
not satisfied. */
warning ("asm operand %d probably doesn't match constraints", i);
}
+ generating_concat_p = old_generating_concat_p;
XVECEXP (body, 3, i) = op;
XVECEXP (body, 4, i) /* constraints */
@@ -1770,6 +1782,8 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
/* Protect all the operands from the queue now that they have all been
evaluated. */
+ generating_concat_p = 0;
+
for (i = 0; i < ninputs - ninout; i++)
XVECEXP (body, 3, i) = protect_from_queue (XVECEXP (body, 3, i), 0);
@@ -1787,6 +1801,8 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
= gen_rtx_ASM_INPUT (inout_mode[i], digit_strings[j]);
}
+ generating_concat_p = old_generating_concat_p;
+
/* Now, for each output, construct an rtx
(set OUTPUT (asm_operands INSN OUTPUTNUMBER OUTPUTCONSTRAINT
ARGVEC CONSTRAINTS))