This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Emit insns in the preparation statements of define_expand
- From: Eric Fisher <joefoxreal at gmail dot com>
- To: gcc at gcc dot gnu dot org
- Date: Thu, 27 Oct 2005 15:39:33 +0800
- Subject: Emit insns in the preparation statements of define_expand
Hello,
I have a doubt here about define_expand and would be appreciated for
your any help. The internals say,
Usually these statements prepare temporary registers for use as
internal operands in the RTL template, but they can also generate RTL
insns directly by calling routines such as emit_insn, etc. Any such
insns precede the ones that come from the RTL template.
Well, here is the codes from mips_legitimize_move function in mips.c.
if (!register_operand (dest, mode) && !register_operand (src, mode))
{
emit_move_insn (dest, force_reg (mode, src));
return true;
}
Here is from mips.md,
(define_expand "movsi"
[(set (match_operand:SI 0 "nonimmediate_operand" "")
(match_operand:SI 1 "" ""))]
""
{
if (mips_legitimize_move (SImode, operands[0], operands[1]))
DONE;
...
}
I think the function is to guarantee that there is at least one
register operand.
So if it's not, it will firstly load src into a register. But I think
it will be enough
for the function to just load src into a register. That is to say the
code should
be
if (!register_operand (dest, mode) && !register_operand (src, mode))
{
src=force_reg (mode, src);
return true;
}
I think since emit_move_insn (dest, force_reg (mode, src)) precedes
the rtl template
[(set (match_operand:SI 0 "nonimmediate_operand" "")
(match_operand:SI 1 "" ""))]
Then they are overlapped. There will be two move insns.
Thanks.
Eric.