OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [testsuite/] [gcc.target/] [i386/] [avx2-vpalignr256-2.c] - Blame information for rev 695

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 691 jeremybenn
/* { dg-do run } */
2
/* { dg-require-effective-target avx2 } */
3
/* { dg-options "-O2 -mavx2" } */
4
 
5
#include <string.h>
6
#include "ssse3-vals.h"
7
#include "avx2-check.h"
8
 
9
/* Test the 256-bit form */
10
static void
11
avx2_test_palignr256 (__m256i t1, __m256i t2, unsigned int imm, __m256i * r)
12
{
13
  switch (imm)
14
    {
15
    case 0:
16
      *r = _mm256_alignr_epi8 (t1, t2, 0);
17
      break;
18
    case 1:
19
      *r = _mm256_alignr_epi8 (t1, t2, 1);
20
      break;
21
    case 2:
22
      *r = _mm256_alignr_epi8 (t1, t2, 2);
23
      break;
24
    case 3:
25
      *r = _mm256_alignr_epi8 (t1, t2, 3);
26
      break;
27
    case 4:
28
      *r = _mm256_alignr_epi8 (t1, t2, 4);
29
      break;
30
    case 5:
31
      *r = _mm256_alignr_epi8 (t1, t2, 5);
32
      break;
33
    case 6:
34
      *r = _mm256_alignr_epi8 (t1, t2, 6);
35
      break;
36
    case 7:
37
      *r = _mm256_alignr_epi8 (t1, t2, 7);
38
      break;
39
    case 8:
40
      *r = _mm256_alignr_epi8 (t1, t2, 8);
41
      break;
42
    case 9:
43
      *r = _mm256_alignr_epi8 (t1, t2, 9);
44
      break;
45
    case 10:
46
      *r = _mm256_alignr_epi8 (t1, t2, 10);
47
      break;
48
    case 11:
49
      *r = _mm256_alignr_epi8 (t1, t2, 11);
50
      break;
51
    case 12:
52
      *r = _mm256_alignr_epi8 (t1, t2, 12);
53
      break;
54
    case 13:
55
      *r = _mm256_alignr_epi8 (t1, t2, 13);
56
      break;
57
    case 14:
58
      *r = _mm256_alignr_epi8 (t1, t2, 14);
59
      break;
60
    case 15:
61
      *r = _mm256_alignr_epi8 (t1, t2, 15);
62
      break;
63
    case 16:
64
      *r = _mm256_alignr_epi8 (t1, t2, 16);
65
      break;
66
    case 17:
67
      *r = _mm256_alignr_epi8 (t1, t2, 17);
68
      break;
69
    case 18:
70
      *r = _mm256_alignr_epi8 (t1, t2, 18);
71
      break;
72
    case 19:
73
      *r = _mm256_alignr_epi8 (t1, t2, 19);
74
      break;
75
    case 20:
76
      *r = _mm256_alignr_epi8 (t1, t2, 20);
77
      break;
78
    case 21:
79
      *r = _mm256_alignr_epi8 (t1, t2, 21);
80
      break;
81
    case 22:
82
      *r = _mm256_alignr_epi8 (t1, t2, 22);
83
      break;
84
    case 23:
85
      *r = _mm256_alignr_epi8 (t1, t2, 23);
86
      break;
87
    case 24:
88
      *r = _mm256_alignr_epi8 (t1, t2, 24);
89
      break;
90
    case 25:
91
      *r = _mm256_alignr_epi8 (t1, t2, 25);
92
      break;
93
    case 26:
94
      *r = _mm256_alignr_epi8 (t1, t2, 26);
95
      break;
96
    case 27:
97
      *r = _mm256_alignr_epi8 (t1, t2, 27);
98
      break;
99
    case 28:
100
      *r = _mm256_alignr_epi8 (t1, t2, 28);
101
      break;
102
    case 29:
103
      *r = _mm256_alignr_epi8 (t1, t2, 29);
104
      break;
105
    case 30:
106
      *r = _mm256_alignr_epi8 (t1, t2, 30);
107
      break;
108
    case 31:
109
      *r = _mm256_alignr_epi8 (t1, t2, 31);
110
      break;
111
    default:
112
      *r = _mm256_alignr_epi8 (t1, t2, 32);
113
      break;
114
    }
115
}
116
 
117
/* Routine to manually compute the results */
118
static void
119
compute_correct_result_256 (int *i1, int *i2, unsigned int imm, int *r)
120
{
121
  char buf[32];
122
  char *bout = (char *) r;
123
  int i;
124
 
125
  /* Fill lowers 128 bit of ymm */
126
  memcpy (&buf[0], i2, 16);
127
  memcpy (&buf[16], i1, 16);
128
 
129
  for (i = 0; i < 16; i++)
130
    if (imm >= 32 || imm + i >= 32)
131
      bout[i] = 0;
132
    else
133
      bout[i] = buf[imm + i];
134
 
135
  /* Fill higher 128 bit of ymm */
136
  bout += 16;
137
  memcpy (&buf[0], i2 + 4, 16);
138
  memcpy (&buf[16], i1 + 4, 16);
139
 
140
  for (i = 0; i < 16; i++)
141
    if (imm >= 32 || imm + i >= 32)
142
      bout[i] = 0;
143
    else
144
      bout[i] = buf[imm + i];
145
}
146
 
147
static void
148
avx2_test (void)
149
{
150
  int i;
151
  int ck[8];
152
  int r[8];
153
  unsigned int imm;
154
  int fail = 0;
155
 
156
  union256i_q s1, s2, d;
157
 
158
  for (i = 0; i < 256; i += 16)
159
    for (imm = 0; imm < 100; imm++)
160
      {
161
        /* Recompute the results for 256-bits */
162
        compute_correct_result_256 (&vals[i + 0], &vals[i + 8], imm, ck);
163
 
164
        s1.x = _mm256_loadu_si256 ((__m256i *) & vals[i + 0]);
165
        s2.x = _mm256_loadu_si256 ((__m256i *) & vals[i + 8]);
166
 
167
        /* Run the 256-bit tests */
168
        avx2_test_palignr256 (s1.x, s2.x, imm, &d.x);
169
 
170
        _mm256_storeu_si256 ((__m256i *) r, d.x);
171
 
172
        fail += checkVi (r, ck, 8);
173
      }
174
 
175
  if (fail != 0)
176
    abort ();
177
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.