1 /* { dg-do compile } */ 2 /* { dg-options "-O2 -ftree-vectorize -ffast-math" } */ 3 4 #include <stdint.h> 5 6 #define NUM_ELEMS(TYPE) (320 / sizeof (TYPE)) 7 8 #define DEF_MAXMIN(TYPE, NAME, CMP_OP) \ 9 void __attribute__ ((noinline, noclone)) \ 10 fun_##NAME##_##TYPE (TYPE *restrict r, TYPE *restrict a, \ 11 TYPE *restrict b) \ 12 { \ 13 for (int i = 0; i < NUM_ELEMS (TYPE); i++) \ 14 r[i] = a[i] CMP_OP b[i] ? a[i] : b[i]; \ 15 } 16 17 #define TEST_ALL(T) \ 18 T (int8_t, max, >) \ 19 T (int16_t, max, >) \ 20 T (int32_t, max, >) \ 21 T (int64_t, max, >) \ 22 T (uint8_t, max, >) \ 23 T (uint16_t, max, >) \ 24 T (uint32_t, max, >) \ 25 T (uint64_t, max, >) \ 26 T (_Float16, max, >) \ 27 T (float, max, >) \ 28 T (double, max, >) \ 29 \ 30 T (int8_t, min, <) \ 31 T (int16_t, min, <) \ 32 T (int32_t, min, <) \ 33 T (int64_t, min, <) \ 34 T (uint8_t, min, <) \ 35 T (uint16_t, min, <) \ 36 T (uint32_t, min, <) \ 37 T (uint64_t, min, <) \ 38 T (_Float16, min, <) \ 39 T (float, min, <) \ 40 T (double, min, <) 41 42 TEST_ALL (DEF_MAXMIN) 43 44 /* { dg-final { scan-assembler-times {\tsmax\tz[0-9]+\.b, p[0-7]/m, z[0-9]+\.b, z[0-9]+\.b\n} 1 } } */ 45 /* { dg-final { scan-assembler-times {\tsmax\tz[0-9]+\.h, p[0-7]/m, z[0-9]+\.h, z[0-9]+\.h\n} 1 } } */ 46 /* { dg-final { scan-assembler-times {\tsmax\tz[0-9]+\.s, p[0-7]/m, z[0-9]+\.s, z[0-9]+\.s\n} 1 } } */ 47 /* { dg-final { scan-assembler-times {\tsmax\tz[0-9]+\.d, p[0-7]/m, z[0-9]+\.d, z[0-9]+\.d\n} 1 } } */ 48 49 /* { dg-final { scan-assembler-times {\tumax\tz[0-9]+\.b, p[0-7]/m, z[0-9]+\.b, z[0-9]+\.b\n} 1 } } */ 50 /* { dg-final { scan-assembler-times {\tumax\tz[0-9]+\.h, p[0-7]/m, z[0-9]+\.h, z[0-9]+\.h\n} 1 } } */ 51 /* { dg-final { scan-assembler-times {\tumax\tz[0-9]+\.s, p[0-7]/m, z[0-9]+\.s, z[0-9]+\.s\n} 1 } } */ 52 /* { dg-final { scan-assembler-times {\tumax\tz[0-9]+\.d, p[0-7]/m, z[0-9]+\.d, z[0-9]+\.d\n} 1 } } */ 53 54 /* { dg-final { scan-assembler-times {\tfmaxnm\tz[0-9]+\.h, p[0-7]/m, z[0-9]+\.h, z[0-9]+\.h\n} 1 } } */ 55 /* { dg-final { scan-assembler-times {\tfmaxnm\tz[0-9]+\.s, p[0-7]/m, z[0-9]+\.s, z[0-9]+\.s\n} 1 } } */ 56 /* { dg-final { scan-assembler-times {\tfmaxnm\tz[0-9]+\.d, p[0-7]/m, z[0-9]+\.d, z[0-9]+\.d\n} 1 } } */ 57 58 /* { dg-final { scan-assembler-times {\tsmin\tz[0-9]+\.b, p[0-7]/m, z[0-9]+\.b, z[0-9]+\.b\n} 1 } } */ 59 /* { dg-final { scan-assembler-times {\tsmin\tz[0-9]+\.h, p[0-7]/m, z[0-9]+\.h, z[0-9]+\.h\n} 1 } } */ 60 /* { dg-final { scan-assembler-times {\tsmin\tz[0-9]+\.s, p[0-7]/m, z[0-9]+\.s, z[0-9]+\.s\n} 1 } } */ 61 /* { dg-final { scan-assembler-times {\tsmin\tz[0-9]+\.d, p[0-7]/m, z[0-9]+\.d, z[0-9]+\.d\n} 1 } } */ 62 63 /* { dg-final { scan-assembler-times {\tumin\tz[0-9]+\.b, p[0-7]/m, z[0-9]+\.b, z[0-9]+\.b\n} 1 } } */ 64 /* { dg-final { scan-assembler-times {\tumin\tz[0-9]+\.h, p[0-7]/m, z[0-9]+\.h, z[0-9]+\.h\n} 1 } } */ 65 /* { dg-final { scan-assembler-times {\tumin\tz[0-9]+\.s, p[0-7]/m, z[0-9]+\.s, z[0-9]+\.s\n} 1 } } */ 66 /* { dg-final { scan-assembler-times {\tumin\tz[0-9]+\.d, p[0-7]/m, z[0-9]+\.d, z[0-9]+\.d\n} 1 } } */ 67 68 /* { dg-final { scan-assembler-times {\tfminnm\tz[0-9]+\.h, p[0-7]/m, z[0-9]+\.h, z[0-9]+\.h\n} 1 } } */ 69 /* { dg-final { scan-assembler-times {\tfminnm\tz[0-9]+\.s, p[0-7]/m, z[0-9]+\.s, z[0-9]+\.s\n} 1 } } */ 70 /* { dg-final { scan-assembler-times {\tfminnm\tz[0-9]+\.d, p[0-7]/m, z[0-9]+\.d, z[0-9]+\.d\n} 1 } } */ 71