1 /*********************************************************************/
2 /* Copyright 2009, 2010 The University of Texas at Austin. */
3 /* All rights reserved. */
4 /* */
5 /* Redistribution and use in source and binary forms, with or */
6 /* without modification, are permitted provided that the following */
7 /* conditions are met: */
8 /* */
9 /* 1. Redistributions of source code must retain the above */
10 /* copyright notice, this list of conditions and the following */
11 /* disclaimer. */
12 /* */
13 /* 2. Redistributions in binary form must reproduce the above */
14 /* copyright notice, this list of conditions and the following */
15 /* disclaimer in the documentation and/or other materials */
16 /* provided with the distribution. */
17 /* */
18 /* THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY OF TEXAS AT */
19 /* AUSTIN ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, */
20 /* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF */
21 /* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE */
22 /* DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OF TEXAS AT */
23 /* AUSTIN OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, */
24 /* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES */
25 /* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE */
26 /* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR */
27 /* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF */
28 /* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT */
29 /* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT */
30 /* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE */
31 /* POSSIBILITY OF SUCH DAMAGE. */
32 /* */
33 /* The views and conclusions contained in the software and */
34 /* documentation are those of the authors and should not be */
35 /* interpreted as representing official policies, either expressed */
36 /* or implied, of The University of Texas at Austin. */
37 /*********************************************************************/
38
39 #include <stdio.h>
40 #include <ctype.h>
41 #include "common.h"
42
43 const static FLOAT dp1 = 1.;
44
CNAME(BLASLONG n,BLASLONG k,FLOAT * a,BLASLONG lda,FLOAT * b,BLASLONG incb,void * buffer)45 int CNAME(BLASLONG n, BLASLONG k, FLOAT *a, BLASLONG lda, FLOAT *b, BLASLONG incb, void *buffer){
46
47 BLASLONG i;
48 FLOAT *gemvbuffer = (FLOAT *)buffer;
49 FLOAT *B = b;
50 BLASLONG length;
51 #if (TRANSA == 2) || (TRANSA == 4)
52 FLOAT _Complex temp;
53 #endif
54 #ifndef UNIT
55 FLOAT atemp1, atemp2, btemp1, btemp2;
56 #endif
57
58 if (incb != 1) {
59 B = buffer;
60 gemvbuffer = (FLOAT *)(((BLASLONG)buffer + n * sizeof(FLOAT) * COMPSIZE + 4095) & ~4095);
61 COPY_K(n, b, incb, buffer, 1);
62 }
63
64 for (i = 0; i < n; i++) {
65
66 #if (TRANSA == 1) || (TRANSA == 3)
67 length = i;
68 if (length > k) length = k;
69
70 if (length > 0) {
71 #if TRANSA == 1
72 AXPYU_K(length, 0, 0,
73 B[i * 2 + 0], B[i * 2 + 1],
74 a + (k - length) * COMPSIZE, 1, B + (i - length) * COMPSIZE, 1, NULL, 0);
75 #else
76 AXPYC_K(length, 0, 0,
77 B[i * 2 + 0], B[i * 2 + 1],
78 a + (k - length) * COMPSIZE, 1, B + (i - length) * COMPSIZE, 1, NULL, 0);
79 #endif
80
81 }
82 #endif
83
84 #ifndef UNIT
85 #if (TRANSA == 1) || (TRANSA == 3)
86 atemp1 = a[k * 2 + 0];
87 atemp2 = a[k * 2 + 1];
88 #else
89 atemp1 = a[0];
90 atemp2 = a[1];
91 #endif
92
93 btemp1 = B[i * 2 + 0];
94 btemp2 = B[i * 2 + 1];
95
96 #if (TRANSA == 1) || (TRANSA == 2)
97 B[i * 2 + 0] = atemp1 * btemp1 - atemp2 * btemp2;
98 B[i * 2 + 1] = atemp1 * btemp2 + atemp2 * btemp1;
99 #else
100 B[i * 2 + 0] = atemp1 * btemp1 + atemp2 * btemp2;
101 B[i * 2 + 1] = atemp1 * btemp2 - atemp2 * btemp1;
102 #endif
103 #endif
104
105 #if (TRANSA == 2) || (TRANSA == 4)
106 length = n - i - 1;
107 if (length > k) length = k;
108
109 if (length > 0) {
110 #if TRANSA == 2
111 temp = DOTU_K(length, a + COMPSIZE, 1, B + (i + 1) * COMPSIZE, 1);
112 #else
113 temp = DOTC_K(length, a + COMPSIZE, 1, B + (i + 1) * COMPSIZE, 1);
114 #endif
115
116 B[i * 2 + 0] += CREAL(temp);
117 B[i * 2 + 1] += CIMAG(temp);
118 }
119 #endif
120
121 a += lda * COMPSIZE;
122 }
123
124 if (incb != 1) {
125 COPY_K(n, buffer, 1, b, incb);
126 }
127
128 return 0;
129 }
130
131