add90(TYPE a[restrict N],TYPE b[restrict N],TYPE c[restrict N])1 void add90 (TYPE a[restrict N], TYPE b[restrict N], TYPE c[restrict N])
2 {
3   for (int i=0; i < N; i+=2)
4     {
5       c[i] = a[i] - b[i+1];
6       c[i+1] = a[i+1] + b[i];
7     }
8 }
9 
10 /* { dg-final { scan-tree-dump-times "stmt.*COMPLEX_ADD_ROT90" 1 "vect" } } */
11 
add270(TYPE a[restrict N],TYPE b[restrict N],TYPE c[restrict N])12 void add270 (TYPE a[restrict N], TYPE b[restrict N], TYPE c[restrict N])
13 {
14   for (int i=0; i < N; i+=2)
15     {
16       c[i] = a[i] + b[i+1];
17       c[i+1] = a[i+1] - b[i];
18     }
19 }
20 
21 /* { dg-final { scan-tree-dump-times "stmt.*COMPLEX_ADD_ROT270" 1 "vect" } } */
22 
addMixed(TYPE a[restrict N],TYPE b[restrict N],TYPE c[restrict N])23 void addMixed (TYPE a[restrict N], TYPE b[restrict N], TYPE c[restrict N])
24 {
25   for (int i=0; i < N; i+=4)
26     {
27       c[i] = a[i] - b[i+1];
28       c[i+1] = a[i+1] + b[i];
29       c[i+2] = a[i+2] + b[i+3];
30       c[i+3] = a[i+3] - b[i+2];
31     }
32 }
33 
add90HandUnrolled(TYPE a[restrict N],TYPE b[restrict N],TYPE c[restrict N])34 void add90HandUnrolled (TYPE a[restrict N], TYPE b[restrict N],
35 			TYPE c[restrict N])
36 {
37   for (int i=0; i < (N /2); i+=4)
38     {
39       c[i] = a[i] - b[i+1];
40       c[i+2] = a[i+2] - b[i+3];
41       c[i+1] = a[i+1] + b[i];
42       c[i+3] = a[i+3] + b[i+2];
43     }
44 }
45 
46 /* { dg-final { scan-tree-dump-times "stmt.*COMPLEX_ADD_ROT90" 1 "vect" } } */
47 
add90Hybrid(TYPE a[restrict N],TYPE b[restrict N],TYPE c[restrict N],TYPE d[restrict N])48 void add90Hybrid (TYPE a[restrict N], TYPE b[restrict N], TYPE c[restrict N],
49 		  TYPE d[restrict N])
50 {
51   for (int i=0; i < N; i+=2)
52     {
53       c[i] = a[i] - b[i+1];
54       c[i+1] = a[i+1] + b[i];
55       d[i] = a[i] - b[i];
56       d[i+1] = a[i+1] - b[i+1];
57     }
58 }
59 
60 /* { dg-final { scan-tree-dump-times "stmt.*COMPLEX_ADD_ROT90" 2 "vect" } } */