(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
aarch64/
sve/
vcond_17.c
       1  /* { dg-do compile } */
       2  /* { dg-options "-O2 -ftree-vectorize" } */
       3  
       4  #include <stdint.h>
       5  
       6  #define eq(A, B) ((A) == (B))
       7  #define ne(A, B) ((A) != (B))
       8  #define olt(A, B) ((A) < (B))
       9  #define ole(A, B) ((A) <= (B))
      10  #define oge(A, B) ((A) >= (B))
      11  #define ogt(A, B) ((A) > (B))
      12  #define ordered(A, B) (!__builtin_isunordered (A, B))
      13  #define unordered(A, B) (__builtin_isunordered (A, B))
      14  #define ueq(A, B) (!__builtin_islessgreater (A, B))
      15  #define ult(A, B) (__builtin_isless (A, B))
      16  #define ule(A, B) (__builtin_islessequal (A, B))
      17  #define uge(A, B) (__builtin_isgreaterequal (A, B))
      18  #define ugt(A, B) (__builtin_isgreater (A, B))
      19  #define nueq(A, B) (__builtin_islessgreater (A, B))
      20  #define nult(A, B) (!__builtin_isless (A, B))
      21  #define nule(A, B) (!__builtin_islessequal (A, B))
      22  #define nuge(A, B) (!__builtin_isgreaterequal (A, B))
      23  #define nugt(A, B) (!__builtin_isgreater (A, B))
      24  
      25  #define DEF_LOOP(CMP, EXPECT_INVALID)					\
      26    void __attribute__ ((noinline, noclone))				\
      27    test_##CMP##_var (__fp16 *restrict dest, __fp16 *restrict src,	\
      28  		    __fp16 fallback, __fp16 *restrict a,		\
      29  		    __fp16 *restrict b, int count)			\
      30    {									\
      31      for (int i = 0; i < count; ++i)					\
      32        dest[i] = CMP (a[i], b[i]) ? src[i] : fallback;			\
      33    }									\
      34  									\
      35    void __attribute__ ((noinline, noclone))				\
      36    test_##CMP##_zero (__fp16 *restrict dest,  __fp16 *restrict src,	\
      37  		     __fp16 fallback, __fp16 *restrict a,		\
      38  		     int count)						\
      39    {									\
      40      for (int i = 0; i < count; ++i)					\
      41        dest[i] = CMP (a[i], (__fp16) 0) ? src[i] : fallback;		\
      42    }									\
      43  									\
      44    void __attribute__ ((noinline, noclone))				\
      45    test_##CMP##_sel (__fp16 *restrict dest, __fp16 if_true,		\
      46  		    __fp16 if_false, __fp16 *restrict a,		\
      47  		    __fp16 b, int count)				\
      48    {									\
      49      for (int i = 0; i < count; ++i)					\
      50        dest[i] = CMP (a[i], b) ? if_true : if_false;			\
      51    }
      52  
      53  #define TEST_ALL(T)				\
      54    T (eq, 0)					\
      55    T (ne, 0)					\
      56    T (olt, 1)					\
      57    T (ole, 1)					\
      58    T (oge, 1)					\
      59    T (ogt, 1)					\
      60    T (ordered, 0)				\
      61    T (unordered, 0)				\
      62    T (ueq, 0)					\
      63    T (ult, 0)					\
      64    T (ule, 0)					\
      65    T (uge, 0)					\
      66    T (ugt, 0)					\
      67    T (nueq, 0)					\
      68    T (nult, 0)					\
      69    T (nule, 0)					\
      70    T (nuge, 0)					\
      71    T (nugt, 0)
      72  
      73  TEST_ALL (DEF_LOOP)
      74  
      75  /* { dg-final { scan-assembler {\tfcmeq\tp[0-9]+\.h, p[0-7]/z, z[0-9]+\.h, #0\.0\n} { xfail *-*-* } } } */
      76  /* { dg-final { scan-assembler {\tfcmeq\tp[0-9]+\.h, p[0-7]/z, z[0-9]+\.h, z[0-9]+\.h\n} } } */
      77  
      78  /* { dg-final { scan-assembler {\tfcmne\tp[0-9]+\.h, p[0-7]/z, z[0-9]+\.h, #0\.0\n} } } */
      79  /* { dg-final { scan-assembler {\tfcmne\tp[0-9]+\.h, p[0-7]/z, z[0-9]+\.h, z[0-9]+\.h\n} } } */
      80  
      81  /* { dg-final { scan-assembler {\tfcmlt\tp[0-9]+\.h, p[0-7]/z, z[0-9]+\.h, #0\.0\n} } } */
      82  /* { dg-final { scan-assembler {\tfcmlt\tp[0-9]+\.h, p[0-7]/z, z[0-9]+\.h, z[0-9]+\.h\n} } } */
      83  
      84  /* { dg-final { scan-assembler {\tfcmle\tp[0-9]+\.h, p[0-7]/z, z[0-9]+\.h, #0\.0\n} } } */
      85  /* { dg-final { scan-assembler {\tfcmle\tp[0-9]+\.h, p[0-7]/z, z[0-9]+\.h, z[0-9]+\.h\n} } } */
      86  
      87  /* { dg-final { scan-assembler {\tfcmgt\tp[0-9]+\.h, p[0-7]/z, z[0-9]+\.h, #0\.0\n} } } */
      88  /* { dg-final { scan-assembler {\tfcmgt\tp[0-9]+\.h, p[0-7]/z, z[0-9]+\.h, z[0-9]+\.h\n} } } */
      89  
      90  /* { dg-final { scan-assembler {\tfcmge\tp[0-9]+\.h, p[0-7]/z, z[0-9]+\.h, #0\.0\n} } } */
      91  /* { dg-final { scan-assembler {\tfcmge\tp[0-9]+\.h, p[0-7]/z, z[0-9]+\.h, z[0-9]+\.h\n} } } */
      92  
      93  /* { dg-final { scan-assembler-not {\tfcmuo\tp[0-9]+\.h, p[0-7]/z, z[0-9]+\.h, #0\.0\n} } } */
      94  /* { dg-final { scan-assembler {\tfcmuo\tp[0-9]+\.h, p[0-7]/z, z[0-9]+\.h, z[0-9]+\.h\n} } } */