(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
i386/
fma4-fma-2.c
       1  /* Test that the compiler properly optimizes floating point multiply
       2     and add instructions into vfmaddss, vfmsubss, vfnmaddss,
       3     vfnmsubss on FMA4 systems.  */
       4  
       5  /* { dg-do compile { target { ! ia32 } } } */
       6  /* { dg-options "-O2 -funsafe-math-optimizations -mfma4 -mno-fma" } */
       7  
       8  extern void exit (int);
       9  
      10  float
      11  flt_mul_add (float a, float c)
      12  {
      13    return (a * a) + c;
      14  }
      15  
      16  double
      17  dbl_mul_add (double a, double c)
      18  {
      19    return (a * a) + c;
      20  }
      21  
      22  float
      23  flt_mul_sub (float a, float c)
      24  {
      25    return (a * a) - c;
      26  }
      27  
      28  double
      29  dbl_mul_sub (double a, double c)
      30  {
      31    return (a * a) - c;
      32  }
      33  
      34  float
      35  flt_neg_mul_add (float a, float c)
      36  {
      37    return (-(a * a)) + c;
      38  }
      39  
      40  double
      41  dbl_neg_mul_add (double a, double c)
      42  {
      43    return (-(a * a)) + c;
      44  }
      45  
      46  float  f[10] = { 2, 3, 4 };
      47  double d[10] = { 2, 3, 4 };
      48  
      49  int main ()
      50  {
      51    f[3] = flt_mul_add (f[0], f[2]);
      52    f[4] = flt_mul_sub (f[0], f[2]);
      53    f[5] = flt_neg_mul_add (f[0], f[2]);
      54  
      55    d[3] = dbl_mul_add (d[0], d[2]);
      56    d[4] = dbl_mul_sub (d[0], d[2]);
      57    d[5] = dbl_neg_mul_add (d[0], d[2]);
      58    exit (0);
      59  }
      60  
      61  /* { dg-final { scan-assembler "vfmaddss" } } */
      62  /* { dg-final { scan-assembler "vfmaddsd" } } */
      63  /* { dg-final { scan-assembler "vfmsubss" } } */
      64  /* { dg-final { scan-assembler "vfmsubsd" } } */
      65  /* { dg-final { scan-assembler "vfnmaddss" } } */
      66  /* { dg-final { scan-assembler "vfnmaddsd" } } */