1  /* { dg-additional-options "-msve-vector-bits=scalable" } */
       2  /* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
       3  
       4  #include "test_sve_acle.h"
       5  #include <stdbool.h>
       6  
       7  /*
       8  ** cnt_b8_32:
       9  **	cntp	x0, p0, p1\.b
      10  **	ret
      11  */
      12  TEST_PTEST (cnt_b8_32, uint32_t,
      13  	    x0 = svcntp_b8 (p0, p1));
      14  
      15  /*
      16  ** cnt_b8_64:
      17  **	cntp	x0, p0, p1\.b
      18  **	ret
      19  */
      20  TEST_PTEST (cnt_b8_64, uint64_t,
      21  	    x0 = svcntp_b8 (p0, p1));
      22  
      23  /*
      24  ** inc_b8_32_general_x0:
      25  **	cntp	x([0-9]+), p0, p1\.b
      26  **	add	w0, (w0, w\1|w\1, w0)
      27  **	ret
      28  */
      29  TEST_PTEST (inc_b8_32_general_x0, uint32_t,
      30  	    x0 += svcntp_b8 (p0, p1));
      31  
      32  /*
      33  ** inc_b8_32_general_x1:
      34  **	cntp	x([0-9]+), p0, p1\.b
      35  **	add	w0, (w1, w\1|w\1, w1)
      36  **	ret
      37  */
      38  TEST_PTEST (inc_b8_32_general_x1, uint32_t,
      39  	    x0 = x1 + svcntp_b8 (p0, p1));
      40  
      41  /*
      42  ** inc_b8_32_ptrue_x0:
      43  **	incp	x0, p1\.b
      44  **	ret
      45  */
      46  TEST_PTEST (inc_b8_32_ptrue_x0, uint32_t,
      47  	    x0 += svcntp_b8 (svptrue_b8 (), p1));
      48  
      49  /*
      50  ** inc_b8_32_ptrue_x1:
      51  **	mov	w0, w1
      52  **	incp	x0, p1\.b
      53  **	ret
      54  */
      55  TEST_PTEST (inc_b8_32_ptrue_x1, uint32_t,
      56  	    x0 = x1 + svcntp_b8 (svptrue_b8 (), p1));
      57  
      58  /*
      59  ** inc_b8_64_general_x0:
      60  **	cntp	(x[0-9]+), p0, p1\.b
      61  **	add	x0, (x0, \1|\1, x0)
      62  **	ret
      63  */
      64  TEST_PTEST (inc_b8_64_general_x0, uint64_t,
      65  	    x0 += svcntp_b8 (p0, p1));
      66  
      67  /*
      68  ** inc_b8_64_general_x1:
      69  **	cntp	(x[0-9]+), p0, p1\.b
      70  **	add	x0, (x1, \1|\1, x1)
      71  **	ret
      72  */
      73  TEST_PTEST (inc_b8_64_general_x1, uint64_t,
      74  	    x0 = x1 + svcntp_b8 (p0, p1));
      75  
      76  /*
      77  ** inc_b8_64_ptrue_x0:
      78  **	incp	x0, p1\.b
      79  **	ret
      80  */
      81  TEST_PTEST (inc_b8_64_ptrue_x0, uint64_t,
      82  	    x0 += svcntp_b8 (svptrue_b8 (), p1));
      83  
      84  /*
      85  ** inc_b8_64_ptrue_x1:
      86  **	mov	x0, x1
      87  **	incp	x0, p1\.b
      88  **	ret
      89  */
      90  TEST_PTEST (inc_b8_64_ptrue_x1, uint64_t,
      91  	    x0 = x1 + svcntp_b8 (svptrue_b8 (), p1));
      92  
      93  /*
      94  ** dec_b8_32_general_x0:
      95  **	cntp	x([0-9]+), p0, p1\.b
      96  **	sub	w0, w0, w\1
      97  **	ret
      98  */
      99  TEST_PTEST (dec_b8_32_general_x0, uint32_t,
     100  	    x0 -= svcntp_b8 (p0, p1));
     101  
     102  /*
     103  ** dec_b8_32_general_x1:
     104  **	cntp	x([0-9]+), p0, p1\.b
     105  **	sub	w0, w1, w\1
     106  **	ret
     107  */
     108  TEST_PTEST (dec_b8_32_general_x1, uint32_t,
     109  	    x0 = x1 - svcntp_b8 (p0, p1));
     110  
     111  /*
     112  ** dec_b8_32_ptrue_x0:
     113  **	decp	x0, p1\.b
     114  **	ret
     115  */
     116  TEST_PTEST (dec_b8_32_ptrue_x0, uint32_t,
     117  	    x0 -= svcntp_b8 (svptrue_b8 (), p1));
     118  
     119  /*
     120  ** dec_b8_32_ptrue_x1:
     121  **	mov	w0, w1
     122  **	decp	x0, p1\.b
     123  **	ret
     124  */
     125  TEST_PTEST (dec_b8_32_ptrue_x1, uint32_t,
     126  	    x0 = x1 - svcntp_b8 (svptrue_b8 (), p1));
     127  
     128  /*
     129  ** dec_b8_64_general_x0:
     130  **	cntp	(x[0-9]+), p0, p1\.b
     131  **	sub	x0, x0, \1
     132  **	ret
     133  */
     134  TEST_PTEST (dec_b8_64_general_x0, uint64_t,
     135  	    x0 -= svcntp_b8 (p0, p1));
     136  
     137  /*
     138  ** dec_b8_64_general_x1:
     139  **	cntp	(x[0-9]+), p0, p1\.b
     140  **	sub	x0, x1, \1
     141  **	ret
     142  */
     143  TEST_PTEST (dec_b8_64_general_x1, uint64_t,
     144  	    x0 = x1 - svcntp_b8 (p0, p1));
     145  
     146  /*
     147  ** dec_b8_64_ptrue_x0:
     148  **	decp	x0, p1\.b
     149  **	ret
     150  */
     151  TEST_PTEST (dec_b8_64_ptrue_x0, uint64_t,
     152  	    x0 -= svcntp_b8 (svptrue_b8 (), p1));
     153  
     154  /*
     155  ** dec_b8_64_ptrue_x1:
     156  **	mov	x0, x1
     157  **	decp	x0, p1\.b
     158  **	ret
     159  */
     160  TEST_PTEST (dec_b8_64_ptrue_x1, uint64_t,
     161  	    x0 = x1 - svcntp_b8 (svptrue_b8 (), p1));
     162  
     163  /*
     164  ** inc_b8_s8_general_z0:
     165  **	cntp	x([0-9]+), p0, p1\.b
     166  **	mov	(z[0-9]+\.b), w\1
     167  **	add	z0\.b, (z0\.b, \2|\2, z0\.b)
     168  **	ret
     169  */
     170  TEST_UNIFORM_Z (inc_b8_s8_general_z0, svint8_t,
     171  		z0 = svadd_n_s8_x (svptrue_b8 (), z0, svcntp_b8 (p0, p1)),
     172  		z0 = svadd_x (svptrue_b8 (), z0, svcntp_b8 (p0, p1)));
     173  
     174  /*
     175  ** inc_b8_s8_general_z1:
     176  **	cntp	x([0-9]+), p0, p1\.b
     177  **	mov	(z[0-9]+\.b), w\1
     178  **	add	z0\.b, (z1\.b, \2|\2, z1\.b)
     179  **	ret
     180  */
     181  TEST_UNIFORM_Z (inc_b8_s8_general_z1, svint8_t,
     182  		z0 = svadd_n_s8_x (svptrue_b8 (), z1, svcntp_b8 (p0, p1)),
     183  		z0 = svadd_x (svptrue_b8 (), z1, svcntp_b8 (p0, p1)));
     184  
     185  /*
     186  ** inc_b8_s8_ptrue_z0:
     187  **	ptrue	(p[0-7])\.b, all
     188  **	cntp	x([0-9]+), \1, p0\.b
     189  **	mov	(z[0-9]+\.b), w\2
     190  **	add	z0\.b, (z0\.b, \3|\3, z0\.b)
     191  **	ret
     192  */
     193  TEST_UNIFORM_Z (inc_b8_s8_ptrue_z0, svint8_t,
     194  		z0 = svadd_n_s8_x (svptrue_b8 (), z0, svcntp_b8 (svptrue_b8 (), p0)),
     195  		z0 = svadd_x (svptrue_b8 (), z0, svcntp_b8 (svptrue_b8 (), p0)));
     196  
     197  /*
     198  ** inc_b8_s8_ptrue_z1:
     199  **	ptrue	(p[0-7])\.b, all
     200  **	cntp	x([0-9]+), \1, p0\.b
     201  **	mov	(z[0-9]+\.b), w\2
     202  **	add	z0\.b, (z1\.b, \3|\3, z1\.b)
     203  **	ret
     204  */
     205  TEST_UNIFORM_Z (inc_b8_s8_ptrue_z1, svint8_t,
     206  		z0 = svadd_n_s8_x (svptrue_b8 (), z1, svcntp_b8 (svptrue_b8 (), p0)),
     207  		z0 = svadd_x (svptrue_b8 (), z1, svcntp_b8 (svptrue_b8 (), p0)));
     208  
     209  /*
     210  ** dec_b8_s8_general_z0:
     211  **	cntp	x([0-9]+), p0, p1\.b
     212  **	mov	(z[0-9]+\.b), w\1
     213  **	sub	z0\.b, z0\.b, \2
     214  **	ret
     215  */
     216  TEST_UNIFORM_Z (dec_b8_s8_general_z0, svint8_t,
     217  		z0 = svsub_n_s8_x (svptrue_b8 (), z0, svcntp_b8 (p0, p1)),
     218  		z0 = svsub_x (svptrue_b8 (), z0, svcntp_b8 (p0, p1)));
     219  
     220  /*
     221  ** dec_b8_s8_general_z1:
     222  **	cntp	x([0-9]+), p0, p1\.b
     223  **	mov	(z[0-9]+\.b), w\1
     224  **	sub	z0\.b, z1\.b, \2
     225  **	ret
     226  */
     227  TEST_UNIFORM_Z (dec_b8_s8_general_z1, svint8_t,
     228  		z0 = svsub_n_s8_x (svptrue_b8 (), z1, svcntp_b8 (p0, p1)),
     229  		z0 = svsub_x (svptrue_b8 (), z1, svcntp_b8 (p0, p1)));
     230  
     231  /*
     232  ** dec_b8_s8_ptrue_z0:
     233  **	ptrue	(p[0-7])\.b, all
     234  **	cntp	x([0-9]+), \1, p0\.b
     235  **	mov	(z[0-9]+\.b), w\2
     236  **	sub	z0\.b, z0\.b, \3
     237  **	ret
     238  */
     239  TEST_UNIFORM_Z (dec_b8_s8_ptrue_z0, svint8_t,
     240  		z0 = svsub_n_s8_x (svptrue_b8 (), z0, svcntp_b8 (svptrue_b8 (), p0)),
     241  		z0 = svsub_x (svptrue_b8 (), z0, svcntp_b8 (svptrue_b8 (), p0)));
     242  
     243  /*
     244  ** dec_b8_s8_ptrue_z1:
     245  **	ptrue	(p[0-7])\.b, all
     246  **	cntp	x([0-9]+), \1, p0\.b
     247  **	mov	(z[0-9]+\.b), w\2
     248  **	sub	z0\.b, z1\.b, \3
     249  **	ret
     250  */
     251  TEST_UNIFORM_Z (dec_b8_s8_ptrue_z1, svint8_t,
     252  		z0 = svsub_n_s8_x (svptrue_b8 (), z1, svcntp_b8 (svptrue_b8 (), p0)),
     253  		z0 = svsub_x (svptrue_b8 (), z1, svcntp_b8 (svptrue_b8 (), p0)));