| /* { dg-do run } */ |
| /* { dg-require-effective-target sse4 } */ |
| /* { dg-options "-O3 -msse4.1 -mno-avx2" } */ |
| |
| #ifndef CHECK_H |
| #define CHECK_H "sse4_1-check.h" |
| #endif |
| |
| #ifndef TEST |
| #define TEST sse4_1_test |
| #endif |
| |
| #include CHECK_H |
| |
| extern void abort (void); |
| |
| #define N 1024 |
| short a[N], c, e; |
| unsigned short b[N], d, f; |
| |
| __attribute__((noinline)) short |
| vecsmax (void) |
| { |
| int i; |
| short r = -32768; |
| for (i = 0; i < N; ++i) |
| if (r < a[i]) r = a[i]; |
| return r; |
| } |
| |
| __attribute__((noinline)) unsigned short |
| vecumax (void) |
| { |
| int i; |
| unsigned short r = 0; |
| for (i = 0; i < N; ++i) |
| if (r < b[i]) r = b[i]; |
| return r; |
| } |
| |
| __attribute__((noinline)) short |
| vecsmin (void) |
| { |
| int i; |
| short r = 32767; |
| for (i = 0; i < N; ++i) |
| if (r > a[i]) r = a[i]; |
| return r; |
| } |
| |
| __attribute__((noinline)) unsigned short |
| vecumin (void) |
| { |
| int i; |
| unsigned short r = 65535; |
| for (i = 0; i < N; ++i) |
| if (r > b[i]) r = b[i]; |
| return r; |
| } |
| |
| static void |
| TEST (void) |
| { |
| int i; |
| for (i = 0; i < N; ++i) |
| { |
| a[i] = i - N / 2; |
| b[i] = i + 32768 - N / 2; |
| } |
| a[N / 3] = N; |
| a[2 * N / 3] = -N; |
| b[N / 5] = 32768 + N; |
| b[4 * N / 5] = 32768 - N; |
| if (vecsmax () != N || vecsmin () != -N) |
| abort (); |
| if (vecumax () != 32768 + N || vecumin () != 32768 - N) |
| abort (); |
| } |