Line data Source code
1 : // This file is part of ELPA.
2 : //
3 : // The ELPA library was originally created by the ELPA consortium,
4 : // consisting of the following organizations:
5 : //
6 : // - Max Planck Computing and Data Facility (MPCDF), formerly known as
7 : // Rechenzentrum Garching der Max-Planck-Gesellschaft (RZG),
8 : // - Bergische Universität Wuppertal, Lehrstuhl für angewandte
9 : // Informatik,
10 : // - Technische Universität München, Lehrstuhl für Informatik mit
11 : // Schwerpunkt Wissenschaftliches Rechnen ,
12 : // - Fritz-Haber-Institut, Berlin, Abt. Theorie,
13 : // - Max-Plack-Institut für Mathematik in den Naturwissenschaften,
14 : // Leipzig, Abt. Komplexe Strukutren in Biologie und Kognition,
15 : // and
16 : // - IBM Deutschland GmbH
17 : //
18 : // This particular source code file contains additions, changes and
19 : // enhancements authored by Intel Corporation which is not part of
20 : // the ELPA consortium.
21 : //
22 : // More information can be found here:
23 : // http://elpa.mpcdf.mpg.de/
24 : //
25 : // ELPA is free software: you can redistribute it and/or modify
26 : // it under the terms of the version 3 of the license of the
27 : // GNU Lesser General Public License as published by the Free
28 : // Software Foundation.
29 : //
30 : // ELPA is distributed in the hope that it will be useful,
31 : // but WITHOUT ANY WARRANTY; without even the implied warranty of
32 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
33 : // GNU Lesser General Public License for more details.
34 : //
35 : // You should have received a copy of the GNU Lesser General Public License
36 : // along with ELPA. If not, see <http://www.gnu.org/licenses/>
37 : //
38 : // ELPA reflects a substantial effort on the part of the original
39 : // ELPA consortium, and we ask you to respect the spirit of the
40 : // license that we chose: i.e., please contribute any changes you
41 : // may have back to the original ELPA library distribution, and keep
42 : // any derivatives of ELPA under the same license that we chose for
43 : // the original distribution, the GNU Lesser General Public License.
44 : //
45 : //
46 : // --------------------------------------------------------------------------------------------------
47 : //
48 : // This file contains the compute intensive kernels for the Householder transformations.
49 : // It should be compiled with the highest possible optimization level.
50 : //
51 : // On Intel Nehalem or Intel Westmere or AMD Magny Cours use -O3 -msse3
52 : // On Intel Sandy Bridge use -O3 -mavx
53 : //
54 : // Copyright of the original code rests with the authors inside the ELPA
55 : // consortium. The copyright of any additional modifications shall rest
56 : // with their original authors, but shall adhere to the licensing terms
57 : // distributed along with the original code in the file "COPYING".
58 : //
59 : // Author: Andreas Marek, MPCDF (andreas.marek@mpcdf.mpg.de), based on Alexander Heinecke (alexander.heinecke@mytum.de)
60 : // --------------------------------------------------------------------------------------------------
61 :
62 : #include "config-f90.h"
63 :
64 : #ifdef HAVE_SSE_INTRINSICS
65 : #include <x86intrin.h>
66 : #endif
67 : #ifdef HAVE_SPARC64_SSE
68 : #include <fjmfunc.h>
69 : #include <emmintrin.h>
70 : #endif
71 : #include <stdio.h>
72 : #include <stdlib.h>
73 :
74 :
75 : #define __forceinline __attribute__((always_inline)) static
76 :
77 : #ifdef DOUBLE_PRECISION_REAL
78 : #define offset 2
79 : #define __SSE_DATATYPE __m128d
80 : #define _SSE_LOAD _mm_load_pd
81 : #define _SSE_ADD _mm_add_pd
82 : #define _SSE_SUB _mm_sub_pd
83 : #define _SSE_MUL _mm_mul_pd
84 : #define _SSE_STORE _mm_store_pd
85 : #endif
86 : #ifdef SINGLE_PRECISION_REAL
87 : #define offset 4
88 : #define __SSE_DATATYPE __m128
89 : #define _SSE_LOAD _mm_load_ps
90 : #define _SSE_ADD _mm_add_ps
91 : #define _SSE_SUB _mm_sub_ps
92 : #define _SSE_MUL _mm_mul_ps
93 : #define _SSE_STORE _mm_store_ps
94 : #endif
95 :
96 : #ifdef HAVE_SSE_INTRINSICS
97 : #undef __AVX__
98 : #endif
99 :
100 : #ifdef HAVE_SSE_INTRINSICS
101 : #ifdef DOUBLE_PRECISION_REAL
102 : //Forward declaration
103 : static void hh_trafo_kernel_2_SSE_6hv_double(double* q, double* hh, int nb, int ldq, int ldh, double* scalarprods);
104 : static void hh_trafo_kernel_4_SSE_6hv_double(double* q, double* hh, int nb, int ldq, int ldh, double* scalarprods);
105 : void hexa_hh_trafo_real_sse_6hv_double(double* q, double* hh, int* pnb, int* pnq, int* pldq, int* pldh);
106 : #endif
107 :
108 : #ifdef SINGLE_PRECISION_REAL
109 : static void hh_trafo_kernel_4_SSE_6hv_single(float* q, float* hh, int nb, int ldq, int ldh, float* scalarprods);
110 : static void hh_trafo_kernel_8_SSE_6hv_single(float* q, float* hh, int nb, int ldq, int ldh, float* scalarprods);
111 : void hexa_hh_trafo_real_sse_6hv_single_(float* q, float* hh, int* pnb, int* pnq, int* pldq, int* pldh);
112 : #endif
113 : #endif
114 :
115 : #ifdef HAVE_SPARC64_SSE
116 : #ifdef DOUBLE_PRECISION_REAL
117 : //Forward declaration
118 : static void hh_trafo_kernel_2_SPARC64_6hv_double(double* q, double* hh, int nb, int ldq, int ldh, double* scalarprods);
119 : static void hh_trafo_kernel_4_SPARC64_6hv_double(double* q, double* hh, int nb, int ldq, int ldh, double* scalarprods);
120 : void hexa_hh_trafo_real_sparc64_6hv_double(double* q, double* hh, int* pnb, int* pnq, int* pldq, int* pldh);
121 : #endif
122 :
123 : #ifdef SINGLE_PRECISION_REAL
124 : static void hh_trafo_kernel_4_SPARC64_6hv_single(float* q, float* hh, int nb, int ldq, int ldh, float* scalarprods);
125 : static void hh_trafo_kernel_8_SPARC64_6hv_single(float* q, float* hh, int nb, int ldq, int ldh, float* scalarprods);
126 : void hexa_hh_trafo_real_sparc64_6hv_single_(float* q, float* hh, int* pnb, int* pnq, int* pldq, int* pldh);
127 : #endif
128 : #endif
129 :
130 :
131 :
132 : #ifdef DOUBLE_PRECISION_REAL
133 : /*
134 : !f>#ifdef HAVE_SSE_INTRINSICS
135 : !f> interface
136 : !f> subroutine hexa_hh_trafo_real_sse_6hv_double(q, hh, pnb, pnq, pldq, pldh) &
137 : !f> bind(C, name="hexa_hh_trafo_real_sse_6hv_double")
138 : !f> use, intrinsic :: iso_c_binding
139 : !f> integer(kind=c_int) :: pnb, pnq, pldq, pldh
140 : !f> type(c_ptr), value :: q
141 : !f> real(kind=c_double) :: hh(pnb,6)
142 : !f> end subroutine
143 : !f> end interface
144 : !f>#endif
145 : */
146 : /*
147 : !f>#ifdef HAVE_SPARC64_SSE
148 : !f> interface
149 : !f> subroutine hexa_hh_trafo_real_sparc64_6hv_double(q, hh, pnb, pnq, pldq, pldh) &
150 : !f> bind(C, name="hexa_hh_trafo_real_sparc64_6hv_double")
151 : !f> use, intrinsic :: iso_c_binding
152 : !f> integer(kind=c_int) :: pnb, pnq, pldq, pldh
153 : !f> type(c_ptr), value :: q
154 : !f> real(kind=c_double) :: hh(pnb,6)
155 : !f> end subroutine
156 : !f> end interface
157 : !f>#endif
158 : */
159 : #endif
160 :
161 : #ifdef SINGLE_PRECISION_REAL
162 : /*
163 : !f>#ifdef HAVE_SSE_INTRINSICS
164 : !f> interface
165 : !f> subroutine hexa_hh_trafo_real_sse_6hv_single(q, hh, pnb, pnq, pldq, pldh) &
166 : !f> bind(C, name="hexa_hh_trafo_real_sse_6hv_single")
167 : !f> use, intrinsic :: iso_c_binding
168 : !f> integer(kind=c_int) :: pnb, pnq, pldq, pldh
169 : !f> type(c_ptr), value :: q
170 : !f> real(kind=c_float) :: hh(pnb,6)
171 : !f> end subroutine
172 : !f> end interface
173 : !f>#endif
174 : */
175 : /*
176 : !f>#ifdef HAVE_SPARC64_SSE
177 : !f> interface
178 : !f> subroutine hexa_hh_trafo_real_sparc64_6hv_single(q, hh, pnb, pnq, pldq, pldh) &
179 : !f> bind(C, name="hexa_hh_trafo_real_sparc64_6hv_single")
180 : !f> use, intrinsic :: iso_c_binding
181 : !f> integer(kind=c_int) :: pnb, pnq, pldq, pldh
182 : !f> type(c_ptr), value :: q
183 : !f> real(kind=c_float) :: hh(pnb,6)
184 : !f> end subroutine
185 : !f> end interface
186 : !f>#endif
187 : */
188 :
189 : #endif
190 :
191 : #ifdef HAVE_SSE_INTRINSICS
192 : #ifdef DOUBLE_PRECISION_REAL
193 163840 : void hexa_hh_trafo_real_sse_6hv_double(double* q, double* hh, int* pnb, int* pnq, int* pldq, int* pldh)
194 : #endif
195 : #ifdef SINGLE_PRECISION_REAL
196 30720 : void hexa_hh_trafo_real_sse_6hv_single(float* q, float* hh, int* pnb, int* pnq, int* pldq, int* pldh)
197 : #endif
198 : #endif
199 : #ifdef HAVE_SPARC64_SSE
200 : #ifdef DOUBLE_PRECISION_REAL
201 : void hexa_hh_trafo_real_sparc64_6hv_double(double* q, double* hh, int* pnb, int* pnq, int* pldq, int* pldh)
202 : #endif
203 : #ifdef SINGLE_PRECISION_REAL
204 : void hexa_hh_trafo_real_sparc64_6hv_single(float* q, float* hh, int* pnb, int* pnq, int* pldq, int* pldh)
205 : #endif
206 : #endif
207 : {
208 : int i;
209 194560 : int nb = *pnb;
210 194560 : int nq = *pldq;
211 194560 : int ldq = *pldq;
212 194560 : int ldh = *pldh;
213 : int worked_on ;
214 :
215 194560 : worked_on = 0;
216 :
217 : // calculating scalar products to compute
218 : // 6 householder vectors simultaneously
219 : #ifdef DOUBLE_PRECISION_REAL
220 : double scalarprods[15];
221 : #endif
222 : #ifdef SINGLE_PRECISION_REAL
223 : float scalarprods[15];
224 : #endif
225 :
226 194560 : scalarprods[0] = hh[(ldh+1)];
227 194560 : scalarprods[1] = hh[(ldh*2)+2];
228 194560 : scalarprods[2] = hh[(ldh*2)+1];
229 194560 : scalarprods[3] = hh[(ldh*3)+3];
230 194560 : scalarprods[4] = hh[(ldh*3)+2];
231 194560 : scalarprods[5] = hh[(ldh*3)+1];
232 194560 : scalarprods[6] = hh[(ldh*4)+4];
233 194560 : scalarprods[7] = hh[(ldh*4)+3];
234 194560 : scalarprods[8] = hh[(ldh*4)+2];
235 194560 : scalarprods[9] = hh[(ldh*4)+1];
236 194560 : scalarprods[10] = hh[(ldh*5)+5];
237 194560 : scalarprods[11] = hh[(ldh*5)+4];
238 194560 : scalarprods[12] = hh[(ldh*5)+3];
239 194560 : scalarprods[13] = hh[(ldh*5)+2];
240 194560 : scalarprods[14] = hh[(ldh*5)+1];
241 :
242 : // calculate scalar product of first and fourth householder Vector
243 : // loop counter = 2
244 194560 : scalarprods[0] += hh[1] * hh[(2+ldh)];
245 194560 : scalarprods[2] += hh[(ldh)+1] * hh[2+(ldh*2)];
246 194560 : scalarprods[5] += hh[(ldh*2)+1] * hh[2+(ldh*3)];
247 194560 : scalarprods[9] += hh[(ldh*3)+1] * hh[2+(ldh*4)];
248 194560 : scalarprods[14] += hh[(ldh*4)+1] * hh[2+(ldh*5)];
249 :
250 : // loop counter = 3
251 194560 : scalarprods[0] += hh[2] * hh[(3+ldh)];
252 194560 : scalarprods[2] += hh[(ldh)+2] * hh[3+(ldh*2)];
253 194560 : scalarprods[5] += hh[(ldh*2)+2] * hh[3+(ldh*3)];
254 194560 : scalarprods[9] += hh[(ldh*3)+2] * hh[3+(ldh*4)];
255 194560 : scalarprods[14] += hh[(ldh*4)+2] * hh[3+(ldh*5)];
256 :
257 194560 : scalarprods[1] += hh[1] * hh[3+(ldh*2)];
258 194560 : scalarprods[4] += hh[(ldh*1)+1] * hh[3+(ldh*3)];
259 194560 : scalarprods[8] += hh[(ldh*2)+1] * hh[3+(ldh*4)];
260 194560 : scalarprods[13] += hh[(ldh*3)+1] * hh[3+(ldh*5)];
261 :
262 : // loop counter = 4
263 194560 : scalarprods[0] += hh[3] * hh[(4+ldh)];
264 194560 : scalarprods[2] += hh[(ldh)+3] * hh[4+(ldh*2)];
265 194560 : scalarprods[5] += hh[(ldh*2)+3] * hh[4+(ldh*3)];
266 194560 : scalarprods[9] += hh[(ldh*3)+3] * hh[4+(ldh*4)];
267 194560 : scalarprods[14] += hh[(ldh*4)+3] * hh[4+(ldh*5)];
268 :
269 194560 : scalarprods[1] += hh[2] * hh[4+(ldh*2)];
270 194560 : scalarprods[4] += hh[(ldh*1)+2] * hh[4+(ldh*3)];
271 194560 : scalarprods[8] += hh[(ldh*2)+2] * hh[4+(ldh*4)];
272 194560 : scalarprods[13] += hh[(ldh*3)+2] * hh[4+(ldh*5)];
273 :
274 194560 : scalarprods[3] += hh[1] * hh[4+(ldh*3)];
275 194560 : scalarprods[7] += hh[(ldh)+1] * hh[4+(ldh*4)];
276 194560 : scalarprods[12] += hh[(ldh*2)+1] * hh[4+(ldh*5)];
277 :
278 : // loop counter = 5
279 194560 : scalarprods[0] += hh[4] * hh[(5+ldh)];
280 194560 : scalarprods[2] += hh[(ldh)+4] * hh[5+(ldh*2)];
281 194560 : scalarprods[5] += hh[(ldh*2)+4] * hh[5+(ldh*3)];
282 194560 : scalarprods[9] += hh[(ldh*3)+4] * hh[5+(ldh*4)];
283 194560 : scalarprods[14] += hh[(ldh*4)+4] * hh[5+(ldh*5)];
284 :
285 194560 : scalarprods[1] += hh[3] * hh[5+(ldh*2)];
286 194560 : scalarprods[4] += hh[(ldh*1)+3] * hh[5+(ldh*3)];
287 194560 : scalarprods[8] += hh[(ldh*2)+3] * hh[5+(ldh*4)];
288 194560 : scalarprods[13] += hh[(ldh*3)+3] * hh[5+(ldh*5)];
289 :
290 194560 : scalarprods[3] += hh[2] * hh[5+(ldh*3)];
291 194560 : scalarprods[7] += hh[(ldh)+2] * hh[5+(ldh*4)];
292 194560 : scalarprods[12] += hh[(ldh*2)+2] * hh[5+(ldh*5)];
293 :
294 194560 : scalarprods[6] += hh[1] * hh[5+(ldh*4)];
295 194560 : scalarprods[11] += hh[(ldh)+1] * hh[5+(ldh*5)];
296 :
297 : #pragma ivdep
298 11479040 : for (i = 6; i < nb; i++)
299 : {
300 11284480 : scalarprods[0] += hh[i-1] * hh[(i+ldh)];
301 11284480 : scalarprods[2] += hh[(ldh)+i-1] * hh[i+(ldh*2)];
302 11284480 : scalarprods[5] += hh[(ldh*2)+i-1] * hh[i+(ldh*3)];
303 11284480 : scalarprods[9] += hh[(ldh*3)+i-1] * hh[i+(ldh*4)];
304 11284480 : scalarprods[14] += hh[(ldh*4)+i-1] * hh[i+(ldh*5)];
305 :
306 11284480 : scalarprods[1] += hh[i-2] * hh[i+(ldh*2)];
307 11284480 : scalarprods[4] += hh[(ldh*1)+i-2] * hh[i+(ldh*3)];
308 11284480 : scalarprods[8] += hh[(ldh*2)+i-2] * hh[i+(ldh*4)];
309 11284480 : scalarprods[13] += hh[(ldh*3)+i-2] * hh[i+(ldh*5)];
310 :
311 11284480 : scalarprods[3] += hh[i-3] * hh[i+(ldh*3)];
312 11284480 : scalarprods[7] += hh[(ldh)+i-3] * hh[i+(ldh*4)];
313 11284480 : scalarprods[12] += hh[(ldh*2)+i-3] * hh[i+(ldh*5)];
314 :
315 11284480 : scalarprods[6] += hh[i-4] * hh[i+(ldh*4)];
316 11284480 : scalarprods[11] += hh[(ldh)+i-4] * hh[i+(ldh*5)];
317 :
318 11284480 : scalarprods[10] += hh[i-5] * hh[i+(ldh*5)];
319 : }
320 :
321 : // Production level kernel calls with padding
322 : #ifdef DOUBLE_PRECISION_REAL
323 1802240 : for (i = 0; i < nq-2; i+=4)
324 : {
325 : #ifdef HAVE_SSE_INTRINSICS
326 1638400 : hh_trafo_kernel_4_SSE_6hv_double(&q[i], hh, nb, ldq, ldh, scalarprods);
327 : #endif
328 : #ifdef HAVE_SPARC64_SSE
329 : hh_trafo_kernel_4_SPARC64_6hv_double(&q[i], hh, nb, ldq, ldh, scalarprods);
330 : #endif
331 :
332 1638400 : worked_on += 4;
333 : }
334 : #endif
335 : #ifdef SINGLE_PRECISION_REAL
336 337920 : for (i = 0; i < nq-4; i+=8)
337 : {
338 : #ifdef HAVE_SSE_INTRINSICS
339 307200 : hh_trafo_kernel_8_SSE_6hv_single(&q[i], hh, nb, ldq, ldh, scalarprods);
340 : #endif
341 : #ifdef HAVE_SPARC64_SSE
342 : hh_trafo_kernel_8_SPARC64_6hv_single(&q[i], hh, nb, ldq, ldh, scalarprods);
343 : #endif
344 :
345 307200 : worked_on += 8;
346 : }
347 : #endif
348 194560 : if (nq == i)
349 : {
350 194560 : return;
351 : }
352 : #ifdef DOUBLE_PRECISION_REAL
353 0 : if (nq -i == 2)
354 : {
355 : #ifdef HAVE_SSE_INTRINSICS
356 0 : hh_trafo_kernel_2_SSE_6hv_double(&q[i], hh, nb, ldq, ldh, scalarprods);
357 : #endif
358 : #ifdef HAVE_SPARC64_SSE
359 : hh_trafo_kernel_2_SPARC64_6hv_double(&q[i], hh, nb, ldq, ldh, scalarprods);
360 : #endif
361 :
362 0 : worked_on += 2;
363 : }
364 : #endif
365 : #ifdef SINGLE_PRECISION_REAL
366 0 : if (nq -i == 4)
367 : {
368 : #ifdef HAVE_SSE_INTRINSICS
369 0 : hh_trafo_kernel_4_SSE_6hv_single(&q[i], hh, nb, ldq, ldh, scalarprods);
370 : #endif
371 : #ifdef HAVE_SPARC64_SSE
372 : hh_trafo_kernel_4_SPARC64_6hv_single(&q[i], hh, nb, ldq, ldh, scalarprods);
373 : #endif
374 0 : worked_on += 4;
375 : }
376 : #endif
377 : #ifdef WITH_DEBUG
378 : if (worked_on != nq)
379 : {
380 : #ifdef HAVE_SSE_INTRINSICS
381 : printf("Error in real SSE BLOCK6 kernel \n");
382 : #endif
383 : #ifdef HAVE_SPARC64_SSE
384 : printf("Error in real SPARC64 BLOCK6 kernel \n");
385 : #endif
386 :
387 : abort();
388 : }
389 : #endif
390 : }
391 :
392 : /**
393 : * Unrolled kernel that computes
394 : #ifdef DOUBLE_PRECISION_REAL
395 : * 4 rows of Q simultaneously, a
396 : #endif
397 : #ifdef SINGLE_PRECISION_REAL
398 : * 8 rows of Q simultaneously, a
399 : #endif
400 : * matrix Vector product with two householder
401 : * vectors + a rank 1 update is performed
402 : */
403 : #ifdef HAVE_SSE_INTRINSICS
404 : #ifdef DOUBLE_PRECISION_REAL
405 : __forceinline void hh_trafo_kernel_4_SSE_6hv_double(double* q, double* hh, int nb, int ldq, int ldh, double* scalarprods)
406 : #endif
407 : #ifdef SINGLE_PRECISION_REAL
408 : __forceinline void hh_trafo_kernel_8_SSE_6hv_single(float* q, float* hh, int nb, int ldq, int ldh, float* scalarprods)
409 : #endif
410 : #endif
411 : #ifdef HAVE_SPARC64_SSE
412 : #ifdef DOUBLE_PRECISION_REAL
413 : __forceinline void hh_trafo_kernel_4_SPARC64_6hv_double(double* q, double* hh, int nb, int ldq, int ldh, double* scalarprods)
414 : #endif
415 : #ifdef SINGLE_PRECISION_REAL
416 : __forceinline void hh_trafo_kernel_8_SPARC64_6hv_single(float* q, float* hh, int nb, int ldq, int ldh, float* scalarprods)
417 : #endif
418 : #endif
419 :
420 : {
421 : /////////////////////////////////////////////////////
422 : // Matrix Vector Multiplication, Q [4 x nb+3] * hh
423 : // hh contains four householder vectors
424 : /////////////////////////////////////////////////////
425 : int i;
426 :
427 3891200 : __SSE_DATATYPE a1_1 = _SSE_LOAD(&q[ldq*5]);
428 3891200 : __SSE_DATATYPE a2_1 = _SSE_LOAD(&q[ldq*4]);
429 3891200 : __SSE_DATATYPE a3_1 = _SSE_LOAD(&q[ldq*3]);
430 3891200 : __SSE_DATATYPE a4_1 = _SSE_LOAD(&q[ldq*2]);
431 3891200 : __SSE_DATATYPE a5_1 = _SSE_LOAD(&q[ldq]);
432 1945600 : __SSE_DATATYPE a6_1 = _SSE_LOAD(&q[0]);
433 :
434 : #ifdef HAVE_SSE_INTRINSICS
435 : #ifdef DOUBLE_PRECISION_REAL
436 3276800 : __SSE_DATATYPE h_6_5 = _mm_set1_pd(hh[(ldh*5)+1]);
437 3276800 : __SSE_DATATYPE h_6_4 = _mm_set1_pd(hh[(ldh*5)+2]);
438 3276800 : __SSE_DATATYPE h_6_3 = _mm_set1_pd(hh[(ldh*5)+3]);
439 3276800 : __SSE_DATATYPE h_6_2 = _mm_set1_pd(hh[(ldh*5)+4]);
440 3276800 : __SSE_DATATYPE h_6_1 = _mm_set1_pd(hh[(ldh*5)+5]);
441 : #endif
442 : #ifdef SINGLE_PRECISION_REAL
443 614400 : __SSE_DATATYPE h_6_5 = _mm_set1_ps(hh[(ldh*5)+1]) ;
444 614400 : __SSE_DATATYPE h_6_4 = _mm_set1_ps(hh[(ldh*5)+2]) ;
445 614400 : __SSE_DATATYPE h_6_3 = _mm_set1_ps(hh[(ldh*5)+3]) ;
446 614400 : __SSE_DATATYPE h_6_2 = _mm_set1_ps(hh[(ldh*5)+4]) ;
447 614400 : __SSE_DATATYPE h_6_1 = _mm_set1_ps(hh[(ldh*5)+5]) ;
448 : #endif
449 : #endif
450 :
451 : #ifdef HAVE_SPARC64_SSE
452 : #ifdef DOUBLE_PRECISION_REAL
453 : __SSE_DATATYPE h_6_5 = _mm_set_pd(hh[(ldh*5)+1], hh[(ldh*5)+1]);
454 : __SSE_DATATYPE h_6_4 = _mm_set_pd(hh[(ldh*5)+2], hh[(ldh*5)+2]);
455 : __SSE_DATATYPE h_6_3 = _mm_set_pd(hh[(ldh*5)+3], hh[(ldh*5)+3]);
456 : __SSE_DATATYPE h_6_2 = _mm_set_pd(hh[(ldh*5)+4], hh[(ldh*5)+4]);
457 : __SSE_DATATYPE h_6_1 = _mm_set_pd(hh[(ldh*5)+5], hh[(ldh*5)+5]);
458 : #endif
459 : #ifdef SINGLE_PRECISION_REAL
460 : __SSE_DATATYPE h_6_5 = _mm_set_ps(hh[(ldh*5)+1], hh[(ldh*5)+1]) ;
461 : __SSE_DATATYPE h_6_4 = _mm_set_ps(hh[(ldh*5)+2], hh[(ldh*5)+2]) ;
462 : __SSE_DATATYPE h_6_3 = _mm_set_ps(hh[(ldh*5)+3], hh[(ldh*5)+3]) ;
463 : __SSE_DATATYPE h_6_2 = _mm_set_ps(hh[(ldh*5)+4], hh[(ldh*5)+4]) ;
464 : __SSE_DATATYPE h_6_1 = _mm_set_ps(hh[(ldh*5)+5], hh[(ldh*5)+5]) ;
465 : #endif
466 : #endif
467 :
468 :
469 :
470 3891200 : register __SSE_DATATYPE t1 = _SSE_ADD(a6_1, _SSE_MUL(a5_1, h_6_5));
471 3891200 : t1 = _SSE_ADD(t1, _SSE_MUL(a4_1, h_6_4));
472 3891200 : t1 = _SSE_ADD(t1, _SSE_MUL(a3_1, h_6_3));
473 3891200 : t1 = _SSE_ADD(t1, _SSE_MUL(a2_1, h_6_2));
474 3891200 : t1 = _SSE_ADD(t1, _SSE_MUL(a1_1, h_6_1));
475 :
476 : #ifdef HAVE_SSE_INTRINSICS
477 : #ifdef DOUBLE_PRECISION_REAL
478 3276800 : __SSE_DATATYPE h_5_4 = _mm_set1_pd(hh[(ldh*4)+1]);
479 3276800 : __SSE_DATATYPE h_5_3 = _mm_set1_pd(hh[(ldh*4)+2]);
480 3276800 : __SSE_DATATYPE h_5_2 = _mm_set1_pd(hh[(ldh*4)+3]);
481 3276800 : __SSE_DATATYPE h_5_1 = _mm_set1_pd(hh[(ldh*4)+4]);
482 : #endif
483 : #ifdef SINGLE_PRECISION_REAL
484 614400 : __SSE_DATATYPE h_5_4 = _mm_set1_ps(hh[(ldh*4)+1]) ;
485 614400 : __SSE_DATATYPE h_5_3 = _mm_set1_ps(hh[(ldh*4)+2]) ;
486 614400 : __SSE_DATATYPE h_5_2 = _mm_set1_ps(hh[(ldh*4)+3]) ;
487 614400 : __SSE_DATATYPE h_5_1 = _mm_set1_ps(hh[(ldh*4)+4]) ;
488 : #endif
489 : #endif
490 :
491 : #ifdef HAVE_SPARC64_SSE
492 : #ifdef DOUBLE_PRECISION_REAL
493 : __SSE_DATATYPE h_5_4 = _mm_set_pd(hh[(ldh*4)+1], hh[(ldh*4)+1]);
494 : __SSE_DATATYPE h_5_3 = _mm_set_pd(hh[(ldh*4)+2], hh[(ldh*4)+2]);
495 : __SSE_DATATYPE h_5_2 = _mm_set_pd(hh[(ldh*4)+3], hh[(ldh*4)+3]);
496 : __SSE_DATATYPE h_5_1 = _mm_set_pd(hh[(ldh*4)+4], hh[(ldh*4)+4]);
497 : #endif
498 : #ifdef SINGLE_PRECISION_REAL
499 : __SSE_DATATYPE h_5_4 = _mm_set_ps(hh[(ldh*4)+1], hh[(ldh*4)+1]) ;
500 : __SSE_DATATYPE h_5_3 = _mm_set_ps(hh[(ldh*4)+2], hh[(ldh*4)+2]) ;
501 : __SSE_DATATYPE h_5_2 = _mm_set_ps(hh[(ldh*4)+3], hh[(ldh*4)+3]) ;
502 : __SSE_DATATYPE h_5_1 = _mm_set_ps(hh[(ldh*4)+4], hh[(ldh*4)+4]) ;
503 : #endif
504 : #endif
505 :
506 :
507 :
508 3891200 : register __SSE_DATATYPE v1 = _SSE_ADD(a5_1, _SSE_MUL(a4_1, h_5_4));
509 3891200 : v1 = _SSE_ADD(v1, _SSE_MUL(a3_1, h_5_3));
510 3891200 : v1 = _SSE_ADD(v1, _SSE_MUL(a2_1, h_5_2));
511 3891200 : v1 = _SSE_ADD(v1, _SSE_MUL(a1_1, h_5_1));
512 :
513 : #ifdef HAVE_SSE_INTRINSICS
514 : #ifdef DOUBLE_PRECISION_REAL
515 3276800 : __SSE_DATATYPE h_4_3 = _mm_set1_pd(hh[(ldh*3)+1]);
516 3276800 : __SSE_DATATYPE h_4_2 = _mm_set1_pd(hh[(ldh*3)+2]);
517 3276800 : __SSE_DATATYPE h_4_1 = _mm_set1_pd(hh[(ldh*3)+3]);
518 : #endif
519 : #ifdef SINGLE_PRECISION_REAL
520 614400 : __SSE_DATATYPE h_4_3 = _mm_set1_ps(hh[(ldh*3)+1]) ;
521 614400 : __SSE_DATATYPE h_4_2 = _mm_set1_ps(hh[(ldh*3)+2]) ;
522 614400 : __SSE_DATATYPE h_4_1 = _mm_set1_ps(hh[(ldh*3)+3]) ;
523 : #endif
524 : #endif
525 :
526 : #ifdef HAVE_SPARC64_SSE
527 : #ifdef DOUBLE_PRECISION_REAL
528 : __SSE_DATATYPE h_4_3 = _mm_set_pd(hh[(ldh*3)+1], hh[(ldh*3)+1]);
529 : __SSE_DATATYPE h_4_2 = _mm_set_pd(hh[(ldh*3)+2], hh[(ldh*3)+2]);
530 : __SSE_DATATYPE h_4_1 = _mm_set_pd(hh[(ldh*3)+3], hh[(ldh*3)+3]);
531 : #endif
532 : #ifdef SINGLE_PRECISION_REAL
533 : __SSE_DATATYPE h_4_3 = _mm_set_ps(hh[(ldh*3)+1], hh[(ldh*3)+1]);
534 : __SSE_DATATYPE h_4_2 = _mm_set_ps(hh[(ldh*3)+2], hh[(ldh*3)+2]);
535 : __SSE_DATATYPE h_4_1 = _mm_set_ps(hh[(ldh*3)+3], hh[(ldh*3)+3]);
536 : #endif
537 : #endif
538 :
539 :
540 3891200 : register __SSE_DATATYPE w1 = _SSE_ADD(a4_1, _SSE_MUL(a3_1, h_4_3));
541 3891200 : w1 = _SSE_ADD(w1, _SSE_MUL(a2_1, h_4_2));
542 3891200 : w1 = _SSE_ADD(w1, _SSE_MUL(a1_1, h_4_1));
543 :
544 : #ifdef HAVE_SSE_INTRINSICS
545 : #ifdef DOUBLE_PRECISION_REAL
546 3276800 : __SSE_DATATYPE h_2_1 = _mm_set1_pd(hh[ldh+1]);
547 3276800 : __SSE_DATATYPE h_3_2 = _mm_set1_pd(hh[(ldh*2)+1]);
548 3276800 : __SSE_DATATYPE h_3_1 = _mm_set1_pd(hh[(ldh*2)+2]);
549 : #endif
550 : #ifdef SINGLE_PRECISION_REAL
551 614400 : __SSE_DATATYPE h_2_1 = _mm_set1_ps(hh[ldh+1]) ;
552 614400 : __SSE_DATATYPE h_3_2 = _mm_set1_ps(hh[(ldh*2)+1]) ;
553 614400 : __SSE_DATATYPE h_3_1 = _mm_set1_ps(hh[(ldh*2)+2]) ;
554 : #endif
555 : #endif
556 :
557 : #ifdef HAVE_SPARC64_SSE
558 : #ifdef DOUBLE_PRECISION_REAL
559 : __SSE_DATATYPE h_2_1 = _mm_set_pd(hh[ldh+1], hh[ldh+1]);
560 : __SSE_DATATYPE h_3_2 = _mm_set_pd(hh[(ldh*2)+1], hh[(ldh*2)+1]);
561 : __SSE_DATATYPE h_3_1 = _mm_set_pd(hh[(ldh*2)+2], hh[(ldh*2)+2]);
562 : #endif
563 : #ifdef SINGLE_PRECISION_REAL
564 : __SSE_DATATYPE h_2_1 = _mm_set_ps(hh[ldh+1], hh[ldh+1]) ;
565 : __SSE_DATATYPE h_3_2 = _mm_set_ps(hh[(ldh*2)+1], hh[(ldh*2)+1]) ;
566 : __SSE_DATATYPE h_3_1 = _mm_set_ps(hh[(ldh*2)+2], hh[(ldh*2)+2]) ;
567 : #endif
568 : #endif
569 :
570 3891200 : register __SSE_DATATYPE z1 = _SSE_ADD(a3_1, _SSE_MUL(a2_1, h_3_2));
571 3891200 : z1 = _SSE_ADD(z1, _SSE_MUL(a1_1, h_3_1));
572 3891200 : register __SSE_DATATYPE y1 = _SSE_ADD(a2_1, _SSE_MUL(a1_1, h_2_1));
573 :
574 1945600 : register __SSE_DATATYPE x1 = a1_1;
575 :
576 3891200 : __SSE_DATATYPE a1_2 = _SSE_LOAD(&q[(ldq*5)+offset]);
577 3891200 : __SSE_DATATYPE a2_2 = _SSE_LOAD(&q[(ldq*4)+offset]);
578 3891200 : __SSE_DATATYPE a3_2 = _SSE_LOAD(&q[(ldq*3)+offset]);
579 3891200 : __SSE_DATATYPE a4_2 = _SSE_LOAD(&q[(ldq*2)+offset]);
580 3891200 : __SSE_DATATYPE a5_2 = _SSE_LOAD(&q[(ldq)+offset]);
581 3891200 : __SSE_DATATYPE a6_2 = _SSE_LOAD(&q[offset]);
582 :
583 3891200 : register __SSE_DATATYPE t2 = _SSE_ADD(a6_2, _SSE_MUL(a5_2, h_6_5));
584 3891200 : t2 = _SSE_ADD(t2, _SSE_MUL(a4_2, h_6_4));
585 3891200 : t2 = _SSE_ADD(t2, _SSE_MUL(a3_2, h_6_3));
586 3891200 : t2 = _SSE_ADD(t2, _SSE_MUL(a2_2, h_6_2));
587 3891200 : t2 = _SSE_ADD(t2, _SSE_MUL(a1_2, h_6_1));
588 3891200 : register __SSE_DATATYPE v2 = _SSE_ADD(a5_2, _SSE_MUL(a4_2, h_5_4));
589 3891200 : v2 = _SSE_ADD(v2, _SSE_MUL(a3_2, h_5_3));
590 3891200 : v2 = _SSE_ADD(v2, _SSE_MUL(a2_2, h_5_2));
591 3891200 : v2 = _SSE_ADD(v2, _SSE_MUL(a1_2, h_5_1));
592 3891200 : register __SSE_DATATYPE w2 = _SSE_ADD(a4_2, _SSE_MUL(a3_2, h_4_3));
593 3891200 : w2 = _SSE_ADD(w2, _SSE_MUL(a2_2, h_4_2));
594 3891200 : w2 = _SSE_ADD(w2, _SSE_MUL(a1_2, h_4_1));
595 3891200 : register __SSE_DATATYPE z2 = _SSE_ADD(a3_2, _SSE_MUL(a2_2, h_3_2));
596 3891200 : z2 = _SSE_ADD(z2, _SSE_MUL(a1_2, h_3_1));
597 3891200 : register __SSE_DATATYPE y2 = _SSE_ADD(a2_2, _SSE_MUL(a1_2, h_2_1));
598 :
599 1945600 : register __SSE_DATATYPE x2 = a1_2;
600 :
601 : __SSE_DATATYPE q1;
602 : __SSE_DATATYPE q2;
603 :
604 : __SSE_DATATYPE h1;
605 : __SSE_DATATYPE h2;
606 : __SSE_DATATYPE h3;
607 : __SSE_DATATYPE h4;
608 : __SSE_DATATYPE h5;
609 : __SSE_DATATYPE h6;
610 :
611 114790400 : for(i = 6; i < nb; i++)
612 : {
613 : #ifdef HAVE_SSE_INTRINSICS
614 : #ifdef DOUBLE_PRECISION_REAL
615 190054400 : h1 = _mm_set1_pd(hh[i-5]);
616 : #endif
617 : #ifdef SINGLE_PRECISION_REAL
618 35635200 : h1 = _mm_set1_ps(hh[i-5]);
619 : #endif
620 : #endif
621 : #ifdef HAVE_SPARC64_SSE
622 : #ifdef DOUBLE_PRECISION_REAL
623 : h1 = _mm_set_pd(hh[i-5], hh[i-5]);
624 : #endif
625 : #ifdef SINGLE_PRECISION_REAL
626 : h1 = _mm_set_ps(hh[i-5], hh[i-5]);
627 : #endif
628 : #endif
629 :
630 225689600 : q1 = _SSE_LOAD(&q[i*ldq]);
631 225689600 : q2 = _SSE_LOAD(&q[(i*ldq)+offset]);
632 :
633 225689600 : x1 = _SSE_ADD(x1, _SSE_MUL(q1,h1));
634 225689600 : x2 = _SSE_ADD(x2, _SSE_MUL(q2,h1));
635 :
636 : #ifdef HAVE_SSE_INTRINSICS
637 : #ifdef DOUBLE_PRECISION_REAL
638 190054400 : h2 = _mm_set1_pd(hh[ldh+i-4]);
639 : #endif
640 : #ifdef SINGLE_PRECISION_REAL
641 35635200 : h2 = _mm_set1_ps(hh[ldh+i-4]);
642 : #endif
643 : #endif
644 :
645 : #ifdef HAVE_SPARC64_SSE
646 : #ifdef DOUBLE_PRECISION_REAL
647 : h2 = _mm_set_pd(hh[ldh+i-4], hh[ldh+i-4]);
648 : #endif
649 : #ifdef SINGLE_PRECISION_REAL
650 : h2 = _mm_set_ps(hh[ldh+i-4], hh[ldh+i-4]);
651 : #endif
652 : #endif
653 :
654 225689600 : y1 = _SSE_ADD(y1, _SSE_MUL(q1,h2));
655 225689600 : y2 = _SSE_ADD(y2, _SSE_MUL(q2,h2));
656 :
657 : #ifdef HAVE_SSE_INTRINSICS
658 : #ifdef DOUBLE_PRECISION_REAL
659 190054400 : h3 = _mm_set1_pd(hh[(ldh*2)+i-3]);
660 : #endif
661 : #ifdef SINGLE_PRECISION_REAL
662 35635200 : h3 = _mm_set1_ps(hh[(ldh*2)+i-3]);
663 : #endif
664 : #endif
665 : #ifdef HAVE_SPARC64_SSE
666 : #ifdef DOUBLE_PRECISION_REAL
667 : h3 = _mm_set_pd(hh[(ldh*2)+i-3], hh[(ldh*2)+i-3]);
668 : #endif
669 : #ifdef SINGLE_PRECISION_REAL
670 : h3 = _mm_set_ps(hh[(ldh*2)+i-3], hh[(ldh*2)+i-3]);
671 : #endif
672 : #endif
673 :
674 225689600 : z1 = _SSE_ADD(z1, _SSE_MUL(q1,h3));
675 225689600 : z2 = _SSE_ADD(z2, _SSE_MUL(q2,h3));
676 : #ifdef HAVE_SSE_INTRINSICS
677 : #ifdef DOUBLE_PRECISION_REAL
678 190054400 : h4 = _mm_set1_pd(hh[(ldh*3)+i-2]);
679 : #endif
680 : #ifdef SINGLE_PRECISION_REAL
681 35635200 : h4 = _mm_set1_ps(hh[(ldh*3)+i-2]);
682 : #endif
683 : #endif
684 : #ifdef HAVE_SPARC64_SSE
685 : #ifdef DOUBLE_PRECISION_REAL
686 : h4 = _mm_set_pd(hh[(ldh*3)+i-2], hh[(ldh*3)+i-2]);
687 : #endif
688 : #ifdef SINGLE_PRECISION_REAL
689 : h4 = _mm_set_ps(hh[(ldh*3)+i-2], hh[(ldh*3)+i-2]);
690 : #endif
691 : #endif
692 :
693 225689600 : w1 = _SSE_ADD(w1, _SSE_MUL(q1,h4));
694 225689600 : w2 = _SSE_ADD(w2, _SSE_MUL(q2,h4));
695 :
696 : #ifdef HAVE_SSE_INTRINSICS
697 : #ifdef DOUBLE_PRECISION_REAL
698 190054400 : h5 = _mm_set1_pd(hh[(ldh*4)+i-1]);
699 : #endif
700 : #ifdef SINGLE_PRECISION_REAL
701 35635200 : h5 = _mm_set1_ps(hh[(ldh*4)+i-1]);
702 : #endif
703 : #endif
704 : #ifdef HAVE_SPARC64_SSE
705 : #ifdef DOUBLE_PRECISION_REAL
706 : h5 = _mm_set_pd(hh[(ldh*4)+i-1], hh[(ldh*4)+i-1]);
707 : #endif
708 : #ifdef SINGLE_PRECISION_REAL
709 : h5 = _mm_set_ps(hh[(ldh*4)+i-1], hh[(ldh*4)+i-1]);
710 : #endif
711 : #endif
712 :
713 225689600 : v1 = _SSE_ADD(v1, _SSE_MUL(q1,h5));
714 225689600 : v2 = _SSE_ADD(v2, _SSE_MUL(q2,h5));
715 :
716 : #ifdef HAVE_SSE_INTRINSICS
717 : #ifdef DOUBLE_PRECISION_REAL
718 190054400 : h6 = _mm_set1_pd(hh[(ldh*5)+i]);
719 : #endif
720 : #ifdef SINGLE_PRECISION_REAL
721 35635200 : h6 = _mm_set1_ps(hh[(ldh*5)+i]);
722 : #endif
723 : #endif
724 :
725 : #ifdef HAVE_SPARC64_SSE
726 : #ifdef DOUBLE_PRECISION_REAL
727 : h6 = _mm_set_pd(hh[(ldh*5)+i], hh[(ldh*5)+i]);
728 : #endif
729 : #ifdef SINGLE_PRECISION_REAL
730 : h6 = _mm_set_ps(hh[(ldh*5)+i], hh[(ldh*5)+i]);
731 : #endif
732 : #endif
733 :
734 225689600 : t1 = _SSE_ADD(t1, _SSE_MUL(q1,h6));
735 225689600 : t2 = _SSE_ADD(t2, _SSE_MUL(q2,h6));
736 : }
737 :
738 : #ifdef HAVE_SSE_INTRINSICS
739 : #ifdef DOUBLE_PRECISION_REAL
740 3276800 : h1 = _mm_set1_pd(hh[nb-5]);
741 : #endif
742 : #ifdef SINGLE_PRECISION_REAL
743 614400 : h1 = _mm_set1_ps(hh[nb-5] );
744 : #endif
745 : #endif
746 :
747 : #ifdef HAVE_SPARC64_SSE
748 : #ifdef DOUBLE_PRECISION_REAL
749 : h1 = _mm_set_pd(hh[nb-5], hh[nb-5]);
750 : #endif
751 : #ifdef SINGLE_PRECISION_REAL
752 : h1 = _mm_set_ps(hh[nb-5], hh[nb-5]);
753 : #endif
754 : #endif
755 :
756 3891200 : q1 = _SSE_LOAD(&q[nb*ldq]);
757 3891200 : q2 = _SSE_LOAD(&q[(nb*ldq)+offset]);
758 :
759 3891200 : x1 = _SSE_ADD(x1, _SSE_MUL(q1,h1));
760 3891200 : x2 = _SSE_ADD(x2, _SSE_MUL(q2,h1));
761 :
762 : #ifdef HAVE_SSE_INTRINSICS
763 : #ifdef DOUBLE_PRECISION_REAL
764 3276800 : h2 = _mm_set1_pd(hh[ldh+nb-4]);
765 : #endif
766 : #ifdef SINGLE_PRECISION_REAL
767 614400 : h2 = _mm_set1_ps(hh[ldh+nb-4]);
768 : #endif
769 : #endif
770 :
771 : #ifdef HAVE_SPARC64_SSE
772 : #ifdef DOUBLE_PRECISION_REAL
773 : h2 = _mm_set_pd(hh[ldh+nb-4], hh[ldh+nb-4]);
774 : #endif
775 : #ifdef SINGLE_PRECISION_REAL
776 : h2 = _mm_set_ps(hh[ldh+nb-4], hh[ldh+nb-4]);
777 : #endif
778 : #endif
779 :
780 :
781 3891200 : y1 = _SSE_ADD(y1, _SSE_MUL(q1,h2));
782 3891200 : y2 = _SSE_ADD(y2, _SSE_MUL(q2,h2));
783 :
784 : #ifdef HAVE_SSE_INTRINSICS
785 : #ifdef DOUBLE_PRECISION_REAL
786 3276800 : h3 = _mm_set1_pd(hh[(ldh*2)+nb-3]);
787 : #endif
788 : #ifdef SINGLE_PRECISION_REAL
789 614400 : h3 = _mm_set1_ps(hh[(ldh*2)+nb-3]);
790 : #endif
791 : #endif
792 :
793 : #ifdef HAVE_SPARC64_SSE
794 : #ifdef DOUBLE_PRECISION_REAL
795 : h3 = _mm_set_pd(hh[(ldh*2)+nb-3], hh[(ldh*2)+nb-3];
796 : #endif
797 : #ifdef SINGLE_PRECISION_REAL
798 : h3 = _mm_set_ps(hh[(ldh*2)+nb-3], hh[(ldh*2)+nb-3];
799 : #endif
800 : #endif
801 :
802 :
803 3891200 : z1 = _SSE_ADD(z1, _SSE_MUL(q1,h3));
804 3891200 : z2 = _SSE_ADD(z2, _SSE_MUL(q2,h3));
805 :
806 : #ifdef HAVE_SSE_INTRINSICS
807 : #ifdef DOUBLE_PRECISION_REAL
808 3276800 : h4 = _mm_set1_pd(hh[(ldh*3)+nb-2]);
809 : #endif
810 : #ifdef SINGLE_PRECISION_REAL
811 614400 : h4 = _mm_set1_ps(hh[(ldh*3)+nb-2]);
812 : #endif
813 : #endif
814 :
815 : #ifdef HAVE_SPARC64_SSE
816 : #ifdef DOUBLE_PRECISION_REAL
817 : h4 = _mm_set_pd(hh[(ldh*3)+nb-2], hh[(ldh*3)+nb-2]);
818 : #endif
819 : #ifdef SINGLE_PRECISION_REAL
820 : h4 = _mm_set_ps(hh[(ldh*3)+nb-2], hh[(ldh*3)+nb-2]);
821 : #endif
822 : #endif
823 :
824 3891200 : w1 = _SSE_ADD(w1, _SSE_MUL(q1,h4));
825 3891200 : w2 = _SSE_ADD(w2, _SSE_MUL(q2,h4));
826 :
827 : #ifdef HAVE_SSE_INTRINSICS
828 : #ifdef DOUBLE_PRECISION_REAL
829 3276800 : h5 = _mm_set1_pd(hh[(ldh*4)+nb-1]);
830 : #endif
831 : #ifdef SINGLE_PRECISION_REAL
832 614400 : h5 = _mm_set1_ps(hh[(ldh*4)+nb-1]);
833 : #endif
834 : #endif
835 :
836 : #ifdef HAVE_SPARC64_SSE
837 : #ifdef DOUBLE_PRECISION_REAL
838 : h5 = _mm_set_pd(hh[(ldh*4)+nb-1], hh[(ldh*4)+nb-1]);
839 : #endif
840 : #ifdef SINGLE_PRECISION_REAL
841 : h5 = _mm_set_ps(hh[(ldh*4)+nb-1], hh[(ldh*4)+nb-1]);
842 : #endif
843 : #endif
844 :
845 :
846 :
847 3891200 : v1 = _SSE_ADD(v1, _SSE_MUL(q1,h5));
848 3891200 : v2 = _SSE_ADD(v2, _SSE_MUL(q2,h5));
849 : #ifdef HAVE_SSE_INTRINSICS
850 : #ifdef DOUBLE_PRECISION_REAL
851 3276800 : h1 = _mm_set1_pd(hh[nb-4]);
852 : #endif
853 : #ifdef SINGLE_PRECISION_REAL
854 614400 : h1 = _mm_set1_ps(hh[nb-4]);
855 : #endif
856 : #endif
857 : #ifdef HAVE_SPARC64_SSE
858 : #ifdef DOUBLE_PRECISION_REAL
859 : h1 = _mm_set_pd(hh[nb-4]), hh[nb-4];
860 : #endif
861 : #ifdef SINGLE_PRECISION_REAL
862 : h1 = _mm_set_ps(hh[nb-4], hh[nb-4]);
863 : #endif
864 : #endif
865 :
866 3891200 : q1 = _SSE_LOAD(&q[(nb+1)*ldq]);
867 3891200 : q2 = _SSE_LOAD(&q[((nb+1)*ldq)+offset]);
868 :
869 3891200 : x1 = _SSE_ADD(x1, _SSE_MUL(q1,h1));
870 3891200 : x2 = _SSE_ADD(x2, _SSE_MUL(q2,h1));
871 : #ifdef HAVE_SSE_INTRINSICS
872 : #ifdef DOUBLE_PRECISION_REAL
873 3276800 : h2 = _mm_set1_pd(hh[ldh+nb-3]);
874 : #endif
875 : #ifdef SINGLE_PRECISION_REAL
876 614400 : h2 = _mm_set1_ps(hh[ldh+nb-3]);
877 : #endif
878 : #endif
879 : #ifdef HAVE_SPARC64_SSE
880 : #ifdef DOUBLE_PRECISION_REAL
881 : h2 = _mm_set_pd(hh[ldh+nb-3], hh[ldh+nb-3]);
882 : #endif
883 : #ifdef SINGLE_PRECISION_REAL
884 : h2 = _mm_set_ps(hh[ldh+nb-3], hh[ldh+nb-3]);
885 : #endif
886 : #endif
887 :
888 3891200 : y1 = _SSE_ADD(y1, _SSE_MUL(q1,h2));
889 3891200 : y2 = _SSE_ADD(y2, _SSE_MUL(q2,h2));
890 :
891 : #ifdef HAVE_SSE_INTRINSICS
892 : #ifdef DOUBLE_PRECISION
893 3276800 : h3 = _mm_set1_pd(hh[(ldh*2)+nb-2]);
894 : #endif
895 : #ifdef SINGLE_PRECISION_REAL
896 614400 : h3 = _mm_set1_ps(hh[(ldh*2)+nb-2]);
897 : #endif
898 : #endif
899 : #ifdef HAVE_SPARC64_SSE
900 : #ifdef DOUBLE_PRECISION
901 : h3 = _mm_set_pd(hh[(ldh*2)+nb-2], hh[(ldh*2)+nb-2]);
902 : #endif
903 : #ifdef SINGLE_PRECISION_REAL
904 : h3 = _mm_set_ps(hh[(ldh*2)+nb-2], hh[(ldh*2)+nb-2]);
905 : #endif
906 : #endif
907 :
908 3891200 : z1 = _SSE_ADD(z1, _SSE_MUL(q1,h3));
909 3891200 : z2 = _SSE_ADD(z2, _SSE_MUL(q2,h3));
910 :
911 : #ifdef HAVE_SSE_INTRINSICS
912 : #ifdef DOUBLE_PRECISION_REAL
913 3276800 : h4 = _mm_set1_pd(hh[(ldh*3)+nb-1]);
914 : #endif
915 : #ifdef SINGLE_PRECISION_REAL
916 614400 : h4 = _mm_set1_ps(hh[(ldh*3)+nb-1]);
917 : #endif
918 : #endif
919 : #ifdef HAVE_SPARC64_SSE
920 : #ifdef DOUBLE_PRECISION_REAL
921 : h4 = _mm_set_pd(hh[(ldh*3)+nb-1], hh[(ldh*3)+nb-1]);
922 : #endif
923 : #ifdef SINGLE_PRECISION_REAL
924 : h4 = _mm_set_ps(hh[(ldh*3)+nb-1], hh[(ldh*3)+nb-1]);
925 : #endif
926 : #endif
927 :
928 :
929 3891200 : w1 = _SSE_ADD(w1, _SSE_MUL(q1,h4));
930 3891200 : w2 = _SSE_ADD(w2, _SSE_MUL(q2,h4));
931 :
932 : #ifdef HAVE_SSE_INTRINSICS
933 : #ifdef DOUBLE_PRECISION_REAL
934 3276800 : h1 = _mm_set1_pd(hh[nb-3]);
935 : #endif
936 : #ifdef SINGLE_PRECISION_REAL
937 614400 : h1 = _mm_set1_ps(hh[nb-3]);
938 : #endif
939 : #endif
940 : #ifdef HAVE_SPARC64_SSE
941 : #ifdef DOUBLE_PRECISION_REAL
942 : h1 = _mm_set_pd(hh[nb-3], hh[nb-3]);
943 : #endif
944 : #ifdef SINGLE_PRECISION_REAL
945 : h1 = _mm_set_ps(hh[nb-3], hh[nb-3]);
946 : #endif
947 : #endif
948 :
949 :
950 3891200 : q1 = _SSE_LOAD(&q[(nb+2)*ldq]);
951 3891200 : q2 = _SSE_LOAD(&q[((nb+2)*ldq)+offset]);
952 :
953 3891200 : x1 = _SSE_ADD(x1, _SSE_MUL(q1,h1));
954 3891200 : x2 = _SSE_ADD(x2, _SSE_MUL(q2,h1));
955 :
956 : #ifdef HAVE_SSE_INTRINSICS
957 : #ifdef DOUBLE_PRECISION_REAL
958 3276800 : h2 = _mm_set1_pd(hh[ldh+nb-2]);
959 : #endif
960 : #ifdef SINGLE_PRECISION_REAL
961 614400 : h2 = _mm_set1_ps(hh[ldh+nb-2]);
962 : #endif
963 : #endif
964 :
965 : #ifdef HAVE_SPARC64_SSE
966 : #ifdef DOUBLE_PRECISION_REAL
967 : h2 = _mm_set_pd(hh[ldh+nb-2], hh[ldh+nb-2]);
968 : #endif
969 : #ifdef SINGLE_PRECISION_REAL
970 : h2 = _mm_set_ps(hh[ldh+nb-2], hh[ldh+nb-2]);
971 : #endif
972 : #endif
973 :
974 3891200 : y1 = _SSE_ADD(y1, _SSE_MUL(q1,h2));
975 3891200 : y2 = _SSE_ADD(y2, _SSE_MUL(q2,h2));
976 : #ifdef HAVE_SSE_INTRINSICS
977 : #ifdef DOUBLE_PRECISION_REAL
978 3276800 : h3 = _mm_set1_pd(hh[(ldh*2)+nb-1]);
979 : #endif
980 : #ifdef SINGLE_PRECISION_REAL
981 614400 : h3 = _mm_set1_ps(hh[(ldh*2)+nb-1]);
982 : #endif
983 : #endif
984 :
985 : #ifdef HAVE_SPARC64_SSE
986 : #ifdef DOUBLE_PRECISION_REAL
987 : h3 = _mm_set_pd(hh[(ldh*2)+nb-1], hh[(ldh*2)+nb-1]);
988 : #endif
989 : #ifdef SINGLE_PRECISION_REAL
990 : h3 = _mm_set_ps(hh[(ldh*2)+nb-1], hh[(ldh*2)+nb-1]);
991 : #endif
992 : #endif
993 :
994 3891200 : z1 = _SSE_ADD(z1, _SSE_MUL(q1,h3));
995 3891200 : z2 = _SSE_ADD(z2, _SSE_MUL(q2,h3));
996 : #ifdef HAVE_SSE_INTRINSICS
997 : #ifdef DOUBLE_PRECISION_REAL
998 3276800 : h1 = _mm_set1_pd(hh[nb-2]);
999 : #endif
1000 : #ifdef SINGLE_PRECISION_REAL
1001 614400 : h1 = _mm_set1_ps(hh[nb-2]);
1002 : #endif
1003 : #endif
1004 :
1005 : #ifdef HAVE_SPARC64_SSE
1006 : #ifdef DOUBLE_PRECISION_REAL
1007 : h1 = _mm_set_pd(hh[nb-2], hh[nb-2]);
1008 : #endif
1009 : #ifdef SINGLE_PRECISION_REAL
1010 : h1 = _mm_set_ps(hh[nb-2], hh[nb-2]);
1011 : #endif
1012 : #endif
1013 :
1014 3891200 : q1 = _SSE_LOAD(&q[(nb+3)*ldq]);
1015 3891200 : q2 = _SSE_LOAD(&q[((nb+3)*ldq)+offset]);
1016 :
1017 3891200 : x1 = _SSE_ADD(x1, _SSE_MUL(q1,h1));
1018 3891200 : x2 = _SSE_ADD(x2, _SSE_MUL(q2,h1));
1019 :
1020 : #ifdef HAVE_SSE_INTRINSICS
1021 : #ifdef DOUBLE_PRECISION_REAL
1022 3276800 : h2 = _mm_set1_pd(hh[ldh+nb-1]);
1023 : #endif
1024 : #ifdef SINGLE_PRECISION_REAL
1025 614400 : h2 = _mm_set1_ps(hh[ldh+nb-1]);
1026 : #endif
1027 : #endif
1028 :
1029 : #ifdef HAVE_SPARC64_SSE
1030 : #ifdef DOUBLE_PRECISION_REAL
1031 : h2 = _mm_set_pd(hh[ldh+nb-1], hh[ldh+nb-1]);
1032 : #endif
1033 : #ifdef SINGLE_PRECISION_REAL
1034 : h2 = _mm_set_ps(hh[ldh+nb-1], hh[ldh+nb-1]);
1035 : #endif
1036 : #endif
1037 :
1038 3891200 : y1 = _SSE_ADD(y1, _SSE_MUL(q1,h2));
1039 3891200 : y2 = _SSE_ADD(y2, _SSE_MUL(q2,h2));
1040 :
1041 : #ifdef HAVE_SSE_INTRINSICS
1042 : #ifdef DOUBLE_PRECISION_REAL
1043 3276800 : h1 = _mm_set1_pd(hh[nb-1]);
1044 : #endif
1045 : #ifdef SINGLE_PRECISION_REAL
1046 614400 : h1 = _mm_set1_ps(hh[nb-1]);
1047 : #endif
1048 : #endif
1049 :
1050 : #ifdef HAVE_SPARC64_SSE
1051 : #ifdef DOUBLE_PRECISION_REAL
1052 : h1 = _mm_set_pd(hh[nb-1], hh[nb-1]);
1053 : #endif
1054 : #ifdef SINGLE_PRECISION_REAL
1055 : h1 = _mm_set_ps(hh[nb-1], hh[nb-1]);
1056 : #endif
1057 : #endif
1058 :
1059 3891200 : q1 = _SSE_LOAD(&q[(nb+4)*ldq]);
1060 3891200 : q2 = _SSE_LOAD(&q[((nb+4)*ldq)+offset]);
1061 :
1062 3891200 : x1 = _SSE_ADD(x1, _SSE_MUL(q1,h1));
1063 3891200 : x2 = _SSE_ADD(x2, _SSE_MUL(q2,h1));
1064 :
1065 : /////////////////////////////////////////////////////
1066 : // Apply tau, correct wrong calculation using pre-calculated scalar products
1067 : /////////////////////////////////////////////////////
1068 :
1069 : #ifdef DOUBLE_PRECISION_REAL
1070 : #ifdef HAVE_SSE_INTRINSICS
1071 3276800 : __SSE_DATATYPE tau1 = _mm_set1_pd(hh[0]);
1072 : #endif
1073 : #ifdef HAVE_SPARC64_SSE
1074 : __SSE_DATATYPE tau1 = _mm_set_pd(hh[0], hh[0]);
1075 : #endif
1076 1638400 : x1 = _SSE_MUL(x1, tau1);
1077 1638400 : x2 = _SSE_MUL(x2, tau1);
1078 :
1079 : #ifdef HAVE_SSE_INTRINSICS
1080 3276800 : __SSE_DATATYPE tau2 = _mm_set1_pd(hh[ldh]);
1081 3276800 : __SSE_DATATYPE vs_1_2 = _mm_set1_pd(scalarprods[0]);
1082 : #endif
1083 : #ifdef HAVE_SPARC64_SSE
1084 : __SSE_DATATYPE tau2 = _mm_set_pd(hh[ldh], hh[ldh]);
1085 : __SSE_DATATYPE vs_1_2 = _mm_set_pd(scalarprods[0], scalarprods[0]);
1086 : #endif
1087 :
1088 1638400 : h2 = _SSE_MUL(tau2, vs_1_2);
1089 : #endif
1090 : #ifdef SINGLE_PRECISION_REAL
1091 : #ifdef HAVE_SSE_INTRINSICS
1092 614400 : __SSE_DATATYPE tau1 = _mm_set1_ps(hh[0]);
1093 : #endif
1094 : #ifdef HAVE_SPARC64_SSE
1095 : __SSE_DATATYPE tau1 = _mm_set_ps(hh[0], hh[0]);
1096 : #endif
1097 :
1098 307200 : x1 = _SSE_MUL(x1, tau1);
1099 307200 : x2 = _SSE_MUL(x2, tau1);
1100 :
1101 : #ifdef HAVE_SSE_INTRINSICS
1102 614400 : __SSE_DATATYPE tau2 = _mm_set1_ps(hh[ldh]);
1103 614400 : __SSE_DATATYPE vs_1_2 = _mm_set1_ps(scalarprods[0]);
1104 : #endif
1105 :
1106 : #ifdef HAVE_SPARC64_SSE
1107 : __SSE_DATATYPE tau2 = _mm_set_ps(hh[ldh], hh[ldh]);
1108 : __SSE_DATATYPE vs_1_2 = _mm_set_ps(scalarprods[0], scalarprods[0]);
1109 : #endif
1110 :
1111 307200 : h2 = _SSE_MUL(tau2, vs_1_2);
1112 : #endif
1113 :
1114 5836800 : y1 = _SSE_SUB(_SSE_MUL(y1,tau2), _SSE_MUL(x1,h2));
1115 5836800 : y2 = _SSE_SUB(_SSE_MUL(y2,tau2), _SSE_MUL(x2,h2));
1116 :
1117 : #ifdef DOUBLE_PRECISION_REAL
1118 : #ifdef HAVE_SSE_INTRINSICS
1119 3276800 : __SSE_DATATYPE tau3 = _mm_set1_pd(hh[ldh*2]);
1120 3276800 : __SSE_DATATYPE vs_1_3 = _mm_set1_pd(scalarprods[1]);
1121 3276800 : __SSE_DATATYPE vs_2_3 = _mm_set1_pd(scalarprods[2]);
1122 : #endif
1123 : #ifdef HAVE_SPARC64_SSE
1124 : __SSE_DATATYPE tau3 = _mm_set_pd(hh[ldh*2], hh[ldh*2]);
1125 : __SSE_DATATYPE vs_1_3 = _mm_set_pd(scalarprods[1], scalarprods[1]);
1126 : __SSE_DATATYPE vs_2_3 = _mm_set_pd(scalarprods[2], scalarprods[2]) ;
1127 : #endif
1128 :
1129 1638400 : h2 = _SSE_MUL(tau3, vs_1_3);
1130 1638400 : h3 = _SSE_MUL(tau3, vs_2_3);
1131 : #endif
1132 : #ifdef SINGLE_PRECISION_REAL
1133 : #ifdef HAVE_SSE_INTRINSICS
1134 614400 : __SSE_DATATYPE tau3 = _mm_set1_ps(hh[ldh*2]);
1135 614400 : __SSE_DATATYPE vs_1_3 = _mm_set1_ps(scalarprods[1]);
1136 614400 : __SSE_DATATYPE vs_2_3 = _mm_set1_ps(scalarprods[2]);
1137 : #endif
1138 : #ifdef HAVE_SPARC64_SSE
1139 : __SSE_DATATYPE tau3 = _mm_set_ps(hh[ldh*2], hh[ldh*2]);
1140 : __SSE_DATATYPE vs_1_3 = _mm_set_ps(scalarprods[1], scalarprods[1]);
1141 : __SSE_DATATYPE vs_2_3 = _mm_set_ps(scalarprods[2], scalarprods[2]);
1142 : #endif
1143 :
1144 :
1145 307200 : h2 = _SSE_MUL(tau3, vs_1_3);
1146 307200 : h3 = _SSE_MUL(tau3, vs_2_3);
1147 : #endif
1148 :
1149 9728000 : z1 = _SSE_SUB(_SSE_MUL(z1,tau3), _SSE_ADD(_SSE_MUL(y1,h3), _SSE_MUL(x1,h2)));
1150 9728000 : z2 = _SSE_SUB(_SSE_MUL(z2,tau3), _SSE_ADD(_SSE_MUL(y2,h3), _SSE_MUL(x2,h2)));
1151 :
1152 : #ifdef DOUBLE_PRECISION_REAL
1153 : #ifdef HAVE_SSE_INTRINSICS
1154 3276800 : __SSE_DATATYPE tau4 = _mm_set1_pd(hh[ldh*3]);
1155 3276800 : __SSE_DATATYPE vs_1_4 = _mm_set1_pd(scalarprods[3]);
1156 3276800 : __SSE_DATATYPE vs_2_4 = _mm_set1_pd(scalarprods[4]);
1157 : #endif
1158 : #ifdef HAVE_SPARC64_SSE
1159 : __SSE_DATATYPE tau4 = _mm_set_pd(hh[ldh*3], hh[ldh*3]);
1160 : __SSE_DATATYPE vs_1_4 = _mm_set_pd(scalarprods[3], scalarprods[3]);
1161 : __SSE_DATATYPE vs_2_4 = _mm_set_pd(scalarprods[4], scalarprods[4]);
1162 : #endif
1163 :
1164 1638400 : h2 = _SSE_MUL(tau4, vs_1_4);
1165 1638400 : h3 = _SSE_MUL(tau4, vs_2_4);
1166 : #ifdef HAVE_SSE_INTRINSICS
1167 3276800 : __SSE_DATATYPE vs_3_4 = _mm_set1_pd(scalarprods[5]);
1168 : #endif
1169 : #ifdef HAVE_SPARC64_SSE
1170 : __SSE_DATATYPE vs_3_4 = _mm_set_pd(scalarprods[5], scalarprods[5]);
1171 : #endif
1172 :
1173 1638400 : h4 = _SSE_MUL(tau4, vs_3_4);
1174 : #endif
1175 : #ifdef SINGLE_PRECISION_REAL
1176 : #ifdef HAVE_SSE_INTRINSICS
1177 614400 : __SSE_DATATYPE tau4 = _mm_set1_ps(hh[ldh*3]);
1178 614400 : __SSE_DATATYPE vs_1_4 = _mm_set1_ps(scalarprods[3]);
1179 614400 : __SSE_DATATYPE vs_2_4 = _mm_set1_ps(scalarprods[4]);
1180 : #endif
1181 : #ifdef HAVE_SPARC64_SSE
1182 : __SSE_DATATYPE tau4 = _mm_set_ps(hh[ldh*3], hh[ldh*3]);
1183 : __SSE_DATATYPE vs_1_4 = _mm_set_ps(scalarprods[3], scalarprods[3]);
1184 : __SSE_DATATYPE vs_2_4 = _mm_set_ps(scalarprods[4], scalarprods[4]);
1185 : #endif
1186 :
1187 307200 : h2 = _SSE_MUL(tau4, vs_1_4);
1188 307200 : h3 = _SSE_MUL(tau4, vs_2_4);
1189 : #ifdef HAVE_SSE_INTRINSICS
1190 614400 : __SSE_DATATYPE vs_3_4 = _mm_set1_ps(scalarprods[5]);
1191 : #endif
1192 : #ifdef HAVE_SPARC64_SSE
1193 : __SSE_DATATYPE vs_3_4 = _mm_set_ps(scalarprods[5], scalarprods[5]);
1194 : #endif
1195 307200 : h4 = _SSE_MUL(tau4, vs_3_4);
1196 : #endif
1197 :
1198 13619200 : w1 = _SSE_SUB(_SSE_MUL(w1,tau4), _SSE_ADD(_SSE_MUL(z1,h4), _SSE_ADD(_SSE_MUL(y1,h3), _SSE_MUL(x1,h2))));
1199 13619200 : w2 = _SSE_SUB(_SSE_MUL(w2,tau4), _SSE_ADD(_SSE_MUL(z2,h4), _SSE_ADD(_SSE_MUL(y2,h3), _SSE_MUL(x2,h2))));
1200 :
1201 : #ifdef DOUBLE_PRECISION_REAL
1202 : #ifdef HAVE_SSE_INTRINSICS
1203 3276800 : __SSE_DATATYPE tau5 = _mm_set1_pd(hh[ldh*4]);
1204 3276800 : __SSE_DATATYPE vs_1_5 = _mm_set1_pd(scalarprods[6]);
1205 3276800 : __SSE_DATATYPE vs_2_5 = _mm_set1_pd(scalarprods[7]);
1206 : #endif
1207 : #ifdef HAVE_SPARC64_SSE
1208 : __SSE_DATATYPE tau5 = _mm_set_pd(hh[ldh*4], hh[ldh*4]);
1209 : __SSE_DATATYPE vs_1_5 = _mm_set_pd(scalarprods[6], scalarprods[6]);
1210 : __SSE_DATATYPE vs_2_5 = _mm_set_pd(scalarprods[7], scalarprods[7]);
1211 : #endif
1212 :
1213 1638400 : h2 = _SSE_MUL(tau5, vs_1_5);
1214 1638400 : h3 = _SSE_MUL(tau5, vs_2_5);
1215 : #ifdef HAVE_SSE_INTRINSICS
1216 3276800 : __SSE_DATATYPE vs_3_5 = _mm_set1_pd(scalarprods[8]);
1217 3276800 : __SSE_DATATYPE vs_4_5 = _mm_set1_pd(scalarprods[9]);
1218 : #endif
1219 : #ifdef HAVE_SPARC64_SSE
1220 : __SSE_DATATYPE vs_3_5 = _mm_set_pd(scalarprods[8], scalarprods[8]);
1221 : __SSE_DATATYPE vs_4_5 = _mm_set_pd(scalarprods[9], scalarprods[9]);
1222 : #endif
1223 :
1224 1638400 : h4 = _SSE_MUL(tau5, vs_3_5);
1225 1638400 : h5 = _SSE_MUL(tau5, vs_4_5);
1226 : #endif
1227 : #ifdef SINGLE_PRECISION_REAL
1228 : #ifdef HAVE_SSE_INTRINSICS
1229 614400 : __SSE_DATATYPE tau5 = _mm_set1_ps(hh[ldh*4]);
1230 614400 : __SSE_DATATYPE vs_1_5 = _mm_set1_ps(scalarprods[6]);
1231 614400 : __SSE_DATATYPE vs_2_5 = _mm_set1_ps(scalarprods[7]);
1232 : #endif
1233 : #ifdef HAVE_SPARC64_SSE
1234 : __SSE_DATATYPE tau5 = _mm_set_ps(hh[ldh*4], hh[ldh*4]);
1235 : __SSE_DATATYPE vs_1_5 = _mm_set_ps(scalarprods[6], scalarprods[6]);
1236 : __SSE_DATATYPE vs_2_5 = _mm_set_ps(scalarprods[7], scalarprods[7]);
1237 : #endif
1238 :
1239 307200 : h2 = _SSE_MUL(tau5, vs_1_5);
1240 307200 : h3 = _SSE_MUL(tau5, vs_2_5);
1241 : #ifdef HAVE_SSE_INTRINSICS
1242 614400 : __SSE_DATATYPE vs_3_5 = _mm_set1_ps(scalarprods[8]);
1243 614400 : __SSE_DATATYPE vs_4_5 = _mm_set1_ps(scalarprods[9]);
1244 : #endif
1245 : #ifdef HAVE_SPARC64_SSE
1246 : __SSE_DATATYPE vs_3_5 = _mm_set_ps(scalarprods[8], scalarprods[8]);
1247 : __SSE_DATATYPE vs_4_5 = _mm_set_ps(scalarprods[9], scalarprods[9]);
1248 : #endif
1249 :
1250 :
1251 307200 : h4 = _SSE_MUL(tau5, vs_3_5);
1252 307200 : h5 = _SSE_MUL(tau5, vs_4_5);
1253 : #endif
1254 :
1255 17510400 : v1 = _SSE_SUB(_SSE_MUL(v1,tau5), _SSE_ADD(_SSE_ADD(_SSE_MUL(w1,h5), _SSE_MUL(z1,h4)), _SSE_ADD(_SSE_MUL(y1,h3), _SSE_MUL(x1,h2))));
1256 17510400 : v2 = _SSE_SUB(_SSE_MUL(v2,tau5), _SSE_ADD(_SSE_ADD(_SSE_MUL(w2,h5), _SSE_MUL(z2,h4)), _SSE_ADD(_SSE_MUL(y2,h3), _SSE_MUL(x2,h2))));
1257 :
1258 : #ifdef DOUBLE_PRECISION_REAL
1259 : #ifdef HAVE_SSE_INTRINSICS
1260 3276800 : __SSE_DATATYPE tau6 = _mm_set1_pd(hh[ldh*5]);
1261 3276800 : __SSE_DATATYPE vs_1_6 = _mm_set1_pd(scalarprods[10]);
1262 3276800 : __SSE_DATATYPE vs_2_6 = _mm_set1_pd(scalarprods[11]);
1263 : #endif
1264 : #ifdef HAVE_SPARC64_SSE
1265 : __SSE_DATATYPE tau6 = _mm_set_pd(hh[ldh*5], hh[ldh*5]);
1266 : __SSE_DATATYPE vs_1_6 = _mm_set_pd(scalarprods[10], scalarprods[10]);
1267 : __SSE_DATATYPE vs_2_6 = _mm_set_pd(scalarprods[11], scalarprods[11]);
1268 : #endif
1269 :
1270 1638400 : h2 = _SSE_MUL(tau6, vs_1_6);
1271 1638400 : h3 = _SSE_MUL(tau6, vs_2_6);
1272 : #ifdef HAVE_SSE_INTRINSICS
1273 3276800 : __SSE_DATATYPE vs_3_6 = _mm_set1_pd(scalarprods[12]);
1274 3276800 : __SSE_DATATYPE vs_4_6 = _mm_set1_pd(scalarprods[13]);
1275 3276800 : __SSE_DATATYPE vs_5_6 = _mm_set1_pd(scalarprods[14]);
1276 : #endif
1277 : #ifdef HAVE_SPARC64_SSE_INTRINSICS
1278 : __SSE_DATATYPE vs_3_6 = _mm_set_pd(scalarprods[12], scalarprods[12]);
1279 : __SSE_DATATYPE vs_4_6 = _mm_set_pd(scalarprods[13], scalarprods[13]);
1280 : __SSE_DATATYPE vs_5_6 = _mm_set_pd(scalarprods[14], scalarprods[14]);
1281 : #endif
1282 :
1283 1638400 : h4 = _SSE_MUL(tau6, vs_3_6);
1284 1638400 : h5 = _SSE_MUL(tau6, vs_4_6);
1285 1638400 : h6 = _SSE_MUL(tau6, vs_5_6);
1286 : #endif
1287 : #ifdef SINGLE_PRECISION_REAL
1288 : #ifdef HAVE_SSE_INTRINSICS
1289 614400 : __SSE_DATATYPE tau6 = _mm_set1_ps(hh[ldh*5]);
1290 614400 : __SSE_DATATYPE vs_1_6 = _mm_set1_ps(scalarprods[10]);
1291 614400 : __SSE_DATATYPE vs_2_6 = _mm_set1_ps(scalarprods[11]);
1292 : #endif
1293 : #ifdef HAVE_SPARC64_SSE
1294 : __SSE_DATATYPE tau6 = _mm_set_ps(hh[ldh*5], hh[ldh*5]);
1295 : __SSE_DATATYPE vs_1_6 = _mm_set_ps(scalarprods[10], scalarprods[10]);
1296 : __SSE_DATATYPE vs_2_6 = _mm_set_ps(scalarprods[11], scalarprods[11]);
1297 : #endif
1298 :
1299 307200 : h2 = _SSE_MUL(tau6, vs_1_6);
1300 307200 : h3 = _SSE_MUL(tau6, vs_2_6);
1301 : #ifdef HAVE_SSE_INTRINSICS
1302 614400 : __SSE_DATATYPE vs_3_6 = _mm_set1_ps(scalarprods[12]);
1303 614400 : __SSE_DATATYPE vs_4_6 = _mm_set1_ps(scalarprods[13]);
1304 614400 : __SSE_DATATYPE vs_5_6 = _mm_set1_ps(scalarprods[14]);
1305 : #endif
1306 :
1307 : #ifdef HAVE_SPARC64_SSE_INTRINSICS
1308 : __SSE_DATATYPE vs_3_6 = _mm_set_ps(scalarprods[12], scalarprods[12]);
1309 : __SSE_DATATYPE vs_4_6 = _mm_set_ps(scalarprods[13], scalarprods[13]);
1310 : __SSE_DATATYPE vs_5_6 = _mm_set_ps(scalarprods[14], scalarprods[14]);
1311 : #endif
1312 :
1313 307200 : h4 = _SSE_MUL(tau6, vs_3_6);
1314 307200 : h5 = _SSE_MUL(tau6, vs_4_6);
1315 307200 : h6 = _SSE_MUL(tau6, vs_5_6);
1316 : #endif
1317 :
1318 21401600 : t1 = _SSE_SUB(_SSE_MUL(t1,tau6), _SSE_ADD( _SSE_MUL(v1,h6), _SSE_ADD(_SSE_ADD(_SSE_MUL(w1,h5), _SSE_MUL(z1,h4)), _SSE_ADD(_SSE_MUL(y1,h3), _SSE_MUL(x1,h2)))));
1319 21401600 : t2 = _SSE_SUB(_SSE_MUL(t2,tau6), _SSE_ADD( _SSE_MUL(v2,h6), _SSE_ADD(_SSE_ADD(_SSE_MUL(w2,h5), _SSE_MUL(z2,h4)), _SSE_ADD(_SSE_MUL(y2,h3), _SSE_MUL(x2,h2)))));
1320 :
1321 : /////////////////////////////////////////////////////
1322 : // Rank-1 update of Q [4 x nb+3]
1323 : /////////////////////////////////////////////////////
1324 :
1325 1945600 : q1 = _SSE_LOAD(&q[0]);
1326 3891200 : q2 = _SSE_LOAD(&q[offset]);
1327 1945600 : q1 = _SSE_SUB(q1, t1);
1328 1945600 : q2 = _SSE_SUB(q2, t2);
1329 : _SSE_STORE(&q[0],q1);
1330 1945600 : _SSE_STORE(&q[offset],q2);
1331 :
1332 : #ifdef HAVE_SSE_INTRINSICS
1333 : #ifdef DOUBLE_PRECISION_REAL
1334 3276800 : h6 = _mm_set1_pd(hh[(ldh*5)+1]);
1335 : #endif
1336 : #ifdef SINGLE_PRECISION_REAL
1337 614400 : h6 = _mm_set1_ps(hh[(ldh*5)+1]);
1338 : #endif
1339 : #endif
1340 : #ifdef HAVE_SPARC64_SSE
1341 : #ifdef DOUBLE_PRECISION_REAL
1342 : h6 = _mm_set_pd(hh[(ldh*5)+1], hh[(ldh*5)+1]);
1343 : #endif
1344 : #ifdef SINGLE_PRECISION_REAL
1345 : h6 = _mm_set_ps(hh[(ldh*5)+1], hh[(ldh*5)+1]);
1346 : #endif
1347 : #endif
1348 :
1349 3891200 : q1 = _SSE_LOAD(&q[ldq]);
1350 3891200 : q2 = _SSE_LOAD(&q[(ldq+offset)]);
1351 1945600 : q1 = _SSE_SUB(q1, v1);
1352 1945600 : q2 = _SSE_SUB(q2, v2);
1353 :
1354 3891200 : q1 = _SSE_SUB(q1, _SSE_MUL(t1, h6));
1355 3891200 : q2 = _SSE_SUB(q2, _SSE_MUL(t2, h6));
1356 :
1357 1945600 : _SSE_STORE(&q[ldq],q1);
1358 1945600 : _SSE_STORE(&q[(ldq+offset)],q2);
1359 : #ifdef HAVE_SSE_INTRINSICS
1360 : #ifdef DOUBLE_PRECISION_REAL
1361 3276800 : h5 = _mm_set1_pd(hh[(ldh*4)+1]);
1362 : #endif
1363 : #ifdef SINGLE_PRECISION_REAL
1364 614400 : h5 = _mm_set1_ps(hh[(ldh*4)+1]);
1365 : #endif
1366 : #endif
1367 : #ifdef HAVE_SPARC64_SSE
1368 : #ifdef DOUBLE_PRECISION_REAL
1369 : h5 = _mm_set_pd(hh[(ldh*4)+1], hh[(ldh*4)+1]);
1370 : #endif
1371 : #ifdef SINGLE_PRECISION_REAL
1372 : h5 = _mm_set_ps(hh[(ldh*4)+1], hh[(ldh*4)+1]);
1373 : #endif
1374 : #endif
1375 3891200 : q1 = _SSE_LOAD(&q[ldq*2]);
1376 3891200 : q2 = _SSE_LOAD(&q[(ldq*2)+offset]);
1377 1945600 : q1 = _SSE_SUB(q1, w1);
1378 1945600 : q2 = _SSE_SUB(q2, w2);
1379 3891200 : q1 = _SSE_SUB(q1, _SSE_MUL(v1, h5));
1380 3891200 : q2 = _SSE_SUB(q2, _SSE_MUL(v2, h5));
1381 : #ifdef HAVE_SSE_INTRINSICS
1382 : #ifdef DOUBLE_PRECISION_REAL
1383 3276800 : h6 = _mm_set1_pd(hh[(ldh*5)+2]);
1384 : #endif
1385 : #ifdef SINGLE_PRECISION_REAL
1386 614400 : h6 = _mm_set1_ps(hh[(ldh*5)+2]);
1387 : #endif
1388 : #endif
1389 : #ifdef HAVE_SPARC64_SSE
1390 : #ifdef DOUBLE_PRECISION_REAL
1391 : h6 = _mm_set_pd(hh[(ldh*5)+2], hh[(ldh*5)+2]);
1392 : #endif
1393 : #ifdef SINGLE_PRECISION_REAL
1394 : h6 = _mm_set_ps(hh[(ldh*5)+2], hh[(ldh*5)+2]);
1395 : #endif
1396 : #endif
1397 :
1398 :
1399 3891200 : q1 = _SSE_SUB(q1, _SSE_MUL(t1, h6));
1400 3891200 : q2 = _SSE_SUB(q2, _SSE_MUL(t2, h6));
1401 :
1402 1945600 : _SSE_STORE(&q[ldq*2],q1);
1403 1945600 : _SSE_STORE(&q[(ldq*2)+offset],q2);
1404 :
1405 : #ifdef HAVE_SSE_INTRINSICS
1406 : #ifdef DOUBLE_PRECISION_REAL
1407 3276800 : h4 = _mm_set1_pd(hh[(ldh*3)+1]);
1408 : #endif
1409 : #ifdef SINGLE_PRECISION_REAL
1410 614400 : h4 = _mm_set1_ps(hh[(ldh*3)+1]);
1411 : #endif
1412 : #endif
1413 :
1414 : #ifdef HAVE_SPARC64_SSE
1415 : #ifdef DOUBLE_PRECISION_REAL
1416 : h4 = _mm_set_pd(hh[(ldh*3)+1], hh[(ldh*3)+1]);
1417 : #endif
1418 : #ifdef SINGLE_PRECISION_REAL
1419 : h4 = _mm_set_ps(hh[(ldh*3)+1], hh[(ldh*3)+1]);
1420 : #endif
1421 : #endif
1422 :
1423 :
1424 :
1425 3891200 : q1 = _SSE_LOAD(&q[ldq*3]);
1426 3891200 : q2 = _SSE_LOAD(&q[(ldq*3)+offset]);
1427 1945600 : q1 = _SSE_SUB(q1, z1);
1428 1945600 : q2 = _SSE_SUB(q2, z2);
1429 :
1430 3891200 : q1 = _SSE_SUB(q1, _SSE_MUL(w1, h4));
1431 3891200 : q2 = _SSE_SUB(q2, _SSE_MUL(w2, h4));
1432 : #ifdef HAVE_SSE_INTRINSICS
1433 : #ifdef DOUBLE_PRECISION_REAL
1434 3276800 : h5 = _mm_set1_pd(hh[(ldh*4)+2]);
1435 : #endif
1436 : #ifdef SINGLE_PRECISION_REAL
1437 614400 : h5 = _mm_set1_ps(hh[(ldh*4)+2]);
1438 : #endif
1439 : #endif
1440 : #ifdef HAVE_SPARC64_SSE
1441 : #ifdef DOUBLE_PRECISION_REAL
1442 : h5 = _mm_set_pd(hh[(ldh*4)+2], hh[(ldh*4)+2]);
1443 : #endif
1444 : #ifdef SINGLE_PRECISION_REAL
1445 : h5 = _mm_set_ps(hh[(ldh*4)+2], hh[(ldh*4)+2]);
1446 : #endif
1447 : #endif
1448 :
1449 :
1450 3891200 : q1 = _SSE_SUB(q1, _SSE_MUL(v1, h5));
1451 3891200 : q2 = _SSE_SUB(q2, _SSE_MUL(v2, h5));
1452 : #ifdef HAVE_SSE_INTRINSICS
1453 : #ifdef DOUBLE_PRECISION_REAL
1454 3276800 : h6 = _mm_set1_pd(hh[(ldh*5)+3]);
1455 : #endif
1456 : #ifdef SINGLE_PRECISION_REAL
1457 614400 : h6 = _mm_set1_ps(hh[(ldh*5)+3]);
1458 : #endif
1459 : #endif
1460 : #ifdef HAVE_SPARC64_SSE
1461 : #ifdef DOUBLE_PRECISION_REAL
1462 : h6 = _mm_set_pd(hh[(ldh*5)+3], hh[(ldh*5)+3]);
1463 : #endif
1464 : #ifdef SINGLE_PRECISION_REAL
1465 : h6 = _mm_set_ps(hh[(ldh*5)+3], hh[(ldh*5)+3]);
1466 : #endif
1467 : #endif
1468 :
1469 :
1470 3891200 : q1 = _SSE_SUB(q1, _SSE_MUL(t1, h6));
1471 3891200 : q2 = _SSE_SUB(q2, _SSE_MUL(t2, h6));
1472 :
1473 1945600 : _SSE_STORE(&q[ldq*3],q1);
1474 1945600 : _SSE_STORE(&q[(ldq*3)+offset],q2);
1475 : #ifdef HAVE_SSE_INTRINSICS
1476 : #ifdef DOUBLE_PRECISION_REAL
1477 3276800 : h3 = _mm_set1_pd(hh[(ldh*2)+1]);
1478 : #endif
1479 : #ifdef SINGLE_PRECISION_REAL
1480 614400 : h3 = _mm_set1_ps(hh[(ldh*2)+1]);
1481 : #endif
1482 : #endif
1483 : #ifdef HAVE_SPARC64_SSE
1484 : #ifdef DOUBLE_PRECISION_REAL
1485 : h3 = _mm_set_pd(hh[(ldh*2)+1], hh[(ldh*2)+1]);
1486 : #endif
1487 : #ifdef SINGLE_PRECISION_REAL
1488 : h3 = _mm_set_ps(hh[(ldh*2)+1], hh[(ldh*2)+1]);
1489 : #endif
1490 : #endif
1491 3891200 : q1 = _SSE_LOAD(&q[ldq*4]);
1492 3891200 : q2 = _SSE_LOAD(&q[(ldq*4)+offset]);
1493 1945600 : q1 = _SSE_SUB(q1, y1);
1494 1945600 : q2 = _SSE_SUB(q2, y2);
1495 :
1496 3891200 : q1 = _SSE_SUB(q1, _SSE_MUL(z1, h3));
1497 3891200 : q2 = _SSE_SUB(q2, _SSE_MUL(z2, h3));
1498 : #ifdef HAVE_SSE_INTRINSICS
1499 : #ifdef DOUBLE_PRECISION_REAL
1500 3276800 : h4 = _mm_set1_pd(hh[(ldh*3)+2]);
1501 : #endif
1502 : #ifdef SINGLE_PRECISION_REAL
1503 614400 : h4 = _mm_set1_ps(hh[(ldh*3)+2]);
1504 : #endif
1505 : #endif
1506 : #ifdef HAVE_SPARC64_SSE
1507 : #ifdef DOUBLE_PRECISION_REAL
1508 : h4 = _mm_set_pd(hh[(ldh*3)+2], hh[(ldh*3)+2]);
1509 : #endif
1510 : #ifdef SINGLE_PRECISION_REAL
1511 : h4 = _mm_set_ps(hh[(ldh*3)+2], hh[(ldh*3)+2]);
1512 : #endif
1513 : #endif
1514 :
1515 :
1516 3891200 : q1 = _SSE_SUB(q1, _SSE_MUL(w1, h4));
1517 3891200 : q2 = _SSE_SUB(q2, _SSE_MUL(w2, h4));
1518 : #ifdef HAVE_SSE_INTRINSICS
1519 : #ifdef DOUBLE_PRECISION_REAL
1520 3276800 : h5 = _mm_set1_pd(hh[(ldh*4)+3]);
1521 : #endif
1522 : #ifdef SINGLE_PRECISION_REAL
1523 614400 : h5 = _mm_set1_ps(hh[(ldh*4)+3]);
1524 : #endif
1525 : #endif
1526 : #ifdef HAVE_SPARC64_SSE
1527 : #ifdef DOUBLE_PRECISION_REAL
1528 : h5 = _mm_set_pd(hh[(ldh*4)+3], hh[(ldh*4)+3]);
1529 : #endif
1530 : #ifdef SINGLE_PRECISION_REAL
1531 : h5 = _mm_set_ps(hh[(ldh*4)+3], hh[(ldh*4)+3]);
1532 : #endif
1533 : #endif
1534 3891200 : q1 = _SSE_SUB(q1, _SSE_MUL(v1, h5));
1535 3891200 : q2 = _SSE_SUB(q2, _SSE_MUL(v2, h5));
1536 : #ifdef HAVE_SSE_INTRINSICS
1537 : #ifdef DOUBLE_PRECISION_REAL
1538 3276800 : h6 = _mm_set1_pd(hh[(ldh*5)+4]);
1539 : #endif
1540 : #ifdef SINGLE_PRECISION_REAL
1541 614400 : h6 = _mm_set1_ps(hh[(ldh*5)+4]);
1542 : #endif
1543 : #endif
1544 : #ifdef HAVE_SPARC64_SSE
1545 : #ifdef DOUBLE_PRECISION_REAL
1546 : h6 = _mm_set_pd(hh[(ldh*5)+4], hh[(ldh*5)+4]);
1547 : #endif
1548 : #ifdef SINGLE_PRECISION_REAL
1549 : h6 = _mm_set_ps(hh[(ldh*5)+4], hh[(ldh*5)+4]);
1550 : #endif
1551 : #endif
1552 3891200 : q1 = _SSE_SUB(q1, _SSE_MUL(t1, h6));
1553 3891200 : q2 = _SSE_SUB(q2, _SSE_MUL(t2, h6));
1554 :
1555 1945600 : _SSE_STORE(&q[ldq*4],q1);
1556 1945600 : _SSE_STORE(&q[(ldq*4)+offset],q2);
1557 : #ifdef HAVE_SSE_INTRINSICS
1558 : #ifdef DOUBLE_PRECISION_REAL
1559 3276800 : h2 = _mm_set1_pd(hh[(ldh)+1]);
1560 : #endif
1561 : #ifdef SINGLE_PRECISION_REAL
1562 614400 : h2 = _mm_set1_ps(hh[(ldh)+1]);
1563 : #endif
1564 : #endif
1565 : #ifdef HAVE_SPARC64_SSE
1566 : #ifdef DOUBLE_PRECISION_REAL
1567 : h2 = _mm_set_pd(hh[(ldh)+1], hh[(ldh)+1]);
1568 : #endif
1569 : #ifdef SINGLE_PRECISION_REAL
1570 : h2 = _mm_set_ps(hh[(ldh)+1], hh[(ldh)+1]);
1571 : #endif
1572 : #endif
1573 3891200 : q1 = _SSE_LOAD(&q[ldq*5]);
1574 3891200 : q2 = _SSE_LOAD(&q[(ldq*5)+offset]);
1575 1945600 : q1 = _SSE_SUB(q1, x1);
1576 1945600 : q2 = _SSE_SUB(q2, x2);
1577 :
1578 3891200 : q1 = _SSE_SUB(q1, _SSE_MUL(y1, h2));
1579 3891200 : q2 = _SSE_SUB(q2, _SSE_MUL(y2, h2));
1580 : #ifdef HAVE_SSE_INTRINSICS
1581 : #ifdef DOUBLE_PRECISION_REAL
1582 3276800 : h3 = _mm_set1_pd(hh[(ldh*2)+2]);
1583 : #endif
1584 : #ifdef SINGLE_PRECISION_REAL
1585 614400 : h3 = _mm_set1_ps(hh[(ldh*2)+2]);
1586 : #endif
1587 : #endif
1588 : #ifdef HAVE_SPARC64_SSE
1589 : #ifdef DOUBLE_PRECISION_REAL
1590 : h3 = _mm_set_pd(hh[(ldh*2)+2], hh[(ldh*2)+2]);
1591 : #endif
1592 : #ifdef SINGLE_PRECISION_REAL
1593 : h3 = _mm_set_ps(hh[(ldh*2)+2], hh[(ldh*2)+2]);
1594 : #endif
1595 : #endif
1596 :
1597 3891200 : q1 = _SSE_SUB(q1, _SSE_MUL(z1, h3));
1598 3891200 : q2 = _SSE_SUB(q2, _SSE_MUL(z2, h3));
1599 : #ifdef HAVE_SSE_INTRINSICS
1600 : #ifdef DOUBLE_PRECISION_REAL
1601 3276800 : h4 = _mm_set1_pd(hh[(ldh*3)+3]);
1602 : #endif
1603 : #ifdef SINGLE_PRECISION_REAL
1604 614400 : h4 = _mm_set1_ps(hh[(ldh*3)+3]);
1605 : #endif
1606 : #endif
1607 : #ifdef HAVE_SPARC64_SSE
1608 : #ifdef DOUBLE_PRECISION_REAL
1609 : h4 = _mm_set_pd(hh[(ldh*3)+3], hh[(ldh*3)+3]);
1610 : #endif
1611 : #ifdef SINGLE_PRECISION_REAL
1612 : h4 = _mm_set_ps(hh[(ldh*3)+3], hh[(ldh*3)+3]);
1613 : #endif
1614 : #endif
1615 3891200 : q1 = _SSE_SUB(q1, _SSE_MUL(w1, h4));
1616 3891200 : q2 = _SSE_SUB(q2, _SSE_MUL(w2, h4));
1617 : #ifdef HAVE_SSE_INTRINSICS
1618 : #ifdef DOUBLE_PRECISION_REAL
1619 3276800 : h5 = _mm_set1_pd(hh[(ldh*4)+4]);
1620 : #endif
1621 : #ifdef SINGLE_PRECISION_REAL
1622 614400 : h5 = _mm_set1_ps(hh[(ldh*4)+4]);
1623 : #endif
1624 : #endif
1625 : #ifdef HAVE_SPARC64_SSE
1626 : #ifdef DOUBLE_PRECISION_REAL
1627 : h5 = _mm_set_pd(hh[(ldh*4)+4], hh[(ldh*4)+4]);
1628 : #endif
1629 : #ifdef SINGLE_PRECISION_REAL
1630 : h5 = _mm_set_ps(hh[(ldh*4)+4], hh[(ldh*4)+4]);
1631 : #endif
1632 : #endif
1633 :
1634 :
1635 3891200 : q1 = _SSE_SUB(q1, _SSE_MUL(v1, h5));
1636 3891200 : q2 = _SSE_SUB(q2, _SSE_MUL(v2, h5));
1637 : #ifdef HAVE_SSE_INTRINSICS
1638 : #ifdef DOUBLE_PRECISION_REAL
1639 3276800 : h6 = _mm_set1_pd(hh[(ldh*5)+5]);
1640 : #endif
1641 : #ifdef SINGLE_PRECISION_REAL
1642 614400 : h6 = _mm_set1_ps(hh[(ldh*5)+5]);
1643 : #endif
1644 : #endif
1645 : #ifdef HAVE_SPARC64_SSE
1646 : #ifdef DOUBLE_PRECISION_REAL
1647 : h6 = _mm_set1_pd(hh[(ldh*5)+5], hh[(ldh*5)+5]);
1648 : #endif
1649 : #ifdef SINGLE_PRECISION_REAL
1650 : h6 = _mm_set1_ps(hh[(ldh*5)+5], hh[(ldh*5)+5]);
1651 : #endif
1652 : #endif
1653 :
1654 3891200 : q1 = _SSE_SUB(q1, _SSE_MUL(t1, h6));
1655 3891200 : q2 = _SSE_SUB(q2, _SSE_MUL(t2, h6));
1656 :
1657 1945600 : _SSE_STORE(&q[ldq*5],q1);
1658 1945600 : _SSE_STORE(&q[(ldq*5)+offset],q2);
1659 :
1660 114790400 : for (i = 6; i < nb; i++)
1661 : {
1662 225689600 : q1 = _SSE_LOAD(&q[i*ldq]);
1663 225689600 : q2 = _SSE_LOAD(&q[(i*ldq)+offset]);
1664 : #ifdef HAVE_SSE_INTRINSICS
1665 : #ifdef DOUBLE_PRECISION_REAL
1666 190054400 : h1 = _mm_set1_pd(hh[i-5]);
1667 : #endif
1668 : #ifdef SINGLE_PRECISION_REAL
1669 35635200 : h1 = _mm_set1_ps(hh[i-5]);
1670 : #endif
1671 : #endif
1672 : #ifdef HAVE_SPARC64_SSE
1673 : #ifdef DOUBLE_PRECISION_REAL
1674 : h1 = _mm_set_pd(hh[i-5], hh[i-5]);
1675 : #endif
1676 : #ifdef SINGLE_PRECISION_REAL
1677 : h1 = _mm_set_ps(hh[i-5], hh[i-5]);
1678 : #endif
1679 : #endif
1680 :
1681 :
1682 225689600 : q1 = _SSE_SUB(q1, _SSE_MUL(x1, h1));
1683 225689600 : q2 = _SSE_SUB(q2, _SSE_MUL(x2, h1));
1684 : #ifdef HAVE_SSE_INTRINSICS
1685 : #ifdef DOUBLE_PRECISION_REAL
1686 190054400 : h2 = _mm_set1_pd(hh[ldh+i-4]);
1687 : #endif
1688 : #ifdef SINGLE_PRECISION_REAL
1689 35635200 : h2 = _mm_set1_ps(hh[ldh+i-4]);
1690 : #endif
1691 : #endif
1692 : #ifdef HAVE_SPARC64_SSE
1693 : #ifdef DOUBLE_PRECISION_REAL
1694 : h2 = _mm_set_pd(hh[ldh+i-4], hh[ldh+i-4]);
1695 : #endif
1696 : #ifdef SINGLE_PRECISION_REAL
1697 : h2 = _mm_set_ps(hh[ldh+i-4], hh[ldh+i-4]);
1698 : #endif
1699 : #endif
1700 :
1701 :
1702 225689600 : q1 = _SSE_SUB(q1, _SSE_MUL(y1, h2));
1703 225689600 : q2 = _SSE_SUB(q2, _SSE_MUL(y2, h2));
1704 : #ifdef HAVE_SSE_INTRINSICS
1705 : #ifdef DOUBLE_PRECISION_REAL
1706 190054400 : h3 = _mm_set1_pd(hh[(ldh*2)+i-3]);
1707 : #endif
1708 : #ifdef SINGLE_PRECISION_REAL
1709 35635200 : h3 = _mm_set1_ps(hh[(ldh*2)+i-3]);
1710 : #endif
1711 : #endif
1712 : #ifdef HAVE_SPARC64_SSE
1713 : #ifdef DOUBLE_PRECISION_REAL
1714 : h3 = _mm_set_pd(hh[(ldh*2)+i-3], hh[(ldh*2)+i-3]);
1715 : #endif
1716 : #ifdef SINGLE_PRECISION_REAL
1717 : h3 = _mm_set_ps(hh[(ldh*2)+i-3], hh[(ldh*2)+i-3]);
1718 : #endif
1719 : #endif
1720 225689600 : q1 = _SSE_SUB(q1, _SSE_MUL(z1, h3));
1721 225689600 : q2 = _SSE_SUB(q2, _SSE_MUL(z2, h3));
1722 : #ifdef HAVE_SSE_INTRINSICS
1723 : #ifdef DOUBLE_PRECISION_REAL
1724 190054400 : h4 = _mm_set1_pd(hh[(ldh*3)+i-2]);
1725 : #endif
1726 : #ifdef SINGLE_PRECISION_REAL
1727 35635200 : h4 = _mm_set1_ps(hh[(ldh*3)+i-2]);
1728 : #endif
1729 : #endif
1730 : #ifdef HAVE_SPARC64_SSE
1731 : #ifdef DOUBLE_PRECISION_REAL
1732 : h4 = _mm_set_pd(hh[(ldh*3)+i-2], hh[(ldh*3)+i-2]);
1733 : #endif
1734 : #ifdef SINGLE_PRECISION_REAL
1735 : h4 = _mm_set_ps(hh[(ldh*3)+i-2], hh[(ldh*3)+i-2]);
1736 : #endif
1737 : #endif
1738 225689600 : q1 = _SSE_SUB(q1, _SSE_MUL(w1, h4));
1739 225689600 : q2 = _SSE_SUB(q2, _SSE_MUL(w2, h4));
1740 : #ifdef HAVE_SSE_INTRINSICS
1741 : #ifdef DOUBLE_PRECISION_REAL
1742 190054400 : h5 = _mm_set1_pd(hh[(ldh*4)+i-1]);
1743 : #endif
1744 : #ifdef SINGLE_PRECISION_REAL
1745 35635200 : h5 = _mm_set1_ps(hh[(ldh*4)+i-1]);
1746 : #endif
1747 : #endif
1748 : #ifdef HAVE_SPARC64_SSE
1749 : #ifdef DOUBLE_PRECISION_REAL
1750 : h5 = _mm_set_pd(hh[(ldh*4)+i-1], hh[(ldh*4)+i-1]);
1751 : #endif
1752 : #ifdef SINGLE_PRECISION_REAL
1753 : h5 = _mm_set_ps(hh[(ldh*4)+i-1], hh[(ldh*4)+i-1]);
1754 : #endif
1755 : #endif
1756 :
1757 225689600 : q1 = _SSE_SUB(q1, _SSE_MUL(v1, h5));
1758 225689600 : q2 = _SSE_SUB(q2, _SSE_MUL(v2, h5));
1759 : #ifdef HAVE_SSE_INTRINSICS
1760 : #ifdef DOUBLE_PRECISION_REAL
1761 190054400 : h6 = _mm_set1_pd(hh[(ldh*5)+i]);
1762 : #endif
1763 : #ifdef SINGLE_PRECISION_REAL
1764 35635200 : h6 = _mm_set1_ps(hh[(ldh*5)+i]);
1765 : #endif
1766 : #endif
1767 : #ifdef HAVE_SPARC64_SSE
1768 : #ifdef DOUBLE_PRECISION_REAL
1769 : h6 = _mm_set_pd(hh[(ldh*5)+i], hh[(ldh*5)+i]);
1770 : #endif
1771 : #ifdef SINGLE_PRECISION_REAL
1772 : h6 = _mm_set_ps(hh[(ldh*5)+i], hh[(ldh*5)+i]);
1773 : #endif
1774 : #endif
1775 :
1776 :
1777 225689600 : q1 = _SSE_SUB(q1, _SSE_MUL(t1, h6));
1778 225689600 : q2 = _SSE_SUB(q2, _SSE_MUL(t2, h6));
1779 :
1780 112844800 : _SSE_STORE(&q[i*ldq],q1);
1781 112844800 : _SSE_STORE(&q[(i*ldq)+offset],q2);
1782 : }
1783 : #ifdef HAVE_SSE_INTRINSICS
1784 : #ifdef DOUBLE_PRECISION_REAL
1785 3276800 : h1 = _mm_set1_pd(hh[nb-5]);
1786 : #endif
1787 : #ifdef SINGLE_PRECISION_REAL
1788 614400 : h1 = _mm_set1_ps(hh[nb-5]);
1789 : #endif
1790 : #endif
1791 : #ifdef HAVE_SPARC64_SSE
1792 : #ifdef DOUBLE_PRECISION_REAL
1793 : h1 = _mm_set_pd(hh[nb-5], hh[nb-5]);
1794 : #endif
1795 : #ifdef SINGLE_PRECISION_REAL
1796 : h1 = _mm_set_ps(hh[nb-5], hh[nb-5]);
1797 : #endif
1798 : #endif
1799 :
1800 :
1801 3891200 : q1 = _SSE_LOAD(&q[nb*ldq]);
1802 3891200 : q2 = _SSE_LOAD(&q[(nb*ldq)+offset]);
1803 :
1804 3891200 : q1 = _SSE_SUB(q1, _SSE_MUL(x1, h1));
1805 3891200 : q2 = _SSE_SUB(q2, _SSE_MUL(x2, h1));
1806 : #ifdef HAVE_SSE_INTRINSICS
1807 : #ifdef DOUBLE_PRECISION_REAL
1808 3276800 : h2 = _mm_set1_pd(hh[ldh+nb-4]);
1809 : #endif
1810 : #ifdef SINGLE_PRECISION_REAL
1811 614400 : h2 = _mm_set1_ps(hh[ldh+nb-4]);
1812 : #endif
1813 : #endif
1814 : #ifdef HAVE_SPARC64_SSE
1815 : #ifdef DOUBLE_PRECISION_REAL
1816 : h2 = _mm_set_pd(hh[ldh+nb-4], hh[ldh+nb-4]);
1817 : #endif
1818 : #ifdef SINGLE_PRECISION_REAL
1819 : h2 = _mm_set_ps(hh[ldh+nb-4], hh[ldh+nb-4]);
1820 : #endif
1821 : #endif
1822 :
1823 :
1824 3891200 : q1 = _SSE_SUB(q1, _SSE_MUL(y1, h2));
1825 3891200 : q2 = _SSE_SUB(q2, _SSE_MUL(y2, h2));
1826 : #ifdef HAVE_SSE_INTRINSICS
1827 : #ifdef DOUBLE_PRECISION_REAL
1828 3276800 : h3 = _mm_set1_pd(hh[(ldh*2)+nb-3]);
1829 : #endif
1830 : #ifdef SINGLE_PRECISION_REAL
1831 614400 : h3 = _mm_set1_ps(hh[(ldh*2)+nb-3]);
1832 : #endif
1833 : #endif
1834 : #ifdef HAVE_SPARC64_SSE
1835 : #ifdef DOUBLE_PRECISION_REAL
1836 : h3 = _mm_set_pd(hh[(ldh*2)+nb-3], hh[(ldh*2)+nb-3]);
1837 : #endif
1838 : #ifdef SINGLE_PRECISION_REAL
1839 : h3 = _mm_set_ps(hh[(ldh*2)+nb-3], hh[(ldh*2)+nb-3]);
1840 : #endif
1841 : #endif
1842 :
1843 :
1844 3891200 : q1 = _SSE_SUB(q1, _SSE_MUL(z1, h3));
1845 3891200 : q2 = _SSE_SUB(q2, _SSE_MUL(z2, h3));
1846 : #ifdef HAVE_SSE_INTRINSICS
1847 : #ifdef DOUBLE_PRECISION_REAL
1848 3276800 : h4 = _mm_set1_pd(hh[(ldh*3)+nb-2]);
1849 : #endif
1850 : #ifdef SINGLE_PRECISION_REAL
1851 614400 : h4 = _mm_set1_ps(hh[(ldh*3)+nb-2]);
1852 : #endif
1853 : #endif
1854 : #ifdef HAVE_SPARC64_SSE
1855 : #ifdef DOUBLE_PRECISION_REAL
1856 : h4 = _mm_set_pd(hh[(ldh*3)+nb-2], hh[(ldh*3)+nb-2]);
1857 : #endif
1858 : #ifdef SINGLE_PRECISION_REAL
1859 : h4 = _mm_set_ps(hh[(ldh*3)+nb-2], hh[(ldh*3)+nb-2]);
1860 : #endif
1861 : #endif
1862 3891200 : q1 = _SSE_SUB(q1, _SSE_MUL(w1, h4));
1863 3891200 : q2 = _SSE_SUB(q2, _SSE_MUL(w2, h4));
1864 : #ifdef HAVE_SSE_INTRINSICS
1865 : #ifdef DOUBLE_PRECISION_REAL
1866 3276800 : h5 = _mm_set1_pd(hh[(ldh*4)+nb-1]);
1867 : #endif
1868 : #ifdef SINGLE_PRECISION_REAL
1869 614400 : h5 = _mm_set1_ps(hh[(ldh*4)+nb-1]);
1870 : #endif
1871 : #endif
1872 : #ifdef HAVE_SPARC64_SSE
1873 : #ifdef DOUBLE_PRECISION_REAL
1874 : h5 = _mm_set_pd(hh[(ldh*4)+nb-1], hh[(ldh*4)+nb-1]);
1875 : #endif
1876 : #ifdef SINGLE_PRECISION_REAL
1877 : h5 = _mm_set_ps(hh[(ldh*4)+nb-1], hh[(ldh*4)+nb-1]);
1878 : #endif
1879 : #endif
1880 :
1881 3891200 : q1 = _SSE_SUB(q1, _SSE_MUL(v1, h5));
1882 3891200 : q2 = _SSE_SUB(q2, _SSE_MUL(v2, h5));
1883 :
1884 1945600 : _SSE_STORE(&q[nb*ldq],q1);
1885 1945600 : _SSE_STORE(&q[(nb*ldq)+offset],q2);
1886 : #ifdef HAVE_SSE_INTRINSICS
1887 : #ifdef DOUBLE_PRECISION_REAL
1888 3276800 : h1 = _mm_set1_pd(hh[nb-4]);
1889 : #endif
1890 : #ifdef SINGLE_PRECISION_REAL
1891 614400 : h1 = _mm_set1_ps(hh[nb-4]);
1892 : #endif
1893 : #endif
1894 : #ifdef HAVE_SPARC64_SSE
1895 : #ifdef DOUBLE_PRECISION_REAL
1896 : h1 = _mm_set_pd(hh[nb-4], hh[nb-4]);
1897 : #endif
1898 : #ifdef SINGLE_PRECISION_REAL
1899 : h1 = _mm_set_ps(hh[nb-4], hh[nb-4]);
1900 : #endif
1901 : #endif
1902 :
1903 :
1904 3891200 : q1 = _SSE_LOAD(&q[(nb+1)*ldq]);
1905 3891200 : q2 = _SSE_LOAD(&q[((nb+1)*ldq)+offset]);
1906 :
1907 3891200 : q1 = _SSE_SUB(q1, _SSE_MUL(x1, h1));
1908 3891200 : q2 = _SSE_SUB(q2, _SSE_MUL(x2, h1));
1909 : #ifdef HAVE_SSE_INTRINSICS
1910 : #ifdef DOUBLE_PRECISION_REAL
1911 3276800 : h2 = _mm_set1_pd(hh[ldh+nb-3]);
1912 : #endif
1913 : #ifdef SINGLE_PRECISION_REAL
1914 614400 : h2 = _mm_set1_ps(hh[ldh+nb-3]);
1915 : #endif
1916 : #endif
1917 : #ifdef HAVE_SPARC64_SSE
1918 : #ifdef DOUBLE_PRECISION_REAL
1919 : h2 = _mm_set_pd(hh[ldh+nb-3], hh[ldh+nb-3]);
1920 : #endif
1921 : #ifdef SINGLE_PRECISION_REAL
1922 : h2 = _mm_set_ps(hh[ldh+nb-3], hh[ldh+nb-3]);
1923 : #endif
1924 : #endif
1925 :
1926 3891200 : q1 = _SSE_SUB(q1, _SSE_MUL(y1, h2));
1927 3891200 : q2 = _SSE_SUB(q2, _SSE_MUL(y2, h2));
1928 : #ifdef HAVE_SSE_INTRINSICS
1929 : #ifdef DOUBLE_PRECISION_REAL
1930 3276800 : h3 = _mm_set1_pd(hh[(ldh*2)+nb-2]);
1931 : #endif
1932 : #ifdef SINGLE_PRECISION_REAL
1933 614400 : h3 = _mm_set1_ps(hh[(ldh*2)+nb-2]);
1934 : #endif
1935 : #endif
1936 : #ifdef HAVE_SPARC64_SSE
1937 : #ifdef DOUBLE_PRECISION_REAL
1938 : h3 = _mm_set_pd(hh[(ldh*2)+nb-2], hh[(ldh*2)+nb-2]);
1939 : #endif
1940 : #ifdef SINGLE_PRECISION_REAL
1941 : h3 = _mm_set_ps(hh[(ldh*2)+nb-2], hh[(ldh*2)+nb-2]);
1942 : #endif
1943 : #endif
1944 3891200 : q1 = _SSE_SUB(q1, _SSE_MUL(z1, h3));
1945 3891200 : q2 = _SSE_SUB(q2, _SSE_MUL(z2, h3));
1946 : #ifdef HAVE_SSE_INTRINSICS
1947 : #ifdef DOUBLE_PRECISION_REAL
1948 3276800 : h4 = _mm_set1_pd(hh[(ldh*3)+nb-1]);
1949 : #endif
1950 : #ifdef SINGLE_PRECISION_REAL
1951 614400 : h4 = _mm_set1_ps(hh[(ldh*3)+nb-1]);
1952 : #endif
1953 : #endif
1954 : #ifdef HAVE_SPARC64_SSE
1955 : #ifdef DOUBLE_PRECISION_REAL
1956 : h4 = _mm_set_pd(hh[(ldh*3)+nb-1], hh[(ldh*3)+nb-1]);
1957 : #endif
1958 : #ifdef SINGLE_PRECISION_REAL
1959 : h4 = _mm_set_ps(hh[(ldh*3)+nb-1], hh[(ldh*3)+nb-1]);
1960 : #endif
1961 : #endif
1962 :
1963 3891200 : q1 = _SSE_SUB(q1, _SSE_MUL(w1, h4));
1964 3891200 : q2 = _SSE_SUB(q2, _SSE_MUL(w2, h4));
1965 :
1966 1945600 : _SSE_STORE(&q[(nb+1)*ldq],q1);
1967 1945600 : _SSE_STORE(&q[((nb+1)*ldq)+offset],q2);
1968 : #ifdef HAVE_SSE_INTRINSICS
1969 : #ifdef DOUBLE_PRECISION_REAL
1970 3276800 : h1 = _mm_set1_pd(hh[nb-3]);
1971 : #endif
1972 : #ifdef SINGLE_PRECISION_REAL
1973 614400 : h1 = _mm_set1_ps(hh[nb-3]);
1974 : #endif
1975 : #endif
1976 : #ifdef HAVE_SPARC64_SSE
1977 : #ifdef DOUBLE_PRECISION_REAL
1978 : h1 = _mm_set_pd(hh[nb-3], hh[nb-3]);
1979 : #endif
1980 : #ifdef SINGLE_PRECISION_REAL
1981 : h1 = _mm_set_ps(hh[nb-3], hh[nb-3]);
1982 : #endif
1983 : #endif
1984 :
1985 :
1986 3891200 : q1 = _SSE_LOAD(&q[(nb+2)*ldq]);
1987 3891200 : q2 = _SSE_LOAD(&q[((nb+2)*ldq)+offset]);
1988 :
1989 3891200 : q1 = _SSE_SUB(q1, _SSE_MUL(x1, h1));
1990 3891200 : q2 = _SSE_SUB(q2, _SSE_MUL(x2, h1));
1991 : #ifdef HAVE_SSE_INTRINSICS
1992 : #ifdef DOUBLE_PRECISION_REAL
1993 3276800 : h2 = _mm_set1_pd(hh[ldh+nb-2]);
1994 : #endif
1995 : #ifdef SINGLE_PRECISION_REAL
1996 614400 : h2 = _mm_set1_ps(hh[ldh+nb-2]);
1997 : #endif
1998 : #endif
1999 : #ifdef HAVE_SPARC64_SSE
2000 : #ifdef DOUBLE_PRECISION_REAL
2001 : h2 = _mm_set_pd(hh[ldh+nb-2], hh[ldh+nb-2]);
2002 : #endif
2003 : #ifdef SINGLE_PRECISION_REAL
2004 : h2 = _mm_set_ps(hh[ldh+nb-2], hh[ldh+nb-2]);
2005 : #endif
2006 : #endif
2007 :
2008 3891200 : q1 = _SSE_SUB(q1, _SSE_MUL(y1, h2));
2009 3891200 : q2 = _SSE_SUB(q2, _SSE_MUL(y2, h2));
2010 : #ifdef HAVE_SSE_INTRINSICS
2011 : #ifdef DOUBLE_PRECISION_REAL
2012 3276800 : h3 = _mm_set1_pd(hh[(ldh*2)+nb-1]);
2013 : #endif
2014 : #ifdef SINGLE_PRECISION_REAL
2015 614400 : h3 = _mm_set1_ps(hh[(ldh*2)+nb-1]);
2016 : #endif
2017 : #endif
2018 : #ifdef HAVE_SPARC64_SSE
2019 : #ifdef DOUBLE_PRECISION_REAL
2020 : h3 = _mm_set_pd(hh[(ldh*2)+nb-1], hh[(ldh*2)+nb-1]);
2021 : #endif
2022 : #ifdef SINGLE_PRECISION_REAL
2023 : h3 = _mm_set_ps(hh[(ldh*2)+nb-1], hh[(ldh*2)+nb-1]);
2024 : #endif
2025 : #endif
2026 :
2027 :
2028 3891200 : q1 = _SSE_SUB(q1, _SSE_MUL(z1, h3));
2029 3891200 : q2 = _SSE_SUB(q2, _SSE_MUL(z2, h3));
2030 :
2031 1945600 : _SSE_STORE(&q[(nb+2)*ldq],q1);
2032 1945600 : _SSE_STORE(&q[((nb+2)*ldq)+offset],q2);
2033 : #ifdef HAVE_SSE_INTRINSICS
2034 : #ifdef DOUBLE_PRECISION_REAL
2035 3276800 : h1 = _mm_set1_pd(hh[nb-2]);
2036 : #endif
2037 : #ifdef SINGLE_PRECISION_REAL
2038 614400 : h1 = _mm_set1_ps(hh[nb-2]);
2039 : #endif
2040 : #endif
2041 : #ifdef HAVE_SPARC64_SSE
2042 : #ifdef DOUBLE_PRECISION_REAL
2043 : h1 = _mm_set_pd(hh[nb-2], hh[nb-2]);
2044 : #endif
2045 : #ifdef SINGLE_PRECISION_REAL
2046 : h1 = _mm_set_ps(hh[nb-2], hh[nb-2]);
2047 : #endif
2048 : #endif
2049 :
2050 :
2051 3891200 : q1 = _SSE_LOAD(&q[(nb+3)*ldq]);
2052 3891200 : q2 = _SSE_LOAD(&q[((nb+3)*ldq)+offset]);
2053 :
2054 3891200 : q1 = _SSE_SUB(q1, _SSE_MUL(x1, h1));
2055 3891200 : q2 = _SSE_SUB(q2, _SSE_MUL(x2, h1));
2056 : #ifdef HAVE_SSE_INTRINSICS
2057 : #ifdef DOUBLE_PRECISION_REAL
2058 3276800 : h2 = _mm_set1_pd(hh[ldh+nb-1]);
2059 : #endif
2060 : #ifdef SINGLE_PRECISION_REAL
2061 614400 : h2 = _mm_set1_ps(hh[ldh+nb-1]);
2062 : #endif
2063 : #endif
2064 : #ifdef HAVE_SPARC64_SSE
2065 : #ifdef DOUBLE_PRECISION_REAL
2066 : h2 = _mm_set_pd(hh[ldh+nb-1], hh[ldh+nb-1]);
2067 : #endif
2068 : #ifdef SINGLE_PRECISION_REAL
2069 : h2 = _mm_set_ps(hh[ldh+nb-1], hh[ldh+nb-1]);
2070 : #endif
2071 : #endif
2072 :
2073 :
2074 3891200 : q1 = _SSE_SUB(q1, _SSE_MUL(y1, h2));
2075 3891200 : q2 = _SSE_SUB(q2, _SSE_MUL(y2, h2));
2076 :
2077 1945600 : _SSE_STORE(&q[(nb+3)*ldq],q1);
2078 1945600 : _SSE_STORE(&q[((nb+3)*ldq)+offset],q2);
2079 : #ifdef HAVE_SSE_INTRINSICS
2080 : #ifdef DOUBLE_PRECISION_REAL
2081 3276800 : h1 = _mm_set1_pd(hh[nb-1]);
2082 : #endif
2083 : #ifdef SINGLE_PRECISION_REAL
2084 614400 : h1 = _mm_set1_ps(hh[nb-1]);
2085 : #endif
2086 : #endif
2087 : #ifdef HAVE_SPARC64_SSE
2088 : #ifdef DOUBLE_PRECISION_REAL
2089 : h1 = _mm_set_pd(hh[nb-1], hh[nb-1]);
2090 : #endif
2091 : #ifdef SINGLE_PRECISION_REAL
2092 : h1 = _mm_set_ps(hh[nb-1], hh[nb-1]);
2093 : #endif
2094 : #endif
2095 :
2096 3891200 : q1 = _SSE_LOAD(&q[(nb+4)*ldq]);
2097 3891200 : q2 = _SSE_LOAD(&q[((nb+4)*ldq)+offset]);
2098 :
2099 3891200 : q1 = _SSE_SUB(q1, _SSE_MUL(x1, h1));
2100 3891200 : q2 = _SSE_SUB(q2, _SSE_MUL(x2, h1));
2101 :
2102 1945600 : _SSE_STORE(&q[(nb+4)*ldq],q1);
2103 1945600 : _SSE_STORE(&q[((nb+4)*ldq)+offset],q2);
2104 : }
2105 : /**
2106 : * Unrolled kernel that computes
2107 : #ifdef DOUBLE_PRECISION_REAL
2108 : * 2 rows of Q simultaneously, a
2109 : #endif
2110 : #ifdef SINGLE_PRECISION_REAL
2111 : * 4 rows of Q simultaneously, a
2112 : #endif
2113 : * matrix Vector product with two householder
2114 : * vectors + a rank 1 update is performed
2115 : */
2116 : #ifdef HAVE_SSE_INTRINSICS
2117 : #ifdef DOUBLE_PRECISION_REAL
2118 : __forceinline void hh_trafo_kernel_2_SSE_6hv_double(double* q, double* hh, int nb, int ldq, int ldh, double* scalarprods)
2119 : #endif
2120 : #ifdef SINGLE_PRECISION_REAL
2121 : __forceinline void hh_trafo_kernel_4_SSE_6hv_single(float* q, float* hh, int nb, int ldq, int ldh, float* scalarprods)
2122 : #endif
2123 : #endif
2124 : #ifdef HAVE_SPARC64_SSE
2125 : #ifdef DOUBLE_PRECISION_REAL
2126 : __forceinline void hh_trafo_kernel_2_SPARC64_6hv_double(double* q, double* hh, int nb, int ldq, int ldh, double* scalarprods)
2127 : #endif
2128 : #ifdef SINGLE_PRECISION_REAL
2129 : __forceinline void hh_trafo_kernel_4_SPARC64_6hv_single(float* q, float* hh, int nb, int ldq, int ldh, float* scalarprods)
2130 : #endif
2131 : #endif
2132 :
2133 : {
2134 : /////////////////////////////////////////////////////
2135 : // Matrix Vector Multiplication, Q [2 x nb+3] * hh
2136 : // hh contains four householder vectors
2137 : /////////////////////////////////////////////////////
2138 : int i;
2139 :
2140 0 : __SSE_DATATYPE a1_1 = _SSE_LOAD(&q[ldq*5]);
2141 0 : __SSE_DATATYPE a2_1 = _SSE_LOAD(&q[ldq*4]);
2142 0 : __SSE_DATATYPE a3_1 = _SSE_LOAD(&q[ldq*3]);
2143 0 : __SSE_DATATYPE a4_1 = _SSE_LOAD(&q[ldq*2]);
2144 0 : __SSE_DATATYPE a5_1 = _SSE_LOAD(&q[ldq]);
2145 0 : __SSE_DATATYPE a6_1 = _SSE_LOAD(&q[0]);
2146 :
2147 : #ifdef HAVE_SSE_INTRINSICS
2148 : #ifdef DOUBLE_PRECISION_REAL
2149 0 : __SSE_DATATYPE h_6_5 = _mm_set1_pd(hh[(ldh*5)+1]);
2150 0 : __SSE_DATATYPE h_6_4 = _mm_set1_pd(hh[(ldh*5)+2]);
2151 0 : __SSE_DATATYPE h_6_3 = _mm_set1_pd(hh[(ldh*5)+3]);
2152 0 : __SSE_DATATYPE h_6_2 = _mm_set1_pd(hh[(ldh*5)+4]);
2153 0 : __SSE_DATATYPE h_6_1 = _mm_set1_pd(hh[(ldh*5)+5]);
2154 : #endif
2155 : #ifdef SINGLE_PRECISION_REAL
2156 0 : __SSE_DATATYPE h_6_5 = _mm_set1_ps(hh[(ldh*5)+1]) ;
2157 0 : __SSE_DATATYPE h_6_4 = _mm_set1_ps(hh[(ldh*5)+2]) ;
2158 0 : __SSE_DATATYPE h_6_3 = _mm_set1_ps(hh[(ldh*5)+3]) ;
2159 0 : __SSE_DATATYPE h_6_2 = _mm_set1_ps(hh[(ldh*5)+4]) ;
2160 0 : __SSE_DATATYPE h_6_1 = _mm_set1_ps(hh[(ldh*5)+5]) ;
2161 : #endif
2162 : #endif
2163 : #ifdef HAVE_SPARC64_SSE
2164 : #ifdef DOUBLE_PRECISION_REAL
2165 : __SSE_DATATYPE h_6_5 = _mm_set_pd(hh[(ldh*5)+1], hh[(ldh*5)+1]);
2166 : __SSE_DATATYPE h_6_4 = _mm_set_pd(hh[(ldh*5)+2], hh[(ldh*5)+2]);
2167 : __SSE_DATATYPE h_6_3 = _mm_set_pd(hh[(ldh*5)+3], hh[(ldh*5)+3]);
2168 : __SSE_DATATYPE h_6_2 = _mm_set_pd(hh[(ldh*5)+4], hh[(ldh*5)+4]);
2169 : __SSE_DATATYPE h_6_1 = _mm_set_pd(hh[(ldh*5)+5], hh[(ldh*5)+5]);
2170 : #endif
2171 : #ifdef SINGLE_PRECISION_REAL
2172 : __SSE_DATATYPE h_6_5 = _mm_set_ps(hh[(ldh*5)+1], hh[(ldh*5)+1]) ;
2173 : __SSE_DATATYPE h_6_4 = _mm_set_ps(hh[(ldh*5)+2], hh[(ldh*5)+2]) ;
2174 : __SSE_DATATYPE h_6_3 = _mm_set_ps(hh[(ldh*5)+3], hh[(ldh*5)+3]) ;
2175 : __SSE_DATATYPE h_6_2 = _mm_set_ps(hh[(ldh*5)+4], hh[(ldh*5)+4]) ;
2176 : __SSE_DATATYPE h_6_1 = _mm_set_ps(hh[(ldh*5)+5], hh[(ldh*5)+5]) ;
2177 : #endif
2178 : #endif
2179 :
2180 0 : register __SSE_DATATYPE t1 = _SSE_ADD(a6_1, _SSE_MUL(a5_1, h_6_5));
2181 0 : t1 = _SSE_ADD(t1, _SSE_MUL(a4_1, h_6_4));
2182 0 : t1 = _SSE_ADD(t1, _SSE_MUL(a3_1, h_6_3));
2183 0 : t1 = _SSE_ADD(t1, _SSE_MUL(a2_1, h_6_2));
2184 0 : t1 = _SSE_ADD(t1, _SSE_MUL(a1_1, h_6_1));
2185 : #ifdef HAVE_SSE_INTRINSICS
2186 : #ifdef DOUBLE_PRECISION_REAL
2187 0 : __SSE_DATATYPE h_5_4 = _mm_set1_pd(hh[(ldh*4)+1]);
2188 0 : __SSE_DATATYPE h_5_3 = _mm_set1_pd(hh[(ldh*4)+2]);
2189 0 : __SSE_DATATYPE h_5_2 = _mm_set1_pd(hh[(ldh*4)+3]);
2190 0 : __SSE_DATATYPE h_5_1 = _mm_set1_pd(hh[(ldh*4)+4]);
2191 : #endif
2192 : #ifdef SINGLE_PRECISION_REAL
2193 0 : __SSE_DATATYPE h_5_4 = _mm_set1_ps(hh[(ldh*4)+1]) ;
2194 0 : __SSE_DATATYPE h_5_3 = _mm_set1_ps(hh[(ldh*4)+2]) ;
2195 0 : __SSE_DATATYPE h_5_2 = _mm_set1_ps(hh[(ldh*4)+3]) ;
2196 0 : __SSE_DATATYPE h_5_1 = _mm_set1_ps(hh[(ldh*4)+4]) ;
2197 : #endif
2198 : #endif
2199 : #ifdef HAVE_SPARC64_SSE
2200 : #ifdef DOUBLE_PRECISION_REAL
2201 : __SSE_DATATYPE h_5_4 = _mm_set_pd(hh[(ldh*4)+1], hh[(ldh*4)+1]);
2202 : __SSE_DATATYPE h_5_3 = _mm_set_pd(hh[(ldh*4)+2], hh[(ldh*4)+2]);
2203 : __SSE_DATATYPE h_5_2 = _mm_set_pd(hh[(ldh*4)+3], hh[(ldh*4)+3]);
2204 : __SSE_DATATYPE h_5_1 = _mm_set_pd(hh[(ldh*4)+4], hh[(ldh*4)+4]);
2205 : #endif
2206 : #ifdef SINGLE_PRECISION_REAL
2207 : __SSE_DATATYPE h_5_4 = _mm_set_ps(hh[(ldh*4)+1], hh[(ldh*4)+1]) ;
2208 : __SSE_DATATYPE h_5_3 = _mm_set_ps(hh[(ldh*4)+2], hh[(ldh*4)+2]) ;
2209 : __SSE_DATATYPE h_5_2 = _mm_set_ps(hh[(ldh*4)+3], hh[(ldh*4)+3]) ;
2210 : __SSE_DATATYPE h_5_1 = _mm_set_ps(hh[(ldh*4)+4], hh[(ldh*4)+4]) ;
2211 : #endif
2212 : #endif
2213 :
2214 0 : register __SSE_DATATYPE v1 = _SSE_ADD(a5_1, _SSE_MUL(a4_1, h_5_4));
2215 0 : v1 = _SSE_ADD(v1, _SSE_MUL(a3_1, h_5_3));
2216 0 : v1 = _SSE_ADD(v1, _SSE_MUL(a2_1, h_5_2));
2217 0 : v1 = _SSE_ADD(v1, _SSE_MUL(a1_1, h_5_1));
2218 : #ifdef HAVE_SSE_INTRINSICS
2219 : #ifdef DOUBLE_PRECISION_REAL
2220 0 : __SSE_DATATYPE h_4_3 = _mm_set1_pd(hh[(ldh*3)+1]);
2221 0 : __SSE_DATATYPE h_4_2 = _mm_set1_pd(hh[(ldh*3)+2]);
2222 0 : __SSE_DATATYPE h_4_1 = _mm_set1_pd(hh[(ldh*3)+3]);
2223 : #endif
2224 : #ifdef SINGLE_PRECISION_REAL
2225 0 : __SSE_DATATYPE h_4_3 = _mm_set1_ps(hh[(ldh*3)+1]) ;
2226 0 : __SSE_DATATYPE h_4_2 = _mm_set1_ps(hh[(ldh*3)+2]) ;
2227 0 : __SSE_DATATYPE h_4_1 = _mm_set1_ps(hh[(ldh*3)+3]) ;
2228 : #endif
2229 : #endif
2230 : #ifdef HAVE_SPARC64_SSE
2231 : #ifdef DOUBLE_PRECISION_REAL
2232 : __SSE_DATATYPE h_4_3 = _mm_set_pd(hh[(ldh*3)+1], hh[(ldh*3)+1]);
2233 : __SSE_DATATYPE h_4_2 = _mm_set_pd(hh[(ldh*3)+2], hh[(ldh*3)+2]);
2234 : __SSE_DATATYPE h_4_1 = _mm_set_pd(hh[(ldh*3)+3], hh[(ldh*3)+3]);
2235 : #endif
2236 : #ifdef SINGLE_PRECISION_REAL
2237 : __SSE_DATATYPE h_4_3 = _mm_set_ps(hh[(ldh*3)+1], hh[(ldh*3)+1]) ;
2238 : __SSE_DATATYPE h_4_2 = _mm_set_ps(hh[(ldh*3)+2], hh[(ldh*3)+2]) ;
2239 : __SSE_DATATYPE h_4_1 = _mm_set_ps(hh[(ldh*3)+3], hh[(ldh*3)+3]) ;
2240 : #endif
2241 : #endif
2242 :
2243 0 : register __SSE_DATATYPE w1 = _SSE_ADD(a4_1, _SSE_MUL(a3_1, h_4_3));
2244 0 : w1 = _SSE_ADD(w1, _SSE_MUL(a2_1, h_4_2));
2245 0 : w1 = _SSE_ADD(w1, _SSE_MUL(a1_1, h_4_1));
2246 : #ifdef HAVE_SSE_INTRINSICS
2247 : #ifdef DOUBLE_PRECISION_REAL
2248 0 : __SSE_DATATYPE h_2_1 = _mm_set1_pd(hh[ldh+1]);
2249 0 : __SSE_DATATYPE h_3_2 = _mm_set1_pd(hh[(ldh*2)+1]);
2250 0 : __SSE_DATATYPE h_3_1 = _mm_set1_pd(hh[(ldh*2)+2]);
2251 : #endif
2252 : #ifdef SINGLE_PRECISION_REAL
2253 0 : __SSE_DATATYPE h_2_1 = _mm_set1_ps(hh[ldh+1]) ;
2254 0 : __SSE_DATATYPE h_3_2 = _mm_set1_ps(hh[(ldh*2)+1]) ;
2255 0 : __SSE_DATATYPE h_3_1 = _mm_set1_ps(hh[(ldh*2)+2]) ;
2256 : #endif
2257 : #endif
2258 : #ifdef HAVE_SPARC64_SSE
2259 : #ifdef DOUBLE_PRECISION_REAL
2260 : __SSE_DATATYPE h_2_1 = _mm_set_pd(hh[ldh+1], hh[ldh+1]);
2261 : __SSE_DATATYPE h_3_2 = _mm_set_pd(hh[(ldh*2)+1], hh[(ldh*2)+1]);
2262 : __SSE_DATATYPE h_3_1 = _mm_set_pd(hh[(ldh*2)+2], hh[(ldh*2)+2]);
2263 : #endif
2264 : #ifdef SINGLE_PRECISION_REAL
2265 : __SSE_DATATYPE h_2_1 = _mm_set_ps(hh[ldh+1], hh[ldh+1]) ;
2266 : __SSE_DATATYPE h_3_2 = _mm_set_ps(hh[(ldh*2)+1], hh[(ldh*2)+1]) ;
2267 : __SSE_DATATYPE h_3_1 = _mm_set_ps(hh[(ldh*2)+2], hh[(ldh*2)+2]) ;
2268 : #endif
2269 : #endif
2270 :
2271 :
2272 0 : register __SSE_DATATYPE z1 = _SSE_ADD(a3_1, _SSE_MUL(a2_1, h_3_2));
2273 0 : z1 = _SSE_ADD(z1, _SSE_MUL(a1_1, h_3_1));
2274 0 : register __SSE_DATATYPE y1 = _SSE_ADD(a2_1, _SSE_MUL(a1_1, h_2_1));
2275 :
2276 0 : register __SSE_DATATYPE x1 = a1_1;
2277 :
2278 : __SSE_DATATYPE q1;
2279 :
2280 : __SSE_DATATYPE h1;
2281 : __SSE_DATATYPE h2;
2282 : __SSE_DATATYPE h3;
2283 : __SSE_DATATYPE h4;
2284 : __SSE_DATATYPE h5;
2285 : __SSE_DATATYPE h6;
2286 :
2287 0 : for(i = 6; i < nb; i++)
2288 : {
2289 : #ifdef HAVE_SSE_INTRINSICS
2290 : #ifdef DOUBLE_PRECISION_REAL
2291 0 : h1 = _mm_set1_pd(hh[i-5]);
2292 : #endif
2293 : #ifdef SINGLE_PRECISION_REAL
2294 0 : h1 = _mm_set1_ps(hh[i-5]) ;
2295 : #endif
2296 : #endif
2297 : #ifdef HAVE_SPARC64_SSE
2298 : #ifdef DOUBLE_PRECISION_REAL
2299 : h1 = _mm_set_pd(hh[i-5], hh[i-5]);
2300 : #endif
2301 : #ifdef SINGLE_PRECISION_REAL
2302 : h1 = _mm_set_ps(hh[i-5], hh[i-5]) ;
2303 : #endif
2304 : #endif
2305 :
2306 0 : q1 = _SSE_LOAD(&q[i*ldq]);
2307 :
2308 0 : x1 = _SSE_ADD(x1, _SSE_MUL(q1,h1));
2309 : #ifdef HAVE_SSE_INTRINSICS
2310 : #ifdef DOUBLE_PRECISION_REAL
2311 0 : h2 = _mm_set1_pd(hh[ldh+i-4]);
2312 : #endif
2313 : #ifdef SINGLE_PRECISION_REAL
2314 0 : h2 = _mm_set1_ps(hh[ldh+i-4]) ;
2315 : #endif
2316 : #endif
2317 : #ifdef HAVE_SPARC64_SSE
2318 : #ifdef DOUBLE_PRECISION_REAL
2319 : h2 = _mm_set_pd(hh[ldh+i-4], hh[ldh+i-4]);
2320 : #endif
2321 : #ifdef SINGLE_PRECISION_REAL
2322 : h2 = _mm_set_ps(hh[ldh+i-4], hh[ldh+i-4]) ;
2323 : #endif
2324 : #endif
2325 :
2326 :
2327 0 : y1 = _SSE_ADD(y1, _SSE_MUL(q1,h2));
2328 : #ifdef HAVE_SSE_INTRINSICS
2329 : #ifdef DOUBLE_PRECISION_REAL
2330 0 : h3 = _mm_set1_pd(hh[(ldh*2)+i-3]);
2331 : #endif
2332 : #ifdef SINGLE_PRECISION_REAL
2333 0 : h3 = _mm_set1_ps(hh[(ldh*2)+i-3]) ;
2334 : #endif
2335 : #endif
2336 : #ifdef HAVE_SPARC64_SSE
2337 : #ifdef DOUBLE_PRECISION_REAL
2338 : h3 = _mm_set_pd(hh[(ldh*2)+i-3], hh[(ldh*2)+i-3]);
2339 : #endif
2340 : #ifdef SINGLE_PRECISION_REAL
2341 : h3 = _mm_set_ps(hh[(ldh*2)+i-3], hh[(ldh*2)+i-3]) ;
2342 : #endif
2343 : #endif
2344 :
2345 0 : z1 = _SSE_ADD(z1, _SSE_MUL(q1,h3));
2346 : #ifdef HAVE_SSE_INTRINSICS
2347 : #ifdef DOUBLE_PRECISION_REAL
2348 0 : h4 = _mm_set1_pd(hh[(ldh*3)+i-2]);
2349 : #endif
2350 : #ifdef SINGLE_PRECISION_REAL
2351 0 : h4 = _mm_set1_ps(hh[(ldh*3)+i-2]) ;
2352 : #endif
2353 : #endif
2354 : #ifdef HAVE_SPARC64_SSE
2355 : #ifdef DOUBLE_PRECISION_REAL
2356 : h4 = _mm_set_pd(hh[(ldh*3)+i-2], hh[(ldh*3)+i-2]);
2357 : #endif
2358 : #ifdef SINGLE_PRECISION_REAL
2359 : h4 = _mm_set_ps(hh[(ldh*3)+i-2], hh[(ldh*3)+i-2]) ;
2360 : #endif
2361 : #endif
2362 :
2363 0 : w1 = _SSE_ADD(w1, _SSE_MUL(q1,h4));
2364 : #ifdef HAVE_SSE_INTRINSICS
2365 : #ifdef DOUBLE_PRECISION_REAL
2366 0 : h5 = _mm_set1_pd(hh[(ldh*4)+i-1]);
2367 : #endif
2368 : #ifdef SINGLE_PRECISION_REAL
2369 0 : h5 = _mm_set1_ps(hh[(ldh*4)+i-1]) ;
2370 : #endif
2371 : #endif
2372 : #ifdef HAVE_SPARC64_SSE
2373 : #ifdef DOUBLE_PRECISION_REAL
2374 : h5 = _mm_set_pd(hh[(ldh*4)+i-1], hh[(ldh*4)+i-1]);
2375 : #endif
2376 : #ifdef SINGLE_PRECISION_REAL
2377 : h5 = _mm_set_ps(hh[(ldh*4)+i-1], hh[(ldh*4)+i-1]) ;
2378 : #endif
2379 : #endif
2380 :
2381 0 : v1 = _SSE_ADD(v1, _SSE_MUL(q1,h5));
2382 : #ifdef HAVE_SSE_INTRINSICS
2383 : #ifdef DOUBLE_PRECISION_REAL
2384 0 : h6 = _mm_set1_pd(hh[(ldh*5)+i]);
2385 : #endif
2386 : #ifdef SINGLE_PRECISION_REAL
2387 0 : h6 = _mm_set1_ps(hh[(ldh*5)+i]) ;
2388 : #endif
2389 : #endif
2390 : #ifdef HAVE_SPARC64_SSE
2391 : #ifdef DOUBLE_PRECISION_REAL
2392 : h6 = _mm_set_pd(hh[(ldh*5)+i], hh[(ldh*5)+i]);
2393 : #endif
2394 : #ifdef SINGLE_PRECISION_REAL
2395 : h6 = _mm_set_ps(hh[(ldh*5)+i], hh[(ldh*5)+i]) ;
2396 : #endif
2397 : #endif
2398 :
2399 0 : t1 = _SSE_ADD(t1, _SSE_MUL(q1,h6));
2400 :
2401 : }
2402 : #ifdef HAVE_SSE_INTRINSICS
2403 : #ifdef DOUBLE_PRECISION_REAL
2404 0 : h1 = _mm_set1_pd(hh[nb-5]);
2405 : #endif
2406 : #ifdef SINGLE_PRECISION_REAL
2407 0 : h1 = _mm_set1_ps(hh[nb-5]) ;
2408 : #endif
2409 : #endif
2410 : #ifdef HAVE_SPARC64_SSE
2411 : #ifdef DOUBLE_PRECISION_REAL
2412 : h1 = _mm_set_pd(hh[nb-5], hh[nb-5]);
2413 : #endif
2414 : #ifdef SINGLE_PRECISION_REAL
2415 : h1 = _mm_set_ps(hh[nb-5], hh[nb-5]) ;
2416 : #endif
2417 : #endif
2418 :
2419 :
2420 0 : q1 = _SSE_LOAD(&q[nb*ldq]);
2421 :
2422 0 : x1 = _SSE_ADD(x1, _SSE_MUL(q1,h1));
2423 : #ifdef HAVE_SSE_INTRINSICS
2424 : #ifdef DOUBLE_PRECISION_REAL
2425 0 : h2 = _mm_set1_pd(hh[ldh+nb-4]);
2426 : #endif
2427 : #ifdef SINGLE_PRECISION_REAL
2428 0 : h2 = _mm_set1_ps(hh[ldh+nb-4]) ;
2429 : #endif
2430 : #endif
2431 : #ifdef HAVE_SPARC64_SSE
2432 : #ifdef DOUBLE_PRECISION_REAL
2433 : h2 = _mm_set_pd(hh[ldh+nb-4], hh[ldh+nb-4]);
2434 : #endif
2435 : #ifdef SINGLE_PRECISION_REAL
2436 : h2 = _mm_set_ps(hh[ldh+nb-4], hh[ldh+nb-4]) ;
2437 : #endif
2438 : #endif
2439 :
2440 :
2441 0 : y1 = _SSE_ADD(y1, _SSE_MUL(q1,h2));
2442 : #ifdef HAVE_SSE_INTRINSICS
2443 : #ifdef DOUBLE_PRECISION_REAL
2444 0 : h3 = _mm_set1_pd(hh[(ldh*2)+nb-3]);
2445 : #endif
2446 : #ifdef SINGLE_PRECISION_REAL
2447 0 : h3 = _mm_set1_ps(hh[(ldh*2)+nb-3]) ;
2448 : #endif
2449 : #endif
2450 : #ifdef HAVE_SPARC64_SSE
2451 : #ifdef DOUBLE_PRECISION_REAL
2452 : h3 = _mm_set_pd(hh[(ldh*2)+nb-3], hh[(ldh*2)+nb-3]);
2453 : #endif
2454 : #ifdef SINGLE_PRECISION_REAL
2455 : h3 = _mm_set_ps(hh[(ldh*2)+nb-3], hh[(ldh*2)+nb-3]) ;
2456 : #endif
2457 : #endif
2458 :
2459 :
2460 0 : z1 = _SSE_ADD(z1, _SSE_MUL(q1,h3));
2461 : #ifdef HAVE_SSE_INTRINSICS
2462 : #ifdef DOUBLE_PRECISION_REAL
2463 0 : h4 = _mm_set1_pd(hh[(ldh*3)+nb-2]);
2464 : #endif
2465 : #ifdef SINGLE_PRECISION_REAL
2466 0 : h4 = _mm_set1_ps(hh[(ldh*3)+nb-2]) ;
2467 : #endif
2468 : #endif
2469 : #ifdef HAVE_SPARC64_SSE
2470 : #ifdef DOUBLE_PRECISION_REAL
2471 : h4 = _mm_set_pd(hh[(ldh*3)+nb-2], hh[(ldh*3)+nb-2]);
2472 : #endif
2473 : #ifdef SINGLE_PRECISION_REAL
2474 : h4 = _mm_set_ps(hh[(ldh*3)+nb-2], hh[(ldh*3)+nb-2]) ;
2475 : #endif
2476 : #endif
2477 :
2478 :
2479 :
2480 :
2481 0 : w1 = _SSE_ADD(w1, _SSE_MUL(q1,h4));
2482 : #ifdef HAVE_SSE_INTRINSICS
2483 : #ifdef DOUBLE_PRECISION_REAL
2484 0 : h5 = _mm_set1_pd(hh[(ldh*4)+nb-1]);
2485 : #endif
2486 : #ifdef SINGLE_PRECISION_REAL
2487 0 : h5 = _mm_set1_ps(hh[(ldh*4)+nb-1]) ;
2488 : #endif
2489 : #endif
2490 : #ifdef HAVE_SPARC64_SSE
2491 : #ifdef DOUBLE_PRECISION_REAL
2492 : h5 = _mm_set_pd(hh[(ldh*4)+nb-1], hh[(ldh*4)+nb-1]);
2493 : #endif
2494 : #ifdef SINGLE_PRECISION_REAL
2495 : h5 = _mm_set_ps(hh[(ldh*4)+nb-1], hh[(ldh*4)+nb-1]) ;
2496 : #endif
2497 : #endif
2498 :
2499 :
2500 0 : v1 = _SSE_ADD(v1, _SSE_MUL(q1,h5));
2501 : #ifdef HAVE_SSE_INTRINSICS
2502 : #ifdef DOUBLE_PRECISION_REAL
2503 0 : h1 = _mm_set1_pd(hh[nb-4]);
2504 : #endif
2505 : #ifdef SINGLE_PRECISION_REAL
2506 0 : h1 = _mm_set1_ps(hh[nb-4]) ;
2507 : #endif
2508 : #endif
2509 : #ifdef HAVE_SPARC64_SSE
2510 : #ifdef DOUBLE_PRECISION_REAL
2511 : h1 = _mm_set_pd(hh[nb-4], hh[nb-4]);
2512 : #endif
2513 : #ifdef SINGLE_PRECISION_REAL
2514 : h1 = _mm_set_ps(hh[nb-4], hh[nb-4]) ;
2515 : #endif
2516 : #endif
2517 :
2518 :
2519 0 : q1 = _SSE_LOAD(&q[(nb+1)*ldq]);
2520 :
2521 0 : x1 = _SSE_ADD(x1, _SSE_MUL(q1,h1));
2522 : #ifdef HAVE_SSE_INTRINSICS
2523 : #ifdef DOUBLE_PRECISION_REAL
2524 0 : h2 = _mm_set1_pd(hh[ldh+nb-3]);
2525 : #endif
2526 : #ifdef SINGLE_PRECISION_REAL
2527 0 : h2 = _mm_set1_ps(hh[ldh+nb-3]) ;
2528 : #endif
2529 : #endif
2530 : #ifdef HAVE_SPARC64_SSE
2531 : #ifdef DOUBLE_PRECISION_REAL
2532 : h2 = _mm_set_pd(hh[ldh+nb-3], hh[ldh+nb-3]);
2533 : #endif
2534 : #ifdef SINGLE_PRECISION_REAL
2535 : h2 = _mm_set_ps(hh[ldh+nb-3], hh[ldh+nb-3]) ;
2536 : #endif
2537 : #endif
2538 :
2539 :
2540 0 : y1 = _SSE_ADD(y1, _SSE_MUL(q1,h2));
2541 : #ifdef HAVE_SSE_INTRINSICS
2542 : #ifdef DOUBLE_PRECISION_REAL
2543 0 : h3 = _mm_set1_pd(hh[(ldh*2)+nb-2]);
2544 : #endif
2545 : #ifdef SINGLE_PRECISION_REAL
2546 0 : h3 = _mm_set1_ps(hh[(ldh*2)+nb-2]) ;
2547 : #endif
2548 : #endif
2549 : #ifdef HAVE_SPARC64_SSE
2550 : #ifdef DOUBLE_PRECISION_REAL
2551 : h3 = _mm_set_pd(hh[(ldh*2)+nb-2], hh[(ldh*2)+nb-2]);
2552 : #endif
2553 : #ifdef SINGLE_PRECISION_REAL
2554 : h3 = _mm_set_ps(hh[(ldh*2)+nb-2], hh[(ldh*2)+nb-2]) ;
2555 : #endif
2556 : #endif
2557 :
2558 :
2559 0 : z1 = _SSE_ADD(z1, _SSE_MUL(q1,h3));
2560 : #ifdef HAVE_SSE_INTRINSICS
2561 : #ifdef DOUBLE_PRECISION_REAL
2562 0 : h4 = _mm_set1_pd(hh[(ldh*3)+nb-1]);
2563 : #endif
2564 : #ifdef SINGLE_PRECISION_REAL
2565 0 : h4 = _mm_set1_ps(hh[(ldh*3)+nb-1]) ;
2566 : #endif
2567 : #endif
2568 : #ifdef HAVE_SPARC64_SSE
2569 : #ifdef DOUBLE_PRECISION_REAL
2570 : h4 = _mm_set_pd(hh[(ldh*3)+nb-1], hh[(ldh*3)+nb-1]);
2571 : #endif
2572 : #ifdef SINGLE_PRECISION_REAL
2573 : h4 = _mm_set_ps(hh[(ldh*3)+nb-1], hh[(ldh*3)+nb-1]) ;
2574 : #endif
2575 : #endif
2576 :
2577 :
2578 0 : w1 = _SSE_ADD(w1, _SSE_MUL(q1,h4));
2579 : #ifdef HAVE_SSE_INTRINSICS
2580 : #ifdef DOUBLE_PRECISION_REAL
2581 0 : h1 = _mm_set1_pd(hh[nb-3]);
2582 : #endif
2583 : #ifdef SINGLE_PRECISION_REAL
2584 0 : h1 = _mm_set1_ps(hh[nb-3]) ;
2585 : #endif
2586 : #endif
2587 : #ifdef HAVE_SPARC64_SSE
2588 : #ifdef DOUBLE_PRECISION_REAL
2589 : h1 = _mm_set_pd(hh[nb-3], hh[nb-3]);
2590 : #endif
2591 : #ifdef SINGLE_PRECISION_REAL
2592 : h1 = _mm_set_ps(hh[nb-3], hh[nb-3]) ;
2593 : #endif
2594 : #endif
2595 :
2596 :
2597 0 : q1 = _SSE_LOAD(&q[(nb+2)*ldq]);
2598 :
2599 0 : x1 = _SSE_ADD(x1, _SSE_MUL(q1,h1));
2600 : #ifdef HAVE_SSE_INTRINSICS
2601 : #ifdef DOUBLE_PRECISION_REAL
2602 0 : h2 = _mm_set1_pd(hh[ldh+nb-2]);
2603 : #endif
2604 : #ifdef SINGLE_PRECISION_REAL
2605 0 : h2 = _mm_set1_ps(hh[ldh+nb-2]) ;
2606 : #endif
2607 : #endif
2608 : #ifdef HAVE_SPARC64_SSE
2609 : #ifdef DOUBLE_PRECISION_REAL
2610 : h2 = _mm_set_pd(hh[ldh+nb-2], hh[ldh+nb-2]);
2611 : #endif
2612 : #ifdef SINGLE_PRECISION_REAL
2613 : h2 = _mm_set_ps(hh[ldh+nb-2], hh[ldh+nb-2]) ;
2614 : #endif
2615 : #endif
2616 :
2617 :
2618 0 : y1 = _SSE_ADD(y1, _SSE_MUL(q1,h2));
2619 : #ifdef HAVE_SSE_INTRINSICS
2620 : #ifdef DOUBLE_PRECISION_REAL
2621 0 : h3 = _mm_set1_pd(hh[(ldh*2)+nb-1]);
2622 : #endif
2623 : #ifdef SINGLE_PRECISION_REAL
2624 0 : h3 = _mm_set1_ps(hh[(ldh*2)+nb-1]) ;
2625 : #endif
2626 : #endif
2627 : #ifdef HAVE_SPARC64_SSE
2628 : #ifdef DOUBLE_PRECISION_REAL
2629 : h3 = _mm_set_pd(hh[(ldh*2)+nb-1], hh[(ldh*2)+nb-1]);
2630 : #endif
2631 : #ifdef SINGLE_PRECISION_REAL
2632 : h3 = _mm_set_ps(hh[(ldh*2)+nb-1], hh[(ldh*2)+nb-1]) ;
2633 : #endif
2634 : #endif
2635 :
2636 :
2637 0 : z1 = _SSE_ADD(z1, _SSE_MUL(q1,h3));
2638 : #ifdef HAVE_SSE_INTRINSICS
2639 : #ifdef DOUBLE_PRECISION_REAL
2640 0 : h1 = _mm_set1_pd(hh[nb-2]);
2641 : #endif
2642 : #ifdef SINGLE_PRECISION_REAL
2643 0 : h1 = _mm_set1_ps(hh[nb-2]) ;
2644 : #endif
2645 : #endif
2646 : #ifdef HAVE_SPARC64_SSE
2647 : #ifdef DOUBLE_PRECISION_REAL
2648 : h1 = _mm_set_pd(hh[nb-2], hh[nb-2]);
2649 : #endif
2650 : #ifdef SINGLE_PRECISION_REAL
2651 : h1 = _mm_set_ps(hh[nb-2], hh[nb-2]) ;
2652 : #endif
2653 : #endif
2654 0 : q1 = _SSE_LOAD(&q[(nb+3)*ldq]);
2655 :
2656 0 : x1 = _SSE_ADD(x1, _SSE_MUL(q1,h1));
2657 : #ifdef HAVE_SSE_INTRINSICS
2658 : #ifdef DOUBLE_PRECISION_REAL
2659 0 : h2 = _mm_set1_pd(hh[ldh+nb-1]);
2660 : #endif
2661 : #ifdef SINGLE_PRECISION_REAL
2662 0 : h2 = _mm_set1_ps(hh[ldh+nb-1]) ;
2663 : #endif
2664 : #endif
2665 : #ifdef HAVE_SPARC64_SSE
2666 : #ifdef DOUBLE_PRECISION_REAL
2667 : h2 = _mm_set_pd(hh[ldh+nb-1], hh[ldh+nb-1]);
2668 : #endif
2669 : #ifdef SINGLE_PRECISION_REAL
2670 : h2 = _mm_set_ps(hh[ldh+nb-1], hh[ldh+nb-1]) ;
2671 : #endif
2672 : #endif
2673 :
2674 :
2675 0 : y1 = _SSE_ADD(y1, _SSE_MUL(q1,h2));
2676 : #ifdef HAVE_SSE_INTRINSICS
2677 : #ifdef DOUBLE_PRECISION_REAL
2678 0 : h1 = _mm_set1_pd(hh[nb-1]);
2679 : #endif
2680 : #ifdef SINGLE_PRECISION_REAL
2681 0 : h1 = _mm_set1_ps(hh[nb-1]) ;
2682 : #endif
2683 : #endif
2684 : #ifdef HAVE_SPARC64_SSE
2685 : #ifdef DOUBLE_PRECISION_REAL
2686 : h1 = _mm_set_pd(hh[nb-1], hh[nb-1]);
2687 : #endif
2688 : #ifdef SINGLE_PRECISION_REAL
2689 : h1 = _mm_set_ps(hh[nb-1], hh[nb-1]) ;
2690 : #endif
2691 : #endif
2692 :
2693 :
2694 0 : q1 = _SSE_LOAD(&q[(nb+4)*ldq]);
2695 :
2696 0 : x1 = _SSE_ADD(x1, _SSE_MUL(q1,h1));
2697 :
2698 : /////////////////////////////////////////////////////
2699 : // Apply tau, correct wrong calculation using pre-calculated scalar products
2700 : /////////////////////////////////////////////////////
2701 : #ifdef HAVE_SSE_INTRINSICS
2702 : #ifdef DOUBLE_PRECISION_REAL
2703 0 : __SSE_DATATYPE tau1 = _mm_set1_pd(hh[0]);
2704 : #endif
2705 : #ifdef SINGLE_PRECISION_REAL
2706 0 : __SSE_DATATYPE tau1 = _mm_set1_ps(hh[0]) ;
2707 : #endif
2708 : #endif
2709 : #ifdef HAVE_SPARC64_SSE
2710 : #ifdef DOUBLE_PRECISION_REAL
2711 : __SSE_DATATYPE tau1 = _mm_set_pd(hh[0], hh[0]);
2712 : #endif
2713 : #ifdef SINGLE_PRECISION_REAL
2714 : __SSE_DATATYPE tau1 = _mm_set_ps(hh[0], hh[0]) ;
2715 : #endif
2716 : #endif
2717 :
2718 0 : x1 = _SSE_MUL(x1, tau1);
2719 : #ifdef HAVE_SSE_INTRINSICS
2720 : #ifdef DOUBLE_PRECISION_REAL
2721 0 : __SSE_DATATYPE tau2 = _mm_set1_pd(hh[ldh]);
2722 0 : __SSE_DATATYPE vs_1_2 = _mm_set1_pd(scalarprods[0]);
2723 : #endif
2724 : #ifdef SINGLE_PRECISION_REAL
2725 0 : __SSE_DATATYPE tau2 = _mm_set1_ps(hh[ldh]) ;
2726 0 : __SSE_DATATYPE vs_1_2 = _mm_set1_ps(scalarprods[0]) ;
2727 : #endif
2728 : #endif
2729 : #ifdef HAVE_SPARC64_SSE
2730 : #ifdef DOUBLE_PRECISION_REAL
2731 : __SSE_DATATYPE tau2 = _mm_set_pd(hh[ldh], hh[ldh]);
2732 : __SSE_DATATYPE vs_1_2 = _mm_set_pd(scalarprods[0], scalarprods[0]);
2733 : #endif
2734 : #ifdef SINGLE_PRECISION_REAL
2735 : __SSE_DATATYPE tau2 = _mm_set_ps(hh[ldh], hh[ldh]) ;
2736 : __SSE_DATATYPE vs_1_2 = _mm_set_ps(scalarprods[0], scalarprods[0]) ;
2737 : #endif
2738 : #endif
2739 :
2740 :
2741 0 : h2 = _SSE_MUL(tau2, vs_1_2);
2742 :
2743 0 : y1 = _SSE_SUB(_SSE_MUL(y1,tau2), _SSE_MUL(x1,h2));
2744 : #ifdef HAVE_SSE_INTRINSICS
2745 : #ifdef DOUBLE_PRECISION_REAL
2746 0 : __SSE_DATATYPE tau3 = _mm_set1_pd(hh[ldh*2]);
2747 0 : __SSE_DATATYPE vs_1_3 = _mm_set1_pd(scalarprods[1]);
2748 0 : __SSE_DATATYPE vs_2_3 = _mm_set1_pd(scalarprods[2]);
2749 : #endif
2750 : #ifdef SINGLE_PRECISION_REAL
2751 0 : __SSE_DATATYPE tau3 = _mm_set1_ps(hh[ldh*2]) ;
2752 0 : __SSE_DATATYPE vs_1_3 = _mm_set1_ps(scalarprods[1]) ;
2753 0 : __SSE_DATATYPE vs_2_3 = _mm_set1_ps(scalarprods[2]) ;
2754 : #endif
2755 : #endif
2756 : #ifdef HAVE_SPARC64_SSE
2757 : #ifdef DOUBLE_PRECISION_REAL
2758 : __SSE_DATATYPE tau3 = _mm_set_pd(hh[ldh*2], hh[ldh*2]);
2759 : __SSE_DATATYPE vs_1_3 = _mm_set_pd(scalarprods[1], scalarprods[1]);
2760 : __SSE_DATATYPE vs_2_3 = _mm_set_pd(scalarprods[2], scalarprods[2]);
2761 : #endif
2762 : #ifdef SINGLE_PRECISION_REAL
2763 : __SSE_DATATYPE tau3 = _mm_set_ps(hh[ldh*2], hh[ldh*2]) ;
2764 : __SSE_DATATYPE vs_1_3 = _mm_set_ps(scalarprods[1], scalarprods[1]) ;
2765 : __SSE_DATATYPE vs_2_3 = _mm_set_ps(scalarprods[2], scalarprods[2]) ;
2766 : #endif
2767 : #endif
2768 :
2769 :
2770 0 : h2 = _SSE_MUL(tau3, vs_1_3);
2771 0 : h3 = _SSE_MUL(tau3, vs_2_3);
2772 :
2773 0 : z1 = _SSE_SUB(_SSE_MUL(z1,tau3), _SSE_ADD(_SSE_MUL(y1,h3), _SSE_MUL(x1,h2)));
2774 : #ifdef HAVE_SSE_INTRINSICS
2775 : #ifdef DOUBLE_PRECISION_REAL
2776 0 : __SSE_DATATYPE tau4 = _mm_set1_pd(hh[ldh*3]);
2777 0 : __SSE_DATATYPE vs_1_4 = _mm_set1_pd(scalarprods[3]);
2778 0 : __SSE_DATATYPE vs_2_4 = _mm_set1_pd(scalarprods[4]);
2779 : #endif
2780 : #ifdef SINGLE_PRECISION_REAL
2781 0 : __SSE_DATATYPE tau4 = _mm_set1_ps(hh[ldh*3]) ;
2782 0 : __SSE_DATATYPE vs_1_4 = _mm_set1_ps(scalarprods[3]) ;
2783 0 : __SSE_DATATYPE vs_2_4 = _mm_set1_ps(scalarprods[4]) ;
2784 : #endif
2785 : #endif
2786 : #ifdef HAVE_SPARC64_SSE
2787 : #ifdef DOUBLE_PRECISION_REAL
2788 : __SSE_DATATYPE tau4 = _mm_set_pd(hh[ldh*3], hh[ldh*3]);
2789 : __SSE_DATATYPE vs_1_4 = _mm_set_pd(scalarprods[3], scalarprods[3]);
2790 : __SSE_DATATYPE vs_2_4 = _mm_set_pd(scalarprods[4], scalarprods[4]);
2791 : #endif
2792 : #ifdef SINGLE_PRECISION_REAL
2793 : __SSE_DATATYPE tau4 = _mm_set_ps(hh[ldh*3], hh[ldh*3]) ;
2794 : __SSE_DATATYPE vs_1_4 = _mm_set_ps(scalarprods[3], scalarprods[3]) ;
2795 : __SSE_DATATYPE vs_2_4 = _mm_set_ps(scalarprods[4], scalarprods[4]) ;
2796 : #endif
2797 : #endif
2798 :
2799 0 : h2 = _SSE_MUL(tau4, vs_1_4);
2800 0 : h3 = _SSE_MUL(tau4, vs_2_4);
2801 : #ifdef HAVE_SSE_INTRINSICS
2802 : #ifdef DOUBLE_PRECISION_REAL
2803 0 : __SSE_DATATYPE vs_3_4 = _mm_set1_pd(scalarprods[5]);
2804 : #endif
2805 : #ifdef SINGLE_PRECISION_REAL
2806 0 : __SSE_DATATYPE vs_3_4 = _mm_set1_ps(scalarprods[5]) ;
2807 : #endif
2808 : #endif
2809 : #ifdef HAVE_SPARC64_SSE
2810 : #ifdef DOUBLE_PRECISION_REAL
2811 : __SSE_DATATYPE vs_3_4 = _mm_set_pd(scalarprods[5], scalarprods[5]);
2812 : #endif
2813 : #ifdef SINGLE_PRECISION_REAL
2814 : __SSE_DATATYPE vs_3_4 = _mm_set_ps(scalarprods[5], ) ;
2815 : #endif
2816 : #endif
2817 :
2818 0 : h4 = _SSE_MUL(tau4, vs_3_4);
2819 :
2820 0 : w1 = _SSE_SUB(_SSE_MUL(w1,tau4), _SSE_ADD(_SSE_MUL(z1,h4), _SSE_ADD(_SSE_MUL(y1,h3), _SSE_MUL(x1,h2))));
2821 : #ifdef HAVE_SSE_INTRINSICS
2822 : #ifdef DOUBLE_PRECISION_REAL
2823 0 : __SSE_DATATYPE tau5 = _mm_set1_pd(hh[ldh*4]);
2824 0 : __SSE_DATATYPE vs_1_5 = _mm_set1_pd(scalarprods[6]);
2825 0 : __SSE_DATATYPE vs_2_5 = _mm_set1_pd(scalarprods[7]);
2826 : #endif
2827 : #ifdef SINGLE_PRECISION_REAL
2828 0 : __SSE_DATATYPE tau5 = _mm_set1_ps(hh[ldh*4]) ;
2829 0 : __SSE_DATATYPE vs_1_5 = _mm_set1_ps(scalarprods[6]) ;
2830 0 : __SSE_DATATYPE vs_2_5 = _mm_set1_ps(scalarprods[7]) ;
2831 : #endif
2832 : #endif
2833 : #ifdef HAVE_SPARC64_SSE
2834 : #ifdef DOUBLE_PRECISION_REAL
2835 : __SSE_DATATYPE tau5 = _mm_set_pd(hh[ldh*4], hh[ldh*4]);
2836 : __SSE_DATATYPE vs_1_5 = _mm_set_pd(scalarprods[6], scalarprods[6]);
2837 : __SSE_DATATYPE vs_2_5 = _mm_set_pd(scalarprods[7], scalarprods[7]) ;
2838 : #endif
2839 : #ifdef SINGLE_PRECISION_REAL
2840 : __SSE_DATATYPE tau5 = _mm_set_ps(hh[ldh*4], hh[ldh*4]) ;
2841 : __SSE_DATATYPE vs_1_5 = _mm_set_ps(scalarprods[6], scalarprods[6]) ;
2842 : __SSE_DATATYPE vs_2_5 = _mm_set_ps(scalarprods[7], scalarprods[7]) ;
2843 : #endif
2844 : #endif
2845 :
2846 0 : h2 = _SSE_MUL(tau5, vs_1_5);
2847 0 : h3 = _SSE_MUL(tau5, vs_2_5);
2848 : #ifdef HAVE_SSE_INTRINSICS
2849 : #ifdef DOUBLE_PRECISION_REAL
2850 0 : __SSE_DATATYPE vs_3_5 = _mm_set1_pd(scalarprods[8]);
2851 0 : __SSE_DATATYPE vs_4_5 = _mm_set1_pd(scalarprods[9]);
2852 : #endif
2853 : #ifdef SINGLE_PRECISION_REAL
2854 0 : __SSE_DATATYPE vs_3_5 = _mm_set1_ps(scalarprods[8]) ;
2855 0 : __SSE_DATATYPE vs_4_5 = _mm_set1_ps(scalarprods[9]) ;
2856 : #endif
2857 : #endif
2858 : #ifdef HAVE_SPARC64_SSE
2859 : #ifdef DOUBLE_PRECISION_REAL
2860 : __SSE_DATATYPE vs_3_5 = _mm_set_pd(scalarprods[8], scalarprods[8]);
2861 : __SSE_DATATYPE vs_4_5 = _mm_set_pd(scalarprods[9], scalarprods[9]);
2862 : #endif
2863 : #ifdef SINGLE_PRECISION_REAL
2864 : __SSE_DATATYPE vs_3_5 = _mm_set_ps(scalarprods[8], scalarprods[8]) ;
2865 : __SSE_DATATYPE vs_4_5 = _mm_set_ps(scalarprods[9], scalarprods[9]) ;
2866 : #endif
2867 : #endif
2868 :
2869 0 : h4 = _SSE_MUL(tau5, vs_3_5);
2870 0 : h5 = _SSE_MUL(tau5, vs_4_5);
2871 :
2872 0 : v1 = _SSE_SUB(_SSE_MUL(v1,tau5), _SSE_ADD(_SSE_ADD(_SSE_MUL(w1,h5), _SSE_MUL(z1,h4)), _SSE_ADD(_SSE_MUL(y1,h3), _SSE_MUL(x1,h2))));
2873 : #ifdef HAVE_SSE_INTRINSICS
2874 : #ifdef DOUBLE_PRECISION_REAL
2875 0 : __SSE_DATATYPE tau6 = _mm_set1_pd(hh[ldh*5]);
2876 0 : __SSE_DATATYPE vs_1_6 = _mm_set1_pd(scalarprods[10]);
2877 0 : __SSE_DATATYPE vs_2_6 = _mm_set1_pd(scalarprods[11]);
2878 : #endif
2879 : #ifdef SINGLE_PRECISION_REAL
2880 0 : __SSE_DATATYPE tau6 = _mm_set1_ps(hh[ldh*5]) ;
2881 0 : __SSE_DATATYPE vs_1_6 = _mm_set1_ps(scalarprods[10]) ;
2882 0 : __SSE_DATATYPE vs_2_6 = _mm_set1_ps(scalarprods[11]) ;
2883 : #endif
2884 : #endif
2885 : #ifdef HAVE_SPARC64_SSE
2886 : #ifdef DOUBLE_PRECISION_REAL
2887 : __SSE_DATATYPE tau6 = _mm_set_pd(hh[ldh*5], hh[ldh*5]);
2888 : __SSE_DATATYPE vs_1_6 = _mm_set_pd(scalarprods[10], scalarprods[10]);
2889 : __SSE_DATATYPE vs_2_6 = _mm_set_pd(scalarprods[11], scalarprods[11]);
2890 : #endif
2891 : #ifdef SINGLE_PRECISION_REAL
2892 : __SSE_DATATYPE tau6 = _mm_set_ps(hh[ldh*5], hh[ldh*5]) ;
2893 : __SSE_DATATYPE vs_1_6 = _mm_set_ps(scalarprods[10], scalarprods[10]) ;
2894 : __SSE_DATATYPE vs_2_6 = _mm_set_ps(scalarprods[11], scalarprods[11]) ;
2895 : #endif
2896 : #endif
2897 :
2898 0 : h2 = _SSE_MUL(tau6, vs_1_6);
2899 0 : h3 = _SSE_MUL(tau6, vs_2_6);
2900 : #ifdef HAVE_SSE_INTRINSICS
2901 : #ifdef DOUBLE_PRECISION_REAL
2902 0 : __SSE_DATATYPE vs_3_6 = _mm_set1_pd(scalarprods[12]);
2903 0 : __SSE_DATATYPE vs_4_6 = _mm_set1_pd(scalarprods[13]);
2904 0 : __SSE_DATATYPE vs_5_6 = _mm_set1_pd(scalarprods[14]);
2905 : #endif
2906 : #ifdef SINGLE_PRECISION_REAL
2907 0 : __SSE_DATATYPE vs_3_6 = _mm_set1_ps(scalarprods[12]) ;
2908 0 : __SSE_DATATYPE vs_4_6 = _mm_set1_ps(scalarprods[13]) ;
2909 0 : __SSE_DATATYPE vs_5_6 = _mm_set1_ps(scalarprods[14]) ;
2910 : #endif
2911 : #endif
2912 : #ifdef HAVE_SPARC64_SSE
2913 : #ifdef DOUBLE_PRECISION_REAL
2914 : __SSE_DATATYPE vs_3_6 = _mm_set_pd(scalarprods[12], scalarprods[12]);
2915 : __SSE_DATATYPE vs_4_6 = _mm_set_pd(scalarprods[13], scalarprods[13]);
2916 : __SSE_DATATYPE vs_5_6 = _mm_set_pd(scalarprods[14], scalarprods[14]);
2917 : #endif
2918 : #ifdef SINGLE_PRECISION_REAL
2919 : __SSE_DATATYPE vs_3_6 = _mm_set_ps(scalarprods[12], scalarprods[12]) ;
2920 : __SSE_DATATYPE vs_4_6 = _mm_set_ps(scalarprods[13], scalarprods[13]) ;
2921 : __SSE_DATATYPE vs_5_6 = _mm_set_ps(scalarprods[14], scalarprods[14]) ;
2922 : #endif
2923 : #endif
2924 :
2925 :
2926 0 : h4 = _SSE_MUL(tau6, vs_3_6);
2927 0 : h5 = _SSE_MUL(tau6, vs_4_6);
2928 0 : h6 = _SSE_MUL(tau6, vs_5_6);
2929 :
2930 0 : t1 = _SSE_SUB(_SSE_MUL(t1,tau6), _SSE_ADD( _SSE_MUL(v1,h6), _SSE_ADD(_SSE_ADD(_SSE_MUL(w1,h5), _SSE_MUL(z1,h4)), _SSE_ADD(_SSE_MUL(y1,h3), _SSE_MUL(x1,h2)))));
2931 :
2932 : /////////////////////////////////////////////////////
2933 : // Rank-1 update of Q [2 x nb+3]
2934 : /////////////////////////////////////////////////////
2935 :
2936 0 : q1 = _SSE_LOAD(&q[0]);
2937 0 : q1 = _SSE_SUB(q1, t1);
2938 : _SSE_STORE(&q[0],q1);
2939 : #ifdef HAVE_SSE_INTRINSICS
2940 : #ifdef DOUBLE_PRECISION_REAL
2941 0 : h6 = _mm_set1_pd(hh[(ldh*5)+1]);
2942 : #endif
2943 : #ifdef SINGLE_PRECISION_REAL
2944 0 : h6 = _mm_set1_ps(hh[(ldh*5)+1]) ;
2945 : #endif
2946 : #endif
2947 : #ifdef HAVE_SPARC64_SSE
2948 : #ifdef DOUBLE_PRECISION_REAL
2949 : h6 = _mm_set_pd(hh[(ldh*5)+1], hh[(ldh*5)+1]);
2950 : #endif
2951 : #ifdef SINGLE_PRECISION_REAL
2952 : h6 = _mm_set_ps(hh[(ldh*5)+1], hh[(ldh*5)+1]) ;
2953 : #endif
2954 : #endif
2955 :
2956 :
2957 0 : q1 = _SSE_LOAD(&q[ldq]);
2958 0 : q1 = _SSE_SUB(q1, v1);
2959 :
2960 0 : q1 = _SSE_SUB(q1, _SSE_MUL(t1, h6));
2961 :
2962 0 : _SSE_STORE(&q[ldq],q1);
2963 : #ifdef HAVE_SSE_INTRINSICS
2964 : #ifdef DOUBLE_PRECISION_REAL
2965 0 : h5 = _mm_set1_pd(hh[(ldh*4)+1]);
2966 : #endif
2967 : #ifdef SINGLE_PRECISION_REAL
2968 0 : h5 = _mm_set1_ps(hh[(ldh*4)+1]) ;
2969 : #endif
2970 : #endif
2971 : #ifdef HAVE_SPARC64_SSE
2972 : #ifdef DOUBLE_PRECISION_REAL
2973 : h5 = _mm_set_pd(hh[(ldh*4)+1], hh[(ldh*4)+1]);
2974 : #endif
2975 : #ifdef SINGLE_PRECISION_REAL
2976 : h5 = _mm_set_ps(hh[(ldh*4)+1], hh[(ldh*4)+1]) ;
2977 : #endif
2978 : #endif
2979 :
2980 0 : q1 = _SSE_LOAD(&q[ldq*2]);
2981 0 : q1 = _SSE_SUB(q1, w1);
2982 :
2983 0 : q1 = _SSE_SUB(q1, _SSE_MUL(v1, h5));
2984 : #ifdef HAVE_SSE_INTRINSICS
2985 : #ifdef DOUBLE_PRECISION_REAL
2986 0 : h6 = _mm_set1_pd(hh[(ldh*5)+2]);
2987 : #endif
2988 : #ifdef SINGLE_PRECISION_REAL
2989 0 : h6 = _mm_set1_ps(hh[(ldh*5)+2]) ;
2990 : #endif
2991 : #endif
2992 : #ifdef HAVE_SPARC64_SSE
2993 : #ifdef DOUBLE_PRECISION_REAL
2994 : h6 = _mm_set_pd(hh[(ldh*5)+2], hh[(ldh*5)+2]);
2995 : #endif
2996 : #ifdef SINGLE_PRECISION_REAL
2997 : h6 = _mm_set_ps(hh[(ldh*5)+2], hh[(ldh*5)+2]) ;
2998 : #endif
2999 : #endif
3000 :
3001 :
3002 0 : q1 = _SSE_SUB(q1, _SSE_MUL(t1, h6));
3003 :
3004 0 : _SSE_STORE(&q[ldq*2],q1);
3005 : #ifdef HAVE_SSE_INTRINSICS
3006 : #ifdef DOUBLE_PRECISION_REAL
3007 0 : h4 = _mm_set1_pd(hh[(ldh*3)+1]);
3008 : #endif
3009 : #ifdef SINGLE_PRECISION_REAL
3010 0 : h4 = _mm_set1_ps(hh[(ldh*3)+1]) ;
3011 : #endif
3012 : #endif
3013 : #ifdef HAVE_SPARC64_SSE
3014 : #ifdef DOUBLE_PRECISION_REAL
3015 : h4 = _mm_set_pd(hh[(ldh*3)+1], hh[(ldh*3)+1]);
3016 : #endif
3017 : #ifdef SINGLE_PRECISION_REAL
3018 : h4 = _mm_set_ps(hh[(ldh*3)+1], hh[(ldh*3)+1]) ;
3019 : #endif
3020 : #endif
3021 :
3022 :
3023 0 : q1 = _SSE_LOAD(&q[ldq*3]);
3024 0 : q1 = _SSE_SUB(q1, z1);
3025 :
3026 0 : q1 = _SSE_SUB(q1, _SSE_MUL(w1, h4));
3027 : #ifdef HAVE_SSE_INTRINSICS
3028 : #ifdef DOUBLE_PRECISION_REAL
3029 0 : h5 = _mm_set1_pd(hh[(ldh*4)+2]);
3030 : #endif
3031 : #ifdef SINGLE_PRECISION_REAL
3032 0 : h5 = _mm_set1_ps(hh[(ldh*4)+2]) ;
3033 : #endif
3034 : #endif
3035 : #ifdef HAVE_SPARC64_SSE
3036 : #ifdef DOUBLE_PRECISION_REAL
3037 : h5 = _mm_set_pd(hh[(ldh*4)+2], hh[(ldh*4)+2]);
3038 : #endif
3039 : #ifdef SINGLE_PRECISION_REAL
3040 : h5 = _mm_set_ps(hh[(ldh*4)+2], hh[(ldh*4)+2]) ;
3041 : #endif
3042 : #endif
3043 0 : q1 = _SSE_SUB(q1, _SSE_MUL(v1, h5));
3044 : #ifdef HAVE_SSE_INTRINSICS
3045 : #ifdef DOUBLE_PRECISION_REAL
3046 0 : h6 = _mm_set1_pd(hh[(ldh*5)+3]);
3047 : #endif
3048 : #ifdef SINGLE_PRECISION_REAL
3049 0 : h6 = _mm_set1_ps(hh[(ldh*5)+3]) ;
3050 : #endif
3051 : #endif
3052 : #ifdef HAVE_SPARC64_SSE
3053 : #ifdef DOUBLE_PRECISION_REAL
3054 : h6 = _mm_set_pd(hh[(ldh*5)+3], hh[(ldh*5)+3]);
3055 : #endif
3056 : #ifdef SINGLE_PRECISION_REAL
3057 : h6 = _mm_set_ps(hh[(ldh*5)+3], hh[(ldh*5)+3]) ;
3058 : #endif
3059 : #endif
3060 :
3061 :
3062 0 : q1 = _SSE_SUB(q1, _SSE_MUL(t1, h6));
3063 :
3064 0 : _SSE_STORE(&q[ldq*3],q1);
3065 : #ifdef HAVE_SSE_INTRINSICS
3066 : #ifdef DOUBLE_PRECISION_REAL
3067 0 : h3 = _mm_set1_pd(hh[(ldh*2)+1]);
3068 : #endif
3069 : #ifdef SINGLE_PRECISION_REAL
3070 0 : h3 = _mm_set1_ps(hh[(ldh*2)+1]) ;
3071 : #endif
3072 : #endif
3073 : #ifdef HAVE_SPARC64_SSE
3074 : #ifdef DOUBLE_PRECISION_REAL
3075 : h3 = _mm_set_pd(hh[(ldh*2)+1], hh[(ldh*2)+1]);
3076 : #endif
3077 : #ifdef SINGLE_PRECISION_REAL
3078 : h3 = _mm_set_ps(hh[(ldh*2)+1], hh[(ldh*2)+1]) ;
3079 : #endif
3080 : #endif
3081 :
3082 :
3083 0 : q1 = _SSE_LOAD(&q[ldq*4]);
3084 0 : q1 = _SSE_SUB(q1, y1);
3085 :
3086 0 : q1 = _SSE_SUB(q1, _SSE_MUL(z1, h3));
3087 : #ifdef HAVE_SSE_INTRINSICS
3088 : #ifdef DOUBLE_PRECISION_REAL
3089 0 : h4 = _mm_set1_pd(hh[(ldh*3)+2]);
3090 : #endif
3091 : #ifdef SINGLE_PRECISION_REAL
3092 0 : h4 = _mm_set1_ps(hh[(ldh*3)+2]) ;
3093 : #endif
3094 : #endif
3095 : #ifdef HAVE_SPARC64_SSE
3096 : #ifdef DOUBLE_PRECISION_REAL
3097 : h4 = _mm_set_pd(hh[(ldh*3)+2], hh[(ldh*3)+2]);
3098 : #endif
3099 : #ifdef SINGLE_PRECISION_REAL
3100 : h4 = _mm_set_ps(hh[(ldh*3)+2], hh[(ldh*3)+2]) ;
3101 : #endif
3102 : #endif
3103 :
3104 :
3105 0 : q1 = _SSE_SUB(q1, _SSE_MUL(w1, h4));
3106 : #ifdef HAVE_SSE_INTRINSICS
3107 : #ifdef DOUBLE_PRECISION_REAL
3108 0 : h5 = _mm_set1_pd(hh[(ldh*4)+3]);
3109 : #endif
3110 : #ifdef SINGLE_PRECISION_REAL
3111 0 : h5 = _mm_set1_ps(hh[(ldh*4)+3]) ;
3112 : #endif
3113 : #endif
3114 : #ifdef HAVE_SPARC64_SSE
3115 : #ifdef DOUBLE_PRECISION_REAL
3116 : h5 = _mm_set_pd(hh[(ldh*4)+3], hh[(ldh*4)+3]);
3117 : #endif
3118 : #ifdef SINGLE_PRECISION_REAL
3119 : h5 = _mm_set_ps(hh[(ldh*4)+3], hh[(ldh*4)+3]) ;
3120 : #endif
3121 : #endif
3122 :
3123 :
3124 0 : q1 = _SSE_SUB(q1, _SSE_MUL(v1, h5));
3125 : #ifdef HAVE_SSE_INTRINSICS
3126 : #ifdef DOUBLE_PRECISION_REAL
3127 0 : h6 = _mm_set1_pd(hh[(ldh*5)+4]);
3128 : #endif
3129 : #ifdef SINGLE_PRECISION_REAL
3130 0 : h6 = _mm_set1_ps(hh[(ldh*5)+4]) ;
3131 : #endif
3132 : #endif
3133 : #ifdef HAVE_SPARC64_SSE
3134 : #ifdef DOUBLE_PRECISION_REAL
3135 : h6 = _mm_set_pd(hh[(ldh*5)+4], hh[(ldh*5)+4]);
3136 : #endif
3137 : #ifdef SINGLE_PRECISION_REAL
3138 : h6 = _mm_set_ps(hh[(ldh*5)+4], hh[(ldh*5)+4]) ;
3139 : #endif
3140 : #endif
3141 :
3142 :
3143 0 : q1 = _SSE_SUB(q1, _SSE_MUL(t1, h6));
3144 :
3145 0 : _SSE_STORE(&q[ldq*4],q1);
3146 : #ifdef HAVE_SSE_INTRINSICS
3147 : #ifdef DOUBLE_PRECISION_REAL
3148 0 : h2 = _mm_set1_pd(hh[(ldh)+1]);
3149 : #endif
3150 : #ifdef SINGLE_PRECISION_REAL
3151 0 : h2 = _mm_set1_ps(hh[(ldh)+1]) ;
3152 : #endif
3153 : #endif
3154 : #ifdef HAVE_SPARC64_SSE
3155 : #ifdef DOUBLE_PRECISION_REAL
3156 : h2 = _mm_set_pd(hh[(ldh)+1], hh[(ldh)+1]);
3157 : #endif
3158 : #ifdef SINGLE_PRECISION_REAL
3159 : h2 = _mm_set_ps(hh[(ldh)+1], hh[(ldh)+1]) ;
3160 : #endif
3161 : #endif
3162 :
3163 :
3164 0 : q1 = _SSE_LOAD(&q[ldq*5]);
3165 0 : q1 = _SSE_SUB(q1, x1);
3166 :
3167 0 : q1 = _SSE_SUB(q1, _SSE_MUL(y1, h2));
3168 : #ifdef HAVE_SSE_INTRINSICS
3169 : #ifdef DOUBLE_PRECISION_REAL
3170 0 : h3 = _mm_set1_pd(hh[(ldh*2)+2]);
3171 : #endif
3172 : #ifdef SINGLE_PRECISION_REAL
3173 0 : h3 = _mm_set1_ps(hh[(ldh*2)+2]) ;
3174 : #endif
3175 : #endif
3176 : #ifdef HAVE_SPARC64_SSE
3177 : #ifdef DOUBLE_PRECISION_REAL
3178 : h3 = _mm_set_pd(hh[(ldh*2)+2], hh[(ldh*2)+2]);
3179 : #endif
3180 : #ifdef SINGLE_PRECISION_REAL
3181 : h3 = _mm_set_ps(hh[(ldh*2)+2], hh[(ldh*2)+2]) ;
3182 : #endif
3183 : #endif
3184 :
3185 :
3186 0 : q1 = _SSE_SUB(q1, _SSE_MUL(z1, h3));
3187 : #ifdef HAVE_SSE_INTRINSICS
3188 : #ifdef DOUBLE_PRECISION_REAL
3189 0 : h4 = _mm_set1_pd(hh[(ldh*3)+3]);
3190 : #endif
3191 : #ifdef SINGLE_PRECISION_REAL
3192 0 : h4 = _mm_set1_ps(hh[(ldh*3)+3]) ;
3193 : #endif
3194 : #endif
3195 : #ifdef HAVE_SPARC64_SSE
3196 : #ifdef DOUBLE_PRECISION_REAL
3197 : h4 = _mm_set_pd(hh[(ldh*3)+3], hh[(ldh*3)+3]);
3198 : #endif
3199 : #ifdef SINGLE_PRECISION_REAL
3200 : h4 = _mm_set_ps(hh[(ldh*3)+3], hh[(ldh*3)+3]) ;
3201 : #endif
3202 : #endif
3203 :
3204 :
3205 0 : q1 = _SSE_SUB(q1, _SSE_MUL(w1, h4));
3206 : #ifdef HAVE_SSE_INTRINSICS
3207 : #ifdef DOUBLE_PRECISION_REAL
3208 0 : h5 = _mm_set1_pd(hh[(ldh*4)+4]);
3209 : #endif
3210 : #ifdef SINGLE_PRECISION_REAL
3211 0 : h5 = _mm_set1_ps(hh[(ldh*4)+4]) ;
3212 : #endif
3213 : #endif
3214 : #ifdef HAVE_SPARC64_SSE
3215 : #ifdef DOUBLE_PRECISION_REAL
3216 : h5 = _mm_set_pd(hh[(ldh*4)+4], hh[(ldh*4)+4]);
3217 : #endif
3218 : #ifdef SINGLE_PRECISION_REAL
3219 : h5 = _mm_set_ps(hh[(ldh*4)+4], hh[(ldh*4)+4]) ;
3220 : #endif
3221 : #endif
3222 :
3223 :
3224 0 : q1 = _SSE_SUB(q1, _SSE_MUL(v1, h5));
3225 : #ifdef HAVE_SSE_INTRINSICS
3226 : #ifdef DOUBLE_PRECISION_REAL
3227 0 : h6 = _mm_set1_pd(hh[(ldh*5)+5]);
3228 : #endif
3229 : #ifdef SINGLE_PRECISION_REAL
3230 0 : h6 = _mm_set1_ps(hh[(ldh*5)+5]) ;
3231 : #endif
3232 : #endif
3233 : #ifdef HAVE_SPARC64_SSE
3234 : #ifdef DOUBLE_PRECISION_REAL
3235 : h6 = _mm_set_pd(hh[(ldh*5)+5], hh[(ldh*5)+5]);
3236 : #endif
3237 : #ifdef SINGLE_PRECISION_REAL
3238 : h6 = _mm_set_ps(hh[(ldh*5)+5], hh[(ldh*5)+5]) ;
3239 : #endif
3240 : #endif
3241 0 : q1 = _SSE_SUB(q1, _SSE_MUL(t1, h6));
3242 :
3243 0 : _SSE_STORE(&q[ldq*5],q1);
3244 :
3245 0 : for (i = 6; i < nb; i++)
3246 : {
3247 0 : q1 = _SSE_LOAD(&q[i*ldq]);
3248 : #ifdef HAVE_SSE_INTRINSICS
3249 : #ifdef DOUBLE_PRECISION_REAL
3250 0 : h1 = _mm_set1_pd(hh[i-5]);
3251 : #endif
3252 : #ifdef SINGLE_PRECISION_REAL
3253 0 : h1 = _mm_set1_ps(hh[i-5]) ;
3254 : #endif
3255 : #endif
3256 : #ifdef HAVE_SPARC64_SSE
3257 : #ifdef DOUBLE_PRECISION_REAL
3258 : h1 = _mm_set_pd(hh[i-5], hh[i-5]);
3259 : #endif
3260 : #ifdef SINGLE_PRECISION_REAL
3261 : h1 = _mm_set_ps(hh[i-5], hh[i-5]) ;
3262 : #endif
3263 : #endif
3264 :
3265 :
3266 0 : q1 = _SSE_SUB(q1, _SSE_MUL(x1, h1));
3267 : #ifdef HAVE_SSE_INTRINSICS
3268 : #ifdef DOUBLE_PRECISION_REAL
3269 0 : h2 = _mm_set1_pd(hh[ldh+i-4]);
3270 : #endif
3271 : #ifdef SINGLE_PRECISION_REAL
3272 0 : h2 = _mm_set1_ps(hh[ldh+i-4]) ;
3273 : #endif
3274 : #endif
3275 : #ifdef HAVE_SPARC64_SSE
3276 : #ifdef DOUBLE_PRECISION_REAL
3277 : h2 = _mm_set_pd(hh[ldh+i-4], hh[ldh+i-4]);
3278 : #endif
3279 : #ifdef SINGLE_PRECISION_REAL
3280 : h2 = _mm_set_ps(hh[ldh+i-4], hh[ldh+i-4]) ;
3281 : #endif
3282 : #endif
3283 :
3284 :
3285 0 : q1 = _SSE_SUB(q1, _SSE_MUL(y1, h2));
3286 : #ifdef HAVE_SSE_INTRINSICS
3287 : #ifdef DOUBLE_PRECISION_REAL
3288 0 : h3 = _mm_set1_pd(hh[(ldh*2)+i-3]);
3289 : #endif
3290 : #ifdef SINGLE_PRECISION_REAL
3291 0 : h3 = _mm_set1_ps(hh[(ldh*2)+i-3]) ;
3292 : #endif
3293 : #endif
3294 : #ifdef HAVE_SPARC64_SSE
3295 : #ifdef DOUBLE_PRECISION_REAL
3296 : h3 = _mm_set_pd(hh[(ldh*2)+i-3], hh[(ldh*2)+i-3]);
3297 : #endif
3298 : #ifdef SINGLE_PRECISION_REAL
3299 : h3 = _mm_set_ps(hh[(ldh*2)+i-3], hh[(ldh*2)+i-3]) ;
3300 : #endif
3301 : #endif
3302 :
3303 :
3304 0 : q1 = _SSE_SUB(q1, _SSE_MUL(z1, h3));
3305 : #ifdef HAVE_SSE_INTRINSICS
3306 : #ifdef DOUBLE_PRECISION_REAL
3307 0 : h4 = _mm_set1_pd(hh[(ldh*3)+i-2]);
3308 : #endif
3309 : #ifdef SINGLE_PRECISION_REAL
3310 0 : h4 = _mm_set1_ps(hh[(ldh*3)+i-2]) ;
3311 : #endif
3312 : #endif
3313 : #ifdef HAVE_SPARC64_SSE
3314 : #ifdef DOUBLE_PRECISION_REAL
3315 : h4 = _mm_set_pd(hh[(ldh*3)+i-2], hh[(ldh*3)+i-2]);
3316 : #endif
3317 : #ifdef SINGLE_PRECISION_REAL
3318 : h4 = _mm_set_ps(hh[(ldh*3)+i-2], hh[(ldh*3)+i-2]) ;
3319 : #endif
3320 : #endif
3321 :
3322 :
3323 0 : q1 = _SSE_SUB(q1, _SSE_MUL(w1, h4));
3324 : #ifdef HAVE_SSE_INTRINSICS
3325 : #ifdef DOUBLE_PRECISION_REAL
3326 0 : h5 = _mm_set1_pd(hh[(ldh*4)+i-1]);
3327 : #endif
3328 : #ifdef SINGLE_PRECISION_REAL
3329 0 : h5 = _mm_set1_ps(hh[(ldh*4)+i-1]) ;
3330 : #endif
3331 : #endif
3332 : #ifdef HAVE_SPARC64_SSE
3333 : #ifdef DOUBLE_PRECISION_REAL
3334 : h5 = _mm_set_pd(hh[(ldh*4)+i-1], hh[(ldh*4)+i-1]);
3335 : #endif
3336 : #ifdef SINGLE_PRECISION_REAL
3337 : h5 = _mm_set_ps(hh[(ldh*4)+i-1], hh[(ldh*4)+i-1]) ;
3338 : #endif
3339 : #endif
3340 :
3341 :
3342 0 : q1 = _SSE_SUB(q1, _SSE_MUL(v1, h5));
3343 : #ifdef HAVE_SSE_INTRINSICS
3344 : #ifdef DOUBLE_PRECISION_REAL
3345 0 : h6 = _mm_set1_pd(hh[(ldh*5)+i]);
3346 : #endif
3347 : #ifdef SINGLE_PRECISION_REAL
3348 0 : h6 = _mm_set1_ps(hh[(ldh*5)+i]) ;
3349 : #endif
3350 : #endif
3351 : #ifdef HAVE_SPARC64_SSE
3352 : #ifdef DOUBLE_PRECISION_REAL
3353 : h6 = _mm_set_pd(hh[(ldh*5)+i], hh[(ldh*5)+i]);
3354 : #endif
3355 : #ifdef SINGLE_PRECISION_REAL
3356 : h6 = _mm_set_ps(hh[(ldh*5)+i], hh[(ldh*5)+i]) ;
3357 : #endif
3358 : #endif
3359 :
3360 :
3361 0 : q1 = _SSE_SUB(q1, _SSE_MUL(t1, h6));
3362 :
3363 0 : _SSE_STORE(&q[i*ldq],q1);
3364 : }
3365 : #ifdef HAVE_SSE_INTRINSICS
3366 : #ifdef DOUBLE_PRECISION_REAL
3367 0 : h1 = _mm_set1_pd(hh[nb-5]);
3368 : #endif
3369 : #ifdef SINGLE_PRECISION_REAL
3370 0 : h1 = _mm_set1_ps(hh[nb-5]) ;
3371 : #endif
3372 : #endif
3373 : #ifdef HAVE_SPARC64_SSE
3374 : #ifdef DOUBLE_PRECISION_REAL
3375 : h1 = _mm_set_pd(hh[nb-5], hh[nb-5]);
3376 : #endif
3377 : #ifdef SINGLE_PRECISION_REAL
3378 : h1 = _mm_set_ps(hh[nb-5], hh[nb-5]) ;
3379 : #endif
3380 : #endif
3381 :
3382 :
3383 0 : q1 = _SSE_LOAD(&q[nb*ldq]);
3384 :
3385 0 : q1 = _SSE_SUB(q1, _SSE_MUL(x1, h1));
3386 : #ifdef HAVE_SSE_INTRINSICS
3387 : #ifdef DOUBLE_PRECISION_REAL
3388 0 : h2 = _mm_set1_pd(hh[ldh+nb-4]);
3389 : #endif
3390 : #ifdef SINGLE_PRECISION_REAL
3391 0 : h2 = _mm_set1_ps(hh[ldh+nb-4]) ;
3392 : #endif
3393 : #endif
3394 : #ifdef HAVE_SPARC64_SSE
3395 : #ifdef DOUBLE_PRECISION_REAL
3396 : h2 = _mm_set_pd(hh[ldh+nb-4], hh[ldh+nb-4]);
3397 : #endif
3398 : #ifdef SINGLE_PRECISION_REAL
3399 : h2 = _mm_set_ps(hh[ldh+nb-4], hh[ldh+nb-4]) ;
3400 : #endif
3401 : #endif
3402 :
3403 :
3404 0 : q1 = _SSE_SUB(q1, _SSE_MUL(y1, h2));
3405 : #ifdef HAVE_SSE_INTRINSICS
3406 : #ifdef DOUBLE_PRECISION_REAL
3407 0 : h3 = _mm_set1_pd(hh[(ldh*2)+nb-3]);
3408 : #endif
3409 : #ifdef SINGLE_PRECISION_REAL
3410 0 : h3 = _mm_set1_ps(hh[(ldh*2)+nb-3]) ;
3411 : #endif
3412 : #endif
3413 : #ifdef HAVE_SPARC64_SSE
3414 : #ifdef DOUBLE_PRECISION_REAL
3415 : h3 = _mm_set_pd(hh[(ldh*2)+nb-3], hh[(ldh*2)+nb-3]);
3416 : #endif
3417 : #ifdef SINGLE_PRECISION_REAL
3418 : h3 = _mm_set_ps(hh[(ldh*2)+nb-3], hh[(ldh*2)+nb-3]) ;
3419 : #endif
3420 : #endif
3421 :
3422 :
3423 0 : q1 = _SSE_SUB(q1, _SSE_MUL(z1, h3));
3424 : #ifdef HAVE_SSE_INTRINSICS
3425 : #ifdef DOUBLE_PRECISION_REAL
3426 0 : h4 = _mm_set1_pd(hh[(ldh*3)+nb-2]);
3427 : #endif
3428 : #ifdef SINGLE_PRECISION_REAL
3429 0 : h4 = _mm_set1_ps(hh[(ldh*3)+nb-2]) ;
3430 : #endif
3431 : #endif
3432 : #ifdef HAVE_SPARC64_SSE
3433 : #ifdef DOUBLE_PRECISION_REAL
3434 : h4 = _mm_set_pd(hh[(ldh*3)+nb-2], hh[(ldh*3)+nb-2]);
3435 : #endif
3436 : #ifdef SINGLE_PRECISION_REAL
3437 : h4 = _mm_set_ps(hh[(ldh*3)+nb-2], hh[(ldh*3)+nb-2]) ;
3438 : #endif
3439 : #endif
3440 :
3441 :
3442 0 : q1 = _SSE_SUB(q1, _SSE_MUL(w1, h4));
3443 : #ifdef HAVE_SSE_INTRINSICS
3444 : #ifdef DOUBLE_PRECISION_REAL
3445 0 : h5 = _mm_set1_pd(hh[(ldh*4)+nb-1]);
3446 : #endif
3447 : #ifdef SINGLE_PRECISION_REAL
3448 0 : h5 = _mm_set1_ps(hh[(ldh*4)+nb-1]) ;
3449 : #endif
3450 : #endif
3451 : #ifdef HAVE_SPARC64_SSE
3452 : #ifdef DOUBLE_PRECISION_REAL
3453 : h5 = _mm_set_pd(hh[(ldh*4)+nb-1], hh[(ldh*4)+nb-1]);
3454 : #endif
3455 : #ifdef SINGLE_PRECISION_REAL
3456 : h5 = _mm_set_ps(hh[(ldh*4)+nb-1], hh[(ldh*4)+nb-1]) ;
3457 : #endif
3458 : #endif
3459 :
3460 :
3461 0 : q1 = _SSE_SUB(q1, _SSE_MUL(v1, h5));
3462 :
3463 0 : _SSE_STORE(&q[nb*ldq],q1);
3464 : #ifdef HAVE_SSE_INTRINSICS
3465 : #ifdef DOUBLE_PRECISION_REAL
3466 0 : h1 = _mm_set1_pd(hh[nb-4]);
3467 : #endif
3468 : #ifdef SINGLE_PRECISION_REAL
3469 0 : h1 = _mm_set1_ps(hh[nb-4]) ;
3470 : #endif
3471 : #endif
3472 : #ifdef HAVE_SPARC64_SSE
3473 : #ifdef DOUBLE_PRECISION_REAL
3474 : h1 = _mm_set_pd(hh[nb-4], hh[nb-4]);
3475 : #endif
3476 : #ifdef SINGLE_PRECISION_REAL
3477 : h1 = _mm_set_ps(hh[nb-4], hh[nb-4]) ;
3478 : #endif
3479 : #endif
3480 :
3481 0 : q1 = _SSE_LOAD(&q[(nb+1)*ldq]);
3482 :
3483 0 : q1 = _SSE_SUB(q1, _SSE_MUL(x1, h1));
3484 : #ifdef HAVE_SSE_INTRINSICS
3485 : #ifdef DOUBLE_PRECISION_REAL
3486 0 : h2 = _mm_set1_pd(hh[ldh+nb-3]);
3487 : #endif
3488 : #ifdef SINGLE_PRECISION_REAL
3489 0 : h2 = _mm_set1_ps(hh[ldh+nb-3]) ;
3490 : #endif
3491 : #endif
3492 : #ifdef HAVE_SPARC64_SSE
3493 : #ifdef DOUBLE_PRECISION_REAL
3494 : h2 = _mm_set_pd(hh[ldh+nb-3], hh[ldh+nb-3]);
3495 : #endif
3496 : #ifdef SINGLE_PRECISION_REAL
3497 : h2 = _mm_set_ps(hh[ldh+nb-3], hh[ldh+nb-3]) ;
3498 : #endif
3499 : #endif
3500 :
3501 :
3502 0 : q1 = _SSE_SUB(q1, _SSE_MUL(y1, h2));
3503 : #ifdef HAVE_SSE_INTRINSICS
3504 : #ifdef DOUBLE_PRECISION_REAL
3505 0 : h3 = _mm_set1_pd(hh[(ldh*2)+nb-2]);
3506 : #endif
3507 : #ifdef SINGLE_PRECISION_REAL
3508 0 : h3 = _mm_set1_ps(hh[(ldh*2)+nb-2]) ;
3509 : #endif
3510 : #endif
3511 : #ifdef HAVE_SPARC64_SSE
3512 : #ifdef DOUBLE_PRECISION_REAL
3513 : h3 = _mm_set_pd(hh[(ldh*2)+nb-2], hh[(ldh*2)+nb-2]);
3514 : #endif
3515 : #ifdef SINGLE_PRECISION_REAL
3516 : h3 = _mm_set_ps(hh[(ldh*2)+nb-2], hh[(ldh*2)+nb-2]) ;
3517 : #endif
3518 : #endif
3519 :
3520 :
3521 0 : q1 = _SSE_SUB(q1, _SSE_MUL(z1, h3));
3522 : #ifdef HAVE_SSE_INTRINSICS
3523 : #ifdef DOUBLE_PRECISION_REAL
3524 0 : h4 = _mm_set1_pd(hh[(ldh*3)+nb-1]);
3525 : #endif
3526 : #ifdef SINGLE_PRECISION_REAL
3527 0 : h4 = _mm_set1_ps(hh[(ldh*3)+nb-1]) ;
3528 : #endif
3529 : #endif
3530 : #ifdef HAVE_SPARC64_SSE
3531 : #ifdef DOUBLE_PRECISION_REAL
3532 : h4 = _mm_set_pd(hh[(ldh*3)+nb-1], hh[(ldh*3)+nb-1]);
3533 : #endif
3534 : #ifdef SINGLE_PRECISION_REAL
3535 : h4 = _mm_set_ps(hh[(ldh*3)+nb-1], hh[(ldh*3)+nb-1]) ;
3536 : #endif
3537 : #endif
3538 :
3539 :
3540 0 : q1 = _SSE_SUB(q1, _SSE_MUL(w1, h4));
3541 :
3542 0 : _SSE_STORE(&q[(nb+1)*ldq],q1);
3543 : #ifdef HAVE_SSE_INTRINSICS
3544 : #ifdef DOUBLE_PRECISION_REAL
3545 0 : h1 = _mm_set1_pd(hh[nb-3]);
3546 : #endif
3547 : #ifdef SINGLE_PRECISION_REAL
3548 0 : h1 = _mm_set1_ps(hh[nb-3]) ;
3549 : #endif
3550 : #endif
3551 : #ifdef HAVE_SPARC64_SSE
3552 : #ifdef DOUBLE_PRECISION_REAL
3553 : h1 = _mm_set_pd(hh[nb-3], hh[nb-3]);
3554 : #endif
3555 : #ifdef SINGLE_PRECISION_REAL
3556 : h1 = _mm_set_ps(hh[nb-3], hh[nb-3]) ;
3557 : #endif
3558 : #endif
3559 :
3560 :
3561 0 : q1 = _SSE_LOAD(&q[(nb+2)*ldq]);
3562 :
3563 0 : q1 = _SSE_SUB(q1, _SSE_MUL(x1, h1));
3564 : #ifdef HAVE_SSE_INTRINSICS
3565 : #ifdef DOUBLE_PRECISION_REAL
3566 0 : h2 = _mm_set1_pd(hh[ldh+nb-2]);
3567 : #endif
3568 : #ifdef SINGLE_PRECISION_REAL
3569 0 : h2 = _mm_set1_ps(hh[ldh+nb-2]) ;
3570 : #endif
3571 : #endif
3572 : #ifdef HAVE_SPARC64_SSE
3573 : #ifdef DOUBLE_PRECISION_REAL
3574 : h2 = _mm_set_pd(hh[ldh+nb-2], hh[ldh+nb-2]);
3575 : #endif
3576 : #ifdef SINGLE_PRECISION_REAL
3577 : h2 = _mm_set_ps(hh[ldh+nb-2], hh[ldh+nb-2]) ;
3578 : #endif
3579 : #endif
3580 :
3581 :
3582 0 : q1 = _SSE_SUB(q1, _SSE_MUL(y1, h2));
3583 : #ifdef HAVE_SSE_INTRINSICS
3584 : #ifdef DOUBLE_PRECISION_REAL
3585 0 : h3 = _mm_set1_pd(hh[(ldh*2)+nb-1]);
3586 : #endif
3587 : #ifdef SINGLE_PRECISION_REAL
3588 0 : h3 = _mm_set1_ps(hh[(ldh*2)+nb-1]) ;
3589 : #endif
3590 : #endif
3591 : #ifdef HAVE_SPARC64_SSE
3592 : #ifdef DOUBLE_PRECISION_REAL
3593 : h3 = _mm_set_pd(hh[(ldh*2)+nb-1], hh[(ldh*2)+nb-1]);
3594 : #endif
3595 : #ifdef SINGLE_PRECISION_REAL
3596 : h3 = _mm_set_ps(hh[(ldh*2)+nb-1], hh[(ldh*2)+nb-1]) ;
3597 : #endif
3598 : #endif
3599 :
3600 :
3601 0 : q1 = _SSE_SUB(q1, _SSE_MUL(z1, h3));
3602 :
3603 0 : _SSE_STORE(&q[(nb+2)*ldq],q1);
3604 : #ifdef HAVE_SSE_INTRINSICS
3605 : #ifdef DOUBLE_PRECISION_REAL
3606 0 : h1 = _mm_set1_pd(hh[nb-2]);
3607 : #endif
3608 : #ifdef SINGLE_PRECISION_REAL
3609 0 : h1 = _mm_set1_ps(hh[nb-2]) ;
3610 : #endif
3611 : #endif
3612 : #ifdef HAVE_SPARC64_SSE
3613 : #ifdef DOUBLE_PRECISION_REAL
3614 : h1 = _mm_set_pd(hh[nb-2], hh[nb-2]);
3615 : #endif
3616 : #ifdef SINGLE_PRECISION_REAL
3617 : h1 = _mm_set_ps(hh[nb-2], hh[nb-2]) ;
3618 : #endif
3619 : #endif
3620 :
3621 :
3622 0 : q1 = _SSE_LOAD(&q[(nb+3)*ldq]);
3623 :
3624 0 : q1 = _SSE_SUB(q1, _SSE_MUL(x1, h1));
3625 : #ifdef HAVE_SSE_INTRINSICS
3626 : #ifdef DOUBLE_PRECISION_REAL
3627 0 : h2 = _mm_set1_pd(hh[ldh+nb-1]);
3628 : #endif
3629 : #ifdef SINGLE_PRECISION_REAL
3630 0 : h2 = _mm_set1_ps(hh[ldh+nb-1]) ;
3631 : #endif
3632 : #endif
3633 : #ifdef HAVE_SPARC64_SSE
3634 : #ifdef DOUBLE_PRECISION_REAL
3635 : h2 = _mm_set_pd(hh[ldh+nb-1], hh[ldh+nb-1]);
3636 : #endif
3637 : #ifdef SINGLE_PRECISION_REAL
3638 : h2 = _mm_set_ps(hh[ldh+nb-1], hh[ldh+nb-1]) ;
3639 : #endif
3640 : #endif
3641 :
3642 :
3643 0 : q1 = _SSE_SUB(q1, _SSE_MUL(y1, h2));
3644 :
3645 0 : _SSE_STORE(&q[(nb+3)*ldq],q1);
3646 : #ifdef HAVE_SSE_INTRINSICS
3647 : #ifdef DOUBLE_PRECISION_REAL
3648 0 : h1 = _mm_set1_pd(hh[nb-1]);
3649 : #endif
3650 : #ifdef SINGLE_PRECISION_REAL
3651 0 : h1 = _mm_set1_ps(hh[nb-1]) ;
3652 : #endif
3653 : #endif
3654 : #ifdef HAVE_SPARC64_SSE
3655 : #ifdef DOUBLE_PRECISION_REAL
3656 : h1 = _mm_set_pd(hh[nb-1], hh[nb-1]);
3657 : #endif
3658 : #ifdef SINGLE_PRECISION_REAL
3659 : h1 = _mm_set_ps(hh[nb-1], hh[nb-1]) ;
3660 : #endif
3661 : #endif
3662 :
3663 0 : q1 = _SSE_LOAD(&q[(nb+4)*ldq]);
3664 :
3665 0 : q1 = _SSE_SUB(q1, _SSE_MUL(x1, h1));
3666 :
3667 0 : _SSE_STORE(&q[(nb+4)*ldq],q1);
3668 : }
|