44 lines
680 B
C
44 lines
680 B
C
/* { dg-do run } */
|
|
/* { dg-require-effective-target ultrasparc_hw } */
|
|
/* { dg-options "-O2 -mcpu=ultrasparc -mvis" } */
|
|
|
|
extern void abort (void);
|
|
extern void exit (int);
|
|
|
|
int l;
|
|
|
|
int baz (double x)
|
|
{
|
|
return l == 0;
|
|
}
|
|
|
|
double bar (double x)
|
|
{
|
|
return 1.0;
|
|
}
|
|
|
|
double foo (double x)
|
|
{
|
|
if (l == -1 || baz (x)) return x;
|
|
if (x < 0.0)
|
|
return bar (x);
|
|
else
|
|
return 0.0;
|
|
}
|
|
|
|
union {
|
|
double d;
|
|
long long l;
|
|
} x = { l: 0x7ff8000000000000LL }, y;
|
|
|
|
int main ()
|
|
{
|
|
unsigned int fsr = 0;
|
|
__asm __volatile ("ld %0, %%fsr" : : "m" (fsr));
|
|
y.d = foo (x.d);
|
|
__asm __volatile ("st %%fsr, %0" : "=m" (fsr));
|
|
if (x.l != y.l || (fsr & 0x3ff))
|
|
abort ();
|
|
exit (0);
|
|
}
|