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 . 

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. 

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.
-- 
Ramana Radhakrishnan
GNU Tools
codito ergo sum (http://www.codito.com)


Reply via email to