PPCG 0.08
[ppcg.git] / examples / chemv.c
blob26c6b94d357ca0af994f68096df3925473075031
1 /*
2 * Copyright 2014 ARM Ltd.
4 * Use of this software is governed by the MIT license
5 */
7 #include <stdio.h>
8 #include <stdlib.h>
10 struct ComplexFloat
12 float Re;
13 float Im;
16 /* chemv - complex hermitian matrix-vector multiplication
17 * The function body was taken from a VOBLA-generated BLAS library.
19 void chemv(int n, float alpha_re, float alpha_im,
20 int ldAT, struct ComplexFloat AT[restrict const static n][ldAT],
21 int incX, struct ComplexFloat X[restrict const static n][incX],
22 float beta_re, float beta_im,
23 int incY, struct ComplexFloat Y[restrict const static n][incY])
25 #pragma scop
26 for (int i0 = 0; i0 <= (n-1); i0 += 1) {
27 float var5_Re;
28 float var5_Im;
29 var5_Re = ((Y[i0][0].Re*beta_re)-(Y[i0][0].Im*beta_im));
30 var5_Im = ((Y[i0][0].Im*beta_re)+(Y[i0][0].Re*beta_im));
31 Y[i0][0].Re = var5_Re;
32 Y[i0][0].Im = var5_Im;
34 for (int i1 = 0; i1 <= ((n-1)+1)-1; i1 += 1) {
35 float var2_Re;
36 float var3_Im;
37 float var2_Im;
38 float var4_Im;
39 float var4_Re;
40 float var3_Re;
41 var2_Re = (alpha_re*AT[i1][i1].Re);
42 var2_Im = (alpha_im*AT[i1][i1].Re);
43 var3_Re = ((var2_Re*X[i1][0].Re)-(var2_Im*X[i1][0].Im));
44 var3_Im = ((var2_Im*X[i1][0].Re)+(var2_Re*X[i1][0].Im));
45 var4_Re = (Y[i1][0].Re+var3_Re);
46 var4_Im = (Y[i1][0].Im+var3_Im);
47 Y[i1][0].Re = var4_Re;
48 Y[i1][0].Im = var4_Im;
50 for (int i2 = 0; i2 <= ((n-1)-1); i2 += 1) {
51 for (int i3 = 0; i3 <= (n-1)-(1+i2); i3 += 1) {
52 float var99_Re;
53 float var96_Re;
54 float var98_Im;
55 float var96_Im;
56 float var94_Im;
57 float var95_Im;
58 float var94_Re;
59 float var95_Re;
60 float var97_Im;
61 float var99_Im;
62 float var97_Re;
63 float var98_Re;
64 var94_Re = ((alpha_re*AT[i2][((1+i2)+i3)].Re)-
65 (alpha_im*(-AT[i2][((1+i2)+i3)].Im)));
66 var94_Im = ((alpha_im*AT[i2][((1+i2)+i3)].Re)+
67 (alpha_re*(-AT[i2][((1+i2)+i3)].Im)));
68 var95_Re = ((var94_Re*X[((i3+i2)+1)][0].Re)-
69 (var94_Im*X[((i3+i2)+1)][0].Im));
70 var95_Im = ((var94_Im*X[((i3+i2)+1)][0].Re)+
71 (var94_Re*X[((i3+i2)+1)][0].Im));
72 var96_Re = (Y[i2][0].Re+var95_Re);
73 var96_Im = (Y[i2][0].Im+var95_Im);
74 Y[i2][0].Re = var96_Re;
75 Y[i2][0].Im = var96_Im;
76 var97_Re = ((alpha_re*AT[i2][((1+i2)+i3)].Re)-
77 (alpha_im*AT[i2][((1+i2)+i3)].Im));
78 var97_Im = ((alpha_im*AT[i2][((1+i2)+i3)].Re)+
79 (alpha_re*AT[i2][((1+i2)+i3)].Im));
80 var98_Re = ((var97_Re*X[i2][0].Re)-
81 (var97_Im*X[i2][0].Im));
82 var98_Im = ((var97_Im*X[i2][0].Re)+
83 (var97_Re*X[i2][0].Im));
84 var99_Re = (Y[((i3+i2)+1)][0].Re+var98_Re);
85 var99_Im = (Y[((i3+i2)+1)][0].Im+var98_Im);
86 Y[((i3+i2)+1)][0].Re = var99_Re;
87 Y[((i3+i2)+1)][0].Im = var99_Im;
90 #pragma endscop
93 int main()
95 const int n = 37;
96 const int incX = 1;
97 const int incY = 1;
98 const int ldAT = n;
99 struct ComplexFloat AT[n][ldAT];
100 struct ComplexFloat X[n][incX];
101 struct ComplexFloat Y[n][incY];
103 for (int i = 0; i < n; i++) {
104 X[i][0] = (struct ComplexFloat){i + 5, i * 2};
105 Y[i][0] = (struct ComplexFloat){i * 3, i + 7};
106 for (int j = 0; j < ldAT; j++) {
107 AT[i][j] = (struct ComplexFloat){i + j, i + 3};
111 chemv(n, 3.14f, 1.59f, ldAT, AT, incX, X, 2.71f, 8.28f, incY, Y);
113 for (int i = 0; i < n; i++)
114 printf("%0.2f %0.2f\n", Y[i][0].Re, Y[i][0].Im);
116 return EXIT_SUCCESS;