(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
aarch64/
sve/
vcond_4.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 TEST_LOOP(TYPE1, TYPE2, CMP)				\
      26    void __attribute__ ((noinline, noclone))			\
      27    test_##TYPE1##_##TYPE2##_##CMP##_var (TYPE1 *restrict dest,	\
      28  					TYPE1 *restrict src,	\
      29  					TYPE1 fallback,		\
      30  					TYPE2 *restrict a,	\
      31  					TYPE2 *restrict b,	\
      32  					int count)		\
      33    {								\
      34      for (int i = 0; i < count; ++i)				\
      35        dest[i] = CMP (a[i], b[i]) ? src[i] : fallback;		\
      36    }
      37  
      38  #define TEST_CMP(CMP) \
      39    TEST_LOOP (int32_t, float, CMP) \
      40    TEST_LOOP (uint32_t, float, CMP) \
      41    TEST_LOOP (float, float, CMP) \
      42    TEST_LOOP (int64_t, double, CMP) \
      43    TEST_LOOP (uint64_t, double, CMP) \
      44    TEST_LOOP (double, double, CMP)
      45  
      46  TEST_CMP (eq)
      47  TEST_CMP (ne)
      48  TEST_CMP (olt)
      49  TEST_CMP (ole)
      50  TEST_CMP (oge)
      51  TEST_CMP (ogt)
      52  TEST_CMP (ordered)
      53  TEST_CMP (unordered)
      54  TEST_CMP (ueq)
      55  TEST_CMP (ult)
      56  TEST_CMP (ule)
      57  TEST_CMP (uge)
      58  TEST_CMP (ugt)
      59  TEST_CMP (nueq)
      60  TEST_CMP (nult)
      61  TEST_CMP (nule)
      62  TEST_CMP (nuge)
      63  TEST_CMP (nugt)
      64  
      65  /* { dg-final { scan-assembler-times {\tfcmeq\tp[0-9]+\.s, p[0-7]/z, z[0-9]+\.s, z[0-9]+\.s\n} 3 } } */
      66  /* { dg-final { scan-assembler-times {\tfcmeq\tp[0-9]+\.d, p[0-7]/z, z[0-9]+\.d, z[0-9]+\.d\n} 3 } } */
      67  
      68  /* 3 for ne, 3 for ueq and 3 for nueq.  */
      69  /* { dg-final { scan-assembler-times {\tfcmne\tp[0-9]+\.s, p[0-7]/z, z[0-9]+\.s, z[0-9]+\.s\n} 9 } } */
      70  /* { dg-final { scan-assembler-times {\tfcmne\tp[0-9]+\.d, p[0-7]/z, z[0-9]+\.d, z[0-9]+\.d\n} 9 } } */
      71  
      72  /* 3 for olt, 3 for ult and 3 for nult.  */
      73  /* { dg-final { scan-assembler-times {\tfcmlt\tp[0-9]+\.s, p[0-7]/z, z[0-9]+\.s, z[0-9]+\.s\n} 9 } } */
      74  /* { dg-final { scan-assembler-times {\tfcmlt\tp[0-9]+\.d, p[0-7]/z, z[0-9]+\.d, z[0-9]+\.d\n} 9 } } */
      75  
      76  /* 3 for ole, 3 for ule and 3 for nule.  */
      77  /* { dg-final { scan-assembler-times {\tfcmle\tp[0-9]+\.s, p[0-7]/z, z[0-9]+\.s, z[0-9]+\.s\n} 9 } } */
      78  /* { dg-final { scan-assembler-times {\tfcmle\tp[0-9]+\.d, p[0-7]/z, z[0-9]+\.d, z[0-9]+\.d\n} 9 } } */
      79  
      80  /* 3 for ogt, 3 for ugt and 3 for nugt.  */
      81  /* { dg-final { scan-assembler-times {\tfcmgt\tp[0-9]+\.s, p[0-7]/z, z[0-9]+\.s, z[0-9]+\.s\n} 9 } } */
      82  /* { dg-final { scan-assembler-times {\tfcmgt\tp[0-9]+\.d, p[0-7]/z, z[0-9]+\.d, z[0-9]+\.d\n} 9 } } */
      83  
      84  /* 3 for oge, 3 for uge and 3 for nuge.  */
      85  /* { dg-final { scan-assembler-times {\tfcmge\tp[0-9]+\.s, p[0-7]/z, z[0-9]+\.s, z[0-9]+\.s\n} 9 } } */
      86  /* { dg-final { scan-assembler-times {\tfcmge\tp[0-9]+\.d, p[0-7]/z, z[0-9]+\.d, z[0-9]+\.d\n} 9 } } */
      87  
      88  /* 3 invocations for all 12 unordered comparisons.  */
      89  /* { dg-final { scan-assembler-times {\tfcmuo\tp[0-9]+\.s, p[0-7]/z, z[0-9]+\.s, z[0-9]+\.s\n} 36 } } */
      90  /* { dg-final { scan-assembler-times {\tfcmuo\tp[0-9]+\.d, p[0-7]/z, z[0-9]+\.d, z[0-9]+\.d\n} 36 } } */