https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117860

Hongtao Liu <liuhongt at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |liuhongt at gcc dot gnu.org

--- Comment #3 from Hongtao Liu <liuhongt at gcc dot gnu.org> ---
(In reply to Uroš Bizjak from comment #2)
> (In reply to Andrew Pinski from comment #1)
> > Confirmed.
> > 
> > I think it should be easy to support it with a slight change to this 
> > pattern:
> > ```
> > (define_insn "addcarry<mode>"
> >   [(set (reg:CCC FLAGS_REG)
> >         (compare:CCC
> >           (zero_extend:<DWI>
> >             (plus:SWI48
> >               (plus:SWI48
> >                 (match_operator:SWI48 5 "ix86_carry_flag_operator"
> >                   [(match_operand 3 "flags_reg_operand") (const_int 0)])
> >                 (match_operand:SWI48 1 "nonimmediate_operand" "%0,0,rm,r"))
> >               (match_operand:SWI48 2 "nonimmediate_operand" "r,rm,r,m")))
> >           (plus:<DWI>
> >             (zero_extend:<DWI> (match_dup 2))
> >             (match_operator:<DWI> 4 "ix86_carry_flag_operator"
> >               [(match_dup 3) (const_int 0)]))))
> >    (set (match_operand:SWI48 0 "nonimmediate_operand" "=rm,r,r,r")
> >         (plus:SWI48 (plus:SWI48 (match_op_dup 5
> >                                  [(match_dup 3) (const_int 0)])
> >                                 (match_dup 1))
> >                     (match_dup 2)))]
> >   "ix86_binary_operator_ok (PLUS, <MODE>mode, operands, TARGET_APX_NDD)"
> >   "@
> >   adc{<imodesuffix>}\t{%2, %0|%0, %2}
> >   adc{<imodesuffix>}\t{%2, %0|%0, %2}
> >   adc{<imodesuffix>}\t{%2, %1, %0|%0, %1, %2}
> >   adc{<imodesuffix>}\t{%2, %1, %0|%0, %1, %2}"
> >   [(set_attr "isa" "*,*,apx_ndd,apx_ndd")
> >    (set_attr "type" "alu")
> >    (set_attr "use_carry" "1")
> >    (set_attr "pent_pair" "pu")
> >    (set_attr "mode" "<MODE>")])
> > ```
> > 
> > 
> > operand 2 would need to change.
> 
> diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
> index ffbb10730c0..f91cb97232a 100644
> --- a/gcc/config/i386/i386.md
> +++ b/gcc/config/i386/i386.md
> @@ -9034,7 +9034,7 @@ (define_insn "addcarry<mode>"
>                 (match_operator:SWI48 5 "ix86_carry_flag_operator"
>                   [(match_operand 3 "flags_reg_operand") (const_int 0)])
>                 (match_operand:SWI48 1 "nonimmediate_operand" "%0,0,rm,r"))
> -             (match_operand:SWI48 2 "nonimmediate_operand" "r,rm,r,m")))
> +             (match_operand:SWI48 2 "x86_64_general_operand" "r,rme,r,me")))

> 
> (BTW: I'm not sure APX constraints are correct).

Better with
> -             (match_operand:SWI48 2 "nonimmediate_operand" "r,rm,r,m")))
> +             (match_operand:SWI48 2 "x86_64_general_operand" "r,rme,re,m")))

APX NDD also support adc reg, mem, imm

Reply via email to