1 /*********************************************************************/
2 /* */
3 /* Optimized BLAS libraries */
4 /* By Kazushige Goto <kgoto@tacc.utexas.edu> */
5 /* */
6 /* Copyright (c) The University of Texas, 2009. All rights reserved. */
7 /* UNIVERSITY EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES CONCERNING */
8 /* THIS SOFTWARE AND DOCUMENTATION, INCLUDING ANY WARRANTIES OF */
9 /* MERCHANTABILITY, FITNESS FOR ANY PARTICULAR PURPOSE, */
10 /* NON-INFRINGEMENT AND WARRANTIES OF PERFORMANCE, AND ANY WARRANTY */
11 /* THAT MIGHT OTHERWISE ARISE FROM COURSE OF DEALING OR USAGE OF */
12 /* TRADE. NO WARRANTY IS EITHER EXPRESS OR IMPLIED WITH RESPECT TO */
13 /* THE USE OF THE SOFTWARE OR DOCUMENTATION. */
14 /* Under no circumstances shall University be liable for incidental, */
15 /* special, indirect, direct or consequential damages or loss of */
16 /* profits, interruption of business, or related expenses which may */
17 /* arise from use of Software or Documentation, including but not */
18 /* limited to those resulting from defects in Software and/or */
19 /* Documentation, or loss or inaccuracy of data of any kind. */
20 /*********************************************************************/
21
22 #include <stdio.h>
23 #include <ctype.h>
24 #include "common.h"
25
26 #ifndef TRANS
27 #define M m
28 #define N n
29 #else
30 #define N m
31 #define M n
32 #endif
33
CNAME(BLASLONG m,BLASLONG n,BLASLONG ku,BLASLONG kl,FLOAT alpha,FLOAT * a,BLASLONG lda,FLOAT * x,BLASLONG incx,FLOAT * y,BLASLONG incy,void * buffer)34 void CNAME(BLASLONG m, BLASLONG n, BLASLONG ku, BLASLONG kl, FLOAT alpha,
35 FLOAT *a, BLASLONG lda,
36 FLOAT *x, BLASLONG incx, FLOAT *y, BLASLONG incy, void *buffer){
37
38 BLASLONG i, offset_u, offset_l, start, end, length;
39 FLOAT *X = x;
40 FLOAT *Y = y;
41 FLOAT *gemvbuffer = (FLOAT *)buffer;
42 FLOAT *bufferY = gemvbuffer;
43 FLOAT *bufferX = gemvbuffer;
44
45 if (incy != 1) {
46 Y = bufferY;
47 bufferX = (FLOAT *)(((BLASLONG)bufferY + M * sizeof(FLOAT) + 4095) & ~4095);
48 gemvbuffer = bufferX;
49 COPY_K(M, y, incy, Y, 1);
50 }
51
52 if (incx != 1) {
53 X = bufferX;
54 gemvbuffer = (FLOAT *)(((BLASLONG)bufferX + N * sizeof(FLOAT) + 4095) & ~4095);
55 COPY_K(N, x, incx, X, 1);
56 }
57
58 offset_u = ku;
59 offset_l = ku + m;
60
61 for (i = 0; i < MIN(n, m + ku); i++) {
62
63 start = MAX(offset_u, 0);
64 end = MIN(offset_l, ku + kl + 1);
65
66 length = end - start;
67
68 #ifndef TRANS
69 AXPYU_K(length, 0, 0,
70 alpha * X[i],
71 a + start, 1, Y + start - offset_u, 1, NULL, 0);
72 #else
73 Y[i] += alpha * DOTU_K(length, a + start, 1, X + start - offset_u, 1);
74 #endif
75
76 offset_u --;
77 offset_l --;
78
79 a += lda;
80 }
81
82 if (incy != 1) {
83 COPY_K(M, Y, 1, y, incy);
84 }
85
86 return;
87 }
88
89