A bug in output_fp_cc0_set ()?

H.J. Lu hjl@lucon.org
Sat Jun 13 14:29:00 GMT 1998


Hi,

output_fp_cc0_set () in config/i386/386.c has some strange codes:

          next = next_cc0_user (insn);
        
          if (GET_CODE (next) == JUMP_INSN
              && GET_CODE (PATTERN (next)) == SET
              && SET_DEST (PATTERN (next)) == pc_rtx
              && GET_CODE (SET_SRC (PATTERN (next))) == IF_THEN_ELSE)
	    code = GET_CODE (XEXP (SET_SRC (PATTERN (next)), 0));
          else if (GET_CODE (PATTERN (next)) == SET)
	    code = GET_CODE (SET_SRC (PATTERN (next)));
          else
	    return "sahf";

I don't see how

GET_CODE (next) == JUMP_INSN

and

GET_CODE (PATTERN (next)) == SET

can both be true. I think the correct one should be

          next = next_cc0_user (insn);
        
          if (GET_CODE (PATTERN (next)) == SET
              && SET_DEST (PATTERN (next)) == pc_rtx
              && GET_CODE (SET_SRC (PATTERN (next))) == IF_THEN_ELSE)
	    code = GET_CODE (XEXP (SET_SRC (PATTERN (next)), 0));
          else if (GET_CODE (PATTERN (next)) == SET)
	    code = GET_CODE (SET_SRC (PATTERN (next)));
          else
	    return "sahf";

The same code appears twice in output_fp_cc0_set (). BTW, we never saw
any bugs caused by it since integer/fp conditional moves were never
really enabled for fp comparisons.


H.J.



More information about the Gcc-bugs mailing list