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

--- Comment #25 from Hongtao.liu <crazylht at gmail dot com> ---
(In reply to Uroš Bizjak from comment #24)
> (In reply to Hongtao.liu from comment #23)
> > looking at i386.c put_condition_code used by *setcc_qi, it looks like (EQ
> > (reg:CCCmode FLAG_REG) (const_int 0)) means get carry flag.
> > Not (LTU: (REG:CCCmode FLAGS_REG) (const_int 0)).
> > Now I got more confused.
> 
> CCCmode means that single flag is tested, it uses EQ and NE, so "c" and "nc"
> suffix is emitted. When CCmode is used, LTU/GEU operation on CCmode flags
> reg produces "b" and "nb" suffix, which decodes to exactly the same assembly
> as "c" and "nc" suffixes.
> 
> However, it looks that somewhere LTU/GEU is also generated with CCCmode
> flags reg, and some fixup was introduced to put_condition_code to "fix" this
> inconsistency. If LTU/GEU is valid only for CCmode, then the producers of
> invalid RTX should be fixed.

grep -e ltu -e geu *.md, it looks like most places use CCmode for LTU, only
below cases use CCCmode, maybe we should use CCmode for all of those and "fix"
put_condition_code?

------------cut CCCmode-----------------------
i386.md:               (ltu (reg:CCC FLAGS_REG) (const_int 0))
i386.md:        (compare:CCC (neg:QI (geu:QI (reg:CC_CCC FLAGS_REG) (const_int
0)))
i386.md:                     (ltu:QI (reg:CC_CCC FLAGS_REG) (const_int 0))))]
i386.md:          (neg:SWI48 (ltu:SWI48 (reg:CCC FLAGS_REG) (const_int 0))))
i386.md:        (neg:SWI (ltu:SWI (reg:CCC FLAGS_REG) (const_int 0))))])

------------cut ends---------------------------

------------cut CCmode---------------
i386.md:                       (ltu:DWIH (reg:CC FLAGS_REG) (const_int 0))
i386.md:                       (ltu:DWIH (reg:CC FLAGS_REG) (const_int 0))
i386.md:                         (ltu:<DWI> (reg:CC FLAGS_REG) (const_int 0))
i386.md:                           (ltu:DWIH (reg:CC FLAGS_REG) (const_int 0))
i386.md:                       (ltu:DWIH (reg:CC FLAGS_REG) (const_int 0))
i386.md:                         (ltu:<DWI> (reg:CC FLAGS_REG) (const_int 0))
i386.md:                           (ltu:DWIH (reg:CC FLAGS_REG) (const_int 0))
i386.md:                       (ltu:DWIH (reg:CC FLAGS_REG) (const_int 0))
i386.md:                       (ltu:DWIH (reg:CC FLAGS_REG) (const_int 0)))
i386.md:                       (ltu:DWIH (reg:CC FLAGS_REG) (const_int 0)))
i386.md:                         (ltu:<DWI> (reg:CC FLAGS_REG) (const_int 0)))
i386.md:                           (ltu:DWIH (reg:CC FLAGS_REG) (const_int 0)))
i386.md:                       (ltu:DWIH (reg:CC FLAGS_REG) (const_int 0)))
i386.md:                         (ltu:<DWI> (reg:CC FLAGS_REG) (const_int 0)))
i386.md:                           (ltu:DWIH (reg:CC FLAGS_REG) (const_int 0)))
i386.md:                       (ltu:DWIH (reg:CC FLAGS_REG) (const_int 0)))
i386.md:               (ltu (reg:CC FLAGS_REG) (const_int 0))
i386.md:            (ltu:<DWI> (reg:CC FLAGS_REG) (const_int 0))
i386.md:            (ltu:<DWI> (reg:CC FLAGS_REG) (const_int 0))
i386.md:                      (ltu:DWIH (reg:CC FLAGS_REG) (const_int 0))]
i386.md:                           (ltu:DWIH (reg:CC FLAGS_REG) (const_int 0))
i386.md:                       (ltu:<DWI> (reg:CC FLAGS_REG) (const_int 0)))))
i386.md:                     (plus:DWIH (ltu:DWIH (reg:CC FLAGS_REG) (const_int
0))
i386.md:                     (plus:SWI (ltu:SWI (reg:CC FLAGS_REG) (const_int
0))
i386.md:                                (ltu:SWI (reg:CC FLAGS_REG) (const_int
0)))
i386.md:                   (plus:SWI (ltu:SWI (reg:CC FLAGS_REG) (const_int 0))
i386.md:                                (ltu:SWI (reg:CC FLAGS_REG) (const_int
0)))
i386.md:                                (ltu:SWI (reg:CC FLAGS_REG) (const_int
0)))
i386.md:                     (plus:SWI (ltu:SWI (reg:CC FLAGS_REG) (const_int
0))
i386.md:                                (ltu:SWI (reg:CC FLAGS_REG) (const_int
0)))
i386.md:                              (ltu:SWI (reg:CC FLAGS_REG) (const_int
0))))
i386.md:                               (ltu:SWI (reg:CC FLAGS_REG) (const_int
0))
i386.md:          (plus:DWIH (plus:DWIH (ltu:DWIH (reg:CC FLAGS_REG) (const_int
0))
i386.md:                        (ltu:SWI48 (reg:CC FLAGS_REG) (const_int 0))
i386.md:                         (ltu:SWI48 (reg:CC FLAGS_REG) (const_int 0)))
i386.md:                        (ltu:SWI48 (reg:CC FLAGS_REG) (const_int 0))
i386.md:          (if_then_else:SWI48 (ltu:SWI48 (reg:CC FLAGS_REG) (const_int
0))
i386.md:          (plus:DWIH (plus:DWIH (ltu:DWIH (reg:CC FLAGS_REG) (const_int
0))
i386.md:          (plus:DWIH (plus:DWIH (ltu:DWIH (reg:CC FLAGS_REG) (const_int
0))
i386.md:        (ltu:QI (reg:CC FLAGS_REG) (const_int 0)))
i386.md:        (ltu:QI (reg:CC FLAGS_REG) (const_int 0)))
i386.md:        (ltu:QI (reg:CC FLAGS_REG) (const_int 0)))
i386.md:        (neg:SWI48 (ltu:SWI48 (reg:CC FLAGS_REG) (const_int 0))))]
i386.md:        (neg:SWI (ltu:SWI (reg:CC FLAGS_REG) (const_int 0))))])

------------cut ends-------------

Reply via email to