Uros Bizjak schrieb:
> Hello!
> 
> During the macroization of x86 RTX patterns, it became clear that
> certain patterns can't be macroized due to mode-dependant (const_int
> N) RTXes, where the value of X depends on current mode. As an example,
> here are two insn patterns from i386/i386.md:
> 
> (define_insn "x86_64_shld"
>   [(set (match_operand:DI 0 "nonimmediate_operand" "+r*m")
>         (ior:DI (ashift:DI (match_dup 0)
>                   (match_operand:QI 2 "nonmemory_operand" "Jc"))
>                 (lshiftrt:DI (match_operand:DI 1 "register_operand" "r")
>                   (minus:QI (const_int 64) (match_dup 2)))))
>    (clobber (reg:CC FLAGS_REG))]
> ...
> 
> and
> 
> (define_insn "x86_shld"
>   [(set (match_operand:SI 0 "nonimmediate_operand" "+r*m")
>         (ior:SI (ashift:SI (match_dup 0)
>                   (match_operand:QI 2 "nonmemory_operand" "Ic"))
>                 (lshiftrt:SI (match_operand:SI 1 "register_operand" "r")
>                   (minus:QI (const_int 32) (match_dup 2)))))
>    (clobber (reg:CC FLAGS_REG))]
>   ""
> ...
> 
> These two patterns could easily be macroized, however - there is no
> way to express (const_int N) mode dependency*.
> 
> If we have had a define_mode_constant expression, similar to
> define_mode_attr, where:
> 
> (define_mode_const WSZ [(SI "32") (DI "64")])
> 
> we could macroize the pattern to:
> 
> (define_insn "shld_<mode>"
>   [(set (match_operand:SWI48 0 "nonimmediate_operand" "+r*m")
>         (ior:SWI48 (ashift:SWI48 (match_dup 0)
>                   (match_operand:QI 2 "nonmemory_operand" "<S>c"))
>                 (lshiftrt:SWI48 (match_operand:SWI48 1 "register_operand" "r")
>                   (minus:QI (const_int {WSZ}) (match_dup 2)))))
>    (clobber (reg:CC FLAGS_REG))]
>   ""
> ...
> 
> where {WSZ} would get expanded to correct number through WSZ 
> define_mode_const.
> 
> This would help to macroize various push instructions throughout
> i386.md and (more important) numerous string instructions, in addition
> to the patterns, similar to the example above.

What about this?

(define_insn "shld_<mode>"
   [(set (match_operand:SWI48 0 "nonimmediate_operand" "+r*m")
         (ior:SWI48 (ashift:SWI48 (match_dup 0)
                                  (match_operand:QI 2 "nonmemory_operand" 
"<S>c"))
                    (lshiftrt:SWI48 (match_operand:SWI48 1 "register_operand" 
"r")
                                    (minus:QI (match_operand:SWI48 3 
"const_int_operand" "n")
                                              (match_dup 2)))))
    (clobber (reg:CC FLAGS_REG))]
  "GET_MODE_BITSIZE (<MODE>mode) == INTVAL (operands[3])"

Georg

Reply via email to