(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
aarch64/
vabs_intrinsic_1.c
       1  /* { dg-do run } */
       2  /* { dg-options "-O3 --save-temps" } */
       3  
       4  #include <arm_neon.h>
       5  
       6  extern void abort (void);
       7  
       8  #define ETYPE(size) int##size##_t
       9  #define VTYPE(size, lanes) int##size##x##lanes##_t
      10  
      11  #define TEST_VABS(q, size, lanes)				\
      12  static void							\
      13  test_vabs##q##_##size (ETYPE (size) * res,			\
      14  			const ETYPE (size) *in1)		\
      15  {								\
      16    VTYPE (size, lanes) a = vld1##q##_s##size (res);		\
      17    VTYPE (size, lanes) b = vld1##q##_s##size (in1);		\
      18    a = vabs##q##_s##size (b);					\
      19    vst1##q##_s##size (res, a);					\
      20  }
      21  
      22  #define BUILD_VARS(width, n_lanes, n_half_lanes)		\
      23  TEST_VABS (, width, n_half_lanes)				\
      24  TEST_VABS (q, width, n_lanes)					\
      25  
      26  BUILD_VARS (64, 2, 1)
      27  BUILD_VARS (32, 4, 2)
      28  BUILD_VARS (16, 8, 4)
      29  BUILD_VARS (8, 16, 8)
      30  
      31  #define POOL1  {-10}
      32  #define POOL2  {2, -10}
      33  #define POOL4  {0, -10, 2, -3}
      34  #define POOL8  {0, -10, 2, -3, 4, -50, 6, -70}
      35  #define POOL16 {0, -10, 2, -3, 4, -50, 6, -70,			\
      36  		-5, 10, -2, 3, -4, 50, -6, 70}
      37  
      38  #define EXPECTED1  {10}
      39  #define EXPECTED2  {2, 10}
      40  #define EXPECTED4  {0, 10, 2, 3}
      41  #define EXPECTED8  {0, 10, 2, 3, 4, 50, 6, 70}
      42  #define EXPECTED16 {0, 10, 2, 3, 4, 50, 6, 70,			\
      43  		    5, 10, 2, 3, 4, 50, 6, 70}
      44  
      45  #define BUILD_TEST(size, lanes_64, lanes_128)			\
      46  static void							\
      47  test_##size (void)						\
      48  {								\
      49    int i;							\
      50    ETYPE (size) pool1[lanes_64] = POOL##lanes_64;		\
      51    ETYPE (size) res1[lanes_64] = {0};				\
      52    ETYPE (size) expected1[lanes_64] = EXPECTED##lanes_64;	\
      53    ETYPE (size) pool2[lanes_128] = POOL##lanes_128;		\
      54    ETYPE (size) res2[lanes_128] = {0};				\
      55    ETYPE (size) expected2[lanes_128] = EXPECTED##lanes_128;	\
      56  								\
      57    /* Forcefully avoid optimization.  */				\
      58    asm volatile ("" : : : "memory");				\
      59    test_vabs_##size (res1, pool1);				\
      60    for (i = 0; i < lanes_64; i++)				\
      61      if (res1[i] != expected1[i])				\
      62        abort ();							\
      63  								\
      64    /* Forcefully avoid optimization.  */				\
      65    asm volatile ("" : : : "memory");				\
      66    test_vabsq_##size (res2, pool2);				\
      67    for (i = 0; i < lanes_128; i++)				\
      68      if (res2[i] != expected2[i])				\
      69        abort ();							\
      70  }
      71  
      72  /* { dg-final { scan-assembler-times "abs\\tv\[0-9\]+\.8b, v\[0-9\]+\.8b" 1 } } */
      73  /* { dg-final { scan-assembler-times "abs\\tv\[0-9\]+\.16b, v\[0-9\]+\.16b" 1 } } */
      74  BUILD_TEST (8 , 8, 16)
      75  
      76  /* { dg-final { scan-assembler-times "abs\\tv\[0-9\]+\.4h, v\[0-9\]+\.4h" 1 } } */
      77  /* { dg-final { scan-assembler-times "abs\\tv\[0-9\]+\.8h, v\[0-9\]+\.8h" 1 } } */
      78  BUILD_TEST (16, 4, 8)
      79  
      80  /* { dg-final { scan-assembler-times "abs\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" 1 } } */
      81  /* { dg-final { scan-assembler-times "abs\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" 1 } } */
      82  BUILD_TEST (32, 2, 4)
      83  
      84  /* { dg-final { scan-assembler-times "abs\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d" 1 } } */
      85  BUILD_TEST (64, 1, 2)
      86  
      87  #undef BUILD_TEST
      88  
      89  #define BUILD_TEST(size) test_##size ()
      90  
      91  int
      92  main (int argc, char **argv)
      93  {
      94    BUILD_TEST (8);
      95    BUILD_TEST (16);
      96    BUILD_TEST (32);
      97    BUILD_TEST (64);
      98    return 0;
      99  }
     100