Coverage Report

Created: 2025-08-27 05:46

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/root/doris/contrib/openblas/interface/syr2.c
Line
Count
Source
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
#ifdef FUNCTION_PROFILE
43
#include "functable.h"
44
#endif
45
46
#ifdef XDOUBLE
47
#define ERROR_NAME "QSYR2 "
48
#elif defined(DOUBLE)
49
0
#define ERROR_NAME "DSYR2 "
50
#else
51
#define ERROR_NAME "SSYR2 "
52
#endif
53
54
static int (*syr2[])(BLASLONG, FLOAT, FLOAT *, BLASLONG, FLOAT *, BLASLONG, FLOAT *, BLASLONG, FLOAT *) = {
55
#ifdef XDOUBLE
56
  qsyr2_U, qsyr2_L,
57
#elif defined(DOUBLE)
58
  dsyr2_U, dsyr2_L,
59
#else
60
  ssyr2_U, ssyr2_L,
61
#endif
62
};
63
64
#ifdef SMP
65
static int (*syr2_thread[])(BLASLONG, FLOAT, FLOAT *, BLASLONG, FLOAT *, BLASLONG, FLOAT *, BLASLONG, FLOAT *, int) = {
66
#ifdef XDOUBLE
67
  qsyr2_thread_U, qsyr2_thread_L,
68
#elif defined(DOUBLE)
69
  dsyr2_thread_U, dsyr2_thread_L,
70
#else
71
  ssyr2_thread_U, ssyr2_thread_L,
72
#endif
73
};
74
#endif
75
76
#ifndef CBLAS
77
78
void NAME(char *UPLO, blasint *N, FLOAT  *ALPHA,
79
0
   FLOAT  *x, blasint *INCX, FLOAT *y, blasint *INCY, FLOAT *a, blasint *LDA){
80
81
0
  char uplo_arg = *UPLO;
82
0
  blasint n   = *N;
83
0
  FLOAT alpha  = *ALPHA;
84
0
  blasint lda = *LDA;
85
0
  blasint incx  = *INCX;
86
0
  blasint incy  = *INCY;
87
88
0
  blasint info;
89
0
  int uplo;
90
0
  FLOAT *buffer;
91
0
#ifdef SMP
92
0
  int nthreads;
93
0
#endif
94
95
0
  PRINT_DEBUG_NAME;
96
97
0
  TOUPPER(uplo_arg);
98
0
  uplo  = -1;
99
100
0
  if (uplo_arg  == 'U') uplo  = 0;
101
0
  if (uplo_arg  == 'L') uplo  = 1;
102
103
0
  info = 0;
104
105
0
  if (lda  < MAX(1, n))   info =  9;
106
0
  if (incy == 0)          info =  7;
107
0
  if (incx == 0)          info =  5;
108
0
  if (n < 0)              info =  2;
109
0
  if (uplo  < 0)          info =  1;
110
111
0
  if (info != 0) {
112
0
    BLASFUNC(xerbla)(ERROR_NAME, &info, sizeof(ERROR_NAME));
113
0
    return;
114
0
  }
115
116
#else
117
118
void CNAME(enum CBLAS_ORDER order, enum CBLAS_UPLO Uplo, blasint n, FLOAT alpha, FLOAT *x, blasint incx, FLOAT *y, blasint incy, FLOAT *a, blasint lda) {
119
120
  FLOAT *buffer;
121
  int uplo;
122
  blasint info;
123
#ifdef SMP
124
  int nthreads;
125
#endif
126
127
  PRINT_DEBUG_CNAME;
128
129
  uplo  = -1;
130
  info  =  0;
131
132
  if (order == CblasColMajor) {
133
134
    if (Uplo == CblasUpper) uplo  = 0;
135
    if (Uplo == CblasLower) uplo  = 1;
136
137
    info = -1;
138
139
    if (lda  < MAX(1, n))   info =  9;
140
    if (incy == 0)          info =  7;
141
    if (incx == 0)          info =  5;
142
    if (n < 0)              info =  2;
143
    if (uplo  < 0)          info =  1;
144
  }
145
146
  if (order == CblasRowMajor) {
147
148
    if (Uplo == CblasUpper) uplo  = 1;
149
    if (Uplo == CblasLower) uplo  = 0;
150
151
    info = -1;
152
153
    if (lda  < MAX(1, n))   info =  9;
154
    if (incy == 0)          info =  7;
155
    if (incx == 0)          info =  5;
156
    if (n < 0)              info =  2;
157
    if (uplo  < 0)          info =  1;
158
  }
159
160
  if (info >= 0) {
161
    BLASFUNC(xerbla)(ERROR_NAME, &info, sizeof(ERROR_NAME));
162
    return;
163
  }
164
165
#endif
166
167
0
  if (n == 0) return;
168
169
0
  if (alpha == ZERO) return;
170
171
0
  IDEBUG_START;
172
173
0
  if (incx == 1 && incy == 1 && n < 100) {
174
0
    blasint i;
175
0
    if (!uplo) {
176
0
      for (i = 0; i < n; i++){
177
0
        AXPYU_K(i + 1, 0, 0, alpha * x[i], y,     1, a, 1, NULL, 0);
178
0
        AXPYU_K(i + 1, 0, 0, alpha * y[i], x,     1, a, 1, NULL, 0);
179
0
        a += lda;
180
0
      }
181
0
    } else {
182
0
      for (i = 0; i < n; i++){
183
0
        AXPYU_K(n - i, 0, 0, alpha * x[i], y + i, 1, a, 1, NULL, 0);
184
0
        AXPYU_K(n - i, 0, 0, alpha * y[i], x + i, 1, a, 1, NULL, 0);
185
0
        a += 1 + lda;
186
0
      }
187
0
    }
188
0
    return;
189
0
  }
190
191
    
192
0
  FUNCTION_PROFILE_START();
193
194
0
  if (incx < 0 ) x -= (n - 1) * incx;
195
0
  if (incy < 0 ) y -= (n - 1) * incy;
196
197
0
  buffer = (FLOAT *)blas_memory_alloc(1);
198
199
0
#ifdef SMP
200
0
  nthreads = num_cpu_avail(2);
201
202
0
  if (nthreads == 1) {
203
0
#endif
204
205
0
    (syr2[uplo])(n, alpha, x, incx, y, incy, a, lda, buffer);
206
207
0
#ifdef SMP
208
0
  } else {
209
210
0
    (syr2_thread[uplo])(n, alpha, x, incx, y, incy, a, lda, buffer, nthreads);
211
212
0
  }
213
0
#endif
214
215
0
  blas_memory_free(buffer);
216
217
0
  FUNCTION_PROFILE_END(1, n * n / 2 + 2 * n, 2 * n * n);
218
219
0
  IDEBUG_END;
220
221
0
  return;
222
0
}