blob: abab3ee9f4e8f605d2af0c297ded2a6d105e096e [file] [log] [blame]
/* { dg-do run { target aarch64_sve_hw } } */
/* { dg-options "-O2 -ftree-vectorize" } */
/* { dg-require-effective-target fenv_exceptions } */
#ifndef TEST_EXCEPTIONS
#define TEST_EXCEPTIONS 1
#endif
#include <fenv.h>
#include "vcond_4.c"
#define N 401
#define RUN_LOOP(TYPE1, TYPE2, CMP, EXPECT_INVALID) \
{ \
TYPE1 dest[N], src[N]; \
TYPE2 a[N], b[N]; \
for (int i = 0; i < N; ++i) \
{ \
src[i] = i * i; \
if (i % 5 == 0) \
a[i] = 0; \
else if (i % 3) \
a[i] = i * 0.1; \
else \
a[i] = i; \
if (i % 7 == 0) \
b[i] = __builtin_nan (""); \
else if (i % 6) \
b[i] = i * 0.1; \
else \
b[i] = i; \
asm volatile ("" ::: "memory"); \
} \
feclearexcept (FE_ALL_EXCEPT); \
test_##TYPE1##_##TYPE2##_##CMP##_var (dest, src, 11, a, b, N); \
if (TEST_EXCEPTIONS \
&& !fetestexcept (FE_INVALID) != !(EXPECT_INVALID)) \
__builtin_abort (); \
for (int i = 0; i < N; ++i) \
if (dest[i] != (CMP (a[i], b[i]) ? src[i] : 11)) \
__builtin_abort (); \
}
#define RUN_CMP(CMP, EXPECT_INVALID) \
RUN_LOOP (int32_t, float, CMP, EXPECT_INVALID) \
RUN_LOOP (uint32_t, float, CMP, EXPECT_INVALID) \
RUN_LOOP (float, float, CMP, EXPECT_INVALID) \
RUN_LOOP (int64_t, double, CMP, EXPECT_INVALID) \
RUN_LOOP (uint64_t, double, CMP, EXPECT_INVALID) \
RUN_LOOP (double, double, CMP, EXPECT_INVALID)
int __attribute__ ((optimize (1)))
main (void)
{
RUN_CMP (eq, 0)
RUN_CMP (ne, 0)
RUN_CMP (olt, 1)
RUN_CMP (ole, 1)
RUN_CMP (oge, 1)
RUN_CMP (ogt, 1)
RUN_CMP (ordered, 0)
RUN_CMP (unordered, 0)
RUN_CMP (ueq, 0)
RUN_CMP (ult, 0)
RUN_CMP (ule, 0)
RUN_CMP (uge, 0)
RUN_CMP (ugt, 0)
RUN_CMP (nueq, 0)
RUN_CMP (nult, 0)
RUN_CMP (nule, 0)
RUN_CMP (nuge, 0)
RUN_CMP (nugt, 0)
return 0;
}