(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
aarch64/
sve/
pcs/
struct_1_128.c
       1  /* { dg-do run { target { aarch64_sve128_hw } } } */
       2  /* { dg-require-effective-target aarch64_little_endian } */
       3  /* { dg-options "-msve-vector-bits=128" } */
       4  
       5  #include "struct.h"
       6  
       7  struct pst1
       8  {
       9    fixed_int8_t v[8];
      10    fixed_bool_t p[4];
      11  };
      12  
      13  ASM_FUNCTION (make_pst1_asm, struct pst1, (),
      14  	      "mov z0.b, #1\n\t"
      15  	      "mov z1.b, #4\n\t"
      16  	      "mov z2.b, #5\n\t"
      17  	      "mov z3.b, #9\n\t"
      18  	      "mov z4.b, #14\n\t"
      19  	      "mov z5.b, #23\n\t"
      20  	      "mov z6.b, #37\n\t"
      21  	      "mov z7.b, #60\n\t"
      22  	      "ptrue p0.b, vl1\n\t"
      23  	      "ptrue p1.b, vl2\n\t"
      24  	      "ptrue p2.b, vl3\n\t"
      25  	      "ptrue p3.b, vl4");
      26  
      27  #define LOAD_PST1(PTR) \
      28    "ld1b z0.b, p0/z, [" PTR ", #0, mul vl]\n\t" \
      29    "ld1b z1.b, p0/z, [" PTR ", #1, mul vl]\n\t" \
      30    "ld1b z2.b, p0/z, [" PTR ", #2, mul vl]\n\t" \
      31    "ld1b z3.b, p0/z, [" PTR ", #3, mul vl]\n\t" \
      32    "ld1b z4.b, p0/z, [" PTR ", #4, mul vl]\n\t" \
      33    "ld1b z5.b, p0/z, [" PTR ", #5, mul vl]\n\t" \
      34    "ld1b z6.b, p0/z, [" PTR ", #6, mul vl]\n\t" \
      35    "ld1b z7.b, p0/z, [" PTR ", #7, mul vl]\n\t" \
      36    "incb " PTR ", all, mul #8\n\t" \
      37    "ldr p0, [" PTR ", #0, mul vl]\n\t" \
      38    "ldr p1, [" PTR ", #1, mul vl]\n\t" \
      39    "ldr p2, [" PTR ", #2, mul vl]\n\t" \
      40    "ldr p3, [" PTR ", #3, mul vl]"
      41  
      42  ASM_FUNCTION (passthru_pst1_x0_a,
      43  	      struct pst1, (svbool_t, struct pst1),
      44  	      "incp x0, p0.b\n\t"
      45  	      "sub x0, x0, #11\n\t"
      46  	      "ptrue p0.b\n\t"
      47  	      LOAD_PST1 ("x0"));
      48  
      49  ASM_FUNCTION (passthru_pst1_x0_b,
      50  	      struct pst1, (svbool_t, struct pst1, uint64_t),
      51  	      "incp x0, p0.b\n\t"
      52  	      "add x0, x0, x1\n\t"
      53  	      "sub x0, x0, #52\n\t"
      54  	      "ptrue p0.b\n\t"
      55  	      LOAD_PST1 ("x0"));
      56  
      57  ASM_FUNCTION (passthru_pst1_x0_c,
      58  	      struct pst1, (svbool_t, struct pst1, svbool_t,
      59  			    svbool_t, svbool_t, svbool_t),
      60  	      "incp x0, p0.b\n\t"
      61  	      "ldr p0, [x1]\n\t"
      62  	      "incp x0, p1.b\n\t"
      63  	      "incp x0, p2.b\n\t"
      64  	      "incp x0, p3.b\n\t"
      65  	      "incp x0, p0.b\n\t"
      66  	      "sub x0, x0, #27\n\t"
      67  	      "ptrue p0.b\n\t"
      68  	      LOAD_PST1 ("x0"));
      69  
      70  ASM_FUNCTION (passthru_pst1_x0_d,
      71  	      struct pst1, (svfloat32_t, struct pst1),
      72  	      "ptrue p0.b\n\t"
      73  	      "fmov z1.s, #1.0\n\t"
      74  	      "fcmeq p0.s, p0/z, z0.s, z1.s\n\t"
      75  	      "uzp1 p0.b, p0.b, p0.b\n\t"
      76  	      "uzp1 p0.b, p0.b, p0.b\n\t"
      77  	      LOAD_PST1 ("x0"));
      78  
      79  ASM_FUNCTION (passthru_pst1_x0_e,
      80  	      struct pst1, (svfloat32_t, struct pst1, svint32_t,
      81  			    svint32_t, svint32_t, svint32_t,
      82  			    svint32_t, svint32_t, svint32_t),
      83  	      "ptrue p0.b\n\t"
      84  	      "fmov z24.s, #4.0\n\t"
      85  	      "fcmeq p0.s, p0/z, z0.s, z24.s\n\t"
      86  	      "cmpeq p0.s, p0/z, z1.s, #-4\n\t"
      87  	      "cmpeq p0.s, p0/z, z2.s, #-9\n\t"
      88  	      "cmpeq p0.s, p0/z, z3.s, #-14\n\t"
      89  	      "cmpeq p0.s, p0/z, z4.s, #11\n\t"
      90  	      "cmpeq p0.s, p0/z, z5.s, #10\n\t"
      91  	      "cmpeq p0.s, p0/z, z6.s, #8\n\t"
      92  	      "cmpeq p0.s, p0/z, z7.s, #-1\n\t"
      93  	      "uzp1 p0.b, p0.b, p0.b\n\t"
      94  	      "uzp1 p0.b, p0.b, p0.b\n\t"
      95  	      LOAD_PST1 ("x0"));
      96  
      97  ASM_FUNCTION (passthru_pst1_x7_a,
      98  	      struct pst1, (svbool_t,
      99  			    uint64_t, uint64_t, uint64_t, uint64_t,
     100  			    uint64_t, uint64_t, uint64_t, struct pst1),
     101  	      "add x0, x0, x1\n\t"
     102  	      "add x2, x2, x3\n\t"
     103  	      "add x4, x4, x5\n\t"
     104  	      "add x0, x0, x2\n\t"
     105  	      "add x4, x4, x6\n\t"
     106  	      "add x0, x0, x4\n\t"
     107  	      "add x7, x7, x0\n\t"
     108  	      "sub x7, x7, #127\n\t"
     109  	      "ptrue p0.b\n\t"
     110  	      LOAD_PST1 ("x7"));
     111  
     112  ASM_FUNCTION (passthru_pst1_x7_b,
     113  	      struct pst1, (svbool_t, svbool_t, svbool_t, svbool_t,
     114  			    svbool_t, svbool_t, svbool_t, svbool_t,
     115  			    svbool_t, svbool_t, svbool_t,
     116  			    struct pst1),
     117  	      "and p0.b, p1/z, p0.b, p2.b\n\t"
     118  	      "ldr p2, [x0]\n\t"
     119  	      "and p0.b, p2/z, p0.b, p3.b\n\t"
     120  	      "ldr p2, [x1]\n\t"
     121  	      "ldr p3, [x2]\n\t"
     122  	      "and p0.b, p2/z, p0.b, p3.b\n\t"
     123  	      "ldr p2, [x3]\n\t"
     124  	      "ldr p3, [x4]\n\t"
     125  	      "and p0.b, p2/z, p0.b, p3.b\n\t"
     126  	      "ldr p2, [x5]\n\t"
     127  	      "ldr p3, [x6]\n\t"
     128  	      "and p0.b, p2/z, p0.b, p3.b\n\t"
     129  	      LOAD_PST1 ("x7"));
     130  
     131  ASM_FUNCTION (passthru_pst1_sp_a,
     132  	      struct pst1, (svbool_t, svbool_t, svbool_t, svbool_t,
     133  			    svbool_t, svbool_t, svbool_t, svbool_t,
     134  			    svbool_t, svbool_t, svbool_t, svbool_t,
     135  			    struct pst1),
     136  	      "and p0.b, p1/z, p0.b, p2.b\n\t"
     137  	      "ldr p2, [x0]\n\t"
     138  	      "and p0.b, p2/z, p0.b, p3.b\n\t"
     139  	      "ldr p2, [x1]\n\t"
     140  	      "ldr p3, [x2]\n\t"
     141  	      "and p0.b, p2/z, p0.b, p3.b\n\t"
     142  	      "ldr p2, [x3]\n\t"
     143  	      "ldr p3, [x4]\n\t"
     144  	      "and p0.b, p2/z, p0.b, p3.b\n\t"
     145  	      "ldr p2, [x5]\n\t"
     146  	      "ldr p3, [x6]\n\t"
     147  	      "and p0.b, p2/z, p0.b, p3.b\n\t"
     148  	      "ldr p2, [x7]\n\t"
     149  	      "and p0.b, p2/z, p0.b, p0.b\n\t"
     150  	      "ldr x5, [sp]\n\t"
     151  #if __ILP32__
     152  	      "uxtw x5, w5\n\t"
     153  #endif
     154  	      LOAD_PST1 ("x5"));
     155  
     156  void
     157  test_vl (svbool_t p0, unsigned int vl)
     158  {
     159    svbool_t pg = svptrue_b8 ();
     160    if (svptest_any (pg, sveor_z (pg, p0, svwhilelt_b8 (0U, vl))))
     161      __builtin_abort ();
     162  }
     163  
     164  void
     165  test_pst1 (struct pst1 *x)
     166  {
     167    svbool_t pg = svptrue_b8 ();
     168    if (svptest_any (pg, svcmpne (pg, x->v[0], 1))
     169        || svptest_any (pg, svcmpne (pg, x->v[1], 4))
     170        || svptest_any (pg, svcmpne (pg, x->v[2], 5))
     171        || svptest_any (pg, svcmpne (pg, x->v[3], 9))
     172        || svptest_any (pg, svcmpne (pg, x->v[4], 14))
     173        || svptest_any (pg, svcmpne (pg, x->v[5], 23))
     174        || svptest_any (pg, svcmpne (pg, x->v[6], 37))
     175        || svptest_any (pg, svcmpne (pg, x->v[7], 60))
     176        || svptest_any (pg, sveor_z (pg, x->p[0], svptrue_pat_b8 (SV_VL1)))
     177        || svptest_any (pg, sveor_z (pg, x->p[1], svptrue_pat_b8 (SV_VL2)))
     178        || svptest_any (pg, sveor_z (pg, x->p[2], svptrue_pat_b8 (SV_VL3)))
     179        || svptest_any (pg, sveor_z (pg, x->p[3], svptrue_pat_b8 (SV_VL4))))
     180      __builtin_abort ();
     181  }
     182  
     183  struct pst1
     184  make_pst1 (void)
     185  {
     186    struct pst1 res;
     187    res.v[0] = svdup_s8 (1);
     188    res.v[1] = svdup_s8 (4);
     189    res.v[2] = svdup_s8 (5);
     190    res.v[3] = svdup_s8 (9);
     191    res.v[4] = svdup_s8 (14);
     192    res.v[5] = svdup_s8 (23);
     193    res.v[6] = svdup_s8 (37);
     194    res.v[7] = svdup_s8 (60);
     195    res.p[0] = svptrue_pat_b8 (SV_VL1);
     196    res.p[1] = svptrue_pat_b8 (SV_VL2);
     197    res.p[2] = svptrue_pat_b8 (SV_VL3);
     198    res.p[3] = svptrue_pat_b8 (SV_VL4);
     199    return res;
     200  }
     201  
     202  struct pst1
     203  deref_pst1 (struct pst1 *ptr)
     204  {
     205    return *ptr;
     206  }
     207  
     208  void
     209  consume_pst1 (struct pst1 x)
     210  {
     211    test_pst1 (&x);
     212  }
     213  
     214  void
     215  consume_pst1_x0_a (svbool_t p0, struct pst1 x0)
     216  {
     217    test_vl (p0, 11);
     218    test_pst1 (&x0);
     219  }
     220  
     221  void
     222  consume_pst1_x0_b (svbool_t p0, struct pst1 x0, uint64_t x1)
     223  {
     224    test_vl (p0, 10);
     225    test_pst1 (&x0);
     226    if (x1 != 42)
     227      __builtin_abort ();
     228  }
     229  
     230  void
     231  consume_pst1_x0_c (svbool_t p0, struct pst1 x0, svbool_t p1,
     232  		   svbool_t p2, svbool_t p3, svbool_t x1)
     233  {
     234    test_vl (p0, 9);
     235    test_pst1 (&x0);
     236    test_vl (p1, 7);
     237    test_vl (p2, 6);
     238    test_vl (p3, 3);
     239    test_vl (x1, 2);
     240  }
     241  
     242  void
     243  consume_pst1_x0_d (svfloat32_t z0, struct pst1 x0)
     244  {
     245    svbool_t pg = svptrue_b8 ();
     246    if (svptest_any (pg, svcmpne (pg, z0, 1.0)))
     247      __builtin_abort ();
     248    test_pst1 (&x0);
     249  }
     250  
     251  void
     252  consume_pst1_x0_e (svfloat32_t z0, struct pst1 x0,
     253  		   svint32_t z1, svint32_t z2, svint32_t z3, svint32_t z4,
     254  		   svint32_t z5, svint32_t z6, svint32_t z7)
     255  {
     256    svbool_t pg = svptrue_b8 ();
     257    if (svptest_any (pg, svcmpne (pg, z0, 4.0))
     258        || svptest_any (pg, svcmpne (pg, z1, -4))
     259        || svptest_any (pg, svcmpne (pg, z2, -9))
     260        || svptest_any (pg, svcmpne (pg, z3, -14))
     261        || svptest_any (pg, svcmpne (pg, z4, 11))
     262        || svptest_any (pg, svcmpne (pg, z5, 10))
     263        || svptest_any (pg, svcmpne (pg, z6, 8))
     264        || svptest_any (pg, svcmpne (pg, z7, -1)))
     265      __builtin_abort ();
     266    test_pst1 (&x0);
     267  }
     268  
     269  void
     270  consume_pst1_x7_a (svbool_t p0, uint64_t x0, uint64_t x1, uint64_t x2,
     271  		   uint64_t x3, uint64_t x4, uint64_t x5, uint64_t x6,
     272  		   struct pst1 x7)
     273  {
     274    test_vl (p0, __ARM_FEATURE_SVE_BITS);
     275    if (x0 != 1
     276        || x1 != 2
     277        || x2 != 4
     278        || x3 != 8
     279        || x4 != 16
     280        || x5 != 32
     281        || x6 != 64)
     282      __builtin_abort ();
     283    test_pst1 (&x7);
     284  }
     285  
     286  void
     287  consume_pst1_x7_b (svbool_t p0, svbool_t p1, svbool_t p2, svbool_t p3,
     288  		   svbool_t x0, svbool_t x1, svbool_t x2, svbool_t x3,
     289  		   svbool_t x4, svbool_t x5, svbool_t x6, struct pst1 x7)
     290  {
     291    test_vl (p0, __ARM_FEATURE_SVE_BITS);
     292    test_vl (p1, __ARM_FEATURE_SVE_BITS);
     293    test_vl (p2, __ARM_FEATURE_SVE_BITS);
     294    test_vl (p3, __ARM_FEATURE_SVE_BITS);
     295    test_vl (x0, __ARM_FEATURE_SVE_BITS);
     296    test_vl (x1, __ARM_FEATURE_SVE_BITS);
     297    test_vl (x2, __ARM_FEATURE_SVE_BITS);
     298    test_vl (x3, __ARM_FEATURE_SVE_BITS);
     299    test_vl (x4, __ARM_FEATURE_SVE_BITS);
     300    test_vl (x5, __ARM_FEATURE_SVE_BITS);
     301    test_vl (x6, __ARM_FEATURE_SVE_BITS);
     302    test_pst1 (&x7);
     303  }
     304  
     305  void
     306  consume_pst1_sp_a (svbool_t p0, svbool_t p1, svbool_t p2, svbool_t p3,
     307  		   svbool_t x0, svbool_t x1, svbool_t x2, svbool_t x3,
     308  		   svbool_t x4, svbool_t x5, svbool_t x6, svbool_t x7,
     309  		   struct pst1 sp)
     310  {
     311    test_vl (p0, __ARM_FEATURE_SVE_BITS);
     312    test_vl (p1, __ARM_FEATURE_SVE_BITS);
     313    test_vl (p2, __ARM_FEATURE_SVE_BITS);
     314    test_vl (p3, __ARM_FEATURE_SVE_BITS);
     315    test_vl (x0, __ARM_FEATURE_SVE_BITS);
     316    test_vl (x1, __ARM_FEATURE_SVE_BITS);
     317    test_vl (x2, __ARM_FEATURE_SVE_BITS);
     318    test_vl (x3, __ARM_FEATURE_SVE_BITS);
     319    test_vl (x4, __ARM_FEATURE_SVE_BITS);
     320    test_vl (x5, __ARM_FEATURE_SVE_BITS);
     321    test_vl (x6, __ARM_FEATURE_SVE_BITS);
     322    test_vl (x7, __ARM_FEATURE_SVE_BITS);
     323    test_pst1 (&sp);
     324  }
     325  
     326  int
     327  main (void)
     328  {
     329    svbool_t pg = svptrue_b8 ();
     330    svbool_t vl2 = svptrue_pat_b8 (SV_VL2);
     331    svbool_t vl3 = svptrue_pat_b8 (SV_VL3);
     332    svbool_t vl6 = svptrue_pat_b8 (SV_VL6);
     333    svbool_t vl7 = svptrue_pat_b8 (SV_VL7);
     334    svbool_t vl9 = svwhilelt_b8 (0, 9);
     335    svbool_t vl10 = svwhilelt_b8 (0, 10);
     336    svbool_t vl11 = svwhilelt_b8 (0, 11);
     337  
     338    CLEANSE; struct pst1 res1 = make_pst1_asm ();
     339    CLEANSE; test_pst1 (&res1);
     340    CLEANSE; consume_pst1 (make_pst1 ());
     341  
     342    CLEANSE; struct pst1 res2 = deref_pst1 (&res1);
     343    CLEANSE; test_pst1 (&res2);
     344    CLEANSE; consume_pst1 (res2);
     345  
     346    CLEANSE; struct pst1 res3 = passthru_pst1_x0_a (vl11, res1);
     347    CLEANSE; test_pst1 (&res3);
     348    CLEANSE; consume_pst1_x0_a (vl11, res3);
     349  
     350    CLEANSE; struct pst1 res4 = passthru_pst1_x0_b (vl10, res1, 42);
     351    CLEANSE; test_pst1 (&res4);
     352    CLEANSE; consume_pst1_x0_b (vl10, res4, 42);
     353  
     354    CLEANSE; struct pst1 res5 = passthru_pst1_x0_c (vl9, res1, vl7,
     355  						  vl6, vl3, vl2);
     356    CLEANSE; test_pst1 (&res5);
     357    CLEANSE; consume_pst1_x0_c (vl9, res5, vl7,
     358  			      vl6, vl3, vl2);
     359  
     360    CLEANSE; struct pst1 res6 = passthru_pst1_x0_d (svdup_f32 (1.0), res1);
     361    CLEANSE; test_pst1 (&res6);
     362    CLEANSE; consume_pst1_x0_d (svdup_f32 (1.0), res6);
     363  
     364    CLEANSE; struct pst1 res7 = passthru_pst1_x0_e (svdup_f32 (4.0), res1,
     365  						  svdup_s32 (-4),
     366  						  svdup_s32 (-9),
     367  						  svdup_s32 (-14),
     368  						  svdup_s32 (11),
     369  						  svdup_s32 (10),
     370  						  svdup_s32 (8),
     371  						  svdup_s32 (-1));
     372    CLEANSE; test_pst1 (&res7);
     373    CLEANSE; consume_pst1_x0_e (svdup_f32 (4.0), res1,
     374  			      svdup_s32 (-4),
     375  			      svdup_s32 (-9),
     376  			      svdup_s32 (-14),
     377  			      svdup_s32 (11),
     378  			      svdup_s32 (10),
     379  			      svdup_s32 (8),
     380  			      svdup_s32 (-1));
     381  
     382    CLEANSE; struct pst1 res8 = passthru_pst1_x7_a (pg, 1, 2, 4, 8,
     383  						  16, 32, 64, res1);
     384    CLEANSE; test_pst1 (&res8);
     385    CLEANSE; consume_pst1_x7_a (pg, 1, 2, 4, 8,
     386  			      16, 32, 64, res8);
     387  
     388    CLEANSE; struct pst1 res9 = passthru_pst1_x7_b (pg, pg, pg, pg,
     389  						  pg, pg, pg, pg,
     390  						  pg, pg, pg, res1);
     391    CLEANSE; test_pst1 (&res9);
     392    CLEANSE; consume_pst1_x7_b (pg, pg, pg, pg,
     393  			      pg, pg, pg, pg,
     394  			      pg, pg, pg, res9);
     395  
     396    CLEANSE; struct pst1 res10 = passthru_pst1_sp_a (pg, pg, pg, pg,
     397  						   pg, pg, pg, pg,
     398  						   pg, pg, pg, pg, res1);
     399    CLEANSE; test_pst1 (&res10);
     400    CLEANSE; consume_pst1_sp_a (pg, pg, pg, pg,
     401  			      pg, pg, pg, pg,
     402  			      pg, pg, pg, pg, res10);
     403  
     404    return 0;
     405  }