(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
powerpc/
vsx-builtin-16d.c
       1  /* { dg-do run } */
       2  /* { dg-require-effective-target vmx_hw } */
       3  /* { dg-options "-maltivec -O3" } */
       4  
       5  /* This test should run the same on any target that supports altivec/vmx
       6     instructions.  Intentionally not specifying cpu in order to test
       7     all code generation paths.  */
       8  
       9  #include <altivec.h>
      10  
      11  extern void abort (void);
      12  
      13  #define CONST0		(0)
      14  #define CONST1		(1)
      15  #define CONST2		(2)
      16  #define CONST3		(3)
      17  #define CONST4		(4)
      18  #define CONST5		(5)
      19  #define CONST6		(6)
      20  #define CONST7		(7)
      21  #define CONST8		(8)
      22  #define CONST9		(9)
      23  #define CONSTA		(10)
      24  #define CONSTB		(11)
      25  #define CONSTC		(12)
      26  #define CONSTD		(13)
      27  #define CONSTE		(14)
      28  #define CONSTF		(15)
      29  
      30  
      31  /* Test that indices > length of vector are applied modulo the vector
      32     length.  */
      33  
      34  /* Test for vector residing in register.  */
      35  vector unsigned char c0 (vector unsigned char v, unsigned char x)
      36  {
      37    return vec_insert (x, v, 0);
      38  }
      39  
      40  vector unsigned char c9 (vector unsigned char v, unsigned char x)
      41  {
      42    return vec_insert (x, v, 9);
      43  }
      44  
      45  vector unsigned char c21 (vector unsigned char v, unsigned char x)
      46  {
      47    return vec_insert (x, v, 21);
      48  }
      49  
      50  vector unsigned char c30 (vector unsigned char v, unsigned char x)
      51  {
      52    return vec_insert (x, v, 30);
      53  }
      54  
      55  /* Test for vector residing in memory.  */
      56  vector unsigned char mc0 (vector unsigned char *vp, unsigned char x)
      57  {
      58    return vec_insert (x, *vp, 0);
      59  }
      60  
      61  vector unsigned char mc9 (vector unsigned char *vp, unsigned char x)
      62  {
      63    return vec_insert (x, *vp, 9);
      64  }
      65  
      66  vector unsigned char mc21 (vector unsigned char *vp, unsigned char x)
      67  {
      68    return vec_insert (x, *vp, 21);
      69  }
      70  
      71  vector unsigned char mc30 (vector unsigned char *vp, unsigned char x)
      72  {
      73    return vec_insert (x, *vp, 30);
      74  }
      75  
      76  /* Test the same with variable indices.  */
      77  
      78  /* Test for variable selector and vector residing in register.  */
      79  __attribute__((noinline))
      80  vector unsigned char ci (vector unsigned char v, int i, unsigned char x)
      81  {
      82    return vec_insert (x, v, i);
      83  }
      84  
      85  /* Test for variable selector and vector residing in memory.  */
      86  __attribute__((noinline))
      87  vector unsigned char mci (vector unsigned char *vp, int i, unsigned char x)
      88  {
      89    return vec_insert (x, *vp, i);
      90  }
      91  
      92  
      93  int main (int argc, char *argv[]) {
      94    vector unsigned char cv = { CONST0, CONST1, CONST2, CONST3,
      95  			      CONST4, CONST5, CONST6, CONST7,
      96  			      CONST8, CONST9, CONSTA, CONSTB,
      97  			      CONSTC, CONSTD, CONSTE, CONSTF };
      98    cv = c0 (cv, CONST3);
      99    if (cv [0] != CONST3)
     100      abort ();
     101  
     102    cv = c9 (cv, CONST2);
     103    if (cv [9] != CONST2)
     104      abort ();
     105  
     106    cv = c21 (cv, CONSTF);
     107    if (cv [5] != CONSTF)
     108      abort ();
     109  
     110    cv = c30 (cv, CONST3);
     111    if (cv [14] != CONST3)
     112      abort ();
     113  
     114    cv = mc0 (&cv, CONST4);
     115    if (cv [0] != CONST4)
     116      abort ();
     117  
     118    cv = mc9 (&cv, CONST3);
     119    if (cv [9] != CONST3)
     120      abort ();
     121  
     122    cv = mc21 (&cv, CONST1);
     123    if (cv [5] != CONST1)
     124      abort ();
     125  
     126    cv = mc30 (&cv, CONSTC);
     127    if (cv [14] != CONSTC)
     128      abort ();
     129  
     130    cv = ci (cv, 8, CONSTD);
     131    if (cv [8] != CONSTD)
     132      abort ();
     133  
     134    cv = ci (cv, 13, CONST5);
     135    if (cv [13] != CONST5)
     136      abort ();
     137  
     138    cv = ci (cv, 23, CONST6);
     139    if (cv [7] != CONST6)
     140      abort ();
     141  
     142    cv = ci (cv, 31, CONST7);
     143    if (cv [15] != CONST7)
     144      abort ();
     145  
     146    cv = mci (&cv, 5, CONST8);
     147    if (cv [5] != CONST8)
     148      abort ();
     149  
     150    cv = mci (&cv, 12, CONST9);
     151    if (cv [12] != CONST9)
     152      abort ();
     153  
     154    cv = mci (&cv, 25, CONSTA);
     155    if (cv [9] != CONSTA)
     156      abort ();
     157  
     158    cv = mci (&cv, 16, CONSTB);
     159    if (cv [0] != CONSTB)
     160      abort ();
     161  
     162    return 0;
     163  }