/* { dg-do run } */
/* { dg-additional-options "-O3 --save-temps" } */

extern void abort ();

#define N 8
float in[N] = {1.0, -1.0, -2.0, 3.0, -5.0, -8.0, 13.0, 21.0};
int out[N];

void
foo (int *i, float *f)
{
  i[0] = __builtin_signbit (f[0]);
  i[1] = __builtin_signbit (f[1]);
}

/* { dg-final { scan-assembler-not {-2147483648} } } */
/* { dg-final { scan-assembler {\tushr\tv[0-9]+.2s, v[0-9]+.2s, 31} } } */

int
main ()
{
  int i;

  foo (out, in);
  foo (out + 2, in + 2);
  foo (out + 4, in + 4);
  foo (out + 6, in + 6);

  for (i = 0; i < N; i++)
  {
    if (in[i] >= 0.0 && out[i])
      abort ();
    if (in[i] < 0.0 && !out[i])
      abort ();
  }

  return 0;
}