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-------------