(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
aarch64/
narrow_high_combine.c
       1  /* { dg-skip-if "" { arm*-*-* } } */
       2  /* { dg-do compile } */
       3  /* { dg-options "-O3" } */
       4  
       5  #include <arm_neon.h>
       6  
       7  #define TEST_1_ARITH(name, rettype, rmwtype, intype, fs, rs) \
       8    rettype test_1_ ## name ## _ ## fs ## _high_combine \
       9  		(rmwtype a, intype b, intype c) \
      10  	{ \
      11  		return vcombine_ ## rs (a, name ## _ ## fs (b, c)); \
      12  	}
      13  
      14  TEST_1_ARITH (vaddhn, int8x16_t, int8x8_t, int16x8_t, s16, s8)
      15  TEST_1_ARITH (vaddhn, int16x8_t, int16x4_t, int32x4_t, s32, s16)
      16  TEST_1_ARITH (vaddhn, int32x4_t, int32x2_t, int64x2_t, s64, s32)
      17  TEST_1_ARITH (vaddhn, uint8x16_t, uint8x8_t, uint16x8_t, u16, u8)
      18  TEST_1_ARITH (vaddhn, uint16x8_t, uint16x4_t, uint32x4_t, u32, u16)
      19  TEST_1_ARITH (vaddhn, uint32x4_t, uint32x2_t, uint64x2_t, u64, u32)
      20  
      21  TEST_1_ARITH (vraddhn, int8x16_t, int8x8_t, int16x8_t, s16, s8)
      22  TEST_1_ARITH (vraddhn, int16x8_t, int16x4_t, int32x4_t, s32, s16)
      23  TEST_1_ARITH (vraddhn, int32x4_t, int32x2_t, int64x2_t, s64, s32)
      24  TEST_1_ARITH (vraddhn, uint8x16_t, uint8x8_t, uint16x8_t, u16, u8)
      25  TEST_1_ARITH (vraddhn, uint16x8_t, uint16x4_t, uint32x4_t, u32, u16)
      26  TEST_1_ARITH (vraddhn, uint32x4_t, uint32x2_t, uint64x2_t, u64, u32)
      27  
      28  TEST_1_ARITH (vsubhn, int8x16_t, int8x8_t, int16x8_t, s16, s8)
      29  TEST_1_ARITH (vsubhn, int16x8_t, int16x4_t, int32x4_t, s32, s16)
      30  TEST_1_ARITH (vsubhn, int32x4_t, int32x2_t, int64x2_t, s64, s32)
      31  TEST_1_ARITH (vsubhn, uint8x16_t, uint8x8_t, uint16x8_t, u16, u8)
      32  TEST_1_ARITH (vsubhn, uint16x8_t, uint16x4_t, uint32x4_t, u32, u16)
      33  TEST_1_ARITH (vsubhn, uint32x4_t, uint32x2_t, uint64x2_t, u64, u32)
      34  
      35  TEST_1_ARITH (vrsubhn, int8x16_t, int8x8_t, int16x8_t, s16, s8)
      36  TEST_1_ARITH (vrsubhn, int16x8_t, int16x4_t, int32x4_t, s32, s16)
      37  TEST_1_ARITH (vrsubhn, int32x4_t, int32x2_t, int64x2_t, s64, s32)
      38  TEST_1_ARITH (vrsubhn, uint8x16_t, uint8x8_t, uint16x8_t, u16, u8)
      39  TEST_1_ARITH (vrsubhn, uint16x8_t, uint16x4_t, uint32x4_t, u32, u16)
      40  TEST_1_ARITH (vrsubhn, uint32x4_t, uint32x2_t, uint64x2_t, u64, u32)
      41  
      42  #define TEST_2_ARITH(name, rettype, intype, fs, rs) \
      43    rettype test_2_ ## name ## _ ## fs ## _high_combine \
      44  		(intype a, intype b, intype c) \
      45  	{ \
      46  		return vcombine_ ## rs (name ## _ ## fs (a, c), \
      47  					name ## _ ## fs (b, c)); \
      48  	}
      49  
      50  TEST_2_ARITH (vaddhn, int8x16_t, int16x8_t, s16, s8)
      51  TEST_2_ARITH (vaddhn, int16x8_t, int32x4_t, s32, s16)
      52  TEST_2_ARITH (vaddhn, int32x4_t, int64x2_t, s64, s32)
      53  TEST_2_ARITH (vaddhn, uint8x16_t, uint16x8_t, u16, u8)
      54  TEST_2_ARITH (vaddhn, uint16x8_t, uint32x4_t, u32, u16)
      55  TEST_2_ARITH (vaddhn, uint32x4_t,  uint64x2_t, u64, u32)
      56  
      57  TEST_2_ARITH (vraddhn, int8x16_t, int16x8_t, s16, s8)
      58  TEST_2_ARITH (vraddhn, int16x8_t, int32x4_t, s32, s16)
      59  TEST_2_ARITH (vraddhn, int32x4_t, int64x2_t, s64, s32)
      60  TEST_2_ARITH (vraddhn, uint8x16_t, uint16x8_t, u16, u8)
      61  TEST_2_ARITH (vraddhn, uint16x8_t, uint32x4_t, u32, u16)
      62  TEST_2_ARITH (vraddhn, uint32x4_t, uint64x2_t, u64, u32)
      63  
      64  TEST_2_ARITH (vsubhn, int8x16_t, int16x8_t, s16, s8)
      65  TEST_2_ARITH (vsubhn, int16x8_t, int32x4_t, s32, s16)
      66  TEST_2_ARITH (vsubhn, int32x4_t, int64x2_t, s64, s32)
      67  TEST_2_ARITH (vsubhn, uint8x16_t, uint16x8_t, u16, u8)
      68  TEST_2_ARITH (vsubhn, uint16x8_t, uint32x4_t, u32, u16)
      69  TEST_2_ARITH (vsubhn, uint32x4_t, uint64x2_t, u64, u32)
      70  
      71  TEST_2_ARITH (vrsubhn, int8x16_t, int16x8_t, s16, s8)
      72  TEST_2_ARITH (vrsubhn, int16x8_t, int32x4_t, s32, s16)
      73  TEST_2_ARITH (vrsubhn, int32x4_t, int64x2_t, s64, s32)
      74  TEST_2_ARITH (vrsubhn, uint8x16_t, uint16x8_t, u16, u8)
      75  TEST_2_ARITH (vrsubhn, uint16x8_t, uint32x4_t, u32, u16)
      76  TEST_2_ARITH (vrsubhn, uint32x4_t, uint64x2_t, u64, u32)
      77  
      78  #define TEST_1_SHIFT(name, rettype, rmwtype, intype, fs, rs) \
      79    rettype test_1_ ## name ## _ ## fs ## _high_combine \
      80  		(rmwtype a, intype b) \
      81  	{ \
      82  		return vcombine_ ## rs (a, name ## _ ## fs (b, 4)); \
      83  	}
      84  
      85  TEST_1_SHIFT (vshrn_n, int8x16_t, int8x8_t, int16x8_t, s16, s8)
      86  TEST_1_SHIFT (vshrn_n, int16x8_t, int16x4_t, int32x4_t, s32, s16)
      87  TEST_1_SHIFT (vshrn_n, int32x4_t, int32x2_t, int64x2_t, s64, s32)
      88  TEST_1_SHIFT (vshrn_n, uint8x16_t, uint8x8_t, uint16x8_t, u16, u8)
      89  TEST_1_SHIFT (vshrn_n, uint16x8_t, uint16x4_t, uint32x4_t, u32, u16)
      90  TEST_1_SHIFT (vshrn_n, uint32x4_t, uint32x2_t, uint64x2_t, u64, u32)
      91  
      92  TEST_1_SHIFT (vrshrn_n, int8x16_t, int8x8_t, int16x8_t, s16, s8)
      93  TEST_1_SHIFT (vrshrn_n, int16x8_t, int16x4_t, int32x4_t, s32, s16)
      94  TEST_1_SHIFT (vrshrn_n, int32x4_t, int32x2_t, int64x2_t, s64, s32)
      95  TEST_1_SHIFT (vrshrn_n, uint8x16_t, uint8x8_t, uint16x8_t, u16, u8)
      96  TEST_1_SHIFT (vrshrn_n, uint16x8_t, uint16x4_t, uint32x4_t, u32, u16)
      97  TEST_1_SHIFT (vrshrn_n, uint32x4_t, uint32x2_t, uint64x2_t, u64, u32)
      98  
      99  TEST_1_SHIFT (vqshrn_n, int8x16_t, int8x8_t, int16x8_t, s16, s8)
     100  TEST_1_SHIFT (vqshrn_n, int16x8_t, int16x4_t, int32x4_t, s32, s16)
     101  TEST_1_SHIFT (vqshrn_n, int32x4_t, int32x2_t, int64x2_t, s64, s32)
     102  TEST_1_SHIFT (vqshrn_n, uint8x16_t, uint8x8_t, uint16x8_t, u16, u8)
     103  TEST_1_SHIFT (vqshrn_n, uint16x8_t, uint16x4_t, uint32x4_t, u32, u16)
     104  TEST_1_SHIFT (vqshrn_n, uint32x4_t, uint32x2_t, uint64x2_t, u64, u32)
     105  
     106  TEST_1_SHIFT (vqrshrn_n, int8x16_t, int8x8_t, int16x8_t, s16, s8)
     107  TEST_1_SHIFT (vqrshrn_n, int16x8_t, int16x4_t, int32x4_t, s32, s16)
     108  TEST_1_SHIFT (vqrshrn_n, int32x4_t, int32x2_t, int64x2_t, s64, s32)
     109  TEST_1_SHIFT (vqrshrn_n, uint8x16_t, uint8x8_t, uint16x8_t, u16, u8)
     110  TEST_1_SHIFT (vqrshrn_n, uint16x8_t, uint16x4_t, uint32x4_t, u32, u16)
     111  TEST_1_SHIFT (vqrshrn_n, uint32x4_t, uint32x2_t, uint64x2_t, u64, u32)
     112  
     113  TEST_1_SHIFT (vqshrun_n, uint8x16_t, uint8x8_t, int16x8_t, s16, u8)
     114  TEST_1_SHIFT (vqshrun_n, uint16x8_t, uint16x4_t, int32x4_t, s32, u16)
     115  TEST_1_SHIFT (vqshrun_n, uint32x4_t, uint32x2_t, int64x2_t, s64, u32)
     116  
     117  TEST_1_SHIFT (vqrshrun_n, uint8x16_t, uint8x8_t, int16x8_t, s16, u8)
     118  TEST_1_SHIFT (vqrshrun_n, uint16x8_t, uint16x4_t, int32x4_t, s32, u16)
     119  TEST_1_SHIFT (vqrshrun_n, uint32x4_t, uint32x2_t, int64x2_t, s64, u32)
     120  
     121  #define TEST_2_SHIFT(name, rettype, intype, fs, rs) \
     122    rettype test_2_ ## name ## _ ## fs ## _high_combine \
     123  		(intype a, intype b) \
     124  	{ \
     125  		return vcombine_ ## rs (name ## _ ## fs (a, 4), \
     126  					name ## _ ## fs (b, 4)); \
     127  	}
     128  
     129  TEST_2_SHIFT (vshrn_n, int8x16_t, int16x8_t, s16, s8)
     130  TEST_2_SHIFT (vshrn_n, int16x8_t, int32x4_t, s32, s16)
     131  TEST_2_SHIFT (vshrn_n, int32x4_t, int64x2_t, s64, s32)
     132  TEST_2_SHIFT (vshrn_n, uint8x16_t, uint16x8_t, u16, u8)
     133  TEST_2_SHIFT (vshrn_n, uint16x8_t, uint32x4_t, u32, u16)
     134  TEST_2_SHIFT (vshrn_n, uint32x4_t, uint64x2_t, u64, u32)
     135  
     136  TEST_2_SHIFT (vrshrn_n, int8x16_t, int16x8_t, s16, s8)
     137  TEST_2_SHIFT (vrshrn_n, int16x8_t, int32x4_t, s32, s16)
     138  TEST_2_SHIFT (vrshrn_n, int32x4_t, int64x2_t, s64, s32)
     139  TEST_2_SHIFT (vrshrn_n, uint8x16_t, uint16x8_t, u16, u8)
     140  TEST_2_SHIFT (vrshrn_n, uint16x8_t, uint32x4_t, u32, u16)
     141  TEST_2_SHIFT (vrshrn_n, uint32x4_t, uint64x2_t, u64, u32)
     142  
     143  TEST_2_SHIFT (vqshrn_n, int8x16_t, int16x8_t, s16, s8)
     144  TEST_2_SHIFT (vqshrn_n, int16x8_t, int32x4_t, s32, s16)
     145  TEST_2_SHIFT (vqshrn_n, int32x4_t, int64x2_t, s64, s32)
     146  TEST_2_SHIFT (vqshrn_n, uint8x16_t, uint16x8_t, u16, u8)
     147  TEST_2_SHIFT (vqshrn_n, uint16x8_t, uint32x4_t, u32, u16)
     148  TEST_2_SHIFT (vqshrn_n, uint32x4_t, uint64x2_t, u64, u32)
     149  
     150  TEST_2_SHIFT (vqrshrn_n, int8x16_t, int16x8_t, s16, s8)
     151  TEST_2_SHIFT (vqrshrn_n, int16x8_t, int32x4_t, s32, s16)
     152  TEST_2_SHIFT (vqrshrn_n, int32x4_t, int64x2_t, s64, s32)
     153  TEST_2_SHIFT (vqrshrn_n, uint8x16_t, uint16x8_t, u16, u8)
     154  TEST_2_SHIFT (vqrshrn_n, uint16x8_t, uint32x4_t, u32, u16)
     155  TEST_2_SHIFT (vqrshrn_n, uint32x4_t, uint64x2_t, u64, u32)
     156  
     157  TEST_2_SHIFT (vqshrun_n, uint8x16_t, int16x8_t, s16, u8)
     158  TEST_2_SHIFT (vqshrun_n, uint16x8_t, int32x4_t, s32, u16)
     159  TEST_2_SHIFT (vqshrun_n, uint32x4_t, int64x2_t, s64, u32)
     160  
     161  TEST_2_SHIFT (vqrshrun_n, uint8x16_t, int16x8_t, s16, u8)
     162  TEST_2_SHIFT (vqrshrun_n, uint16x8_t, int32x4_t, s32, u16)
     163  TEST_2_SHIFT (vqrshrun_n, uint32x4_t, int64x2_t, s64, u32)
     164  
     165  #define TEST_1_UNARY(name, rettype, rmwtype, intype, fs, rs) \
     166    rettype test_1_ ## name ## _ ## fs ## _high_combine \
     167  		(rmwtype a, intype b) \
     168  	{ \
     169  		return vcombine_ ## rs (a, name ## _ ## fs (b)); \
     170  	}
     171  
     172  TEST_1_UNARY (vmovn, int8x16_t, int8x8_t, int16x8_t, s16, s8)
     173  TEST_1_UNARY (vmovn, int16x8_t, int16x4_t, int32x4_t, s32, s16)
     174  TEST_1_UNARY (vmovn, int32x4_t, int32x2_t, int64x2_t, s64, s32)
     175  TEST_1_UNARY (vmovn, uint8x16_t, uint8x8_t, uint16x8_t, u16, u8)
     176  TEST_1_UNARY (vmovn, uint16x8_t, uint16x4_t, uint32x4_t, u32, u16)
     177  TEST_1_UNARY (vmovn, uint32x4_t, uint32x2_t, uint64x2_t, u64, u32)
     178  
     179  TEST_1_UNARY (vqmovn, int8x16_t, int8x8_t, int16x8_t, s16, s8)
     180  TEST_1_UNARY (vqmovn, int16x8_t, int16x4_t, int32x4_t, s32, s16)
     181  TEST_1_UNARY (vqmovn, int32x4_t, int32x2_t, int64x2_t, s64, s32)
     182  TEST_1_UNARY (vqmovn, uint8x16_t, uint8x8_t, uint16x8_t, u16, u8)
     183  TEST_1_UNARY (vqmovn, uint16x8_t, uint16x4_t, uint32x4_t, u32, u16)
     184  TEST_1_UNARY (vqmovn, uint32x4_t, uint32x2_t, uint64x2_t, u64, u32)
     185  
     186  TEST_1_UNARY (vqmovun, uint8x16_t, uint8x8_t, int16x8_t, s16, u8)
     187  TEST_1_UNARY (vqmovun, uint16x8_t, uint16x4_t, int32x4_t, s32, u16)
     188  TEST_1_UNARY (vqmovun, uint32x4_t, uint32x2_t, int64x2_t, s64, u32)
     189  
     190  #define TEST_2_UNARY(name, rettype, intype, fs, rs) \
     191    rettype test_2_ ## name ## _ ## fs ## _high_combine \
     192  		(intype a, intype b) \
     193  	{ \
     194  		return vcombine_ ## rs (name ## _ ## fs (a), \
     195  					name ## _ ## fs (b)); \
     196  	}
     197  
     198  TEST_2_UNARY (vmovn, int8x16_t, int16x8_t, s16, s8)
     199  TEST_2_UNARY (vmovn, int16x8_t, int32x4_t, s32, s16)
     200  TEST_2_UNARY (vmovn, int32x4_t, int64x2_t, s64, s32)
     201  TEST_2_UNARY (vmovn, uint8x16_t, uint16x8_t, u16, u8)
     202  TEST_2_UNARY (vmovn, uint16x8_t, uint32x4_t, u32, u16)
     203  TEST_2_UNARY (vmovn, uint32x4_t, uint64x2_t, u64, u32)
     204  
     205  TEST_2_UNARY (vqmovn, int8x16_t, int16x8_t, s16, s8)
     206  TEST_2_UNARY (vqmovn, int16x8_t, int32x4_t, s32, s16)
     207  TEST_2_UNARY (vqmovn, int32x4_t, int64x2_t, s64, s32)
     208  TEST_2_UNARY (vqmovn, uint8x16_t, uint16x8_t, u16, u8)
     209  TEST_2_UNARY (vqmovn, uint16x8_t, uint32x4_t, u32, u16)
     210  TEST_2_UNARY (vqmovn, uint32x4_t, uint64x2_t, u64, u32)
     211  
     212  TEST_2_UNARY (vqmovun, uint8x16_t, int16x8_t, s16, u8)
     213  TEST_2_UNARY (vqmovun, uint16x8_t, int32x4_t, s32, u16)
     214  TEST_2_UNARY (vqmovun, uint32x4_t, int64x2_t, s64, u32)
     215  
     216  /* { dg-final { scan-assembler-times "\\taddhn2\\tv" 12} }  */
     217  /* { dg-final { scan-assembler-times "\\tsubhn2\\tv" 12} }  */
     218  /* { dg-final { scan-assembler-times "\\trsubhn2\\tv" 12} }  */
     219  /* { dg-final { scan-assembler-times "\\traddhn2\\tv" 12} }  */
     220  /* { dg-final { scan-assembler-times "\\trshrn2\\tv" 12} }  */
     221  /* { dg-final { scan-assembler-times "\\tshrn2\\tv" 12} }  */
     222  /* { dg-final { scan-assembler-times "\\tsqshrun2\\tv" 6} }  */
     223  /* { dg-final { scan-assembler-times "\\tsqrshrun2\\tv" 6} }  */
     224  /* { dg-final { scan-assembler-times "\\tsqshrn2\\tv" 6} }  */
     225  /* { dg-final { scan-assembler-times "\\tuqshrn2\\tv" 6} }  */
     226  /* { dg-final { scan-assembler-times "\\tsqrshrn2\\tv" 6} }  */
     227  /* { dg-final { scan-assembler-times "\\tuqrshrn2\\tv" 6} }  */
     228  /* { dg-final { scan-assembler-times "\\txtn2\\tv" 6} }  */
     229  /* { dg-final { scan-assembler-times "\\tuzp1\\tv" 6} }  */
     230  /* { dg-final { scan-assembler-times "\\tuqxtn2\\tv" 6} }  */
     231  /* { dg-final { scan-assembler-times "\\tsqxtn2\\tv" 6} }  */
     232  /* { dg-final { scan-assembler-times "\\tsqxtun2\\tv" 6} }  */