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/* mingw runtime don't provide random(). */ 23#ifdef __MINGW32__ 24#define random rand 25#endif 26 27signed TYPE1 a[N], b[N], g[N]; 28unsigned TYPE1 c[N], h[N]; 29signed TYPE2 d[N], e[N], j[N]; 30unsigned TYPE2 f[N], k[N]; 31 32__attribute__((noinline)) void 33f1 (void) 34{ 35 int i; 36 for (i = 0; i < N; i++) 37 g[i] = a[i] << b[i]; 38} 39 40__attribute__((noinline)) void 41f2 (void) 42{ 43 int i; 44 for (i = 0; i < N; i++) 45 g[i] = a[i] >> b[i]; 46} 47 48__attribute__((noinline)) void 49f3 (void) 50{ 51 int i; 52 for (i = 0; i < N; i++) 53 h[i] = c[i] >> b[i]; 54} 55 56__attribute__((noinline)) void 57f4 (void) 58{ 59 int i; 60 for (i = 0; i < N; i++) 61 j[i] = d[i] << e[i]; 62} 63 64__attribute__((noinline)) void 65f5 (void) 66{ 67 int i; 68 for (i = 0; i < N; i++) 69 j[i] = d[i] >> e[i]; 70} 71 72__attribute__((noinline)) void 73f6 (void) 74{ 75 int i; 76 for (i = 0; i < N; i++) 77 k[i] = f[i] >> e[i]; 78} 79 80__attribute__((noinline)) void 81f7 (void) 82{ 83 int i; 84 for (i = 0; i < N; i++) 85 j[i] = d[i] << b[i]; 86} 87 88__attribute__((noinline)) void 89f8 (void) 90{ 91 int i; 92 for (i = 0; i < N; i++) 93 j[i] = d[i] >> b[i]; 94} 95 96__attribute__((noinline)) void 97f9 (void) 98{ 99 int i; 100 for (i = 0; i < N; i++) 101 k[i] = f[i] >> b[i]; 102} 103 104static void 105TEST () 106{ 107 int i; 108 for (i = 0; i < N; i++) 109 { 110 asm (""); 111 c[i] = (random () << 1) | (random () & 1); 112 b[i] = (i * 85) & (sizeof (TYPE1) * __CHAR_BIT__ - 1); 113 a[i] = c[i]; 114 d[i] = (random () << 1) | (random () & 1); 115 d[i] |= (unsigned long long) c[i] << 32; 116 e[i] = (i * 85) & (sizeof (TYPE2) * __CHAR_BIT__ - 1); 117 f[i] = d[i]; 118 } 119 f1 (); 120 f3 (); 121 f4 (); 122 f6 (); 123 for (i = 0; i < N; i++) 124 if (g[i] != (signed TYPE1) (a[i] << b[i]) 125 || h[i] != (unsigned TYPE1) (c[i] >> b[i]) 126 || j[i] != (signed TYPE2) (d[i] << e[i]) 127 || k[i] != (unsigned TYPE2) (f[i] >> e[i])) 128 abort (); 129 f2 (); 130 f5 (); 131 f9 (); 132 for (i = 0; i < N; i++) 133 if (g[i] != (signed TYPE1) (a[i] >> b[i]) 134 || j[i] != (signed TYPE2) (d[i] >> e[i]) 135 || k[i] != (unsigned TYPE2) (f[i] >> b[i])) 136 abort (); 137 f7 (); 138 for (i = 0; i < N; i++) 139 if (j[i] != (signed TYPE2) (d[i] << b[i])) 140 abort (); 141 f8 (); 142 for (i = 0; i < N; i++) 143 if (j[i] != (signed TYPE2) (d[i] >> b[i])) 144 abort (); 145} 146