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 "common.h"
24 
25 #ifndef USE_ALPHA
26 #define REAL_PART(a, b)  (a)
27 #define IMAGE_PART(a, b) (b)
28 #else
29 #define REAL_PART(a, b)  (alpha_r * (a) + alpha_i * (b))
30 #define IMAGE_PART(a, b) (alpha_i * (a) - alpha_r * (b))
31 #endif
32 
33 #if defined(REAL_ONLY)
34 #define CMULT(a, b) (REAL_PART(a, b))
35 #elif defined(IMAGE_ONLY)
36 #define CMULT(a, b) (IMAGE_PART(a, b))
37 #else
38 #define CMULT(a, b) (REAL_PART(a, b) + IMAGE_PART(a, b))
39 #endif
40 
CNAME(BLASLONG m,BLASLONG n,FLOAT * a,BLASLONG lda,BLASLONG posX,BLASLONG posY,FLOAT alpha_r,FLOAT alpha_i,FLOAT * b)41 int CNAME(BLASLONG m, BLASLONG n, FLOAT *a, BLASLONG lda, BLASLONG posX, BLASLONG posY,
42 #ifdef USE_ALPHA
43 	   FLOAT alpha_r, FLOAT alpha_i,
44 #endif
45 	   FLOAT *b){
46 
47   BLASLONG i, js, offset;
48 
49   FLOAT data01;
50   FLOAT *ao1;
51 
52   lda *= 2;
53 
54   js = n;
55 
56   while (js > 0){
57 
58     offset = posX - posY;
59 
60     if (offset >  0) ao1 = a + posY * 2 + (posX + 0) * lda; else ao1 = a + (posX + 0) * 2 + posY * lda;
61 
62     i     = m;
63 
64     while (i > 0) {
65       if (offset > 0) {
66 	data01 = CMULT(*(ao1 + 0), -*(ao1 + 1));
67       } else
68 	if (offset < 0) {
69 	  data01 = CMULT(*(ao1 + 0), *(ao1 + 1));
70 	} else {
71 	  data01 = CMULT(*(ao1 + 0), ZERO);
72 	}
73 
74       if (offset >   0) ao1 += 2; else ao1 += lda;
75 
76       b[ 0] = data01;
77 
78       b ++;
79 
80       offset --;
81       i --;
82     }
83 
84     posX ++;
85     js --;
86   }
87 
88   return 0;
89 }
90