1  /* { dg-do run } */
       2  /* { dg-options "-O3 -mxop" } */
       3  /* { dg-require-effective-target xop } */
       4  
       5  #ifndef CHECK_H
       6  #define CHECK_H "xop-check.h"
       7  #endif
       8  
       9  #ifndef TEST
      10  #define TEST xop_test
      11  #endif
      12  
      13  #include CHECK_H
      14  
      15  #define N 64
      16  
      17  #ifndef TYPE1
      18  #define TYPE1 int
      19  #define TYPE2 long long
      20  #endif
      21  
      22  signed TYPE1 a[N], b[N], g[N];
      23  unsigned TYPE1 c[N], h[N];
      24  signed TYPE2 d[N], e[N], j[N];
      25  unsigned TYPE2 f[N], k[N];
      26  
      27  __attribute__((noinline)) void
      28  f1 (void)
      29  {
      30    int i;
      31    for (i = 0; i < N; i++)
      32      g[i] = a[i] << b[i];
      33  }
      34  
      35  __attribute__((noinline)) void
      36  f2 (void)
      37  {
      38    int i;
      39    for (i = 0; i < N; i++)
      40      g[i] = a[i] >> b[i];
      41  }
      42  
      43  __attribute__((noinline)) void
      44  f3 (void)
      45  {
      46    int i;
      47    for (i = 0; i < N; i++)
      48      h[i] = c[i] >> b[i];
      49  }
      50  
      51  __attribute__((noinline)) void
      52  f4 (void)
      53  {
      54    int i;
      55    for (i = 0; i < N; i++)
      56      j[i] = d[i] << e[i];
      57  }
      58  
      59  __attribute__((noinline)) void
      60  f5 (void)
      61  {
      62    int i;
      63    for (i = 0; i < N; i++)
      64      j[i] = d[i] >> e[i];
      65  }
      66  
      67  __attribute__((noinline)) void
      68  f6 (void)
      69  {
      70    int i;
      71    for (i = 0; i < N; i++)
      72      k[i] = f[i] >> e[i];
      73  }
      74  
      75  __attribute__((noinline)) void
      76  f7 (void)
      77  {
      78    int i;
      79    for (i = 0; i < N; i++)
      80      j[i] = d[i] << b[i];
      81  }
      82  
      83  __attribute__((noinline)) void
      84  f8 (void)
      85  {
      86    int i;
      87    for (i = 0; i < N; i++)
      88      j[i] = d[i] >> b[i];
      89  }
      90  
      91  __attribute__((noinline)) void
      92  f9 (void)
      93  {
      94    int i;
      95    for (i = 0; i < N; i++)
      96      k[i] = f[i] >> b[i];
      97  }
      98  
      99  static void
     100  TEST ()
     101  {
     102    int i;
     103    for (i = 0; i < N; i++)
     104      {
     105        asm ("");
     106        c[i] = (rand () << 1) | (rand () & 1);
     107        b[i] = (i * 85) & (sizeof (TYPE1) * __CHAR_BIT__ - 1);
     108        a[i] = c[i];
     109        d[i] = (rand () << 1) | (rand () & 1);
     110        d[i] |= (unsigned long long) c[i] << 32;
     111        e[i] = (i * 85) & (sizeof (TYPE2) * __CHAR_BIT__ - 1);
     112        f[i] = d[i];
     113      }
     114    f1 ();
     115    f3 ();
     116    f4 ();
     117    f6 ();
     118    for (i = 0; i < N; i++)
     119      if (g[i] != (signed TYPE1) (a[i] << b[i])
     120  	|| h[i] != (unsigned TYPE1) (c[i] >> b[i])
     121  	|| j[i] != (signed TYPE2) (d[i] << e[i])
     122  	|| k[i] != (unsigned TYPE2) (f[i] >> e[i]))
     123        abort ();
     124    f2 ();
     125    f5 ();
     126    f9 ();
     127    for (i = 0; i < N; i++)
     128      if (g[i] != (signed TYPE1) (a[i] >> b[i])
     129  	|| j[i] != (signed TYPE2) (d[i] >> e[i])
     130  	|| k[i] != (unsigned TYPE2) (f[i] >> b[i]))
     131        abort ();
     132    f7 ();
     133    for (i = 0; i < N; i++)
     134      if (j[i] != (signed TYPE2) (d[i] << b[i]))
     135        abort ();
     136    f8 ();
     137    for (i = 0; i < N; i++)
     138      if (j[i] != (signed TYPE2) (d[i] >> b[i]))
     139        abort ();
     140  }