/* { 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; }