Viewing file: vcond_4_sel.c (2.77 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
/* { dg-do compile } */ /* { dg-options "-O2 -ftree-vectorize" } */
#include <stdint.h>
#define eq(A, B) ((A) == (B)) #define ne(A, B) ((A) != (B)) #define olt(A, B) ((A) < (B)) #define ole(A, B) ((A) <= (B)) #define oge(A, B) ((A) >= (B)) #define ogt(A, B) ((A) > (B)) #define ordered(A, B) (!__builtin_isunordered (A, B)) #define unordered(A, B) (__builtin_isunordered (A, B)) #define ueq(A, B) (!__builtin_islessgreater (A, B)) #define ult(A, B) (__builtin_isless (A, B)) #define ule(A, B) (__builtin_islessequal (A, B)) #define uge(A, B) (__builtin_isgreaterequal (A, B)) #define ugt(A, B) (__builtin_isgreater (A, B)) #define nueq(A, B) (__builtin_islessgreater (A, B)) #define nult(A, B) (!__builtin_isless (A, B)) #define nule(A, B) (!__builtin_islessequal (A, B)) #define nuge(A, B) (!__builtin_isgreaterequal (A, B)) #define nugt(A, B) (!__builtin_isgreater (A, B))
#define TEST_LOOP(TYPE1, TYPE2, CMP) \ void __attribute__ ((noinline, noclone)) \ test_##TYPE1##_##TYPE2##_##CMP##_sel (TYPE1 *restrict dest, \ TYPE1 if_true, \ TYPE1 if_false, \ TYPE2 *restrict a, \ TYPE2 b, int count) \ { \ for (int i = 0; i < count; ++i) \ dest[i] = CMP (a[i], b) ? if_true : if_false; \ }
#define TEST_CMP(CMP) \ TEST_LOOP (int32_t, float, CMP) \ TEST_LOOP (uint32_t, float, CMP) \ TEST_LOOP (float, float, CMP) \ TEST_LOOP (int64_t, double, CMP) \ TEST_LOOP (uint64_t, double, CMP) \ TEST_LOOP (double, double, CMP)
TEST_CMP (eq) TEST_CMP (ne) TEST_CMP (olt) TEST_CMP (ole) TEST_CMP (oge) TEST_CMP (ogt) TEST_CMP (ordered) TEST_CMP (unordered) TEST_CMP (ueq) TEST_CMP (ult) TEST_CMP (ule) TEST_CMP (uge) TEST_CMP (ugt) TEST_CMP (nueq) TEST_CMP (nult) TEST_CMP (nule) TEST_CMP (nuge) TEST_CMP (nugt)
/* 3 each for: eq, ne, ueq, nueq. */ /* { dg-final { scan-assembler-times {\tfcm(?:eq|ne)\tp[0-9]+\.s, p[0-7]/z, z[0-9]+\.s, z[0-9]+\.s\n} 12 } } */ /* { dg-final { scan-assembler-times {\tfcm(?:eq|ne)\tp[0-9]+\.d, p[0-7]/z, z[0-9]+\.d, z[0-9]+\.d\n} 12 } } */
/* 3 each for: olt, ult, nult, ogt, ugt, nugt. */ /* { dg-final { scan-assembler-times {\tfcm[lg]t\tp[0-9]+\.s, p[0-7]/z, z[0-9]+\.s, z[0-9]+\.s\n} 18 } } */ /* { dg-final { scan-assembler-times {\tfcm[lg]t\tp[0-9]+\.d, p[0-7]/z, z[0-9]+\.d, z[0-9]+\.d\n} 18 } } */
/* 3 each for: ole, ule, nule, oge, uge, nuge. */ /* { dg-final { scan-assembler-times {\tfcm[lg]e\tp[0-9]+\.s, p[0-7]/z, z[0-9]+\.s, z[0-9]+\.s\n} 18 } } */ /* { dg-final { scan-assembler-times {\tfcm[lg]e\tp[0-9]+\.d, p[0-7]/z, z[0-9]+\.d, z[0-9]+\.d\n} 18 } } */
/* 3 invocations for all 12 unordered comparisons. */ /* { dg-final { scan-assembler-times {\tfcmuo\tp[0-9]+\.s, p[0-7]/z, z[0-9]+\.s, z[0-9]+\.s\n} 36 } } */ /* { dg-final { scan-assembler-times {\tfcmuo\tp[0-9]+\.d, p[0-7]/z, z[0-9]+\.d, z[0-9]+\.d\n} 36 } } */
|