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

            Bug ID: 63408
           Summary: GCC emits incorrect FMA instruction
           Product: gcc
           Version: 4.8.4
            Status: UNCONFIRMED
          Severity: major
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: itay at phobotic dot com

When compiling the following function

float f(float a, int b)
{
    return a - (((float)b / 0x7fffffff) * 100);
}

with the following command-line options

arm-none-eabi-gcc -O2 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=softfp
-mcpu=cortex-m4

I get this code for f:

    fmsr    s14, r1    @ int
    flds    s15, .L2
    vcvt.f32.s32    s14, s14, #31
    fmsr    s13, r0
    vfma.f32    s13, s14, s15
    fmrs    r0, s13
    bx    lr
.L3:
    .align    2
.L2:
    .word    1120403456

The resulting code clearly adds the parenthesized expression to a rather than
subtracting it.

Replacing the minus sign with a plus sign results in the same code.

Reply via email to