(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
i386/
pr103973-5.c
       1  /* PR target/103973 */
       2  /* { dg-do run } */
       3  /* { dg-options "-O2 -ffast-math -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  __attribute__((noipa)) int p2 (void) { return 2; }
      11  
      12  __attribute__((noipa)) int
      13  foo (double a, double b)
      14  {
      15    if (a == b)
      16      return 0;
      17    if (a < b)
      18      return -1;
      19    if (a > b)
      20      return 1;
      21    return 2;
      22  }
      23  
      24  __attribute__((noipa)) int
      25  bar (double a, double b)
      26  {
      27    if (a == b)
      28      return p0 ();
      29    if (a < b)
      30      return m1 ();
      31    if (a > b)
      32      return p1 ();
      33    return p2 ();
      34  }
      35  
      36  __attribute__((noipa)) int
      37  baz (double a, double b)
      38  {
      39    if (a == b)
      40      return p0 ();
      41    if (b < a)
      42      return p1 ();
      43    if (a < b)
      44      return m1 ();
      45    return p2 ();
      46  }
      47  
      48  __attribute__((noipa)) int
      49  qux (double a)
      50  {
      51    if (a != 0.0f)
      52      {
      53        if (a <= 0.0f)
      54  	return -1;
      55        if (a >= 0.0f)
      56  	return 1;
      57        return 2;
      58      }
      59    return 0;
      60  }
      61  
      62  int
      63  main ()
      64  {
      65    double m5 = -5.0f;
      66    double p5 = 5.0f;
      67    double p0 = 0.0f;
      68    if (foo (p5, p5) != 0 || foo (m5, m5) != 0)
      69      __builtin_abort ();
      70    if (foo (m5, p5) != -1 || foo (p5, m5) != 1)
      71      __builtin_abort ();
      72    if (bar (p5, p5) != 0 || bar (m5, m5) != 0)
      73      __builtin_abort ();
      74    if (bar (m5, p5) != -1 || bar (p5, m5) != 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 (qux (p0) != 0)
      81      __builtin_abort ();
      82    if (qux (m5) != -1 || qux (p5) != 1)
      83      __builtin_abort ();
      84    return 0;
      85  }