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