Commit 7539a343 authored by Andreas Marek's avatar Andreas Marek
Browse files

Cleanup of real SSE block4 kernel

parent 3e7d1972
......@@ -80,6 +80,8 @@
#define _SSE_SUB _mm_sub_pd
#define _SSE_MUL _mm_mul_pd
#define _SSE_STORE _mm_store_pd
#define _SSE_SET _mm_set_pd
#define _SSE_SET1 _mm_set1_pd
#endif
#ifdef SINGLE_PRECISION_REAL
#define offset 4
......@@ -89,6 +91,8 @@
#define _SSE_SUB _mm_sub_ps
#define _SSE_MUL _mm_mul_ps
#define _SSE_STORE _mm_store_ps
#define _SSE_SET1 _mm_set1_ps
#define _SSE_SET _mm_set_ps
#endif
#define __forceinline __attribute__((always_inline)) static
......@@ -228,12 +232,12 @@ void quad_hh_trafo_real_sparc64_4hv_single(float* q, float* hh, int* pnb, int* p
// calculating scalar products to compute
// 4 householder vectors simultaneously
#ifdef DOUBLE_PRECISION_REAL
double s_1_2 = hh[(ldh)+1];
double s_1_3 = hh[(ldh*2)+2];
double s_2_3 = hh[(ldh*2)+1];
double s_1_4 = hh[(ldh*3)+3];
double s_2_4 = hh[(ldh*3)+2];
double s_3_4 = hh[(ldh*3)+1];
double s_1_2 = hh[(ldh)+1]; // hh(2,2)
double s_1_3 = hh[(ldh*2)+2]; // hh(3,3)
double s_2_3 = hh[(ldh*2)+1]; // hh(2,3)
double s_1_4 = hh[(ldh*3)+3]; // hh(4,4)
double s_2_4 = hh[(ldh*3)+2]; // hh(3,4)
double s_3_4 = hh[(ldh*3)+1]; // hh(2,4)
#endif
#ifdef SINGLE_PRECISION_REAL
float s_1_2 = hh[(ldh)+1];
......@@ -245,29 +249,29 @@ void quad_hh_trafo_real_sparc64_4hv_single(float* q, float* hh, int* pnb, int* p
#endif
// calculate scalar product of first and fourth householder Vector
// loop counter = 2
s_1_2 += hh[2-1] * hh[(2+ldh)];
s_2_3 += hh[(ldh)+2-1] * hh[2+(ldh*2)];
s_3_4 += hh[(ldh*2)+2-1] * hh[2+(ldh*3)];
s_1_2 += hh[2-1] * hh[(2+ldh)]; // s_1_2 = s_1_2 + hh(2,1) * hh(3,2)
s_2_3 += hh[(ldh)+2-1] * hh[2+(ldh*2)]; // s_2_3 = s_2_3 + hh(2,2) * hh(3,3)
s_3_4 += hh[(ldh*2)+2-1] * hh[2+(ldh*3)]; // s_3_4 = s_3_4 + hh(2,3) * hh(3,4)
// loop counter = 3
s_1_2 += hh[3-1] * hh[(3+ldh)];
s_2_3 += hh[(ldh)+3-1] * hh[3+(ldh*2)];
s_3_4 += hh[(ldh*2)+3-1] * hh[3+(ldh*3)];
s_1_2 += hh[3-1] * hh[(3+ldh)]; // s_1_2 = s_1_2 + hh(3,1) * hh(4,2)
s_2_3 += hh[(ldh)+3-1] * hh[3+(ldh*2)]; // s_2_3 = s_2_3 + hh(3,2) * hh(4,3)
s_3_4 += hh[(ldh*2)+3-1] * hh[3+(ldh*3)]; // s_3_4 = s_3_4 + hh(3,3) * hh(4,4)
s_1_3 += hh[3-2] * hh[3+(ldh*2)];
s_2_4 += hh[(ldh*1)+3-2] * hh[3+(ldh*3)];
s_1_3 += hh[3-2] * hh[3+(ldh*2)]; // s_1_3 = s_1_3 + hh(2,1) * hh(4,3)
s_2_4 += hh[(ldh*1)+3-2] * hh[3+(ldh*3)]; // s_2_4 = s_2_4 + hh(2,2) * hh(4,4)
#pragma ivdep
for (i = 4; i < nb; i++)
for (i = 4; i < nb; i++) // do i = 5, nb
{
s_1_2 += hh[i-1] * hh[(i+ldh)];
s_2_3 += hh[(ldh)+i-1] * hh[i+(ldh*2)];
s_3_4 += hh[(ldh*2)+i-1] * hh[i+(ldh*3)];
s_1_2 += hh[i-1] * hh[(i+ldh)]; // s_1_2 = s_1_2 + hh(i-1,1) * hh(i,2)
s_2_3 += hh[(ldh)+i-1] * hh[i+(ldh*2)]; // s_2_3 = s_2_3 + hh(i-1,2) * hh(i,3)
s_3_4 += hh[(ldh*2)+i-1] * hh[i+(ldh*3)]; // s_3_4 = s_3_4 + hh(i-1,3) * hh(i,4)
s_1_3 += hh[i-2] * hh[i+(ldh*2)];
s_2_4 += hh[(ldh*1)+i-2] * hh[i+(ldh*3)];
s_1_3 += hh[i-2] * hh[i+(ldh*2)]; // s_1_3 = s_1_3 + hh(i-2,1) * hh(i,3)
s_2_4 += hh[(ldh*1)+i-2] * hh[i+(ldh*3)]; // s_2_4 = s_2_4 + hh(i-2,2) * hh(i,4)
s_1_4 += hh[i-3] * hh[i+(ldh*3)];
s_1_4 += hh[i-3] * hh[i+(ldh*3)]; // s_1_4 = s_1_4 + hh(i-3,1) * hh(i,4)
}
// Production level kernel calls with padding
......@@ -404,62 +408,40 @@ __forceinline void hh_trafo_kernel_12_SPARC64_4hv_single(float* q, float* hh, in
/////////////////////////////////////////////////////
int i;
__SSE_DATATYPE a1_1 = _SSE_LOAD(&q[ldq*3]);
__SSE_DATATYPE a2_1 = _SSE_LOAD(&q[ldq*2]);
__SSE_DATATYPE a3_1 = _SSE_LOAD(&q[ldq]);
__SSE_DATATYPE a4_1 = _SSE_LOAD(&q[0]);
__SSE_DATATYPE a1_1 = _SSE_LOAD(&q[ldq*3]); // a_1_1 = q(1,4)
__SSE_DATATYPE a2_1 = _SSE_LOAD(&q[ldq*2]); // a_2_1 = q(1,3)
__SSE_DATATYPE a3_1 = _SSE_LOAD(&q[ldq]); // a_3_1 = q(1,2)
__SSE_DATATYPE a4_1 = _SSE_LOAD(&q[0]); // a_4_1 = q(1,1)
#ifdef HAVE_SSE_INTRINSICS
#ifdef DOUBLE_PRECISION_REAL
__SSE_DATATYPE h_2_1 = _mm_set1_pd(hh[ldh+1]);
__SSE_DATATYPE h_3_2 = _mm_set1_pd(hh[(ldh*2)+1]);
__SSE_DATATYPE h_3_1 = _mm_set1_pd(hh[(ldh*2)+2]);
__SSE_DATATYPE h_4_3 = _mm_set1_pd(hh[(ldh*3)+1]);
__SSE_DATATYPE h_4_2 = _mm_set1_pd(hh[(ldh*3)+2]);
__SSE_DATATYPE h_4_1 = _mm_set1_pd(hh[(ldh*3)+3]);
#endif
#ifdef SINGLE_PRECISION_REAL
__m128 h_2_1 = _mm_set1_ps(hh[ldh+1] ); // h_2_1 contains four times hh[ldh+1]
__m128 h_3_2 = _mm_set1_ps(hh[(ldh*2)+1]);
__m128 h_3_1 = _mm_set1_ps(hh[(ldh*2)+2]);
__m128 h_4_3 = _mm_set1_ps(hh[(ldh*3)+1]);
__m128 h_4_2 = _mm_set1_ps(hh[(ldh*3)+2]);
__m128 h_4_1 = _mm_set1_ps(hh[(ldh*3)+3]);
#endif
__SSE_DATATYPE h_2_1 = _SSE_SET1(hh[ldh+1]); // h_2_1 = hh(2,2)
__SSE_DATATYPE h_3_2 = _SSE_SET1(hh[(ldh*2)+1]); // h_3_2 = hh(2,3)
__SSE_DATATYPE h_3_1 = _SSE_SET1(hh[(ldh*2)+2]); // h_3_1 = hh(3,3)
__SSE_DATATYPE h_4_3 = _SSE_SET1(hh[(ldh*3)+1]); // h_4_3 = hh(2,4)
__SSE_DATATYPE h_4_2 = _SSE_SET1(hh[(ldh*3)+2]); // h_4_2 = hh(3,4)
__SSE_DATATYPE h_4_1 = _SSE_SET1(hh[(ldh*3)+3]); // h_4_1 = hh(4,4)
#endif
#ifdef HAVE_SPARC64_SSE
#ifdef DOUBLE_PRECISION_REAL
__SSE_DATATYPE h_2_1 = _mm_set_pd(hh[ldh+1], hh[ldh+1]);
__SSE_DATATYPE h_3_2 = _mm_set_pd(hh[(ldh*2)+1], hh[(ldh*2)+1]);
__SSE_DATATYPE h_3_1 = _mm_set_pd(hh[(ldh*2)+2], hh[(ldh*2)+2]);
__SSE_DATATYPE h_4_3 = _mm_set_pd(hh[(ldh*3)+1], hh[(ldh*3)+1]);
__SSE_DATATYPE h_4_2 = _mm_set_pd(hh[(ldh*3)+2], hh[(ldh*3)+2]);
__SSE_DATATYPE h_4_1 = _mm_set_pd(hh[(ldh*3)+3], hh[(ldh*3)+3]);
#endif
#ifdef SINGLE_PRECISION_REAL
__m128 h_2_1 = _mm_set_ps(hh[ldh+1], hh[ldh+1]); // h_2_1 contains four times hh[ldh+1]
__m128 h_3_2 = _mm_set_ps(hh[(ldh*2)+1], hh[(ldh*2)+1]);
__m128 h_3_1 = _mm_set_ps(hh[(ldh*2)+2], hh[(ldh*2)+2]);
__m128 h_4_3 = _mm_set_ps(hh[(ldh*3)+1], hh[(ldh*3)+1]);
__m128 h_4_2 = _mm_set_ps(hh[(ldh*3)+2], hh[(ldh*3)+2]);
__m128 h_4_1 = _mm_set_ps(hh[(ldh*3)+3], hh[(ldh*3)+3]);
#endif
__SSE_DATATYPE h_2_1 = _SSE_SET(hh[ldh+1], hh[ldh+1]);
__SSE_DATATYPE h_3_2 = _SSE_SET(hh[(ldh*2)+1], hh[(ldh*2)+1]);
__SSE_DATATYPE h_3_1 = _SSE_SET(hh[(ldh*2)+2], hh[(ldh*2)+2]);
__SSE_DATATYPE h_4_3 = _SSE_SET(hh[(ldh*3)+1], hh[(ldh*3)+1]);
__SSE_DATATYPE h_4_2 = _SSE_SET(hh[(ldh*3)+2], hh[(ldh*3)+2]);
__SSE_DATATYPE h_4_1 = _SSE_SET(hh[(ldh*3)+3], hh[(ldh*3)+3]);
#endif
register __SSE_DATATYPE w1 = _SSE_ADD(a4_1, _SSE_MUL(a3_1, h_4_3));
w1 = _SSE_ADD(w1, _SSE_MUL(a2_1, h_4_2));
w1 = _SSE_ADD(w1, _SSE_MUL(a1_1, h_4_1));
register __SSE_DATATYPE z1 = _SSE_ADD(a3_1, _SSE_MUL(a2_1, h_3_2));
z1 = _SSE_ADD(z1, _SSE_MUL(a1_1, h_3_1));
register __SSE_DATATYPE y1 = _SSE_ADD(a2_1, _SSE_MUL(a1_1, h_2_1));
register __SSE_DATATYPE x1 = a1_1;
register __SSE_DATATYPE w1 = _SSE_ADD(a4_1, _SSE_MUL(a3_1, h_4_3)); // w1 = a_4_1 + a_3_1 * h_4_3
w1 = _SSE_ADD(w1, _SSE_MUL(a2_1, h_4_2)); // w1 = w1 + a_2_1 * h_4_2
w1 = _SSE_ADD(w1, _SSE_MUL(a1_1, h_4_1)); // w1 = w1 + a_1_1 * h_4_1
register __SSE_DATATYPE z1 = _SSE_ADD(a3_1, _SSE_MUL(a2_1, h_3_2)); // z1 = a_3_1 + a_2_1 * h_3_2
z1 = _SSE_ADD(z1, _SSE_MUL(a1_1, h_3_1)); // z1 = z1 + a_1_1 * h_3_1
register __SSE_DATATYPE y1 = _SSE_ADD(a2_1, _SSE_MUL(a1_1, h_2_1)); // y1 = a_2_1 + a_1_1 * h_2_1
register __SSE_DATATYPE x1 = a1_1; // x1 = a_1_1
__SSE_DATATYPE a1_2 = _SSE_LOAD(&q[(ldq*3)+offset]);
__SSE_DATATYPE a1_2 = _SSE_LOAD(&q[(ldq*3)+offset]);
__SSE_DATATYPE a2_2 = _SSE_LOAD(&q[(ldq*2)+offset]);
__SSE_DATATYPE a3_2 = _SSE_LOAD(&q[ldq+offset]);
__SSE_DATATYPE a4_2 = _SSE_LOAD(&q[0+offset]);
......@@ -494,71 +476,40 @@ __forceinline void hh_trafo_kernel_12_SPARC64_4hv_single(float* q, float* hh, in
__SSE_DATATYPE h3;
__SSE_DATATYPE h4;
for(i = 4; i < nb; i++)
for(i = 4; i < nb; i++) // do i = 5, nb
{
#ifdef HAVE_SSE_INTRINSICS
#ifdef DOUBLE_PRECISION_REAL
h1 = _mm_set1_pd(hh[i-3]);
#endif
#ifdef SINGLE_PRECISION_REAL
h1 = _mm_set1_ps(hh[i-3]);
#endif
h1 = _SSE_SET1(hh[i-3]); // h1 = hh(i-3,1)
#endif
#ifdef HAVE_SPARC64_SSE
#ifdef DOUBLE_PRECISION_REAL
h1 = _mm_set_pd(hh[i-3], hh[i-3]);
#endif
#ifdef SINGLE_PRECISION_REAL
h1 = _mm_set_ps(hh[i-3], hh[i-3]);
#endif
h1 = _SSE_SET(hh[i-3], hh[i-3]);
#endif
q1 = _SSE_LOAD(&q[i*ldq]);
q1 = _SSE_LOAD(&q[i*ldq]); // q(1:nq,i) carefull in fortran loop must start at higher index
q2 = _SSE_LOAD(&q[(i*ldq)+offset]);
q3 = _SSE_LOAD(&q[(i*ldq)+2*offset]);
x1 = _SSE_ADD(x1, _SSE_MUL(q1,h1));
x1 = _SSE_ADD(x1, _SSE_MUL(q1,h1)); // x1 = x1 + q1(i,2) * h1
x2 = _SSE_ADD(x2, _SSE_MUL(q2,h1));
x3 = _SSE_ADD(x3, _SSE_MUL(q3,h1));
#ifdef HAVE_SSE_INTRINSICS
#ifdef DOUBLE_PRECISION_REAL
h2 = _mm_set1_pd(hh[ldh+i-2]);
#endif
#ifdef SINGLE_PRECISION_REAL
h2 = _mm_set1_ps(hh[ldh+i-2]);
#endif
h2 = _SSE_SET1(hh[ldh+i-2]); // h2 = hh(i-2,2)
#endif
#ifdef HAVE_SPARC64_SSE
#ifdef DOUBLE_PRECISION_REAL
h2 = _mm_set_pd(hh[ldh+i-2], hh[ldh+i-2]);
#endif
#ifdef SINGLE_PRECISION_REAL
h2 = _mm_set_ps(hh[ldh+i-2], hh[ldh+i-2]);
#endif
h2 = _SSE_SET(hh[ldh+i-2], hh[ldh+i-2]);
#endif
y1 = _SSE_ADD(y1, _SSE_MUL(q1,h2));
y1 = _SSE_ADD(y1, _SSE_MUL(q1,h2)); // y1 = y1 + q1(i,2) * h2
y2 = _SSE_ADD(y2, _SSE_MUL(q2,h2));
y3 = _SSE_ADD(y3, _SSE_MUL(q3,h2));
#ifdef HAVE_SSE_INTRINSICS
#ifdef DOUBLE_PRECISION_REAL
h3 = _mm_set1_pd(hh[(ldh*2)+i-1]);
#endif
#ifdef SINGLE_PRECISION_REAL
h3 = _mm_set1_ps(hh[(ldh*2)+i-1]);
#endif
h3 = _SSE_SET1(hh[(ldh*2)+i-1]); // h3 = hh(i-1,3)
#endif
#ifdef HAVE_SPARC64_SSE
#ifdef DOUBLE_PRECISION_REAL
h3 = _mm_set_pd(hh[(ldh*2)+i-1], hh[(ldh*2)+i-1]);
#endif
#ifdef SINGLE_PRECISION_REAL
h3 = _mm_set_ps(hh[(ldh*2)+i-1], hh[(ldh*2)+i-1]);
#endif
h3 = _SSE_SET(hh[(ldh*2)+i-1], hh[(ldh*2)+i-1]);
#endif
......@@ -566,21 +517,11 @@ __forceinline void hh_trafo_kernel_12_SPARC64_4hv_single(float* q, float* hh, in
z2 = _SSE_ADD(z2, _SSE_MUL(q2,h3));
z3 = _SSE_ADD(z3, _SSE_MUL(q3,h3));
#ifdef HAVE_SSE_INTRINSICS
#ifdef DOUBLE_PRECISION_REAL
h4 = _mm_set1_pd(hh[(ldh*3)+i]);
#endif
#ifdef SINGLE_PRECISION_REAL
h4 = _mm_set1_ps(hh[(ldh*3)+i]);
#endif
h4 = _SSE_SET1(hh[(ldh*3)+i]); // h4 = hh(i,4)
#endif
#ifdef HAVE_SPARC64_SSE
#ifdef DOUBLE_PRECISION_REAL
h4 = _mm_set_pd(hh[(ldh*3)+i], hh[(ldh*3)+i]);
#endif
#ifdef SINGLE_PRECISION_REAL
h4 = _mm_set_ps(hh[(ldh*3)+i], hh[(ldh*3)+i]);
#endif
h4 = _SSE_SET(hh[(ldh*3)+i], hh[(ldh*3)+i]);
#endif
w1 = _SSE_ADD(w1, _SSE_MUL(q1,h4));
......@@ -589,139 +530,79 @@ __forceinline void hh_trafo_kernel_12_SPARC64_4hv_single(float* q, float* hh, in
}
#ifdef HAVE_SSE_INTRINSICS
#ifdef DOUBLE_PRECISION_REAL
h1 = _mm_set1_pd(hh[nb-3]);
#endif
#ifdef SINGLE_PRECISION_REAL
h1 = _mm_set1_ps(hh[nb-3]);
#endif
h1 = _SSE_SET1(hh[nb-3]); // h1 = hh(nb-2,1)
#endif
#ifdef HAVE_SPARC64_SSE
#ifdef DOUBLE_PRECISION_REAL
h1 = _mm_set_pd(hh[nb-3], hh[nb-3]);
#endif
#ifdef SINGLE_PRECISION_REAL
h1 = _mm_set_ps(hh[nb-3], hh[nb-3]);
#endif
h1 = _SSE_SET(hh[nb-3], hh[nb-3]);
#endif
q1 = _SSE_LOAD(&q[nb*ldq]);
q2 = _SSE_LOAD(&q[(nb*ldq)+offset]);
q3 = _SSE_LOAD(&q[(nb*ldq)+2*offset]);
x1 = _SSE_ADD(x1, _SSE_MUL(q1,h1));
x1 = _SSE_ADD(x1, _SSE_MUL(q1,h1)); // x1 = x1 + q1(1:nq,nb+1) * h1
x2 = _SSE_ADD(x2, _SSE_MUL(q2,h1));
x3 = _SSE_ADD(x3, _SSE_MUL(q3,h1));
#ifdef HAVE_SSE_INTRINSICS
#ifdef DOUBLE_PRECISION_REAL
h2 = _mm_set1_pd(hh[ldh+nb-2]);
#endif
#ifdef SINGLE_PRECISION_REAL
h2 = _mm_set1_ps(hh[ldh+nb-2]);
#endif
h2 = _SSE_SET1(hh[ldh+nb-2]); // h2 = hh(nb-1,2)
#endif
#ifdef HAVE_SPARC64_SSE
#ifdef DOUBLE_PRECISION_REAL
h2 = _mm_set_pd(hh[ldh+nb-2], hh[ldh+nb-2]);
#endif
#ifdef SINGLE_PRECISION_REAL
h2 = _mm_set_ps(hh[ldh+nb-2], hh[ldh+nb-2]);
#endif
h2 = _SSE_SET(hh[ldh+nb-2], hh[ldh+nb-2]);
#endif
y1 = _SSE_ADD(y1, _SSE_MUL(q1,h2));
y1 = _SSE_ADD(y1, _SSE_MUL(q1,h2)); // y1 = y1 + q1(1:nq,nb+1) * h2
y2 = _SSE_ADD(y2, _SSE_MUL(q2,h2));
y3 = _SSE_ADD(y3, _SSE_MUL(q3,h2));
#ifdef HAVE_SSE_INTRINSICS
#ifdef DOUBLE_PRECISION_REAL
h3 = _mm_set1_pd(hh[(ldh*2)+nb-1]);
#endif
#ifdef SINGLE_PRECISION_REAL
h3 = _mm_set1_ps(hh[(ldh*2)+nb-1]);
#endif
h3 = _SSE_SET1(hh[(ldh*2)+nb-1]); // h3 = hh(nb,3)
#endif
#ifdef HAVE_SPARC64_SSE
#ifdef DOUBLE_PRECISION_REAL
h3 = _mm_set_pd(hh[(ldh*2)+nb-1], hh[(ldh*2)+nb-1]);
#endif
#ifdef SINGLE_PRECISION_REAL
h3 = _mm_set_ps(hh[(ldh*2)+nb-1], hh[(ldh*2)+nb-1]);
#endif
h3 = _SSE_SET(hh[(ldh*2)+nb-1], hh[(ldh*2)+nb-1]);
#endif
z1 = _SSE_ADD(z1, _SSE_MUL(q1,h3));
z1 = _SSE_ADD(z1, _SSE_MUL(q1,h3)); // z1 = z1 + q1(1:nq,nb+1) * h3
z2 = _SSE_ADD(z2, _SSE_MUL(q2,h3));
z3 = _SSE_ADD(z3, _SSE_MUL(q3,h3));
#ifdef HAVE_SSE_INTRINSICS
#ifdef DOUBLE_PRECISION_REAL
h1 = _mm_set1_pd(hh[nb-2]);
#endif
#ifdef SINGLE_PRECISION_REAL
h1 = _mm_set1_ps(hh[nb-2]);
#endif
h1 = _SSE_SET1(hh[nb-2]); // h1 = hh(nb-1,1)
#endif
#ifdef HAVE_SPARC64_SSE
#ifdef DOUBLE_PRECISION_REAL
h1 = _mm_set_pd(hh[nb-2], hh[nb-2]);
#endif
#ifdef SINGLE_PRECISION_REAL
h1 = _mm_set_ps(hh[nb-2], hh[nb-2]);
#endif
h1 = _SSE_SET(hh[nb-2], hh[nb-2]);
#endif
q1 = _SSE_LOAD(&q[(nb+1)*ldq]);
q2 = _SSE_LOAD(&q[((nb+1)*ldq)+offset]);
q3 = _SSE_LOAD(&q[((nb+1)*ldq)+2*offset]);
x1 = _SSE_ADD(x1, _SSE_MUL(q1,h1));
x1 = _SSE_ADD(x1, _SSE_MUL(q1,h1)); // x1 = x1 + q1(1:nq,nb+2) * h1
x2 = _SSE_ADD(x2, _SSE_MUL(q2,h1));
x3 = _SSE_ADD(x3, _SSE_MUL(q3,h1));
#ifdef HAVE_SSE_INTRINSICS
#ifdef DOUBLE_PRECISION_REAL
h2 = _mm_set1_pd(hh[(ldh*1)+nb-1]);
#endif
#ifdef SINGLE_PRECISION_REAL
h2 = _mm_set1_ps(hh[ldh+nb-1]);
#endif
h2 = _SSE_SET1(hh[(ldh*1)+nb-1]); // h2 = hh(nb, 2)
#endif
#ifdef HAVE_SPARC64_SSE
#ifdef DOUBLE_PRECISION_REAL
h2 = _mm_set_pd(hh[(ldh*1)+nb-1], hh[(ldh*1)+nb-1]);
#endif
#ifdef SINGLE_PRECISION_REAL
h2 = _mm_set_ps(hh[ldh+nb-1], hh[(ldh*1)+nb-1]);
#endif
h2 = _SSE_SET(hh[(ldh*1)+nb-1], hh[(ldh*1)+nb-1]);
#endif
y1 = _SSE_ADD(y1, _SSE_MUL(q1,h2));
y1 = _SSE_ADD(y1, _SSE_MUL(q1,h2)); // y1 = y1 + q1(1:nq,nb+2) * h2
y2 = _SSE_ADD(y2, _SSE_MUL(q2,h2));
y3 = _SSE_ADD(y3, _SSE_MUL(q3,h2));
#ifdef HAVE_SSE_INTRINSICS
#ifdef DOUBLE_PRECISION_REAL
h1 = _mm_set1_pd(hh[nb-1]);
#endif
#ifdef SINGLE_PRECISION_REAL
h1 = _mm_set1_ps(hh[nb-1]);
#endif
h1 = _SSE_SET1(hh[nb-1]); // h1 = hh(nb,1)
#endif
#ifdef HAVE_SPARC64_SSE
#ifdef DOUBLE_PRECISION_REAL
h1 = _mm_set_pd(hh[nb-1], hh[nb-1]);
#endif
#ifdef SINGLE_PRECISION_REAL
h1 = _mm_set_ps(hh[nb-1], hh[nb-1]);
#endif
h1 = _SSE_SET(hh[nb-1], hh[nb-1]);
#endif
......@@ -729,7 +610,7 @@ __forceinline void hh_trafo_kernel_12_SPARC64_4hv_single(float* q, float* hh, in
q2 = _SSE_LOAD(&q[((nb+2)*ldq)+offset]);
q3 = _SSE_LOAD(&q[((nb+2)*ldq)+2*offset]);
x1 = _SSE_ADD(x1, _SSE_MUL(q1,h1));
x1 = _SSE_ADD(x1, _SSE_MUL(q1,h1)); // x1 = x1 + q1(1:nq,nb+3) * h1
x2 = _SSE_ADD(x2, _SSE_MUL(q2,h1));
x3 = _SSE_ADD(x3, _SSE_MUL(q3,h1));
......@@ -738,83 +619,47 @@ __forceinline void hh_trafo_kernel_12_SPARC64_4hv_single(float* q, float* hh, in
/////////////////////////////////////////////////////
#ifdef HAVE_SSE_INTRINSICS
#ifdef DOUBLE_PRECISION_REAL
__SSE_DATATYPE tau1 = _mm_set1_pd(hh[0]);
#endif
#ifdef SINGLE_PRECISION_REAL
__m128 tau1 = _mm_set1_ps(hh[0]);
#endif
__SSE_DATATYPE tau1 = _SSE_SET1(hh[0]); // tau1 = hh(1,1)
#endif
#ifdef HAVE_SPARC64_SSE
#ifdef DOUBLE_PRECISION_REAL
__SSE_DATATYPE tau1 = _mm_set_pd(hh[0], hh[0]);
#endif
#ifdef SINGLE_PRECISION_REAL
__m128 tau1 = _mm_set_ps(hh[0], hh[0]);
#endif
__SSE_DATATYPE tau1 = _SSE_SET(hh[0], hh[0]);
#endif
h1 = tau1;
x1 = _SSE_MUL(x1, h1);
x1 = _SSE_MUL(x1, h1); // x1 = x1*h1
x2 = _SSE_MUL(x2, h1);
x3 = _SSE_MUL(x3, h1);
#ifdef HAVE_SSE_INTRINSICS
#ifdef DOUBLE_PRECISION_REAL
__SSE_DATATYPE tau2 = _mm_set1_pd(hh[ldh]);
__SSE_DATATYPE vs_1_2 = _mm_set1_pd(s_1_2);
#endif
#ifdef SINGLE_PRECISION_REAL
__m128 tau2 = _mm_set1_ps(hh[ldh]);
__m128 vs_1_2 = _mm_set1_ps(s_1_2);
#endif
__SSE_DATATYPE tau2 = _SSE_SET1(hh[ldh]);
__SSE_DATATYPE vs_1_2 = _SSE_SET1(s_1_2);
#endif
#ifdef HAVE_SPARC64_SSE
#ifdef DOUBLE_PRECISION_REAL
__SSE_DATATYPE tau2 = _mm_set_pd(hh[ldh], hh[ldh]);
__SSE_DATATYPE vs_1_2 = _mm_set_pd(s_1_2, s_1_2);
#endif
#ifdef SINGLE_PRECISION_REAL
__m128 tau2 = _mm_set_ps(hh[ldh], hh[ldh]);
__m128 vs_1_2 = _mm_set_ps(s_1_2, s_1_2);
#endif
__SSE_DATATYPE tau2 = _SSE_SET(hh[ldh], hh[ldh]);
__SSE_DATATYPE vs_1_2 = _SSE_SET(s_1_2, s_1_2);
#endif
h1 = tau2;
h2 = _SSE_MUL(h1, vs_1_2);
h2 = _SSE_MUL(h1, vs_1_2); // h2 = h1 * vs_1_2
y1 = _SSE_SUB(_SSE_MUL(y1,h1), _SSE_MUL(x1,h2));
y1 = _SSE_SUB(_SSE_MUL(y1,h1), _SSE_MUL(x1,h2)); // y1 = y1 * h1 - x1*h2
y2 = _SSE_SUB(_SSE_MUL(y2,h1), _SSE_MUL(x2,h2));
y3 = _SSE_SUB(_SSE_MUL(y3,h1), _SSE_MUL(x3,h2));
#ifdef HAVE_SSE_INTRINSICS
#ifdef DOUBLE_PRECISION_REAL
__SSE_DATATYPE tau3 = _mm_set1_pd(hh[ldh*2]);
__SSE_DATATYPE vs_1_3 = _mm_set1_pd(s_1_3);
__SSE_DATATYPE vs_2_3 = _mm_set1_pd(s_2_3);
#endif
#ifdef SINGLE_PRECISION_REAL
__m128 tau3 = _mm_set1_ps(hh[ldh*2]);
__m128 vs_1_3 = _mm_set1_ps(s_1_3);
__m128 vs_2_3 = _mm_set1_ps(s_2_3);
#endif
__SSE_DATATYPE tau3 = _SSE_SET1(hh[ldh*2]); // tau3 = hh(1,3)
__SSE_DATATYPE vs_1_3 = _SSE_SET1(s_1_3); // vs_1_3 = s_1_3
__SSE_DATATYPE vs_2_3 = _SSE_SET1(s_2_3); // vs_2_3 = s_2_3
#endif
#ifdef HAVE_SPARC64_SSE
#ifdef DOUBLE_PRECISION_REAL
__SSE_DATATYPE tau3 = _mm_set_pd(hh[ldh*2], hh[ldh*2]);
__SSE_DATATYPE vs_1_3 = _mm_set_pd(s_1_3, s_1_3);
__SSE_DATATYPE vs_2_3 = _mm_set_pd(s_2_3, s_2_3);
#endif
#ifdef SINGLE_PRECISION_REAL
__m128 tau3 = _mm_set_ps(hh[ldh*2], hh[ldh*2]);
__m128 vs_1_3 = _mm_set_ps(s_1_3, s_1_3);
__m128 vs_2_3 = _mm_set_ps(s_2_3, s_2_3);
#endif
__SSE_DATATYPE tau3 = _SSE_SET(hh[ldh*2], hh[ldh*2]);
__SSE_DATATYPE vs_1_3 = _SSE_SET(s_1_3, s_1_3);
__SSE_DATATYPE vs_2_3 = _SSE_SET(s_2_3, s_2_3);
#endif
......@@ -822,38 +667,22 @@ __forceinline void hh_trafo_kernel_12_SPARC64_4hv_single(float* q, float* hh, in
h2 = _SSE_MUL(h1, vs_1_3);
h3 = _SSE_MUL(h1, vs_2_3);
z1 = _SSE_SUB(_SSE_MUL(z1,h1), _SSE_ADD(_SSE_MUL(y1,h3), _SSE_MUL(x1,h2)));
z1 = _SSE_SUB(_SSE_MUL(z1,h1), _SSE_ADD(_SSE_MUL(y1,h3), _SSE_MUL(x1,h2))); // z1 = z1 * h1 - (y1 * h3 + x1 * h2)
z2 = _SSE_SUB(_SSE_MUL(z2,h1), _SSE_ADD(_SSE_MUL(y2,h3), _SSE_MUL(x2,h2)));
z3 = _SSE_SUB(_SSE_MUL(z3,h1), _SSE_ADD(_SSE_MUL(y3,h3), _SSE_MUL(x3,h2)));
#ifdef HAVE_SSE_INTRINSICS
#ifdef DOUBLE_PRECISION_REAL
__SSE_DATATYPE tau4 = _mm_set1_pd(hh[ldh*3]);
__SSE_DATATYPE vs_1_4 = _mm_set1_pd(s_1_4);
__SSE_DATATYPE vs_2_4 = _mm_set1_pd(s_2_4);
__SSE_DATATYPE vs_3_4 = _mm_set1_pd(s_3_4);
#endif
#ifdef SINGLE_PRECISION_REAL
__m128 tau4 = _mm_set1_ps(hh[ldh*3]);
__m128 vs_1_4 = _mm_set1_ps(s_1_4);
__m128 vs_2_4 = _mm_set1_ps(s_2_4);
__m128 vs_3_4 = _mm_set1_ps(s_3_4);
#endif
__SSE_DATATYPE tau4 = _SSE_SET1(hh[ldh*3]); // tau4 = hh(1,4)
__SSE_DATATYPE vs_1_4 = _SSE_SET1(s_1_4); // vs_1_4 = s_1_4
__SSE_DATATYPE vs_2_4 = _SSE_SET1(s_2_4); // vs_2_4 = s_2_4
__SSE_DATATYPE vs_3_4 = _SSE_SET1(s_3_4); // vs_3_4 = s_3_4
#endif
#ifdef HAVE_SPARC64_SSE
#ifdef DOUBLE_PRECISION_REAL
__SSE_DATATYPE tau4 = _mm_set_pd(hh[ldh*3], hh[ldh*3]);
__SSE_DATATYPE vs_1_4 = _mm_set_pd(s_1_4, s_1_4);
__SSE_DATATYPE vs_2_4 = _mm_set_pd(s_2_4, s_2_4);
__SSE_DATATYPE vs_3_4 = _mm_set_pd(s_3_4, s_3_4);
#endif
#ifdef SINGLE_PRECISION_REAL
__m128 tau4 = _mm_set_ps(hh[ldh*3], hh[ldh*3]);
__m128 vs_1_4 = _mm_set_ps(s_1_4, s_1_4);
__m128 vs_2_4 = _mm_set_ps(s_2_4, s_2_4);
__m128 vs_3_4 = _mm_set_ps(s_3_4, s_3_4);
#endif
__SSE_DATATYPE tau4 = _SSE_SET(hh[ldh*3], hh[ldh*3]);
__SSE_DATATYPE vs_1_4 = _SSE_SET(s_1_4, s_1_4);
__SSE_DATATYPE vs_2_4 = _SSE_SET(s_2_4, s_2_4);