Hello, gcc

I think it's very interesting. I want to split a insn of loading SF
data through SI symbol, such as (set (reg:SF 5 $5) (mem/u/f:SF
(symbol_ref/u:SI ("*$LC0")))).
I want to it firstly load the address into a register, then load the
data through
the register. So I define the insn as follows,
  (define_insn "loadsf"
  [(set (match_operand:SF 0 "register_operand" "=r")
        (mem:SF (match_operand:SI 1 "immediate_operand" "m")))]
  ""
  {
    operands[1] = force_reg (SImode, operands[1]);
    return md_output_move (operands[0], operands[1]);
  }
  [(set_attr "type"     "load")
   (set_attr "mode"     "SF")
   (set_attr "length"   "*")])

  But the gcc will come out such error,
  internal compiler error: in gen_reg_rtx,  at emit-rtl.c:819.

  Which is the codes as following at emit-rtl.c:819,
   /* Don't let anything called after initial flow analysis create new
     registers.  */
  if (no_new_pseudos)
    abort ();

  Why can't I create a new register? So how should I do to implement it?

  Thanks for your help time after time.
  Eric.

Reply via email to