On Thu, 2006-04-13 at 22:37 +0530, Ramana Radhakrishnan wrote:
> Right : A way to work around this would be to hold to not match this
> instruction until reload has been completed and have a define_split to
> convert this to a cmp , bne when its a memory operand matching . Look at
> rs6000.md or mt.md for a sample implementation.
>
> What I am saying is the following.
>
> 1. Add an extra scratch register with a clobber pattern in your bcounter
> insn .
>
> 2. Have a define_insn which matches this if the 'q' register could be
> given for this .
Oh I meant to say match the insn only after reload_completed .Add
"reload_completed" to your bcounter pattern.
>
> 3. Have a define_split pattern for the case where your first operand is
> a memory_operand in which case you take care of loading this into a
> register and then generate equivalent cmp and jmp instructions.
Do this split after reload_completed.
>
> My 2 cents .
>
> HTH
>
> cheers
> Ramana
>
> On Thu, 2006-04-13 at 21:17 +0800, Ching-Hua Chang wrote:
> > Hi,
> > I had wrote doloop_end instruction to support hwloop.
> > When try to compile linux kernel, I meet a reload problem,
> > the error message as follow.
> >
> > What kinds of instuction pattern should I add to support
> > the reload that compiler need ?
> >
> > Thanks,
> > Aladdin
> >
> >
> > the constrant 'q' mean the non-general "counter" register
> > ========================================================
> > (define_expand "doloop_end"
> > [(use (match_operand:SI 0 "register_operand" ""))
> > (use (match_operand:SI 1 "const_int_operand" ""))
> > (use (match_operand:SI 2 "const_int_operand" ""))
> > (use (match_operand:SI 3 "const_int_operand" ""))
> > (use (label_ref (match_operand 4 "" "")))]
> > ""
> > {
> > if(operands[3] != const1_rtx || flag_unroll_loops ||
> > flag_unroll_all_loops)
> > FAIL;
> > emit_jump_insn(gen_bcounter(operands[0], operands[4]));
> > DONE;
> > })
> >
> > (define_insn "bcounter"
> > [(set(pc) (if_then_else
> > (ge (match_operand:SI 0 "register_operand" "=q") (const_int
> > 0))
> > (label_ref (match_operand 1 "" ""))
> > (pc)))
> > (set(match_dup 0)
> > (plus:SI (match_dup 0)
> > (const_int -1)))]
> > ""
> > "bcnz %1"
> > [(set_attr "type" "branch")])
> >
> >
> > Error message
> > ===================================================================
> > panic.c: In function `panic':
> > panic.c:104: error: unable to generate reloads for:
> > (jump_insn 222 152 158 7 (parallel [
> > (set (pc)
> > (if_then_else (ge (reg:SI 5 r5 [orig:199 msec ] [199])
> > (const_int 0 [0x0]))
> > (label_ref 224)
> > (pc)))
> > (set (reg:SI 5 r5 [orig:199 msec ] [199])
> > (plus:SI (reg:SI 5 r5 [orig:199 msec ] [199])
> > (const_int -1 [0xffffffff])))
> > ]) 0 {bcounter} (nil)
> > (expr_list:REG_BR_PROB (const_int 8900 [0x22c4])
> > (nil)))
> > panic.c:104: internal compiler error: in find_reloads, at reload.c:3672
> > Please submit a full bug report,
> > with preprocessed source if appropriate.
> > See <URL:http://gcc.gnu.org/bugs.html> for instructions.