current egcs miscompiles glibc-2.1's inline math

Richard Henderson rth@cygnus.com
Tue Apr 13 19:23:00 GMT 1999


Referencing Zach's note of 

   http://egcs.cygnus.com/ml/egcs-bugs/1999-04/msg00366.html

Sat Apr 10 20:09:55 EDT 1999  John Wehle  (john@feith.com)

        * i386.md (extendsfdf2, extenddfxf2,
        extendsfxf2): Rewrite using a splitter.
        * i386.c (output_op_from_reg): Remove.
        * i386.h: Likewise.

(define_insn ""
  [(set (match_operand:DF 0 "nonimmediate_operand" "=f,m,!f,!*r")
        (float_extend:DF
          (match_operand:SF 1 "nonimmediate_operand" "fm,f,*r,f")))
   (clobber (match_operand:SF 2 "memory_operand" "m,m,m,m"))
   (clobber (match_operand:DF 3 "memory_operand" "m,m,m,o"))]
  "TARGET_80387 && (GET_CODE (operands[0]) != MEM
                    || GET_CODE (operands[1]) != MEM)"
  "#")

This is incorrect.  You cannot use "#" with any FP operation,
as you'll lose the REG_DEAD note.

Further,

  if (STACK_TOP_P (operands[0]) && STACK_TOP_P (operands[1]))
    return \"\";

is deleting the entire operation.  You could do this if
stack_top_dies, but not otherwise.  And currently you'll
lose the note that indicates the death.


r~


More information about the Gcc-bugs mailing list