blob: 5c623f54458ec8e6433a6eb9db185dce8ae85c03 [file] [log] [blame]
/* PR target/103973 */
/* { dg-do run } */
/* { dg-options "-O2 -save-temps" } */
/* { dg-final { scan-assembler-not "'\t\[v\]?ucomisd" { target { ! ia32 } } } } */
/* { dg-final { scan-assembler-times "\t\[v\]?comisd" 4 { target { ! ia32 } } } } */
__attribute__((noipa)) int m1 (void) { return -1; }
__attribute__((noipa)) int p0 (void) { return 0; }
__attribute__((noipa)) int p1 (void) { return 1; }
__attribute__((noipa)) int
foo (double a, double b)
{
if (a == b)
return 0;
if (a < b)
return -1;
return 1;
}
__attribute__((noipa)) int
bar (double a, double b)
{
if (a == b)
return p0 ();
if (a < b)
return m1 ();
return p1 ();
}
__attribute__((noipa)) int
baz (double a, double b)
{
if (a == b)
return p0 ();
if (b < a)
return p1 ();
return m1 ();
}
__attribute__((noipa)) int
qux (double a)
{
if (a != 0.0f)
{
if (a <= 0.0f)
return -1;
return 1;
}
return 0;
}
int
main ()
{
double m5 = -5.0f;
double p5 = 5.0f;
volatile double p0 = 0.0f;
double nan = p0 / p0;
if (foo (p5, p5) != 0 || foo (m5, m5) != 0)
__builtin_abort ();
if (foo (m5, p5) != -1 || foo (p5, m5) != 1)
__builtin_abort ();
if (foo (m5, nan) != 1 || foo (nan, p5) != 1)
__builtin_abort ();
if (foo (nan, nan) != 1)
__builtin_abort ();
if (bar (p5, p5) != 0 || bar (m5, m5) != 0)
__builtin_abort ();
if (bar (m5, p5) != -1 || bar (p5, m5) != 1)
__builtin_abort ();
if (bar (m5, nan) != 1 || bar (nan, p5) != 1)
__builtin_abort ();
if (bar (nan, nan) != 1)
__builtin_abort ();
if (baz (p5, p5) != 0 || baz (m5, m5) != 0)
__builtin_abort ();
if (baz (m5, p5) != -1 || baz (p5, m5) != 1)
__builtin_abort ();
if (baz (m5, nan) != -1 || baz (nan, p5) != -1)
__builtin_abort ();
if (baz (nan, nan) != -1)
__builtin_abort ();
if (qux (p0) != 0 || qux (nan) != 1)
__builtin_abort ();
if (qux (m5) != -1 || qux (p5) != 1)
__builtin_abort ();
return 0;
}