(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
powerpc/
vsx-builtin-15d.c
       1  /* { dg-do run { target int128 } } */
       2  /* { dg-require-effective-target vsx_hw } */
       3  /* { dg-options "-mvsx -O3" } */
       4  
       5  /* This test should run the same on any target that supports vsx
       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		(3.1415926539)
      14  #define CONST1		(3.1415926539 * 2)
      15  #define CONST2		(3.1415926539 * 3)
      16  #define CONST3		(3.1415926539 * 4)
      17  
      18  
      19  /* Test that indices > length of vector are applied modulo the vector
      20     length.  */
      21  
      22  /* Test for vector residing in register.  */
      23  vector double e0(vector double v, double x)
      24  {
      25    return vec_insert (x, v, 0);
      26  }
      27  
      28  vector double e1(vector double v, double x)
      29  {
      30    return vec_insert (x, v, 1);
      31  }
      32  
      33  vector double e2(vector double v, double x)
      34  {
      35    return vec_insert (x, v, 2);
      36  }
      37  
      38  vector double e3(vector double v, double x)
      39  {
      40    return vec_insert (x, v, 3);
      41  }
      42  
      43  /* Test for vector residing in memory.  */
      44  vector double me0(vector double *vp, double x)
      45  {
      46    return vec_insert (x, *vp, 0);
      47  }
      48  
      49  vector double me1(vector double *vp, double x)
      50  {
      51    return vec_insert (x, *vp, 1);
      52  }
      53  
      54  vector double me2(vector double *vp, double x)
      55  {
      56    return vec_insert (x, *vp, 2);
      57  }
      58  
      59  vector double me3(vector double *vp, double x)
      60  {
      61    return vec_insert (x, *vp, 3);
      62  }
      63  
      64  /* Test the same with variable indices.  */
      65  
      66  /* Test for variable selector and vector residing in register.  */
      67  __attribute__((noinline))
      68  vector double ei(vector double v, int i, double x)
      69  {
      70    return vec_insert (x, v, i);
      71  }
      72  
      73  /* Test for variable selector and vector residing in memory.  */
      74  __attribute__((noinline))
      75  vector double mei(vector double *vp, int i, double x)
      76  {
      77    return vec_insert (x, *vp, i);
      78  }
      79  
      80  int main (int argc, char *argv[]) {
      81    vector double dv;
      82    double d;
      83    dv[0] = CONST0;
      84    dv[1] = CONST1;
      85  
      86    dv = e0 (dv, CONST3);
      87    if (dv [0] != CONST3)
      88      abort ();
      89  
      90    dv = e1 (dv, CONST2);
      91    if (dv [1] != CONST2)
      92      abort ();
      93  
      94    dv = e2 (dv, CONST1);
      95    if (dv [0] != CONST1)
      96      abort ();
      97  
      98    dv = e3 (dv, CONST0);
      99    if (dv [1] != CONST0)
     100      abort ();
     101  
     102    dv = me0 (&dv, CONST2);
     103    if (dv [0] != CONST2)
     104      abort ();
     105  
     106    dv = me1 (&dv, CONST3);
     107    if (dv [1] != CONST3)
     108      abort ();
     109  
     110    dv = me2 (&dv, CONST1);
     111    if (dv [0] != CONST1)
     112      abort ();
     113  
     114    dv = me3 (&dv, CONST0);
     115    if (dv [1] != CONST0)
     116      abort ();
     117  
     118    dv = ei (dv, 0, CONST1);
     119    if (dv [0] != CONST1)
     120      abort ();
     121  
     122    dv = ei (dv, 1, CONST0);
     123    if (dv [1] != CONST0)
     124      abort ();
     125  
     126    dv = ei (dv, 2, CONST3);
     127    if (dv [0] != CONST3)
     128      abort ();
     129  
     130    dv = ei (dv, 3, CONST2);
     131    if (dv [1] != CONST2)
     132      abort ();
     133  
     134    dv = mei (&dv, 0, CONST1);
     135    if (dv [0] != CONST1)
     136      abort ();
     137  
     138    dv = mei (&dv, 1, CONST0);
     139    if (dv [1] != CONST0)
     140      abort ();
     141  
     142    dv = mei (&dv, 2, CONST2);
     143    if (dv [0] != CONST2)
     144      abort ();
     145  
     146    dv = mei (&dv, 3, CONST3);
     147    if (dv [1] != CONST3)
     148      abort ();
     149  
     150    return 0;
     151  }