On Fri, May 10, 2013 at 11:51 PM, Mike Stump wrote:
> I have a instruction pattern for my port that reads in part:
>
> [(parallel [(set (subreg:DI (match_operand:TI 0 "register_operand" "=r") 0)
> (mem:DI (plus:DI (match_operand:DI 1 "register_operand"
> "r")
> (match_operand:DI 2 "const_int_operand"
> ""))))
> (set (subreg:DI (match_dup 0) 8)
> (mem:DI (plus:DI (match_dup 1)
> (match_operand:DI 3
> "const_int_operand"))))])]
>
> The subreg seems to give web.c fits. web is looking for the match_dup and
> failing to find it, due to the fact that DF_REF_LOC is of the form (subreg:DI
> (reg:TI 5) 8), not (reg:TI 5). If I add a case for SUBREG like in the below,
> we can then find and process the subreg.
>
> So, the question is, is the port completely wrong for trying to use subreg in
> this fashion? If not, is processing subregs in this way the right way? If
> yes, Ok?
I don't think this port is completely wrong. I've looked at some other
ports and there are comparable patterns, e.g. in m68k:
;; We need a separate DEFINE_EXPAND for u?mulsidi3 to be able to use the
;; proper matching constraint. This is because the matching is between
;; the high-numbered word of the DImode operand[0] and operand[1].
(define_expand "umulsidi3"
[(parallel
[(set (subreg:SI (match_operand:DI 0 "register_operand" "") 4)
(mult:SI (match_operand:SI 1 "register_operand" "")
(match_operand:SI 2 "register_operand" "")))
(set (subreg:SI (match_dup 0) 0)
(truncate:SI (lshiftrt:DI (mult:DI (zero_extend:DI (match_dup 1))
(zero_extend:DI (match_dup 2)))
(const_int 32))))])]
"TARGET_68020 && !TUNE_68060 && !TARGET_COLDFIRE"
"")
Your web.c patch looks correct to me, but I can't approve it.
Ciao!
Steven