> "Paulo J. Matos" <[email protected]> writes:
> 
> > On 04/05/12 19:48, Ian Lance Taylor wrote:
> >
> >> The i386 rep_movqi insn is an example:
> >>
> >> (define_insn "*rep_movqi"
> >>    [(set (match_operand:P 2 "register_operand" "=c") (const_int 0))
> >>     (set (match_operand:P 0 "register_operand" "=D")
> >>          (plus:P (match_operand:P 3 "register_operand" "0")
> >>            (match_operand:P 5 "register_operand" "2")))
> >>     (set (match_operand:P 1 "register_operand" "=S")
> >>          (plus:P (match_operand:P 4 "register_operand" "1") (match_dup 5)))
> >>     (set (mem:BLK (match_dup 3))
> >>    (mem:BLK (match_dup 4)))
> >>     (use (match_dup 5))]
> >>    "!(fixed_regs[CX_REG] || fixed_regs[SI_REG] || fixed_regs[DI_REG])"
> >>    "%^rep{%;} movsb"
> >>    [(set_attr "type" "str")
> >>     (set_attr "prefix_rep" "1")
> >>     (set_attr "memory" "both")
> >>     (set_attr "mode" "QI")])
> >>
> >
> > Thanks for the discussion on this which was enlightening.
> > The rep_movqi rule seems scarily like our block copy instruction.
> > By looking at it, the question that arises is, why the (use (match_dup
> > 5))? I thought this was used to tell gcc that an operand was going to
> > be used in a way not specified by the rtl but operand 5 is specified
> > elsewhere in the rtl so gcc doesn't seem to need that (use ...)
> > rule. Is this redundant or not?
> 
> I believe the (use (match_dup 5)) is redundant.
> 
> The insn used to look like this:
> 
>  (define_insn "rep_movqi"
>    [(set (match_operand:SI 2 "register_operand" "=c") (const_int 0))
>     (use (match_operand:SI 5 "register_operand" "2"))
>     (set (match_operand:SI 0 "register_operand" "=D") 
>          (plus:SI (match_operand:SI 3 "address_operand" "0") (match_dup 5)))
>     (set (match_operand:SI 1 "register_operand" "=S") 
>          (plus:SI (match_operand:SI 4 "address_operand" "1") (match_dup 5)))
>     (set (mem:BLK (match_dup 3))
>         (mem:BLK (match_dup 4)))
>     (use (reg:SI 19))]
> 
> Here the (use (match_operand:SI 5) ...) appeared early to specify the
> predicate and constraints for operand 5 and to make it clear that it was
> just the input side of operand 2.
> 
> This change
> 
> 
> http://gcc.gnu.org/ml/gcc-patches/2000-08/msg00877.html
> 
> 
> Fri Sep 29 13:20:42 MET DST 2000  Jan Hubicka  <[email protected]>
> 
>       * recog.c (recog_memoized): Rename to recog_memoized_1.
>       * recog.h (recog_memoized): Rename to recog_memoized_1.
>       (recog_memoized): New macro.
>       * rtl.h (single_set): Rename to single_set_1
>       (single_set): New macro.
>       * rtlanal.c (single_set): Rename to single_set_1;  expect clobbers
>       to be last.
> 
>       * i386.md (strmovsi_1, strmovhi_1 strmovqi_1):
>       Do not use match_dup of input operands at outputs.
>       Use register_operand for memory expression.
>       (rep_movsi): Put use last, canonicalize.
>       Use register_operand for memory expression.
>       (rep_movqi): Put use last.
>       Use register_operand for memory expression.
>       (strsetsi_1, strset_hi_1, strsetqi_1): Do not use match_dup
>       of input operands at outputs.  Use register_operand for memory
>       expression.
>       (rep_stossi): Put use last; canonicalize; fix match_dup in
>       the address expression
>       (rep_stosqi): Likewise.
>       (memcmp expander): Update calls.
>       (cmpstrsi_nz_1, cmpstrsi_1, strlensi_1): Avoid match_dups in
>       the clobbers.
> 
>       * i386.md (fp_jcc_3, fp_jcc_4, jp_fcc_5): if_then_else operand is
>       VOIDmode.
>       (fp_jcc_4, fp_jcc_3): Refuse unordered comparisons.
> 
> put the predicate and constraints on the first use of operand 5, and
> added the (use (match_dup 5)) at the end of the insn.  I think that that
> change should have simply dropped the (use (match_dup 5)), as it was no
> longer needed.

I believe I added use to make it clear that the insn does some other stuff with 
operand 5
than just adding it to edx, i.e. that it specify the size of block copied.
Without this it would be theoretically possible to change value of ecx when we 
need
to do something with edx (i.e. if another value is later added to ecx, the 
optimizer
may add the value to ecx before the memcpy)

Honza

Reply via email to