LCOV - code coverage report
Current view: top level - src/elpa2/kernels - real_sse_6hv_template.c (source / functions) Hit Total Coverage
Test: coverage_50ab7a7628bba174fc62cee3ab72b26e81f87fe5.info Lines: 547 876 62.4 %
Date: 2018-01-10 09:29:53 Functions: 2 2 100.0 %

          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             : }

Generated by: LCOV version 1.12