On 06/30/2010 05:06 AM, M. -Eqbal Maraqa wrote:
> f1.c:5:1: error: unrecognizable insn:
> (insn 12 11 13 3 f1.c:4
> (set (mem/c/i:SI (reg/f:SI 23 [ D.1964 ]) [0 <retval>+0 S4 A32])
> (mem/c/i:SI (plus:SI (reg/f:SI 19 virtual-stack-vars)
> (const_int -4 [0xfffffffffffffffc]))
> [0 tmp+0 S4 A32])) -1 (nil))
I strongly suspect that your movsi expander is incorrect.
> This is the call_value implementation in .md:
>
> (define_expand "call_value"
> [(parallel [(set (match_operand 0 "register_operand" "")
> (call (match_operand 1 "general_operand" "")
> (match_operand 2 "")))
> (clobber (reg:SI RETURN_ADDR_REGNUM))])]
> ""
> {
> rtx dest = XEXP(operands[1], 0);
>
> if(!call_operand(dest, Pmode))
> dest = force_reg(Pmode, dest);
>
> emit_call_insn(gen_call_value_internal(operands[0], dest, operands[2]));
> DONE;
> })
>
> (define_insn "call_value_internal"
> [(parallel [(set (match_operand 0 "register_operand" "")
> (call (match_operand 1 "general_operand" "")
> (match_operand 2 "")))
> (clobber (reg:SI RETURN_ADDR_REGNUM))])]
>
> ""
> "bal\t%1")
You've missed that the operand to call is always a mem. Most
ports look through this mem immediately, e.g.
(call (mem (match_operand:P 1 "register_operand" "r"))
(match_operand 2 ""))
Have another look at how the other ports expand and implement call.
r~