(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
i386/
pr103973-9.c
       1  /* PR target/103973 */
       2  /* { dg-do run } */
       3  /* { dg-options "-O2 -save-temps" } */
       4  /* { dg-final { scan-assembler-not "'\t\[v\]?ucomisd" { target { ! ia32 } } } } */
       5  /* { dg-final { scan-assembler-times "\t\[v\]?comisd" 4 { target { ! ia32 } } } } */
       6  
       7  __attribute__((noipa)) int m1 (void) { return -1; }
       8  __attribute__((noipa)) int p0 (void) { return 0; }
       9  __attribute__((noipa)) int p1 (void) { return 1; }
      10  
      11  __attribute__((noipa)) int
      12  foo (double a, double b)
      13  {
      14    if (a == b)
      15      return 0;
      16    if (a < b)
      17      return -1;
      18    return 1;
      19  }
      20  
      21  __attribute__((noipa)) int
      22  bar (double a, double b)
      23  {
      24    if (a == b)
      25      return p0 ();
      26    if (a < b)
      27      return m1 ();
      28    return p1 ();
      29  }
      30  
      31  __attribute__((noipa)) int
      32  baz (double a, double b)
      33  {
      34    if (a == b)
      35      return p0 ();
      36    if (b < a)
      37      return p1 ();
      38    return m1 ();
      39  }
      40  
      41  __attribute__((noipa)) int
      42  qux (double a)
      43  {
      44    if (a != 0.0f)
      45      {
      46        if (a <= 0.0f)
      47  	return -1;
      48        return 1;
      49      }
      50    return 0;
      51  }
      52  
      53  int
      54  main ()
      55  {
      56    double m5 = -5.0f;
      57    double p5 = 5.0f;
      58    volatile double p0 = 0.0f;
      59    double nan = p0 / p0;
      60    if (foo (p5, p5) != 0 || foo (m5, m5) != 0)
      61      __builtin_abort ();
      62    if (foo (m5, p5) != -1 || foo (p5, m5) != 1)
      63      __builtin_abort ();
      64    if (foo (m5, nan) != 1 || foo (nan, p5) != 1)
      65      __builtin_abort ();
      66    if (foo (nan, nan) != 1)
      67      __builtin_abort ();
      68    if (bar (p5, p5) != 0 || bar (m5, m5) != 0)
      69      __builtin_abort ();
      70    if (bar (m5, p5) != -1 || bar (p5, m5) != 1)
      71      __builtin_abort ();
      72    if (bar (m5, nan) != 1 || bar (nan, p5) != 1)
      73      __builtin_abort ();
      74    if (bar (nan, nan) != 1)
      75      __builtin_abort ();
      76    if (baz (p5, p5) != 0 || baz (m5, m5) != 0)
      77      __builtin_abort ();
      78    if (baz (m5, p5) != -1 || baz (p5, m5) != 1)
      79      __builtin_abort ();
      80    if (baz (m5, nan) != -1 || baz (nan, p5) != -1)
      81      __builtin_abort ();
      82    if (baz (nan, nan) != -1)
      83      __builtin_abort ();
      84    if (qux (p0) != 0 || qux (nan) != 1)
      85      __builtin_abort ();
      86    if (qux (m5) != -1 || qux (p5) != 1)
      87      __builtin_abort ();
      88    return 0;
      89  }