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  __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    volatile double p0 = 0.0f;
      68    double nan = p0 / p0;
      69    if (foo (p5, p5) != 0 || foo (m5, m5) != 0)
      70      __builtin_abort ();
      71    if (foo (m5, p5) != -1 || foo (p5, m5) != 1)
      72      __builtin_abort ();
      73    if (foo (m5, nan) != 2 || foo (nan, p5) != 2)
      74      __builtin_abort ();
      75    if (foo (nan, nan) != 2)
      76      __builtin_abort ();
      77    if (bar (p5, p5) != 0 || bar (m5, m5) != 0)
      78      __builtin_abort ();
      79    if (bar (m5, p5) != -1 || bar (p5, m5) != 1)
      80      __builtin_abort ();
      81    if (bar (m5, nan) != 2 || bar (nan, p5) != 2)
      82      __builtin_abort ();
      83    if (bar (nan, nan) != 2)
      84      __builtin_abort ();
      85    if (baz (p5, p5) != 0 || baz (m5, m5) != 0)
      86      __builtin_abort ();
      87    if (baz (m5, p5) != -1 || baz (p5, m5) != 1)
      88      __builtin_abort ();
      89    if (baz (m5, nan) != 2 || baz (nan, p5) != 2)
      90      __builtin_abort ();
      91    if (baz (nan, nan) != 2)
      92      __builtin_abort ();
      93    if (qux (p0) != 0 || qux (nan) != 2)
      94      __builtin_abort ();
      95    if (qux (m5) != -1 || qux (p5) != 1)
      96      __builtin_abort ();
      97    return 0;
      98  }