loongarch64: Update dgemm_kernel_16x4 to dgemm_kernel_16x6
This commit is contained in:
parent
d66aa63478
commit
6017ad7146
|
@ -0,0 +1,276 @@
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
/* Copyright 2009, 2010, 2024 The University of Texas at Austin. */
|
||||||
|
/* All rights reserved. */
|
||||||
|
/* */
|
||||||
|
/* Redistribution and use in source and binary forms, with or */
|
||||||
|
/* without modification, are permitted provided that the following */
|
||||||
|
/* conditions are met: */
|
||||||
|
/* */
|
||||||
|
/* 1. Redistributions of source code must retain the above */
|
||||||
|
/* copyright notice, this list of conditions and the following */
|
||||||
|
/* disclaimer. */
|
||||||
|
/* */
|
||||||
|
/* 2. Redistributions in binary form must reproduce the above */
|
||||||
|
/* copyright notice, this list of conditions and the following */
|
||||||
|
/* disclaimer in the documentation and/or other materials */
|
||||||
|
/* provided with the distribution. */
|
||||||
|
/* */
|
||||||
|
/* THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY OF TEXAS AT */
|
||||||
|
/* AUSTIN ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, */
|
||||||
|
/* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF */
|
||||||
|
/* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE */
|
||||||
|
/* DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OF TEXAS AT */
|
||||||
|
/* AUSTIN OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, */
|
||||||
|
/* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES */
|
||||||
|
/* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE */
|
||||||
|
/* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR */
|
||||||
|
/* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF */
|
||||||
|
/* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT */
|
||||||
|
/* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT */
|
||||||
|
/* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE */
|
||||||
|
/* POSSIBILITY OF SUCH DAMAGE. */
|
||||||
|
/* */
|
||||||
|
/* The views and conclusions contained in the software and */
|
||||||
|
/* documentation are those of the authors and should not be */
|
||||||
|
/* interpreted as representing official policies, either expressed */
|
||||||
|
/* or implied, of The University of Texas at Austin. */
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
#define PREFETCHSIZE 4
|
||||||
|
|
||||||
|
int CNAME(BLASLONG n, BLASLONG k1, BLASLONG k2, FLOAT *a, BLASLONG lda, blasint *ipiv, FLOAT *buffer){
|
||||||
|
|
||||||
|
BLASLONG i, j, ip;
|
||||||
|
blasint *piv;
|
||||||
|
FLOAT *dx1, *dy1;
|
||||||
|
FLOAT *dx2, *dy2;
|
||||||
|
FLOAT *dx3, *dy3;
|
||||||
|
FLOAT *dx4, *dy4;
|
||||||
|
FLOAT *dx5, *dy5;
|
||||||
|
FLOAT *dx6, *dy6;
|
||||||
|
FLOAT atemp1, btemp1;
|
||||||
|
FLOAT atemp2, btemp2;
|
||||||
|
FLOAT atemp3, btemp3;
|
||||||
|
FLOAT atemp4, btemp4;
|
||||||
|
FLOAT atemp5, btemp5;
|
||||||
|
FLOAT atemp6, btemp6;
|
||||||
|
|
||||||
|
a--;
|
||||||
|
ipiv += k1 - 1;
|
||||||
|
|
||||||
|
if (n <= 0) return 0;
|
||||||
|
if (k1 > k2) return 0;
|
||||||
|
|
||||||
|
j = (n / 6);
|
||||||
|
if (j > 0) {
|
||||||
|
do {
|
||||||
|
piv = ipiv;
|
||||||
|
i = k1;
|
||||||
|
|
||||||
|
do {
|
||||||
|
ip = *piv;
|
||||||
|
piv ++;
|
||||||
|
|
||||||
|
dx1 = a + i;
|
||||||
|
dy1 = a + ip;
|
||||||
|
dx2 = a + i + lda * 1;
|
||||||
|
dy2 = a + ip + lda * 1;
|
||||||
|
dx3 = a + i + lda * 2;
|
||||||
|
dy3 = a + ip + lda * 2;
|
||||||
|
dx4 = a + i + lda * 3;
|
||||||
|
dy4 = a + ip + lda * 3;
|
||||||
|
dx5 = a + i + lda * 4;
|
||||||
|
dy5 = a + ip + lda * 4;
|
||||||
|
dx6 = a + i + lda * 5;
|
||||||
|
dy6 = a + ip + lda * 5;
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__builtin_prefetch(dx1 + PREFETCHSIZE, 0, 1);
|
||||||
|
__builtin_prefetch(dx2 + PREFETCHSIZE, 0, 1);
|
||||||
|
__builtin_prefetch(dx3 + PREFETCHSIZE, 0, 1);
|
||||||
|
__builtin_prefetch(dx4 + PREFETCHSIZE, 0, 1);
|
||||||
|
__builtin_prefetch(dx5 + PREFETCHSIZE, 0, 1);
|
||||||
|
__builtin_prefetch(dx6 + PREFETCHSIZE, 0, 1);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
atemp1 = *dx1;
|
||||||
|
btemp1 = *dy1;
|
||||||
|
atemp2 = *dx2;
|
||||||
|
btemp2 = *dy2;
|
||||||
|
atemp3 = *dx3;
|
||||||
|
btemp3 = *dy3;
|
||||||
|
atemp4 = *dx4;
|
||||||
|
btemp4 = *dy4;
|
||||||
|
|
||||||
|
atemp5 = *dx5;
|
||||||
|
btemp5 = *dy5;
|
||||||
|
atemp6 = *dx6;
|
||||||
|
btemp6 = *dy6;
|
||||||
|
|
||||||
|
if (ip != i) {
|
||||||
|
*dy1 = atemp1;
|
||||||
|
*dy2 = atemp2;
|
||||||
|
*dy3 = atemp3;
|
||||||
|
*dy4 = atemp4;
|
||||||
|
*dy5 = atemp5;
|
||||||
|
*dy6 = atemp6;
|
||||||
|
*(buffer + 0) = btemp1;
|
||||||
|
*(buffer + 1) = btemp2;
|
||||||
|
*(buffer + 2) = btemp3;
|
||||||
|
*(buffer + 3) = btemp4;
|
||||||
|
*(buffer + 4) = btemp5;
|
||||||
|
*(buffer + 5) = btemp6;
|
||||||
|
} else {
|
||||||
|
*(buffer + 0) = atemp1;
|
||||||
|
*(buffer + 1) = atemp2;
|
||||||
|
*(buffer + 2) = atemp3;
|
||||||
|
*(buffer + 3) = atemp4;
|
||||||
|
*(buffer + 4) = atemp5;
|
||||||
|
*(buffer + 5) = atemp6;
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer += 6;
|
||||||
|
|
||||||
|
i++;
|
||||||
|
} while (i <= k2);
|
||||||
|
|
||||||
|
a += 6 * lda;
|
||||||
|
j --;
|
||||||
|
} while (j > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((n % 6) & 4) {
|
||||||
|
piv = ipiv;
|
||||||
|
|
||||||
|
ip = *piv;
|
||||||
|
piv ++;
|
||||||
|
|
||||||
|
dx1 = a + k1;
|
||||||
|
dy1 = a + ip;
|
||||||
|
dx2 = a + k1 + lda * 1;
|
||||||
|
dy2 = a + ip + lda * 1;
|
||||||
|
dx3 = a + k1 + lda * 2;
|
||||||
|
dy3 = a + ip + lda * 2;
|
||||||
|
dx4 = a + k1 + lda * 3;
|
||||||
|
dy4 = a + ip + lda * 3;
|
||||||
|
|
||||||
|
i = k1;
|
||||||
|
|
||||||
|
do {
|
||||||
|
atemp1 = *dx1;
|
||||||
|
atemp2 = *dx2;
|
||||||
|
atemp3 = *dx3;
|
||||||
|
atemp4 = *dx4;
|
||||||
|
|
||||||
|
btemp1 = *dy1;
|
||||||
|
btemp2 = *dy2;
|
||||||
|
btemp3 = *dy3;
|
||||||
|
btemp4 = *dy4;
|
||||||
|
|
||||||
|
if (ip != i) {
|
||||||
|
*dy1 = atemp1;
|
||||||
|
*dy2 = atemp2;
|
||||||
|
*dy3 = atemp3;
|
||||||
|
*dy4 = atemp4;
|
||||||
|
*(buffer + 0) = btemp1;
|
||||||
|
*(buffer + 1) = btemp2;
|
||||||
|
*(buffer + 2) = btemp3;
|
||||||
|
*(buffer + 3) = btemp4;
|
||||||
|
} else {
|
||||||
|
*(buffer + 0) = atemp1;
|
||||||
|
*(buffer + 1) = atemp2;
|
||||||
|
*(buffer + 2) = atemp3;
|
||||||
|
*(buffer + 3) = atemp4;
|
||||||
|
}
|
||||||
|
|
||||||
|
ip = *piv;
|
||||||
|
piv ++;
|
||||||
|
|
||||||
|
i++;
|
||||||
|
dx1 = a + i;
|
||||||
|
dy1 = a + ip;
|
||||||
|
dx2 = a + i + lda * 1;
|
||||||
|
dy2 = a + ip + lda * 1;
|
||||||
|
dx3 = a + i + lda * 2;
|
||||||
|
dy3 = a + ip + lda * 2;
|
||||||
|
dx4 = a + i + lda * 3;
|
||||||
|
dy4 = a + ip + lda * 3;
|
||||||
|
|
||||||
|
buffer += 4;
|
||||||
|
|
||||||
|
} while (i <= k2);
|
||||||
|
|
||||||
|
a += 4 * lda;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((n % 6) & 2) {
|
||||||
|
piv = ipiv;
|
||||||
|
|
||||||
|
i = k1;
|
||||||
|
do {
|
||||||
|
ip = *piv;
|
||||||
|
piv ++;
|
||||||
|
|
||||||
|
dx1 = a + i;
|
||||||
|
dy1 = a + ip;
|
||||||
|
dx2 = a + i + lda;
|
||||||
|
dy2 = a + ip + lda;
|
||||||
|
|
||||||
|
atemp1 = *dx1;
|
||||||
|
btemp1 = *dy1;
|
||||||
|
atemp2 = *dx2;
|
||||||
|
btemp2 = *dy2;
|
||||||
|
|
||||||
|
if (ip != i) {
|
||||||
|
*dy1 = atemp1;
|
||||||
|
*dy2 = atemp2;
|
||||||
|
*(buffer + 0) = btemp1;
|
||||||
|
*(buffer + 1) = btemp2;
|
||||||
|
} else {
|
||||||
|
*(buffer + 0) = atemp1;
|
||||||
|
*(buffer + 1) = atemp2;
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer += 2;
|
||||||
|
|
||||||
|
i++;
|
||||||
|
} while (i <= k2);
|
||||||
|
|
||||||
|
a += 2 * lda;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if ((n % 6) & 1) {
|
||||||
|
piv = ipiv;
|
||||||
|
|
||||||
|
i = k1;
|
||||||
|
do {
|
||||||
|
ip = *piv;
|
||||||
|
piv ++;
|
||||||
|
|
||||||
|
dx1 = a + i;
|
||||||
|
dy1 = a + ip;
|
||||||
|
atemp1 = *dx1;
|
||||||
|
btemp1 = *dy1;
|
||||||
|
|
||||||
|
if (ip != i) {
|
||||||
|
*dy1 = atemp1;
|
||||||
|
*buffer = btemp1;
|
||||||
|
} else {
|
||||||
|
*buffer = atemp1;
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer ++;
|
||||||
|
|
||||||
|
i++;
|
||||||
|
} while (i <= k2);
|
||||||
|
|
||||||
|
// a += lda;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -41,98 +41,141 @@
|
||||||
|
|
||||||
int CNAME(BLASLONG m, BLASLONG n, FLOAT *a, BLASLONG lda, BLASLONG posX, BLASLONG posY, FLOAT *b){
|
int CNAME(BLASLONG m, BLASLONG n, FLOAT *a, BLASLONG lda, BLASLONG posX, BLASLONG posY, FLOAT *b){
|
||||||
|
|
||||||
BLASLONG i, js, offset;
|
BLASLONG i, js, offset;
|
||||||
|
|
||||||
FLOAT data01, data02, data03, data04;
|
FLOAT data01, data02, data03, data04, data05, data06;
|
||||||
FLOAT *ao1, *ao2, *ao3, *ao4;
|
FLOAT *ao1, *ao2, *ao3, *ao4, *ao5, *ao6;
|
||||||
|
|
||||||
js = (n >> 2);
|
js = (n / 6);
|
||||||
while (js > 0){
|
while (js > 0){
|
||||||
|
|
||||||
offset = posX - posY;
|
offset = posX - posY;
|
||||||
|
|
||||||
if (offset > 0) ao1 = a + posX + 0 + posY * lda; else ao1 = a + posY + (posX + 0) * lda;
|
if (offset > 0) ao1 = a + posX + 0 + posY * lda; else ao1 = a + posY + (posX + 0) * lda;
|
||||||
if (offset > -1) ao2 = a + posX + 1 + posY * lda; else ao2 = a + posY + (posX + 1) * lda;
|
if (offset > -1) ao2 = a + posX + 1 + posY * lda; else ao2 = a + posY + (posX + 1) * lda;
|
||||||
if (offset > -2) ao3 = a + posX + 2 + posY * lda; else ao3 = a + posY + (posX + 2) * lda;
|
if (offset > -2) ao3 = a + posX + 2 + posY * lda; else ao3 = a + posY + (posX + 2) * lda;
|
||||||
if (offset > -3) ao4 = a + posX + 3 + posY * lda; else ao4 = a + posY + (posX + 3) * lda;
|
if (offset > -3) ao4 = a + posX + 3 + posY * lda; else ao4 = a + posY + (posX + 3) * lda;
|
||||||
|
if (offset > -4) ao5 = a + posX + 4 + posY * lda; else ao5 = a + posY + (posX + 4) * lda;
|
||||||
|
if (offset > -5) ao6 = a + posX + 5 + posY * lda; else ao6 = a + posY + (posX + 5) * lda;
|
||||||
|
|
||||||
i = m;
|
i = m;
|
||||||
|
|
||||||
while (i > 0) {
|
while (i > 0) {
|
||||||
data01 = *(ao1 + 0);
|
data01 = *(ao1 + 0);
|
||||||
data02 = *(ao2 + 0);
|
data02 = *(ao2 + 0);
|
||||||
data03 = *(ao3 + 0);
|
data03 = *(ao3 + 0);
|
||||||
data04 = *(ao4 + 0);
|
data04 = *(ao4 + 0);
|
||||||
|
data05 = *(ao5 + 0);
|
||||||
|
data06 = *(ao6 + 0);
|
||||||
|
|
||||||
if (offset > 0) ao1 += lda; else ao1 ++;
|
if (offset > 0) ao1 += lda; else ao1 ++;
|
||||||
if (offset > -1) ao2 += lda; else ao2 ++;
|
if (offset > -1) ao2 += lda; else ao2 ++;
|
||||||
if (offset > -2) ao3 += lda; else ao3 ++;
|
if (offset > -2) ao3 += lda; else ao3 ++;
|
||||||
if (offset > -3) ao4 += lda; else ao4 ++;
|
if (offset > -3) ao4 += lda; else ao4 ++;
|
||||||
|
if (offset > -4) ao5 += lda; else ao5 ++;
|
||||||
|
if (offset > -5) ao6 += lda; else ao6 ++;
|
||||||
|
|
||||||
b[ 0] = data01;
|
b[ 0] = data01;
|
||||||
b[ 1] = data02;
|
b[ 1] = data02;
|
||||||
b[ 2] = data03;
|
b[ 2] = data03;
|
||||||
b[ 3] = data04;
|
b[ 3] = data04;
|
||||||
|
b[ 4] = data05;
|
||||||
|
b[ 5] = data06;
|
||||||
|
|
||||||
b += 4;
|
b += 6;
|
||||||
|
|
||||||
offset --;
|
offset --;
|
||||||
i --;
|
i --;
|
||||||
|
}
|
||||||
|
|
||||||
|
posX += 6;
|
||||||
|
js --;
|
||||||
}
|
}
|
||||||
|
|
||||||
posX += 4;
|
if ((n - n/6) & 4) {
|
||||||
js --;
|
offset = posX - posY;
|
||||||
}
|
|
||||||
|
|
||||||
if (n & 2) {
|
if (offset > 0) ao1 = a + posX + 0 + posY * lda; else ao1 = a + posY + (posX + 0) * lda;
|
||||||
|
if (offset > -1) ao2 = a + posX + 1 + posY * lda; else ao2 = a + posY + (posX + 1) * lda;
|
||||||
|
if (offset > -2) ao3 = a + posX + 2 + posY * lda; else ao3 = a + posY + (posX + 2) * lda;
|
||||||
|
if (offset > -3) ao4 = a + posX + 3 + posY * lda; else ao4 = a + posY + (posX + 3) * lda;
|
||||||
|
|
||||||
offset = posX - posY;
|
i = m;
|
||||||
|
|
||||||
if (offset > 0) ao1 = a + posX + 0 + posY * lda; else ao1 = a + posY + (posX + 0) * lda;
|
while (i > 0) {
|
||||||
if (offset > -1) ao2 = a + posX + 1 + posY * lda; else ao2 = a + posY + (posX + 1) * lda;
|
data01 = *(ao1 + 0);
|
||||||
|
data02 = *(ao2 + 0);
|
||||||
|
data03 = *(ao3 + 0);
|
||||||
|
data04 = *(ao4 + 0);
|
||||||
|
|
||||||
i = m;
|
if (offset > 0) ao1 += lda; else ao1 ++;
|
||||||
|
if (offset > -1) ao2 += lda; else ao2 ++;
|
||||||
|
if (offset > -2) ao3 += lda; else ao3 ++;
|
||||||
|
if (offset > -3) ao4 += lda; else ao4 ++;
|
||||||
|
|
||||||
while (i > 0) {
|
b[ 0] = data01;
|
||||||
data01 = *(ao1 + 0);
|
b[ 1] = data02;
|
||||||
data02 = *(ao2 + 0);
|
b[ 2] = data03;
|
||||||
|
b[ 3] = data04;
|
||||||
|
|
||||||
if (offset > 0) ao1 += lda; else ao1 ++;
|
b += 4;
|
||||||
if (offset > -1) ao2 += lda; else ao2 ++;
|
|
||||||
|
|
||||||
b[ 0] = data01;
|
offset --;
|
||||||
b[ 1] = data02;
|
i --;
|
||||||
|
}
|
||||||
|
|
||||||
b += 2;
|
posX += 4;
|
||||||
|
|
||||||
offset --;
|
|
||||||
i --;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
posX += 2;
|
if ((n - n/6) & 2) {
|
||||||
}
|
|
||||||
|
|
||||||
if (n & 1) {
|
offset = posX - posY;
|
||||||
|
|
||||||
offset = posX - posY;
|
if (offset > 0) ao1 = a + posX + 0 + posY * lda; else ao1 = a + posY + (posX + 0) * lda;
|
||||||
|
if (offset > -1) ao2 = a + posX + 1 + posY * lda; else ao2 = a + posY + (posX + 1) * lda;
|
||||||
|
|
||||||
if (offset > 0) ao1 = a + posX + 0 + posY * lda; else ao1 = a + posY + (posX + 0) * lda;
|
i = m;
|
||||||
|
|
||||||
i = m;
|
while (i > 0) {
|
||||||
|
data01 = *(ao1 + 0);
|
||||||
|
data02 = *(ao2 + 0);
|
||||||
|
|
||||||
while (i > 0) {
|
if (offset > 0) ao1 += lda; else ao1 ++;
|
||||||
data01 = *(ao1 + 0);
|
if (offset > -1) ao2 += lda; else ao2 ++;
|
||||||
|
|
||||||
if (offset > 0) ao1 += lda; else ao1 ++;
|
b[ 0] = data01;
|
||||||
|
b[ 1] = data02;
|
||||||
|
|
||||||
b[ 0] = data01;
|
b += 2;
|
||||||
|
|
||||||
b ++;
|
offset --;
|
||||||
|
i --;
|
||||||
|
}
|
||||||
|
|
||||||
offset --;
|
posX += 2;
|
||||||
i --;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
if ((n - n/6) & 1) {
|
||||||
|
|
||||||
|
offset = posX - posY;
|
||||||
|
|
||||||
|
if (offset > 0) ao1 = a + posX + 0 + posY * lda; else ao1 = a + posY + (posX + 0) * lda;
|
||||||
|
|
||||||
|
i = m;
|
||||||
|
|
||||||
|
while (i > 0) {
|
||||||
|
data01 = *(ao1 + 0);
|
||||||
|
|
||||||
|
if (offset > 0) ao1 += lda; else ao1 ++;
|
||||||
|
|
||||||
|
b[ 0] = data01;
|
||||||
|
|
||||||
|
b ++;
|
||||||
|
|
||||||
|
offset --;
|
||||||
|
i --;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,96 +41,140 @@
|
||||||
|
|
||||||
int CNAME(BLASLONG m, BLASLONG n, FLOAT *a, BLASLONG lda, BLASLONG posX, BLASLONG posY, FLOAT *b){
|
int CNAME(BLASLONG m, BLASLONG n, FLOAT *a, BLASLONG lda, BLASLONG posX, BLASLONG posY, FLOAT *b){
|
||||||
|
|
||||||
BLASLONG i, js, offset;
|
BLASLONG i, js, offset;
|
||||||
|
|
||||||
FLOAT data01, data02, data03, data04;
|
FLOAT data01, data02, data03, data04, data05, data06;
|
||||||
FLOAT *ao1, *ao2, *ao3, *ao4;
|
FLOAT *ao1, *ao2, *ao3, *ao4, *ao5, *ao6;
|
||||||
|
|
||||||
js = (n >> 2);
|
js = (n / 6);
|
||||||
while (js > 0){
|
while (js > 0){
|
||||||
|
|
||||||
offset = posX - posY;
|
offset = posX - posY;
|
||||||
|
|
||||||
if (offset > 0) ao1 = a + posY + (posX + 0) * lda; else ao1 = a + posX + 0 + posY * lda;
|
if (offset > 0) ao1 = a + posY + (posX + 0) * lda; else ao1 = a + posX + 0 + posY * lda;
|
||||||
if (offset > -1) ao2 = a + posY + (posX + 1) * lda; else ao2 = a + posX + 1 + posY * lda;
|
if (offset > -1) ao2 = a + posY + (posX + 1) * lda; else ao2 = a + posX + 1 + posY * lda;
|
||||||
if (offset > -2) ao3 = a + posY + (posX + 2) * lda; else ao3 = a + posX + 2 + posY * lda;
|
if (offset > -2) ao3 = a + posY + (posX + 2) * lda; else ao3 = a + posX + 2 + posY * lda;
|
||||||
if (offset > -3) ao4 = a + posY + (posX + 3) * lda; else ao4 = a + posX + 3 + posY * lda;
|
if (offset > -3) ao4 = a + posY + (posX + 3) * lda; else ao4 = a + posX + 3 + posY * lda;
|
||||||
|
if (offset > -4) ao5 = a + posY + (posX + 4) * lda; else ao5 = a + posX + 4 + posY * lda;
|
||||||
|
if (offset > -5) ao6 = a + posY + (posX + 5) * lda; else ao6 = a + posX + 5 + posY * lda;
|
||||||
|
|
||||||
i = m;
|
i = m;
|
||||||
|
|
||||||
while (i > 0) {
|
while (i > 0) {
|
||||||
data01 = *(ao1 + 0);
|
data01 = *(ao1 + 0);
|
||||||
data02 = *(ao2 + 0);
|
data02 = *(ao2 + 0);
|
||||||
data03 = *(ao3 + 0);
|
data03 = *(ao3 + 0);
|
||||||
data04 = *(ao4 + 0);
|
data04 = *(ao4 + 0);
|
||||||
|
data05 = *(ao5 + 0);
|
||||||
|
data06 = *(ao6 + 0);
|
||||||
|
|
||||||
if (offset > 0) ao1 ++; else ao1 += lda;
|
if (offset > 0) ao1 ++; else ao1 += lda;
|
||||||
if (offset > -1) ao2 ++; else ao2 += lda;
|
if (offset > -1) ao2 ++; else ao2 += lda;
|
||||||
if (offset > -2) ao3 ++; else ao3 += lda;
|
if (offset > -2) ao3 ++; else ao3 += lda;
|
||||||
if (offset > -3) ao4 ++; else ao4 += lda;
|
if (offset > -3) ao4 ++; else ao4 += lda;
|
||||||
|
if (offset > -4) ao5 ++; else ao5 += lda;
|
||||||
|
if (offset > -5) ao6 ++; else ao6 += lda;
|
||||||
|
|
||||||
b[ 0] = data01;
|
b[ 0] = data01;
|
||||||
b[ 1] = data02;
|
b[ 1] = data02;
|
||||||
b[ 2] = data03;
|
b[ 2] = data03;
|
||||||
b[ 3] = data04;
|
b[ 3] = data04;
|
||||||
|
b[ 4] = data05;
|
||||||
|
b[ 5] = data06;
|
||||||
|
|
||||||
b += 4;
|
b += 6;
|
||||||
|
|
||||||
offset --;
|
offset --;
|
||||||
i --;
|
i --;
|
||||||
|
}
|
||||||
|
|
||||||
|
posX += 6;
|
||||||
|
js --;
|
||||||
}
|
}
|
||||||
|
|
||||||
posX += 4;
|
if ((n - n/6) & 4) {
|
||||||
js --;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (n & 2) {
|
offset = posX - posY;
|
||||||
offset = posX - posY;
|
|
||||||
|
|
||||||
if (offset > 0) ao1 = a + posY + (posX + 0) * lda; else ao1 = a + posX + 0 + posY * lda;
|
if (offset > 0) ao1 = a + posY + (posX + 0) * lda; else ao1 = a + posX + 0 + posY * lda;
|
||||||
if (offset > -1) ao2 = a + posY + (posX + 1) * lda; else ao2 = a + posX + 1 + posY * lda;
|
if (offset > -1) ao2 = a + posY + (posX + 1) * lda; else ao2 = a + posX + 1 + posY * lda;
|
||||||
|
if (offset > -2) ao3 = a + posY + (posX + 2) * lda; else ao3 = a + posX + 2 + posY * lda;
|
||||||
|
if (offset > -3) ao4 = a + posY + (posX + 3) * lda; else ao4 = a + posX + 3 + posY * lda;
|
||||||
|
|
||||||
i = m;
|
i = m;
|
||||||
|
|
||||||
while (i > 0) {
|
while (i > 0) {
|
||||||
data01 = *(ao1 + 0);
|
data01 = *(ao1 + 0);
|
||||||
data02 = *(ao2 + 0);
|
data02 = *(ao2 + 0);
|
||||||
|
data03 = *(ao3 + 0);
|
||||||
|
data04 = *(ao4 + 0);
|
||||||
|
|
||||||
if (offset > 0) ao1 ++; else ao1 += lda;
|
if (offset > 0) ao1 ++; else ao1 += lda;
|
||||||
if (offset > -1) ao2 ++; else ao2 += lda;
|
if (offset > -1) ao2 ++; else ao2 += lda;
|
||||||
|
if (offset > -2) ao3 ++; else ao3 += lda;
|
||||||
|
if (offset > -3) ao4 ++; else ao4 += lda;
|
||||||
|
|
||||||
b[ 0] = data01;
|
b[ 0] = data01;
|
||||||
b[ 1] = data02;
|
b[ 1] = data02;
|
||||||
|
b[ 2] = data03;
|
||||||
|
b[ 3] = data04;
|
||||||
|
|
||||||
b += 2;
|
b += 4;
|
||||||
|
|
||||||
offset --;
|
offset --;
|
||||||
i --;
|
i --;
|
||||||
|
}
|
||||||
|
|
||||||
|
posX += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
posX += 2;
|
if ((n - n/6) & 2) {
|
||||||
}
|
offset = posX - posY;
|
||||||
|
|
||||||
if (n & 1) {
|
if (offset > 0) ao1 = a + posY + (posX + 0) * lda; else ao1 = a + posX + 0 + posY * lda;
|
||||||
offset = posX - posY;
|
if (offset > -1) ao2 = a + posY + (posX + 1) * lda; else ao2 = a + posX + 1 + posY * lda;
|
||||||
|
|
||||||
if (offset > 0) ao1 = a + posY + (posX + 0) * lda; else ao1 = a + posX + 0 + posY * lda;
|
i = m;
|
||||||
|
|
||||||
i = m;
|
while (i > 0) {
|
||||||
|
data01 = *(ao1 + 0);
|
||||||
|
data02 = *(ao2 + 0);
|
||||||
|
|
||||||
while (i > 0) {
|
if (offset > 0) ao1 ++; else ao1 += lda;
|
||||||
data01 = *(ao1 + 0);
|
if (offset > -1) ao2 ++; else ao2 += lda;
|
||||||
|
|
||||||
if (offset > 0) ao1 ++; else ao1 += lda;
|
b[ 0] = data01;
|
||||||
|
b[ 1] = data02;
|
||||||
|
|
||||||
b[ 0] = data01;
|
b += 2;
|
||||||
|
|
||||||
b ++;
|
offset --;
|
||||||
|
i --;
|
||||||
|
}
|
||||||
|
|
||||||
offset --;
|
posX += 2;
|
||||||
i --;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
if ((n - n/6) & 1) {
|
||||||
|
offset = posX - posY;
|
||||||
|
|
||||||
|
if (offset > 0) ao1 = a + posY + (posX + 0) * lda; else ao1 = a + posX + 0 + posY * lda;
|
||||||
|
|
||||||
|
i = m;
|
||||||
|
|
||||||
|
while (i > 0) {
|
||||||
|
data01 = *(ao1 + 0);
|
||||||
|
|
||||||
|
if (offset > 0) ao1 ++; else ao1 += lda;
|
||||||
|
|
||||||
|
b[ 0] = data01;
|
||||||
|
|
||||||
|
b ++;
|
||||||
|
|
||||||
|
offset --;
|
||||||
|
i --;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,444 +41,510 @@
|
||||||
|
|
||||||
int CNAME(BLASLONG m, BLASLONG n, FLOAT *a, BLASLONG lda, BLASLONG posX, BLASLONG posY, FLOAT *b){
|
int CNAME(BLASLONG m, BLASLONG n, FLOAT *a, BLASLONG lda, BLASLONG posX, BLASLONG posY, FLOAT *b){
|
||||||
|
|
||||||
BLASLONG i, js;
|
BLASLONG i, js, ii;
|
||||||
BLASLONG X;
|
BLASLONG X;
|
||||||
|
|
||||||
FLOAT data01, data02, data03, data04, data05, data06, data07, data08;
|
FLOAT data01, data02, data05, data06;
|
||||||
FLOAT data09, data10, data11, data12, data13, data14, data15, data16;
|
FLOAT *ao1, *ao2, *ao3, *ao4, *ao5, *ao6;
|
||||||
FLOAT *ao1, *ao2, *ao3, *ao4;
|
|
||||||
|
|
||||||
js = (n >> 2);
|
js = (n / 6);
|
||||||
|
|
||||||
if (js > 0){
|
if (js > 0){
|
||||||
do {
|
do {
|
||||||
X = posX;
|
X = posX;
|
||||||
|
|
||||||
if (posX <= posY) {
|
if (posX <= posY) {
|
||||||
ao1 = a + posY + (posX + 0) * lda;
|
ao1 = a + posY + (posX + 0) * lda;
|
||||||
ao2 = a + posY + (posX + 1) * lda;
|
ao2 = a + posY + (posX + 1) * lda;
|
||||||
ao3 = a + posY + (posX + 2) * lda;
|
ao3 = a + posY + (posX + 2) * lda;
|
||||||
ao4 = a + posY + (posX + 3) * lda;
|
ao4 = a + posY + (posX + 3) * lda;
|
||||||
} else {
|
ao5 = a + posY + (posX + 4) * lda;
|
||||||
ao1 = a + posX + (posY + 0) * lda;
|
ao6 = a + posY + (posX + 5) * lda;
|
||||||
ao2 = a + posX + (posY + 1) * lda;
|
} else {
|
||||||
ao3 = a + posX + (posY + 2) * lda;
|
ao1 = a + posX + (posY + 0) * lda;
|
||||||
ao4 = a + posX + (posY + 3) * lda;
|
ao2 = a + posX + (posY + 1) * lda;
|
||||||
}
|
ao3 = a + posX + (posY + 2) * lda;
|
||||||
|
ao4 = a + posX + (posY + 3) * lda;
|
||||||
|
ao5 = a + posX + (posY + 4) * lda;
|
||||||
|
ao6 = a + posX + (posY + 5) * lda;
|
||||||
|
}
|
||||||
|
|
||||||
i = (m >> 2);
|
i = (m / 6);
|
||||||
if (i > 0) {
|
if (i > 0) {
|
||||||
do {
|
do {
|
||||||
if (X > posY) {
|
if (X > posY) {
|
||||||
data01 = *(ao1 + 0);
|
for (ii = 0; ii < 6; ii++){
|
||||||
data02 = *(ao1 + 1);
|
|
||||||
data03 = *(ao1 + 2);
|
|
||||||
data04 = *(ao1 + 3);
|
|
||||||
|
|
||||||
data05 = *(ao2 + 0);
|
b[ 0] = *(ao1 + 0);
|
||||||
data06 = *(ao2 + 1);
|
b[ 1] = *(ao2 + 0);
|
||||||
data07 = *(ao2 + 2);
|
b[ 2] = *(ao3 + 0);
|
||||||
data08 = *(ao2 + 3);
|
b[ 3] = *(ao4 + 0);
|
||||||
|
b[ 4] = *(ao5 + 0);
|
||||||
|
b[ 5] = *(ao6 + 0);
|
||||||
|
|
||||||
data09 = *(ao3 + 0);
|
ao1 ++;
|
||||||
data10 = *(ao3 + 1);
|
ao2 ++;
|
||||||
data11 = *(ao3 + 2);
|
ao3 ++;
|
||||||
data12 = *(ao3 + 3);
|
ao4 ++;
|
||||||
|
ao5 ++;
|
||||||
|
ao6 ++;
|
||||||
|
b += 6;
|
||||||
|
}
|
||||||
|
|
||||||
data13 = *(ao4 + 0);
|
} else if (X < posY) {
|
||||||
data14 = *(ao4 + 1);
|
ao1 += 6 * lda;
|
||||||
data15 = *(ao4 + 2);
|
ao2 += 6 * lda;
|
||||||
data16 = *(ao4 + 3);
|
ao3 += 6 * lda;
|
||||||
|
ao4 += 6 * lda;
|
||||||
|
ao5 += 6 * lda;
|
||||||
|
ao6 += 6 * lda;
|
||||||
|
b += 36;
|
||||||
|
|
||||||
b[ 0] = data01;
|
} else {
|
||||||
b[ 1] = data05;
|
|
||||||
b[ 2] = data09;
|
|
||||||
b[ 3] = data13;
|
|
||||||
b[ 4] = data02;
|
|
||||||
b[ 5] = data06;
|
|
||||||
b[ 6] = data10;
|
|
||||||
b[ 7] = data14;
|
|
||||||
|
|
||||||
b[ 8] = data03;
|
|
||||||
b[ 9] = data07;
|
|
||||||
b[10] = data11;
|
|
||||||
b[11] = data15;
|
|
||||||
b[12] = data04;
|
|
||||||
b[13] = data08;
|
|
||||||
b[14] = data12;
|
|
||||||
b[15] = data16;
|
|
||||||
|
|
||||||
ao1 += 4;
|
|
||||||
ao2 += 4;
|
|
||||||
ao3 += 4;
|
|
||||||
ao4 += 4;
|
|
||||||
b += 16;
|
|
||||||
|
|
||||||
} else
|
|
||||||
if (X < posY) {
|
|
||||||
ao1 += 4 * lda;
|
|
||||||
ao2 += 4 * lda;
|
|
||||||
ao3 += 4 * lda;
|
|
||||||
ao4 += 4 * lda;
|
|
||||||
b += 16;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
#ifdef UNIT
|
#ifdef UNIT
|
||||||
data02 = *(ao1 + 1);
|
b[ 0] = ONE;
|
||||||
data03 = *(ao1 + 2);
|
|
||||||
data04 = *(ao1 + 3);
|
|
||||||
|
|
||||||
data07 = *(ao2 + 2);
|
|
||||||
data08 = *(ao2 + 3);
|
|
||||||
|
|
||||||
data12 = *(ao3 + 3);
|
|
||||||
|
|
||||||
b[ 0] = ONE;
|
|
||||||
b[ 1] = ZERO;
|
|
||||||
b[ 2] = ZERO;
|
|
||||||
b[ 3] = ZERO;
|
|
||||||
b[ 4] = data02;
|
|
||||||
b[ 5] = ONE;
|
|
||||||
b[ 6] = ZERO;
|
|
||||||
b[ 7] = ZERO;
|
|
||||||
|
|
||||||
b[ 8] = data03;
|
|
||||||
b[ 9] = data07;
|
|
||||||
b[10] = ONE;
|
|
||||||
b[11] = ZERO;
|
|
||||||
b[12] = data04;
|
|
||||||
b[13] = data08;
|
|
||||||
b[14] = data12;
|
|
||||||
b[15] = ONE;
|
|
||||||
#else
|
#else
|
||||||
data01 = *(ao1 + 0);
|
b[ 0] = *(ao1 + 0);
|
||||||
data02 = *(ao1 + 1);
|
|
||||||
data03 = *(ao1 + 2);
|
|
||||||
data04 = *(ao1 + 3);
|
|
||||||
|
|
||||||
data06 = *(ao2 + 1);
|
|
||||||
data07 = *(ao2 + 2);
|
|
||||||
data08 = *(ao2 + 3);
|
|
||||||
|
|
||||||
data11 = *(ao3 + 2);
|
|
||||||
data12 = *(ao3 + 3);
|
|
||||||
|
|
||||||
data16 = *(ao4 + 3);
|
|
||||||
|
|
||||||
b[ 0] = data01;
|
|
||||||
b[ 1] = ZERO;
|
|
||||||
b[ 2] = ZERO;
|
|
||||||
b[ 3] = ZERO;
|
|
||||||
b[ 4] = data02;
|
|
||||||
b[ 5] = data06;
|
|
||||||
b[ 6] = ZERO;
|
|
||||||
b[ 7] = ZERO;
|
|
||||||
|
|
||||||
b[ 8] = data03;
|
|
||||||
b[ 9] = data07;
|
|
||||||
b[10] = data11;
|
|
||||||
b[11] = ZERO;
|
|
||||||
b[12] = data04;
|
|
||||||
b[13] = data08;
|
|
||||||
b[14] = data12;
|
|
||||||
b[15] = data16;
|
|
||||||
#endif
|
#endif
|
||||||
ao1 += 4;
|
b[ 1] = ZERO;
|
||||||
ao2 += 4;
|
b[ 2] = ZERO;
|
||||||
ao3 += 4;
|
b[ 3] = ZERO;
|
||||||
ao4 += 4;
|
b[ 4] = ZERO;
|
||||||
b += 16;
|
b[ 5] = ZERO;
|
||||||
}
|
|
||||||
|
|
||||||
X += 4;
|
b[ 6] = *(ao1 + 1);
|
||||||
i --;
|
|
||||||
} while (i > 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
i = (m & 3);
|
|
||||||
if (i) {
|
|
||||||
|
|
||||||
if (X > posY) {
|
|
||||||
|
|
||||||
if (m & 2) {
|
|
||||||
data01 = *(ao1 + 0);
|
|
||||||
data02 = *(ao1 + 1);
|
|
||||||
data03 = *(ao2 + 0);
|
|
||||||
data04 = *(ao2 + 1);
|
|
||||||
data05 = *(ao3 + 0);
|
|
||||||
data06 = *(ao3 + 1);
|
|
||||||
data07 = *(ao4 + 0);
|
|
||||||
data08 = *(ao4 + 1);
|
|
||||||
|
|
||||||
b[ 0] = data01;
|
|
||||||
b[ 1] = data03;
|
|
||||||
b[ 2] = data05;
|
|
||||||
b[ 3] = data07;
|
|
||||||
b[ 4] = data02;
|
|
||||||
b[ 5] = data04;
|
|
||||||
b[ 6] = data06;
|
|
||||||
b[ 7] = data08;
|
|
||||||
|
|
||||||
ao1 += 2;
|
|
||||||
ao2 += 2;
|
|
||||||
ao3 += 2;
|
|
||||||
ao4 += 2;
|
|
||||||
b += 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m & 1) {
|
|
||||||
data01 = *(ao1 + 0);
|
|
||||||
data02 = *(ao2 + 0);
|
|
||||||
data03 = *(ao3 + 0);
|
|
||||||
data04 = *(ao4 + 0);
|
|
||||||
|
|
||||||
b[ 0] = data01;
|
|
||||||
b[ 1] = data02;
|
|
||||||
b[ 2] = data03;
|
|
||||||
b[ 3] = data04;
|
|
||||||
|
|
||||||
ao1 += 1;
|
|
||||||
ao2 += 1;
|
|
||||||
ao3 += 1;
|
|
||||||
ao4 += 1;
|
|
||||||
b += 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else
|
|
||||||
if (X < posY) {
|
|
||||||
if (m & 2) {
|
|
||||||
ao1 += 2 * lda;
|
|
||||||
ao2 += 2 * lda;
|
|
||||||
|
|
||||||
b += 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m & 1) {
|
|
||||||
ao1 += lda;
|
|
||||||
b += 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
#ifdef UNIT
|
#ifdef UNIT
|
||||||
data05 = *(ao2 + 0);
|
b[ 7] = ONE;
|
||||||
data09 = *(ao3 + 0);
|
|
||||||
data13 = *(ao4 + 0);
|
|
||||||
|
|
||||||
if (i >= 2) {
|
|
||||||
data10 = *(ao3 + 1);
|
|
||||||
data14 = *(ao4 + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i >= 3) {
|
|
||||||
data15 = *(ao4 + 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
b[ 0] = ONE;
|
|
||||||
b[ 1] = data05;
|
|
||||||
b[ 2] = data09;
|
|
||||||
b[ 3] = data13;
|
|
||||||
b += 4;
|
|
||||||
|
|
||||||
if(i >= 2) {
|
|
||||||
b[ 0] = ZERO;
|
|
||||||
b[ 1] = ONE;
|
|
||||||
b[ 2] = data10;
|
|
||||||
b[ 3] = data14;
|
|
||||||
b += 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i >= 3) {
|
|
||||||
b[ 0] = ZERO;
|
|
||||||
b[ 1] = ZERO;
|
|
||||||
b[ 2] = ONE;
|
|
||||||
b[ 3] = data15;
|
|
||||||
b += 4;
|
|
||||||
}
|
|
||||||
#else
|
#else
|
||||||
data01 = *(ao1 + 0);
|
b[ 7] = *(ao2 + 1);
|
||||||
data05 = *(ao2 + 0);
|
|
||||||
data09 = *(ao3 + 0);
|
|
||||||
data13 = *(ao4 + 0);
|
|
||||||
|
|
||||||
if (i >= 2) {
|
|
||||||
data06 = *(ao2 + 1);
|
|
||||||
data10 = *(ao3 + 1);
|
|
||||||
data14 = *(ao4 + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i >= 3) {
|
|
||||||
data11 = *(ao3 + 2);
|
|
||||||
data15 = *(ao4 + 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
b[ 0] = data01;
|
|
||||||
b[ 1] = data05;
|
|
||||||
b[ 2] = data09;
|
|
||||||
b[ 3] = data13;
|
|
||||||
b += 4;
|
|
||||||
|
|
||||||
if(i >= 2) {
|
|
||||||
b[ 0] = ZERO;
|
|
||||||
b[ 1] = data06;
|
|
||||||
b[ 2] = data10;
|
|
||||||
b[ 3] = data14;
|
|
||||||
b += 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i >= 3) {
|
|
||||||
b[ 0] = ZERO;
|
|
||||||
b[ 1] = ZERO;
|
|
||||||
b[ 2] = data11;
|
|
||||||
b[ 3] = data15;
|
|
||||||
b += 4;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
}
|
b[ 8] = ZERO;
|
||||||
}
|
b[ 9] = ZERO;
|
||||||
|
b[10] = ZERO;
|
||||||
|
b[11] = ZERO;
|
||||||
|
|
||||||
posY += 4;
|
b[12] = *(ao1 + 2);
|
||||||
js --;
|
b[13] = *(ao2 + 2);
|
||||||
} while (js > 0);
|
|
||||||
} /* End of main loop */
|
|
||||||
|
|
||||||
|
|
||||||
if (n & 2){
|
|
||||||
X = posX;
|
|
||||||
|
|
||||||
if (posX <= posY) {
|
|
||||||
ao1 = a + posY + (posX + 0) * lda;
|
|
||||||
ao2 = a + posY + (posX + 1) * lda;
|
|
||||||
} else {
|
|
||||||
ao1 = a + posX + (posY + 0) * lda;
|
|
||||||
ao2 = a + posX + (posY + 1) * lda;
|
|
||||||
}
|
|
||||||
|
|
||||||
i = (m >> 1);
|
|
||||||
if (i > 0) {
|
|
||||||
do {
|
|
||||||
if (X > posY) {
|
|
||||||
data01 = *(ao1 + 0);
|
|
||||||
data02 = *(ao1 + 1);
|
|
||||||
data05 = *(ao2 + 0);
|
|
||||||
data06 = *(ao2 + 1);
|
|
||||||
|
|
||||||
b[ 0] = data01;
|
|
||||||
b[ 1] = data05;
|
|
||||||
b[ 2] = data02;
|
|
||||||
b[ 3] = data06;
|
|
||||||
|
|
||||||
ao1 += 2;
|
|
||||||
ao2 += 2;
|
|
||||||
b += 4;
|
|
||||||
|
|
||||||
} else
|
|
||||||
if (X < posY) {
|
|
||||||
ao1 += 2 * lda;
|
|
||||||
ao2 += 2 * lda;
|
|
||||||
b += 4;
|
|
||||||
} else {
|
|
||||||
#ifdef UNIT
|
#ifdef UNIT
|
||||||
data02 = *(ao1 + 1);
|
b[14] = ONE;
|
||||||
|
|
||||||
b[ 0] = ONE;
|
|
||||||
b[ 1] = ZERO;
|
|
||||||
b[ 2] = data02;
|
|
||||||
b[ 3] = ONE;
|
|
||||||
#else
|
#else
|
||||||
data01 = *(ao1 + 0);
|
b[14] = *(ao3 + 2);
|
||||||
data02 = *(ao1 + 1);
|
|
||||||
data06 = *(ao2 + 1);
|
|
||||||
|
|
||||||
b[ 0] = data01;
|
|
||||||
b[ 1] = ZERO;
|
|
||||||
b[ 2] = data02;
|
|
||||||
b[ 3] = data06;
|
|
||||||
#endif
|
#endif
|
||||||
ao1 += 2;
|
b[15] = ZERO;
|
||||||
ao2 += 2;
|
b[16] = ZERO;
|
||||||
|
b[17] = ZERO;
|
||||||
|
|
||||||
b += 4;
|
b[18] = *(ao1 + 3);
|
||||||
}
|
b[19] = *(ao2 + 3);
|
||||||
|
b[20] = *(ao3 + 3);
|
||||||
X += 2;
|
|
||||||
i --;
|
|
||||||
} while (i > 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
i = (m & 1);
|
|
||||||
if (i) {
|
|
||||||
|
|
||||||
if (X > posY) {
|
|
||||||
data01 = *(ao1 + 0);
|
|
||||||
data02 = *(ao2 + 0);
|
|
||||||
b[ 0] = data01;
|
|
||||||
b[ 1] = data02;
|
|
||||||
|
|
||||||
ao1 += 1;
|
|
||||||
ao2 += 1;
|
|
||||||
b += 2;
|
|
||||||
} else
|
|
||||||
if (X < posY) {
|
|
||||||
ao1 += lda;
|
|
||||||
b += 2;
|
|
||||||
} else {
|
|
||||||
#ifdef UNIT
|
#ifdef UNIT
|
||||||
data05 = *(ao2 + 0);
|
b[21] = ONE;
|
||||||
|
|
||||||
b[ 0] = ONE;
|
|
||||||
b[ 1] = data05;
|
|
||||||
#else
|
#else
|
||||||
data01 = *(ao1 + 0);
|
b[21] = *(ao4 + 3);
|
||||||
data05 = *(ao2 + 0);
|
|
||||||
|
|
||||||
b[ 0] = data01;
|
|
||||||
b[ 1] = data05;
|
|
||||||
#endif
|
#endif
|
||||||
b += 2;
|
b[22] = ZERO;
|
||||||
}
|
b[23] = ZERO;
|
||||||
}
|
|
||||||
posY += 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (n & 1){
|
b[24] = *(ao1 + 4);
|
||||||
X = posX;
|
b[25] = *(ao2 + 4);
|
||||||
|
b[26] = *(ao3 + 4);
|
||||||
if (posX <= posY) {
|
b[27] = *(ao4 + 4);
|
||||||
ao1 = a + posY + (posX + 0) * lda;
|
|
||||||
} else {
|
|
||||||
ao1 = a + posX + (posY + 0) * lda;
|
|
||||||
}
|
|
||||||
|
|
||||||
i = m;
|
|
||||||
if (i > 0) {
|
|
||||||
do {
|
|
||||||
if (X > posY) {
|
|
||||||
data01 = *(ao1 + 0);
|
|
||||||
b[ 0] = data01;
|
|
||||||
b += 1;
|
|
||||||
ao1 += 1;
|
|
||||||
} else
|
|
||||||
if (X < posY) {
|
|
||||||
b += 1;
|
|
||||||
ao1 += lda;
|
|
||||||
} else {
|
|
||||||
#ifdef UNIT
|
#ifdef UNIT
|
||||||
b[ 0] = ONE;
|
b[28] = ONE;
|
||||||
#else
|
#else
|
||||||
data01 = *(ao1 + 0);
|
b[28] = *(ao5 + 4);
|
||||||
b[ 0] = data01;
|
|
||||||
#endif
|
#endif
|
||||||
b += 1;
|
b[29] = ZERO;
|
||||||
ao1 += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
X ++;
|
b[30] = *(ao1 + 5);
|
||||||
i --;
|
b[31] = *(ao2 + 5);
|
||||||
} while (i > 0);
|
b[32] = *(ao3 + 5);
|
||||||
}
|
b[33] = *(ao4 + 5);
|
||||||
|
b[34] = *(ao5 + 5);
|
||||||
|
#ifdef UNIT
|
||||||
|
b[35] = ONE;
|
||||||
|
#else
|
||||||
|
b[35] = *(ao6 + 5);
|
||||||
|
#endif
|
||||||
|
ao1 += 6;
|
||||||
|
ao2 += 6;
|
||||||
|
ao3 += 6;
|
||||||
|
ao4 += 6;
|
||||||
|
ao5 += 6;
|
||||||
|
ao6 += 6;
|
||||||
|
b += 36;
|
||||||
|
}
|
||||||
|
|
||||||
posY += 1;
|
X += 6;
|
||||||
}
|
i --;
|
||||||
|
} while (i > 0);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
i = (m % 6);
|
||||||
|
if (i) {
|
||||||
|
|
||||||
|
if (X > posY) {
|
||||||
|
for (ii = 0; ii < i; ii++){
|
||||||
|
b[ 0] = *(ao1 + 0);
|
||||||
|
b[ 1] = *(ao2 + 0);
|
||||||
|
b[ 2] = *(ao3 + 0);
|
||||||
|
b[ 3] = *(ao4 + 0);
|
||||||
|
b[ 4] = *(ao5 + 0);
|
||||||
|
b[ 5] = *(ao6 + 0);
|
||||||
|
|
||||||
|
ao1 ++;
|
||||||
|
ao2 ++;
|
||||||
|
ao3 ++;
|
||||||
|
ao4 ++;
|
||||||
|
ao5 ++;
|
||||||
|
ao6 ++;
|
||||||
|
b += 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (X < posY) {
|
||||||
|
|
||||||
|
b += 6 * i;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
#ifdef UNIT
|
||||||
|
b[ 0] = ONE;
|
||||||
|
#else
|
||||||
|
b[ 0] = *(ao1 + 0);
|
||||||
|
#endif
|
||||||
|
b[ 1] = ZERO;
|
||||||
|
b[ 2] = ZERO;
|
||||||
|
b[ 3] = ZERO;
|
||||||
|
b[ 4] = ZERO;
|
||||||
|
b[ 5] = ZERO;
|
||||||
|
b += 6;
|
||||||
|
|
||||||
|
if (i >= 2) {
|
||||||
|
b[ 0] = *(ao1 + 1);
|
||||||
|
#ifdef UNIT
|
||||||
|
b[ 1] = ONE;
|
||||||
|
#else
|
||||||
|
b[ 1] = *(ao2 + 1);
|
||||||
|
#endif
|
||||||
|
b[ 2] = ZERO;
|
||||||
|
b[ 3] = ZERO;
|
||||||
|
b[ 4] = ZERO;
|
||||||
|
b[ 5] = ZERO;
|
||||||
|
b += 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i >= 3) {
|
||||||
|
b[ 0] = *(ao1 + 2);
|
||||||
|
b[ 1] = *(ao2 + 2);
|
||||||
|
#ifdef UNIT
|
||||||
|
b[ 2] = ONE;
|
||||||
|
#else
|
||||||
|
b[ 2] = *(ao3 + 2);
|
||||||
|
#endif
|
||||||
|
b[ 3] = ZERO;
|
||||||
|
b[ 4] = ZERO;
|
||||||
|
b[ 5] = ZERO;
|
||||||
|
b += 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i >= 4) {
|
||||||
|
b[ 0] = *(ao1 + 3);
|
||||||
|
b[ 1] = *(ao2 + 3);
|
||||||
|
b[ 2] = *(ao3 + 3);
|
||||||
|
#ifdef UNIT
|
||||||
|
b[ 3] = ONE;
|
||||||
|
#else
|
||||||
|
b[ 3] = *(ao4 + 3);
|
||||||
|
#endif
|
||||||
|
b[ 4] = ZERO;
|
||||||
|
b[ 5] = ZERO;
|
||||||
|
b += 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i >= 5) {
|
||||||
|
b[ 0] = *(ao1 + 4);
|
||||||
|
b[ 1] = *(ao2 + 4);
|
||||||
|
b[ 2] = *(ao3 + 4);
|
||||||
|
b[ 3] = *(ao4 + 4);
|
||||||
|
#ifdef UNIT
|
||||||
|
b[ 4] = ONE;
|
||||||
|
#else
|
||||||
|
b[ 4] = *(ao5 + 4);
|
||||||
|
#endif
|
||||||
|
b[ 5] = ZERO;
|
||||||
|
b += 6;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
posY += 6;
|
||||||
|
js --;
|
||||||
|
} while (js > 0);
|
||||||
|
} /* End of main loop */
|
||||||
|
|
||||||
|
if ((n % 6) & 4){
|
||||||
|
X = posX;
|
||||||
|
|
||||||
|
if (posX <= posY) {
|
||||||
|
ao1 = a + posY + (posX + 0) * lda;
|
||||||
|
ao2 = a + posY + (posX + 1) * lda;
|
||||||
|
ao3 = a + posY + (posX + 2) * lda;
|
||||||
|
ao4 = a + posY + (posX + 3) * lda;
|
||||||
|
} else {
|
||||||
|
ao1 = a + posX + (posY + 0) * lda;
|
||||||
|
ao2 = a + posX + (posY + 1) * lda;
|
||||||
|
ao3 = a + posX + (posY + 2) * lda;
|
||||||
|
ao4 = a + posX + (posY + 3) * lda;
|
||||||
|
}
|
||||||
|
|
||||||
|
i = (m >> 1);
|
||||||
|
if (i > 0) {
|
||||||
|
do {
|
||||||
|
if (X > posY) {
|
||||||
|
for (ii = 0; ii < 2; ii++){
|
||||||
|
|
||||||
|
b[ 0] = *(ao1 + 0);
|
||||||
|
b[ 1] = *(ao2 + 0);
|
||||||
|
b[ 2] = *(ao3 + 0);
|
||||||
|
b[ 3] = *(ao4 + 0);
|
||||||
|
|
||||||
|
ao1 ++;
|
||||||
|
ao2 ++;
|
||||||
|
ao3 ++;
|
||||||
|
ao4 ++;
|
||||||
|
b += 4;
|
||||||
|
}
|
||||||
|
} else if (X < posY) {
|
||||||
|
ao1 += 2 * lda;
|
||||||
|
ao2 += 2 * lda;
|
||||||
|
ao3 += 2 * lda;
|
||||||
|
ao4 += 2 * lda;
|
||||||
|
b += 8;
|
||||||
|
} else {
|
||||||
|
#ifdef UNIT
|
||||||
|
b[ 0] = ONE;
|
||||||
|
#else
|
||||||
|
b[ 0] = *(ao1 + 0);
|
||||||
|
#endif
|
||||||
|
b[ 1] = ZERO;
|
||||||
|
b[ 2] = ZERO;
|
||||||
|
b[ 3] = ZERO;
|
||||||
|
|
||||||
|
b[ 4] = *(ao1 + 1);
|
||||||
|
#ifdef UNIT
|
||||||
|
b[ 5] = ONE;
|
||||||
|
#else
|
||||||
|
b[ 5] = *(ao2 + 1);
|
||||||
|
#endif
|
||||||
|
b[ 6] = ZERO;
|
||||||
|
b[ 7] = ZERO;
|
||||||
|
|
||||||
|
b[ 8] = *(ao1 + 2);
|
||||||
|
b[ 9] = *(ao2 + 2);
|
||||||
|
#ifdef UNIT
|
||||||
|
b[ 10] = ONE;
|
||||||
|
#else
|
||||||
|
b[ 10] = *(ao3 + 2);
|
||||||
|
#endif
|
||||||
|
b[ 11] = ZERO;
|
||||||
|
|
||||||
|
b[ 12] = *(ao1 + 3);
|
||||||
|
b[ 13] = *(ao2 + 3);
|
||||||
|
b[ 14] = *(ao3 + 3);
|
||||||
|
#ifdef UNIT
|
||||||
|
b[ 15] = ONE;
|
||||||
|
#else
|
||||||
|
b[ 15] = *(ao4 + 3);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ao1 += 4;
|
||||||
|
ao2 += 4;
|
||||||
|
ao3 += 4;
|
||||||
|
ao4 += 4;
|
||||||
|
b += 16;
|
||||||
|
X += 4;
|
||||||
|
i -= 2;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
X += 2;
|
||||||
|
i --;
|
||||||
|
} while (i > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
i = (m & 1);
|
||||||
|
if (i) {
|
||||||
|
|
||||||
|
if (X > posY) {
|
||||||
|
for (ii = 0; ii < i; ii++){
|
||||||
|
|
||||||
|
b[ 0] = *(ao1 + 0);
|
||||||
|
b[ 1] = *(ao2 + 0);
|
||||||
|
b[ 2] = *(ao3 + 0);
|
||||||
|
b[ 3] = *(ao4 + 0);
|
||||||
|
|
||||||
|
ao1 ++;
|
||||||
|
ao2 ++;
|
||||||
|
ao3 ++;
|
||||||
|
ao4 ++;
|
||||||
|
b += 4;
|
||||||
|
}
|
||||||
|
} else if (X < posY) {
|
||||||
|
/* ao1 += i * lda;
|
||||||
|
ao2 += i * lda;
|
||||||
|
ao3 += i * lda;
|
||||||
|
ao4 += i * lda; */
|
||||||
|
b += 4 * i;
|
||||||
|
} else {
|
||||||
|
#ifdef UNIT
|
||||||
|
b[ 0] = ONE;
|
||||||
|
#else
|
||||||
|
b[ 0] = *(ao1 + 0);
|
||||||
|
#endif
|
||||||
|
b[ 1] = ZERO;
|
||||||
|
b[ 2] = ZERO;
|
||||||
|
b[ 3] = ZERO;
|
||||||
|
b += 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
posY += 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if ((n % 6) & 2){
|
||||||
|
X = posX;
|
||||||
|
|
||||||
|
if (posX <= posY) {
|
||||||
|
ao1 = a + posY + (posX + 0) * lda;
|
||||||
|
ao2 = a + posY + (posX + 1) * lda;
|
||||||
|
} else {
|
||||||
|
ao1 = a + posX + (posY + 0) * lda;
|
||||||
|
ao2 = a + posX + (posY + 1) * lda;
|
||||||
|
}
|
||||||
|
|
||||||
|
i = (m >> 1);
|
||||||
|
if (i > 0) {
|
||||||
|
do {
|
||||||
|
if (X > posY) {
|
||||||
|
data01 = *(ao1 + 0);
|
||||||
|
data02 = *(ao1 + 1);
|
||||||
|
data05 = *(ao2 + 0);
|
||||||
|
data06 = *(ao2 + 1);
|
||||||
|
|
||||||
|
b[ 0] = data01;
|
||||||
|
b[ 1] = data05;
|
||||||
|
b[ 2] = data02;
|
||||||
|
b[ 3] = data06;
|
||||||
|
|
||||||
|
ao1 += 2;
|
||||||
|
ao2 += 2;
|
||||||
|
b += 4;
|
||||||
|
|
||||||
|
} else if (X < posY) {
|
||||||
|
ao1 += 2 * lda;
|
||||||
|
ao2 += 2 * lda;
|
||||||
|
b += 4;
|
||||||
|
} else {
|
||||||
|
#ifdef UNIT
|
||||||
|
data02 = *(ao1 + 1);
|
||||||
|
|
||||||
|
b[ 0] = ONE;
|
||||||
|
b[ 1] = ZERO;
|
||||||
|
b[ 2] = data02;
|
||||||
|
b[ 3] = ONE;
|
||||||
|
#else
|
||||||
|
data01 = *(ao1 + 0);
|
||||||
|
data02 = *(ao1 + 1);
|
||||||
|
data06 = *(ao2 + 1);
|
||||||
|
|
||||||
|
b[ 0] = data01;
|
||||||
|
b[ 1] = ZERO;
|
||||||
|
b[ 2] = data02;
|
||||||
|
b[ 3] = data06;
|
||||||
|
#endif
|
||||||
|
ao1 += 2;
|
||||||
|
ao2 += 2;
|
||||||
|
|
||||||
|
b += 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
X += 2;
|
||||||
|
i --;
|
||||||
|
} while (i > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
i = (m & 1);
|
||||||
|
if (i) {
|
||||||
|
|
||||||
|
if (X > posY) {
|
||||||
|
data01 = *(ao1 + 0);
|
||||||
|
data02 = *(ao2 + 0);
|
||||||
|
b[ 0] = data01;
|
||||||
|
b[ 1] = data02;
|
||||||
|
|
||||||
|
ao1 += 1;
|
||||||
|
ao2 += 1;
|
||||||
|
b += 2;
|
||||||
|
} else if (X < posY) {
|
||||||
|
ao1 += lda;
|
||||||
|
b += 2;
|
||||||
|
} else {
|
||||||
|
#ifdef UNIT
|
||||||
|
data05 = *(ao2 + 0);
|
||||||
|
|
||||||
|
b[ 0] = ONE;
|
||||||
|
b[ 1] = data05;
|
||||||
|
#else
|
||||||
|
data01 = *(ao1 + 0);
|
||||||
|
data05 = *(ao2 + 0);
|
||||||
|
|
||||||
|
b[ 0] = data01;
|
||||||
|
b[ 1] = data05;
|
||||||
|
#endif
|
||||||
|
b += 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
posY += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((n % 6) & 1){
|
||||||
|
X = posX;
|
||||||
|
|
||||||
|
if (posX <= posY) {
|
||||||
|
ao1 = a + posY + (posX + 0) * lda;
|
||||||
|
} else {
|
||||||
|
ao1 = a + posX + (posY + 0) * lda;
|
||||||
|
}
|
||||||
|
|
||||||
|
i = m;
|
||||||
|
if (i > 0) {
|
||||||
|
do {
|
||||||
|
if (X > posY) {
|
||||||
|
data01 = *(ao1 + 0);
|
||||||
|
b[ 0] = data01;
|
||||||
|
b += 1;
|
||||||
|
ao1 += 1;
|
||||||
|
} else if (X < posY) {
|
||||||
|
b += 1;
|
||||||
|
ao1 += lda;
|
||||||
|
} else {
|
||||||
|
#ifdef UNIT
|
||||||
|
b[ 0] = ONE;
|
||||||
|
#else
|
||||||
|
data01 = *(ao1 + 0);
|
||||||
|
b[ 0] = data01;
|
||||||
|
#endif
|
||||||
|
b += 1;
|
||||||
|
ao1 += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
X ++;
|
||||||
|
i --;
|
||||||
|
} while (i > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
posY += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,448 +41,511 @@
|
||||||
|
|
||||||
int CNAME(BLASLONG m, BLASLONG n, FLOAT *a, BLASLONG lda, BLASLONG posX, BLASLONG posY, FLOAT *b){
|
int CNAME(BLASLONG m, BLASLONG n, FLOAT *a, BLASLONG lda, BLASLONG posX, BLASLONG posY, FLOAT *b){
|
||||||
|
|
||||||
BLASLONG i, js;
|
BLASLONG i, js, ii;
|
||||||
BLASLONG X;
|
BLASLONG X;
|
||||||
|
|
||||||
FLOAT data01, data02, data03, data04, data05, data06, data07, data08;
|
FLOAT data01, data02, data05, data06;
|
||||||
FLOAT data09, data10, data11, data12, data13, data14, data15, data16;
|
FLOAT *ao1, *ao2, *ao3, *ao4, *ao5, *ao6;
|
||||||
FLOAT *ao1, *ao2, *ao3, *ao4;
|
|
||||||
|
|
||||||
js = (n >> 2);
|
js = (n / 6);
|
||||||
|
|
||||||
if (js > 0){
|
if (js > 0){
|
||||||
do {
|
do {
|
||||||
X = posX;
|
X = posX;
|
||||||
|
|
||||||
if (posX <= posY) {
|
if (posX <= posY) {
|
||||||
ao1 = a + posY + (posX + 0) * lda;
|
ao1 = a + posY + (posX + 0) * lda;
|
||||||
ao2 = a + posY + (posX + 1) * lda;
|
ao2 = a + posY + (posX + 1) * lda;
|
||||||
ao3 = a + posY + (posX + 2) * lda;
|
ao3 = a + posY + (posX + 2) * lda;
|
||||||
ao4 = a + posY + (posX + 3) * lda;
|
ao4 = a + posY + (posX + 3) * lda;
|
||||||
} else {
|
ao5 = a + posY + (posX + 4) * lda;
|
||||||
ao1 = a + posX + (posY + 0) * lda;
|
ao6 = a + posY + (posX + 5) * lda;
|
||||||
ao2 = a + posX + (posY + 1) * lda;
|
} else {
|
||||||
ao3 = a + posX + (posY + 2) * lda;
|
ao1 = a + posX + (posY + 0) * lda;
|
||||||
ao4 = a + posX + (posY + 3) * lda;
|
ao2 = a + posX + (posY + 1) * lda;
|
||||||
}
|
ao3 = a + posX + (posY + 2) * lda;
|
||||||
|
ao4 = a + posX + (posY + 3) * lda;
|
||||||
|
ao5 = a + posX + (posY + 4) * lda;
|
||||||
|
ao6 = a + posX + (posY + 5) * lda;
|
||||||
|
}
|
||||||
|
|
||||||
i = (m >> 2);
|
i = (m / 6);
|
||||||
if (i > 0) {
|
if (i > 0) {
|
||||||
do {
|
do {
|
||||||
if (X > posY) {
|
if (X > posY) {
|
||||||
ao1 += 4;
|
ao1 += 6;
|
||||||
ao2 += 4;
|
ao2 += 6;
|
||||||
ao3 += 4;
|
ao3 += 6;
|
||||||
ao4 += 4;
|
ao4 += 6;
|
||||||
b += 16;
|
ao5 += 6;
|
||||||
|
ao6 += 6;
|
||||||
|
b += 36;
|
||||||
|
|
||||||
} else
|
} else if (X < posY) {
|
||||||
if (X < posY) {
|
for (ii = 0; ii < 6; ii++){
|
||||||
data01 = *(ao1 + 0);
|
|
||||||
data02 = *(ao1 + 1);
|
|
||||||
data03 = *(ao1 + 2);
|
|
||||||
data04 = *(ao1 + 3);
|
|
||||||
|
|
||||||
data05 = *(ao2 + 0);
|
b[ 0] = *(ao1 + 0);
|
||||||
data06 = *(ao2 + 1);
|
b[ 1] = *(ao1 + 1);
|
||||||
data07 = *(ao2 + 2);
|
b[ 2] = *(ao1 + 2);
|
||||||
data08 = *(ao2 + 3);
|
b[ 3] = *(ao1 + 3);
|
||||||
|
b[ 4] = *(ao1 + 4);
|
||||||
|
b[ 5] = *(ao1 + 5);
|
||||||
|
|
||||||
data09 = *(ao3 + 0);
|
ao1 += lda;
|
||||||
data10 = *(ao3 + 1);
|
b += 6;
|
||||||
data11 = *(ao3 + 2);
|
}
|
||||||
data12 = *(ao3 + 3);
|
|
||||||
|
|
||||||
data13 = *(ao4 + 0);
|
ao2 += 6 * lda;
|
||||||
data14 = *(ao4 + 1);
|
ao3 += 6 * lda;
|
||||||
data15 = *(ao4 + 2);
|
ao4 += 6 * lda;
|
||||||
data16 = *(ao4 + 3);
|
ao5 += 6 * lda;
|
||||||
|
ao6 += 6 * lda;
|
||||||
|
|
||||||
b[ 0] = data01;
|
} else {
|
||||||
b[ 1] = data02;
|
#ifdef UNIT
|
||||||
b[ 2] = data03;
|
b[ 0] = ONE;
|
||||||
b[ 3] = data04;
|
#else
|
||||||
b[ 4] = data05;
|
b[ 0] = *(ao1 + 0);
|
||||||
b[ 5] = data06;
|
#endif
|
||||||
b[ 6] = data07;
|
b[ 1] = *(ao1 + 1);
|
||||||
b[ 7] = data08;
|
b[ 2] = *(ao1 + 2);
|
||||||
|
b[ 3] = *(ao1 + 3);
|
||||||
|
b[ 4] = *(ao1 + 4);
|
||||||
|
b[ 5] = *(ao1 + 5);
|
||||||
|
|
||||||
b[ 8] = data09;
|
b[ 6] = ZERO;
|
||||||
b[ 9] = data10;
|
#ifdef UNIT
|
||||||
b[10] = data11;
|
b[ 7] = ONE;
|
||||||
b[11] = data12;
|
#else
|
||||||
b[12] = data13;
|
b[ 7] = *(ao2 + 1);
|
||||||
b[13] = data14;
|
#endif
|
||||||
b[14] = data15;
|
b[ 8] = *(ao2 + 2);
|
||||||
b[15] = data16;
|
b[ 9] = *(ao2 + 3);
|
||||||
|
b[10] = *(ao2 + 4);
|
||||||
|
b[11] = *(ao2 + 5);
|
||||||
|
|
||||||
ao1 += 4 * lda;
|
b[12] = ZERO;
|
||||||
ao2 += 4 * lda;
|
b[13] = ZERO;
|
||||||
ao3 += 4 * lda;
|
#ifdef UNIT
|
||||||
ao4 += 4 * lda;
|
b[14] = ONE;
|
||||||
b += 16;
|
#else
|
||||||
|
b[14] = *(ao3 + 2);
|
||||||
|
#endif
|
||||||
|
b[15] = *(ao3 + 3);
|
||||||
|
b[16] = *(ao3 + 4);
|
||||||
|
b[17] = *(ao3 + 5);
|
||||||
|
|
||||||
} else {
|
b[18] = ZERO;
|
||||||
|
b[19] = ZERO;
|
||||||
|
b[20] = ZERO;
|
||||||
|
#ifdef UNIT
|
||||||
|
b[21] = ONE;
|
||||||
|
#else
|
||||||
|
b[21] = *(ao4 + 3);
|
||||||
|
#endif
|
||||||
|
b[22] = *(ao4 + 4);
|
||||||
|
b[23] = *(ao4 + 5);
|
||||||
|
|
||||||
|
b[24] = ZERO;
|
||||||
|
b[25] = ZERO;
|
||||||
|
b[26] = ZERO;
|
||||||
|
b[27] = ZERO;
|
||||||
|
#ifdef UNIT
|
||||||
|
b[28] = ONE;
|
||||||
|
#else
|
||||||
|
b[28] = *(ao5 + 4);
|
||||||
|
#endif
|
||||||
|
b[29] = *(ao5 + 5);
|
||||||
|
|
||||||
|
b[30] = ZERO;
|
||||||
|
b[31] = ZERO;
|
||||||
|
b[32] = ZERO;
|
||||||
|
b[33] = ZERO;
|
||||||
|
b[34] = ZERO;
|
||||||
|
#ifdef UNIT
|
||||||
|
b[35] = ONE;
|
||||||
|
#else
|
||||||
|
b[35] = *(ao6 + 5);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ao1 += 6;
|
||||||
|
ao2 += 6;
|
||||||
|
ao3 += 6;
|
||||||
|
ao4 += 6;
|
||||||
|
ao5 += 6;
|
||||||
|
ao6 += 6;
|
||||||
|
b += 36;
|
||||||
|
}
|
||||||
|
|
||||||
|
X += 6;
|
||||||
|
i --;
|
||||||
|
} while (i > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
i = (m % 6);
|
||||||
|
if (i) {
|
||||||
|
|
||||||
|
if (X > posY) {
|
||||||
|
|
||||||
|
b += 6 * i;
|
||||||
|
|
||||||
|
} else if (X < posY) {
|
||||||
|
for (ii = 0; ii < i; ii++){
|
||||||
|
|
||||||
|
b[ 0] = *(ao1 + 0);
|
||||||
|
b[ 1] = *(ao1 + 1);
|
||||||
|
b[ 2] = *(ao1 + 2);
|
||||||
|
b[ 3] = *(ao1 + 3);
|
||||||
|
b[ 4] = *(ao1 + 4);
|
||||||
|
b[ 5] = *(ao1 + 5);
|
||||||
|
|
||||||
|
ao1 += lda;
|
||||||
|
ao2 += lda;
|
||||||
|
ao3 += lda;
|
||||||
|
ao4 += lda;
|
||||||
|
ao5 += lda;
|
||||||
|
ao6 += lda;
|
||||||
|
b += 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
#ifdef UNIT
|
||||||
|
b[ 0] = ONE;
|
||||||
|
#else
|
||||||
|
b[ 0] = *(ao1 + 0);
|
||||||
|
#endif
|
||||||
|
b[ 1] = *(ao1 + 1);
|
||||||
|
b[ 2] = *(ao1 + 2);
|
||||||
|
b[ 3] = *(ao1 + 3);
|
||||||
|
b[ 4] = *(ao1 + 4);
|
||||||
|
b[ 5] = *(ao1 + 5);
|
||||||
|
b += 6;
|
||||||
|
|
||||||
|
if (i >= 2) {
|
||||||
|
b[ 0] = ZERO;
|
||||||
|
#ifdef UNIT
|
||||||
|
b[ 1] = ONE;
|
||||||
|
#else
|
||||||
|
b[ 1] = *(ao2 + 1);
|
||||||
|
#endif
|
||||||
|
b[ 2] = *(ao2 + 2);
|
||||||
|
b[ 3] = *(ao2 + 3);
|
||||||
|
b[ 4] = *(ao2 + 4);
|
||||||
|
b[ 5] = *(ao2 + 5);
|
||||||
|
b += 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i >= 3) {
|
||||||
|
b[ 0] = ZERO;
|
||||||
|
b[ 1] = ZERO;
|
||||||
|
#ifdef UNIT
|
||||||
|
b[ 2] = ONE;
|
||||||
|
#else
|
||||||
|
b[ 2] = *(ao3 + 2);
|
||||||
|
#endif
|
||||||
|
b[ 3] = *(ao3 + 3);
|
||||||
|
b[ 4] = *(ao3 + 4);
|
||||||
|
b[ 5] = *(ao3 + 5);
|
||||||
|
b += 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i >= 4) {
|
||||||
|
b[ 0] = ZERO;
|
||||||
|
b[ 1] = ZERO;
|
||||||
|
b[ 2] = ZERO;
|
||||||
|
#ifdef UNIT
|
||||||
|
b[ 3] = ONE;
|
||||||
|
#else
|
||||||
|
b[ 3] = *(ao4 + 3);
|
||||||
|
#endif
|
||||||
|
b[ 4] = *(ao4 + 4);
|
||||||
|
b[ 5] = *(ao4 + 5);
|
||||||
|
b += 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i >= 5) {
|
||||||
|
b[ 0] = ZERO;
|
||||||
|
b[ 1] = ZERO;
|
||||||
|
b[ 2] = ZERO;
|
||||||
|
b[ 3] = ZERO;
|
||||||
|
#ifdef UNIT
|
||||||
|
b[ 4] = ONE;
|
||||||
|
#else
|
||||||
|
b[ 4] = *(ao5 + 4);
|
||||||
|
#endif
|
||||||
|
b[ 5] = *(ao5 + 5);
|
||||||
|
b += 6;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
posY += 6;
|
||||||
|
js --;
|
||||||
|
} while (js > 0);
|
||||||
|
} /* End of main loop */
|
||||||
|
|
||||||
|
if ((n % 6) & 4){
|
||||||
|
X = posX;
|
||||||
|
|
||||||
|
if (posX <= posY) {
|
||||||
|
ao1 = a + posY + (posX + 0) * lda;
|
||||||
|
ao2 = a + posY + (posX + 1) * lda;
|
||||||
|
ao3 = a + posY + (posX + 2) * lda;
|
||||||
|
ao4 = a + posY + (posX + 3) * lda;
|
||||||
|
} else {
|
||||||
|
ao1 = a + posX + (posY + 0) * lda;
|
||||||
|
ao2 = a + posX + (posY + 1) * lda;
|
||||||
|
ao3 = a + posX + (posY + 2) * lda;
|
||||||
|
ao4 = a + posX + (posY + 3) * lda;
|
||||||
|
}
|
||||||
|
|
||||||
|
i = (m >> 1);
|
||||||
|
if (i > 0) {
|
||||||
|
do {
|
||||||
|
if (X > posY) {
|
||||||
|
ao1 += 2;
|
||||||
|
ao2 += 2;
|
||||||
|
ao3 += 2;
|
||||||
|
ao4 += 2;
|
||||||
|
b += 8;
|
||||||
|
} else if (X < posY) {
|
||||||
|
|
||||||
|
for (ii = 0; ii < 2; ii++){
|
||||||
|
b[ 0] = *(ao1 + 0);
|
||||||
|
b[ 1] = *(ao1 + 1);
|
||||||
|
b[ 2] = *(ao1 + 2);
|
||||||
|
b[ 3] = *(ao1 + 3);
|
||||||
|
ao1 += lda;
|
||||||
|
b += 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
ao2 += 2 * lda;
|
||||||
|
ao3 += 2 * lda;
|
||||||
|
ao4 += 2 * lda;
|
||||||
|
} else {
|
||||||
|
|
||||||
#ifdef UNIT
|
#ifdef UNIT
|
||||||
data02 = *(ao1 + 1);
|
b[ 0] = ONE;
|
||||||
data03 = *(ao1 + 2);
|
|
||||||
data04 = *(ao1 + 3);
|
|
||||||
|
|
||||||
data07 = *(ao2 + 2);
|
|
||||||
data08 = *(ao2 + 3);
|
|
||||||
|
|
||||||
data12 = *(ao3 + 3);
|
|
||||||
|
|
||||||
b[ 0] = ONE;
|
|
||||||
b[ 1] = data02;
|
|
||||||
b[ 2] = data03;
|
|
||||||
b[ 3] = data04;
|
|
||||||
|
|
||||||
b[ 4] = ZERO;
|
|
||||||
b[ 5] = ONE;
|
|
||||||
b[ 6] = data07;
|
|
||||||
b[ 7] = data08;
|
|
||||||
|
|
||||||
b[ 8] = ZERO;
|
|
||||||
b[ 9] = ZERO;
|
|
||||||
b[10] = ONE;
|
|
||||||
b[11] = data12;
|
|
||||||
|
|
||||||
b[12] = ZERO;
|
|
||||||
b[13] = ZERO;
|
|
||||||
b[14] = ZERO;
|
|
||||||
b[15] = ONE;
|
|
||||||
#else
|
#else
|
||||||
data01 = *(ao1 + 0);
|
b[ 0] = *(ao1 + 0);
|
||||||
data02 = *(ao1 + 1);
|
|
||||||
data03 = *(ao1 + 2);
|
|
||||||
data04 = *(ao1 + 3);
|
|
||||||
|
|
||||||
data06 = *(ao2 + 1);
|
|
||||||
data07 = *(ao2 + 2);
|
|
||||||
data08 = *(ao2 + 3);
|
|
||||||
|
|
||||||
data11 = *(ao3 + 2);
|
|
||||||
data12 = *(ao3 + 3);
|
|
||||||
|
|
||||||
data16 = *(ao4 + 3);
|
|
||||||
|
|
||||||
b[ 0] = data01;
|
|
||||||
b[ 1] = data02;
|
|
||||||
b[ 2] = data03;
|
|
||||||
b[ 3] = data04;
|
|
||||||
b[ 4] = ZERO;
|
|
||||||
b[ 5] = data06;
|
|
||||||
b[ 6] = data07;
|
|
||||||
b[ 7] = data08;
|
|
||||||
|
|
||||||
b[ 8] = ZERO;
|
|
||||||
b[ 9] = ZERO;
|
|
||||||
b[10] = data11;
|
|
||||||
b[11] = data12;
|
|
||||||
b[12] = ZERO;
|
|
||||||
b[13] = ZERO;
|
|
||||||
b[14] = ZERO;
|
|
||||||
b[15] = data16;
|
|
||||||
#endif
|
#endif
|
||||||
ao1 += 4;
|
b[ 1] = *(ao1 + 1);
|
||||||
ao2 += 4;
|
b[ 2] = *(ao1 + 2);
|
||||||
ao3 += 4;
|
b[ 3] = *(ao1 + 3);
|
||||||
ao4 += 4;
|
|
||||||
b += 16;
|
|
||||||
}
|
|
||||||
|
|
||||||
X += 4;
|
|
||||||
i --;
|
|
||||||
} while (i > 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
i = (m & 3);
|
|
||||||
if (i) {
|
|
||||||
|
|
||||||
if (X > posY) {
|
|
||||||
|
|
||||||
if (m & 2) {
|
|
||||||
ao1 += 2;
|
|
||||||
ao2 += 2;
|
|
||||||
ao3 += 2;
|
|
||||||
ao4 += 2;
|
|
||||||
b += 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m & 1) {
|
|
||||||
ao1 += 1;
|
|
||||||
ao2 += 1;
|
|
||||||
ao3 += 1;
|
|
||||||
ao4 += 1;
|
|
||||||
b += 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else
|
|
||||||
if (X < posY) {
|
|
||||||
if (m & 2) {
|
|
||||||
data01 = *(ao1 + 0);
|
|
||||||
data02 = *(ao1 + 1);
|
|
||||||
data03 = *(ao1 + 2);
|
|
||||||
data04 = *(ao1 + 3);
|
|
||||||
data05 = *(ao2 + 0);
|
|
||||||
data06 = *(ao2 + 1);
|
|
||||||
data07 = *(ao2 + 2);
|
|
||||||
data08 = *(ao2 + 3);
|
|
||||||
|
|
||||||
b[ 0] = data01;
|
|
||||||
b[ 1] = data02;
|
|
||||||
b[ 2] = data03;
|
|
||||||
b[ 3] = data04;
|
|
||||||
b[ 4] = data05;
|
|
||||||
b[ 5] = data06;
|
|
||||||
b[ 6] = data07;
|
|
||||||
b[ 7] = data08;
|
|
||||||
|
|
||||||
ao1 += 2 * lda;
|
|
||||||
ao2 += 2 * lda;
|
|
||||||
|
|
||||||
b += 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m & 1) {
|
|
||||||
data01 = *(ao1 + 0);
|
|
||||||
data02 = *(ao1 + 1);
|
|
||||||
data03 = *(ao1 + 2);
|
|
||||||
data04 = *(ao1 + 3);
|
|
||||||
|
|
||||||
b[ 0] = data01;
|
|
||||||
b[ 1] = data02;
|
|
||||||
b[ 2] = data03;
|
|
||||||
b[ 3] = data04;
|
|
||||||
|
|
||||||
ao1 += lda;
|
|
||||||
b += 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
|
b[ 4] = ZERO;
|
||||||
#ifdef UNIT
|
#ifdef UNIT
|
||||||
data02 = *(ao1 + 1);
|
b[ 5] = ONE;
|
||||||
data03 = *(ao1 + 2);
|
|
||||||
data04 = *(ao1 + 3);
|
|
||||||
|
|
||||||
if (i >= 2) {
|
|
||||||
data07 = *(ao2 + 2);
|
|
||||||
data08 = *(ao2 + 3);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i >= 3) {
|
|
||||||
data12 = *(ao3 + 3);
|
|
||||||
}
|
|
||||||
|
|
||||||
b[ 0] = ONE;
|
|
||||||
b[ 1] = data02;
|
|
||||||
b[ 2] = data03;
|
|
||||||
b[ 3] = data04;
|
|
||||||
b += 4;
|
|
||||||
|
|
||||||
if(i >= 2) {
|
|
||||||
b[ 0] = ZERO;
|
|
||||||
b[ 1] = ONE;
|
|
||||||
b[ 2] = data07;
|
|
||||||
b[ 3] = data08;
|
|
||||||
b += 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i >= 3) {
|
|
||||||
b[ 0] = ZERO;
|
|
||||||
b[ 1] = ZERO;
|
|
||||||
b[ 2] = ONE;
|
|
||||||
b[ 3] = data12;
|
|
||||||
b += 4;
|
|
||||||
}
|
|
||||||
#else
|
#else
|
||||||
data01 = *(ao1 + 0);
|
b[ 5] = *(ao2 + 1);
|
||||||
data02 = *(ao1 + 1);
|
|
||||||
data03 = *(ao1 + 2);
|
|
||||||
data04 = *(ao1 + 3);
|
|
||||||
|
|
||||||
if (i >= 2) {
|
|
||||||
data06 = *(ao2 + 1);
|
|
||||||
data07 = *(ao2 + 2);
|
|
||||||
data08 = *(ao2 + 3);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i >= 3) {
|
|
||||||
data11 = *(ao3 + 2);
|
|
||||||
data12 = *(ao3 + 3);
|
|
||||||
}
|
|
||||||
|
|
||||||
b[ 0] = data01;
|
|
||||||
b[ 1] = data02;
|
|
||||||
b[ 2] = data03;
|
|
||||||
b[ 3] = data04;
|
|
||||||
b += 4;
|
|
||||||
|
|
||||||
if(i >= 2) {
|
|
||||||
b[ 0] = ZERO;
|
|
||||||
b[ 1] = data06;
|
|
||||||
b[ 2] = data07;
|
|
||||||
b[ 3] = data08;
|
|
||||||
b += 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i >= 3) {
|
|
||||||
b[ 0] = ZERO;
|
|
||||||
b[ 1] = ZERO;
|
|
||||||
b[ 2] = data11;
|
|
||||||
b[ 3] = data12;
|
|
||||||
b += 4;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
}
|
b[ 6] = *(ao2 + 2);
|
||||||
}
|
b[ 7] = *(ao2 + 3);
|
||||||
|
|
||||||
posY += 4;
|
b[ 8] = ZERO;
|
||||||
js --;
|
b[ 9] = ZERO;
|
||||||
} while (js > 0);
|
|
||||||
} /* End of main loop */
|
|
||||||
|
|
||||||
|
|
||||||
if (n & 2){
|
|
||||||
X = posX;
|
|
||||||
|
|
||||||
if (posX <= posY) {
|
|
||||||
ao1 = a + posY + (posX + 0) * lda;
|
|
||||||
ao2 = a + posY + (posX + 1) * lda;
|
|
||||||
} else {
|
|
||||||
ao1 = a + posX + (posY + 0) * lda;
|
|
||||||
ao2 = a + posX + (posY + 1) * lda;
|
|
||||||
}
|
|
||||||
|
|
||||||
i = (m >> 1);
|
|
||||||
if (i > 0) {
|
|
||||||
do {
|
|
||||||
if (X > posY) {
|
|
||||||
ao1 += 2;
|
|
||||||
ao2 += 2;
|
|
||||||
b += 4;
|
|
||||||
|
|
||||||
} else
|
|
||||||
if (X < posY) {
|
|
||||||
data01 = *(ao1 + 0);
|
|
||||||
data02 = *(ao1 + 1);
|
|
||||||
data05 = *(ao2 + 0);
|
|
||||||
data06 = *(ao2 + 1);
|
|
||||||
|
|
||||||
b[ 0] = data01;
|
|
||||||
b[ 1] = data02;
|
|
||||||
b[ 2] = data05;
|
|
||||||
b[ 3] = data06;
|
|
||||||
|
|
||||||
ao1 += 2 * lda;
|
|
||||||
ao2 += 2 * lda;
|
|
||||||
b += 4;
|
|
||||||
} else {
|
|
||||||
#ifdef UNIT
|
#ifdef UNIT
|
||||||
data02 = *(ao1 + 1);
|
b[ 10] = ONE;
|
||||||
|
|
||||||
b[ 0] = ONE;
|
|
||||||
b[ 1] = data02;
|
|
||||||
b[ 2] = ZERO;
|
|
||||||
b[ 3] = ONE;
|
|
||||||
#else
|
#else
|
||||||
data01 = *(ao1 + 0);
|
b[ 10] = *(ao3 + 2);
|
||||||
data02 = *(ao1 + 1);
|
|
||||||
data06 = *(ao2 + 1);
|
|
||||||
|
|
||||||
b[ 0] = data01;
|
|
||||||
b[ 1] = data02;
|
|
||||||
b[ 2] = ZERO;
|
|
||||||
b[ 3] = data06;
|
|
||||||
#endif
|
#endif
|
||||||
ao1 += 2;
|
b[ 11] = *(ao3 + 3);
|
||||||
ao2 += 2;
|
|
||||||
b += 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
X += 2;
|
b[ 12] = ZERO;
|
||||||
i --;
|
b[ 13] = ZERO;
|
||||||
} while (i > 0);
|
b[ 14] = ZERO;
|
||||||
}
|
|
||||||
|
|
||||||
i = (m & 1);
|
|
||||||
if (i) {
|
|
||||||
|
|
||||||
if (X > posY) {
|
|
||||||
ao1 += 1;
|
|
||||||
ao2 += 1;
|
|
||||||
|
|
||||||
b += 2;
|
|
||||||
} else
|
|
||||||
if (X < posY) {
|
|
||||||
data01 = *(ao1 + 0);
|
|
||||||
data02 = *(ao1 + 1);
|
|
||||||
|
|
||||||
b[ 0] = data01;
|
|
||||||
b[ 1] = data02;
|
|
||||||
ao1 += lda;
|
|
||||||
b += 2;
|
|
||||||
} else {
|
|
||||||
#ifdef UNIT
|
#ifdef UNIT
|
||||||
data02 = *(ao1 + 1);
|
b[ 15] = ONE;
|
||||||
|
|
||||||
b[ 0] = ONE;
|
|
||||||
b[ 1] = data02;
|
|
||||||
#else
|
#else
|
||||||
data01 = *(ao1 + 0);
|
b[ 15] = *(ao4 + 3);
|
||||||
data02 = *(ao1 + 1);
|
|
||||||
|
|
||||||
b[ 0] = data01;
|
|
||||||
b[ 1] = data02;
|
|
||||||
#endif
|
#endif
|
||||||
b += 2;
|
ao1 += 4;
|
||||||
}
|
ao2 += 4;
|
||||||
}
|
ao3 += 4;
|
||||||
posY += 2;
|
ao4 += 4;
|
||||||
}
|
b += 16;
|
||||||
|
X += 4;
|
||||||
|
i -= 2;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
X += 2;
|
||||||
|
i --;
|
||||||
|
} while (i > 0);
|
||||||
|
}
|
||||||
|
|
||||||
if (n & 1){
|
i = (m & 1);
|
||||||
X = posX;
|
if (i > 0) {
|
||||||
|
if (X > posY) {
|
||||||
|
/* ao1 += i;
|
||||||
|
ao2 += i;
|
||||||
|
ao3 += i;
|
||||||
|
ao4 += i; */
|
||||||
|
b += 4 * i;
|
||||||
|
} else if (X < posY) {
|
||||||
|
|
||||||
if (posX <= posY) {
|
for (ii = 0; ii < i; ii++){
|
||||||
ao1 = a + posY + (posX + 0) * lda;
|
|
||||||
} else {
|
|
||||||
ao1 = a + posX + (posY + 0) * lda;
|
|
||||||
}
|
|
||||||
|
|
||||||
i = m;
|
b[ 0] = *(ao1 + 0);
|
||||||
if (i > 0) {
|
b[ 1] = *(ao1 + 1);
|
||||||
do {
|
b[ 2] = *(ao1 + 2);
|
||||||
if (X > posY) {
|
b[ 3] = *(ao1 + 3);
|
||||||
b += 1;
|
|
||||||
ao1 += 1;
|
// ao1 += lda;
|
||||||
} else
|
// ao2 += lda;
|
||||||
if (X < posY) {
|
// ao3 += lda;
|
||||||
data01 = *(ao1 + 0);
|
// ao4 += lda;
|
||||||
b[ 0] = data01;
|
b += 4;
|
||||||
ao1 += lda;
|
}
|
||||||
b += 1;
|
} else {
|
||||||
} else {
|
|
||||||
#ifdef UNIT
|
#ifdef UNIT
|
||||||
b[ 0] = ONE;
|
b[ 0] = ONE;
|
||||||
#else
|
#else
|
||||||
data01 = *(ao1 + 0);
|
b[ 0] = *(ao1 + 0);
|
||||||
b[ 0] = data01;
|
|
||||||
#endif
|
#endif
|
||||||
ao1 += 1;
|
b[ 1] = *(ao1 + 1);
|
||||||
b += 1;
|
b[ 2] = *(ao1 + 2);
|
||||||
}
|
b[ 3] = *(ao1 + 3);
|
||||||
|
b += 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
posY += 4;
|
||||||
|
}
|
||||||
|
|
||||||
X ++;
|
|
||||||
i --;
|
|
||||||
} while (i > 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
posY += 1;
|
if ((n % 6) & 2){
|
||||||
}
|
X = posX;
|
||||||
|
|
||||||
return 0;
|
if (posX <= posY) {
|
||||||
|
ao1 = a + posY + (posX + 0) * lda;
|
||||||
|
ao2 = a + posY + (posX + 1) * lda;
|
||||||
|
} else {
|
||||||
|
ao1 = a + posX + (posY + 0) * lda;
|
||||||
|
ao2 = a + posX + (posY + 1) * lda;
|
||||||
|
}
|
||||||
|
|
||||||
|
i = (m >> 1);
|
||||||
|
if (i > 0) {
|
||||||
|
do {
|
||||||
|
if (X > posY) {
|
||||||
|
ao1 += 2;
|
||||||
|
ao2 += 2;
|
||||||
|
b += 4;
|
||||||
|
|
||||||
|
} else if (X < posY) {
|
||||||
|
data01 = *(ao1 + 0);
|
||||||
|
data02 = *(ao1 + 1);
|
||||||
|
data05 = *(ao2 + 0);
|
||||||
|
data06 = *(ao2 + 1);
|
||||||
|
|
||||||
|
b[ 0] = data01;
|
||||||
|
b[ 1] = data02;
|
||||||
|
b[ 2] = data05;
|
||||||
|
b[ 3] = data06;
|
||||||
|
|
||||||
|
ao1 += 2 * lda;
|
||||||
|
ao2 += 2 * lda;
|
||||||
|
b += 4;
|
||||||
|
} else {
|
||||||
|
#ifdef UNIT
|
||||||
|
data02 = *(ao1 + 1);
|
||||||
|
|
||||||
|
b[ 0] = ONE;
|
||||||
|
b[ 1] = data02;
|
||||||
|
b[ 2] = ZERO;
|
||||||
|
b[ 3] = ONE;
|
||||||
|
#else
|
||||||
|
data01 = *(ao1 + 0);
|
||||||
|
data02 = *(ao1 + 1);
|
||||||
|
data06 = *(ao2 + 1);
|
||||||
|
|
||||||
|
b[ 0] = data01;
|
||||||
|
b[ 1] = data02;
|
||||||
|
b[ 2] = ZERO;
|
||||||
|
b[ 3] = data06;
|
||||||
|
#endif
|
||||||
|
ao1 += 2;
|
||||||
|
ao2 += 2;
|
||||||
|
b += 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
X += 2;
|
||||||
|
i --;
|
||||||
|
} while (i > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
i = (m & 1);
|
||||||
|
if (i) {
|
||||||
|
|
||||||
|
if (X > posY) {
|
||||||
|
ao1 += 1;
|
||||||
|
ao2 += 1;
|
||||||
|
|
||||||
|
b += 2;
|
||||||
|
} else if (X < posY) {
|
||||||
|
data01 = *(ao1 + 0);
|
||||||
|
data02 = *(ao1 + 1);
|
||||||
|
|
||||||
|
b[ 0] = data01;
|
||||||
|
b[ 1] = data02;
|
||||||
|
ao1 += lda;
|
||||||
|
b += 2;
|
||||||
|
} else {
|
||||||
|
#ifdef UNIT
|
||||||
|
data02 = *(ao1 + 1);
|
||||||
|
|
||||||
|
b[ 0] = ONE;
|
||||||
|
b[ 1] = data02;
|
||||||
|
#else
|
||||||
|
data01 = *(ao1 + 0);
|
||||||
|
data02 = *(ao1 + 1);
|
||||||
|
|
||||||
|
b[ 0] = data01;
|
||||||
|
b[ 1] = data02;
|
||||||
|
#endif
|
||||||
|
b += 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
posY += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((n % 6) & 1){
|
||||||
|
X = posX;
|
||||||
|
|
||||||
|
if (posX <= posY) {
|
||||||
|
ao1 = a + posY + (posX + 0) * lda;
|
||||||
|
} else {
|
||||||
|
ao1 = a + posX + (posY + 0) * lda;
|
||||||
|
}
|
||||||
|
|
||||||
|
i = m;
|
||||||
|
if (i > 0) {
|
||||||
|
do {
|
||||||
|
if (X > posY) {
|
||||||
|
b += 1;
|
||||||
|
ao1 += 1;
|
||||||
|
} else if (X < posY) {
|
||||||
|
data01 = *(ao1 + 0);
|
||||||
|
b[ 0] = data01;
|
||||||
|
ao1 += lda;
|
||||||
|
b += 1;
|
||||||
|
} else {
|
||||||
|
#ifdef UNIT
|
||||||
|
b[ 0] = ONE;
|
||||||
|
#else
|
||||||
|
data01 = *(ao1 + 0);
|
||||||
|
b[ 0] = data01;
|
||||||
|
#endif
|
||||||
|
ao1 += 1;
|
||||||
|
b += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
X ++;
|
||||||
|
i --;
|
||||||
|
} while (i > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
posY += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -41,432 +41,510 @@
|
||||||
|
|
||||||
int CNAME(BLASLONG m, BLASLONG n, FLOAT *a, BLASLONG lda, BLASLONG posX, BLASLONG posY, FLOAT *b){
|
int CNAME(BLASLONG m, BLASLONG n, FLOAT *a, BLASLONG lda, BLASLONG posX, BLASLONG posY, FLOAT *b){
|
||||||
|
|
||||||
BLASLONG i, js;
|
BLASLONG i, js, ii;
|
||||||
BLASLONG X;
|
BLASLONG X;
|
||||||
|
|
||||||
FLOAT data01, data02, data03, data04, data05, data06, data07, data08;
|
FLOAT data01, data02, data05, data06;
|
||||||
FLOAT data09, data10, data11, data12, data13, data14, data15, data16;
|
FLOAT *ao1, *ao2, *ao3, *ao4, *ao5, *ao6;
|
||||||
FLOAT *ao1, *ao2, *ao3, *ao4;
|
|
||||||
|
|
||||||
js = (n >> 2);
|
js = (n / 6);
|
||||||
|
|
||||||
if (js > 0){
|
if (js > 0){
|
||||||
do {
|
do {
|
||||||
X = posX;
|
X = posX;
|
||||||
|
|
||||||
if (posX <= posY) {
|
if (posX <= posY) {
|
||||||
ao1 = a + posX + (posY + 0) * lda;
|
ao1 = a + posX + (posY + 0) * lda;
|
||||||
ao2 = a + posX + (posY + 1) * lda;
|
ao2 = a + posX + (posY + 1) * lda;
|
||||||
ao3 = a + posX + (posY + 2) * lda;
|
ao3 = a + posX + (posY + 2) * lda;
|
||||||
ao4 = a + posX + (posY + 3) * lda;
|
ao4 = a + posX + (posY + 3) * lda;
|
||||||
} else {
|
ao5 = a + posX + (posY + 4) * lda;
|
||||||
ao1 = a + posY + (posX + 0) * lda;
|
ao6 = a + posX + (posY + 5) * lda;
|
||||||
ao2 = a + posY + (posX + 1) * lda;
|
} else {
|
||||||
ao3 = a + posY + (posX + 2) * lda;
|
ao1 = a + posY + (posX + 0) * lda;
|
||||||
ao4 = a + posY + (posX + 3) * lda;
|
ao2 = a + posY + (posX + 1) * lda;
|
||||||
}
|
ao3 = a + posY + (posX + 2) * lda;
|
||||||
|
ao4 = a + posY + (posX + 3) * lda;
|
||||||
|
ao5 = a + posY + (posX + 4) * lda;
|
||||||
|
ao6 = a + posY + (posX + 5) * lda;
|
||||||
|
}
|
||||||
|
|
||||||
i = (m >> 2);
|
i = (m / 6);
|
||||||
if (i > 0) {
|
if (i > 0) {
|
||||||
do {
|
do {
|
||||||
if (X < posY) {
|
if (X < posY) {
|
||||||
ao1 += 4;
|
ao1 += 6;
|
||||||
ao2 += 4;
|
ao2 += 6;
|
||||||
ao3 += 4;
|
ao3 += 6;
|
||||||
ao4 += 4;
|
ao4 += 6;
|
||||||
b += 16;
|
ao5 += 6;
|
||||||
} else
|
ao6 += 6;
|
||||||
if (X > posY) {
|
|
||||||
data01 = *(ao1 + 0);
|
|
||||||
data02 = *(ao1 + 1);
|
|
||||||
data03 = *(ao1 + 2);
|
|
||||||
data04 = *(ao1 + 3);
|
|
||||||
|
|
||||||
data05 = *(ao2 + 0);
|
b += 36;
|
||||||
data06 = *(ao2 + 1);
|
} else if (X > posY) {
|
||||||
data07 = *(ao2 + 2);
|
for (ii = 0; ii < 6; ii++){
|
||||||
data08 = *(ao2 + 3);
|
|
||||||
|
|
||||||
data09 = *(ao3 + 0);
|
b[ 0] = *(ao1 + 0);
|
||||||
data10 = *(ao3 + 1);
|
b[ 1] = *(ao1 + 1);
|
||||||
data11 = *(ao3 + 2);
|
b[ 2] = *(ao1 + 2);
|
||||||
data12 = *(ao3 + 3);
|
b[ 3] = *(ao1 + 3);
|
||||||
|
b[ 4] = *(ao1 + 4);
|
||||||
|
b[ 5] = *(ao1 + 5);
|
||||||
|
|
||||||
data13 = *(ao4 + 0);
|
ao1 += lda;
|
||||||
data14 = *(ao4 + 1);
|
b += 6;
|
||||||
data15 = *(ao4 + 2);
|
}
|
||||||
data16 = *(ao4 + 3);
|
ao2 += 6 * lda;
|
||||||
|
ao3 += 6 * lda;
|
||||||
|
ao4 += 6 * lda;
|
||||||
|
ao5 += 6 * lda;
|
||||||
|
ao6 += 6 * lda;
|
||||||
|
|
||||||
b[ 0] = data01;
|
} else {
|
||||||
b[ 1] = data02;
|
|
||||||
b[ 2] = data03;
|
|
||||||
b[ 3] = data04;
|
|
||||||
b[ 4] = data05;
|
|
||||||
b[ 5] = data06;
|
|
||||||
b[ 6] = data07;
|
|
||||||
b[ 7] = data08;
|
|
||||||
|
|
||||||
b[ 8] = data09;
|
|
||||||
b[ 9] = data10;
|
|
||||||
b[10] = data11;
|
|
||||||
b[11] = data12;
|
|
||||||
b[12] = data13;
|
|
||||||
b[13] = data14;
|
|
||||||
b[14] = data15;
|
|
||||||
b[15] = data16;
|
|
||||||
|
|
||||||
ao1 += 4 * lda;
|
|
||||||
ao2 += 4 * lda;
|
|
||||||
ao3 += 4 * lda;
|
|
||||||
ao4 += 4 * lda;
|
|
||||||
b += 16;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
#ifdef UNIT
|
#ifdef UNIT
|
||||||
data05 = *(ao2 + 0);
|
b[ 0] = ONE;
|
||||||
data09 = *(ao3 + 0);
|
|
||||||
data10 = *(ao3 + 1);
|
|
||||||
data13 = *(ao4 + 0);
|
|
||||||
data14 = *(ao4 + 1);
|
|
||||||
data15 = *(ao4 + 2);
|
|
||||||
|
|
||||||
b[ 0] = ONE;
|
|
||||||
b[ 1] = ZERO;
|
|
||||||
b[ 2] = ZERO;
|
|
||||||
b[ 3] = ZERO;
|
|
||||||
|
|
||||||
b[ 4] = data05;
|
|
||||||
b[ 5] = ONE;
|
|
||||||
b[ 6] = ZERO;
|
|
||||||
b[ 7] = ZERO;
|
|
||||||
|
|
||||||
b[ 8] = data09;
|
|
||||||
b[ 9] = data10;
|
|
||||||
b[10] = ONE;
|
|
||||||
b[11] = ZERO;
|
|
||||||
|
|
||||||
b[12] = data13;
|
|
||||||
b[13] = data14;
|
|
||||||
b[14] = data15;
|
|
||||||
b[15] = ONE;
|
|
||||||
#else
|
#else
|
||||||
data01 = *(ao1 + 0);
|
b[ 0] = *(ao1 + 0);
|
||||||
data05 = *(ao2 + 0);
|
#endif
|
||||||
data06 = *(ao2 + 1);
|
b[ 1] = ZERO;
|
||||||
data09 = *(ao3 + 0);
|
b[ 2] = ZERO;
|
||||||
data10 = *(ao3 + 1);
|
b[ 3] = ZERO;
|
||||||
data11 = *(ao3 + 2);
|
b[ 4] = ZERO;
|
||||||
data13 = *(ao4 + 0);
|
b[ 5] = ZERO;
|
||||||
data14 = *(ao4 + 1);
|
|
||||||
data15 = *(ao4 + 2);
|
|
||||||
data16 = *(ao4 + 3);
|
|
||||||
|
|
||||||
b[ 0] = data01;
|
b[ 6] = *(ao2 + 0);
|
||||||
b[ 1] = ZERO;
|
#ifdef UNIT
|
||||||
b[ 2] = ZERO;
|
b[ 7] = ONE;
|
||||||
b[ 3] = ZERO;
|
#else
|
||||||
|
b[ 7] = *(ao2 + 1);
|
||||||
|
#endif
|
||||||
|
b[ 8] = ZERO;
|
||||||
|
b[ 9] = ZERO;
|
||||||
|
b[10] = ZERO;
|
||||||
|
b[11] = ZERO;
|
||||||
|
|
||||||
b[ 4] = data05;
|
b[12] = *(ao3 + 0);
|
||||||
b[ 5] = data06;
|
b[13] = *(ao3 + 1);
|
||||||
b[ 6] = ZERO;
|
#ifdef UNIT
|
||||||
b[ 7] = ZERO;
|
b[14] = ONE;
|
||||||
|
#else
|
||||||
|
b[14] = *(ao3 + 2);
|
||||||
|
#endif
|
||||||
|
b[15] = ZERO;
|
||||||
|
b[16] = ZERO;
|
||||||
|
b[17] = ZERO;
|
||||||
|
|
||||||
b[ 8] = data09;
|
b[18] = *(ao4 + 0);
|
||||||
b[ 9] = data10;
|
b[19] = *(ao4 + 1);
|
||||||
b[10] = data11;
|
b[20] = *(ao4 + 2);
|
||||||
b[11] = ZERO;
|
#ifdef UNIT
|
||||||
|
b[21] = ONE;
|
||||||
|
#else
|
||||||
|
b[21] = *(ao4 + 3);
|
||||||
|
#endif
|
||||||
|
b[22] = ZERO;
|
||||||
|
b[23] = ZERO;
|
||||||
|
|
||||||
b[12] = data13;
|
b[24] = *(ao5 + 0);
|
||||||
b[13] = data14;
|
b[25] = *(ao5 + 1);
|
||||||
b[14] = data15;
|
b[26] = *(ao5 + 2);
|
||||||
b[15] = data16;
|
b[27] = *(ao5 + 3);
|
||||||
|
#ifdef UNIT
|
||||||
|
b[28] = ONE;
|
||||||
|
#else
|
||||||
|
b[28] = *(ao5 + 4);
|
||||||
|
#endif
|
||||||
|
b[29] = ZERO;
|
||||||
|
|
||||||
|
b[30] = *(ao6 + 0);
|
||||||
|
b[31] = *(ao6 + 1);
|
||||||
|
b[32] = *(ao6 + 2);
|
||||||
|
b[33] = *(ao6 + 3);
|
||||||
|
b[34] = *(ao6 + 4);
|
||||||
|
#ifdef UNIT
|
||||||
|
b[35] = ONE;
|
||||||
|
#else
|
||||||
|
b[35] = *(ao6 + 5);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ao1 += 4 * lda;
|
ao1 += 6 * lda;
|
||||||
ao2 += 4 * lda;
|
ao2 += 6 * lda;
|
||||||
ao3 += 4 * lda;
|
ao3 += 6 * lda;
|
||||||
ao4 += 4 * lda;
|
ao4 += 6 * lda;
|
||||||
|
ao5 += 6 * lda;
|
||||||
|
ao6 += 6 * lda;
|
||||||
|
|
||||||
b += 16;
|
b += 36;
|
||||||
}
|
}
|
||||||
|
|
||||||
X += 4;
|
X += 6;
|
||||||
i --;
|
i --;
|
||||||
} while (i > 0);
|
} while (i > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
i = (m & 3);
|
i = m % 6;
|
||||||
if (i) {
|
if (i > 0) {
|
||||||
|
if (X < posY) {
|
||||||
|
|
||||||
if (X < posY) {
|
ao1 += i;
|
||||||
|
ao2 += i;
|
||||||
|
ao3 += i;
|
||||||
|
ao4 += i;
|
||||||
|
ao5 += i;
|
||||||
|
ao6 += i;
|
||||||
|
b += 6 * i;
|
||||||
|
|
||||||
if (m & 2) {
|
} else if (X > posY) {
|
||||||
ao1 += 2;
|
for (ii = 0; ii < i; ii++){
|
||||||
ao2 += 2;
|
|
||||||
ao3 += 2;
|
|
||||||
ao4 += 2;
|
|
||||||
b += 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m & 1) {
|
b[ 0] = *(ao1 + 0);
|
||||||
ao1 += 1;
|
b[ 1] = *(ao1 + 1);
|
||||||
ao2 += 1;
|
b[ 2] = *(ao1 + 2);
|
||||||
ao3 += 1;
|
b[ 3] = *(ao1 + 3);
|
||||||
ao4 += 1;
|
b[ 4] = *(ao1 + 4);
|
||||||
b += 4;
|
b[ 5] = *(ao1 + 5);
|
||||||
}
|
|
||||||
|
|
||||||
} else
|
ao1 += lda;
|
||||||
if (X > posY) {
|
ao2 += lda;
|
||||||
if (m & 2) {
|
ao3 += lda;
|
||||||
data01 = *(ao1 + 0);
|
ao4 += lda;
|
||||||
data02 = *(ao1 + 1);
|
ao5 += lda;
|
||||||
data03 = *(ao1 + 2);
|
ao6 += lda;
|
||||||
data04 = *(ao1 + 3);
|
b += 6;
|
||||||
data05 = *(ao2 + 0);
|
}
|
||||||
data06 = *(ao2 + 1);
|
} else {
|
||||||
data07 = *(ao2 + 2);
|
|
||||||
data08 = *(ao2 + 3);
|
|
||||||
|
|
||||||
b[ 0] = data01;
|
|
||||||
b[ 1] = data02;
|
|
||||||
b[ 2] = data03;
|
|
||||||
b[ 3] = data04;
|
|
||||||
b[ 4] = data05;
|
|
||||||
b[ 5] = data06;
|
|
||||||
b[ 6] = data07;
|
|
||||||
b[ 7] = data08;
|
|
||||||
|
|
||||||
ao1 += 2 * lda;
|
|
||||||
ao2 += 2 * lda;
|
|
||||||
b += 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m & 1) {
|
|
||||||
data01 = *(ao1 + 0);
|
|
||||||
data02 = *(ao1 + 1);
|
|
||||||
data03 = *(ao1 + 2);
|
|
||||||
data04 = *(ao1 + 3);
|
|
||||||
|
|
||||||
b[ 0] = data01;
|
|
||||||
b[ 1] = data02;
|
|
||||||
b[ 2] = data03;
|
|
||||||
b[ 3] = data04;
|
|
||||||
|
|
||||||
ao1 += lda;
|
|
||||||
b += 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
#ifdef UNIT
|
#ifdef UNIT
|
||||||
if (i >= 2) {
|
b[ 0] = ONE;
|
||||||
data05 = *(ao2 + 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i >= 3) {
|
|
||||||
data09 = *(ao3 + 0);
|
|
||||||
data10 = *(ao3 + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
b[ 0] = ONE;
|
|
||||||
b[ 1] = ZERO;
|
|
||||||
b[ 2] = ZERO;
|
|
||||||
b[ 3] = ZERO;
|
|
||||||
b += 4;
|
|
||||||
|
|
||||||
if(i >= 2) {
|
|
||||||
b[ 0] = data05;
|
|
||||||
b[ 1] = ONE;
|
|
||||||
b[ 2] = ZERO;
|
|
||||||
b[ 3] = ZERO;
|
|
||||||
b += 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i >= 3) {
|
|
||||||
b[ 0] = data09;
|
|
||||||
b[ 1] = data10;
|
|
||||||
b[ 2] = ONE;
|
|
||||||
b[ 3] = ZERO;
|
|
||||||
b += 4;
|
|
||||||
}
|
|
||||||
#else
|
#else
|
||||||
data01 = *(ao1 + 0);
|
b[ 0] = *(ao1 + 0);
|
||||||
|
|
||||||
if (i >= 2) {
|
|
||||||
data05 = *(ao2 + 0);
|
|
||||||
data06 = *(ao2 + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i >= 3) {
|
|
||||||
data09 = *(ao3 + 0);
|
|
||||||
data10 = *(ao3 + 1);
|
|
||||||
data11 = *(ao3 + 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
b[ 0] = data01;
|
|
||||||
b[ 1] = ZERO;
|
|
||||||
b[ 2] = ZERO;
|
|
||||||
b[ 3] = ZERO;
|
|
||||||
b += 4;
|
|
||||||
|
|
||||||
if(i >= 2) {
|
|
||||||
b[ 0] = data05;
|
|
||||||
b[ 1] = data06;
|
|
||||||
b[ 2] = ZERO;
|
|
||||||
b[ 3] = ZERO;
|
|
||||||
b += 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i >= 3) {
|
|
||||||
b[ 0] = data09;
|
|
||||||
b[ 1] = data10;
|
|
||||||
b[ 2] = data11;
|
|
||||||
b[ 3] = ZERO;
|
|
||||||
b += 4;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
}
|
b[ 1] = ZERO;
|
||||||
}
|
b[ 2] = ZERO;
|
||||||
|
b[ 3] = ZERO;
|
||||||
|
b[ 4] = ZERO;
|
||||||
|
b[ 5] = ZERO;
|
||||||
|
|
||||||
posY += 4;
|
if (i >= 2) {
|
||||||
js --;
|
b[ 0] = *(ao2 + 0);
|
||||||
} while (js > 0);
|
|
||||||
} /* End of main loop */
|
|
||||||
|
|
||||||
if (n & 2){
|
|
||||||
X = posX;
|
|
||||||
|
|
||||||
if (posX <= posY) {
|
|
||||||
ao1 = a + posX + (posY + 0) * lda;
|
|
||||||
ao2 = a + posX + (posY + 1) * lda;
|
|
||||||
} else {
|
|
||||||
ao1 = a + posY + (posX + 0) * lda;
|
|
||||||
ao2 = a + posY + (posX + 1) * lda;
|
|
||||||
}
|
|
||||||
|
|
||||||
i = (m >> 1);
|
|
||||||
if (i > 0) {
|
|
||||||
do {
|
|
||||||
if (X < posY) {
|
|
||||||
ao1 += 2;
|
|
||||||
ao2 += 2;
|
|
||||||
b += 4;
|
|
||||||
|
|
||||||
} else
|
|
||||||
if (X > posY) {
|
|
||||||
data01 = *(ao1 + 0);
|
|
||||||
data02 = *(ao1 + 1);
|
|
||||||
data05 = *(ao2 + 0);
|
|
||||||
data06 = *(ao2 + 1);
|
|
||||||
|
|
||||||
b[ 0] = data01;
|
|
||||||
b[ 1] = data02;
|
|
||||||
b[ 2] = data05;
|
|
||||||
b[ 3] = data06;
|
|
||||||
|
|
||||||
ao1 += 2 * lda;
|
|
||||||
ao2 += 2 * lda;
|
|
||||||
b += 4;
|
|
||||||
} else {
|
|
||||||
#ifdef UNIT
|
#ifdef UNIT
|
||||||
data05 = *(ao2 + 0);
|
b[ 1] = ONE;
|
||||||
|
|
||||||
b[ 0] = ONE;
|
|
||||||
b[ 1] = ZERO;
|
|
||||||
b[ 2] = data05;
|
|
||||||
b[ 3] = ONE;
|
|
||||||
#else
|
#else
|
||||||
data01 = *(ao1 + 0);
|
b[ 1] = *(ao2 + 1);
|
||||||
data05 = *(ao2 + 0);
|
|
||||||
data06 = *(ao2 + 1);
|
|
||||||
|
|
||||||
b[ 0] = data01;
|
|
||||||
b[ 1] = ZERO;
|
|
||||||
b[ 2] = data05;
|
|
||||||
b[ 3] = data06;
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
ao1 += 2 * lda;
|
b[ 2] = ZERO;
|
||||||
ao2 += 2 * lda;
|
b[ 3] = ZERO;
|
||||||
b += 4;
|
b[ 4] = ZERO;
|
||||||
}
|
b[ 5] = ZERO;
|
||||||
|
b += 6;
|
||||||
|
}
|
||||||
|
|
||||||
X += 2;
|
if (i >= 3) {
|
||||||
i --;
|
b[ 0] = *(ao3 + 0);
|
||||||
} while (i > 0);
|
b[ 1] = *(ao3 + 1);
|
||||||
}
|
|
||||||
|
|
||||||
i = (m & 1);
|
|
||||||
if (i) {
|
|
||||||
|
|
||||||
if (X < posY) {
|
|
||||||
ao1 += 2;
|
|
||||||
b += 2;
|
|
||||||
} else
|
|
||||||
if (X > posY) {
|
|
||||||
data01 = *(ao1 + 0);
|
|
||||||
data02 = *(ao1 + 1);
|
|
||||||
|
|
||||||
b[ 0] = data01;
|
|
||||||
b[ 1] = data02;
|
|
||||||
|
|
||||||
ao1 += lda;
|
|
||||||
b += 2;
|
|
||||||
} else {
|
|
||||||
#ifdef UNIT
|
#ifdef UNIT
|
||||||
b[ 0] = ONE;
|
b[ 2] = ONE;
|
||||||
b[ 1] = ZERO;
|
|
||||||
#else
|
#else
|
||||||
data01 = *(ao1 + 0);
|
b[ 2] = *(ao3 + 2);
|
||||||
|
|
||||||
b[ 0] = data01;
|
|
||||||
b[ 1] = ZERO;
|
|
||||||
#endif
|
#endif
|
||||||
b += 2;
|
b[ 3] = ZERO;
|
||||||
}
|
b[ 4] = ZERO;
|
||||||
}
|
b[ 5] = ZERO;
|
||||||
posY += 2;
|
b += 6;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (n & 1){
|
if (i >= 4) {
|
||||||
X = posX;
|
b[ 0] = *(ao4 + 0);
|
||||||
|
b[ 1] = *(ao4 + 1);
|
||||||
if (posX <= posY) {
|
b[ 2] = *(ao4 + 2);
|
||||||
ao1 = a + posX + (posY + 0) * lda;
|
|
||||||
} else {
|
|
||||||
ao1 = a + posY + (posX + 0) * lda;
|
|
||||||
}
|
|
||||||
|
|
||||||
i = m;
|
|
||||||
if (m > 0) {
|
|
||||||
do {
|
|
||||||
|
|
||||||
if (X < posY) {
|
|
||||||
b += 1;
|
|
||||||
ao1 += 1;
|
|
||||||
} else
|
|
||||||
if (X > posY) {
|
|
||||||
data01 = *(ao1 + 0);
|
|
||||||
b[ 0] = data01;
|
|
||||||
ao1 += lda;
|
|
||||||
b += 1;
|
|
||||||
} else {
|
|
||||||
#ifdef UNIT
|
#ifdef UNIT
|
||||||
b[ 0] = ONE;
|
b[ 3] = ONE;
|
||||||
#else
|
#else
|
||||||
data01 = *(ao1 + 0);
|
b[ 3] = *(ao4 + 3);
|
||||||
b[ 0] = data01;
|
|
||||||
#endif
|
#endif
|
||||||
ao1 += lda;
|
b[ 4] = ZERO;
|
||||||
b += 1;
|
b[ 5] = ZERO;
|
||||||
}
|
b += 6;
|
||||||
|
}
|
||||||
|
|
||||||
X += 1;
|
if (i >= 5) {
|
||||||
i --;
|
b[ 0] = *(ao5 + 0);
|
||||||
} while (i > 0);
|
b[ 1] = *(ao5 + 1);
|
||||||
}
|
b[ 2] = *(ao5 + 2);
|
||||||
}
|
b[ 3] = *(ao5 + 3);
|
||||||
|
#ifdef UNIT
|
||||||
|
b[ 4] = ONE;
|
||||||
|
#else
|
||||||
|
b[ 4] = *(ao5 + 4);
|
||||||
|
#endif
|
||||||
|
b[ 5] = ZERO;
|
||||||
|
b += 6;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
posY += 6;
|
||||||
|
js --;
|
||||||
|
} while (js > 0);
|
||||||
|
} /* End of main loop */
|
||||||
|
|
||||||
|
if ((n % 6) & 4){
|
||||||
|
X = posX;
|
||||||
|
|
||||||
|
if (posX <= posY) {
|
||||||
|
ao1 = a + posX + (posY + 0) * lda;
|
||||||
|
ao2 = a + posX + (posY + 1) * lda;
|
||||||
|
ao3 = a + posX + (posY + 2) * lda;
|
||||||
|
ao4 = a + posX + (posY + 3) * lda;
|
||||||
|
} else {
|
||||||
|
ao1 = a + posY + (posX + 0) * lda;
|
||||||
|
ao2 = a + posY + (posX + 1) * lda;
|
||||||
|
ao3 = a + posY + (posX + 2) * lda;
|
||||||
|
ao4 = a + posY + (posX + 3) * lda;
|
||||||
|
}
|
||||||
|
|
||||||
|
i = (m >> 1);
|
||||||
|
if (i > 0) {
|
||||||
|
do {
|
||||||
|
if (X < posY) {
|
||||||
|
ao1 += 2;
|
||||||
|
ao2 += 2;
|
||||||
|
ao3 += 2;
|
||||||
|
ao4 += 2;
|
||||||
|
b += 8;
|
||||||
|
} else if (X > posY) {
|
||||||
|
for (ii = 0; ii < 2; ii++){
|
||||||
|
|
||||||
|
b[ 0] = *(ao1 + 0);
|
||||||
|
b[ 1] = *(ao1 + 1);
|
||||||
|
b[ 2] = *(ao1 + 2);
|
||||||
|
b[ 3] = *(ao1 + 3);
|
||||||
|
ao1 += lda;
|
||||||
|
b += 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
ao2 += 2 * lda;
|
||||||
|
ao3 += 2 * lda;
|
||||||
|
ao4 += 2 * lda;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
#ifdef UNIT
|
||||||
|
b[ 0] = ONE;
|
||||||
|
#else
|
||||||
|
b[ 0] = *(ao1 + 0);
|
||||||
|
#endif
|
||||||
|
b[ 1] = ZERO;
|
||||||
|
b[ 2] = ZERO;
|
||||||
|
b[ 3] = ZERO;
|
||||||
|
|
||||||
|
b[ 4] = *(ao2 + 0);
|
||||||
|
#ifdef UNIT
|
||||||
|
b[ 5] = ONE;
|
||||||
|
#else
|
||||||
|
b[ 5] = *(ao2 + 1);
|
||||||
|
#endif
|
||||||
|
b[ 6] = ZERO;
|
||||||
|
b[ 7] = ZERO;
|
||||||
|
|
||||||
|
b[ 8] = *(ao3 + 0);
|
||||||
|
b[ 9] = *(ao3 + 1);
|
||||||
|
#ifdef UNIT
|
||||||
|
b[ 10] = ONE;
|
||||||
|
#else
|
||||||
|
b[ 10] = *(ao3 + 2);
|
||||||
|
#endif
|
||||||
|
b[ 11] = ZERO;
|
||||||
|
|
||||||
|
b[ 12] = *(ao4 + 0);
|
||||||
|
b[ 13] = *(ao4 + 1);
|
||||||
|
b[ 14] = *(ao4 + 2);
|
||||||
|
#ifdef UNIT
|
||||||
|
b[ 15] = ONE;
|
||||||
|
#else
|
||||||
|
b[ 15] = *(ao4 + 3);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ao1 += 4 * lda;
|
||||||
|
ao2 += 4 * lda;
|
||||||
|
ao3 += 4 * lda;
|
||||||
|
ao4 += 4 * lda;
|
||||||
|
b += 16;
|
||||||
|
X += 4;
|
||||||
|
i -= 2;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
X += 2;
|
||||||
|
i --;
|
||||||
|
} while (i > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
i = (m & 1);
|
||||||
|
if (i > 0) {
|
||||||
|
if (X < posY) {
|
||||||
|
ao1 += i;
|
||||||
|
ao2 += i;
|
||||||
|
ao3 += i;
|
||||||
|
ao4 += i;
|
||||||
|
b += 4 * i;
|
||||||
|
} else if (X > posY) {
|
||||||
|
for (ii = 0; ii < i; ii++){
|
||||||
|
|
||||||
|
b[ 0] = *(ao1 + 0);
|
||||||
|
b[ 1] = *(ao1 + 1);
|
||||||
|
b[ 2] = *(ao1 + 2);
|
||||||
|
b[ 3] = *(ao1 + 3);
|
||||||
|
ao1 += lda;
|
||||||
|
b += 4;
|
||||||
|
}
|
||||||
|
ao2 += lda;
|
||||||
|
ao3 += lda;
|
||||||
|
ao4 += lda;
|
||||||
|
} else {
|
||||||
|
|
||||||
|
#ifdef UNIT
|
||||||
|
b[ 0] = ONE;
|
||||||
|
#else
|
||||||
|
b[ 0] = *(ao1 + 0);
|
||||||
|
#endif
|
||||||
|
b[ 1] = ZERO;
|
||||||
|
b[ 2] = ZERO;
|
||||||
|
b[ 3] = ZERO;
|
||||||
|
b += 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
posY += 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((n % 6) & 2){
|
||||||
|
X = posX;
|
||||||
|
|
||||||
|
if (posX <= posY) {
|
||||||
|
ao1 = a + posX + (posY + 0) * lda;
|
||||||
|
ao2 = a + posX + (posY + 1) * lda;
|
||||||
|
} else {
|
||||||
|
ao1 = a + posY + (posX + 0) * lda;
|
||||||
|
ao2 = a + posY + (posX + 1) * lda;
|
||||||
|
}
|
||||||
|
|
||||||
|
i = (m >> 1);
|
||||||
|
if (i > 0) {
|
||||||
|
do {
|
||||||
|
if (X < posY) {
|
||||||
|
ao1 += 2;
|
||||||
|
ao2 += 2;
|
||||||
|
b += 4;
|
||||||
|
|
||||||
|
} else if (X > posY) {
|
||||||
|
data01 = *(ao1 + 0);
|
||||||
|
data02 = *(ao1 + 1);
|
||||||
|
data05 = *(ao2 + 0);
|
||||||
|
data06 = *(ao2 + 1);
|
||||||
|
|
||||||
|
b[ 0] = data01;
|
||||||
|
b[ 1] = data02;
|
||||||
|
b[ 2] = data05;
|
||||||
|
b[ 3] = data06;
|
||||||
|
|
||||||
|
ao1 += 2 * lda;
|
||||||
|
ao2 += 2 * lda;
|
||||||
|
b += 4;
|
||||||
|
} else {
|
||||||
|
#ifdef UNIT
|
||||||
|
data05 = *(ao2 + 0);
|
||||||
|
|
||||||
|
b[ 0] = ONE;
|
||||||
|
b[ 1] = ZERO;
|
||||||
|
b[ 2] = data05;
|
||||||
|
b[ 3] = ONE;
|
||||||
|
#else
|
||||||
|
data01 = *(ao1 + 0);
|
||||||
|
data05 = *(ao2 + 0);
|
||||||
|
data06 = *(ao2 + 1);
|
||||||
|
|
||||||
|
b[ 0] = data01;
|
||||||
|
b[ 1] = ZERO;
|
||||||
|
b[ 2] = data05;
|
||||||
|
b[ 3] = data06;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
ao1 += 2 * lda;
|
||||||
|
ao2 += 2 * lda;
|
||||||
|
b += 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
X += 2;
|
||||||
|
i --;
|
||||||
|
} while (i > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
i = (m & 1);
|
||||||
|
if (i) {
|
||||||
|
|
||||||
|
if (X < posY) {
|
||||||
|
ao1 += 2;
|
||||||
|
b += 2;
|
||||||
|
} else if (X > posY) {
|
||||||
|
data01 = *(ao1 + 0);
|
||||||
|
data02 = *(ao1 + 1);
|
||||||
|
|
||||||
|
b[ 0] = data01;
|
||||||
|
b[ 1] = data02;
|
||||||
|
|
||||||
|
ao1 += lda;
|
||||||
|
b += 2;
|
||||||
|
} else {
|
||||||
|
#ifdef UNIT
|
||||||
|
b[ 0] = ONE;
|
||||||
|
b[ 1] = ZERO;
|
||||||
|
#else
|
||||||
|
data01 = *(ao1 + 0);
|
||||||
|
|
||||||
|
b[ 0] = data01;
|
||||||
|
b[ 1] = ZERO;
|
||||||
|
#endif
|
||||||
|
b += 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
posY += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((n % 6) & 1){
|
||||||
|
X = posX;
|
||||||
|
|
||||||
|
if (posX <= posY) {
|
||||||
|
ao1 = a + posX + (posY + 0) * lda;
|
||||||
|
} else {
|
||||||
|
ao1 = a + posY + (posX + 0) * lda;
|
||||||
|
}
|
||||||
|
|
||||||
|
i = m;
|
||||||
|
if (m > 0) {
|
||||||
|
do {
|
||||||
|
if (X < posY) {
|
||||||
|
b += 1;
|
||||||
|
ao1 += 1;
|
||||||
|
} else if (X > posY) {
|
||||||
|
data01 = *(ao1 + 0);
|
||||||
|
b[ 0] = data01;
|
||||||
|
ao1 += lda;
|
||||||
|
b += 1;
|
||||||
|
} else {
|
||||||
|
#ifdef UNIT
|
||||||
|
b[ 0] = ONE;
|
||||||
|
#else
|
||||||
|
data01 = *(ao1 + 0);
|
||||||
|
b[ 0] = data01;
|
||||||
|
#endif
|
||||||
|
ao1 += lda;
|
||||||
|
b += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
X += 1;
|
||||||
|
i --;
|
||||||
|
} while (i > 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,22 +49,416 @@ int CNAME(BLASLONG m, BLASLONG n, FLOAT *a, BLASLONG lda, BLASLONG offset, FLOAT
|
||||||
|
|
||||||
BLASLONG i, ii, j, jj;
|
BLASLONG i, ii, j, jj;
|
||||||
|
|
||||||
FLOAT data01, data02, data03, data04, data05, data06, data07, data08;
|
FLOAT data01, data02, data03, data04, data05, data06;
|
||||||
FLOAT data09, data10, data11, data12, data13, data14, data15, data16;
|
FLOAT data09, data10, data11, data12, data13, data14;
|
||||||
FLOAT *a1, *a2, *a3, *a4;
|
FLOAT data17, data18, data19, data20, data21, data22;
|
||||||
|
FLOAT data25, data26, data27, data28, data29, data30;
|
||||||
|
FLOAT data33, data34, data35, data36, data37, data38;
|
||||||
|
FLOAT data41, data42, data43, data44, data45, data46;
|
||||||
|
|
||||||
|
FLOAT *a1, *a2, *a3, *a4, *a5, *a6, *a7, *a8;
|
||||||
|
|
||||||
jj = offset;
|
jj = offset;
|
||||||
|
|
||||||
j = (n >> 2);
|
BLASLONG mmod6, nmod6;
|
||||||
|
mmod6 = m - (m/6)*6 ;
|
||||||
|
nmod6 = n - (n/6)*6 ;
|
||||||
|
|
||||||
|
// j = (n >> 3);
|
||||||
|
j = (n / 6);
|
||||||
while (j > 0){
|
while (j > 0){
|
||||||
|
|
||||||
a1 = a + 0 * lda;
|
a1 = a + 0 * lda;
|
||||||
a2 = a + 1 * lda;
|
a2 = a + 1 * lda;
|
||||||
a3 = a + 2 * lda;
|
a3 = a + 2 * lda;
|
||||||
a4 = a + 3 * lda;
|
a4 = a + 3 * lda;
|
||||||
|
a5 = a + 4 * lda;
|
||||||
|
a6 = a + 5 * lda;
|
||||||
|
|
||||||
i = (m >> 2);
|
|
||||||
ii = 0;
|
ii = 0;
|
||||||
|
// i = (m >> 3);
|
||||||
|
i = (m / 6);
|
||||||
|
while (i > 0) {
|
||||||
|
|
||||||
|
if (ii == jj) {
|
||||||
|
#ifndef UNIT
|
||||||
|
data01 = *(a1 + 0);
|
||||||
|
#endif
|
||||||
|
data02 = *(a1 + 1);
|
||||||
|
data03 = *(a1 + 2);
|
||||||
|
data04 = *(a1 + 3);
|
||||||
|
data05 = *(a1 + 4);
|
||||||
|
data06 = *(a1 + 5);
|
||||||
|
|
||||||
|
#ifndef UNIT
|
||||||
|
data10 = *(a2 + 1);
|
||||||
|
#endif
|
||||||
|
data11 = *(a2 + 2);
|
||||||
|
data12 = *(a2 + 3);
|
||||||
|
data13 = *(a2 + 4);
|
||||||
|
data14 = *(a2 + 5);
|
||||||
|
|
||||||
|
#ifndef UNIT
|
||||||
|
data19 = *(a3 + 2);
|
||||||
|
#endif
|
||||||
|
data20 = *(a3 + 3);
|
||||||
|
data21 = *(a3 + 4);
|
||||||
|
data22 = *(a3 + 5);
|
||||||
|
|
||||||
|
#ifndef UNIT
|
||||||
|
data28 = *(a4 + 3);
|
||||||
|
#endif
|
||||||
|
data29 = *(a4 + 4);
|
||||||
|
data30 = *(a4 + 5);
|
||||||
|
|
||||||
|
#ifndef UNIT
|
||||||
|
data37 = *(a5 + 4);
|
||||||
|
#endif
|
||||||
|
data38 = *(a5 + 5);
|
||||||
|
|
||||||
|
#ifndef UNIT
|
||||||
|
data46 = *(a6 + 5);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
*(b + 0) = INV(data01);
|
||||||
|
|
||||||
|
*(b + 6) = data02;
|
||||||
|
*(b + 7) = INV(data10);
|
||||||
|
|
||||||
|
*(b + 12) = data03;
|
||||||
|
*(b + 13) = data11;
|
||||||
|
*(b + 14) = INV(data19);
|
||||||
|
|
||||||
|
*(b + 18) = data04;
|
||||||
|
*(b + 19) = data12;
|
||||||
|
*(b + 20) = data20;
|
||||||
|
*(b + 21) = INV(data28);
|
||||||
|
|
||||||
|
*(b + 24) = data05;
|
||||||
|
*(b + 25) = data13;
|
||||||
|
*(b + 26) = data21;
|
||||||
|
*(b + 27) = data29;
|
||||||
|
*(b + 28) = INV(data37);
|
||||||
|
|
||||||
|
*(b + 30) = data06;
|
||||||
|
*(b + 31) = data14;
|
||||||
|
*(b + 32) = data22;
|
||||||
|
*(b + 33) = data30;
|
||||||
|
*(b + 34) = data38;
|
||||||
|
*(b + 35) = INV(data46);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ii > jj) {
|
||||||
|
data01 = *(a1 + 0);
|
||||||
|
data02 = *(a1 + 1);
|
||||||
|
data03 = *(a1 + 2);
|
||||||
|
data04 = *(a1 + 3);
|
||||||
|
data05 = *(a1 + 4);
|
||||||
|
data06 = *(a1 + 5);
|
||||||
|
|
||||||
|
data09 = *(a2 + 0);
|
||||||
|
data10 = *(a2 + 1);
|
||||||
|
data11 = *(a2 + 2);
|
||||||
|
data12 = *(a2 + 3);
|
||||||
|
data13 = *(a2 + 4);
|
||||||
|
data14 = *(a2 + 5);
|
||||||
|
|
||||||
|
data17 = *(a3 + 0);
|
||||||
|
data18 = *(a3 + 1);
|
||||||
|
data19 = *(a3 + 2);
|
||||||
|
data20 = *(a3 + 3);
|
||||||
|
data21 = *(a3 + 4);
|
||||||
|
data22 = *(a3 + 5);
|
||||||
|
|
||||||
|
data25 = *(a4 + 0);
|
||||||
|
data26 = *(a4 + 1);
|
||||||
|
data27 = *(a4 + 2);
|
||||||
|
data28 = *(a4 + 3);
|
||||||
|
data29 = *(a4 + 4);
|
||||||
|
data30 = *(a4 + 5);
|
||||||
|
|
||||||
|
data33 = *(a5 + 0);
|
||||||
|
data34 = *(a5 + 1);
|
||||||
|
data35 = *(a5 + 2);
|
||||||
|
data36 = *(a5 + 3);
|
||||||
|
data37 = *(a5 + 4);
|
||||||
|
data38 = *(a5 + 5);
|
||||||
|
|
||||||
|
data41 = *(a6 + 0);
|
||||||
|
data42 = *(a6 + 1);
|
||||||
|
data43 = *(a6 + 2);
|
||||||
|
data44 = *(a6 + 3);
|
||||||
|
data45 = *(a6 + 4);
|
||||||
|
data46 = *(a6 + 5);
|
||||||
|
|
||||||
|
*(b + 0) = data01;
|
||||||
|
*(b + 1) = data09;
|
||||||
|
*(b + 2) = data17;
|
||||||
|
*(b + 3) = data25;
|
||||||
|
*(b + 4) = data33;
|
||||||
|
*(b + 5) = data41;
|
||||||
|
|
||||||
|
*(b + 6) = data02;
|
||||||
|
*(b + 7) = data10;
|
||||||
|
*(b + 8) = data18;
|
||||||
|
*(b + 9) = data26;
|
||||||
|
*(b + 10) = data34;
|
||||||
|
*(b + 11) = data42;
|
||||||
|
|
||||||
|
*(b + 12) = data03;
|
||||||
|
*(b + 13) = data11;
|
||||||
|
*(b + 14) = data19;
|
||||||
|
*(b + 15) = data27;
|
||||||
|
*(b + 16) = data35;
|
||||||
|
*(b + 17) = data43;
|
||||||
|
|
||||||
|
*(b + 18) = data04;
|
||||||
|
*(b + 19) = data12;
|
||||||
|
*(b + 20) = data20;
|
||||||
|
*(b + 21) = data28;
|
||||||
|
*(b + 22) = data36;
|
||||||
|
*(b + 23) = data44;
|
||||||
|
|
||||||
|
*(b + 24) = data05;
|
||||||
|
*(b + 25) = data13;
|
||||||
|
*(b + 26) = data21;
|
||||||
|
*(b + 27) = data29;
|
||||||
|
*(b + 28) = data37;
|
||||||
|
*(b + 29) = data45;
|
||||||
|
|
||||||
|
*(b + 30) = data06;
|
||||||
|
*(b + 31) = data14;
|
||||||
|
*(b + 32) = data22;
|
||||||
|
*(b + 33) = data30;
|
||||||
|
*(b + 34) = data38;
|
||||||
|
*(b + 35) = data46;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
a1 += 6;
|
||||||
|
a2 += 6;
|
||||||
|
a3 += 6;
|
||||||
|
a4 += 6;
|
||||||
|
a5 += 6;
|
||||||
|
a6 += 6;
|
||||||
|
a7 += 6;
|
||||||
|
a8 += 6;
|
||||||
|
b += 36;
|
||||||
|
|
||||||
|
i --;
|
||||||
|
ii += 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mmod6 & 4) {
|
||||||
|
if (ii == jj) {
|
||||||
|
#ifndef UNIT
|
||||||
|
data01 = *(a1 + 0);
|
||||||
|
#endif
|
||||||
|
data02 = *(a1 + 1);
|
||||||
|
data03 = *(a1 + 2);
|
||||||
|
data04 = *(a1 + 3);
|
||||||
|
|
||||||
|
#ifndef UNIT
|
||||||
|
data10 = *(a2 + 1);
|
||||||
|
#endif
|
||||||
|
data11 = *(a2 + 2);
|
||||||
|
data12 = *(a2 + 3);
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef UNIT
|
||||||
|
data19 = *(a3 + 2);
|
||||||
|
#endif
|
||||||
|
data20 = *(a3 + 3);
|
||||||
|
|
||||||
|
#ifndef UNIT
|
||||||
|
data28 = *(a4 + 3);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
*(b + 0) = INV(data01);
|
||||||
|
|
||||||
|
*(b + 6) = data02;
|
||||||
|
*(b + 7) = INV(data10);
|
||||||
|
|
||||||
|
*(b + 12) = data03;
|
||||||
|
*(b + 13) = data11;
|
||||||
|
*(b + 14) = INV(data19);
|
||||||
|
|
||||||
|
*(b + 18) = data04;
|
||||||
|
*(b + 19) = data12;
|
||||||
|
*(b + 20) = data20;
|
||||||
|
*(b + 21) = INV(data28);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ii > jj) {
|
||||||
|
data01 = *(a1 + 0);
|
||||||
|
data02 = *(a1 + 1);
|
||||||
|
data03 = *(a1 + 2);
|
||||||
|
data04 = *(a1 + 3);
|
||||||
|
data09 = *(a2 + 0);
|
||||||
|
data10 = *(a2 + 1);
|
||||||
|
data11 = *(a2 + 2);
|
||||||
|
data12 = *(a2 + 3);
|
||||||
|
|
||||||
|
data17 = *(a3 + 0);
|
||||||
|
data18 = *(a3 + 1);
|
||||||
|
data19 = *(a3 + 2);
|
||||||
|
data20 = *(a3 + 3);
|
||||||
|
data25 = *(a4 + 0);
|
||||||
|
data26 = *(a4 + 1);
|
||||||
|
data27 = *(a4 + 2);
|
||||||
|
data28 = *(a4 + 3);
|
||||||
|
|
||||||
|
data33 = *(a5 + 0);
|
||||||
|
data34 = *(a5 + 1);
|
||||||
|
data35 = *(a5 + 2);
|
||||||
|
data36 = *(a5 + 3);
|
||||||
|
data41 = *(a6 + 0);
|
||||||
|
data42 = *(a6 + 1);
|
||||||
|
data43 = *(a6 + 2);
|
||||||
|
data44 = *(a6 + 3);
|
||||||
|
|
||||||
|
*(b + 0) = data01;
|
||||||
|
*(b + 1) = data09;
|
||||||
|
*(b + 2) = data17;
|
||||||
|
*(b + 3) = data25;
|
||||||
|
*(b + 4) = data33;
|
||||||
|
*(b + 5) = data41;
|
||||||
|
|
||||||
|
*(b + 6) = data02;
|
||||||
|
*(b + 7) = data10;
|
||||||
|
*(b + 8) = data18;
|
||||||
|
*(b + 9) = data26;
|
||||||
|
*(b + 10) = data34;
|
||||||
|
*(b + 11) = data42;
|
||||||
|
|
||||||
|
*(b + 12) = data03;
|
||||||
|
*(b + 13) = data11;
|
||||||
|
*(b + 14) = data19;
|
||||||
|
*(b + 15) = data27;
|
||||||
|
*(b + 16) = data35;
|
||||||
|
*(b + 17) = data43;
|
||||||
|
|
||||||
|
*(b + 18) = data04;
|
||||||
|
*(b + 19) = data12;
|
||||||
|
*(b + 20) = data20;
|
||||||
|
*(b + 21) = data28;
|
||||||
|
*(b + 22) = data36;
|
||||||
|
*(b + 23) = data44;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
a1 += 4;
|
||||||
|
a2 += 4;
|
||||||
|
a3 += 4;
|
||||||
|
a4 += 4;
|
||||||
|
a5 += 4;
|
||||||
|
a6 += 4;
|
||||||
|
a7 += 4;
|
||||||
|
a8 += 4;
|
||||||
|
b += 24;
|
||||||
|
ii += 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mmod6 & 2) {
|
||||||
|
if (ii == jj) {
|
||||||
|
#ifndef UNIT
|
||||||
|
data01 = *(a1 + 0);
|
||||||
|
#endif
|
||||||
|
data02 = *(a1 + 1);
|
||||||
|
|
||||||
|
#ifndef UNIT
|
||||||
|
data10 = *(a2 + 1);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
*(b + 0) = INV(data01);
|
||||||
|
|
||||||
|
*(b + 6) = data02;
|
||||||
|
*(b + 7) = INV(data10);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ii > jj) {
|
||||||
|
data01 = *(a1 + 0);
|
||||||
|
data02 = *(a1 + 1);
|
||||||
|
data09 = *(a2 + 0);
|
||||||
|
data10 = *(a2 + 1);
|
||||||
|
data17 = *(a3 + 0);
|
||||||
|
data18 = *(a3 + 1);
|
||||||
|
data25 = *(a4 + 0);
|
||||||
|
data26 = *(a4 + 1);
|
||||||
|
|
||||||
|
data33 = *(a5 + 0);
|
||||||
|
data34 = *(a5 + 1);
|
||||||
|
data41 = *(a6 + 0);
|
||||||
|
data42 = *(a6 + 1);
|
||||||
|
|
||||||
|
*(b + 0) = data01;
|
||||||
|
*(b + 1) = data09;
|
||||||
|
*(b + 2) = data17;
|
||||||
|
*(b + 3) = data25;
|
||||||
|
*(b + 4) = data33;
|
||||||
|
*(b + 5) = data41;
|
||||||
|
|
||||||
|
*(b + 6) = data02;
|
||||||
|
*(b + 7) = data10;
|
||||||
|
*(b + 8) = data18;
|
||||||
|
*(b + 9) = data26;
|
||||||
|
*(b + 10) = data34;
|
||||||
|
*(b + 11) = data42;
|
||||||
|
}
|
||||||
|
|
||||||
|
a1 += 2;
|
||||||
|
a2 += 2;
|
||||||
|
a3 += 2;
|
||||||
|
a4 += 2;
|
||||||
|
a5 += 2;
|
||||||
|
a6 += 2;
|
||||||
|
a7 += 2;
|
||||||
|
a8 += 2;
|
||||||
|
b += 12;
|
||||||
|
ii += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mmod6 & 1) {
|
||||||
|
if (ii == jj) {
|
||||||
|
#ifndef UNIT
|
||||||
|
data01 = *(a1 + 0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
*(b + 0) = INV(data01);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ii > jj) {
|
||||||
|
data01 = *(a1 + 0);
|
||||||
|
data09 = *(a2 + 0);
|
||||||
|
data17 = *(a3 + 0);
|
||||||
|
data25 = *(a4 + 0);
|
||||||
|
data33 = *(a5 + 0);
|
||||||
|
data41 = *(a6 + 0);
|
||||||
|
|
||||||
|
*(b + 0) = data01;
|
||||||
|
*(b + 1) = data09;
|
||||||
|
*(b + 2) = data17;
|
||||||
|
*(b + 3) = data25;
|
||||||
|
*(b + 4) = data33;
|
||||||
|
*(b + 5) = data41;
|
||||||
|
}
|
||||||
|
b += 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
a += 6 * lda;
|
||||||
|
jj += 6;
|
||||||
|
j --;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nmod6 & 4) {
|
||||||
|
a1 = a + 0 * lda;
|
||||||
|
a2 = a + 1 * lda;
|
||||||
|
a3 = a + 2 * lda;
|
||||||
|
a4 = a + 3 * lda;
|
||||||
|
|
||||||
|
ii = 0;
|
||||||
|
i = (m >> 1);
|
||||||
while (i > 0) {
|
while (i > 0) {
|
||||||
|
|
||||||
if (ii == jj) {
|
if (ii == jj) {
|
||||||
|
@ -76,75 +470,33 @@ int CNAME(BLASLONG m, BLASLONG n, FLOAT *a, BLASLONG lda, BLASLONG offset, FLOAT
|
||||||
data04 = *(a1 + 3);
|
data04 = *(a1 + 3);
|
||||||
|
|
||||||
#ifndef UNIT
|
#ifndef UNIT
|
||||||
data06 = *(a2 + 1);
|
data10 = *(a2 + 1);
|
||||||
#endif
|
#endif
|
||||||
data07 = *(a2 + 2);
|
data11 = *(a2 + 2);
|
||||||
data08 = *(a2 + 3);
|
data12 = *(a2 + 3);
|
||||||
|
|
||||||
#ifndef UNIT
|
#ifndef UNIT
|
||||||
data11 = *(a3 + 2);
|
data19 = *(a3 + 2);
|
||||||
#endif
|
#endif
|
||||||
data12 = *(a3 + 3);
|
data20 = *(a3 + 3);
|
||||||
|
|
||||||
#ifndef UNIT
|
#ifndef UNIT
|
||||||
data16 = *(a4 + 3);
|
data28 = *(a4 + 3);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
*(b + 0) = INV(data01);
|
*(b + 0) = INV(data01);
|
||||||
|
|
||||||
*(b + 4) = data02;
|
*(b + 4) = data02;
|
||||||
*(b + 5) = INV(data06);
|
*(b + 5) = INV(data10);
|
||||||
|
|
||||||
*(b + 8) = data03;
|
*(b + 8) = data03;
|
||||||
*(b + 9) = data07;
|
*(b + 9) = data11;
|
||||||
*(b + 10) = INV(data11);
|
*(b + 10) = INV(data19);
|
||||||
|
|
||||||
*(b + 12) = data04;
|
*(b + 12) = data04;
|
||||||
*(b + 13) = data08;
|
*(b + 13) = data12;
|
||||||
*(b + 14) = data12;
|
*(b + 14) = data20;
|
||||||
*(b + 15) = INV(data16);
|
*(b + 15) = INV(data28);
|
||||||
}
|
|
||||||
|
|
||||||
if (ii > jj) {
|
|
||||||
|
|
||||||
data01 = *(a1 + 0);
|
|
||||||
data02 = *(a1 + 1);
|
|
||||||
data03 = *(a1 + 2);
|
|
||||||
data04 = *(a1 + 3);
|
|
||||||
|
|
||||||
data05 = *(a2 + 0);
|
|
||||||
data06 = *(a2 + 1);
|
|
||||||
data07 = *(a2 + 2);
|
|
||||||
data08 = *(a2 + 3);
|
|
||||||
|
|
||||||
data09 = *(a3 + 0);
|
|
||||||
data10 = *(a3 + 1);
|
|
||||||
data11 = *(a3 + 2);
|
|
||||||
data12 = *(a3 + 3);
|
|
||||||
|
|
||||||
data13 = *(a4 + 0);
|
|
||||||
data14 = *(a4 + 1);
|
|
||||||
data15 = *(a4 + 2);
|
|
||||||
data16 = *(a4 + 3);
|
|
||||||
|
|
||||||
*(b + 0) = data01;
|
|
||||||
*(b + 1) = data05;
|
|
||||||
*(b + 2) = data09;
|
|
||||||
*(b + 3) = data13;
|
|
||||||
*(b + 4) = data02;
|
|
||||||
*(b + 5) = data06;
|
|
||||||
*(b + 6) = data10;
|
|
||||||
*(b + 7) = data14;
|
|
||||||
|
|
||||||
*(b + 8) = data03;
|
|
||||||
*(b + 9) = data07;
|
|
||||||
*(b + 10) = data11;
|
|
||||||
*(b + 11) = data15;
|
|
||||||
*(b + 12) = data04;
|
|
||||||
*(b + 13) = data08;
|
|
||||||
*(b + 14) = data12;
|
|
||||||
*(b + 15) = data16;
|
|
||||||
}
|
|
||||||
|
|
||||||
a1 += 4;
|
a1 += 4;
|
||||||
a2 += 4;
|
a2 += 4;
|
||||||
|
@ -152,155 +504,145 @@ int CNAME(BLASLONG m, BLASLONG n, FLOAT *a, BLASLONG lda, BLASLONG offset, FLOAT
|
||||||
a4 += 4;
|
a4 += 4;
|
||||||
b += 16;
|
b += 16;
|
||||||
|
|
||||||
i --;
|
i -= 2;
|
||||||
ii += 4;
|
ii += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((m & 2) != 0) {
|
else if (ii > jj) {
|
||||||
|
|
||||||
if (ii== jj) {
|
|
||||||
#ifndef UNIT
|
|
||||||
data01 = *(a1 + 0);
|
|
||||||
#endif
|
|
||||||
data02 = *(a1 + 1);
|
|
||||||
|
|
||||||
#ifndef UNIT
|
|
||||||
data06 = *(a2 + 1);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
*(b + 0) = INV(data01);
|
|
||||||
|
|
||||||
*(b + 4) = data02;
|
|
||||||
*(b + 5) = INV(data06);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ii > jj) {
|
|
||||||
data01 = *(a1 + 0);
|
data01 = *(a1 + 0);
|
||||||
data02 = *(a1 + 1);
|
data02 = *(a1 + 1);
|
||||||
data03 = *(a2 + 0);
|
data09 = *(a2 + 0);
|
||||||
data04 = *(a2 + 1);
|
data10 = *(a2 + 1);
|
||||||
data05 = *(a3 + 0);
|
data17 = *(a3 + 0);
|
||||||
data06 = *(a3 + 1);
|
data18 = *(a3 + 1);
|
||||||
data07 = *(a4 + 0);
|
data25 = *(a4 + 0);
|
||||||
data08 = *(a4 + 1);
|
data26 = *(a4 + 1);
|
||||||
|
|
||||||
*(b + 0) = data01;
|
*(b + 0) = data01;
|
||||||
*(b + 1) = data03;
|
*(b + 1) = data09;
|
||||||
*(b + 2) = data05;
|
*(b + 2) = data17;
|
||||||
*(b + 3) = data07;
|
*(b + 3) = data25;
|
||||||
*(b + 4) = data02;
|
*(b + 4) = data02;
|
||||||
*(b + 5) = data04;
|
*(b + 5) = data10;
|
||||||
*(b + 6) = data06;
|
*(b + 6) = data18;
|
||||||
*(b + 7) = data08;
|
*(b + 7) = data26;
|
||||||
}
|
|
||||||
|
|
||||||
a1 += 2;
|
a1 += 2;
|
||||||
a2 += 2;
|
a2 += 2;
|
||||||
a3 += 2;
|
a3 += 2;
|
||||||
a4 += 2;
|
a4 += 2;
|
||||||
b += 8;
|
b += 8;
|
||||||
|
i -- ;
|
||||||
ii += 2;
|
ii += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
a1 += 2;
|
||||||
|
a2 += 2;
|
||||||
|
a3 += 2;
|
||||||
|
a4 += 2;
|
||||||
|
b += 8;
|
||||||
|
i -- ;
|
||||||
|
ii += 2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((m & 1) != 0) {
|
if (m & 1) {
|
||||||
|
if (ii == jj) {
|
||||||
if (ii== jj) {
|
|
||||||
#ifndef UNIT
|
#ifndef UNIT
|
||||||
data01 = *(a1 + 0);
|
data01 = *(a1 + 0);
|
||||||
#endif
|
#endif
|
||||||
*(b + 0) = INV(data01);
|
*(b + 0) = INV(data01);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ii > jj) {
|
if (ii > jj) {
|
||||||
data01 = *(a1 + 0);
|
data01 = *(a1 + 0);
|
||||||
data02 = *(a2 + 0);
|
data09 = *(a2 + 0);
|
||||||
data03 = *(a3 + 0);
|
data17 = *(a3 + 0);
|
||||||
data04 = *(a4 + 0);
|
data25 = *(a4 + 0);
|
||||||
|
|
||||||
*(b + 0) = data01;
|
*(b + 0) = data01;
|
||||||
*(b + 1) = data02;
|
*(b + 1) = data09;
|
||||||
*(b + 2) = data03;
|
*(b + 2) = data17;
|
||||||
*(b + 3) = data04;
|
*(b + 3) = data25;
|
||||||
}
|
}
|
||||||
b += 4;
|
b += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
a += 4 * lda;
|
a += 4 * lda;
|
||||||
jj += 4;
|
jj += 4;
|
||||||
j --;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (n & 2) {
|
if (nmod6 & 2) {
|
||||||
a1 = a + 0 * lda;
|
a1 = a + 0 * lda;
|
||||||
a2 = a + 1 * lda;
|
a2 = a + 1 * lda;
|
||||||
|
|
||||||
i = (m >> 1);
|
|
||||||
ii = 0;
|
ii = 0;
|
||||||
|
i = (m >> 1);
|
||||||
while (i > 0) {
|
while (i > 0) {
|
||||||
|
|
||||||
if (ii == jj) {
|
if (ii == jj) {
|
||||||
|
|
||||||
#ifndef UNIT
|
#ifndef UNIT
|
||||||
data01 = *(a1 + 0);
|
data01 = *(a1 + 0);
|
||||||
#endif
|
#endif
|
||||||
data02 = *(a1 + 1);
|
data02 = *(a1 + 1);
|
||||||
|
|
||||||
#ifndef UNIT
|
#ifndef UNIT
|
||||||
data04 = *(a2 + 1);
|
data10 = *(a2 + 1);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
*(b + 0) = INV(data01);
|
*(b + 0) = INV(data01);
|
||||||
*(b + 2) = data02;
|
*(b + 2) = data02;
|
||||||
*(b + 3) = INV(data04);
|
*(b + 3) = INV(data10);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ii > jj) {
|
if (ii > jj) {
|
||||||
data01 = *(a1 + 0);
|
data01 = *(a1 + 0);
|
||||||
data02 = *(a1 + 1);
|
data02 = *(a1 + 1);
|
||||||
data03 = *(a2 + 0);
|
data09 = *(a2 + 0);
|
||||||
data04 = *(a2 + 1);
|
data10 = *(a2 + 1);
|
||||||
|
|
||||||
*(b + 0) = data01;
|
*(b + 0) = data01;
|
||||||
*(b + 1) = data03;
|
*(b + 1) = data09;
|
||||||
*(b + 2) = data02;
|
*(b + 2) = data02;
|
||||||
*(b + 3) = data04;
|
*(b + 3) = data10;
|
||||||
}
|
}
|
||||||
|
|
||||||
a1 += 2;
|
a1 += 2;
|
||||||
a2 += 2;
|
a2 += 2;
|
||||||
b += 4;
|
b += 4;
|
||||||
|
|
||||||
i --;
|
i --;
|
||||||
ii += 2;
|
ii += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((m & 1) != 0) {
|
if (m & 1) {
|
||||||
|
if (ii == jj) {
|
||||||
if (ii== jj) {
|
|
||||||
#ifndef UNIT
|
#ifndef UNIT
|
||||||
data01 = *(a1 + 0);
|
data01 = *(a1 + 0);
|
||||||
#endif
|
#endif
|
||||||
*(b + 0) = INV(data01);
|
*(b + 0) = INV(data01);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ii > jj) {
|
if (ii > jj) {
|
||||||
data01 = *(a1 + 0);
|
data01 = *(a1 + 0);
|
||||||
data02 = *(a2 + 0);
|
data09 = *(a2 + 0);
|
||||||
|
|
||||||
*(b + 0) = data01;
|
*(b + 0) = data01;
|
||||||
*(b + 1) = data02;
|
*(b + 1) = data09;
|
||||||
}
|
}
|
||||||
b += 2;
|
b += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
a += 2 * lda;
|
a += 2 * lda;
|
||||||
jj += 2;
|
jj += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (n & 1) {
|
if (nmod6 & 1) {
|
||||||
a1 = a + 0 * lda;
|
a1 = a + 0 * lda;
|
||||||
|
|
||||||
i = m;
|
|
||||||
ii = 0;
|
ii = 0;
|
||||||
|
i = m;
|
||||||
while (i > 0) {
|
while (i > 0) {
|
||||||
|
|
||||||
if (ii == jj) {
|
if (ii == jj) {
|
||||||
|
@ -315,8 +657,9 @@ int CNAME(BLASLONG m, BLASLONG n, FLOAT *a, BLASLONG lda, BLASLONG offset, FLOAT
|
||||||
*(b + 0) = data01;
|
*(b + 0) = data01;
|
||||||
}
|
}
|
||||||
|
|
||||||
a1+= 1;
|
a1 += 1;
|
||||||
b += 1;
|
b += 1;
|
||||||
|
|
||||||
i --;
|
i --;
|
||||||
ii += 1;
|
ii += 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,22 +49,35 @@ int CNAME(BLASLONG m, BLASLONG n, FLOAT *a, BLASLONG lda, BLASLONG offset, FLOAT
|
||||||
|
|
||||||
BLASLONG i, ii, j, jj;
|
BLASLONG i, ii, j, jj;
|
||||||
|
|
||||||
FLOAT data01, data02, data03, data04, data05, data06, data07, data08;
|
FLOAT data01, data02, data03, data04, data05, data06;
|
||||||
FLOAT data09, data10, data11, data12, data13, data14, data15, data16;
|
FLOAT data09, data10, data11, data12, data13, data14;
|
||||||
FLOAT *a1, *a2, *a3, *a4;
|
FLOAT data17, data18, data19, data20, data21, data22;
|
||||||
|
FLOAT data25, data26, data27, data28, data29, data30;
|
||||||
|
FLOAT data33, data34, data35, data36, data37, data38;
|
||||||
|
FLOAT data41, data42, data43, data44, data45, data46;
|
||||||
|
|
||||||
|
FLOAT *a1, *a2, *a3, *a4, *a5, *a6, *a7, *a8;
|
||||||
|
|
||||||
jj = offset;
|
jj = offset;
|
||||||
|
|
||||||
j = (n >> 2);
|
BLASLONG mmod6, nmod6, k;
|
||||||
|
mmod6 = m - (m/6)*6 ;
|
||||||
|
nmod6 = n - (n/6)*6 ;
|
||||||
|
|
||||||
|
// j = (n >> 3);
|
||||||
|
j = (n / 6);
|
||||||
while (j > 0){
|
while (j > 0){
|
||||||
|
|
||||||
a1 = a + 0 * lda;
|
a1 = a + 0 * lda;
|
||||||
a2 = a + 1 * lda;
|
a2 = a + 1 * lda;
|
||||||
a3 = a + 2 * lda;
|
a3 = a + 2 * lda;
|
||||||
a4 = a + 3 * lda;
|
a4 = a + 3 * lda;
|
||||||
|
a5 = a + 4 * lda;
|
||||||
|
a6 = a + 5 * lda;
|
||||||
|
|
||||||
i = (m >> 2);
|
|
||||||
ii = 0;
|
ii = 0;
|
||||||
|
// i = (m >> 3);
|
||||||
|
i = (m / 6);
|
||||||
while (i > 0) {
|
while (i > 0) {
|
||||||
|
|
||||||
if (ii == jj) {
|
if (ii == jj) {
|
||||||
|
@ -75,35 +88,65 @@ int CNAME(BLASLONG m, BLASLONG n, FLOAT *a, BLASLONG lda, BLASLONG offset, FLOAT
|
||||||
data02 = *(a1 + 1);
|
data02 = *(a1 + 1);
|
||||||
data03 = *(a1 + 2);
|
data03 = *(a1 + 2);
|
||||||
data04 = *(a1 + 3);
|
data04 = *(a1 + 3);
|
||||||
|
data05 = *(a1 + 4);
|
||||||
|
data06 = *(a1 + 5);
|
||||||
|
|
||||||
#ifndef UNIT
|
#ifndef UNIT
|
||||||
data06 = *(a2 + 1);
|
data10 = *(a2 + 1);
|
||||||
#endif
|
#endif
|
||||||
data07 = *(a2 + 2);
|
data11 = *(a2 + 2);
|
||||||
data08 = *(a2 + 3);
|
data12 = *(a2 + 3);
|
||||||
|
data13 = *(a2 + 4);
|
||||||
|
data14 = *(a2 + 5);
|
||||||
|
|
||||||
#ifndef UNIT
|
#ifndef UNIT
|
||||||
data11 = *(a3 + 2);
|
data19 = *(a3 + 2);
|
||||||
#endif
|
#endif
|
||||||
data12 = *(a3 + 3);
|
data20 = *(a3 + 3);
|
||||||
|
data21 = *(a3 + 4);
|
||||||
|
data22 = *(a3 + 5);
|
||||||
|
|
||||||
#ifndef UNIT
|
#ifndef UNIT
|
||||||
data16 = *(a4 + 3);
|
data28 = *(a4 + 3);
|
||||||
|
#endif
|
||||||
|
data29 = *(a4 + 4);
|
||||||
|
data30 = *(a4 + 5);
|
||||||
|
|
||||||
|
#ifndef UNIT
|
||||||
|
data37 = *(a5 + 4);
|
||||||
|
#endif
|
||||||
|
data38 = *(a5 + 5);
|
||||||
|
|
||||||
|
#ifndef UNIT
|
||||||
|
data46 = *(a6 + 5);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
*(b + 0) = INV(data01);
|
*(b + 0) = INV(data01);
|
||||||
*(b + 1) = data02;
|
*(b + 1) = data02;
|
||||||
*(b + 2) = data03;
|
*(b + 2) = data03;
|
||||||
*(b + 3) = data04;
|
*(b + 3) = data04;
|
||||||
|
*(b + 4) = data05;
|
||||||
|
*(b + 5) = data06;
|
||||||
|
|
||||||
*(b + 5) = INV(data06);
|
*(b + 7) = INV(data10);
|
||||||
*(b + 6) = data07;
|
*(b + 8) = data11;
|
||||||
*(b + 7) = data08;
|
*(b + 9) = data12;
|
||||||
|
*(b + 10) = data13;
|
||||||
|
*(b + 11) = data14;
|
||||||
|
|
||||||
*(b + 10) = INV(data11);
|
*(b + 14) = INV(data19);
|
||||||
*(b + 11) = data12;
|
*(b + 15) = data20;
|
||||||
|
*(b + 16) = data21;
|
||||||
|
*(b + 17) = data22;
|
||||||
|
|
||||||
*(b + 15) = INV(data16);
|
*(b + 21) = INV(data28);
|
||||||
|
*(b + 22) = data29;
|
||||||
|
*(b + 23) = data30;
|
||||||
|
|
||||||
|
*(b + 28) = INV(data37);
|
||||||
|
*(b + 29) = data38;
|
||||||
|
|
||||||
|
*(b + 35) = INV(data46);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ii < jj) {
|
if (ii < jj) {
|
||||||
|
@ -111,21 +154,43 @@ int CNAME(BLASLONG m, BLASLONG n, FLOAT *a, BLASLONG lda, BLASLONG offset, FLOAT
|
||||||
data02 = *(a1 + 1);
|
data02 = *(a1 + 1);
|
||||||
data03 = *(a1 + 2);
|
data03 = *(a1 + 2);
|
||||||
data04 = *(a1 + 3);
|
data04 = *(a1 + 3);
|
||||||
|
data05 = *(a1 + 4);
|
||||||
|
data06 = *(a1 + 5);
|
||||||
|
|
||||||
data05 = *(a2 + 0);
|
data09 = *(a2 + 0);
|
||||||
data06 = *(a2 + 1);
|
data10 = *(a2 + 1);
|
||||||
data07 = *(a2 + 2);
|
data11 = *(a2 + 2);
|
||||||
data08 = *(a2 + 3);
|
data12 = *(a2 + 3);
|
||||||
|
data13 = *(a2 + 4);
|
||||||
|
data14 = *(a2 + 5);
|
||||||
|
|
||||||
data09 = *(a3 + 0);
|
data17 = *(a3 + 0);
|
||||||
data10 = *(a3 + 1);
|
data18 = *(a3 + 1);
|
||||||
data11 = *(a3 + 2);
|
data19 = *(a3 + 2);
|
||||||
data12 = *(a3 + 3);
|
data20 = *(a3 + 3);
|
||||||
|
data21 = *(a3 + 4);
|
||||||
|
data22 = *(a3 + 5);
|
||||||
|
|
||||||
data13 = *(a4 + 0);
|
data25 = *(a4 + 0);
|
||||||
data14 = *(a4 + 1);
|
data26 = *(a4 + 1);
|
||||||
data15 = *(a4 + 2);
|
data27 = *(a4 + 2);
|
||||||
data16 = *(a4 + 3);
|
data28 = *(a4 + 3);
|
||||||
|
data29 = *(a4 + 4);
|
||||||
|
data30 = *(a4 + 5);
|
||||||
|
|
||||||
|
data33 = *(a5 + 0);
|
||||||
|
data34 = *(a5 + 1);
|
||||||
|
data35 = *(a5 + 2);
|
||||||
|
data36 = *(a5 + 3);
|
||||||
|
data37 = *(a5 + 4);
|
||||||
|
data38 = *(a5 + 5);
|
||||||
|
|
||||||
|
data41 = *(a6 + 0);
|
||||||
|
data42 = *(a6 + 1);
|
||||||
|
data43 = *(a6 + 2);
|
||||||
|
data44 = *(a6 + 3);
|
||||||
|
data45 = *(a6 + 4);
|
||||||
|
data46 = *(a6 + 5);
|
||||||
|
|
||||||
*(b + 0) = data01;
|
*(b + 0) = data01;
|
||||||
*(b + 1) = data02;
|
*(b + 1) = data02;
|
||||||
|
@ -133,32 +198,177 @@ int CNAME(BLASLONG m, BLASLONG n, FLOAT *a, BLASLONG lda, BLASLONG offset, FLOAT
|
||||||
*(b + 3) = data04;
|
*(b + 3) = data04;
|
||||||
*(b + 4) = data05;
|
*(b + 4) = data05;
|
||||||
*(b + 5) = data06;
|
*(b + 5) = data06;
|
||||||
*(b + 6) = data07;
|
*(b + 6) = data09;
|
||||||
*(b + 7) = data08;
|
*(b + 7) = data10;
|
||||||
|
*(b + 8) = data11;
|
||||||
|
*(b + 9) = data12;
|
||||||
|
*(b + 10) = data13;
|
||||||
|
*(b + 11) = data14;
|
||||||
|
|
||||||
*(b + 8) = data09;
|
*(b + 12) = data17;
|
||||||
*(b + 9) = data10;
|
*(b + 13) = data18;
|
||||||
*(b + 10) = data11;
|
*(b + 14) = data19;
|
||||||
*(b + 11) = data12;
|
*(b + 15) = data20;
|
||||||
*(b + 12) = data13;
|
*(b + 16) = data21;
|
||||||
*(b + 13) = data14;
|
*(b + 17) = data22;
|
||||||
*(b + 14) = data15;
|
*(b + 18) = data25;
|
||||||
*(b + 15) = data16;
|
*(b + 19) = data26;
|
||||||
|
*(b + 20) = data27;
|
||||||
|
*(b + 21) = data28;
|
||||||
|
*(b + 22) = data29;
|
||||||
|
*(b + 23) = data30;
|
||||||
|
|
||||||
|
*(b + 24) = data33;
|
||||||
|
*(b + 25) = data34;
|
||||||
|
*(b + 26) = data35;
|
||||||
|
*(b + 27) = data36;
|
||||||
|
*(b + 28) = data37;
|
||||||
|
*(b + 29) = data38;
|
||||||
|
*(b + 30) = data41;
|
||||||
|
*(b + 31) = data42;
|
||||||
|
*(b + 32) = data43;
|
||||||
|
*(b + 33) = data44;
|
||||||
|
*(b + 34) = data45;
|
||||||
|
*(b + 35) = data46;
|
||||||
|
}
|
||||||
|
|
||||||
|
a1 += 6 * lda;
|
||||||
|
a2 += 6 * lda;
|
||||||
|
a3 += 6 * lda;
|
||||||
|
a4 += 6 * lda;
|
||||||
|
a5 += 6 * lda;
|
||||||
|
a6 += 6 * lda;
|
||||||
|
a7 += 6 * lda;
|
||||||
|
a8 += 6 * lda;
|
||||||
|
b += 36;
|
||||||
|
|
||||||
|
i --;
|
||||||
|
ii += 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mmod6 & 4) {
|
||||||
|
if (ii == jj) {
|
||||||
|
|
||||||
|
#ifndef UNIT
|
||||||
|
data01 = *(a1 + 0);
|
||||||
|
#endif
|
||||||
|
data02 = *(a1 + 1);
|
||||||
|
data03 = *(a1 + 2);
|
||||||
|
data04 = *(a1 + 3);
|
||||||
|
data05 = *(a1 + 4);
|
||||||
|
data06 = *(a1 + 5);
|
||||||
|
|
||||||
|
#ifndef UNIT
|
||||||
|
data10 = *(a2 + 1);
|
||||||
|
#endif
|
||||||
|
data11 = *(a2 + 2);
|
||||||
|
data12 = *(a2 + 3);
|
||||||
|
data13 = *(a2 + 4);
|
||||||
|
data14 = *(a2 + 5);
|
||||||
|
|
||||||
|
#ifndef UNIT
|
||||||
|
data19 = *(a3 + 2);
|
||||||
|
#endif
|
||||||
|
data20 = *(a3 + 3);
|
||||||
|
data21 = *(a3 + 4);
|
||||||
|
data22 = *(a3 + 5);
|
||||||
|
|
||||||
|
#ifndef UNIT
|
||||||
|
data28 = *(a4 + 3);
|
||||||
|
#endif
|
||||||
|
data29 = *(a4 + 4);
|
||||||
|
data30 = *(a4 + 5);
|
||||||
|
|
||||||
|
*(b + 0) = INV(data01);
|
||||||
|
*(b + 1) = data02;
|
||||||
|
*(b + 2) = data03;
|
||||||
|
*(b + 3) = data04;
|
||||||
|
*(b + 4) = data05;
|
||||||
|
*(b + 5) = data06;
|
||||||
|
|
||||||
|
*(b + 7) = INV(data10);
|
||||||
|
*(b + 8) = data11;
|
||||||
|
*(b + 9) = data12;
|
||||||
|
*(b + 10) = data13;
|
||||||
|
*(b + 11) = data14;
|
||||||
|
|
||||||
|
*(b + 14) = INV(data19);
|
||||||
|
*(b + 15) = data20;
|
||||||
|
*(b + 16) = data21;
|
||||||
|
*(b + 17) = data22;
|
||||||
|
|
||||||
|
*(b + 21) = INV(data28);
|
||||||
|
*(b + 22) = data29;
|
||||||
|
*(b + 23) = data30;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ii < jj) {
|
||||||
|
data01 = *(a1 + 0);
|
||||||
|
data02 = *(a1 + 1);
|
||||||
|
data03 = *(a1 + 2);
|
||||||
|
data04 = *(a1 + 3);
|
||||||
|
data05 = *(a1 + 4);
|
||||||
|
data06 = *(a1 + 5);
|
||||||
|
|
||||||
|
data09 = *(a2 + 0);
|
||||||
|
data10 = *(a2 + 1);
|
||||||
|
data11 = *(a2 + 2);
|
||||||
|
data12 = *(a2 + 3);
|
||||||
|
data13 = *(a2 + 4);
|
||||||
|
data14 = *(a2 + 5);
|
||||||
|
|
||||||
|
data17 = *(a3 + 0);
|
||||||
|
data18 = *(a3 + 1);
|
||||||
|
data19 = *(a3 + 2);
|
||||||
|
data20 = *(a3 + 3);
|
||||||
|
data21 = *(a3 + 4);
|
||||||
|
data22 = *(a3 + 5);
|
||||||
|
|
||||||
|
data25 = *(a4 + 0);
|
||||||
|
data26 = *(a4 + 1);
|
||||||
|
data27 = *(a4 + 2);
|
||||||
|
data28 = *(a4 + 3);
|
||||||
|
data29 = *(a4 + 4);
|
||||||
|
data30 = *(a4 + 5);
|
||||||
|
|
||||||
|
*(b + 0) = data01;
|
||||||
|
*(b + 1) = data02;
|
||||||
|
*(b + 2) = data03;
|
||||||
|
*(b + 3) = data04;
|
||||||
|
*(b + 4) = data05;
|
||||||
|
*(b + 5) = data06;
|
||||||
|
*(b + 6) = data09;
|
||||||
|
*(b + 7) = data10;
|
||||||
|
*(b + 8) = data11;
|
||||||
|
*(b + 9) = data12;
|
||||||
|
*(b + 10) = data13;
|
||||||
|
*(b + 11) = data14;
|
||||||
|
|
||||||
|
*(b + 12) = data17;
|
||||||
|
*(b + 13) = data18;
|
||||||
|
*(b + 14) = data19;
|
||||||
|
*(b + 15) = data20;
|
||||||
|
*(b + 16) = data21;
|
||||||
|
*(b + 17) = data22;
|
||||||
|
*(b + 18) = data25;
|
||||||
|
*(b + 19) = data26;
|
||||||
|
*(b + 20) = data27;
|
||||||
|
*(b + 21) = data28;
|
||||||
|
*(b + 22) = data29;
|
||||||
|
*(b + 23) = data30;
|
||||||
}
|
}
|
||||||
|
|
||||||
a1 += 4 * lda;
|
a1 += 4 * lda;
|
||||||
a2 += 4 * lda;
|
a2 += 4 * lda;
|
||||||
a3 += 4 * lda;
|
/* a3 += 4 * lda;
|
||||||
a4 += 4 * lda;
|
a4 += 4 * lda; */
|
||||||
b += 16;
|
b += 24;
|
||||||
|
|
||||||
i --;
|
|
||||||
ii += 4;
|
ii += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((m & 2) != 0) {
|
if (mmod6 & 2) {
|
||||||
|
if (ii == jj) {
|
||||||
if (ii== jj) {
|
|
||||||
|
|
||||||
#ifndef UNIT
|
#ifndef UNIT
|
||||||
data01 = *(a1 + 0);
|
data01 = *(a1 + 0);
|
||||||
|
@ -166,22 +376,29 @@ int CNAME(BLASLONG m, BLASLONG n, FLOAT *a, BLASLONG lda, BLASLONG offset, FLOAT
|
||||||
data02 = *(a1 + 1);
|
data02 = *(a1 + 1);
|
||||||
data03 = *(a1 + 2);
|
data03 = *(a1 + 2);
|
||||||
data04 = *(a1 + 3);
|
data04 = *(a1 + 3);
|
||||||
|
data05 = *(a1 + 4);
|
||||||
|
data06 = *(a1 + 5);
|
||||||
|
|
||||||
#ifndef UNIT
|
#ifndef UNIT
|
||||||
data06 = *(a2 + 1);
|
data10 = *(a2 + 1);
|
||||||
#endif
|
#endif
|
||||||
data07 = *(a2 + 2);
|
data11 = *(a2 + 2);
|
||||||
data08 = *(a2 + 3);
|
data12 = *(a2 + 3);
|
||||||
|
data13 = *(a2 + 4);
|
||||||
|
data14 = *(a2 + 5);
|
||||||
|
|
||||||
*(b + 0) = INV(data01);
|
*(b + 0) = INV(data01);
|
||||||
*(b + 1) = data02;
|
*(b + 1) = data02;
|
||||||
*(b + 2) = data03;
|
*(b + 2) = data03;
|
||||||
*(b + 3) = data04;
|
*(b + 3) = data04;
|
||||||
|
*(b + 4) = data05;
|
||||||
|
*(b + 5) = data06;
|
||||||
|
|
||||||
*(b + 5) = INV(data06);
|
*(b + 7) = INV(data10);
|
||||||
*(b + 6) = data07;
|
*(b + 8) = data11;
|
||||||
*(b + 7) = data08;
|
*(b + 9) = data12;
|
||||||
|
*(b + 10) = data13;
|
||||||
|
*(b + 11) = data14;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ii < jj) {
|
if (ii < jj) {
|
||||||
|
@ -189,11 +406,15 @@ int CNAME(BLASLONG m, BLASLONG n, FLOAT *a, BLASLONG lda, BLASLONG offset, FLOAT
|
||||||
data02 = *(a1 + 1);
|
data02 = *(a1 + 1);
|
||||||
data03 = *(a1 + 2);
|
data03 = *(a1 + 2);
|
||||||
data04 = *(a1 + 3);
|
data04 = *(a1 + 3);
|
||||||
|
data05 = *(a1 + 4);
|
||||||
|
data06 = *(a1 + 5);
|
||||||
|
|
||||||
data05 = *(a2 + 0);
|
data09 = *(a2 + 0);
|
||||||
data06 = *(a2 + 1);
|
data10 = *(a2 + 1);
|
||||||
data07 = *(a2 + 2);
|
data11 = *(a2 + 2);
|
||||||
data08 = *(a2 + 3);
|
data12 = *(a2 + 3);
|
||||||
|
data13 = *(a2 + 4);
|
||||||
|
data14 = *(a2 + 5);
|
||||||
|
|
||||||
*(b + 0) = data01;
|
*(b + 0) = data01;
|
||||||
*(b + 1) = data02;
|
*(b + 1) = data02;
|
||||||
|
@ -201,20 +422,23 @@ int CNAME(BLASLONG m, BLASLONG n, FLOAT *a, BLASLONG lda, BLASLONG offset, FLOAT
|
||||||
*(b + 3) = data04;
|
*(b + 3) = data04;
|
||||||
*(b + 4) = data05;
|
*(b + 4) = data05;
|
||||||
*(b + 5) = data06;
|
*(b + 5) = data06;
|
||||||
*(b + 6) = data07;
|
*(b + 6) = data09;
|
||||||
*(b + 7) = data08;
|
*(b + 7) = data10;
|
||||||
|
*(b + 8) = data11;
|
||||||
|
*(b + 9) = data12;
|
||||||
|
*(b + 10) = data13;
|
||||||
|
*(b + 11) = data14;
|
||||||
}
|
}
|
||||||
|
|
||||||
a1 += 2 * lda;
|
a1 += 2 * lda;
|
||||||
a2 += 2 * lda;
|
// a2 += 2 * lda;
|
||||||
b += 8;
|
b += 12;
|
||||||
|
|
||||||
ii += 2;
|
ii += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((m & 1) != 0) {
|
if (mmod6 & 1) {
|
||||||
|
if (ii == jj) {
|
||||||
if (ii== jj) {
|
|
||||||
|
|
||||||
#ifndef UNIT
|
#ifndef UNIT
|
||||||
data01 = *(a1 + 0);
|
data01 = *(a1 + 0);
|
||||||
|
@ -222,38 +446,78 @@ int CNAME(BLASLONG m, BLASLONG n, FLOAT *a, BLASLONG lda, BLASLONG offset, FLOAT
|
||||||
data02 = *(a1 + 1);
|
data02 = *(a1 + 1);
|
||||||
data03 = *(a1 + 2);
|
data03 = *(a1 + 2);
|
||||||
data04 = *(a1 + 3);
|
data04 = *(a1 + 3);
|
||||||
|
data05 = *(a1 + 4);
|
||||||
|
data06 = *(a1 + 5);
|
||||||
|
|
||||||
*(b + 0) = INV(data01);
|
*(b + 0) = INV(data01);
|
||||||
*(b + 1) = data02;
|
*(b + 1) = data02;
|
||||||
*(b + 2) = data03;
|
*(b + 2) = data03;
|
||||||
*(b + 3) = data04;
|
*(b + 3) = data04;
|
||||||
|
*(b + 4) = data05;
|
||||||
|
*(b + 5) = data06;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ii < jj) {
|
if (ii < jj) {
|
||||||
data01 = *(a1 + 0);
|
data01 = *(a1 + 0);
|
||||||
data02 = *(a1 + 1);
|
data02 = *(a1 + 1);
|
||||||
data03 = *(a1 + 2);
|
data03 = *(a1 + 2);
|
||||||
data04 = *(a1 + 3);
|
data04 = *(a1 + 3);
|
||||||
|
data05 = *(a1 + 4);
|
||||||
|
data06 = *(a1 + 5);
|
||||||
|
|
||||||
*(b + 0) = data01;
|
*(b + 0) = data01;
|
||||||
*(b + 1) = data02;
|
*(b + 1) = data02;
|
||||||
*(b + 2) = data03;
|
*(b + 2) = data03;
|
||||||
*(b + 3) = data04;
|
*(b + 3) = data04;
|
||||||
|
*(b + 4) = data05;
|
||||||
|
*(b + 5) = data06;
|
||||||
}
|
}
|
||||||
b += 4;
|
b += 6;
|
||||||
}
|
}
|
||||||
|
a += 6;
|
||||||
a += 4;
|
jj += 6;
|
||||||
jj += 4;
|
|
||||||
j --;
|
j --;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (n & 2) {
|
if (nmod6 & 4) {
|
||||||
|
|
||||||
|
a1 = a;
|
||||||
|
a += 4;
|
||||||
|
ii = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < m; i++) {
|
||||||
|
|
||||||
|
if ((ii >= jj ) && (ii - jj < 4)) {
|
||||||
|
*(b + ii - jj) = INV(*(a1 + ii - jj));
|
||||||
|
|
||||||
|
for (k = ii - jj + 1; k < 4; k ++) {
|
||||||
|
*(b + k) = *(a1 + k);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ii - jj < 0) {
|
||||||
|
*(b + 0) = *(a1 + 0);
|
||||||
|
*(b + 1) = *(a1 + 1);
|
||||||
|
*(b + 2) = *(a1 + 2);
|
||||||
|
*(b + 3) = *(a1 + 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
b += 4;
|
||||||
|
a1 += lda;
|
||||||
|
ii ++;
|
||||||
|
}
|
||||||
|
|
||||||
|
jj += 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nmod6 & 2) {
|
||||||
|
|
||||||
a1 = a + 0 * lda;
|
a1 = a + 0 * lda;
|
||||||
a2 = a + 1 * lda;
|
a2 = a + 1 * lda;
|
||||||
|
|
||||||
i = (m >> 1);
|
|
||||||
ii = 0;
|
ii = 0;
|
||||||
|
i = (m >> 1);
|
||||||
while (i > 0) {
|
while (i > 0) {
|
||||||
|
|
||||||
if (ii == jj) {
|
if (ii == jj) {
|
||||||
|
@ -264,25 +528,24 @@ int CNAME(BLASLONG m, BLASLONG n, FLOAT *a, BLASLONG lda, BLASLONG offset, FLOAT
|
||||||
data02 = *(a1 + 1);
|
data02 = *(a1 + 1);
|
||||||
|
|
||||||
#ifndef UNIT
|
#ifndef UNIT
|
||||||
data04 = *(a2 + 1);
|
data10 = *(a2 + 1);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
*(b + 0) = INV(data01);
|
*(b + 0) = INV(data01);
|
||||||
*(b + 1) = data02;
|
*(b + 1) = data02;
|
||||||
|
*(b + 3) = INV(data10);
|
||||||
*(b + 3) = INV(data04);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ii < jj) {
|
if (ii < jj) {
|
||||||
data01 = *(a1 + 0);
|
data01 = *(a1 + 0);
|
||||||
data02 = *(a1 + 1);
|
data02 = *(a1 + 1);
|
||||||
data03 = *(a2 + 0);
|
data09 = *(a2 + 0);
|
||||||
data04 = *(a2 + 1);
|
data10 = *(a2 + 1);
|
||||||
|
|
||||||
*(b + 0) = data01;
|
*(b + 0) = data01;
|
||||||
*(b + 1) = data02;
|
*(b + 1) = data02;
|
||||||
*(b + 2) = data03;
|
*(b + 2) = data09;
|
||||||
*(b + 3) = data04;
|
*(b + 3) = data10;
|
||||||
}
|
}
|
||||||
|
|
||||||
a1 += 2 * lda;
|
a1 += 2 * lda;
|
||||||
|
@ -293,19 +556,22 @@ int CNAME(BLASLONG m, BLASLONG n, FLOAT *a, BLASLONG lda, BLASLONG offset, FLOAT
|
||||||
ii += 2;
|
ii += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((m & 1) != 0) {
|
if (m & 1) {
|
||||||
|
if (ii == jj) {
|
||||||
if (ii== jj) {
|
|
||||||
|
|
||||||
#ifndef UNIT
|
#ifndef UNIT
|
||||||
data01 = *(a1 + 0);
|
data01 = *(a1 + 0);
|
||||||
#endif
|
#endif
|
||||||
|
// data02 = *(a1 + 1);
|
||||||
|
|
||||||
*(b + 0) = INV(data01);
|
*(b + 0) = INV(data01);
|
||||||
|
// *(b + 1) = data02;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ii < jj) {
|
if (ii < jj) {
|
||||||
data01 = *(a1 + 0);
|
data01 = *(a1 + 0);
|
||||||
data02 = *(a1 + 1);
|
data02 = *(a1 + 1);
|
||||||
|
|
||||||
*(b + 0) = data01;
|
*(b + 0) = data01;
|
||||||
*(b + 1) = data02;
|
*(b + 1) = data02;
|
||||||
}
|
}
|
||||||
|
@ -315,11 +581,12 @@ int CNAME(BLASLONG m, BLASLONG n, FLOAT *a, BLASLONG lda, BLASLONG offset, FLOAT
|
||||||
jj += 2;
|
jj += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (n & 1) {
|
if (nmod6 & 1) {
|
||||||
|
|
||||||
a1 = a + 0 * lda;
|
a1 = a + 0 * lda;
|
||||||
|
|
||||||
i = m;
|
|
||||||
ii = 0;
|
ii = 0;
|
||||||
|
i = m;
|
||||||
while (i > 0) {
|
while (i > 0) {
|
||||||
|
|
||||||
if (ii == jj) {
|
if (ii == jj) {
|
||||||
|
@ -334,12 +601,13 @@ int CNAME(BLASLONG m, BLASLONG n, FLOAT *a, BLASLONG lda, BLASLONG offset, FLOAT
|
||||||
*(b + 0) = data01;
|
*(b + 0) = data01;
|
||||||
}
|
}
|
||||||
|
|
||||||
a1 += 1 * lda;
|
a1 += lda;
|
||||||
b += 1;
|
b += 1;
|
||||||
|
|
||||||
i --;
|
i --;
|
||||||
ii += 1;
|
ii += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -49,21 +49,34 @@ int CNAME(BLASLONG m, BLASLONG n, FLOAT *a, BLASLONG lda, BLASLONG offset, FLOAT
|
||||||
|
|
||||||
BLASLONG i, ii, j, jj;
|
BLASLONG i, ii, j, jj;
|
||||||
|
|
||||||
FLOAT data01, data02, data03, data04, data05, data06, data07, data08;
|
FLOAT data01, data02, data03, data04, data05, data06;
|
||||||
FLOAT data09, data10, data11, data12, data13, data14, data15, data16;
|
FLOAT data09, data10, data11, data12, data13, data14;
|
||||||
FLOAT *a1, *a2, *a3, *a4;
|
FLOAT data17, data18, data19, data20, data21, data22;
|
||||||
|
FLOAT data25, data26, data27, data28, data29, data30;
|
||||||
|
FLOAT data33, data34, data35, data36, data37, data38;
|
||||||
|
FLOAT data41, data42, data43, data44, data45, data46;
|
||||||
|
|
||||||
|
FLOAT *a1, *a2, *a3, *a4, *a5, *a6, *a7, *a8;
|
||||||
|
|
||||||
jj = offset;
|
jj = offset;
|
||||||
|
|
||||||
j = (n >> 2);
|
BLASLONG mmod6, nmod6, k;
|
||||||
|
mmod6 = m - (m/6)*6 ;
|
||||||
|
nmod6 = n - (n/6)*6 ;
|
||||||
|
|
||||||
|
// j = (n >> 3);
|
||||||
|
j = (n / 6);
|
||||||
while (j > 0){
|
while (j > 0){
|
||||||
|
|
||||||
a1 = a + 0 * lda;
|
a1 = a + 0 * lda;
|
||||||
a2 = a + 1 * lda;
|
a2 = a + 1 * lda;
|
||||||
a3 = a + 2 * lda;
|
a3 = a + 2 * lda;
|
||||||
a4 = a + 3 * lda;
|
a4 = a + 3 * lda;
|
||||||
|
a5 = a + 4 * lda;
|
||||||
|
a6 = a + 5 * lda;
|
||||||
|
|
||||||
i = (m >> 2);
|
// i = (m >> 3);
|
||||||
|
i = (m / 6);
|
||||||
ii = 0;
|
ii = 0;
|
||||||
while (i > 0) {
|
while (i > 0) {
|
||||||
|
|
||||||
|
@ -72,37 +85,67 @@ int CNAME(BLASLONG m, BLASLONG n, FLOAT *a, BLASLONG lda, BLASLONG offset, FLOAT
|
||||||
data01 = *(a1 + 0);
|
data01 = *(a1 + 0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
data05 = *(a2 + 0);
|
data09 = *(a2 + 0);
|
||||||
#ifndef UNIT
|
#ifndef UNIT
|
||||||
data06 = *(a2 + 1);
|
data10 = *(a2 + 1);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
data09 = *(a3 + 0);
|
data17 = *(a3 + 0);
|
||||||
data10 = *(a3 + 1);
|
data18 = *(a3 + 1);
|
||||||
#ifndef UNIT
|
#ifndef UNIT
|
||||||
data11 = *(a3 + 2);
|
data19 = *(a3 + 2);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
data13 = *(a4 + 0);
|
data25 = *(a4 + 0);
|
||||||
data14 = *(a4 + 1);
|
data26 = *(a4 + 1);
|
||||||
data15 = *(a4 + 2);
|
data27 = *(a4 + 2);
|
||||||
#ifndef UNIT
|
#ifndef UNIT
|
||||||
data16 = *(a4 + 3);
|
data28 = *(a4 + 3);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
data33 = *(a5 + 0);
|
||||||
|
data34 = *(a5 + 1);
|
||||||
|
data35 = *(a5 + 2);
|
||||||
|
data36 = *(a5 + 3);
|
||||||
|
#ifndef UNIT
|
||||||
|
data37 = *(a5 + 4);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
data41 = *(a6 + 0);
|
||||||
|
data42 = *(a6 + 1);
|
||||||
|
data43 = *(a6 + 2);
|
||||||
|
data44 = *(a6 + 3);
|
||||||
|
data45 = *(a6 + 4);
|
||||||
|
#ifndef UNIT
|
||||||
|
data46 = *(a6 + 5);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
*(b + 0) = INV(data01);
|
*(b + 0) = INV(data01);
|
||||||
|
|
||||||
*(b + 4) = data05;
|
*(b + 6) = data09;
|
||||||
*(b + 5) = INV(data06);
|
*(b + 7) = INV(data10);
|
||||||
|
|
||||||
*(b + 8) = data09;
|
*(b + 12) = data17;
|
||||||
*(b + 9) = data10;
|
*(b + 13) = data18;
|
||||||
*(b + 10) = INV(data11);
|
*(b + 14) = INV(data19);
|
||||||
|
|
||||||
*(b + 12) = data13;
|
*(b + 18) = data25;
|
||||||
*(b + 13) = data14;
|
*(b + 19) = data26;
|
||||||
*(b + 14) = data15;
|
*(b + 20) = data27;
|
||||||
*(b + 15) = INV(data16);
|
*(b + 21) = INV(data28);
|
||||||
|
|
||||||
|
*(b + 24) = data33;
|
||||||
|
*(b + 25) = data34;
|
||||||
|
*(b + 26) = data35;
|
||||||
|
*(b + 27) = data36;
|
||||||
|
*(b + 28) = INV(data37);
|
||||||
|
|
||||||
|
*(b + 30) = data41;
|
||||||
|
*(b + 31) = data42;
|
||||||
|
*(b + 32) = data43;
|
||||||
|
*(b + 33) = data44;
|
||||||
|
*(b + 34) = data45;
|
||||||
|
*(b + 35) = INV(data46);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ii > jj) {
|
if (ii > jj) {
|
||||||
|
@ -110,21 +153,43 @@ int CNAME(BLASLONG m, BLASLONG n, FLOAT *a, BLASLONG lda, BLASLONG offset, FLOAT
|
||||||
data02 = *(a1 + 1);
|
data02 = *(a1 + 1);
|
||||||
data03 = *(a1 + 2);
|
data03 = *(a1 + 2);
|
||||||
data04 = *(a1 + 3);
|
data04 = *(a1 + 3);
|
||||||
|
data05 = *(a1 + 4);
|
||||||
|
data06 = *(a1 + 5);
|
||||||
|
|
||||||
data05 = *(a2 + 0);
|
data09 = *(a2 + 0);
|
||||||
data06 = *(a2 + 1);
|
data10 = *(a2 + 1);
|
||||||
data07 = *(a2 + 2);
|
data11 = *(a2 + 2);
|
||||||
data08 = *(a2 + 3);
|
data12 = *(a2 + 3);
|
||||||
|
data13 = *(a2 + 4);
|
||||||
|
data14 = *(a2 + 5);
|
||||||
|
|
||||||
data09 = *(a3 + 0);
|
data17 = *(a3 + 0);
|
||||||
data10 = *(a3 + 1);
|
data18 = *(a3 + 1);
|
||||||
data11 = *(a3 + 2);
|
data19 = *(a3 + 2);
|
||||||
data12 = *(a3 + 3);
|
data20 = *(a3 + 3);
|
||||||
|
data21 = *(a3 + 4);
|
||||||
|
data22 = *(a3 + 5);
|
||||||
|
|
||||||
data13 = *(a4 + 0);
|
data25 = *(a4 + 0);
|
||||||
data14 = *(a4 + 1);
|
data26 = *(a4 + 1);
|
||||||
data15 = *(a4 + 2);
|
data27 = *(a4 + 2);
|
||||||
data16 = *(a4 + 3);
|
data28 = *(a4 + 3);
|
||||||
|
data29 = *(a4 + 4);
|
||||||
|
data30 = *(a4 + 5);
|
||||||
|
|
||||||
|
data33 = *(a5 + 0);
|
||||||
|
data34 = *(a5 + 1);
|
||||||
|
data35 = *(a5 + 2);
|
||||||
|
data36 = *(a5 + 3);
|
||||||
|
data37 = *(a5 + 4);
|
||||||
|
data38 = *(a5 + 5);
|
||||||
|
|
||||||
|
data41 = *(a6 + 0);
|
||||||
|
data42 = *(a6 + 1);
|
||||||
|
data43 = *(a6 + 2);
|
||||||
|
data44 = *(a6 + 3);
|
||||||
|
data45 = *(a6 + 4);
|
||||||
|
data46 = *(a6 + 5);
|
||||||
|
|
||||||
*(b + 0) = data01;
|
*(b + 0) = data01;
|
||||||
*(b + 1) = data02;
|
*(b + 1) = data02;
|
||||||
|
@ -132,44 +197,172 @@ int CNAME(BLASLONG m, BLASLONG n, FLOAT *a, BLASLONG lda, BLASLONG offset, FLOAT
|
||||||
*(b + 3) = data04;
|
*(b + 3) = data04;
|
||||||
*(b + 4) = data05;
|
*(b + 4) = data05;
|
||||||
*(b + 5) = data06;
|
*(b + 5) = data06;
|
||||||
*(b + 6) = data07;
|
*(b + 6) = data09;
|
||||||
*(b + 7) = data08;
|
*(b + 7) = data10;
|
||||||
|
*(b + 8) = data11;
|
||||||
|
*(b + 9) = data12;
|
||||||
|
*(b + 10) = data13;
|
||||||
|
*(b + 11) = data14;
|
||||||
|
|
||||||
*(b + 8) = data09;
|
*(b + 12) = data17;
|
||||||
*(b + 9) = data10;
|
*(b + 13) = data18;
|
||||||
*(b + 10) = data11;
|
*(b + 14) = data19;
|
||||||
*(b + 11) = data12;
|
*(b + 15) = data20;
|
||||||
*(b + 12) = data13;
|
*(b + 16) = data21;
|
||||||
*(b + 13) = data14;
|
*(b + 17) = data22;
|
||||||
*(b + 14) = data15;
|
*(b + 18) = data25;
|
||||||
*(b + 15) = data16;
|
*(b + 19) = data26;
|
||||||
|
*(b + 20) = data27;
|
||||||
|
*(b + 21) = data28;
|
||||||
|
*(b + 22) = data29;
|
||||||
|
*(b + 23) = data30;
|
||||||
|
|
||||||
|
*(b + 24) = data33;
|
||||||
|
*(b + 25) = data34;
|
||||||
|
*(b + 26) = data35;
|
||||||
|
*(b + 27) = data36;
|
||||||
|
*(b + 28) = data37;
|
||||||
|
*(b + 29) = data38;
|
||||||
|
*(b + 30) = data41;
|
||||||
|
*(b + 31) = data42;
|
||||||
|
*(b + 32) = data43;
|
||||||
|
*(b + 33) = data44;
|
||||||
|
*(b + 34) = data45;
|
||||||
|
*(b + 35) = data46;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
a1 += 6 * lda;
|
||||||
|
a2 += 6 * lda;
|
||||||
|
a3 += 6 * lda;
|
||||||
|
a4 += 6 * lda;
|
||||||
|
a5 += 6 * lda;
|
||||||
|
a6 += 6 * lda;
|
||||||
|
a7 += 6 * lda;
|
||||||
|
a8 += 6 * lda;
|
||||||
|
b += 36;
|
||||||
|
|
||||||
|
i --;
|
||||||
|
ii += 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mmod6 & 4) {
|
||||||
|
if (ii == jj) {
|
||||||
|
#ifndef UNIT
|
||||||
|
data01 = *(a1 + 0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
data09 = *(a2 + 0);
|
||||||
|
#ifndef UNIT
|
||||||
|
data10 = *(a2 + 1);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
data17 = *(a3 + 0);
|
||||||
|
data18 = *(a3 + 1);
|
||||||
|
#ifndef UNIT
|
||||||
|
data19 = *(a3 + 2);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
data25 = *(a4 + 0);
|
||||||
|
data26 = *(a4 + 1);
|
||||||
|
data27 = *(a4 + 2);
|
||||||
|
#ifndef UNIT
|
||||||
|
data28 = *(a4 + 3);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
*(b + 0) = INV(data01);
|
||||||
|
|
||||||
|
*(b + 6) = data09;
|
||||||
|
*(b + 7) = INV(data10);
|
||||||
|
|
||||||
|
*(b + 12) = data17;
|
||||||
|
*(b + 13) = data18;
|
||||||
|
*(b + 14) = INV(data19);
|
||||||
|
|
||||||
|
*(b + 18) = data25;
|
||||||
|
*(b + 19) = data26;
|
||||||
|
*(b + 20) = data27;
|
||||||
|
*(b + 21) = INV(data28);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ii > jj) {
|
||||||
|
data01 = *(a1 + 0);
|
||||||
|
data02 = *(a1 + 1);
|
||||||
|
data03 = *(a1 + 2);
|
||||||
|
data04 = *(a1 + 3);
|
||||||
|
data05 = *(a1 + 4);
|
||||||
|
data06 = *(a1 + 5);
|
||||||
|
|
||||||
|
data09 = *(a2 + 0);
|
||||||
|
data10 = *(a2 + 1);
|
||||||
|
data11 = *(a2 + 2);
|
||||||
|
data12 = *(a2 + 3);
|
||||||
|
data13 = *(a2 + 4);
|
||||||
|
data14 = *(a2 + 5);
|
||||||
|
|
||||||
|
data17 = *(a3 + 0);
|
||||||
|
data18 = *(a3 + 1);
|
||||||
|
data19 = *(a3 + 2);
|
||||||
|
data20 = *(a3 + 3);
|
||||||
|
data21 = *(a3 + 4);
|
||||||
|
data22 = *(a3 + 5);
|
||||||
|
|
||||||
|
data25 = *(a4 + 0);
|
||||||
|
data26 = *(a4 + 1);
|
||||||
|
data27 = *(a4 + 2);
|
||||||
|
data28 = *(a4 + 3);
|
||||||
|
data29 = *(a4 + 4);
|
||||||
|
data30 = *(a4 + 5);
|
||||||
|
|
||||||
|
*(b + 0) = data01;
|
||||||
|
*(b + 1) = data02;
|
||||||
|
*(b + 2) = data03;
|
||||||
|
*(b + 3) = data04;
|
||||||
|
*(b + 4) = data05;
|
||||||
|
*(b + 5) = data06;
|
||||||
|
*(b + 6) = data09;
|
||||||
|
*(b + 7) = data10;
|
||||||
|
*(b + 8) = data11;
|
||||||
|
*(b + 9) = data12;
|
||||||
|
*(b + 10) = data13;
|
||||||
|
*(b + 11) = data14;
|
||||||
|
|
||||||
|
*(b + 12) = data17;
|
||||||
|
*(b + 13) = data18;
|
||||||
|
*(b + 14) = data19;
|
||||||
|
*(b + 15) = data20;
|
||||||
|
*(b + 16) = data21;
|
||||||
|
*(b + 17) = data22;
|
||||||
|
*(b + 18) = data25;
|
||||||
|
*(b + 19) = data26;
|
||||||
|
*(b + 20) = data27;
|
||||||
|
*(b + 21) = data28;
|
||||||
|
*(b + 22) = data29;
|
||||||
|
*(b + 23) = data30;
|
||||||
}
|
}
|
||||||
|
|
||||||
a1 += 4 * lda;
|
a1 += 4 * lda;
|
||||||
a2 += 4 * lda;
|
a2 += 4 * lda;
|
||||||
a3 += 4 * lda;
|
/* a3 += 4 * lda;
|
||||||
a4 += 4 * lda;
|
a4 += 4 * lda; */
|
||||||
b += 16;
|
b += 24;
|
||||||
|
|
||||||
i --;
|
|
||||||
ii += 4;
|
ii += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((m & 2) != 0) {
|
if (mmod6 & 2) {
|
||||||
|
if (ii == jj) {
|
||||||
if (ii== jj) {
|
|
||||||
#ifndef UNIT
|
#ifndef UNIT
|
||||||
data01 = *(a1 + 0);
|
data01 = *(a1 + 0);
|
||||||
#endif
|
#endif
|
||||||
data05 = *(a2 + 0);
|
|
||||||
|
data09 = *(a2 + 0);
|
||||||
#ifndef UNIT
|
#ifndef UNIT
|
||||||
data06 = *(a2 + 1);
|
data10 = *(a2 + 1);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
*(b + 0) = INV(data01);
|
*(b + 0) = INV(data01);
|
||||||
|
*(b + 6) = data09;
|
||||||
*(b + 4) = data05;
|
*(b + 7) = INV(data10);
|
||||||
*(b + 5) = INV(data06);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ii > jj) {
|
if (ii > jj) {
|
||||||
|
@ -177,11 +370,15 @@ int CNAME(BLASLONG m, BLASLONG n, FLOAT *a, BLASLONG lda, BLASLONG offset, FLOAT
|
||||||
data02 = *(a1 + 1);
|
data02 = *(a1 + 1);
|
||||||
data03 = *(a1 + 2);
|
data03 = *(a1 + 2);
|
||||||
data04 = *(a1 + 3);
|
data04 = *(a1 + 3);
|
||||||
|
data05 = *(a1 + 4);
|
||||||
|
data06 = *(a1 + 5);
|
||||||
|
|
||||||
data05 = *(a2 + 0);
|
data09 = *(a2 + 0);
|
||||||
data06 = *(a2 + 1);
|
data10 = *(a2 + 1);
|
||||||
data07 = *(a2 + 2);
|
data11 = *(a2 + 2);
|
||||||
data08 = *(a2 + 3);
|
data12 = *(a2 + 3);
|
||||||
|
data13 = *(a2 + 4);
|
||||||
|
data14 = *(a2 + 5);
|
||||||
|
|
||||||
*(b + 0) = data01;
|
*(b + 0) = data01;
|
||||||
*(b + 1) = data02;
|
*(b + 1) = data02;
|
||||||
|
@ -189,46 +386,84 @@ int CNAME(BLASLONG m, BLASLONG n, FLOAT *a, BLASLONG lda, BLASLONG offset, FLOAT
|
||||||
*(b + 3) = data04;
|
*(b + 3) = data04;
|
||||||
*(b + 4) = data05;
|
*(b + 4) = data05;
|
||||||
*(b + 5) = data06;
|
*(b + 5) = data06;
|
||||||
*(b + 6) = data07;
|
*(b + 6) = data09;
|
||||||
*(b + 7) = data08;
|
*(b + 7) = data10;
|
||||||
|
*(b + 8) = data11;
|
||||||
|
*(b + 9) = data12;
|
||||||
|
*(b + 10) = data13;
|
||||||
|
*(b + 11) = data14;
|
||||||
}
|
}
|
||||||
|
|
||||||
a1 += 2 * lda;
|
a1 += 2 * lda;
|
||||||
a2 += 2 * lda;
|
// a2 += 2 * lda;
|
||||||
b += 8;
|
b += 12;
|
||||||
|
|
||||||
ii += 2;
|
ii += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((m & 1) != 0) {
|
if (mmod6 & 1) {
|
||||||
|
if (ii == jj) {
|
||||||
if (ii== jj) {
|
|
||||||
#ifndef UNIT
|
#ifndef UNIT
|
||||||
data01 = *(a1 + 0);
|
data01 = *(a1 + 0);
|
||||||
#endif
|
#endif
|
||||||
*(b + 0) = INV(data01);
|
*(b + 0) = INV(data01);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ii > jj) {
|
if (ii > jj) {
|
||||||
data01 = *(a1 + 0);
|
data01 = *(a1 + 0);
|
||||||
data02 = *(a1 + 1);
|
data02 = *(a1 + 1);
|
||||||
data03 = *(a1 + 2);
|
data03 = *(a1 + 2);
|
||||||
data04 = *(a1 + 3);
|
data04 = *(a1 + 3);
|
||||||
|
data05 = *(a1 + 4);
|
||||||
|
data06 = *(a1 + 5);
|
||||||
|
|
||||||
*(b + 0) = data01;
|
*(b + 0) = data01;
|
||||||
*(b + 1) = data02;
|
*(b + 1) = data02;
|
||||||
*(b + 2) = data03;
|
*(b + 2) = data03;
|
||||||
*(b + 3) = data04;
|
*(b + 3) = data04;
|
||||||
|
*(b + 4) = data05;
|
||||||
|
*(b + 5) = data06;
|
||||||
}
|
}
|
||||||
b += 4;
|
b += 6;
|
||||||
}
|
}
|
||||||
|
|
||||||
a += 4;
|
a += 6;
|
||||||
jj += 4;
|
jj += 6;
|
||||||
j --;
|
j --;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (n & 2) {
|
if (nmod6 & 4) {
|
||||||
|
|
||||||
|
a1 = a;
|
||||||
|
a += 4;
|
||||||
|
ii = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < m; i++) {
|
||||||
|
|
||||||
|
if ((ii >= jj ) && (ii - jj < 4)) {
|
||||||
|
for (k = 0; k < ii - jj; k ++) {
|
||||||
|
*(b + k) = *(a1 + k);
|
||||||
|
}
|
||||||
|
|
||||||
|
*(b + ii - jj) = INV(*(a1 + ii - jj));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ii - jj >= 4) {
|
||||||
|
*(b + 0) = *(a1 + 0);
|
||||||
|
*(b + 1) = *(a1 + 1);
|
||||||
|
*(b + 2) = *(a1 + 2);
|
||||||
|
*(b + 3) = *(a1 + 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
b += 4;
|
||||||
|
a1 += lda;
|
||||||
|
ii ++;
|
||||||
|
}
|
||||||
|
|
||||||
|
jj += 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (nmod6 & 2) {
|
||||||
a1 = a + 0 * lda;
|
a1 = a + 0 * lda;
|
||||||
a2 = a + 1 * lda;
|
a2 = a + 1 * lda;
|
||||||
|
|
||||||
|
@ -240,58 +475,58 @@ int CNAME(BLASLONG m, BLASLONG n, FLOAT *a, BLASLONG lda, BLASLONG offset, FLOAT
|
||||||
#ifndef UNIT
|
#ifndef UNIT
|
||||||
data01 = *(a1 + 0);
|
data01 = *(a1 + 0);
|
||||||
#endif
|
#endif
|
||||||
data03 = *(a2 + 0);
|
|
||||||
|
data09 = *(a2 + 0);
|
||||||
#ifndef UNIT
|
#ifndef UNIT
|
||||||
data04 = *(a2 + 1);
|
data10 = *(a2 + 1);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
*(b + 0) = INV(data01);
|
*(b + 0) = INV(data01);
|
||||||
*(b + 2) = data03;
|
*(b + 2) = data09;
|
||||||
*(b + 3) = INV(data04);
|
*(b + 3) = INV(data10);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ii > jj) {
|
if (ii > jj) {
|
||||||
data01 = *(a1 + 0);
|
data01 = *(a1 + 0);
|
||||||
data02 = *(a1 + 1);
|
data02 = *(a1 + 1);
|
||||||
data03 = *(a2 + 0);
|
data09 = *(a2 + 0);
|
||||||
data04 = *(a2 + 1);
|
data10 = *(a2 + 1);
|
||||||
|
|
||||||
*(b + 0) = data01;
|
*(b + 0) = data01;
|
||||||
*(b + 1) = data02;
|
*(b + 1) = data02;
|
||||||
*(b + 2) = data03;
|
*(b + 2) = data09;
|
||||||
*(b + 3) = data04;
|
*(b + 3) = data10;
|
||||||
}
|
}
|
||||||
|
|
||||||
a1 += 2 * lda;
|
a1 += 2 * lda;
|
||||||
a2 += 2 * lda;
|
a2 += 2 * lda;
|
||||||
b += 4;
|
b += 4;
|
||||||
|
|
||||||
i --;
|
i --;
|
||||||
ii += 2;
|
ii += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((m & 1) != 0) {
|
if (m & 1) {
|
||||||
|
if (ii == jj) {
|
||||||
if (ii== jj) {
|
|
||||||
#ifndef UNIT
|
#ifndef UNIT
|
||||||
data01 = *(a1 + 0);
|
data01 = *(a1 + 0);
|
||||||
#endif
|
#endif
|
||||||
*(b + 0) = INV(data01);
|
*(b + 0) = INV(data01);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ii > jj) {
|
if (ii > jj) {
|
||||||
data01 = *(a1 + 0);
|
data01 = *(a1 + 0);
|
||||||
data02 = *(a1 + 1);
|
data02 = *(a1 + 1);
|
||||||
|
|
||||||
*(b + 0) = data01;
|
*(b + 0) = data01;
|
||||||
*(b + 1) = data02;
|
*(b + 1) = data02;
|
||||||
}
|
}
|
||||||
b += 2;
|
b += 2;
|
||||||
}
|
}
|
||||||
a += 2;
|
a += 2;
|
||||||
jj += 2;
|
jj += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (n & 1) {
|
if (nmod6 & 1) {
|
||||||
a1 = a + 0 * lda;
|
a1 = a + 0 * lda;
|
||||||
|
|
||||||
i = m;
|
i = m;
|
||||||
|
@ -310,9 +545,8 @@ int CNAME(BLASLONG m, BLASLONG n, FLOAT *a, BLASLONG lda, BLASLONG offset, FLOAT
|
||||||
*(b + 0) = data01;
|
*(b + 0) = data01;
|
||||||
}
|
}
|
||||||
|
|
||||||
a1 += 1 * lda;
|
a1 += lda;
|
||||||
b += 1;
|
b += 1;
|
||||||
|
|
||||||
i --;
|
i --;
|
||||||
ii += 1;
|
ii += 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -85,11 +85,11 @@ ZSWAPKERNEL = cswap_lasx.S
|
||||||
CSUMKERNEL = csum_lasx.S
|
CSUMKERNEL = csum_lasx.S
|
||||||
ZSUMKERNEL = csum_lasx.S
|
ZSUMKERNEL = csum_lasx.S
|
||||||
|
|
||||||
DGEMMKERNEL = dgemm_kernel_16x4.S
|
DGEMMKERNEL = dgemm_kernel_16x6.S
|
||||||
DGEMMINCOPY = dgemm_ncopy_16.S
|
DGEMMINCOPY = dgemm_ncopy_16.S
|
||||||
DGEMMITCOPY = dgemm_tcopy_16.S
|
DGEMMITCOPY = dgemm_tcopy_16.S
|
||||||
DGEMMONCOPY = dgemm_ncopy_4.S
|
DGEMMONCOPY = gemm_ncopy_6.prefx.c
|
||||||
DGEMMOTCOPY = dgemm_tcopy_4.S
|
DGEMMOTCOPY = dgemm_tcopy_6.S
|
||||||
DGEMMINCOPYOBJ = dgemm_incopy$(TSUFFIX).$(SUFFIX)
|
DGEMMINCOPYOBJ = dgemm_incopy$(TSUFFIX).$(SUFFIX)
|
||||||
DGEMMITCOPYOBJ = dgemm_itcopy$(TSUFFIX).$(SUFFIX)
|
DGEMMITCOPYOBJ = dgemm_itcopy$(TSUFFIX).$(SUFFIX)
|
||||||
DGEMMONCOPYOBJ = dgemm_oncopy$(TSUFFIX).$(SUFFIX)
|
DGEMMONCOPYOBJ = dgemm_oncopy$(TSUFFIX).$(SUFFIX)
|
||||||
|
@ -153,10 +153,10 @@ ZTRSMKERNEL_LT = ../generic/trsm_kernel_LT.c
|
||||||
ZTRSMKERNEL_RN = ../generic/trsm_kernel_RN.c
|
ZTRSMKERNEL_RN = ../generic/trsm_kernel_RN.c
|
||||||
ZTRSMKERNEL_RT = ../generic/trsm_kernel_RT.c
|
ZTRSMKERNEL_RT = ../generic/trsm_kernel_RT.c
|
||||||
|
|
||||||
DTRSMKERNEL_LN = dtrsm_kernel_LN_16x4_lasx.S
|
DTRSMKERNEL_LN = trsm_kernel_LN_UNROLLN6.c
|
||||||
DTRSMKERNEL_LT = dtrsm_kernel_LT_16x4_lasx.S
|
DTRSMKERNEL_LT = trsm_kernel_LT_UNROLLN6.c
|
||||||
DTRSMKERNEL_RN = dtrsm_kernel_RN_16x4_lasx.S
|
DTRSMKERNEL_RN = trsm_kernel_RN_UNROLLN6.c
|
||||||
DTRSMKERNEL_RT = dtrsm_kernel_RT_16x4_lasx.S
|
DTRSMKERNEL_RT = trsm_kernel_RT_UNROLLN6.c
|
||||||
|
|
||||||
STRSMKERNEL_LN = ../generic/trsm_kernel_LN.c
|
STRSMKERNEL_LN = ../generic/trsm_kernel_LN.c
|
||||||
STRSMKERNEL_LT = ../generic/trsm_kernel_LT.c
|
STRSMKERNEL_LT = ../generic/trsm_kernel_LT.c
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,555 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
Copyright (c) 2024, The OpenBLAS Project
|
||||||
|
All rights reserved.
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are
|
||||||
|
met:
|
||||||
|
1. Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in
|
||||||
|
the documentation and/or other materials provided with the
|
||||||
|
distribution.
|
||||||
|
3. Neither the name of the OpenBLAS project nor the names of
|
||||||
|
its contributors may be used to endorse or promote products
|
||||||
|
derived from this software without specific prior written permission.
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL THE OPENBLAS PROJECT OR CONTRIBUTORS BE
|
||||||
|
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
||||||
|
USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*******************************************************************************/
|
||||||
|
#define ASSEMBLER
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
/* Function parameters */
|
||||||
|
#define M $r4 // param 1: m
|
||||||
|
#define N $r5 // param 2: n
|
||||||
|
#define SRC $r6 // param 3: src
|
||||||
|
#define LDA $r7 // param 4: lda
|
||||||
|
#define DST $r8 // param 5: dst
|
||||||
|
|
||||||
|
#define I $r9
|
||||||
|
#define J $r10
|
||||||
|
#define S0 $r11
|
||||||
|
#define S1 $r12
|
||||||
|
#define S2 $r13
|
||||||
|
#define S3 $r14
|
||||||
|
#define S4 $r15
|
||||||
|
#define S5 $r16
|
||||||
|
#define S6 $r17
|
||||||
|
#define S7 $r18
|
||||||
|
#define S8 $r19
|
||||||
|
#define P0 $r20
|
||||||
|
#define P1 $r23
|
||||||
|
#define P2 $r24
|
||||||
|
#define P3 $r25
|
||||||
|
#define P4 $r26
|
||||||
|
#define T0 $r27
|
||||||
|
#define T1 $r28
|
||||||
|
#define T2 $r29
|
||||||
|
#define TL $r7
|
||||||
|
#define ZERO $r0
|
||||||
|
|
||||||
|
#define F0 $f0
|
||||||
|
#define F1 $f1
|
||||||
|
#define F2 $f2
|
||||||
|
#define F3 $f3
|
||||||
|
#define F4 $f4
|
||||||
|
#define F5 $f5
|
||||||
|
#define F6 $f6
|
||||||
|
#define F7 $f7
|
||||||
|
/* LSX vectors */
|
||||||
|
#define V0 $vr0
|
||||||
|
#define V1 $vr1
|
||||||
|
#define V2 $vr2
|
||||||
|
#define V3 $vr3
|
||||||
|
/* LASX vectors */
|
||||||
|
#define U0 $xr4
|
||||||
|
#define U1 $xr5
|
||||||
|
#define U2 $xr6
|
||||||
|
#define U3 $xr7
|
||||||
|
#define U4 $xr8
|
||||||
|
#define U5 $xr9
|
||||||
|
#define U6 $xr10
|
||||||
|
#define U7 $xr11
|
||||||
|
|
||||||
|
PROLOGUE
|
||||||
|
|
||||||
|
addi.d $sp, $sp, -56
|
||||||
|
SDARG $r23, $sp, 0
|
||||||
|
SDARG $r24, $sp, 8
|
||||||
|
SDARG $r25, $sp, 16
|
||||||
|
SDARG $r26, $sp, 24
|
||||||
|
SDARG $r27, $sp, 32
|
||||||
|
SDARG $r28, $sp, 40
|
||||||
|
SDARG $r29, $sp, 48
|
||||||
|
|
||||||
|
move S0, SRC
|
||||||
|
move P0, DST
|
||||||
|
|
||||||
|
addi.d I, ZERO, 0x06
|
||||||
|
div.d T0, N, I // 1
|
||||||
|
mul.d T1, I, T0 // 6
|
||||||
|
sub.d N, N, T1 // 1
|
||||||
|
|
||||||
|
srai.d T2, N, 0x02
|
||||||
|
slli.d T2, T2, 0x02
|
||||||
|
add.d T2, T1, T2
|
||||||
|
|
||||||
|
mul.d P2, M, T1
|
||||||
|
mul.d P3, M, T2
|
||||||
|
slli.d P2, P2, 0x03
|
||||||
|
slli.d P3, P3, 0x03
|
||||||
|
|
||||||
|
srai.d T2, N, 0x01
|
||||||
|
srai.d J, M, 0x03
|
||||||
|
slli.d T2, T2, 0x01
|
||||||
|
add.d T2, T1, T2
|
||||||
|
|
||||||
|
add.d P2, DST, P2
|
||||||
|
mul.d P4, M, T2
|
||||||
|
add.d P3, DST, P3
|
||||||
|
slli.d P4, P4, 0x03
|
||||||
|
slli.d TL, LDA, 0x03
|
||||||
|
add.d P4, DST, P4
|
||||||
|
|
||||||
|
slli.d T2, TL, 0x01
|
||||||
|
slli.d T1, M, 0x03
|
||||||
|
mul.d T1, T1, I
|
||||||
|
beq ZERO, J, .L_M7
|
||||||
|
|
||||||
|
.L_J1: /* J-- */
|
||||||
|
move S1, S0
|
||||||
|
add.d S2, S0, TL
|
||||||
|
add.d S3, S1, T2
|
||||||
|
add.d S4, S2, T2
|
||||||
|
add.d S5, S3, T2
|
||||||
|
add.d S6, S4, T2
|
||||||
|
add.d S7, S5, T2
|
||||||
|
add.d S8, S6, T2
|
||||||
|
add.d S0, S7, T2
|
||||||
|
|
||||||
|
move P1, P0
|
||||||
|
addi.d P0, P0, 0x180
|
||||||
|
|
||||||
|
move I, T0
|
||||||
|
addi.d J, J, -1
|
||||||
|
beq ZERO, I, .L_N7
|
||||||
|
|
||||||
|
.L_I1: /* I-- */
|
||||||
|
xvld U0, S1, 0x00
|
||||||
|
vld V0, S1, 0x20
|
||||||
|
xvld U1, S2, 0x00
|
||||||
|
vld V1, S2, 0x20
|
||||||
|
xvld U2, S3, 0x00
|
||||||
|
vld V2, S3, 0x20
|
||||||
|
xvld U3, S4, 0x00
|
||||||
|
vld V3, S4, 0x20
|
||||||
|
|
||||||
|
xvst U0, P1, 0x00
|
||||||
|
vst V0, P1, 0x20
|
||||||
|
|
||||||
|
xvst U1, P1, 0x30
|
||||||
|
vst V1, P1, 0x50
|
||||||
|
|
||||||
|
xvst U2, P1, 0x60
|
||||||
|
vst V2, P1, 0x80
|
||||||
|
|
||||||
|
xvst U3, P1, 0x90
|
||||||
|
vst V3, P1, 0xB0
|
||||||
|
|
||||||
|
xvld U0, S5, 0x00
|
||||||
|
vld V0, S5, 0x20
|
||||||
|
xvld U1, S6, 0x00
|
||||||
|
vld V1, S6, 0x20
|
||||||
|
xvld U2, S7, 0x00
|
||||||
|
vld V2, S7, 0x20
|
||||||
|
xvld U3, S8, 0x00
|
||||||
|
vld V3, S8, 0x20
|
||||||
|
|
||||||
|
xvst U0, P1, 0xC0
|
||||||
|
vst V0, P1, 0xE0
|
||||||
|
|
||||||
|
xvst U1, P1, 0xF0
|
||||||
|
vst V1, P1, 0x110
|
||||||
|
|
||||||
|
xvst U2, P1, 0x120
|
||||||
|
vst V2, P1, 0x140
|
||||||
|
|
||||||
|
xvst U3, P1, 0x150
|
||||||
|
vst V3, P1, 0x170
|
||||||
|
|
||||||
|
addi.d S1, S1, 0x30
|
||||||
|
addi.d S2, S2, 0x30
|
||||||
|
addi.d S3, S3, 0x30
|
||||||
|
addi.d S4, S4, 0x30
|
||||||
|
addi.d S5, S5, 0x30
|
||||||
|
addi.d S6, S6, 0x30
|
||||||
|
addi.d S7, S7, 0x30
|
||||||
|
addi.d S8, S8, 0x30
|
||||||
|
addi.d I, I, -1
|
||||||
|
|
||||||
|
add.d P1, P1, T1
|
||||||
|
blt ZERO, I, .L_I1
|
||||||
|
|
||||||
|
.L_N7:
|
||||||
|
andi I, N, 0x04
|
||||||
|
beq ZERO, I, .L_N3
|
||||||
|
|
||||||
|
xvld U0, S1, 0x00
|
||||||
|
xvld U1, S2, 0x00
|
||||||
|
xvld U2, S3, 0x00
|
||||||
|
xvld U3, S4, 0x00
|
||||||
|
xvld U4, S5, 0x00
|
||||||
|
xvld U5, S6, 0x00
|
||||||
|
xvld U6, S7, 0x00
|
||||||
|
xvld U7, S8, 0x00
|
||||||
|
|
||||||
|
xvst U0, P2, 0x00
|
||||||
|
xvst U1, P2, 0x20
|
||||||
|
xvst U2, P2, 0x40
|
||||||
|
xvst U3, P2, 0x60
|
||||||
|
xvst U4, P2, 0x80
|
||||||
|
xvst U5, P2, 0xA0
|
||||||
|
xvst U6, P2, 0xC0
|
||||||
|
xvst U7, P2, 0xE0
|
||||||
|
|
||||||
|
addi.d S1, S1, 0x20
|
||||||
|
addi.d S2, S2, 0x20
|
||||||
|
addi.d S3, S3, 0x20
|
||||||
|
addi.d S4, S4, 0x20
|
||||||
|
addi.d S5, S5, 0x20
|
||||||
|
addi.d S6, S6, 0x20
|
||||||
|
addi.d S7, S7, 0x20
|
||||||
|
addi.d S8, S8, 0x20
|
||||||
|
addi.d P2, P2, 0x100
|
||||||
|
|
||||||
|
.L_N3:
|
||||||
|
andi I, N, 0x02
|
||||||
|
beq ZERO, I, .L_N1
|
||||||
|
|
||||||
|
xvld U0, S1, 0x00
|
||||||
|
xvld U1, S2, 0x00
|
||||||
|
xvld U2, S3, 0x00
|
||||||
|
xvld U3, S4, 0x00
|
||||||
|
xvld U4, S5, 0x00
|
||||||
|
xvld U5, S6, 0x00
|
||||||
|
xvld U6, S7, 0x00
|
||||||
|
xvld U7, S8, 0x00
|
||||||
|
|
||||||
|
xvpermi.q U0, U1, 0x02
|
||||||
|
xvpermi.q U2, U3, 0x02
|
||||||
|
xvpermi.q U4, U5, 0x02
|
||||||
|
xvpermi.q U6, U7, 0x02
|
||||||
|
|
||||||
|
xvst U0, P3, 0x00
|
||||||
|
xvst U2, P3, 0x20
|
||||||
|
xvst U4, P3, 0x40
|
||||||
|
xvst U6, P3, 0x60
|
||||||
|
|
||||||
|
addi.d S1, S1, 0x10
|
||||||
|
addi.d S2, S2, 0x10
|
||||||
|
addi.d S3, S3, 0x10
|
||||||
|
addi.d S4, S4, 0x10
|
||||||
|
addi.d S5, S5, 0x10
|
||||||
|
addi.d S6, S6, 0x10
|
||||||
|
addi.d S7, S7, 0x10
|
||||||
|
addi.d S8, S8, 0x10
|
||||||
|
addi.d P3, P3, 0x80
|
||||||
|
|
||||||
|
.L_N1:
|
||||||
|
andi I, N, 0x01
|
||||||
|
beq ZERO, I, .L_N0
|
||||||
|
|
||||||
|
fld.d F0, S1, 0x00
|
||||||
|
fld.d F1, S2, 0x00
|
||||||
|
fld.d F2, S3, 0x00
|
||||||
|
fld.d F3, S4, 0x00
|
||||||
|
fld.d F4, S5, 0x00
|
||||||
|
fld.d F5, S6, 0x00
|
||||||
|
fld.d F6, S7, 0x00
|
||||||
|
fld.d F7, S8, 0x00
|
||||||
|
|
||||||
|
fst.d F0, P4, 0x00
|
||||||
|
fst.d F1, P4, 0x08
|
||||||
|
fst.d F2, P4, 0x10
|
||||||
|
fst.d F3, P4, 0x18
|
||||||
|
fst.d F4, P4, 0x20
|
||||||
|
fst.d F5, P4, 0x28
|
||||||
|
fst.d F6, P4, 0x30
|
||||||
|
fst.d F7, P4, 0x38
|
||||||
|
|
||||||
|
addi.d S1, S1, 0x08
|
||||||
|
addi.d S2, S2, 0x08
|
||||||
|
addi.d S3, S3, 0x08
|
||||||
|
addi.d S4, S4, 0x08
|
||||||
|
addi.d S5, S5, 0x08
|
||||||
|
addi.d S6, S6, 0x08
|
||||||
|
addi.d S7, S7, 0x08
|
||||||
|
addi.d S8, S8, 0x08
|
||||||
|
addi.d P4, P4, 0x40
|
||||||
|
|
||||||
|
.L_N0:
|
||||||
|
blt ZERO, J, .L_J1
|
||||||
|
|
||||||
|
.L_M7:
|
||||||
|
andi J, M, 0x04
|
||||||
|
beq ZERO, J, .L_M3
|
||||||
|
|
||||||
|
move S1, S0
|
||||||
|
add.d S2, S0, TL
|
||||||
|
add.d S3, S1, T2
|
||||||
|
add.d S4, S2, T2
|
||||||
|
add.d S0, S3, T2
|
||||||
|
|
||||||
|
move P1, P0
|
||||||
|
addi.d P0, P0, 0xC0
|
||||||
|
|
||||||
|
move I, T0
|
||||||
|
beq ZERO, I, .L_4N7
|
||||||
|
|
||||||
|
.L_4I1: /* I-- */
|
||||||
|
xvld U0, S1, 0x00
|
||||||
|
vld V0, S1, 0x20
|
||||||
|
xvld U1, S2, 0x00
|
||||||
|
vld V1, S2, 0x20
|
||||||
|
xvld U2, S3, 0x00
|
||||||
|
vld V2, S3, 0x20
|
||||||
|
xvld U3, S4, 0x00
|
||||||
|
vld V3, S4, 0x20
|
||||||
|
|
||||||
|
xvst U0, P1, 0x00
|
||||||
|
vst V0, P1, 0x20
|
||||||
|
|
||||||
|
xvst U1, P1, 0x30
|
||||||
|
vst V1, P1, 0x50
|
||||||
|
|
||||||
|
xvst U2, P1, 0x60
|
||||||
|
vst V2, P1, 0x80
|
||||||
|
|
||||||
|
xvst U3, P1, 0x90
|
||||||
|
vst V3, P1, 0xB0
|
||||||
|
|
||||||
|
addi.d S1, S1, 0x30
|
||||||
|
addi.d S2, S2, 0x30
|
||||||
|
addi.d S3, S3, 0x30
|
||||||
|
addi.d S4, S4, 0x30
|
||||||
|
|
||||||
|
addi.d I, I, -1
|
||||||
|
add.d P1, P1, T1
|
||||||
|
blt ZERO, I, .L_4I1
|
||||||
|
|
||||||
|
.L_4N7:
|
||||||
|
andi I, N, 0x04
|
||||||
|
beq ZERO, I, .L_4N3
|
||||||
|
|
||||||
|
xvld U0, S1, 0x00
|
||||||
|
xvld U1, S2, 0x00
|
||||||
|
xvld U2, S3, 0x00
|
||||||
|
xvld U3, S4, 0x00
|
||||||
|
|
||||||
|
xvst U0, P2, 0x00
|
||||||
|
xvst U1, P2, 0x20
|
||||||
|
xvst U2, P2, 0x40
|
||||||
|
xvst U3, P2, 0x60
|
||||||
|
|
||||||
|
addi.d S1, S1, 0x20
|
||||||
|
addi.d S2, S2, 0x20
|
||||||
|
addi.d S3, S3, 0x20
|
||||||
|
addi.d S4, S4, 0x20
|
||||||
|
addi.d P2, P2, 0x80
|
||||||
|
|
||||||
|
.L_4N3:
|
||||||
|
andi I, N, 0x02
|
||||||
|
beq ZERO, I, .L_4N1
|
||||||
|
|
||||||
|
xvld U0, S1, 0x00
|
||||||
|
xvld U1, S2, 0x00
|
||||||
|
xvld U2, S3, 0x00
|
||||||
|
xvld U3, S4, 0x00
|
||||||
|
|
||||||
|
xvpermi.q U0, U1, 0x02
|
||||||
|
xvpermi.q U2, U3, 0x02
|
||||||
|
|
||||||
|
xvst U0, P3, 0x00
|
||||||
|
xvst U2, P3, 0x20
|
||||||
|
|
||||||
|
addi.d S1, S1, 0x10
|
||||||
|
addi.d S2, S2, 0x10
|
||||||
|
addi.d S3, S3, 0x10
|
||||||
|
addi.d S4, S4, 0x10
|
||||||
|
addi.d P3, P3, 0x40
|
||||||
|
|
||||||
|
.L_4N1:
|
||||||
|
andi I, N, 0x01
|
||||||
|
beq ZERO, I, .L_M3
|
||||||
|
|
||||||
|
fld.d F0, S1, 0x00
|
||||||
|
fld.d F1, S2, 0x00
|
||||||
|
fld.d F2, S3, 0x00
|
||||||
|
fld.d F3, S4, 0x00
|
||||||
|
|
||||||
|
fst.d F0, P4, 0x00
|
||||||
|
fst.d F1, P4, 0x08
|
||||||
|
fst.d F2, P4, 0x10
|
||||||
|
fst.d F3, P4, 0x18
|
||||||
|
|
||||||
|
addi.d S1, S1, 0x08
|
||||||
|
addi.d S2, S2, 0x08
|
||||||
|
addi.d S3, S3, 0x08
|
||||||
|
addi.d S4, S4, 0x08
|
||||||
|
addi.d P4, P4, 0x20
|
||||||
|
|
||||||
|
.L_M3:
|
||||||
|
andi J, M, 0x02
|
||||||
|
beq ZERO, J, .L_M1
|
||||||
|
|
||||||
|
move S1, S0
|
||||||
|
add.d S2, S0, TL
|
||||||
|
add.d S0, S0, T2
|
||||||
|
|
||||||
|
move P1, P0
|
||||||
|
addi.d P0, P0, 0x60
|
||||||
|
|
||||||
|
move I, T0
|
||||||
|
beq ZERO, I, .L_2N7
|
||||||
|
|
||||||
|
.L_2I1: /* I-- */
|
||||||
|
xvld U0, S1, 0x00
|
||||||
|
vld V0, S1, 0x20
|
||||||
|
xvld U1, S2, 0x00
|
||||||
|
vld V1, S2, 0x20
|
||||||
|
|
||||||
|
xvst U0, P1, 0x00
|
||||||
|
vst V0, P1, 0x20
|
||||||
|
|
||||||
|
xvst U1, P1, 0x30
|
||||||
|
vst V1, P1, 0x50
|
||||||
|
|
||||||
|
addi.d S1, S1, 0x30
|
||||||
|
addi.d S2, S2, 0x30
|
||||||
|
addi.d I, I, -1
|
||||||
|
add.d P1, P1, T1
|
||||||
|
blt ZERO, I, .L_2I1
|
||||||
|
|
||||||
|
.L_2N7:
|
||||||
|
andi I, N, 0x04
|
||||||
|
beq ZERO, I, .L_2N3
|
||||||
|
|
||||||
|
xvld U0, S1, 0x00
|
||||||
|
xvld U1, S2, 0x00
|
||||||
|
|
||||||
|
xvst U0, P2, 0x00
|
||||||
|
xvst U1, P2, 0x20
|
||||||
|
|
||||||
|
addi.d S1, S1, 0x20
|
||||||
|
addi.d S2, S2, 0x20
|
||||||
|
addi.d P2, P2, 0x40
|
||||||
|
|
||||||
|
.L_2N3:
|
||||||
|
andi I, N, 0x02
|
||||||
|
beq ZERO, I, .L_2N1
|
||||||
|
|
||||||
|
xvld U0, S1, 0x00
|
||||||
|
xvld U1, S2, 0x00
|
||||||
|
|
||||||
|
xvpermi.q U0, U1, 0x02
|
||||||
|
|
||||||
|
xvst U0, P3, 0x00
|
||||||
|
|
||||||
|
addi.d S1, S1, 0x10
|
||||||
|
addi.d S2, S2, 0x10
|
||||||
|
addi.d P3, P3, 0x20
|
||||||
|
|
||||||
|
.L_2N1:
|
||||||
|
andi I, N, 0x01
|
||||||
|
beq ZERO, I, .L_M1
|
||||||
|
|
||||||
|
fld.d F0, S1, 0x00
|
||||||
|
fld.d F1, S2, 0x00
|
||||||
|
|
||||||
|
fst.d F0, P4, 0x00
|
||||||
|
fst.d F1, P4, 0x08
|
||||||
|
|
||||||
|
addi.d S1, S1, 0x08
|
||||||
|
addi.d S2, S2, 0x08
|
||||||
|
addi.d P4, P4, 0x10
|
||||||
|
|
||||||
|
.L_M1:
|
||||||
|
andi J, M, 0x01
|
||||||
|
beq ZERO, J, .L_M0
|
||||||
|
|
||||||
|
move S1, S0
|
||||||
|
add.d S2, S0, TL
|
||||||
|
|
||||||
|
move P1, P0
|
||||||
|
addi.d P0, P0, 0x30
|
||||||
|
|
||||||
|
move I, T0
|
||||||
|
beq ZERO, I, .L_1N7
|
||||||
|
|
||||||
|
.L_1I1: /* I-- */
|
||||||
|
xvld U0, S1, 0x00
|
||||||
|
vld V0, S1, 0x20
|
||||||
|
|
||||||
|
xvst U0, P1, 0x00
|
||||||
|
vst V0, P1, 0x20
|
||||||
|
|
||||||
|
addi.d S1, S1, 0x30
|
||||||
|
addi.d I, I, -1
|
||||||
|
add.d P1, P1, T1
|
||||||
|
blt ZERO, I, .L_1I1
|
||||||
|
|
||||||
|
.L_1N7:
|
||||||
|
andi I, N, 0x04
|
||||||
|
beq ZERO, I, .L_1N3
|
||||||
|
|
||||||
|
xvld U0, S1, 0x00
|
||||||
|
|
||||||
|
xvst U0, P2, 0x00
|
||||||
|
|
||||||
|
addi.d S1, S1, 0x20
|
||||||
|
addi.d P2, P2, 0x20
|
||||||
|
|
||||||
|
.L_1N3:
|
||||||
|
andi I, N, 0x02
|
||||||
|
beq ZERO, I, .L_1N1
|
||||||
|
|
||||||
|
fld.d F0, S1, 0x00
|
||||||
|
fld.d F1, S1, 0x08
|
||||||
|
|
||||||
|
fst.d F0, P3, 0x00
|
||||||
|
fst.d F1, P3, 0x08
|
||||||
|
|
||||||
|
addi.d S1, S1, 0x10
|
||||||
|
addi.d P3, P3, 0x10
|
||||||
|
|
||||||
|
.L_1N1:
|
||||||
|
andi I, N, 0x01
|
||||||
|
beq ZERO, I, .L_M0
|
||||||
|
|
||||||
|
fld.d F0, S1, 0x00
|
||||||
|
|
||||||
|
fst.d F0, P4, 0x00
|
||||||
|
|
||||||
|
addi.d S1, S1, 0x08
|
||||||
|
addi.d P4, P4, 0x08
|
||||||
|
|
||||||
|
.L_M0:
|
||||||
|
LDARG $r23, $sp, 0
|
||||||
|
LDARG $r24, $sp, 8
|
||||||
|
LDARG $r25, $sp, 16
|
||||||
|
LDARG $r26, $sp, 24
|
||||||
|
LDARG $r27, $sp, 32
|
||||||
|
LDARG $r28, $sp, 40
|
||||||
|
LDARG $r29, $sp, 48
|
||||||
|
addi.d $sp, $sp, 56
|
||||||
|
jirl $r0, $r1, 0x00
|
||||||
|
|
||||||
|
EPILOGUE
|
|
@ -0,0 +1,299 @@
|
||||||
|
/*********************************************************************/
|
||||||
|
/* Copyright 2009, 2010 The University of Texas at Austin. */
|
||||||
|
/* All rights reserved. */
|
||||||
|
/* */
|
||||||
|
/* Redistribution and use in source and binary forms, with or */
|
||||||
|
/* without modification, are permitted provided that the following */
|
||||||
|
/* conditions are met: */
|
||||||
|
/* */
|
||||||
|
/* 1. Redistributions of source code must retain the above */
|
||||||
|
/* copyright notice, this list of conditions and the following */
|
||||||
|
/* disclaimer. */
|
||||||
|
/* */
|
||||||
|
/* 2. Redistributions in binary form must reproduce the above */
|
||||||
|
/* copyright notice, this list of conditions and the following */
|
||||||
|
/* disclaimer in the documentation and/or other materials */
|
||||||
|
/* provided with the distribution. */
|
||||||
|
/* */
|
||||||
|
/* THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY OF TEXAS AT */
|
||||||
|
/* AUSTIN ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, */
|
||||||
|
/* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF */
|
||||||
|
/* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE */
|
||||||
|
/* DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OF TEXAS AT */
|
||||||
|
/* AUSTIN OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, */
|
||||||
|
/* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES */
|
||||||
|
/* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE */
|
||||||
|
/* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR */
|
||||||
|
/* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF */
|
||||||
|
/* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT */
|
||||||
|
/* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT */
|
||||||
|
/* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE */
|
||||||
|
/* POSSIBILITY OF SUCH DAMAGE. */
|
||||||
|
/* */
|
||||||
|
/* The views and conclusions contained in the software and */
|
||||||
|
/* documentation are those of the authors and should not be */
|
||||||
|
/* interpreted as representing official policies, either expressed */
|
||||||
|
/* or implied, of The University of Texas at Austin. */
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
int CNAME(BLASLONG m, BLASLONG n, FLOAT *a, BLASLONG lda, FLOAT *b){
|
||||||
|
BLASLONG i, j;
|
||||||
|
BLASLONG nmod6;
|
||||||
|
|
||||||
|
FLOAT *aoffset;
|
||||||
|
FLOAT *aoffset1, *aoffset2, *aoffset3, *aoffset4;
|
||||||
|
FLOAT *aoffset5, *aoffset6 ;
|
||||||
|
|
||||||
|
FLOAT *boffset;
|
||||||
|
FLOAT ctemp01, ctemp02, ctemp03, ctemp04;
|
||||||
|
FLOAT ctemp05, ctemp06, ctemp07, ctemp08;
|
||||||
|
FLOAT ctemp09, ctemp10, ctemp11, ctemp12;
|
||||||
|
FLOAT ctemp13, ctemp14, ctemp15, ctemp16;
|
||||||
|
FLOAT ctemp17, ctemp18, ctemp19, ctemp20;
|
||||||
|
FLOAT ctemp21, ctemp22, ctemp23, ctemp24;
|
||||||
|
|
||||||
|
nmod6 = n - (n / 6)* 6 ;
|
||||||
|
aoffset = a;
|
||||||
|
boffset = b;
|
||||||
|
|
||||||
|
// prefex A: 1 block, block size: 4*8 bytes, offset: 16*8 bytes, base: aoffset1,2,,6;
|
||||||
|
BLASULONG index = 0x100080; //( (1<<20)|(16<<3)&0xffff) ) ;
|
||||||
|
// prefex B: 1 block, block size: 24*8 bytes, offset: 96*8 bytes, base: boffset;
|
||||||
|
BLASULONG index_b = 0xb00300; //(11<<20) | ((96*8)&0xffff) ;
|
||||||
|
|
||||||
|
j = (n / 6);
|
||||||
|
if (j > 0){
|
||||||
|
do{
|
||||||
|
aoffset1 = aoffset;
|
||||||
|
aoffset2 = aoffset1 + lda;
|
||||||
|
aoffset3 = aoffset2 + lda;
|
||||||
|
aoffset4 = aoffset3 + lda;
|
||||||
|
aoffset5 = aoffset4 + lda;
|
||||||
|
aoffset6 = aoffset5 + lda;
|
||||||
|
aoffset += 6 * lda;
|
||||||
|
|
||||||
|
i = (m >> 2);
|
||||||
|
if (i > 0){
|
||||||
|
do{
|
||||||
|
ctemp01 = *(aoffset1 + 0);
|
||||||
|
ctemp02 = *(aoffset1 + 1);
|
||||||
|
ctemp03 = *(aoffset1 + 2);
|
||||||
|
ctemp04 = *(aoffset1 + 3);
|
||||||
|
|
||||||
|
ctemp05 = *(aoffset2 + 0);
|
||||||
|
ctemp06 = *(aoffset2 + 1);
|
||||||
|
ctemp07 = *(aoffset2 + 2);
|
||||||
|
ctemp08 = *(aoffset2 + 3);
|
||||||
|
|
||||||
|
ctemp09 = *(aoffset3 + 0);
|
||||||
|
ctemp10 = *(aoffset3 + 1);
|
||||||
|
ctemp11 = *(aoffset3 + 2);
|
||||||
|
ctemp12 = *(aoffset3 + 3);
|
||||||
|
|
||||||
|
ctemp13 = *(aoffset4 + 0);
|
||||||
|
ctemp14 = *(aoffset4 + 1);
|
||||||
|
ctemp15 = *(aoffset4 + 2);
|
||||||
|
ctemp16 = *(aoffset4 + 3);
|
||||||
|
|
||||||
|
ctemp17 = *(aoffset5 + 0);
|
||||||
|
ctemp18 = *(aoffset5 + 1);
|
||||||
|
ctemp19 = *(aoffset5 + 2);
|
||||||
|
ctemp20 = *(aoffset5 + 3);
|
||||||
|
|
||||||
|
ctemp21 = *(aoffset6 + 0);
|
||||||
|
ctemp22 = *(aoffset6 + 1);
|
||||||
|
ctemp23 = *(aoffset6 + 2);
|
||||||
|
ctemp24 = *(aoffset6 + 3);
|
||||||
|
|
||||||
|
*(boffset + 0) = ctemp01;
|
||||||
|
*(boffset + 1) = ctemp05;
|
||||||
|
*(boffset + 2) = ctemp09;
|
||||||
|
*(boffset + 3) = ctemp13;
|
||||||
|
*(boffset + 4) = ctemp17;
|
||||||
|
*(boffset + 5) = ctemp21;
|
||||||
|
|
||||||
|
*(boffset + 6) = ctemp02;
|
||||||
|
*(boffset + 7) = ctemp06;
|
||||||
|
*(boffset + 8) = ctemp10;
|
||||||
|
*(boffset + 9) = ctemp14;
|
||||||
|
*(boffset + 10) = ctemp18;
|
||||||
|
*(boffset + 11) = ctemp22;
|
||||||
|
|
||||||
|
*(boffset + 12) = ctemp03;
|
||||||
|
*(boffset + 13) = ctemp07;
|
||||||
|
*(boffset + 14) = ctemp11;
|
||||||
|
*(boffset + 15) = ctemp15;
|
||||||
|
*(boffset + 16) = ctemp19;
|
||||||
|
*(boffset + 17) = ctemp23;
|
||||||
|
|
||||||
|
*(boffset + 18) = ctemp04;
|
||||||
|
*(boffset + 19) = ctemp08;
|
||||||
|
*(boffset + 20) = ctemp12;
|
||||||
|
*(boffset + 21) = ctemp16;
|
||||||
|
*(boffset + 22) = ctemp20;
|
||||||
|
*(boffset + 23) = ctemp24;
|
||||||
|
|
||||||
|
aoffset1 += 4;
|
||||||
|
aoffset2 += 4;
|
||||||
|
aoffset3 += 4;
|
||||||
|
aoffset4 += 4;
|
||||||
|
aoffset5 += 4;
|
||||||
|
aoffset6 += 4;
|
||||||
|
|
||||||
|
boffset += 24;
|
||||||
|
i --;
|
||||||
|
}while(i > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
i = (m & 3);
|
||||||
|
if (i > 0){
|
||||||
|
do{
|
||||||
|
ctemp01 = *(aoffset1 + 0);
|
||||||
|
ctemp03 = *(aoffset2 + 0);
|
||||||
|
ctemp05 = *(aoffset3 + 0);
|
||||||
|
ctemp07 = *(aoffset4 + 0);
|
||||||
|
ctemp09 = *(aoffset5 + 0);
|
||||||
|
ctemp11 = *(aoffset6 + 0);
|
||||||
|
|
||||||
|
*(boffset + 0) = ctemp01;
|
||||||
|
*(boffset + 1) = ctemp03;
|
||||||
|
*(boffset + 2) = ctemp05;
|
||||||
|
*(boffset + 3) = ctemp07;
|
||||||
|
*(boffset + 4) = ctemp09;
|
||||||
|
*(boffset + 5) = ctemp11;
|
||||||
|
|
||||||
|
aoffset1 ++;
|
||||||
|
aoffset2 ++;
|
||||||
|
aoffset3 ++;
|
||||||
|
aoffset4 ++;
|
||||||
|
aoffset5 ++;
|
||||||
|
aoffset6 ++;
|
||||||
|
boffset += 6;
|
||||||
|
i --;
|
||||||
|
}while(i > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
j--;
|
||||||
|
}while(j > 0);
|
||||||
|
} /* end of if(j > 0) */
|
||||||
|
|
||||||
|
if (nmod6 & 4){
|
||||||
|
aoffset1 = aoffset;
|
||||||
|
aoffset2 = aoffset1 + lda;
|
||||||
|
aoffset3 = aoffset2 + lda;
|
||||||
|
aoffset4 = aoffset3 + lda;
|
||||||
|
aoffset += 4 * lda;
|
||||||
|
|
||||||
|
i = (m >> 1);
|
||||||
|
if (i > 0){
|
||||||
|
do{
|
||||||
|
ctemp01 = *(aoffset1 + 0);
|
||||||
|
ctemp02 = *(aoffset1 + 1);
|
||||||
|
ctemp03 = *(aoffset2 + 0);
|
||||||
|
ctemp04 = *(aoffset2 + 1);
|
||||||
|
|
||||||
|
ctemp05 = *(aoffset3 + 0);
|
||||||
|
ctemp06 = *(aoffset3 + 1);
|
||||||
|
ctemp07 = *(aoffset4 + 0);
|
||||||
|
ctemp08 = *(aoffset4 + 1);
|
||||||
|
|
||||||
|
*(boffset + 0) = ctemp01;
|
||||||
|
*(boffset + 1) = ctemp03;
|
||||||
|
*(boffset + 2) = ctemp05;
|
||||||
|
*(boffset + 3) = ctemp07;
|
||||||
|
*(boffset + 4) = ctemp02;
|
||||||
|
*(boffset + 5) = ctemp04;
|
||||||
|
*(boffset + 6) = ctemp06;
|
||||||
|
*(boffset + 7) = ctemp08;
|
||||||
|
|
||||||
|
aoffset1 += 2;
|
||||||
|
aoffset2 += 2;
|
||||||
|
aoffset3 += 2;
|
||||||
|
aoffset4 += 2;
|
||||||
|
boffset += 8;
|
||||||
|
|
||||||
|
i --;
|
||||||
|
}while(i > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m & 1){
|
||||||
|
ctemp01 = *(aoffset1 + 0);
|
||||||
|
ctemp03 = *(aoffset2 + 0);
|
||||||
|
ctemp05 = *(aoffset3 + 0);
|
||||||
|
ctemp07 = *(aoffset4 + 0);
|
||||||
|
|
||||||
|
*(boffset + 0) = ctemp01;
|
||||||
|
*(boffset + 1) = ctemp03;
|
||||||
|
*(boffset + 2) = ctemp05;
|
||||||
|
*(boffset + 3) = ctemp07;
|
||||||
|
boffset += 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nmod6 & 2){
|
||||||
|
aoffset1 = aoffset;
|
||||||
|
aoffset2 = aoffset1 + lda;
|
||||||
|
aoffset += 2 * lda;
|
||||||
|
|
||||||
|
i = (m >> 1);
|
||||||
|
if (i > 0){
|
||||||
|
do{
|
||||||
|
ctemp01 = *(aoffset1 + 0);
|
||||||
|
ctemp02 = *(aoffset1 + 1);
|
||||||
|
ctemp03 = *(aoffset2 + 0);
|
||||||
|
ctemp04 = *(aoffset2 + 1);
|
||||||
|
|
||||||
|
*(boffset + 0) = ctemp01;
|
||||||
|
*(boffset + 1) = ctemp03;
|
||||||
|
*(boffset + 2) = ctemp02;
|
||||||
|
*(boffset + 3) = ctemp04;
|
||||||
|
|
||||||
|
aoffset1 += 2;
|
||||||
|
aoffset2 += 2;
|
||||||
|
boffset += 4;
|
||||||
|
|
||||||
|
i --;
|
||||||
|
}while(i > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m & 1){
|
||||||
|
ctemp01 = *(aoffset1 + 0);
|
||||||
|
ctemp03 = *(aoffset2 + 0);
|
||||||
|
|
||||||
|
*(boffset + 0) = ctemp01;
|
||||||
|
*(boffset + 1) = ctemp03;
|
||||||
|
boffset += 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nmod6 & 1){
|
||||||
|
aoffset1 = aoffset;
|
||||||
|
|
||||||
|
i = (m >> 1);
|
||||||
|
if (i > 0){
|
||||||
|
do{
|
||||||
|
ctemp01 = *(aoffset1 + 0);
|
||||||
|
ctemp02 = *(aoffset1 + 1);
|
||||||
|
|
||||||
|
*(boffset + 0) = ctemp01;
|
||||||
|
*(boffset + 1) = ctemp02;
|
||||||
|
|
||||||
|
aoffset1 += 2;
|
||||||
|
boffset += 2;
|
||||||
|
|
||||||
|
i --;
|
||||||
|
}while(i > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m & 1){
|
||||||
|
ctemp01 = *(aoffset1 + 0);
|
||||||
|
|
||||||
|
*(boffset + 0) = ctemp01;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,342 @@
|
||||||
|
/*********************************************************************/
|
||||||
|
/* Copyright 2009, 2010 The University of Texas at Austin. */
|
||||||
|
/* All rights reserved. */
|
||||||
|
/* */
|
||||||
|
/* Redistribution and use in source and binary forms, with or */
|
||||||
|
/* without modification, are permitted provided that the following */
|
||||||
|
/* conditions are met: */
|
||||||
|
/* */
|
||||||
|
/* 1. Redistributions of source code must retain the above */
|
||||||
|
/* copyright notice, this list of conditions and the following */
|
||||||
|
/* disclaimer. */
|
||||||
|
/* */
|
||||||
|
/* 2. Redistributions in binary form must reproduce the above */
|
||||||
|
/* copyright notice, this list of conditions and the following */
|
||||||
|
/* disclaimer in the documentation and/or other materials */
|
||||||
|
/* provided with the distribution. */
|
||||||
|
/* */
|
||||||
|
/* THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY OF TEXAS AT */
|
||||||
|
/* AUSTIN ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, */
|
||||||
|
/* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF */
|
||||||
|
/* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE */
|
||||||
|
/* DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OF TEXAS AT */
|
||||||
|
/* AUSTIN OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, */
|
||||||
|
/* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES */
|
||||||
|
/* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE */
|
||||||
|
/* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR */
|
||||||
|
/* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF */
|
||||||
|
/* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT */
|
||||||
|
/* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT */
|
||||||
|
/* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE */
|
||||||
|
/* POSSIBILITY OF SUCH DAMAGE. */
|
||||||
|
/* */
|
||||||
|
/* The views and conclusions contained in the software and */
|
||||||
|
/* documentation are those of the authors and should not be */
|
||||||
|
/* interpreted as representing official policies, either expressed */
|
||||||
|
/* or implied, of The University of Texas at Austin. */
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
static FLOAT dm1 = -1.;
|
||||||
|
|
||||||
|
#ifdef CONJ
|
||||||
|
#define GEMM_KERNEL GEMM_KERNEL_L
|
||||||
|
#else
|
||||||
|
#define GEMM_KERNEL GEMM_KERNEL_N
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_M == 1
|
||||||
|
#define GEMM_UNROLL_M_SHIFT 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_M == 2
|
||||||
|
#define GEMM_UNROLL_M_SHIFT 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_M == 4
|
||||||
|
#define GEMM_UNROLL_M_SHIFT 2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_M == 6
|
||||||
|
#define GEMM_UNROLL_M_SHIFT 2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_M == 8
|
||||||
|
#define GEMM_UNROLL_M_SHIFT 3
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_M == 16
|
||||||
|
#define GEMM_UNROLL_M_SHIFT 4
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_N == 1
|
||||||
|
#define GEMM_UNROLL_N_SHIFT 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_N == 2
|
||||||
|
#define GEMM_UNROLL_N_SHIFT 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_N == 4
|
||||||
|
#define GEMM_UNROLL_N_SHIFT 2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_N == 8
|
||||||
|
#define GEMM_UNROLL_N_SHIFT 3
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_N == 16
|
||||||
|
#define GEMM_UNROLL_N_SHIFT 4
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef COMPLEX
|
||||||
|
|
||||||
|
static inline void solve(BLASLONG m, BLASLONG n, FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc) {
|
||||||
|
|
||||||
|
FLOAT aa, bb;
|
||||||
|
|
||||||
|
int i, j, k;
|
||||||
|
|
||||||
|
a += (m - 1) * m;
|
||||||
|
b += (m - 1) * n;
|
||||||
|
|
||||||
|
for (i = m - 1; i >= 0; i--) {
|
||||||
|
|
||||||
|
aa = *(a + i);
|
||||||
|
|
||||||
|
for (j = 0; j < n; j ++) {
|
||||||
|
bb = *(c + i + j * ldc);
|
||||||
|
bb *= aa;
|
||||||
|
*b = bb;
|
||||||
|
*(c + i + j * ldc) = bb;
|
||||||
|
b ++;
|
||||||
|
|
||||||
|
for (k = 0; k < i; k ++){
|
||||||
|
*(c + k + j * ldc) -= bb * *(a + k);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
a -= m;
|
||||||
|
b -= 2 * n;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
static inline void solve(BLASLONG m, BLASLONG n, FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc) {
|
||||||
|
|
||||||
|
FLOAT aa1, aa2;
|
||||||
|
FLOAT bb1, bb2;
|
||||||
|
FLOAT cc1, cc2;
|
||||||
|
|
||||||
|
int i, j, k;
|
||||||
|
|
||||||
|
ldc *= 2;
|
||||||
|
a += (m - 1) * m * 2;
|
||||||
|
b += (m - 1) * n * 2;
|
||||||
|
|
||||||
|
for (i = m - 1; i >= 0; i--) {
|
||||||
|
|
||||||
|
aa1 = *(a + i * 2 + 0);
|
||||||
|
aa2 = *(a + i * 2 + 1);
|
||||||
|
|
||||||
|
for (j = 0; j < n; j ++) {
|
||||||
|
bb1 = *(c + i * 2 + 0 + j * ldc);
|
||||||
|
bb2 = *(c + i * 2 + 1 + j * ldc);
|
||||||
|
|
||||||
|
#ifndef CONJ
|
||||||
|
cc1 = aa1 * bb1 - aa2 * bb2;
|
||||||
|
cc2 = aa1 * bb2 + aa2 * bb1;
|
||||||
|
#else
|
||||||
|
cc1 = aa1 * bb1 + aa2 * bb2;
|
||||||
|
cc2 = aa1 * bb2 - aa2 * bb1;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
*(b + 0) = cc1;
|
||||||
|
*(b + 1) = cc2;
|
||||||
|
*(c + i * 2 + 0 + j * ldc) = cc1;
|
||||||
|
*(c + i * 2 + 1 + j * ldc) = cc2;
|
||||||
|
b += 2;
|
||||||
|
|
||||||
|
for (k = 0; k < i; k ++){
|
||||||
|
#ifndef CONJ
|
||||||
|
*(c + k * 2 + 0 + j * ldc) -= cc1 * *(a + k * 2 + 0) - cc2 * *(a + k * 2 + 1);
|
||||||
|
*(c + k * 2 + 1 + j * ldc) -= cc1 * *(a + k * 2 + 1) + cc2 * *(a + k * 2 + 0);
|
||||||
|
#else
|
||||||
|
*(c + k * 2 + 0 + j * ldc) -= cc1 * *(a + k * 2 + 0) + cc2 * *(a + k * 2 + 1);
|
||||||
|
*(c + k * 2 + 1 + j * ldc) -= - cc1 * *(a + k * 2 + 1) + cc2 * *(a + k * 2 + 0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
a -= m * 2;
|
||||||
|
b -= 4 * n;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
int CNAME(BLASLONG m, BLASLONG n, BLASLONG k, FLOAT dummy1,
|
||||||
|
#ifdef COMPLEX
|
||||||
|
FLOAT dummy2,
|
||||||
|
#endif
|
||||||
|
FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLONG offset){
|
||||||
|
|
||||||
|
BLASLONG i, j;
|
||||||
|
FLOAT *aa, *cc;
|
||||||
|
BLASLONG kk;
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
fprintf(stderr, "TRSM KERNEL LN : m = %3ld n = %3ld k = %3ld offset = %3ld\n",
|
||||||
|
m, n, k, offset);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// j = (n >> GEMM_UNROLL_N_SHIFT);
|
||||||
|
j = (n / 6);
|
||||||
|
|
||||||
|
while (j > 0) {
|
||||||
|
|
||||||
|
kk = m + offset;
|
||||||
|
|
||||||
|
if (m & (GEMM_UNROLL_M - 1)) {
|
||||||
|
for (i = 1; i < GEMM_UNROLL_M; i *= 2){
|
||||||
|
if (m & i) {
|
||||||
|
aa = a + ((m & ~(i - 1)) - i) * k * COMPSIZE;
|
||||||
|
cc = c + ((m & ~(i - 1)) - i) * COMPSIZE;
|
||||||
|
|
||||||
|
if (k - kk > 0) {
|
||||||
|
GEMM_KERNEL(i, GEMM_UNROLL_N, k - kk, dm1,
|
||||||
|
#ifdef COMPLEX
|
||||||
|
ZERO,
|
||||||
|
#endif
|
||||||
|
aa + i * kk * COMPSIZE,
|
||||||
|
b + GEMM_UNROLL_N * kk * COMPSIZE,
|
||||||
|
cc,
|
||||||
|
ldc);
|
||||||
|
}
|
||||||
|
|
||||||
|
solve(i, GEMM_UNROLL_N,
|
||||||
|
aa + (kk - i) * i * COMPSIZE,
|
||||||
|
b + (kk - i) * GEMM_UNROLL_N * COMPSIZE,
|
||||||
|
cc, ldc);
|
||||||
|
|
||||||
|
kk -= i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
i = (m >> GEMM_UNROLL_M_SHIFT);
|
||||||
|
if (i > 0) {
|
||||||
|
aa = a + ((m & ~(GEMM_UNROLL_M - 1)) - GEMM_UNROLL_M) * k * COMPSIZE;
|
||||||
|
cc = c + ((m & ~(GEMM_UNROLL_M - 1)) - GEMM_UNROLL_M) * COMPSIZE;
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (k - kk > 0) {
|
||||||
|
GEMM_KERNEL(GEMM_UNROLL_M, GEMM_UNROLL_N, k - kk, dm1,
|
||||||
|
#ifdef COMPLEX
|
||||||
|
ZERO,
|
||||||
|
#endif
|
||||||
|
aa + GEMM_UNROLL_M * kk * COMPSIZE,
|
||||||
|
b + GEMM_UNROLL_N * kk * COMPSIZE,
|
||||||
|
cc,
|
||||||
|
ldc);
|
||||||
|
}
|
||||||
|
|
||||||
|
solve(GEMM_UNROLL_M, GEMM_UNROLL_N,
|
||||||
|
aa + (kk - GEMM_UNROLL_M) * GEMM_UNROLL_M * COMPSIZE,
|
||||||
|
b + (kk - GEMM_UNROLL_M) * GEMM_UNROLL_N * COMPSIZE,
|
||||||
|
cc, ldc);
|
||||||
|
|
||||||
|
aa -= GEMM_UNROLL_M * k * COMPSIZE;
|
||||||
|
cc -= GEMM_UNROLL_M * COMPSIZE;
|
||||||
|
kk -= GEMM_UNROLL_M;
|
||||||
|
i --;
|
||||||
|
} while (i > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
b += GEMM_UNROLL_N * k * COMPSIZE;
|
||||||
|
c += GEMM_UNROLL_N * ldc * COMPSIZE;
|
||||||
|
j --;
|
||||||
|
}
|
||||||
|
|
||||||
|
BLASLONG nmodN = n - n/6*6 ;
|
||||||
|
|
||||||
|
// if (n & (GEMM_UNROLL_N - 1)) {
|
||||||
|
if (nmodN) {
|
||||||
|
|
||||||
|
// j = (GEMM_UNROLL_N >> 1);
|
||||||
|
j = 4;
|
||||||
|
while (j > 0) {
|
||||||
|
if (nmodN & j) {
|
||||||
|
|
||||||
|
kk = m + offset;
|
||||||
|
|
||||||
|
if (m & (GEMM_UNROLL_M - 1)) {
|
||||||
|
for (i = 1; i < GEMM_UNROLL_M; i *= 2){
|
||||||
|
if (m & i) {
|
||||||
|
aa = a + ((m & ~(i - 1)) - i) * k * COMPSIZE;
|
||||||
|
cc = c + ((m & ~(i - 1)) - i) * COMPSIZE;
|
||||||
|
|
||||||
|
if (k - kk > 0) {
|
||||||
|
GEMM_KERNEL(i, j, k - kk, dm1,
|
||||||
|
#ifdef COMPLEX
|
||||||
|
ZERO,
|
||||||
|
#endif
|
||||||
|
aa + i * kk * COMPSIZE,
|
||||||
|
b + j * kk * COMPSIZE,
|
||||||
|
cc, ldc);
|
||||||
|
}
|
||||||
|
|
||||||
|
solve(i, j,
|
||||||
|
aa + (kk - i) * i * COMPSIZE,
|
||||||
|
b + (kk - i) * j * COMPSIZE,
|
||||||
|
cc, ldc);
|
||||||
|
|
||||||
|
kk -= i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
i = (m >> GEMM_UNROLL_M_SHIFT);
|
||||||
|
if (i > 0) {
|
||||||
|
aa = a + ((m & ~(GEMM_UNROLL_M - 1)) - GEMM_UNROLL_M) * k * COMPSIZE;
|
||||||
|
cc = c + ((m & ~(GEMM_UNROLL_M - 1)) - GEMM_UNROLL_M) * COMPSIZE;
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (k - kk > 0) {
|
||||||
|
GEMM_KERNEL(GEMM_UNROLL_M, j, k - kk, dm1,
|
||||||
|
#ifdef COMPLEX
|
||||||
|
ZERO,
|
||||||
|
#endif
|
||||||
|
aa + GEMM_UNROLL_M * kk * COMPSIZE,
|
||||||
|
b + j * kk * COMPSIZE,
|
||||||
|
cc,
|
||||||
|
ldc);
|
||||||
|
}
|
||||||
|
|
||||||
|
solve(GEMM_UNROLL_M, j,
|
||||||
|
aa + (kk - GEMM_UNROLL_M) * GEMM_UNROLL_M * COMPSIZE,
|
||||||
|
b + (kk - GEMM_UNROLL_M) * j * COMPSIZE,
|
||||||
|
cc, ldc);
|
||||||
|
|
||||||
|
aa -= GEMM_UNROLL_M * k * COMPSIZE;
|
||||||
|
cc -= GEMM_UNROLL_M * COMPSIZE;
|
||||||
|
kk -= GEMM_UNROLL_M;
|
||||||
|
i --;
|
||||||
|
} while (i > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
b += j * k * COMPSIZE;
|
||||||
|
c += j * ldc * COMPSIZE;
|
||||||
|
}
|
||||||
|
j >>= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,327 @@
|
||||||
|
/*********************************************************************/
|
||||||
|
/* Copyright 2009, 2010 The University of Texas at Austin. */
|
||||||
|
/* All rights reserved. */
|
||||||
|
/* */
|
||||||
|
/* Redistribution and use in source and binary forms, with or */
|
||||||
|
/* without modification, are permitted provided that the following */
|
||||||
|
/* conditions are met: */
|
||||||
|
/* */
|
||||||
|
/* 1. Redistributions of source code must retain the above */
|
||||||
|
/* copyright notice, this list of conditions and the following */
|
||||||
|
/* disclaimer. */
|
||||||
|
/* */
|
||||||
|
/* 2. Redistributions in binary form must reproduce the above */
|
||||||
|
/* copyright notice, this list of conditions and the following */
|
||||||
|
/* disclaimer in the documentation and/or other materials */
|
||||||
|
/* provided with the distribution. */
|
||||||
|
/* */
|
||||||
|
/* THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY OF TEXAS AT */
|
||||||
|
/* AUSTIN ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, */
|
||||||
|
/* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF */
|
||||||
|
/* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE */
|
||||||
|
/* DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OF TEXAS AT */
|
||||||
|
/* AUSTIN OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, */
|
||||||
|
/* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES */
|
||||||
|
/* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE */
|
||||||
|
/* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR */
|
||||||
|
/* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF */
|
||||||
|
/* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT */
|
||||||
|
/* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT */
|
||||||
|
/* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE */
|
||||||
|
/* POSSIBILITY OF SUCH DAMAGE. */
|
||||||
|
/* */
|
||||||
|
/* The views and conclusions contained in the software and */
|
||||||
|
/* documentation are those of the authors and should not be */
|
||||||
|
/* interpreted as representing official policies, either expressed */
|
||||||
|
/* or implied, of The University of Texas at Austin. */
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
static FLOAT dm1 = -1.;
|
||||||
|
|
||||||
|
#ifdef CONJ
|
||||||
|
#define GEMM_KERNEL GEMM_KERNEL_L
|
||||||
|
#else
|
||||||
|
#define GEMM_KERNEL GEMM_KERNEL_N
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_M == 1
|
||||||
|
#define GEMM_UNROLL_M_SHIFT 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_M == 2
|
||||||
|
#define GEMM_UNROLL_M_SHIFT 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_M == 4
|
||||||
|
#define GEMM_UNROLL_M_SHIFT 2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_M == 6
|
||||||
|
#define GEMM_UNROLL_M_SHIFT 2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_M == 8
|
||||||
|
#define GEMM_UNROLL_M_SHIFT 3
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_M == 16
|
||||||
|
#define GEMM_UNROLL_M_SHIFT 4
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_N == 1
|
||||||
|
#define GEMM_UNROLL_N_SHIFT 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_N == 2
|
||||||
|
#define GEMM_UNROLL_N_SHIFT 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_N == 4
|
||||||
|
#define GEMM_UNROLL_N_SHIFT 2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_N == 8
|
||||||
|
#define GEMM_UNROLL_N_SHIFT 3
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_N == 16
|
||||||
|
#define GEMM_UNROLL_N_SHIFT 4
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef COMPLEX
|
||||||
|
|
||||||
|
static inline void solve(BLASLONG m, BLASLONG n, FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc) {
|
||||||
|
|
||||||
|
FLOAT aa, bb;
|
||||||
|
|
||||||
|
int i, j, k;
|
||||||
|
|
||||||
|
for (i = 0; i < m; i++) {
|
||||||
|
|
||||||
|
aa = *(a + i);
|
||||||
|
|
||||||
|
for (j = 0; j < n; j ++) {
|
||||||
|
bb = *(c + i + j * ldc);
|
||||||
|
bb *= aa;
|
||||||
|
*b = bb;
|
||||||
|
*(c + i + j * ldc) = bb;
|
||||||
|
b ++;
|
||||||
|
|
||||||
|
for (k = i + 1; k < m; k ++){
|
||||||
|
*(c + k + j * ldc) -= bb * *(a + k);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
a += m;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
static inline void solve(BLASLONG m, BLASLONG n, FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc) {
|
||||||
|
|
||||||
|
FLOAT aa1, aa2;
|
||||||
|
FLOAT bb1, bb2;
|
||||||
|
FLOAT cc1, cc2;
|
||||||
|
|
||||||
|
int i, j, k;
|
||||||
|
|
||||||
|
ldc *= 2;
|
||||||
|
|
||||||
|
for (i = 0; i < m; i++) {
|
||||||
|
|
||||||
|
aa1 = *(a + i * 2 + 0);
|
||||||
|
aa2 = *(a + i * 2 + 1);
|
||||||
|
|
||||||
|
for (j = 0; j < n; j ++) {
|
||||||
|
bb1 = *(c + i * 2 + 0 + j * ldc);
|
||||||
|
bb2 = *(c + i * 2 + 1 + j * ldc);
|
||||||
|
|
||||||
|
#ifndef CONJ
|
||||||
|
cc1 = aa1 * bb1 - aa2 * bb2;
|
||||||
|
cc2 = aa1 * bb2 + aa2 * bb1;
|
||||||
|
#else
|
||||||
|
cc1 = aa1 * bb1 + aa2 * bb2;
|
||||||
|
cc2 = aa1 * bb2 - aa2 * bb1;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
*(b + 0) = cc1;
|
||||||
|
*(b + 1) = cc2;
|
||||||
|
*(c + i * 2 + 0 + j * ldc) = cc1;
|
||||||
|
*(c + i * 2 + 1 + j * ldc) = cc2;
|
||||||
|
b += 2;
|
||||||
|
|
||||||
|
for (k = i + 1; k < m; k ++){
|
||||||
|
#ifndef CONJ
|
||||||
|
*(c + k * 2 + 0 + j * ldc) -= cc1 * *(a + k * 2 + 0) - cc2 * *(a + k * 2 + 1);
|
||||||
|
*(c + k * 2 + 1 + j * ldc) -= cc1 * *(a + k * 2 + 1) + cc2 * *(a + k * 2 + 0);
|
||||||
|
#else
|
||||||
|
*(c + k * 2 + 0 + j * ldc) -= cc1 * *(a + k * 2 + 0) + cc2 * *(a + k * 2 + 1);
|
||||||
|
*(c + k * 2 + 1 + j * ldc) -= -cc1 * *(a + k * 2 + 1) + cc2 * *(a + k * 2 + 0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
a += m * 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
int CNAME(BLASLONG m, BLASLONG n, BLASLONG k, FLOAT dummy1,
|
||||||
|
#ifdef COMPLEX
|
||||||
|
FLOAT dummy2,
|
||||||
|
#endif
|
||||||
|
FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLONG offset){
|
||||||
|
|
||||||
|
FLOAT *aa, *cc;
|
||||||
|
BLASLONG kk;
|
||||||
|
BLASLONG i, j, jj;
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
fprintf(stderr, "TRSM KERNEL LT : m = %3ld n = %3ld k = %3ld offset = %3ld\n",
|
||||||
|
m, n, k, offset);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
jj = 0;
|
||||||
|
|
||||||
|
// j = (n >> GEMM_UNROLL_N_SHIFT);
|
||||||
|
j = (n / 6);
|
||||||
|
|
||||||
|
while (j > 0) {
|
||||||
|
|
||||||
|
kk = offset;
|
||||||
|
aa = a;
|
||||||
|
cc = c;
|
||||||
|
|
||||||
|
i = (m >> GEMM_UNROLL_M_SHIFT);
|
||||||
|
|
||||||
|
while (i > 0) {
|
||||||
|
|
||||||
|
if (kk > 0) {
|
||||||
|
GEMM_KERNEL(GEMM_UNROLL_M, GEMM_UNROLL_N, kk, dm1,
|
||||||
|
#ifdef COMPLEX
|
||||||
|
ZERO,
|
||||||
|
#endif
|
||||||
|
aa, b, cc, ldc);
|
||||||
|
}
|
||||||
|
|
||||||
|
solve(GEMM_UNROLL_M, GEMM_UNROLL_N,
|
||||||
|
aa + kk * GEMM_UNROLL_M * COMPSIZE,
|
||||||
|
b + kk * GEMM_UNROLL_N * COMPSIZE,
|
||||||
|
cc, ldc);
|
||||||
|
|
||||||
|
aa += GEMM_UNROLL_M * k * COMPSIZE;
|
||||||
|
cc += GEMM_UNROLL_M * COMPSIZE;
|
||||||
|
kk += GEMM_UNROLL_M;
|
||||||
|
i --;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m & (GEMM_UNROLL_M - 1)) {
|
||||||
|
i = (GEMM_UNROLL_M >> 1);
|
||||||
|
while (i > 0) {
|
||||||
|
if (m & i) {
|
||||||
|
if (kk > 0) {
|
||||||
|
GEMM_KERNEL(i, GEMM_UNROLL_N, kk, dm1,
|
||||||
|
#ifdef COMPLEX
|
||||||
|
ZERO,
|
||||||
|
#endif
|
||||||
|
aa, b, cc, ldc);
|
||||||
|
}
|
||||||
|
solve(i, GEMM_UNROLL_N,
|
||||||
|
aa + kk * i * COMPSIZE,
|
||||||
|
b + kk * GEMM_UNROLL_N * COMPSIZE,
|
||||||
|
cc, ldc);
|
||||||
|
|
||||||
|
aa += i * k * COMPSIZE;
|
||||||
|
cc += i * COMPSIZE;
|
||||||
|
kk += i;
|
||||||
|
}
|
||||||
|
i >>= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
b += GEMM_UNROLL_N * k * COMPSIZE;
|
||||||
|
c += GEMM_UNROLL_N * ldc * COMPSIZE;
|
||||||
|
j --;
|
||||||
|
jj += GEMM_UNROLL_M;
|
||||||
|
}
|
||||||
|
|
||||||
|
BLASLONG nmodN = n - n/6*6 ;
|
||||||
|
|
||||||
|
// if (n & (GEMM_UNROLL_N - 1)) {
|
||||||
|
if (nmodN) {
|
||||||
|
|
||||||
|
// j = (GEMM_UNROLL_N >> 1);
|
||||||
|
j = 4;
|
||||||
|
|
||||||
|
while (j > 0) {
|
||||||
|
if (nmodN & j) {
|
||||||
|
|
||||||
|
kk = offset;
|
||||||
|
aa = a;
|
||||||
|
cc = c;
|
||||||
|
|
||||||
|
i = (m >> GEMM_UNROLL_M_SHIFT);
|
||||||
|
|
||||||
|
while (i > 0) {
|
||||||
|
if (kk > 0) {
|
||||||
|
GEMM_KERNEL(GEMM_UNROLL_M, j, kk, dm1,
|
||||||
|
#ifdef COMPLEX
|
||||||
|
ZERO,
|
||||||
|
#endif
|
||||||
|
aa,
|
||||||
|
b,
|
||||||
|
cc,
|
||||||
|
ldc);
|
||||||
|
}
|
||||||
|
|
||||||
|
solve(GEMM_UNROLL_M, j,
|
||||||
|
aa + kk * GEMM_UNROLL_M * COMPSIZE,
|
||||||
|
b + kk * j * COMPSIZE, cc, ldc);
|
||||||
|
|
||||||
|
aa += GEMM_UNROLL_M * k * COMPSIZE;
|
||||||
|
cc += GEMM_UNROLL_M * COMPSIZE;
|
||||||
|
kk += GEMM_UNROLL_M;
|
||||||
|
i --;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m & (GEMM_UNROLL_M - 1)) {
|
||||||
|
i = (GEMM_UNROLL_M >> 1);
|
||||||
|
while (i > 0) {
|
||||||
|
if (m & i) {
|
||||||
|
if (kk > 0) {
|
||||||
|
GEMM_KERNEL(i, j, kk, dm1,
|
||||||
|
#ifdef COMPLEX
|
||||||
|
ZERO,
|
||||||
|
#endif
|
||||||
|
aa,
|
||||||
|
b,
|
||||||
|
cc,
|
||||||
|
ldc);
|
||||||
|
}
|
||||||
|
|
||||||
|
solve(i, j,
|
||||||
|
aa + kk * i * COMPSIZE,
|
||||||
|
b + kk * j * COMPSIZE, cc, ldc);
|
||||||
|
|
||||||
|
aa += i * k * COMPSIZE;
|
||||||
|
cc += i * COMPSIZE;
|
||||||
|
kk += i;
|
||||||
|
}
|
||||||
|
i >>= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
b += j * k * COMPSIZE;
|
||||||
|
c += j * ldc * COMPSIZE;
|
||||||
|
}
|
||||||
|
j >>= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,325 @@
|
||||||
|
/*********************************************************************/
|
||||||
|
/* Copyright 2009, 2010 The University of Texas at Austin. */
|
||||||
|
/* All rights reserved. */
|
||||||
|
/* */
|
||||||
|
/* Redistribution and use in source and binary forms, with or */
|
||||||
|
/* without modification, are permitted provided that the following */
|
||||||
|
/* conditions are met: */
|
||||||
|
/* */
|
||||||
|
/* 1. Redistributions of source code must retain the above */
|
||||||
|
/* copyright notice, this list of conditions and the following */
|
||||||
|
/* disclaimer. */
|
||||||
|
/* */
|
||||||
|
/* 2. Redistributions in binary form must reproduce the above */
|
||||||
|
/* copyright notice, this list of conditions and the following */
|
||||||
|
/* disclaimer in the documentation and/or other materials */
|
||||||
|
/* provided with the distribution. */
|
||||||
|
/* */
|
||||||
|
/* THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY OF TEXAS AT */
|
||||||
|
/* AUSTIN ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, */
|
||||||
|
/* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF */
|
||||||
|
/* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE */
|
||||||
|
/* DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OF TEXAS AT */
|
||||||
|
/* AUSTIN OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, */
|
||||||
|
/* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES */
|
||||||
|
/* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE */
|
||||||
|
/* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR */
|
||||||
|
/* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF */
|
||||||
|
/* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT */
|
||||||
|
/* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT */
|
||||||
|
/* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE */
|
||||||
|
/* POSSIBILITY OF SUCH DAMAGE. */
|
||||||
|
/* */
|
||||||
|
/* The views and conclusions contained in the software and */
|
||||||
|
/* documentation are those of the authors and should not be */
|
||||||
|
/* interpreted as representing official policies, either expressed */
|
||||||
|
/* or implied, of The University of Texas at Austin. */
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
static FLOAT dm1 = -1.;
|
||||||
|
|
||||||
|
#ifdef CONJ
|
||||||
|
#define GEMM_KERNEL GEMM_KERNEL_R
|
||||||
|
#else
|
||||||
|
#define GEMM_KERNEL GEMM_KERNEL_N
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_M == 1
|
||||||
|
#define GEMM_UNROLL_M_SHIFT 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_M == 2
|
||||||
|
#define GEMM_UNROLL_M_SHIFT 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_M == 4
|
||||||
|
#define GEMM_UNROLL_M_SHIFT 2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_M == 6
|
||||||
|
#define GEMM_UNROLL_M_SHIFT 2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_M == 8
|
||||||
|
#define GEMM_UNROLL_M_SHIFT 3
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_M == 16
|
||||||
|
#define GEMM_UNROLL_M_SHIFT 4
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_N == 1
|
||||||
|
#define GEMM_UNROLL_N_SHIFT 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_N == 2
|
||||||
|
#define GEMM_UNROLL_N_SHIFT 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_N == 4
|
||||||
|
#define GEMM_UNROLL_N_SHIFT 2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_N == 8
|
||||||
|
#define GEMM_UNROLL_N_SHIFT 3
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_N == 16
|
||||||
|
#define GEMM_UNROLL_N_SHIFT 4
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef COMPLEX
|
||||||
|
|
||||||
|
static inline void solve(BLASLONG m, BLASLONG n, FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc) {
|
||||||
|
|
||||||
|
FLOAT aa, bb;
|
||||||
|
|
||||||
|
int i, j, k;
|
||||||
|
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
|
||||||
|
bb = *(b + i);
|
||||||
|
|
||||||
|
for (j = 0; j < m; j ++) {
|
||||||
|
aa = *(c + j + i * ldc);
|
||||||
|
aa *= bb;
|
||||||
|
*a = aa;
|
||||||
|
*(c + j + i * ldc) = aa;
|
||||||
|
a ++;
|
||||||
|
|
||||||
|
for (k = i + 1; k < n; k ++){
|
||||||
|
*(c + j + k * ldc) -= aa * *(b + k);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
b += n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
static inline void solve(BLASLONG m, BLASLONG n, FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc) {
|
||||||
|
|
||||||
|
FLOAT aa1, aa2;
|
||||||
|
FLOAT bb1, bb2;
|
||||||
|
FLOAT cc1, cc2;
|
||||||
|
|
||||||
|
int i, j, k;
|
||||||
|
|
||||||
|
ldc *= 2;
|
||||||
|
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
|
||||||
|
bb1 = *(b + i * 2 + 0);
|
||||||
|
bb2 = *(b + i * 2 + 1);
|
||||||
|
|
||||||
|
for (j = 0; j < m; j ++) {
|
||||||
|
aa1 = *(c + j * 2 + 0 + i * ldc);
|
||||||
|
aa2 = *(c + j * 2 + 1 + i * ldc);
|
||||||
|
|
||||||
|
#ifndef CONJ
|
||||||
|
cc1 = aa1 * bb1 - aa2 * bb2;
|
||||||
|
cc2 = aa1 * bb2 + aa2 * bb1;
|
||||||
|
#else
|
||||||
|
cc1 = aa1 * bb1 + aa2 * bb2;
|
||||||
|
cc2 = -aa1 * bb2 + aa2 * bb1;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
*(a + 0) = cc1;
|
||||||
|
*(a + 1) = cc2;
|
||||||
|
*(c + j * 2 + 0 + i * ldc) = cc1;
|
||||||
|
*(c + j * 2 + 1 + i * ldc) = cc2;
|
||||||
|
a += 2;
|
||||||
|
|
||||||
|
for (k = i + 1; k < n; k ++){
|
||||||
|
#ifndef CONJ
|
||||||
|
*(c + j * 2 + 0 + k * ldc) -= cc1 * *(b + k * 2 + 0) - cc2 * *(b + k * 2 + 1);
|
||||||
|
*(c + j * 2 + 1 + k * ldc) -= cc1 * *(b + k * 2 + 1) + cc2 * *(b + k * 2 + 0);
|
||||||
|
#else
|
||||||
|
*(c + j * 2 + 0 + k * ldc) -= cc1 * *(b + k * 2 + 0) + cc2 * *(b + k * 2 + 1);
|
||||||
|
*(c + j * 2 + 1 + k * ldc) -= - cc1 * *(b + k * 2 + 1) + cc2 * *(b + k * 2 + 0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
b += n * 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
int CNAME(BLASLONG m, BLASLONG n, BLASLONG k, FLOAT dummy1,
|
||||||
|
#ifdef COMPLEX
|
||||||
|
FLOAT dummy2,
|
||||||
|
#endif
|
||||||
|
FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLONG offset){
|
||||||
|
|
||||||
|
FLOAT *aa, *cc;
|
||||||
|
BLASLONG kk;
|
||||||
|
BLASLONG i, j, jj;
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
fprintf(stderr, "TRSM RN KERNEL m = %3ld n = %3ld k = %3ld offset = %3ld\n",
|
||||||
|
m, n, k, offset);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
jj = 0;
|
||||||
|
// j = (n >> GEMM_UNROLL_N_SHIFT);
|
||||||
|
j = (n / 6);
|
||||||
|
kk = -offset;
|
||||||
|
|
||||||
|
while (j > 0) {
|
||||||
|
|
||||||
|
aa = a;
|
||||||
|
cc = c;
|
||||||
|
|
||||||
|
i = (m >> GEMM_UNROLL_M_SHIFT);
|
||||||
|
|
||||||
|
if (i > 0) {
|
||||||
|
do {
|
||||||
|
if (kk > 0) {
|
||||||
|
GEMM_KERNEL(GEMM_UNROLL_M, GEMM_UNROLL_N, kk, dm1,
|
||||||
|
#ifdef COMPLEX
|
||||||
|
ZERO,
|
||||||
|
#endif
|
||||||
|
aa, b, cc, ldc);
|
||||||
|
}
|
||||||
|
|
||||||
|
solve(GEMM_UNROLL_M, GEMM_UNROLL_N,
|
||||||
|
aa + kk * GEMM_UNROLL_M * COMPSIZE,
|
||||||
|
b + kk * GEMM_UNROLL_N * COMPSIZE,
|
||||||
|
cc, ldc);
|
||||||
|
|
||||||
|
aa += GEMM_UNROLL_M * k * COMPSIZE;
|
||||||
|
cc += GEMM_UNROLL_M * COMPSIZE;
|
||||||
|
i --;
|
||||||
|
} while (i > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (m & (GEMM_UNROLL_M - 1)) {
|
||||||
|
i = (GEMM_UNROLL_M >> 1);
|
||||||
|
while (i > 0) {
|
||||||
|
if (m & i) {
|
||||||
|
if (kk > 0) {
|
||||||
|
GEMM_KERNEL(i, GEMM_UNROLL_N, kk, dm1,
|
||||||
|
#ifdef COMPLEX
|
||||||
|
ZERO,
|
||||||
|
#endif
|
||||||
|
aa, b, cc, ldc);
|
||||||
|
}
|
||||||
|
solve(i, GEMM_UNROLL_N,
|
||||||
|
aa + kk * i * COMPSIZE,
|
||||||
|
b + kk * GEMM_UNROLL_N * COMPSIZE,
|
||||||
|
cc, ldc);
|
||||||
|
|
||||||
|
aa += i * k * COMPSIZE;
|
||||||
|
cc += i * COMPSIZE;
|
||||||
|
}
|
||||||
|
i >>= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
kk += GEMM_UNROLL_N;
|
||||||
|
b += GEMM_UNROLL_N * k * COMPSIZE;
|
||||||
|
c += GEMM_UNROLL_N * ldc * COMPSIZE;
|
||||||
|
j --;
|
||||||
|
jj += GEMM_UNROLL_M;
|
||||||
|
}
|
||||||
|
|
||||||
|
BLASLONG nmodN = n - n/6*6 ;
|
||||||
|
|
||||||
|
// if (n & (GEMM_UNROLL_N - 1)) {
|
||||||
|
if (nmodN) {
|
||||||
|
|
||||||
|
// j = (GEMM_UNROLL_N >> 1);
|
||||||
|
j = 4;
|
||||||
|
|
||||||
|
while (j > 0) {
|
||||||
|
if (nmodN & j) {
|
||||||
|
|
||||||
|
aa = a;
|
||||||
|
cc = c;
|
||||||
|
|
||||||
|
i = (m >> GEMM_UNROLL_M_SHIFT);
|
||||||
|
|
||||||
|
while (i > 0) {
|
||||||
|
if (kk > 0) {
|
||||||
|
GEMM_KERNEL(GEMM_UNROLL_M, j, kk, dm1,
|
||||||
|
#ifdef COMPLEX
|
||||||
|
ZERO,
|
||||||
|
#endif
|
||||||
|
aa,
|
||||||
|
b,
|
||||||
|
cc,
|
||||||
|
ldc);
|
||||||
|
}
|
||||||
|
|
||||||
|
solve(GEMM_UNROLL_M, j,
|
||||||
|
aa + kk * GEMM_UNROLL_M * COMPSIZE,
|
||||||
|
b + kk * j * COMPSIZE, cc, ldc);
|
||||||
|
|
||||||
|
aa += GEMM_UNROLL_M * k * COMPSIZE;
|
||||||
|
cc += GEMM_UNROLL_M * COMPSIZE;
|
||||||
|
i --;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m & (GEMM_UNROLL_M - 1)) {
|
||||||
|
i = (GEMM_UNROLL_M >> 1);
|
||||||
|
while (i > 0) {
|
||||||
|
if (m & i) {
|
||||||
|
if (kk > 0) {
|
||||||
|
GEMM_KERNEL(i, j, kk, dm1,
|
||||||
|
#ifdef COMPLEX
|
||||||
|
ZERO,
|
||||||
|
#endif
|
||||||
|
aa,
|
||||||
|
b,
|
||||||
|
cc,
|
||||||
|
ldc);
|
||||||
|
}
|
||||||
|
|
||||||
|
solve(i, j,
|
||||||
|
aa + kk * i * COMPSIZE,
|
||||||
|
b + kk * j * COMPSIZE, cc, ldc);
|
||||||
|
|
||||||
|
aa += i * k * COMPSIZE;
|
||||||
|
cc += i * COMPSIZE;
|
||||||
|
}
|
||||||
|
i >>= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
b += j * k * COMPSIZE;
|
||||||
|
c += j * ldc * COMPSIZE;
|
||||||
|
kk += j;
|
||||||
|
}
|
||||||
|
j >>= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,351 @@
|
||||||
|
/*********************************************************************/
|
||||||
|
/* Copyright 2009, 2010 The University of Texas at Austin. */
|
||||||
|
/* All rights reserved. */
|
||||||
|
/* */
|
||||||
|
/* Redistribution and use in source and binary forms, with or */
|
||||||
|
/* without modification, are permitted provided that the following */
|
||||||
|
/* conditions are met: */
|
||||||
|
/* */
|
||||||
|
/* 1. Redistributions of source code must retain the above */
|
||||||
|
/* copyright notice, this list of conditions and the following */
|
||||||
|
/* disclaimer. */
|
||||||
|
/* */
|
||||||
|
/* 2. Redistributions in binary form must reproduce the above */
|
||||||
|
/* copyright notice, this list of conditions and the following */
|
||||||
|
/* disclaimer in the documentation and/or other materials */
|
||||||
|
/* provided with the distribution. */
|
||||||
|
/* */
|
||||||
|
/* THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY OF TEXAS AT */
|
||||||
|
/* AUSTIN ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, */
|
||||||
|
/* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF */
|
||||||
|
/* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE */
|
||||||
|
/* DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OF TEXAS AT */
|
||||||
|
/* AUSTIN OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, */
|
||||||
|
/* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES */
|
||||||
|
/* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE */
|
||||||
|
/* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR */
|
||||||
|
/* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF */
|
||||||
|
/* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT */
|
||||||
|
/* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT */
|
||||||
|
/* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE */
|
||||||
|
/* POSSIBILITY OF SUCH DAMAGE. */
|
||||||
|
/* */
|
||||||
|
/* The views and conclusions contained in the software and */
|
||||||
|
/* documentation are those of the authors and should not be */
|
||||||
|
/* interpreted as representing official policies, either expressed */
|
||||||
|
/* or implied, of The University of Texas at Austin. */
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
static FLOAT dm1 = -1.;
|
||||||
|
|
||||||
|
#ifdef CONJ
|
||||||
|
#define GEMM_KERNEL GEMM_KERNEL_R
|
||||||
|
#else
|
||||||
|
#define GEMM_KERNEL GEMM_KERNEL_N
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_M == 1
|
||||||
|
#define GEMM_UNROLL_M_SHIFT 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_M == 2
|
||||||
|
#define GEMM_UNROLL_M_SHIFT 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_M == 4
|
||||||
|
#define GEMM_UNROLL_M_SHIFT 2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_M == 6
|
||||||
|
#define GEMM_UNROLL_M_SHIFT 2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_M == 8
|
||||||
|
#define GEMM_UNROLL_M_SHIFT 3
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_M == 16
|
||||||
|
#define GEMM_UNROLL_M_SHIFT 4
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_N == 1
|
||||||
|
#define GEMM_UNROLL_N_SHIFT 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_N == 2
|
||||||
|
#define GEMM_UNROLL_N_SHIFT 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_N == 4
|
||||||
|
#define GEMM_UNROLL_N_SHIFT 2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_N == 8
|
||||||
|
#define GEMM_UNROLL_N_SHIFT 3
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GEMM_DEFAULT_UNROLL_N == 16
|
||||||
|
#define GEMM_UNROLL_N_SHIFT 4
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef COMPLEX
|
||||||
|
|
||||||
|
static inline void solve(BLASLONG m, BLASLONG n, FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc) {
|
||||||
|
|
||||||
|
FLOAT aa, bb;
|
||||||
|
|
||||||
|
int i, j, k;
|
||||||
|
|
||||||
|
a += (n - 1) * m;
|
||||||
|
b += (n - 1) * n;
|
||||||
|
|
||||||
|
for (i = n - 1; i >= 0; i--) {
|
||||||
|
|
||||||
|
bb = *(b + i);
|
||||||
|
|
||||||
|
for (j = 0; j < m; j ++) {
|
||||||
|
aa = *(c + j + i * ldc);
|
||||||
|
aa *= bb;
|
||||||
|
*a = aa;
|
||||||
|
*(c + j + i * ldc) = aa;
|
||||||
|
a ++;
|
||||||
|
|
||||||
|
for (k = 0; k < i; k ++){
|
||||||
|
*(c + j + k * ldc) -= aa * *(b + k);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
b -= n;
|
||||||
|
a -= 2 * m;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
static inline void solve(BLASLONG m, BLASLONG n, FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc) {
|
||||||
|
|
||||||
|
FLOAT aa1, aa2;
|
||||||
|
FLOAT bb1, bb2;
|
||||||
|
FLOAT cc1, cc2;
|
||||||
|
|
||||||
|
int i, j, k;
|
||||||
|
|
||||||
|
ldc *= 2;
|
||||||
|
|
||||||
|
a += (n - 1) * m * 2;
|
||||||
|
b += (n - 1) * n * 2;
|
||||||
|
|
||||||
|
for (i = n - 1; i >= 0; i--) {
|
||||||
|
|
||||||
|
bb1 = *(b + i * 2 + 0);
|
||||||
|
bb2 = *(b + i * 2 + 1);
|
||||||
|
|
||||||
|
for (j = 0; j < m; j ++) {
|
||||||
|
|
||||||
|
aa1 = *(c + j * 2 + 0 + i * ldc);
|
||||||
|
aa2 = *(c + j * 2 + 1 + i * ldc);
|
||||||
|
|
||||||
|
#ifndef CONJ
|
||||||
|
cc1 = aa1 * bb1 - aa2 * bb2;
|
||||||
|
cc2 = aa1 * bb2 + aa2 * bb1;
|
||||||
|
#else
|
||||||
|
cc1 = aa1 * bb1 + aa2 * bb2;
|
||||||
|
cc2 = - aa1 * bb2 + aa2 * bb1;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
*(a + 0) = cc1;
|
||||||
|
*(a + 1) = cc2;
|
||||||
|
|
||||||
|
*(c + j * 2 + 0 + i * ldc) = cc1;
|
||||||
|
*(c + j * 2 + 1 + i * ldc) = cc2;
|
||||||
|
a += 2;
|
||||||
|
|
||||||
|
for (k = 0; k < i; k ++){
|
||||||
|
#ifndef CONJ
|
||||||
|
*(c + j * 2 + 0 + k * ldc) -= cc1 * *(b + k * 2 + 0) - cc2 * *(b + k * 2 + 1);
|
||||||
|
*(c + j * 2 + 1 + k * ldc) -= cc1 * *(b + k * 2 + 1) + cc2 * *(b + k * 2 + 0);
|
||||||
|
#else
|
||||||
|
*(c + j * 2 + 0 + k * ldc) -= cc1 * *(b + k * 2 + 0) + cc2 * *(b + k * 2 + 1);
|
||||||
|
*(c + j * 2 + 1 + k * ldc) -= -cc1 * *(b + k * 2 + 1) + cc2 * *(b + k * 2 + 0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
b -= n * 2;
|
||||||
|
a -= 4 * m;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int CNAME(BLASLONG m, BLASLONG n, BLASLONG k, FLOAT dummy1,
|
||||||
|
#ifdef COMPLEX
|
||||||
|
FLOAT dummy2,
|
||||||
|
#endif
|
||||||
|
FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLONG offset){
|
||||||
|
|
||||||
|
BLASLONG i, j;
|
||||||
|
FLOAT *aa, *cc;
|
||||||
|
BLASLONG kk;
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
fprintf(stderr, "TRSM RT KERNEL m = %3ld n = %3ld k = %3ld offset = %3ld\n",
|
||||||
|
m, n, k, offset);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
kk = n - offset;
|
||||||
|
c += n * ldc * COMPSIZE;
|
||||||
|
b += n * k * COMPSIZE;
|
||||||
|
|
||||||
|
|
||||||
|
BLASLONG nmodN = n - n/6*6 ;
|
||||||
|
|
||||||
|
// if (n & (GEMM_UNROLL_N - 1)) {
|
||||||
|
if (nmodN) {
|
||||||
|
|
||||||
|
j = 1;
|
||||||
|
while (j < GEMM_UNROLL_N) {
|
||||||
|
if (nmodN & j) {
|
||||||
|
|
||||||
|
aa = a;
|
||||||
|
b -= j * k * COMPSIZE;
|
||||||
|
c -= j * ldc* COMPSIZE;
|
||||||
|
cc = c;
|
||||||
|
|
||||||
|
i = (m >> GEMM_UNROLL_M_SHIFT);
|
||||||
|
if (i > 0) {
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (k - kk > 0) {
|
||||||
|
GEMM_KERNEL(GEMM_UNROLL_M, j, k - kk, dm1,
|
||||||
|
#ifdef COMPLEX
|
||||||
|
ZERO,
|
||||||
|
#endif
|
||||||
|
aa + GEMM_UNROLL_M * kk * COMPSIZE,
|
||||||
|
b + j * kk * COMPSIZE,
|
||||||
|
cc,
|
||||||
|
ldc);
|
||||||
|
}
|
||||||
|
|
||||||
|
solve(GEMM_UNROLL_M, j,
|
||||||
|
aa + (kk - j) * GEMM_UNROLL_M * COMPSIZE,
|
||||||
|
b + (kk - j) * j * COMPSIZE,
|
||||||
|
cc, ldc);
|
||||||
|
|
||||||
|
aa += GEMM_UNROLL_M * k * COMPSIZE;
|
||||||
|
cc += GEMM_UNROLL_M * COMPSIZE;
|
||||||
|
i --;
|
||||||
|
} while (i > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m & (GEMM_UNROLL_M - 1)) {
|
||||||
|
i = (GEMM_UNROLL_M >> 1);
|
||||||
|
do {
|
||||||
|
if (m & i) {
|
||||||
|
|
||||||
|
if (k - kk > 0) {
|
||||||
|
GEMM_KERNEL(i, j, k - kk, dm1,
|
||||||
|
#ifdef COMPLEX
|
||||||
|
ZERO,
|
||||||
|
#endif
|
||||||
|
aa + i * kk * COMPSIZE,
|
||||||
|
b + j * kk * COMPSIZE,
|
||||||
|
cc, ldc);
|
||||||
|
}
|
||||||
|
|
||||||
|
solve(i, j,
|
||||||
|
aa + (kk - j) * i * COMPSIZE,
|
||||||
|
b + (kk - j) * j * COMPSIZE,
|
||||||
|
cc, ldc);
|
||||||
|
|
||||||
|
aa += i * k * COMPSIZE;
|
||||||
|
cc += i * COMPSIZE;
|
||||||
|
|
||||||
|
}
|
||||||
|
i >>= 1;
|
||||||
|
} while (i > 0);
|
||||||
|
}
|
||||||
|
kk -= j;
|
||||||
|
}
|
||||||
|
j <<= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// j = (n >> GEMM_UNROLL_N_SHIFT);
|
||||||
|
j = (n / 6);
|
||||||
|
|
||||||
|
if (j > 0) {
|
||||||
|
|
||||||
|
do {
|
||||||
|
aa = a;
|
||||||
|
b -= GEMM_UNROLL_N * k * COMPSIZE;
|
||||||
|
c -= GEMM_UNROLL_N * ldc * COMPSIZE;
|
||||||
|
cc = c;
|
||||||
|
|
||||||
|
i = (m >> GEMM_UNROLL_M_SHIFT);
|
||||||
|
if (i > 0) {
|
||||||
|
do {
|
||||||
|
if (k - kk > 0) {
|
||||||
|
GEMM_KERNEL(GEMM_UNROLL_M, GEMM_UNROLL_N, k - kk, dm1,
|
||||||
|
#ifdef COMPLEX
|
||||||
|
ZERO,
|
||||||
|
#endif
|
||||||
|
aa + GEMM_UNROLL_M * kk * COMPSIZE,
|
||||||
|
b + GEMM_UNROLL_N * kk * COMPSIZE,
|
||||||
|
cc,
|
||||||
|
ldc);
|
||||||
|
}
|
||||||
|
|
||||||
|
solve(GEMM_UNROLL_M, GEMM_UNROLL_N,
|
||||||
|
aa + (kk - GEMM_UNROLL_N) * GEMM_UNROLL_M * COMPSIZE,
|
||||||
|
b + (kk - GEMM_UNROLL_N) * GEMM_UNROLL_N * COMPSIZE,
|
||||||
|
cc, ldc);
|
||||||
|
|
||||||
|
aa += GEMM_UNROLL_M * k * COMPSIZE;
|
||||||
|
cc += GEMM_UNROLL_M * COMPSIZE;
|
||||||
|
i --;
|
||||||
|
} while (i > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m & (GEMM_UNROLL_M - 1)) {
|
||||||
|
i = (GEMM_UNROLL_M >> 1);
|
||||||
|
do {
|
||||||
|
if (m & i) {
|
||||||
|
if (k - kk > 0) {
|
||||||
|
GEMM_KERNEL(i, GEMM_UNROLL_N, k - kk, dm1,
|
||||||
|
#ifdef COMPLEX
|
||||||
|
ZERO,
|
||||||
|
#endif
|
||||||
|
aa + i * kk * COMPSIZE,
|
||||||
|
b + GEMM_UNROLL_N * kk * COMPSIZE,
|
||||||
|
cc,
|
||||||
|
ldc);
|
||||||
|
}
|
||||||
|
|
||||||
|
solve(i, GEMM_UNROLL_N,
|
||||||
|
aa + (kk - GEMM_UNROLL_N) * i * COMPSIZE,
|
||||||
|
b + (kk - GEMM_UNROLL_N) * GEMM_UNROLL_N * COMPSIZE,
|
||||||
|
cc, ldc);
|
||||||
|
|
||||||
|
aa += i * k * COMPSIZE;
|
||||||
|
cc += i * COMPSIZE;
|
||||||
|
}
|
||||||
|
i >>= 1;
|
||||||
|
} while (i > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
kk -= GEMM_UNROLL_N;
|
||||||
|
j --;
|
||||||
|
} while (j > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
3
param.h
3
param.h
|
@ -2856,7 +2856,7 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#define ZGEMM_DEFAULT_UNROLL_N 4
|
#define ZGEMM_DEFAULT_UNROLL_N 4
|
||||||
#define ZGEMM_DEFAULT_UNROLL_M 1
|
#define ZGEMM_DEFAULT_UNROLL_M 1
|
||||||
#else
|
#else
|
||||||
#define DGEMM_DEFAULT_UNROLL_N 4
|
#define DGEMM_DEFAULT_UNROLL_N 6
|
||||||
#define DGEMM_DEFAULT_UNROLL_M 16
|
#define DGEMM_DEFAULT_UNROLL_M 16
|
||||||
#define SGEMM_DEFAULT_UNROLL_N 8
|
#define SGEMM_DEFAULT_UNROLL_N 8
|
||||||
#define SGEMM_DEFAULT_UNROLL_M 16
|
#define SGEMM_DEFAULT_UNROLL_M 16
|
||||||
|
@ -2864,6 +2864,7 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#define CGEMM_DEFAULT_UNROLL_M 16
|
#define CGEMM_DEFAULT_UNROLL_M 16
|
||||||
#define ZGEMM_DEFAULT_UNROLL_N 4
|
#define ZGEMM_DEFAULT_UNROLL_N 4
|
||||||
#define ZGEMM_DEFAULT_UNROLL_M 8
|
#define ZGEMM_DEFAULT_UNROLL_M 8
|
||||||
|
#define DGEMM_DEFAULT_UNROLL_MN 96
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define QGEMM_DEFAULT_UNROLL_N 2
|
#define QGEMM_DEFAULT_UNROLL_N 2
|
||||||
|
|
Loading…
Reference in New Issue