1  /* { dg-do run { target powerpc*-*-* } } */
       2  /* { dg-require-effective-target vsx_hw } */
       3  /* { dg-options "-mvsx -O0 -Wall" } */
       4  
       5  #include <altivec.h>
       6  #include <stdlib.h>
       7  
       8  /* vec_ldl and vec_lvxl (an alias for vec_ldl) do an aligned vector
       9   * load from memory, marking the fetched memory as least recently used
      10   * (hinting that we do not anticipate a need to fetch this vector
      11   * again within the near future.)
      12   *
      13   * vector <TYPE> result = vec_ldl (int offset, <TYPE> *address)
      14   * vector <TYPE> result = vec_ldl (int offset, vector <TYPE> *address)
      15   *
      16   * The effect of these instructions is to perform the following:
      17   *
      18   *  resuilt = *((vector <TTYPE> *)((((char *) address) + offset) & ~0x0f))
      19   *
      20   * This test exercises the following new prototypes of the vec_ldl
      21   * service which were added in late March 2018:
      22   *
      23   *  vector bool int vec_ldl (int, bool int *)
      24   *  vector bool short vec_ldl (int, bool short *)
      25   *  vector bool char vec_ldl (int, bool char *)
      26   *  vector double vec_ldl (int, double *)
      27   *  vector long long int vec_ldl (int, long long int *)
      28   *  vector unsigned long long int vec_ldl (int, unsigned long long int *)
      29   *  vector bool long long vec_ldl (int, bool long long *)
      30   */
      31  
      32  static signed char ca[64] __attribute__((aligned(16)));
      33  static unsigned char uca[64] __attribute__((aligned(16)));
      34  
      35  static vector signed char *vcp = (vector signed char *) ca;
      36  static unsigned vector char *vucp = (vector unsigned char *) uca;
      37  
      38  static short sa[32] __attribute__((aligned(16)));
      39  static unsigned short usa[32] __attribute__((aligned(16)));
      40  
      41  static vector short *vsp = (vector short *) sa;
      42  static unsigned vector short *vusp = (vector unsigned short *) usa;
      43  
      44  static int ia[16] __attribute__((aligned(16)));
      45  static unsigned int uia[16] __attribute__((aligned(16)));
      46  
      47  static vector int *vip = (vector int *) ia;
      48  static unsigned vector int *vuip = (vector unsigned int *) uia;
      49  
      50  static long long la[8] __attribute__((aligned(16)));
      51  static unsigned long long ula[8] __attribute__((aligned(16)));
      52  
      53  static vector long long *vlp = (vector long long *) la;
      54  static unsigned vector long long *vulp = (vector unsigned long long *) ula;
      55  
      56  static double da[8] __attribute__((aligned(16)));
      57  static vector double *vdp = (vector double *) da;
      58  
      59  
      60  void
      61  doInitialization ()
      62  {
      63    unsigned int i;
      64  
      65    for (i = 0; i < 64; i++)
      66      ca[i] = uca[i] = i;
      67  
      68    for (i = 0; i < 32; i++)
      69      sa[i] = usa[i] = i;
      70  
      71    for (i = 0; i < 16; i++)
      72      ia[i] = uia[i] = i;
      73  
      74    for (i = 0; i < 8; i++)
      75      la[i] = ula[i] = i;
      76  
      77    for (i = 0; i < 8; i++)
      78      da[i] = 0.125 * i;
      79  }
      80  
      81  int
      82  main (int argc, char *argv[])
      83  {
      84    vector long long int lv;
      85    vector unsigned long long int ulv;
      86    vector int iv;
      87    vector unsigned int uiv;
      88    vector short sv;
      89    vector unsigned short usv;
      90    vector signed char cv;
      91    vector unsigned char ucv;
      92    vector double dv;
      93  
      94    doInitialization ();
      95  
      96    /* Do vector of char.  */
      97    for (int i = 0; i < 16; i++) {
      98      /* Focus on ca[16] ... ca[31].  */
      99      cv = vec_ldl (i+16, ca);	/* compiler: invalid parameter combination */
     100      if (cv[4] != ca[20])
     101        abort ();
     102      /* Focus on uca[32] ... uca[47].  */
     103      ucv = vec_ldl (i+32, uca);
     104      if (ucv[7] != uca[39])
     105        abort ();
     106      /* Focus on ca[0] ... ca[15].  */
     107      cv = vec_ldl (i, vcp);
     108      if (cv[3] != ca[3])
     109        abort ();
     110      /* Focus on ca[0] ... ca[15] while i <= 8.
     111         Focus on ca[16] ... ca[31] while i > 8.  */
     112      ucv = vec_ldl (i+7, vucp);
     113      if ((i+7 > 15) && (ucv[13] != uca[29]))
     114        abort ();
     115      if ((i + 7 <= 15) && (ucv[13] != uca[13]))
     116        abort ();
     117    }
     118  
     119    /* Do vector of short.  */
     120    for (int i = 0; i < 16; i++) {
     121      /* Focus on sa[8] ... sa[15].  */
     122      sv = vec_ldl (i+16, sa);
     123      if (sv[4] != sa[12])
     124        abort ();
     125      /* Focus on usa[24] ... usa[31].  */
     126      usv = vec_ldl (i+48, usa);
     127      if (usv[7] != usa[31])
     128        abort ();
     129      /* Focus on sa[0] ... sa[7].  */
     130      sv = vec_ldl (i, vsp);
     131      if (sv[3] != sa[3])
     132        abort ();
     133      /* Focus on usa[0] ... usa[7] while i <= 8.
     134         Focus on usa[8] ... usa[15] while i > 8.  */
     135      usv = vec_ldl (i+7, vusp);
     136      if ((i+7 > 15) && (usv[5] != usa[13]))
     137        abort ();
     138      if ((i + 7 <= 15) && (usv[5] != usa[5]))
     139        abort ();
     140    }
     141  
     142    /* Do vector of int.  */
     143    for (int i = 0; i < 16; i++) {
     144      /* Focus on ia[8] ... ia[11].  */
     145      iv = vec_ldl (i+32, ia);
     146      if (iv[3] != ia[11])
     147        abort ();
     148      /* Focus on uia[12] ... uia[15].  */
     149      uiv = vec_ldl (i+48, uia);
     150      if (uiv[2] != uia[14])
     151        abort ();
     152      /* Focus on ia[0] ... ia[3].  */
     153      iv = vec_ldl (i, vip);
     154      if (iv[3] != ia[3])
     155        abort ();
     156      /* Focus on uia[0] ... uia[3] while i <= 8.
     157         Focus on uia[4] ... uia[7] while i > 8.  */
     158      uiv = vec_ldl (i+7, vuip);
     159      if ((i+7 > 15) && (uiv[1] != uia[5]))
     160        abort ();
     161      if ((i + 7 <= 15) && (uiv[1] != uia[1]))
     162        abort ();
     163    }
     164  
     165    /* Do vector of long long int.  */
     166    for (int i = 0; i < 16; i++) {
     167      /* Focus on la[4] ... la[5].  */
     168      lv = vec_ldl (i+32, la);
     169      if (lv[1] != la[5])
     170        abort ();
     171      /* Focus on ula[6] ... ula[7].  */
     172      ulv = vec_ldl (i+48, ula);
     173      if (ulv[0] != uia[6])
     174        abort ();
     175      /* Focus on la[0] ... la[1].  */
     176      lv = vec_ldl (i, vlp);
     177      if (iv[1] != la[1])
     178        abort ();
     179      /* Focus on ula[0] ... uia[1] while i <= 8.
     180         Focus on uia[2] ... uia[3] while i > 8.  */
     181      ulv = vec_ldl (i+7, vulp);
     182      if ((i+7 > 15) && (ulv[1] != ula[3]))
     183        abort ();
     184      if ((i + 7 <= 15) && (ulv[1] != ula[1]))
     185        abort ();
     186    }
     187  
     188    /* Do vector of double.  */
     189    for (int i = 0; i < 16; i++) {
     190      /* Focus on da[2] ... da[3].  */
     191      dv = vec_ldl (i+16, da);
     192      if (dv[1] != da[3])
     193        abort ();
     194      /* Focus on da[6] ... da[7].  */
     195      dv = vec_ldl (i+48, vdp);
     196      if (dv[0] != da[6])
     197        abort ();
     198      /* Focus on da[0] ... da[1].  */
     199      dv = vec_ldl (i, da);
     200      if (dv[1] != da[1])
     201        abort ();
     202      /* Focus on da[0] ... da[1] while i <= 8.
     203         Focus on da[2] ... da[3] while i > 8.  */
     204      dv = vec_ldl (i+7, vdp);
     205      if ((i+7 <= 15) && (dv[1] != da[1]))
     206        abort ();
     207      if ((i + 7 > 15) && (dv[1] != da[3]))
     208        abort ();
     209    }
     210    return 0;
     211  }