annotate gcc/testsuite/g++.dg/pr80481.C @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1 // { dg-do compile { target { i?86-*-* x86_64-*-* } && { ! *-*-solaris* } } }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
2 // { dg-options "-Ofast -funroll-loops -fopenmp -march=knl" }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
3 // { dg-final { scan-assembler-not "vmovaps" } }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
4
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
5 #include <math.h>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
6
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
7 #include <xmmintrin.h>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
8
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
9 #define max(a, b) ( (a) > (b) ? (a) : (b) )
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
10
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
11 struct Sdata {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
12 float w;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
13 float s;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
14 float r;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
15 float t;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
16 float v;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
17 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
18 extern int N1, N2, N3;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
19
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
20 #define func(p, up, down) ((p)*(up) + (1.0f-(p)) * (down))
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
21
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
22 void foo (Sdata *in, int idx, float *out)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
23 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
24 float* y1 = (float*)_mm_malloc(sizeof(float) * N1,16);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
25 float* y2 = (float*)_mm_malloc(sizeof(float) * N1,16);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
26 float* y3 = (float*)_mm_malloc(sizeof(float) * N1,16);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
27 float* y4 = (float*)_mm_malloc(sizeof(float) * N1,16);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
28
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
29 for (int k = idx; k < idx + N3; k++) {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
30 float x1 = in[k].r;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
31 float x2 = in[k].s;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
32 float x3 = in[k].w;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
33 float x4 = in[k].v;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
34 float x5 = in[k].t;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
35 x5 /= N2;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
36 float u = exp(x4 * sqrt(x5));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
37 float d = exp(-x4 * sqrt(x5));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
38 float a = exp(x1 * x5);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
39 float m = exp(-x1 * x5);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
40 float p = (a - d) / (u - d);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
41 y2[0] = x2;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
42 y3[0] = float(1.f);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
43 for (int i = 1; i <= N2; i++) {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
44 y2[i] = u * y2[i - 1];
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
45 y3[i] = d * y3[i - 1];
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
46 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
47 #pragma omp simd
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
48 for (int i = 0; i <= N2; i++) {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
49 y1[i] =
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
50 max((x3 - y2[N2 - i] * y3[i]), float(0.f));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
51 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
52 for (int i = N2 - 1; i >= 0; i--) {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
53 #pragma omp simd
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
54 for (int j = 0; j <= i; j++) {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
55 y4[j] = func(p,y1[j],y1[j+1]) * m;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
56 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
57 #pragma omp simd
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
58 for (int j = 0; j <= i; j++) {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
59 float t1 = y2[i - j] * y3[j];
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
60 float t2 = max(x3 - t1, float(0.f));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
61 y1[j] = max(t2, y4[j]);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
62 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
63 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
64 out[k] = y1[0];
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
65 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
66 _mm_free(y1);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
67 _mm_free(y2);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
68 _mm_free(y3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
69 _mm_free(y4);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
70 }