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

            Bug ID: 66731
           Summary: vnmul, fnmul patterns incorrect for -frounding-math
           Product: gcc
           Version: 4.9.0
            Status: UNCONFIRMED
          Keywords: wrong-code
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jsm28 at gcc dot gnu.org
  Target Milestone: ---
            Target: arm*-*-* aarch64*-*-*

config/arm/vfp.md has patterns:

(define_insn "*mulsf3negsf_vfp"
  [(set (match_operand:SF                  0 "s_register_operand" "=t")
        (mult:SF (neg:SF (match_operand:SF 1 "s_register_operand" "t"))
                 (match_operand:SF         2 "s_register_operand" "t")))]
  "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
  "vnmul%?.f32\\t%0, %1, %2"
  [(set_attr "predicable" "yes")
   (set_attr "predicable_short_it" "no")
   (set_attr "type" "fmuls")]
)

(define_insn "*muldf3negdf_vfp"
  [(set (match_operand:DF                  0 "s_register_operand" "=w")
        (mult:DF (neg:DF (match_operand:DF 1 "s_register_operand" "w"))
                 (match_operand:DF         2 "s_register_operand" "w")))]
  "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
  "vnmul%?.f64\\t%P0, %P1, %P2"
  [(set_attr "predicable" "yes")
   (set_attr "predicable_short_it" "no")
   (set_attr "type" "fmuld")]
)

These describe the vnmul instruction as (-a) * b.  It's actually -(a * b).  The
two are different in round-upwards and round-downwards modes.  This is
resulting in miscompilation of tgamma from current glibc git (which uses (-a) *
b, expecting that actual multiplication), and consequent test failures.  On
inspection, AArch64 fnmul is similarly misdescribed, although I haven't done
any testing there.

Reply via email to