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