commit
7d81acc762
|
@ -625,6 +625,10 @@ DYNAMIC_CORE += EMAG8180
|
|||
DYNAMIC_CORE += THUNDERX3T110
|
||||
endif
|
||||
|
||||
ifeq ($(ARCH), mips64)
|
||||
DYNAMIC_CORE = LOONGSON3R3 LOONGSON3R4
|
||||
endif
|
||||
|
||||
ifeq ($(ARCH), zarch)
|
||||
DYNAMIC_CORE = ZARCH_GENERIC
|
||||
|
||||
|
@ -672,7 +676,7 @@ DYNAMIC_CORE += POWER9
|
|||
else
|
||||
$(info, OpenBLAS: Your gcc version is too old to build the POWER9 kernels.)
|
||||
endif
|
||||
LDVERSIONGTEQ35 := $(shell expr `ld --version | head -1 | cut -f2 -d "." | cut -f1 -d "-"` >= 35)
|
||||
LDVERSIONGTEQ35 := $(shell expr `$(CC) -Wl,--version 2> /dev/null | head -1 | cut -f2 -d "." | cut -f1 -d "-"` \>= 35)
|
||||
ifeq ($(GCCVERSIONGTEQ11)$(LDVERSIONGTEQ35), 11)
|
||||
DYNAMIC_CORE += POWER10
|
||||
CCOMMON_OPT += -DHAVE_P10_SUPPORT
|
||||
|
@ -787,14 +791,9 @@ CCOMMON_OPT += -mabi=32
|
|||
BINARY_DEFINED = 1
|
||||
endif
|
||||
|
||||
ifeq ($(CORE), LOONGSON3A)
|
||||
CCOMMON_OPT += -march=mips64
|
||||
FCOMMON_OPT += -march=mips64
|
||||
endif
|
||||
|
||||
ifeq ($(CORE), LOONGSON3B)
|
||||
CCOMMON_OPT += -march=mips64
|
||||
FCOMMON_OPT += -march=mips64
|
||||
ifeq ($(CORE), $(filter $(CORE),LOONGSON3R3 LOONGSON3R4))
|
||||
CCOMMON_OPT += -march=loongson3a
|
||||
FCOMMON_OPT += -march=loongson3a
|
||||
endif
|
||||
|
||||
ifeq ($(CORE), MIPS24K)
|
||||
|
@ -1078,11 +1077,11 @@ FCOMMON_OPT += -n32
|
|||
else
|
||||
FCOMMON_OPT += -n64
|
||||
endif
|
||||
ifeq ($(CORE), LOONGSON3A)
|
||||
ifeq ($(CORE), LOONGSON3R3)
|
||||
FCOMMON_OPT += -loongson3 -static
|
||||
endif
|
||||
|
||||
ifeq ($(CORE), LOONGSON3B)
|
||||
ifeq ($(CORE), LOONGSON3R4)
|
||||
FCOMMON_OPT += -loongson3 -static
|
||||
endif
|
||||
|
||||
|
@ -1108,11 +1107,11 @@ CCOMMON_OPT += -n32
|
|||
else
|
||||
CCOMMON_OPT += -n64
|
||||
endif
|
||||
ifeq ($(CORE), LOONGSON3A)
|
||||
ifeq ($(CORE), LOONGSON3R3)
|
||||
CCOMMON_OPT += -loongson3 -static
|
||||
endif
|
||||
|
||||
ifeq ($(CORE), LOONGSON3B)
|
||||
ifeq ($(CORE), LOONGSON3R4)
|
||||
CCOMMON_OPT += -loongson3 -static
|
||||
endif
|
||||
|
||||
|
@ -1223,10 +1222,8 @@ ifdef SMP
|
|||
CCOMMON_OPT += -DSMP_SERVER
|
||||
|
||||
ifeq ($(ARCH), mips64)
|
||||
ifneq ($(CORE), LOONGSON3B)
|
||||
USE_SIMPLE_THREADED_LEVEL3 = 1
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(USE_OPENMP), 1)
|
||||
# USE_SIMPLE_THREADED_LEVEL3 = 1
|
||||
|
@ -1342,11 +1339,9 @@ endif
|
|||
|
||||
ifneq ($(ARCH), x86_64)
|
||||
ifneq ($(ARCH), x86)
|
||||
ifneq ($(CORE), LOONGSON3B)
|
||||
NO_AFFINITY = 1
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
ifdef NO_AFFINITY
|
||||
ifeq ($(NO_AFFINITY), 0)
|
||||
|
|
2
c_check
2
c_check
|
@ -199,7 +199,7 @@ if (($architecture eq "mips") || ($architecture eq "mips64")) {
|
|||
} else {
|
||||
$tmpf = new File::Temp( SUFFIX => '.c' , UNLINK => 1 );
|
||||
$code = '"addvi.b $w0, $w1, 1"';
|
||||
$msa_flags = "-mmsa -mfp64 -msched-weight -mload-store-pairs";
|
||||
$msa_flags = "-mmsa -mfp64 -mload-store-pairs";
|
||||
print $tmpf "#include <msa.h>\n\n";
|
||||
print $tmpf "void main(void){ __asm__ volatile($code); }\n";
|
||||
|
||||
|
|
|
@ -75,18 +75,10 @@ static inline int my_mbind(void *addr, unsigned long len, int mode,
|
|||
// https://lsbbugs.linuxfoundation.org/show_bug.cgi?id=3482
|
||||
return 0;
|
||||
#else
|
||||
#if defined (LOONGSON3B)
|
||||
#if defined (__64BIT__)
|
||||
return syscall(SYS_mbind, addr, len, mode, nodemask, maxnode, flags);
|
||||
#else
|
||||
return 0; //NULL Implementation on Loongson 3B 32bit.
|
||||
#endif
|
||||
#else
|
||||
//Fixed randomly SEGFAULT when nodemask==NULL with above Linux 2.6.34
|
||||
// unsigned long null_nodemask=0;
|
||||
return syscall(SYS_mbind, addr, len, mode, nodemask, maxnode, flags);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline int my_set_mempolicy(int mode, const unsigned long *addr, unsigned long flag) {
|
||||
|
|
|
@ -229,12 +229,7 @@ REALNAME: ;\
|
|||
|
||||
#define BUFFER_SIZE ( 32 << 21)
|
||||
|
||||
#if defined(LOONGSON3A)
|
||||
#define PAGESIZE (16UL << 10)
|
||||
#define FIXED_PAGESIZE (16UL << 10)
|
||||
#endif
|
||||
|
||||
#if defined(LOONGSON3B)
|
||||
#if defined(LOONGSON3R3) || defined(LOONGSON3R4)
|
||||
#define PAGESIZE (16UL << 10)
|
||||
#define FIXED_PAGESIZE (16UL << 10)
|
||||
#endif
|
||||
|
@ -250,7 +245,7 @@ REALNAME: ;\
|
|||
#define MAP_ANONYMOUS MAP_ANON
|
||||
#endif
|
||||
|
||||
#if defined(LOONGSON3A) || defined(LOONGSON3B)
|
||||
#if defined(LOONGSON3R3) || defined(LOONGSON3R4)
|
||||
#define PREFETCHD_(x) ld $0, x
|
||||
#define PREFETCHD(x) PREFETCHD_(x)
|
||||
#else
|
||||
|
|
|
@ -72,8 +72,8 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
|
||||
#define CPU_UNKNOWN 0
|
||||
#define CPU_SICORTEX 1
|
||||
#define CPU_LOONGSON3A 2
|
||||
#define CPU_LOONGSON3B 3
|
||||
#define CPU_LOONGSON3R3 2
|
||||
#define CPU_LOONGSON3R4 3
|
||||
#define CPU_I6400 4
|
||||
#define CPU_P6600 5
|
||||
#define CPU_I6500 6
|
||||
|
@ -81,8 +81,8 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
static char *cpuname[] = {
|
||||
"UNKNOWN",
|
||||
"SICORTEX",
|
||||
"LOONGSON3A",
|
||||
"LOONGSON3B",
|
||||
"LOONGSON3R3",
|
||||
"LOONGSON3R4",
|
||||
"I6400",
|
||||
"P6600",
|
||||
"I6500"
|
||||
|
@ -90,48 +90,13 @@ static char *cpuname[] = {
|
|||
|
||||
int detect(void){
|
||||
|
||||
#ifdef __linux
|
||||
#ifdef linux
|
||||
FILE *infile;
|
||||
char buffer[512], *p;
|
||||
|
||||
p = (char *)NULL;
|
||||
infile = fopen("/proc/cpuinfo", "r");
|
||||
while (fgets(buffer, sizeof(buffer), infile)){
|
||||
if (!strncmp("cpu", buffer, 3)){
|
||||
p = strchr(buffer, ':') + 2;
|
||||
#if 0
|
||||
fprintf(stderr, "%s\n", p);
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
fclose(infile);
|
||||
|
||||
if(p != NULL){
|
||||
if (strstr(p, "Loongson-3A")){
|
||||
return CPU_LOONGSON3A;
|
||||
}else if(strstr(p, "Loongson-3B")){
|
||||
return CPU_LOONGSON3B;
|
||||
}else if (strstr(p, "Loongson-3")){
|
||||
infile = fopen("/proc/cpuinfo", "r");
|
||||
p = (char *)NULL;
|
||||
while (fgets(buffer, sizeof(buffer), infile)){
|
||||
if (!strncmp("system type", buffer, 11)){
|
||||
p = strchr(buffer, ':') + 2;
|
||||
break;
|
||||
}
|
||||
}
|
||||
fclose(infile);
|
||||
if (strstr(p, "loongson3a"))
|
||||
return CPU_LOONGSON3A;
|
||||
}else{
|
||||
return CPU_SICORTEX;
|
||||
}
|
||||
}
|
||||
//Check model name for Loongson3
|
||||
infile = fopen("/proc/cpuinfo", "r");
|
||||
p = (char *)NULL;
|
||||
while (fgets(buffer, sizeof(buffer), infile)){
|
||||
if (!strncmp("model name", buffer, 10)){
|
||||
p = strchr(buffer, ':') + 2;
|
||||
|
@ -140,14 +105,16 @@ int detect(void){
|
|||
}
|
||||
fclose(infile);
|
||||
if(p != NULL){
|
||||
if (strstr(p, "Loongson-3A")){
|
||||
return CPU_LOONGSON3A;
|
||||
}else if(strstr(p, "Loongson-3B")){
|
||||
return CPU_LOONGSON3B;
|
||||
}
|
||||
if (strstr(p, "Loongson-3A3000") || strstr(p, "Loongson-3B3000")){
|
||||
return CPU_LOONGSON3R3;
|
||||
}else if(strstr(p, "Loongson-3A4000") || strstr(p, "Loongson-3B4000")){
|
||||
return CPU_LOONGSON3R4;
|
||||
} else{
|
||||
return CPU_SICORTEX;
|
||||
}
|
||||
#endif
|
||||
return CPU_UNKNOWN;
|
||||
}
|
||||
}
|
||||
|
||||
char *get_corename(void){
|
||||
|
@ -159,10 +126,10 @@ void get_architecture(void){
|
|||
}
|
||||
|
||||
void get_subarchitecture(void){
|
||||
if(detect()==CPU_LOONGSON3A) {
|
||||
printf("LOONGSON3A");
|
||||
}else if(detect()==CPU_LOONGSON3B){
|
||||
printf("LOONGSON3B");
|
||||
if(detect()==CPU_LOONGSON3R3) {
|
||||
printf("LOONGSON3R3");
|
||||
}else if(detect()==CPU_LOONGSON3R4){
|
||||
printf("LOONGSON3R4");
|
||||
}else if(detect()==CPU_I6400){
|
||||
printf("I6400");
|
||||
}else if(detect()==CPU_P6600){
|
||||
|
@ -179,8 +146,8 @@ void get_subdirname(void){
|
|||
}
|
||||
|
||||
void get_cpuconfig(void){
|
||||
if(detect()==CPU_LOONGSON3A) {
|
||||
printf("#define LOONGSON3A\n");
|
||||
if(detect()==CPU_LOONGSON3R3) {
|
||||
printf("#define LOONGSON3R3\n");
|
||||
printf("#define L1_DATA_SIZE 65536\n");
|
||||
printf("#define L1_DATA_LINESIZE 32\n");
|
||||
printf("#define L2_SIZE 512488\n");
|
||||
|
@ -188,8 +155,8 @@ void get_cpuconfig(void){
|
|||
printf("#define DTB_DEFAULT_ENTRIES 64\n");
|
||||
printf("#define DTB_SIZE 4096\n");
|
||||
printf("#define L2_ASSOCIATIVE 4\n");
|
||||
}else if(detect()==CPU_LOONGSON3B){
|
||||
printf("#define LOONGSON3B\n");
|
||||
}else if(detect()==CPU_LOONGSON3R4){
|
||||
printf("#define LOONGSON3R4\n");
|
||||
printf("#define L1_DATA_SIZE 65536\n");
|
||||
printf("#define L1_DATA_LINESIZE 32\n");
|
||||
printf("#define L2_SIZE 512488\n");
|
||||
|
@ -237,10 +204,10 @@ void get_cpuconfig(void){
|
|||
}
|
||||
|
||||
void get_libname(void){
|
||||
if(detect()==CPU_LOONGSON3A) {
|
||||
printf("loongson3a\n");
|
||||
}else if(detect()==CPU_LOONGSON3B) {
|
||||
printf("loongson3b\n");
|
||||
if(detect()==CPU_LOONGSON3R3) {
|
||||
printf("loongson3r3\n");
|
||||
}else if(detect()==CPU_LOONGSON3R4) {
|
||||
printf("loongson3r4\n");
|
||||
}else if(detect()==CPU_I6400) {
|
||||
printf("i6400\n");
|
||||
}else if(detect()==CPU_P6600) {
|
||||
|
|
|
@ -339,8 +339,10 @@ int CNAME(blas_arg_t *args, BLASLONG *range_m, BLASLONG *range_n,
|
|||
#else
|
||||
if (min_jj >= 3*GEMM_UNROLL_N) min_jj = 3*GEMM_UNROLL_N;
|
||||
else
|
||||
/*
|
||||
if (min_jj >= 2*GEMM_UNROLL_N) min_jj = 2*GEMM_UNROLL_N;
|
||||
else
|
||||
*/
|
||||
if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
|
||||
#endif
|
||||
|
||||
|
|
|
@ -373,8 +373,10 @@ static int inner_thread(blas_arg_t *args, BLASLONG *range_m, BLASLONG *range_n,
|
|||
#else
|
||||
if (min_jj >= 3*GEMM_UNROLL_N) min_jj = 3*GEMM_UNROLL_N;
|
||||
else
|
||||
/*
|
||||
if (min_jj >= 2*GEMM_UNROLL_N) min_jj = 2*GEMM_UNROLL_N;
|
||||
else
|
||||
*/
|
||||
if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
|
||||
#endif
|
||||
/* Copy part of local region of B into workspace */
|
||||
|
|
|
@ -24,10 +24,14 @@ else
|
|||
ifeq ($(ARCH),zarch)
|
||||
COMMONOBJS += dynamic_zarch.$(SUFFIX)
|
||||
else
|
||||
ifeq ($(ARCH),mips64)
|
||||
COMMONOBJS += dynamic_mips64.$(SUFFIX)
|
||||
else
|
||||
COMMONOBJS += dynamic.$(SUFFIX)
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
else
|
||||
COMMONOBJS += parameter.$(SUFFIX)
|
||||
endif
|
||||
|
@ -92,10 +96,14 @@ else
|
|||
ifeq ($(ARCH),zarch)
|
||||
HPLOBJS = memory.$(SUFFIX) xerbla.$(SUFFIX) dynamic_zarch.$(SUFFIX)
|
||||
else
|
||||
ifeq ($(ARCH),mips64)
|
||||
HPLOBJS = memory.$(SUFFIX) xerbla.$(SUFFIX) dynamic_mips64.$(SUFFIX)
|
||||
else
|
||||
HPLOBJS = memory.$(SUFFIX) xerbla.$(SUFFIX) dynamic.$(SUFFIX)
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
else
|
||||
HPLOBJS = memory.$(SUFFIX) xerbla.$(SUFFIX) parameter.$(SUFFIX)
|
||||
endif
|
||||
|
|
|
@ -967,9 +967,11 @@ void goto_set_num_threads(int num_threads) {
|
|||
blas_cpu_number = num_threads;
|
||||
|
||||
#if defined(ARCH_MIPS64)
|
||||
#ifndef DYNAMIC_ARCH
|
||||
//set parameters for different number of threads.
|
||||
blas_set_parameter();
|
||||
#endif
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,230 @@
|
|||
/*****************************************************************************
|
||||
Copyright (c) 2020, 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 COPYRIGHT OWNER 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.
|
||||
**********************************************************************************/
|
||||
|
||||
#include <sys/wait.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/resource.h>
|
||||
#include "common.h"
|
||||
|
||||
extern gotoblas_t gotoblas_LOONGSON3R3;
|
||||
extern gotoblas_t gotoblas_LOONGSON3R4;
|
||||
|
||||
extern void openblas_warning(int verbose, const char * msg);
|
||||
|
||||
#define NUM_CORETYPES 2
|
||||
|
||||
static char *corename[] = {
|
||||
"loongson3r3",
|
||||
"loongson3r4",
|
||||
"UNKNOWN"
|
||||
};
|
||||
|
||||
char *gotoblas_corename(void) {
|
||||
if (gotoblas == &gotoblas_LOONGSON3R3) return corename[0];
|
||||
if (gotoblas == &gotoblas_LOONGSON3R4) return corename[1];
|
||||
return corename[NUM_CORETYPES];
|
||||
}
|
||||
|
||||
static gotoblas_t *force_coretype(char *coretype) {
|
||||
int i;
|
||||
int found = -1;
|
||||
char message[128];
|
||||
|
||||
for ( i=0 ; i < NUM_CORETYPES; i++)
|
||||
{
|
||||
if (!strncasecmp(coretype, corename[i], 20))
|
||||
{
|
||||
found = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
switch (found)
|
||||
{
|
||||
case 0: return (&gotoblas_LOONGSON3R3);
|
||||
case 1: return (&gotoblas_LOONGSON3R4);
|
||||
}
|
||||
snprintf(message, 128, "Core not found: %s\n", coretype);
|
||||
openblas_warning(1, message);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#define MMI_MASK 0x00000010
|
||||
#define MSA_MASK 0x00000020
|
||||
|
||||
int fd[2];
|
||||
int support_cpucfg;
|
||||
|
||||
static void handler(int signum)
|
||||
{
|
||||
close(fd[1]);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* Brief : Function to check if cpucfg supported on loongson
|
||||
* Return: 1 supported
|
||||
* 0 not supported
|
||||
*/
|
||||
static int cpucfg_test(void) {
|
||||
pid_t pid;
|
||||
int status = 0;
|
||||
|
||||
support_cpucfg = 0;
|
||||
pipe(fd);
|
||||
pid = fork();
|
||||
if (pid == 0) { /* Subprocess */
|
||||
struct sigaction act;
|
||||
close(fd[0]);
|
||||
/* Set signal action for SIGILL. */
|
||||
act.sa_handler = handler;
|
||||
sigaction(SIGILL,&act,NULL);
|
||||
|
||||
/* Execute cpucfg in subprocess. */
|
||||
__asm__ volatile(
|
||||
".insn \n\t"
|
||||
".word (0xc8080118) \n\t"
|
||||
:::
|
||||
);
|
||||
support_cpucfg = 1;
|
||||
write(fd[1],&support_cpucfg,sizeof(support_cpucfg));
|
||||
close(fd[1]);
|
||||
exit(0);
|
||||
} else if (pid > 0){ /* Parent process*/
|
||||
close(fd[1]);
|
||||
if ((waitpid(pid,&status,0) <= 0) ||
|
||||
(read(fd[0],&support_cpucfg,sizeof(support_cpucfg)) <= 0))
|
||||
support_cpucfg = 0;
|
||||
close(fd[0]);
|
||||
} else {
|
||||
support_cpucfg = 0;
|
||||
}
|
||||
|
||||
return support_cpucfg;
|
||||
}
|
||||
|
||||
static gotoblas_t *get_coretype_from_cpucfg(void) {
|
||||
int flag = 0;
|
||||
__asm__ volatile(
|
||||
".insn \n\t"
|
||||
"dli $8, 0x01 \n\t"
|
||||
".word (0xc9084918) \n\t"
|
||||
"usw $9, 0x00(%0) \n\t"
|
||||
:
|
||||
: "r"(&flag)
|
||||
: "memory"
|
||||
);
|
||||
if (flag & MSA_MASK)
|
||||
return (&gotoblas_LOONGSON3R4);
|
||||
if (flag & MMI_MASK)
|
||||
return (&gotoblas_LOONGSON3R3);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static gotoblas_t *get_coretype_from_cpuinfo(void) {
|
||||
#ifdef linux
|
||||
FILE *infile;
|
||||
char buffer[512], *p;
|
||||
|
||||
p = (char *)NULL;
|
||||
//Check model name for Loongson3
|
||||
infile = fopen("/proc/cpuinfo", "r");
|
||||
while (fgets(buffer, sizeof(buffer), infile)){
|
||||
if (!strncmp("model name", buffer, 10)){
|
||||
p = strchr(buffer, ':') + 2;
|
||||
break;
|
||||
}
|
||||
}
|
||||
fclose(infile);
|
||||
if(p != NULL){
|
||||
if (strstr(p, "Loongson-3A3000") || strstr(p, "Loongson-3B3000"))
|
||||
return (&gotoblas_LOONGSON3R3);
|
||||
else if(strstr(p, "Loongson-3A4000") || strstr(p, "Loongson-3B4000"))
|
||||
return (&gotoblas_LOONGSON3R4);
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static gotoblas_t *get_coretype(void) {
|
||||
int ret = 0;
|
||||
|
||||
ret = cpucfg_test();
|
||||
if (ret == 1)
|
||||
return get_coretype_from_cpucfg();
|
||||
else
|
||||
return get_coretype_from_cpuinfo();
|
||||
}
|
||||
|
||||
void gotoblas_dynamic_init(void) {
|
||||
char coremsg[128];
|
||||
char coren[22];
|
||||
char *p;
|
||||
|
||||
if (gotoblas) return;
|
||||
|
||||
p = getenv("OPENBLAS_CORETYPE");
|
||||
if ( p )
|
||||
{
|
||||
gotoblas = force_coretype(p);
|
||||
}
|
||||
else
|
||||
{
|
||||
gotoblas = get_coretype();
|
||||
}
|
||||
|
||||
if (gotoblas == NULL)
|
||||
{
|
||||
snprintf(coremsg, 128, "Falling back to loongson3r3 core\n");
|
||||
openblas_warning(1, coremsg);
|
||||
gotoblas = &gotoblas_LOONGSON3R3;
|
||||
}
|
||||
|
||||
if (gotoblas && gotoblas->init) {
|
||||
strncpy(coren, gotoblas_corename(), 20);
|
||||
sprintf(coremsg, "Core: %s\n", coren);
|
||||
openblas_warning(2, coremsg);
|
||||
gotoblas -> init();
|
||||
} else {
|
||||
openblas_warning(0, "OpenBLAS : Architecture Initialization failed. No initialization function found.\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void gotoblas_dynamic_quit(void) {
|
||||
gotoblas = NULL;
|
||||
}
|
|
@ -52,6 +52,9 @@ static gotoblas_t *get_coretype(void) {
|
|||
if (__builtin_cpu_supports ("arch_3_1") && __builtin_cpu_supports ("mma"))
|
||||
return &gotoblas_POWER10;
|
||||
#endif
|
||||
/* Fall back to the POWER9 implementation if the toolchain is too old or the MMA feature is not set */
|
||||
if (__builtin_cpu_is("power10"))
|
||||
return &gotoblas_POWER9;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -717,7 +717,7 @@ void blas_set_parameter(void){
|
|||
|
||||
#if defined(ARCH_MIPS64)
|
||||
void blas_set_parameter(void){
|
||||
#if defined(LOONGSON3A)
|
||||
#if defined(LOONGSON3R3) || defined(LOONGSON3R4)
|
||||
#ifdef SMP
|
||||
if(blas_num_threads == 1){
|
||||
#endif
|
||||
|
@ -731,20 +731,6 @@ void blas_set_parameter(void){
|
|||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(LOONGSON3B)
|
||||
#ifdef SMP
|
||||
if(blas_num_threads == 1 || blas_num_threads == 2){
|
||||
#endif
|
||||
//single thread
|
||||
dgemm_r = 640;
|
||||
#ifdef SMP
|
||||
}else{
|
||||
//multi thread
|
||||
dgemm_r = 160;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
24
getarch.c
24
getarch.c
|
@ -140,8 +140,8 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
/* #define FORCE_PPC440FP2 */
|
||||
/* #define FORCE_CELL */
|
||||
/* #define FORCE_SICORTEX */
|
||||
/* #define FORCE_LOONGSON3A */
|
||||
/* #define FORCE_LOONGSON3B */
|
||||
/* #define FORCE_LOONGSON3R3 */
|
||||
/* #define FORCE_LOONGSON3R4 */
|
||||
/* #define FORCE_I6400 */
|
||||
/* #define FORCE_P6600 */
|
||||
/* #define FORCE_P5600 */
|
||||
|
@ -814,31 +814,31 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
#endif
|
||||
|
||||
|
||||
#ifdef FORCE_LOONGSON3A
|
||||
#if defined FORCE_LOONGSON3R3 || defined FORCE_LOONGSON3A || defined FORCE_LOONGSON3B
|
||||
#define FORCE
|
||||
#define ARCHITECTURE "MIPS"
|
||||
#define SUBARCHITECTURE "LOONGSON3A"
|
||||
#define SUBARCHITECTURE "LOONGSON3R3"
|
||||
#define SUBDIRNAME "mips64"
|
||||
#define ARCHCONFIG "-DLOONGSON3A " \
|
||||
#define ARCHCONFIG "-DLOONGSON3R3 " \
|
||||
"-DL1_DATA_SIZE=65536 -DL1_DATA_LINESIZE=32 " \
|
||||
"-DL2_SIZE=512488 -DL2_LINESIZE=32 " \
|
||||
"-DDTB_DEFAULT_ENTRIES=64 -DDTB_SIZE=4096 -DL2_ASSOCIATIVE=4 "
|
||||
#define LIBNAME "loongson3a"
|
||||
#define CORENAME "LOONGSON3A"
|
||||
#define LIBNAME "loongson3r3"
|
||||
#define CORENAME "LOONGSON3R3"
|
||||
#else
|
||||
#endif
|
||||
|
||||
#ifdef FORCE_LOONGSON3B
|
||||
#ifdef FORCE_LOONGSON3R4
|
||||
#define FORCE
|
||||
#define ARCHITECTURE "MIPS"
|
||||
#define SUBARCHITECTURE "LOONGSON3B"
|
||||
#define SUBARCHITECTURE "LOONGSON3R4"
|
||||
#define SUBDIRNAME "mips64"
|
||||
#define ARCHCONFIG "-DLOONGSON3B " \
|
||||
#define ARCHCONFIG "-DLOONGSON3R4 " \
|
||||
"-DL1_DATA_SIZE=65536 -DL1_DATA_LINESIZE=32 " \
|
||||
"-DL2_SIZE=512488 -DL2_LINESIZE=32 " \
|
||||
"-DDTB_DEFAULT_ENTRIES=64 -DDTB_SIZE=4096 -DL2_ASSOCIATIVE=4 "
|
||||
#define LIBNAME "loongson3b"
|
||||
#define CORENAME "LOONGSON3B"
|
||||
#define LIBNAME "loongson3r4"
|
||||
#define CORENAME "LOONGSON3R4"
|
||||
#else
|
||||
#endif
|
||||
|
||||
|
|
|
@ -58,6 +58,8 @@ else ifeq ($(TARGET_CORE), SKYLAKEX)
|
|||
endif
|
||||
else ifeq ($(TARGET_CORE), HASWELL)
|
||||
override CFLAGS += -DBUILD_KERNEL -DTABLE_NAME=gotoblas_$(TARGET_CORE) $(AVX2OPT)
|
||||
else ifeq ($(TARGET_CORE), LOONGSON3R4)
|
||||
override CFLAGS += -DBUILD_KERNEL -DTABLE_NAME=gotoblas_$(TARGET_CORE) $(MSA_FLAGS)
|
||||
else
|
||||
override CFLAGS += -DBUILD_KERNEL -DTABLE_NAME=gotoblas_$(TARGET_CORE)
|
||||
endif
|
||||
|
@ -68,6 +70,9 @@ else
|
|||
TARGET_CORE = $(CORE)
|
||||
KDIR =
|
||||
TSUFFIX =
|
||||
ifeq ($(TARGET_CORE), LOONGSON3R4)
|
||||
override CFLAGS += $(MSA_FLAGS)
|
||||
endif
|
||||
endif
|
||||
|
||||
-include $(KERNELDIR)/KERNEL.$(TARGET_CORE)
|
||||
|
|
|
@ -29,10 +29,6 @@ ifeq ($(ARCH), riscv64)
|
|||
USE_TRMM = 1
|
||||
endif
|
||||
|
||||
ifeq ($(TARGET), LOONGSON3B)
|
||||
USE_TRMM = 1
|
||||
endif
|
||||
|
||||
ifneq ($(DYNAMIC_ARCH), 1)
|
||||
ifeq ($(TARGET), GENERIC)
|
||||
USE_TRMM = 1
|
||||
|
|
|
@ -121,7 +121,7 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
#define CGEMM_KERNEL_8X1_MSA(OP0, OP1, OP2, OP3, OP4) \
|
||||
{ \
|
||||
LD_SP4_INC(pa0, 4, src_a0, src_a1, src_a2, src_a3); \
|
||||
src_bi = (v4f32) __msa_cast_to_vector_double(*((double *) pb0)); \
|
||||
src_bi = (v4f32) COPY_DOUBLE_TO_VECTOR(*((double *) pb0)); \
|
||||
SPLATI_W2_SP(src_bi, 0, src_br, src_bi); \
|
||||
\
|
||||
PCKEVOD_W2_SP(src_a1, src_a0, src_a0r, src_a0i); \
|
||||
|
@ -200,7 +200,7 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
#define CGEMM_KERNEL_4X1_MSA(OP0, OP1, OP2, OP3, OP4) \
|
||||
{ \
|
||||
LD_SP2_INC(pa0, 4, src_a0, src_a1); \
|
||||
src_bi = (v4f32) __msa_cast_to_vector_double(*((double *) pb0)); \
|
||||
src_bi = (v4f32) COPY_DOUBLE_TO_VECTOR(*((double *) pb0)); \
|
||||
SPLATI_W2_SP(src_bi, 0, src_br, src_bi); \
|
||||
\
|
||||
PCKEVOD_W2_SP(src_a1, src_a0, src_a0r, src_a0i); \
|
||||
|
|
|
@ -49,11 +49,7 @@ int CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x, FLOAT *y, BLASLONG inc_y,
|
|||
{
|
||||
if ((0 == c) && (0 == s))
|
||||
{
|
||||
v4f32 zero = __msa_cast_to_vector_float(0);
|
||||
zero = (v4f32) __msa_insert_w((v4i32) zero, 0, 0.0);
|
||||
zero = (v4f32) __msa_insert_w((v4i32) zero, 1, 0.0);
|
||||
zero = (v4f32) __msa_insert_w((v4i32) zero, 2, 0.0);
|
||||
zero = (v4f32) __msa_insert_w((v4i32) zero, 3, 0.0);
|
||||
v4f32 zero = {0.0, 0.0, 0.0, 0.0};
|
||||
|
||||
/* process 2 elements */
|
||||
for (j = (n >> 1); j--;)
|
||||
|
|
|
@ -49,11 +49,7 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i,
|
|||
{
|
||||
if ((0.0 == da_r) && (0.0 == da_i))
|
||||
{
|
||||
v4f32 zero_v = __msa_cast_to_vector_float(0);
|
||||
zero_v = (v4f32) __msa_insert_w((v4i32) zero_v, 0, 0.0);
|
||||
zero_v = (v4f32) __msa_insert_w((v4i32) zero_v, 1, 0.0);
|
||||
zero_v = (v4f32) __msa_insert_w((v4i32) zero_v, 2, 0.0);
|
||||
zero_v = (v4f32) __msa_insert_w((v4i32) zero_v, 3, 0.0);
|
||||
v4f32 zero_v = {0.0, 0.0, 0.0, 0.0};
|
||||
|
||||
for (i = (n >> 5); i--;)
|
||||
{
|
||||
|
|
|
@ -44,9 +44,7 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da, FLOAT *x,
|
|||
{
|
||||
if (0.0 == da)
|
||||
{
|
||||
v2f64 zero_v = __msa_cast_to_vector_double(0);
|
||||
zero_v = (v2f64) __msa_insert_d((v2i64) zero_v, 0, 0.0);
|
||||
zero_v = (v2f64) __msa_insert_d((v2i64) zero_v, 1, 0.0);
|
||||
v2f64 zero_v = {0.0, 0.0};
|
||||
|
||||
for (i = (n >> 5); i--;)
|
||||
{
|
||||
|
|
|
@ -186,8 +186,7 @@ void dsolve_8x4_ln_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLONG bk)
|
|||
ILVRL_D2_DP(src_c14, src_c10, res_c12, res_c13);
|
||||
ILVRL_D2_DP(src_c15, src_c11, res_c14, res_c15);
|
||||
|
||||
src_a54 = __msa_cast_to_vector_double(*(a + 54));
|
||||
src_a54 = (v2f64) __msa_splati_d((v2i64) src_a54, 0);
|
||||
src_a54 = COPY_DOUBLE_TO_VECTOR(*(a + 54));
|
||||
src_a62 = LD_DP(a + 62);
|
||||
src_a63 = (v2f64) __msa_splati_d((v2i64) src_a62, 1);
|
||||
src_a62 = (v2f64) __msa_splati_d((v2i64) src_a62, 0);
|
||||
|
@ -200,8 +199,7 @@ void dsolve_8x4_ln_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLONG bk)
|
|||
src_a44 = LD_DP(a + 44);
|
||||
src_a45 = (v2f64) __msa_splati_d((v2i64) src_a44, 1);
|
||||
src_a44 = (v2f64) __msa_splati_d((v2i64) src_a44, 0);
|
||||
src_a36 = __msa_cast_to_vector_double(*(a + 36));
|
||||
src_a36 = (v2f64) __msa_splati_d((v2i64) src_a36, 0);
|
||||
src_a36 = COPY_DOUBLE_TO_VECTOR(*(a + 36));
|
||||
|
||||
res_c7 *= src_a63;
|
||||
res_c6 -= res_c7 * src_a62;
|
||||
|
@ -271,8 +269,7 @@ void dsolve_8x4_ln_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLONG bk)
|
|||
src_a26 = LD_DP(a + 26);
|
||||
src_a27 = (v2f64) __msa_splati_d((v2i64) src_a26, 1);
|
||||
src_a26 = (v2f64) __msa_splati_d((v2i64) src_a26, 0);
|
||||
src_a18 = __msa_cast_to_vector_double(*(a + 18));
|
||||
src_a18 = (v2f64) __msa_splati_d((v2i64) src_a18, 0);
|
||||
src_a18 = COPY_DOUBLE_TO_VECTOR(*(a + 18));
|
||||
|
||||
res_c3 -= res_c7 * src_a59;
|
||||
res_c2 -= res_c7 * src_a58;
|
||||
|
@ -358,8 +355,7 @@ void dsolve_8x4_ln_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLONG bk)
|
|||
src_a8 = LD_DP(a + 8);
|
||||
src_a9 = (v2f64) __msa_splati_d((v2i64) src_a8, 1);
|
||||
src_a8 = (v2f64) __msa_splati_d((v2i64) src_a8, 0);
|
||||
src_a0 = __msa_cast_to_vector_double(*(a + 0));
|
||||
src_a0 = (v2f64) __msa_splati_d((v2i64) src_a0, 0);
|
||||
src_a0 = COPY_DOUBLE_TO_VECTOR(*(a + 0));
|
||||
|
||||
res_c1 -= res_c2 * src_a17;
|
||||
res_c1 *= src_a9;
|
||||
|
@ -488,8 +484,7 @@ static void dsolve_8x2_ln_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLO
|
|||
src_a52 = LD_DP(a - 12);
|
||||
src_a53 = (v2f64) __msa_splati_d((v2i64) src_a52, 1);
|
||||
src_a52 = (v2f64) __msa_splati_d((v2i64) src_a52, 0);
|
||||
src_a54 = __msa_cast_to_vector_double(*(a - 10));
|
||||
src_a54 = (v2f64) __msa_splati_d((v2i64) src_a54, 0);
|
||||
src_a54 = COPY_DOUBLE_TO_VECTOR(*(a -10));
|
||||
|
||||
src_a40 = LD_DP(a - 24);
|
||||
src_a41 = (v2f64) __msa_splati_d((v2i64) src_a40, 1);
|
||||
|
@ -526,8 +521,7 @@ static void dsolve_8x2_ln_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLO
|
|||
src_a34 = LD_DP(a - 30);
|
||||
src_a35 = (v2f64) __msa_splati_d((v2i64) src_a34, 1);
|
||||
src_a34 = (v2f64) __msa_splati_d((v2i64) src_a34, 0);
|
||||
src_a36 = __msa_cast_to_vector_double(*(a - 28));
|
||||
src_a36 = (v2f64) __msa_splati_d((v2i64) src_a36, 0);
|
||||
src_a36 = COPY_DOUBLE_TO_VECTOR(*(a -28));
|
||||
|
||||
res_c4 *= src_a36;
|
||||
res_c3 -= res_c4 * src_a35;
|
||||
|
@ -544,10 +538,8 @@ static void dsolve_8x2_ln_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLO
|
|||
src_a16 = LD_DP(a - 48);
|
||||
src_a17 = (v2f64) __msa_splati_d((v2i64) src_a16, 1);
|
||||
src_a16 = (v2f64) __msa_splati_d((v2i64) src_a16, 0);
|
||||
src_a18 = __msa_cast_to_vector_double(*(a - 46));
|
||||
src_a18 = (v2f64) __msa_splati_d((v2i64) src_a18, 0);
|
||||
src_a0 = __msa_cast_to_vector_double(*(a - 64));
|
||||
src_a0 = (v2f64) __msa_splati_d((v2i64) src_a0, 0);
|
||||
src_a18 = COPY_DOUBLE_TO_VECTOR(*(a - 46));
|
||||
src_a0 = COPY_DOUBLE_TO_VECTOR(*(a - 64));
|
||||
src_a8 = LD_DP(a - 56);
|
||||
src_a9 = (v2f64) __msa_splati_d((v2i64) src_a8, 1);
|
||||
src_a8 = (v2f64) __msa_splati_d((v2i64) src_a8, 0);
|
||||
|
@ -785,11 +777,8 @@ static void dsolve_4x4_ln_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLO
|
|||
src_a10 = (v2f64) __msa_splati_d((v2i64) src_a9, 1);
|
||||
src_a9 = (v2f64) __msa_splati_d((v2i64) src_a9, 0);
|
||||
|
||||
src_a8 = __msa_cast_to_vector_double(*(a + 8));
|
||||
src_a0 = __msa_cast_to_vector_double(*(a + 0));
|
||||
|
||||
src_a8 = (v2f64) __msa_splati_d((v2i64) src_a8, 0);
|
||||
src_a0 = (v2f64) __msa_splati_d((v2i64) src_a0, 0);
|
||||
src_a8 = COPY_DOUBLE_TO_VECTOR(*(a + 8));
|
||||
src_a0 = COPY_DOUBLE_TO_VECTOR(*(a + 0));
|
||||
|
||||
src_a4 = LD_DP(a + 4);
|
||||
src_a5 = (v2f64) __msa_splati_d((v2i64) src_a4, 1);
|
||||
|
@ -890,11 +879,8 @@ static void dsolve_4x2_ln_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLO
|
|||
src_a10 = (v2f64) __msa_splati_d((v2i64) src_a9, 1);
|
||||
src_a9 = (v2f64) __msa_splati_d((v2i64) src_a9, 0);
|
||||
|
||||
src_a8 = __msa_cast_to_vector_double(*(a + 8));
|
||||
src_a0 = __msa_cast_to_vector_double(*(a + 0));
|
||||
|
||||
src_a8 = (v2f64) __msa_splati_d((v2i64) src_a8, 0);
|
||||
src_a0 = (v2f64) __msa_splati_d((v2i64) src_a0, 0);
|
||||
src_a8 = COPY_DOUBLE_TO_VECTOR(*(a + 8));
|
||||
src_a0 = COPY_DOUBLE_TO_VECTOR(*(a + 0));
|
||||
|
||||
src_a4 = LD_DP(a + 4);
|
||||
src_a5 = (v2f64) __msa_splati_d((v2i64) src_a4, 1);
|
||||
|
|
|
@ -215,8 +215,7 @@ void dsolve_8x4_lt_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLONG bk)
|
|||
res_c14 -= res_c8 * src_a6;
|
||||
res_c15 -= res_c8 * src_a7;
|
||||
|
||||
src_a9 = __msa_cast_to_vector_double(*(a + 9));
|
||||
src_a9 = (v2f64) __msa_splati_d((v2i64) src_a9, 0);
|
||||
src_a9 = COPY_DOUBLE_TO_VECTOR(*(a + 9));
|
||||
src_a10 = LD_DP(a + 10);
|
||||
src_a11 = (v2f64) __msa_splati_d((v2i64) src_a10, 1);
|
||||
src_a10 = (v2f64) __msa_splati_d((v2i64) src_a10, 0);
|
||||
|
@ -280,8 +279,7 @@ void dsolve_8x4_lt_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLONG bk)
|
|||
res_c14 -= res_c10 * src_a22;
|
||||
res_c15 -= res_c10 * src_a23;
|
||||
|
||||
src_a27 = __msa_cast_to_vector_double(*(a + 27));
|
||||
src_a27 = (v2f64) __msa_splati_d((v2i64) src_a27, 0);
|
||||
src_a27 = COPY_DOUBLE_TO_VECTOR(*(a + 27));
|
||||
src_a28 = LD_DP(a + 28);
|
||||
src_a29 = (v2f64) __msa_splati_d((v2i64) src_a28, 1);
|
||||
src_a28 = (v2f64) __msa_splati_d((v2i64) src_a28, 0);
|
||||
|
@ -326,8 +324,7 @@ void dsolve_8x4_lt_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLONG bk)
|
|||
res_c14 -= res_c12 * src_a38;
|
||||
res_c15 -= res_c12 * src_a39;
|
||||
|
||||
src_a45 = __msa_cast_to_vector_double(*(a + 45));
|
||||
src_a45 = (v2f64) __msa_splati_d((v2i64) src_a45, 0);
|
||||
src_a45 = COPY_DOUBLE_TO_VECTOR(*(a + 45));
|
||||
src_a46 = LD_DP(a + 46);
|
||||
src_a47 = (v2f64) __msa_splati_d((v2i64) src_a46, 1);
|
||||
src_a46 = (v2f64) __msa_splati_d((v2i64) src_a46, 0);
|
||||
|
@ -353,8 +350,7 @@ void dsolve_8x4_lt_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLONG bk)
|
|||
ILVRL_D2_DP(res_c5, res_c4, src_c2, src_c6);
|
||||
ILVRL_D2_DP(res_c13, res_c12, src_c10, src_c14);
|
||||
|
||||
src_a63 = __msa_cast_to_vector_double(*(a + 63));
|
||||
src_a63 = (v2f64) __msa_splati_d((v2i64) src_a63, 0);
|
||||
src_a63 = COPY_DOUBLE_TO_VECTOR(*(a + 63));
|
||||
src_a54 = LD_DP(a + 54);
|
||||
src_a55 = (v2f64) __msa_splati_d((v2i64) src_a54, 1);
|
||||
src_a54 = (v2f64) __msa_splati_d((v2i64) src_a54, 0);
|
||||
|
@ -478,8 +474,7 @@ static void dsolve_8x2_lt_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLO
|
|||
res_c6 -= res_c0 * src_a6;
|
||||
res_c7 -= res_c0 * src_a7;
|
||||
|
||||
src_a9 = __msa_cast_to_vector_double(*(a + 9));
|
||||
src_a9 = (v2f64) __msa_splati_d((v2i64) src_a9, 0);
|
||||
src_a9 = COPY_DOUBLE_TO_VECTOR(*(a + 9));
|
||||
src_a10 = LD_DP(a + 10);
|
||||
src_a11 = (v2f64) __msa_splati_d((v2i64) src_a10, 1);
|
||||
src_a10 = (v2f64) __msa_splati_d((v2i64) src_a10, 0);
|
||||
|
@ -515,8 +510,7 @@ static void dsolve_8x2_lt_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLO
|
|||
res_c6 -= res_c2 * src_a22;
|
||||
res_c7 -= res_c2 * src_a23;
|
||||
|
||||
src_a27 = __msa_cast_to_vector_double(*(a + 27));
|
||||
src_a27 = (v2f64) __msa_splati_d((v2i64) src_a27, 0);
|
||||
src_a27 = COPY_DOUBLE_TO_VECTOR(*(a + 27));
|
||||
src_a28 = LD_DP(a + 28);
|
||||
src_a29 = (v2f64) __msa_splati_d((v2i64) src_a28, 1);
|
||||
src_a28 = (v2f64) __msa_splati_d((v2i64) src_a28, 0);
|
||||
|
@ -553,8 +547,7 @@ static void dsolve_8x2_lt_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLO
|
|||
res_c6 -= res_c4 * src_a38;
|
||||
res_c7 -= res_c4 * src_a39;
|
||||
|
||||
src_a45 = __msa_cast_to_vector_double(*(a + 45));
|
||||
src_a45 = (v2f64) __msa_splati_d((v2i64) src_a45, 0);
|
||||
src_a45 = COPY_DOUBLE_TO_VECTOR(*(a + 45));
|
||||
src_a46 = LD_DP(a + 46);
|
||||
src_a47 = (v2f64) __msa_splati_d((v2i64) src_a46, 1);
|
||||
src_a46 = (v2f64) __msa_splati_d((v2i64) src_a46, 0);
|
||||
|
@ -563,8 +556,7 @@ static void dsolve_8x2_lt_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLO
|
|||
res_c6 -= res_c5 * src_a46;
|
||||
res_c7 -= res_c5 * src_a47;
|
||||
|
||||
src_a63 = __msa_cast_to_vector_double(*(a + 63));
|
||||
src_a63 = (v2f64) __msa_splati_d((v2i64) src_a63, 0);
|
||||
src_a63 = COPY_DOUBLE_TO_VECTOR(*(a + 63));
|
||||
src_a54 = LD_DP(a + 54);
|
||||
src_a55 = (v2f64) __msa_splati_d((v2i64) src_a54, 1);
|
||||
src_a54 = (v2f64) __msa_splati_d((v2i64) src_a54, 0);
|
||||
|
@ -786,8 +778,7 @@ static void dsolve_4x4_lt_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLO
|
|||
res_c6 -= res_c4 * src_a2;
|
||||
res_c7 -= res_c4 * src_a3;
|
||||
|
||||
src_a5 = __msa_cast_to_vector_double(*(a + 5));
|
||||
src_a5 = (v2f64) __msa_splati_d((v2i64) src_a5, 0);
|
||||
src_a5 = COPY_DOUBLE_TO_VECTOR(*(a + 5));
|
||||
src_a6 = LD_DP(a + 6);
|
||||
src_a7 = (v2f64) __msa_splati_d((v2i64) src_a6, 1);
|
||||
src_a6 = (v2f64) __msa_splati_d((v2i64) src_a6, 0);
|
||||
|
@ -803,8 +794,7 @@ static void dsolve_4x4_lt_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLO
|
|||
src_a10 = LD_DP(a + 10);
|
||||
src_a11 = (v2f64) __msa_splati_d((v2i64) src_a10, 1);
|
||||
src_a10 = (v2f64) __msa_splati_d((v2i64) src_a10, 0);
|
||||
src_a15 = __msa_cast_to_vector_double(*(a + 15));
|
||||
src_a15 = (v2f64) __msa_splati_d((v2i64) src_a15, 0);
|
||||
src_a15 = COPY_DOUBLE_TO_VECTOR(*(a + 15));
|
||||
|
||||
res_c2 *= src_a10;
|
||||
res_c3 -= res_c2 * src_a11;
|
||||
|
@ -881,8 +871,7 @@ static void dsolve_4x2_lt_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLO
|
|||
res_c2 -= res_c0 * src_a2;
|
||||
res_c3 -= res_c0 * src_a3;
|
||||
|
||||
src_a5 = __msa_cast_to_vector_double(*(a + 5));
|
||||
src_a5 = (v2f64) __msa_splati_d((v2i64) src_a5, 0);
|
||||
src_a5 = COPY_DOUBLE_TO_VECTOR(*(a + 5));
|
||||
src_a6 = LD_DP(a + 6);
|
||||
src_a7 = (v2f64) __msa_splati_d((v2i64) src_a6, 1);
|
||||
src_a6 = (v2f64) __msa_splati_d((v2i64) src_a6, 0);
|
||||
|
@ -894,8 +883,7 @@ static void dsolve_4x2_lt_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLO
|
|||
src_a10 = LD_DP(a + 10);
|
||||
src_a11 = (v2f64) __msa_splati_d((v2i64) src_a10, 1);
|
||||
src_a10 = (v2f64) __msa_splati_d((v2i64) src_a10, 0);
|
||||
src_a15 = __msa_cast_to_vector_double(*(a + 15));
|
||||
src_a15 = (v2f64) __msa_splati_d((v2i64) src_a15, 0);
|
||||
src_a15 = COPY_DOUBLE_TO_VECTOR(*(a + 15));
|
||||
|
||||
res_c2 *= src_a10;
|
||||
res_c3 -= res_c2 * src_a11;
|
||||
|
|
|
@ -161,16 +161,14 @@ void dsolve_8x4_rn_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLONG bk)
|
|||
src_b2 = LD_DP(b + 2);
|
||||
src_b3 = (v2f64) __msa_splati_d((v2i64) src_b2, 1);
|
||||
src_b2 = (v2f64) __msa_splati_d((v2i64) src_b2, 0);
|
||||
src_b5 = __msa_cast_to_vector_double(*(b + 5));
|
||||
src_b5 = (v2f64) __msa_splati_d((v2i64) src_b5, 0);
|
||||
src_b5 = COPY_DOUBLE_TO_VECTOR(*(b + 5));
|
||||
src_b6 = LD_DP(b + 6);
|
||||
src_b7 = (v2f64) __msa_splati_d((v2i64) src_b6, 1);
|
||||
src_b6 = (v2f64) __msa_splati_d((v2i64) src_b6, 0);
|
||||
src_b10 = LD_DP(b + 10);
|
||||
src_b11 = (v2f64) __msa_splati_d((v2i64) src_b10, 1);
|
||||
src_b10 = (v2f64) __msa_splati_d((v2i64) src_b10, 0);
|
||||
src_b15 = __msa_cast_to_vector_double(*(b + 15));
|
||||
src_b15 = (v2f64) __msa_splati_d((v2i64) src_b15, 0);
|
||||
src_b15 = COPY_DOUBLE_TO_VECTOR(*(b + 15));
|
||||
|
||||
src_c0 *= src_b0;
|
||||
src_c1 *= src_b0;
|
||||
|
@ -294,8 +292,7 @@ static void dsolve_8x2_rn_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLO
|
|||
src_b0 = LD_DP(b + 0);
|
||||
src_b1 = (v2f64) __msa_splati_d((v2i64) src_b0, 1);
|
||||
src_b0 = (v2f64) __msa_splati_d((v2i64) src_b0, 0);
|
||||
src_b3 = __msa_cast_to_vector_double(*(b + 3));
|
||||
src_b3 = (v2f64) __msa_splati_d((v2i64) src_b3, 0);
|
||||
src_b3 = COPY_DOUBLE_TO_VECTOR(*(b + 3));
|
||||
|
||||
src_c0 *= src_b0;
|
||||
src_c1 *= src_b0;
|
||||
|
@ -347,8 +344,7 @@ static void dsolve_8x1_rn_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG bk)
|
|||
}
|
||||
}
|
||||
|
||||
src_b0 = __msa_cast_to_vector_double(*b);
|
||||
src_b0 = (v2f64) __msa_splati_d((v2i64) src_b0, 0);
|
||||
src_b0 = COPY_DOUBLE_TO_VECTOR(*b);
|
||||
|
||||
src_c0 *= src_b0;
|
||||
src_c1 *= src_b0;
|
||||
|
@ -407,16 +403,14 @@ static void dsolve_4x4_rn_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLO
|
|||
src_b2 = LD_DP(b + 2);
|
||||
src_b3 = (v2f64) __msa_splati_d((v2i64) src_b2, 1);
|
||||
src_b2 = (v2f64) __msa_splati_d((v2i64) src_b2, 0);
|
||||
src_b5 = __msa_cast_to_vector_double(*(b + 5));
|
||||
src_b5 = (v2f64) __msa_splati_d((v2i64) src_b5, 0);
|
||||
src_b5 = COPY_DOUBLE_TO_VECTOR(*(b + 5));
|
||||
src_b6 = LD_DP(b + 6);
|
||||
src_b7 = (v2f64) __msa_splati_d((v2i64) src_b6, 1);
|
||||
src_b6 = (v2f64) __msa_splati_d((v2i64) src_b6, 0);
|
||||
src_b10 = LD_DP(b + 10);
|
||||
src_b11 = (v2f64) __msa_splati_d((v2i64) src_b10, 1);
|
||||
src_b10 = (v2f64) __msa_splati_d((v2i64) src_b10, 0);
|
||||
src_b15 = __msa_cast_to_vector_double(*(b + 15));
|
||||
src_b15 = (v2f64) __msa_splati_d((v2i64) src_b15, 0);
|
||||
src_b15 = COPY_DOUBLE_TO_VECTOR(*(b + 15));
|
||||
|
||||
src_c0 *= src_b0;
|
||||
src_c1 *= src_b0;
|
||||
|
@ -490,8 +484,7 @@ static void dsolve_4x2_rn_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLO
|
|||
src_b0 = LD_DP(b + 0);
|
||||
src_b1 = (v2f64) __msa_splati_d((v2i64) src_b0, 1);
|
||||
src_b0 = (v2f64) __msa_splati_d((v2i64) src_b0, 0);
|
||||
src_b3 = __msa_cast_to_vector_double(*(b + 3));
|
||||
src_b3 = (v2f64) __msa_splati_d((v2i64) src_b3, 0);
|
||||
src_b3 = COPY_DOUBLE_TO_VECTOR(*(b + 3));
|
||||
|
||||
src_c0 *= src_b0;
|
||||
src_c1 *= src_b0;
|
||||
|
|
|
@ -168,11 +168,9 @@ void dsolve_8x4_rt_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLONG bk)
|
|||
src_b8 = LD_DP(b + 8);
|
||||
src_b9 = (v2f64) __msa_splati_d((v2i64) src_b8, 1);
|
||||
src_b8 = (v2f64) __msa_splati_d((v2i64) src_b8, 0);
|
||||
src_b10 = __msa_cast_to_vector_double(*(b + 10));
|
||||
src_b10 = (v2f64) __msa_splati_d((v2i64) src_b10, 0);
|
||||
src_b10 = COPY_DOUBLE_TO_VECTOR(*(b + 10));
|
||||
|
||||
src_b0 = __msa_cast_to_vector_double(*(b + 0));
|
||||
src_b0 = (v2f64) __msa_splati_d((v2i64) src_b0, 0);
|
||||
src_b0 = COPY_DOUBLE_TO_VECTOR(*(b + 0));
|
||||
src_b4 = LD_DP(b + 4);
|
||||
src_b5 = (v2f64) __msa_splati_d((v2i64) src_b4, 1);
|
||||
src_b4 = (v2f64) __msa_splati_d((v2i64) src_b4, 0);
|
||||
|
@ -298,8 +296,7 @@ static void dsolve_8x2_rt_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLO
|
|||
a -= 16;
|
||||
b -= 4;
|
||||
|
||||
src_b0 = __msa_cast_to_vector_double(*(b + 0));
|
||||
src_b0 = (v2f64) __msa_splati_d((v2i64) src_b0, 0);
|
||||
src_b0 = COPY_DOUBLE_TO_VECTOR(*(b + 0));
|
||||
src_b2 = LD_DP(b + 2);
|
||||
src_b3 = (v2f64) __msa_splati_d((v2i64) src_b2, 1);
|
||||
src_b2 = (v2f64) __msa_splati_d((v2i64) src_b2, 0);
|
||||
|
@ -377,8 +374,7 @@ static void dsolve_8x1_rt_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG bk)
|
|||
a -= 8;
|
||||
b -= 1;
|
||||
|
||||
src_b0 = __msa_cast_to_vector_double(*b);
|
||||
src_b0 = (v2f64) __msa_splati_d((v2i64) src_b0, 0);
|
||||
src_b0 = COPY_DOUBLE_TO_VECTOR(*b);
|
||||
|
||||
src_c0 *= src_b0;
|
||||
src_c1 *= src_b0;
|
||||
|
@ -445,11 +441,9 @@ static void dsolve_4x4_rt_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLO
|
|||
src_b8 = LD_DP(b + 8);
|
||||
src_b9 = (v2f64) __msa_splati_d((v2i64) src_b8, 1);
|
||||
src_b8 = (v2f64) __msa_splati_d((v2i64) src_b8, 0);
|
||||
src_b10 = __msa_cast_to_vector_double(*(b + 10));
|
||||
src_b10 = (v2f64) __msa_splati_d((v2i64) src_b10, 0);
|
||||
src_b10 = COPY_DOUBLE_TO_VECTOR(*(b + 10));
|
||||
|
||||
src_b0 = __msa_cast_to_vector_double(*(b + 0));
|
||||
src_b0 = (v2f64) __msa_splati_d((v2i64) src_b0, 0);
|
||||
src_b0 = COPY_DOUBLE_TO_VECTOR(*(b + 0));
|
||||
src_b4 = LD_DP(b + 4);
|
||||
src_b5 = (v2f64) __msa_splati_d((v2i64) src_b4, 1);
|
||||
src_b4 = (v2f64) __msa_splati_d((v2i64) src_b4, 0);
|
||||
|
@ -527,8 +521,7 @@ static void dsolve_4x2_rt_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLO
|
|||
a -= 8;
|
||||
b -= 4;
|
||||
|
||||
src_b0 = __msa_cast_to_vector_double(*(b + 0));
|
||||
src_b0 = (v2f64) __msa_splati_d((v2i64) src_b0, 0);
|
||||
src_b0 = COPY_DOUBLE_TO_VECTOR(*(b + 0));
|
||||
src_b2 = LD_DP(b + 2);
|
||||
src_b3 = (v2f64) __msa_splati_d((v2i64) src_b2, 1);
|
||||
src_b2 = (v2f64) __msa_splati_d((v2i64) src_b2, 0);
|
||||
|
|
|
@ -63,16 +63,12 @@ inline static void prefetch_load_lf(unsigned char *src)
|
|||
#define ST_DP(...) ST_D(v2f64, __VA_ARGS__)
|
||||
|
||||
#define COPY_FLOAT_TO_VECTOR(a) ( { \
|
||||
v4f32 out; \
|
||||
out = __msa_cast_to_vector_float(a); \
|
||||
out = (v4f32) __msa_splati_w((v4i32) out, 0); \
|
||||
v4f32 out = {a, a, a, a}; \
|
||||
out; \
|
||||
} )
|
||||
|
||||
#define COPY_DOUBLE_TO_VECTOR(a) ( { \
|
||||
v2f64 out; \
|
||||
out = __msa_cast_to_vector_double(a); \
|
||||
out = (v2f64) __msa_splati_d((v2i64) out, 0); \
|
||||
v2f64 out = {a, a}; \
|
||||
out; \
|
||||
} )
|
||||
|
||||
|
|
|
@ -48,11 +48,7 @@ int CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x, FLOAT *y, BLASLONG inc_y,
|
|||
{
|
||||
if ((0 == c) && (0 == s))
|
||||
{
|
||||
v4f32 zero = __msa_cast_to_vector_float(0);
|
||||
zero = (v4f32) __msa_insert_w((v4i32) zero, 0, 0.0);
|
||||
zero = (v4f32) __msa_insert_w((v4i32) zero, 1, 0.0);
|
||||
zero = (v4f32) __msa_insert_w((v4i32) zero, 2, 0.0);
|
||||
zero = (v4f32) __msa_insert_w((v4i32) zero, 3, 0.0);
|
||||
v4f32 zero = {0.0, 0.0, 0.0, 0.0};
|
||||
|
||||
/* process 4 floats */
|
||||
for (j = (n >> 2); j--;)
|
||||
|
|
|
@ -44,11 +44,7 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da, FLOAT *x,
|
|||
{
|
||||
if (0.0 == da)
|
||||
{
|
||||
v4f32 zero_v = __msa_cast_to_vector_float(0);
|
||||
zero_v = (v4f32) __msa_insert_w((v4i32) zero_v, 0, 0.0);
|
||||
zero_v = (v4f32) __msa_insert_w((v4i32) zero_v, 1, 0.0);
|
||||
zero_v = (v4f32) __msa_insert_w((v4i32) zero_v, 2, 0.0);
|
||||
zero_v = (v4f32) __msa_insert_w((v4i32) zero_v, 3, 0.0);
|
||||
v4f32 zero_v = {0.0, 0.0, 0.0, 0.0};
|
||||
|
||||
for (i = (n >> 6); i--;)
|
||||
{
|
||||
|
|
|
@ -49,9 +49,7 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i,
|
|||
{
|
||||
if ((0.0 == da_r) && (0.0 == da_i))
|
||||
{
|
||||
v2f64 zero_v = __msa_cast_to_vector_double(0);
|
||||
zero_v = (v2f64) __msa_insert_d((v2i64) zero_v, 0, 0.0);
|
||||
zero_v = (v2f64) __msa_insert_d((v2i64) zero_v, 1, 0.0);
|
||||
v2f64 zero_v = {0.0, 0.0};
|
||||
|
||||
for (i = (n >> 4); i--;)
|
||||
{
|
||||
|
@ -475,9 +473,7 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i,
|
|||
|
||||
if ((0.0 == da_r) && (0.0 == da_i))
|
||||
{
|
||||
v2f64 zero_v = __msa_cast_to_vector_double(0);
|
||||
zero_v = (v2f64) __msa_insert_d((v2i64) zero_v, 0, 0.0);
|
||||
zero_v = (v2f64) __msa_insert_d((v2i64) zero_v, 1, 0.0);
|
||||
v2f64 zero_v = {0.0, 0.0};
|
||||
|
||||
for (i = (n >> 4); i--;)
|
||||
{
|
||||
|
|
|
@ -1,64 +0,0 @@
|
|||
SAXPYKERNEL=axpy_loongson3a.S
|
||||
DAXPYKERNEL=daxpy_loongson3a_simd.S
|
||||
|
||||
SGEMVNKERNEL = gemv_n_loongson3a.c
|
||||
SGEMVTKERNEL = gemv_t_loongson3a.c
|
||||
DGEMVNKERNEL = gemv_n_loongson3a.c
|
||||
DGEMVTKERNEL = gemv_t_loongson3a.c
|
||||
CGEMVNKERNEL = zgemv_n_loongson3a.c
|
||||
CGEMVTKERNEL = zgemv_t_loongson3a.c
|
||||
ZGEMVNKERNEL = zgemv_n_loongson3a.c
|
||||
ZGEMVTKERNEL = zgemv_t_loongson3a.c
|
||||
|
||||
STRMMKERNEL = ../generic/trmmkernel_2x2.c
|
||||
DTRMMKERNEL = ../generic/trmmkernel_2x2.c
|
||||
CTRMMKERNEL = ../generic/ztrmmkernel_2x2.c
|
||||
ZTRMMKERNEL = ../generic/ztrmmkernel_2x2.c
|
||||
|
||||
SGEMMKERNEL = ../generic/gemmkernel_2x2.c
|
||||
SGEMMONCOPY = ../generic/gemm_ncopy_2.c
|
||||
SGEMMOTCOPY = ../generic/gemm_tcopy_2.c
|
||||
SGEMMONCOPYOBJ = sgemm_oncopy.o
|
||||
SGEMMOTCOPYOBJ = sgemm_otcopy.o
|
||||
|
||||
DGEMMKERNEL = ../generic/gemmkernel_2x2.c
|
||||
DGEMMONCOPY = ../generic/gemm_ncopy_2.c
|
||||
DGEMMOTCOPY = ../generic/gemm_tcopy_2.c
|
||||
DGEMMONCOPYOBJ = dgemm_oncopy.o
|
||||
DGEMMOTCOPYOBJ = dgemm_otcopy.o
|
||||
|
||||
CGEMMKERNEL = ../generic/zgemmkernel_2x2.c
|
||||
CGEMMONCOPY = ../generic/zgemm_ncopy_2.c
|
||||
CGEMMOTCOPY = ../generic/zgemm_tcopy_2.c
|
||||
CGEMMONCOPYOBJ = cgemm_oncopy.o
|
||||
CGEMMOTCOPYOBJ = cgemm_otcopy.o
|
||||
|
||||
ZGEMMKERNEL = ../generic/zgemmkernel_2x2.c
|
||||
ZGEMMONCOPY = ../generic/zgemm_ncopy_2.c
|
||||
ZGEMMOTCOPY = ../generic/zgemm_tcopy_2.c
|
||||
ZGEMMONCOPYOBJ = zgemm_oncopy.o
|
||||
ZGEMMOTCOPYOBJ = zgemm_otcopy.o
|
||||
|
||||
STRSMKERNEL_LN = ../generic/trsm_kernel_LN.c
|
||||
STRSMKERNEL_LT = ../generic/trsm_kernel_LT.c
|
||||
STRSMKERNEL_RN = ../generic/trsm_kernel_RN.c
|
||||
STRSMKERNEL_RT = ../generic/trsm_kernel_RT.c
|
||||
|
||||
DTRSMKERNEL_LN = ../generic/trsm_kernel_LN.c
|
||||
DTRSMKERNEL_LT = ../generic/trsm_kernel_LT.c
|
||||
DTRSMKERNEL_RN = ../generic/trsm_kernel_RN.c
|
||||
DTRSMKERNEL_RT = ../generic/trsm_kernel_RT.c
|
||||
|
||||
CTRSMKERNEL_LN = ../generic/trsm_kernel_LN.c
|
||||
CTRSMKERNEL_LT = ../generic/trsm_kernel_LT.c
|
||||
CTRSMKERNEL_RN = ../generic/trsm_kernel_RN.c
|
||||
CTRSMKERNEL_RT = ../generic/trsm_kernel_RT.c
|
||||
|
||||
ZTRSMKERNEL_LN = ../generic/trsm_kernel_LN.c
|
||||
ZTRSMKERNEL_LT = ../generic/trsm_kernel_LT.c
|
||||
ZTRSMKERNEL_RN = ../generic/trsm_kernel_RN.c
|
||||
ZTRSMKERNEL_RT = ../generic/trsm_kernel_RT.c
|
||||
|
||||
|
||||
|
||||
|
|
@ -16,32 +16,32 @@ SGEMMINCOPY = ../generic/gemm_ncopy_8.c
|
|||
SGEMMITCOPY = ../generic/gemm_tcopy_8.c
|
||||
SGEMMONCOPY = ../generic/gemm_ncopy_4.c
|
||||
SGEMMOTCOPY = ../generic/gemm_tcopy_4.c
|
||||
SGEMMINCOPYOBJ = sgemm_incopy.o
|
||||
SGEMMITCOPYOBJ = sgemm_itcopy.o
|
||||
SGEMMONCOPYOBJ = sgemm_oncopy.o
|
||||
SGEMMOTCOPYOBJ = sgemm_otcopy.o
|
||||
SGEMMINCOPYOBJ = sgemm_incopy$(TSUFFIX).$(SUFFIX)
|
||||
SGEMMITCOPYOBJ = sgemm_itcopy$(TSUFFIX).$(SUFFIX)
|
||||
SGEMMONCOPYOBJ = sgemm_oncopy$(TSUFFIX).$(SUFFIX)
|
||||
SGEMMOTCOPYOBJ = sgemm_otcopy$(TSUFFIX).$(SUFFIX)
|
||||
|
||||
DGEMMKERNEL = dgemm_kernel_loongson3a_4x4.S
|
||||
DGEMMONCOPY = ../generic/gemm_ncopy_4.c
|
||||
DGEMMOTCOPY = ../generic/gemm_tcopy_4.c
|
||||
DGEMMONCOPYOBJ = dgemm_oncopy.o
|
||||
DGEMMOTCOPYOBJ = dgemm_otcopy.o
|
||||
DGEMMONCOPYOBJ = dgemm_oncopy$(TSUFFIX).$(SUFFIX)
|
||||
DGEMMOTCOPYOBJ = dgemm_otcopy$(TSUFFIX).$(SUFFIX)
|
||||
|
||||
CGEMMKERNEL = cgemm_kernel_loongson3a_4x2_ps.S
|
||||
CGEMMINCOPY = ../generic/zgemm_ncopy_4.c
|
||||
CGEMMITCOPY = ../generic/zgemm_tcopy_4.c
|
||||
CGEMMONCOPY = ../generic/zgemm_ncopy_2.c
|
||||
CGEMMOTCOPY = ../generic/zgemm_tcopy_2.c
|
||||
CGEMMINCOPYOBJ = cgemm_incopy.o
|
||||
CGEMMITCOPYOBJ = cgemm_itcopy.o
|
||||
CGEMMONCOPYOBJ = cgemm_oncopy.o
|
||||
CGEMMOTCOPYOBJ = cgemm_otcopy.o
|
||||
CGEMMINCOPYOBJ = cgemm_incopy$(TSUFFIX).$(SUFFIX)
|
||||
CGEMMITCOPYOBJ = cgemm_itcopy$(TSUFFIX).$(SUFFIX)
|
||||
CGEMMONCOPYOBJ = cgemm_oncopy$(TSUFFIX).$(SUFFIX)
|
||||
CGEMMOTCOPYOBJ = cgemm_otcopy$(TSUFFIX).$(SUFFIX)
|
||||
|
||||
ZGEMMKERNEL = zgemm_kernel_loongson3a_2x2.S
|
||||
ZGEMMONCOPY = ../generic/zgemm_ncopy_2.c
|
||||
ZGEMMOTCOPY = ../generic/zgemm_tcopy_2.c
|
||||
ZGEMMONCOPYOBJ = zgemm_oncopy.o
|
||||
ZGEMMOTCOPYOBJ = zgemm_otcopy.o
|
||||
ZGEMMONCOPYOBJ = zgemm_oncopy$(TSUFFIX).$(SUFFIX)
|
||||
ZGEMMOTCOPYOBJ = zgemm_otcopy$(TSUFFIX).$(SUFFIX)
|
||||
|
||||
STRSMKERNEL_LN = ../generic/trsm_kernel_LN.c
|
||||
STRSMKERNEL_LT = ../generic/trsm_kernel_LT.c
|
||||
|
@ -64,6 +64,3 @@ ZTRSMKERNEL_RN = ../generic/trsm_kernel_RN.c
|
|||
ZTRSMKERNEL_RT = ../generic/trsm_kernel_RT.c
|
||||
|
||||
DSDOTKERNEL = ../mips/dot.c
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,192 @@
|
|||
ifdef HAVE_MSA
|
||||
SAXPYKERNEL = ../mips/saxpy_msa.c
|
||||
DAXPYKERNEL = ../mips/daxpy_msa.c
|
||||
CAXPYKERNEL = ../mips/caxpy_msa.c
|
||||
ZAXPYKERNEL = ../mips/zaxpy_msa.c
|
||||
else
|
||||
SAXPYKERNEL = axpy_loongson3a.S
|
||||
DAXPYKERNEL = daxpy_loongson3a_simd.S
|
||||
endif
|
||||
|
||||
ifdef HAVE_MSA
|
||||
SCOPYKERNEL = ../mips/scopy_msa.c
|
||||
DCOPYKERNEL = ../mips/dcopy_msa.c
|
||||
CCOPYKERNEL = ../mips/ccopy_msa.c
|
||||
ZCOPYKERNEL = ../mips/zcopy_msa.c
|
||||
endif
|
||||
|
||||
ifdef HAVE_MSA
|
||||
SDOTKERNEL = ../mips/sdot_msa.c
|
||||
DDOTKERNEL = ../mips/ddot_msa.c
|
||||
CDOTKERNEL = ../mips/cdot_msa.c
|
||||
ZDOTKERNEL = ../mips/zdot_msa.c
|
||||
endif
|
||||
DSDOTKERNEL = ../mips/dot.c
|
||||
|
||||
ifdef HAVE_MSA
|
||||
SROTKERNEL = ../mips/srot_msa.c
|
||||
DROTKERNEL = ../mips/drot_msa.c
|
||||
CROTKERNEL = ../mips/crot_msa.c
|
||||
ZROTKERNEL = ../mips/zrot_msa.c
|
||||
endif
|
||||
|
||||
ifdef HAVE_MSA
|
||||
SSCALKERNEL = ../mips/sscal_msa.c
|
||||
DSCALKERNEL = ../mips/dscal_msa.c
|
||||
CSCALKERNEL = ../mips/cscal_msa.c
|
||||
ZSCALKERNEL = ../mips/zscal_msa.c
|
||||
endif
|
||||
|
||||
ifdef HAVE_MSA
|
||||
SGEMVNKERNEL = ../mips/sgemv_n_msa.c
|
||||
DGEMVNKERNEL = ../mips/dgemv_n_msa.c
|
||||
SGEMVTKERNEL = ../mips/sgemv_t_msa.c
|
||||
DGEMVTKERNEL = ../mips/dgemv_t_msa.c
|
||||
CGEMVNKERNEL = ../mips/cgemv_n_msa.c
|
||||
CGEMVTKERNEL = ../mips/cgemv_t_msa.c
|
||||
ZGEMVNKERNEL = ../mips/zgemv_n_msa.c
|
||||
ZGEMVTKERNEL = ../mips/zgemv_t_msa.c
|
||||
else
|
||||
SGEMVNKERNEL = gemv_n_loongson3a.c
|
||||
SGEMVTKERNEL = gemv_t_loongson3a.c
|
||||
DGEMVNKERNEL = gemv_n_loongson3a.c
|
||||
DGEMVTKERNEL = gemv_t_loongson3a.c
|
||||
CGEMVNKERNEL = zgemv_n_loongson3a.c
|
||||
CGEMVTKERNEL = zgemv_t_loongson3a.c
|
||||
ZGEMVNKERNEL = zgemv_n_loongson3a.c
|
||||
ZGEMVTKERNEL = zgemv_t_loongson3a.c
|
||||
endif
|
||||
|
||||
ifdef HAVE_MSA
|
||||
SASUMKERNEL = ../mips/sasum_msa.c
|
||||
DASUMKERNEL = ../mips/dasum_msa.c
|
||||
CASUMKERNEL = ../mips/casum_msa.c
|
||||
ZASUMKERNEL = ../mips/zasum_msa.c
|
||||
endif
|
||||
|
||||
ifdef HAVE_MSA
|
||||
SSWAPKERNEL = ../mips/sswap_msa.c
|
||||
DSWAPKERNEL = ../mips/dswap_msa.c
|
||||
CSWAPKERNEL = ../mips/cswap_msa.c
|
||||
ZSWAPKERNEL = ../mips/zswap_msa.c
|
||||
endif
|
||||
|
||||
ifdef HAVE_MSA
|
||||
SGEMMKERNEL = ../mips/sgemm_kernel_8x8_msa.c
|
||||
SGEMMONCOPY = ../mips/sgemm_ncopy_8_msa.c
|
||||
SGEMMOTCOPY = ../mips/sgemm_tcopy_8_msa.c
|
||||
SGEMMONCOPYOBJ = sgemm_oncopy$(TSUFFIX).$(SUFFIX)
|
||||
SGEMMOTCOPYOBJ = sgemm_otcopy$(TSUFFIX).$(SUFFIX)
|
||||
else
|
||||
SGEMMKERNEL = sgemm_kernel_8x4_ps.S
|
||||
SGEMMINCOPY = ../generic/gemm_ncopy_8.c
|
||||
SGEMMITCOPY = ../generic/gemm_tcopy_8.c
|
||||
SGEMMONCOPY = ../generic/gemm_ncopy_4.c
|
||||
SGEMMOTCOPY = ../generic/gemm_tcopy_4.c
|
||||
SGEMMINCOPYOBJ = sgemm_incopy$(TSUFFIX).$(SUFFIX)
|
||||
SGEMMITCOPYOBJ = sgemm_itcopy$(TSUFFIX).$(SUFFIX)
|
||||
SGEMMONCOPYOBJ = sgemm_oncopy$(TSUFFIX).$(SUFFIX)
|
||||
SGEMMOTCOPYOBJ = sgemm_otcopy$(TSUFFIX).$(SUFFIX)
|
||||
endif
|
||||
|
||||
ifdef HAVE_MSA
|
||||
DGEMMKERNEL = ../mips/dgemm_kernel_8x4_msa.c
|
||||
DGEMMINCOPY = ../mips/dgemm_ncopy_8_msa.c
|
||||
DGEMMITCOPY = ../mips/dgemm_tcopy_8_msa.c
|
||||
DGEMMONCOPY = ../mips/dgemm_ncopy_4_msa.c
|
||||
DGEMMOTCOPY = ../mips/dgemm_tcopy_4_msa.c
|
||||
DGEMMINCOPYOBJ = dgemm_incopy$(TSUFFIX).$(SUFFIX)
|
||||
DGEMMITCOPYOBJ = dgemm_itcopy$(TSUFFIX).$(SUFFIX)
|
||||
DGEMMONCOPYOBJ = dgemm_oncopy$(TSUFFIX).$(SUFFIX)
|
||||
DGEMMOTCOPYOBJ = dgemm_otcopy$(TSUFFIX).$(SUFFIX)
|
||||
else
|
||||
DGEMMKERNEL = dgemm_kernel_loongson3a_4x4.S
|
||||
DGEMMONCOPY = ../generic/gemm_ncopy_4.c
|
||||
DGEMMOTCOPY = ../generic/gemm_tcopy_4.c
|
||||
DGEMMONCOPYOBJ = dgemm_oncopy$(TSUFFIX).$(SUFFIX)
|
||||
DGEMMOTCOPYOBJ = dgemm_otcopy$(TSUFFIX).$(SUFFIX)
|
||||
endif
|
||||
|
||||
ifdef HAVE_MSA
|
||||
CGEMMKERNEL = ../mips/cgemm_kernel_8x4_msa.c
|
||||
CGEMMINCOPY = ../mips/cgemm_ncopy_8_msa.c
|
||||
CGEMMITCOPY = ../mips/cgemm_tcopy_8_msa.c
|
||||
CGEMMONCOPY = ../mips/cgemm_ncopy_4_msa.c
|
||||
CGEMMOTCOPY = ../mips/cgemm_tcopy_4_msa.c
|
||||
CGEMMINCOPYOBJ = cgemm_incopy$(TSUFFIX).$(SUFFIX)
|
||||
CGEMMITCOPYOBJ = cgemm_itcopy$(TSUFFIX).$(SUFFIX)
|
||||
CGEMMONCOPYOBJ = cgemm_oncopy$(TSUFFIX).$(SUFFIX)
|
||||
CGEMMOTCOPYOBJ = cgemm_otcopy$(TSUFFIX).$(SUFFIX)
|
||||
else
|
||||
CGEMMKERNEL = cgemm_kernel_loongson3a_4x2_ps.S
|
||||
CGEMMINCOPY = ../generic/zgemm_ncopy_4.c
|
||||
CGEMMITCOPY = ../generic/zgemm_tcopy_4.c
|
||||
CGEMMONCOPY = ../generic/zgemm_ncopy_2.c
|
||||
CGEMMOTCOPY = ../generic/zgemm_tcopy_2.c
|
||||
CGEMMINCOPYOBJ = cgemm_incopy$(TSUFFIX).$(SUFFIX)
|
||||
CGEMMITCOPYOBJ = cgemm_itcopy$(TSUFFIX).$(SUFFIX)
|
||||
CGEMMONCOPYOBJ = cgemm_oncopy$(TSUFFIX).$(SUFFIX)
|
||||
CGEMMOTCOPYOBJ = cgemm_otcopy$(TSUFFIX).$(SUFFIX)
|
||||
endif
|
||||
|
||||
ifdef HAVE_MSA
|
||||
ZGEMMKERNEL = ../mips/zgemm_kernel_4x4_msa.c
|
||||
ZGEMMONCOPY = ../mips/zgemm_ncopy_4_msa.c
|
||||
ZGEMMOTCOPY = ../mips/zgemm_tcopy_4_msa.c
|
||||
ZGEMMONCOPYOBJ = zgemm_oncopy$(TSUFFIX).$(SUFFIX)
|
||||
ZGEMMOTCOPYOBJ = zgemm_otcopy$(TSUFFIX).$(SUFFIX)
|
||||
else
|
||||
ZGEMMKERNEL = zgemm_kernel_loongson3a_2x2.S
|
||||
ZGEMMONCOPY = ../generic/zgemm_ncopy_2.c
|
||||
ZGEMMOTCOPY = ../generic/zgemm_tcopy_2.c
|
||||
ZGEMMONCOPYOBJ = zgemm_oncopy$(TSUFFIX).$(SUFFIX)
|
||||
ZGEMMOTCOPYOBJ = zgemm_otcopy$(TSUFFIX).$(SUFFIX)
|
||||
endif
|
||||
|
||||
ifdef HAVE_MSA
|
||||
STRSMKERNEL_LN = ../mips/strsm_kernel_LN_8x8_msa.c
|
||||
STRSMKERNEL_LT = ../mips/strsm_kernel_LT_8x8_msa.c
|
||||
STRSMKERNEL_RN = ../mips/strsm_kernel_RN_8x8_msa.c
|
||||
STRSMKERNEL_RT = ../mips/strsm_kernel_RT_8x8_msa.c
|
||||
else
|
||||
STRSMKERNEL_LN = ../generic/trsm_kernel_LN.c
|
||||
STRSMKERNEL_LT = ../generic/trsm_kernel_LT.c
|
||||
STRSMKERNEL_RN = ../generic/trsm_kernel_RN.c
|
||||
STRSMKERNEL_RT = ../generic/trsm_kernel_RT.c
|
||||
endif
|
||||
|
||||
ifdef HAVE_MSA
|
||||
DTRSMKERNEL_LN = ../mips/dtrsm_kernel_LN_8x4_msa.c
|
||||
DTRSMKERNEL_LT = ../mips/dtrsm_kernel_LT_8x4_msa.c
|
||||
DTRSMKERNEL_RN = ../mips/dtrsm_kernel_RN_8x4_msa.c
|
||||
DTRSMKERNEL_RT = ../mips/dtrsm_kernel_RT_8x4_msa.c
|
||||
else
|
||||
DTRSMKERNEL_LN = ../generic/trsm_kernel_LN.c
|
||||
DTRSMKERNEL_LT = ../generic/trsm_kernel_LT.c
|
||||
DTRSMKERNEL_RN = ../generic/trsm_kernel_RN.c
|
||||
DTRSMKERNEL_RT = ../generic/trsm_kernel_RT.c
|
||||
endif
|
||||
|
||||
ifdef HAVE_MSA
|
||||
CTRSMKERNEL_LN = ../generic/trsm_kernel_LN.c
|
||||
CTRSMKERNEL_LT = ../generic/trsm_kernel_LT.c
|
||||
CTRSMKERNEL_RN = ../generic/trsm_kernel_RN.c
|
||||
CTRSMKERNEL_RT = ../generic/trsm_kernel_RT.c
|
||||
else
|
||||
CTRSMKERNEL_LN = ../generic/trsm_kernel_LN.c
|
||||
CTRSMKERNEL_LT = ../generic/trsm_kernel_LT.c
|
||||
CTRSMKERNEL_RN = ../generic/trsm_kernel_RN.c
|
||||
CTRSMKERNEL_RT = ../generic/trsm_kernel_RT.c
|
||||
endif
|
||||
|
||||
ifdef HAVE_MSA
|
||||
ZTRSMKERNEL_LN = ../generic/trsm_kernel_LN.c
|
||||
ZTRSMKERNEL_LT = ../generic/trsm_kernel_LT.c
|
||||
ZTRSMKERNEL_RN = ../generic/trsm_kernel_RN.c
|
||||
ZTRSMKERNEL_RT = ../generic/trsm_kernel_RT.c
|
||||
else
|
||||
ZTRSMKERNEL_LN = ../generic/trsm_kernel_LN.c
|
||||
ZTRSMKERNEL_LT = ../generic/trsm_kernel_LT.c
|
||||
ZTRSMKERNEL_RN = ../generic/trsm_kernel_RN.c
|
||||
ZTRSMKERNEL_RT = ../generic/trsm_kernel_RT.c
|
||||
endif
|
|
@ -63,15 +63,15 @@ ZGEMMOTCOPYOBJ = zgemm_otcopy$(TSUFFIX).$(SUFFIX)
|
|||
ZGEMMINCOPYOBJ = zgemm_incopy$(TSUFFIX).$(SUFFIX)
|
||||
ZGEMMITCOPYOBJ = zgemm_itcopy$(TSUFFIX).$(SUFFIX)
|
||||
|
||||
STRSMKERNEL_LN = ../generic/trsm_kernel_LN.c
|
||||
STRSMKERNEL_LT = ../generic/trsm_kernel_LT.c
|
||||
STRSMKERNEL_RN = ../generic/trsm_kernel_RN.c
|
||||
STRSMKERNEL_RT = ../generic/trsm_kernel_RT.c
|
||||
STRSMKERNEL_LN = trsm_kernel_LN_power10.c
|
||||
STRSMKERNEL_LT = trsm_kernel_LT_power10.c
|
||||
STRSMKERNEL_RN = trsm_kernel_RN_power10.c
|
||||
STRSMKERNEL_RT = trsm_kernel_RT_power10.c
|
||||
|
||||
DTRSMKERNEL_LN = ../generic/trsm_kernel_LN.c
|
||||
DTRSMKERNEL_LT = ../generic/trsm_kernel_LT.c
|
||||
DTRSMKERNEL_RN = ../generic/trsm_kernel_RN.c
|
||||
DTRSMKERNEL_RT = ../generic/trsm_kernel_RT.c
|
||||
DTRSMKERNEL_LN = trsm_kernel_LN_power10.c
|
||||
DTRSMKERNEL_LT = trsm_kernel_LT_power10.c
|
||||
DTRSMKERNEL_RN = trsm_kernel_RN_power10.c
|
||||
DTRSMKERNEL_RT = trsm_kernel_RT_power10.c
|
||||
|
||||
CTRSMKERNEL_LN = ../generic/trsm_kernel_LN.c
|
||||
CTRSMKERNEL_LT = ../generic/trsm_kernel_LT.c
|
||||
|
|
|
@ -52,15 +52,15 @@ ZGEMMOTCOPYOBJ = zgemm_otcopy$(TSUFFIX).$(SUFFIX)
|
|||
ZGEMMINCOPYOBJ = zgemm_incopy$(TSUFFIX).$(SUFFIX)
|
||||
ZGEMMITCOPYOBJ = zgemm_itcopy$(TSUFFIX).$(SUFFIX)
|
||||
|
||||
STRSMKERNEL_LN = ../generic/trsm_kernel_LN.c
|
||||
STRSMKERNEL_LT = ../generic/trsm_kernel_LT.c
|
||||
STRSMKERNEL_RN = ../generic/trsm_kernel_RN.c
|
||||
STRSMKERNEL_RT = ../generic/trsm_kernel_RT.c
|
||||
STRSMKERNEL_LN = trsm_kernel_LN_power10.c
|
||||
STRSMKERNEL_LT = trsm_kernel_LT_power10.c
|
||||
STRSMKERNEL_RN = trsm_kernel_RN_power10.c
|
||||
STRSMKERNEL_RT = trsm_kernel_RT_power10.c
|
||||
|
||||
DTRSMKERNEL_LN = ../generic/trsm_kernel_LN.c
|
||||
DTRSMKERNEL_LN = trsm_kernel_LN_power10.c
|
||||
DTRSMKERNEL_LT = dtrsm_kernel_LT_16x4_power8.S
|
||||
DTRSMKERNEL_RN = ../generic/trsm_kernel_RN.c
|
||||
DTRSMKERNEL_RT = ../generic/trsm_kernel_RT.c
|
||||
DTRSMKERNEL_RN = trsm_kernel_RN_power10.c
|
||||
DTRSMKERNEL_RT = trsm_kernel_RT_power10.c
|
||||
|
||||
CTRSMKERNEL_LN = ../generic/trsm_kernel_LN.c
|
||||
CTRSMKERNEL_LT = ../generic/trsm_kernel_LT.c
|
||||
|
|
|
@ -112,10 +112,14 @@ static void caxpy_kernel_8 (long n, float *x, float *y,
|
|||
"xvmaddasp 38, 58, 33 \n\t"
|
||||
"xvmaddasp 39, 59, 33 \n\t"
|
||||
|
||||
"stxvp 48, 0(%4) \n\t"
|
||||
"stxvp 50, 32(%4) \n\t"
|
||||
"stxvp 34, 64(%4) \n\t"
|
||||
"stxvp 38, 96(%4) \n\t"
|
||||
"stxv 49, 0(%4) \n\t"
|
||||
"stxv 48, 16(%4) \n\t"
|
||||
"stxv 51, 32(%4) \n\t"
|
||||
"stxv 50, 48(%4) \n\t"
|
||||
"stxv 35, 64(%4) \n\t"
|
||||
"stxv 34, 80(%4) \n\t"
|
||||
"stxv 39, 96(%4) \n\t"
|
||||
"stxv 38, 112(%4) \n\t"
|
||||
|
||||
"addi %4, %4, 128 \n\t"
|
||||
"xxperm 52, 40, %x10 \n\t" // exchange real and imag part
|
||||
|
@ -159,10 +163,14 @@ static void caxpy_kernel_8 (long n, float *x, float *y,
|
|||
"xvmaddasp 38, 58, 33 \n\t"
|
||||
"xvmaddasp 39, 59, 33 \n\t"
|
||||
|
||||
"stxvp 48, 0(%4) \n\t"
|
||||
"stxvp 50, 32(%4) \n\t"
|
||||
"stxvp 34, 64(%4) \n\t"
|
||||
"stxvp 38, 96(%4) \n\t"
|
||||
"stxv 49, 0(%4) \n\t"
|
||||
"stxv 48, 16(%4) \n\t"
|
||||
"stxv 51, 32(%4) \n\t"
|
||||
"stxv 50, 48(%4) \n\t"
|
||||
"stxv 35, 64(%4) \n\t"
|
||||
"stxv 34, 80(%4) \n\t"
|
||||
"stxv 39, 96(%4) \n\t"
|
||||
"stxv 38, 112(%4) \n\t"
|
||||
|
||||
"#n=%1 x=%5=%2 y=%0=%3 alpha=(%7,%8) mvecp=%6=%9 ytmp=%4\n"
|
||||
:
|
||||
|
|
|
@ -66,12 +66,19 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da, FLOAT *x, BLAS
|
|||
if ( (inc_x == 1) && (inc_y == 1) )
|
||||
{
|
||||
|
||||
BLASLONG n1 = n & -16;
|
||||
|
||||
if ( n >= 16 )
|
||||
{
|
||||
BLASLONG align = ((32 - ((uintptr_t)y & (uintptr_t)0x1F)) >> 3) & 0x3;
|
||||
for (i = 0; i < align; i++) {
|
||||
y[i] += da * x[i] ;
|
||||
}
|
||||
}
|
||||
BLASLONG n1 = (n-i) & -16;
|
||||
if ( n1 )
|
||||
daxpy_kernel_8(n1, x, y, da);
|
||||
daxpy_kernel_8(n1, &x[i], &y[i], da);
|
||||
|
||||
i += n1;
|
||||
|
||||
i = n1;
|
||||
while(i < n)
|
||||
{
|
||||
|
||||
|
|
|
@ -64,12 +64,18 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da, FLOAT *x, BLAS
|
|||
if ( (inc_x == 1) && (inc_y == 1) )
|
||||
{
|
||||
|
||||
BLASLONG n1 = n & -64;
|
||||
|
||||
if ( n >= 64 )
|
||||
{
|
||||
BLASLONG align = ((32 - ((uintptr_t)y & (uintptr_t)0x1F)) >> 2) & 0x7;
|
||||
for (i = 0; i < align; i++) {
|
||||
y[i] += da * x[i] ;
|
||||
}
|
||||
}
|
||||
BLASLONG n1 = (n-i) & -64;
|
||||
if ( n1 )
|
||||
saxpy_kernel_64(n1, x, y, da);
|
||||
saxpy_kernel_64(n1, &x[i], &y[i], da);
|
||||
|
||||
i = n1;
|
||||
i += n1;
|
||||
while(i < n)
|
||||
{
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,828 @@
|
|||
/*********************************************************************/
|
||||
/* 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"
|
||||
#include <altivec.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
|
||||
|
||||
#ifdef DOUBLE
|
||||
|
||||
static inline __attribute__ ((always_inline)) void solve8x8(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc) {
|
||||
FLOAT *c0, *c1, *c2, *c3, *c4, *c5, *c6, *c7;
|
||||
c0 = &c[0*ldc];
|
||||
c1 = &c[1*ldc];
|
||||
c2 = &c[2*ldc];
|
||||
c3 = &c[3*ldc];
|
||||
c4 = &c[4*ldc];
|
||||
c5 = &c[5*ldc];
|
||||
c6 = &c[6*ldc];
|
||||
c7 = &c[7*ldc];
|
||||
vector FLOAT *Vb = (vector FLOAT *) b;
|
||||
vector FLOAT *Vc0 = (vector FLOAT *) c0;
|
||||
vector FLOAT *Vc1 = (vector FLOAT *) c1;
|
||||
vector FLOAT *Vc2 = (vector FLOAT *) c2;
|
||||
vector FLOAT *Vc3 = (vector FLOAT *) c3;
|
||||
vector FLOAT *Vc4 = (vector FLOAT *) c4;
|
||||
vector FLOAT *Vc5 = (vector FLOAT *) c5;
|
||||
vector FLOAT *Vc6 = (vector FLOAT *) c6;
|
||||
vector FLOAT *Vc7 = (vector FLOAT *) c7;
|
||||
vector FLOAT VbS0, VbS1, VbS2, VbS3, VbS4, VbS5, VbS6;
|
||||
|
||||
a[0] = (c0[0] *= b[0]);
|
||||
a[1] = (c0[1] *= b[0]);
|
||||
a[2] = (c0[2] *= b[0]);
|
||||
a[3] = (c0[3] *= b[0]);
|
||||
a[4] = (c0[4] *= b[0]);
|
||||
a[5] = (c0[5] *= b[0]);
|
||||
a[6] = (c0[6] *= b[0]);
|
||||
a[7] = (c0[7] *= b[0]);
|
||||
VbS0 = vec_splat(Vb[0], 1);
|
||||
VbS1 = vec_splat(Vb[1], 0);
|
||||
VbS2 = vec_splat(Vb[1], 1);
|
||||
VbS3 = vec_splat(Vb[2], 0);
|
||||
VbS4 = vec_splat(Vb[2], 1);
|
||||
VbS5 = vec_splat(Vb[3], 0);
|
||||
VbS6 = vec_splat(Vb[3], 1);
|
||||
Vc1[0] = vec_nmsub(Vc0[ 0], VbS0, Vc1[0]);
|
||||
Vc1[1] = vec_nmsub(Vc0[ 1], VbS0, Vc1[1]);
|
||||
Vc1[2] = vec_nmsub(Vc0[ 2], VbS0, Vc1[2]);
|
||||
Vc1[3] = vec_nmsub(Vc0[ 3], VbS0, Vc1[3]);
|
||||
Vc2[0] = vec_nmsub(Vc0[ 0], VbS1, Vc2[0]);
|
||||
Vc2[1] = vec_nmsub(Vc0[ 1], VbS1, Vc2[1]);
|
||||
Vc2[2] = vec_nmsub(Vc0[ 2], VbS1, Vc2[2]);
|
||||
Vc2[3] = vec_nmsub(Vc0[ 3], VbS1, Vc2[3]);
|
||||
Vc3[0] = vec_nmsub(Vc0[ 0], VbS2, Vc3[0]);
|
||||
Vc3[1] = vec_nmsub(Vc0[ 1], VbS2, Vc3[1]);
|
||||
Vc3[2] = vec_nmsub(Vc0[ 2], VbS2, Vc3[2]);
|
||||
Vc3[3] = vec_nmsub(Vc0[ 3], VbS2, Vc3[3]);
|
||||
Vc4[0] = vec_nmsub(Vc0[ 0], VbS3, Vc4[0]);
|
||||
Vc4[1] = vec_nmsub(Vc0[ 1], VbS3, Vc4[1]);
|
||||
Vc4[2] = vec_nmsub(Vc0[ 2], VbS3, Vc4[2]);
|
||||
Vc4[3] = vec_nmsub(Vc0[ 3], VbS3, Vc4[3]);
|
||||
Vc5[0] = vec_nmsub(Vc0[ 0], VbS4, Vc5[0]);
|
||||
Vc5[1] = vec_nmsub(Vc0[ 1], VbS4, Vc5[1]);
|
||||
Vc5[2] = vec_nmsub(Vc0[ 2], VbS4, Vc5[2]);
|
||||
Vc5[3] = vec_nmsub(Vc0[ 3], VbS4, Vc5[3]);
|
||||
Vc6[0] = vec_nmsub(Vc0[ 0], VbS5, Vc6[0]);
|
||||
Vc6[1] = vec_nmsub(Vc0[ 1], VbS5, Vc6[1]);
|
||||
Vc6[2] = vec_nmsub(Vc0[ 2], VbS5, Vc6[2]);
|
||||
Vc6[3] = vec_nmsub(Vc0[ 3], VbS5, Vc6[3]);
|
||||
Vc7[0] = vec_nmsub(Vc0[ 0], VbS6, Vc7[0]);
|
||||
Vc7[1] = vec_nmsub(Vc0[ 1], VbS6, Vc7[1]);
|
||||
Vc7[2] = vec_nmsub(Vc0[ 2], VbS6, Vc7[2]);
|
||||
Vc7[3] = vec_nmsub(Vc0[ 3], VbS6, Vc7[3]);
|
||||
|
||||
a[ 8] = (c1[0] *= b[9]);
|
||||
a[ 9] = (c1[1] *= b[9]);
|
||||
a[10] = (c1[2] *= b[9]);
|
||||
a[11] = (c1[3] *= b[9]);
|
||||
a[12] = (c1[4] *= b[9]);
|
||||
a[13] = (c1[5] *= b[9]);
|
||||
a[14] = (c1[6] *= b[9]);
|
||||
a[15] = (c1[7] *= b[9]);
|
||||
VbS0 = vec_splat(Vb[5], 0);
|
||||
VbS1 = vec_splat(Vb[5], 1);
|
||||
VbS2 = vec_splat(Vb[6], 0);
|
||||
VbS3 = vec_splat(Vb[6], 1);
|
||||
VbS4 = vec_splat(Vb[7], 0);
|
||||
VbS5 = vec_splat(Vb[7], 1);
|
||||
Vc2[0] = vec_nmsub(Vc1[0], VbS0, Vc2[0]);
|
||||
Vc2[1] = vec_nmsub(Vc1[1], VbS0, Vc2[1]);
|
||||
Vc2[2] = vec_nmsub(Vc1[2], VbS0, Vc2[2]);
|
||||
Vc2[3] = vec_nmsub(Vc1[3], VbS0, Vc2[3]);
|
||||
Vc3[0] = vec_nmsub(Vc1[0], VbS1, Vc3[0]);
|
||||
Vc3[1] = vec_nmsub(Vc1[1], VbS1, Vc3[1]);
|
||||
Vc3[2] = vec_nmsub(Vc1[2], VbS1, Vc3[2]);
|
||||
Vc3[3] = vec_nmsub(Vc1[3], VbS1, Vc3[3]);
|
||||
Vc4[0] = vec_nmsub(Vc1[0], VbS2, Vc4[0]);
|
||||
Vc4[1] = vec_nmsub(Vc1[1], VbS2, Vc4[1]);
|
||||
Vc4[2] = vec_nmsub(Vc1[2], VbS2, Vc4[2]);
|
||||
Vc4[3] = vec_nmsub(Vc1[3], VbS2, Vc4[3]);
|
||||
Vc5[0] = vec_nmsub(Vc1[0], VbS3, Vc5[0]);
|
||||
Vc5[1] = vec_nmsub(Vc1[1], VbS3, Vc5[1]);
|
||||
Vc5[2] = vec_nmsub(Vc1[2], VbS3, Vc5[2]);
|
||||
Vc5[3] = vec_nmsub(Vc1[3], VbS3, Vc5[3]);
|
||||
Vc6[0] = vec_nmsub(Vc1[0], VbS4, Vc6[0]);
|
||||
Vc6[1] = vec_nmsub(Vc1[1], VbS4, Vc6[1]);
|
||||
Vc6[2] = vec_nmsub(Vc1[2], VbS4, Vc6[2]);
|
||||
Vc6[3] = vec_nmsub(Vc1[3], VbS4, Vc6[3]);
|
||||
Vc7[0] = vec_nmsub(Vc1[0], VbS5, Vc7[0]);
|
||||
Vc7[1] = vec_nmsub(Vc1[1], VbS5, Vc7[1]);
|
||||
Vc7[2] = vec_nmsub(Vc1[2], VbS5, Vc7[2]);
|
||||
Vc7[3] = vec_nmsub(Vc1[3], VbS5, Vc7[3]);
|
||||
|
||||
a[16] = (c2[0] *= b[18]);
|
||||
a[17] = (c2[1] *= b[18]);
|
||||
a[18] = (c2[2] *= b[18]);
|
||||
a[19] = (c2[3] *= b[18]);
|
||||
a[20] = (c2[4] *= b[18]);
|
||||
a[21] = (c2[5] *= b[18]);
|
||||
a[22] = (c2[6] *= b[18]);
|
||||
a[23] = (c2[7] *= b[18]);
|
||||
VbS0 = vec_splat(Vb[ 9], 1);
|
||||
VbS1 = vec_splat(Vb[10], 0);
|
||||
VbS2 = vec_splat(Vb[10], 1);
|
||||
VbS3 = vec_splat(Vb[11], 0);
|
||||
VbS4 = vec_splat(Vb[11], 1);
|
||||
Vc3[0] = vec_nmsub(Vc2[0], VbS0, Vc3[0]);
|
||||
Vc3[1] = vec_nmsub(Vc2[1], VbS0, Vc3[1]);
|
||||
Vc3[2] = vec_nmsub(Vc2[2], VbS0, Vc3[2]);
|
||||
Vc3[3] = vec_nmsub(Vc2[3], VbS0, Vc3[3]);
|
||||
Vc4[0] = vec_nmsub(Vc2[0], VbS1, Vc4[0]);
|
||||
Vc4[1] = vec_nmsub(Vc2[1], VbS1, Vc4[1]);
|
||||
Vc4[2] = vec_nmsub(Vc2[2], VbS1, Vc4[2]);
|
||||
Vc4[3] = vec_nmsub(Vc2[3], VbS1, Vc4[3]);
|
||||
Vc5[0] = vec_nmsub(Vc2[0], VbS2, Vc5[0]);
|
||||
Vc5[1] = vec_nmsub(Vc2[1], VbS2, Vc5[1]);
|
||||
Vc5[2] = vec_nmsub(Vc2[2], VbS2, Vc5[2]);
|
||||
Vc5[3] = vec_nmsub(Vc2[3], VbS2, Vc5[3]);
|
||||
Vc6[0] = vec_nmsub(Vc2[0], VbS3, Vc6[0]);
|
||||
Vc6[1] = vec_nmsub(Vc2[1], VbS3, Vc6[1]);
|
||||
Vc6[2] = vec_nmsub(Vc2[2], VbS3, Vc6[2]);
|
||||
Vc6[3] = vec_nmsub(Vc2[3], VbS3, Vc6[3]);
|
||||
Vc7[0] = vec_nmsub(Vc2[0], VbS4, Vc7[0]);
|
||||
Vc7[1] = vec_nmsub(Vc2[1], VbS4, Vc7[1]);
|
||||
Vc7[2] = vec_nmsub(Vc2[2], VbS4, Vc7[2]);
|
||||
Vc7[3] = vec_nmsub(Vc2[3], VbS4, Vc7[3]);
|
||||
|
||||
a[24] = (c3[0] *= b[27]);
|
||||
a[25] = (c3[1] *= b[27]);
|
||||
a[26] = (c3[2] *= b[27]);
|
||||
a[27] = (c3[3] *= b[27]);
|
||||
a[28] = (c3[4] *= b[27]);
|
||||
a[29] = (c3[5] *= b[27]);
|
||||
a[30] = (c3[6] *= b[27]);
|
||||
a[31] = (c3[7] *= b[27]);
|
||||
VbS0 = vec_splat(Vb[14], 0);
|
||||
VbS1 = vec_splat(Vb[14], 1);
|
||||
VbS2 = vec_splat(Vb[15], 0);
|
||||
VbS3 = vec_splat(Vb[15], 1);
|
||||
Vc4[0] = vec_nmsub(Vc3[0], VbS0, Vc4[0]);
|
||||
Vc4[1] = vec_nmsub(Vc3[1], VbS0, Vc4[1]);
|
||||
Vc4[2] = vec_nmsub(Vc3[2], VbS0, Vc4[2]);
|
||||
Vc4[3] = vec_nmsub(Vc3[3], VbS0, Vc4[3]);
|
||||
Vc5[0] = vec_nmsub(Vc3[0], VbS1, Vc5[0]);
|
||||
Vc5[1] = vec_nmsub(Vc3[1], VbS1, Vc5[1]);
|
||||
Vc5[2] = vec_nmsub(Vc3[2], VbS1, Vc5[2]);
|
||||
Vc5[3] = vec_nmsub(Vc3[3], VbS1, Vc5[3]);
|
||||
Vc6[0] = vec_nmsub(Vc3[0], VbS2, Vc6[0]);
|
||||
Vc6[1] = vec_nmsub(Vc3[1], VbS2, Vc6[1]);
|
||||
Vc6[2] = vec_nmsub(Vc3[2], VbS2, Vc6[2]);
|
||||
Vc6[3] = vec_nmsub(Vc3[3], VbS2, Vc6[3]);
|
||||
Vc7[0] = vec_nmsub(Vc3[0], VbS3, Vc7[0]);
|
||||
Vc7[1] = vec_nmsub(Vc3[1], VbS3, Vc7[1]);
|
||||
Vc7[2] = vec_nmsub(Vc3[2], VbS3, Vc7[2]);
|
||||
Vc7[3] = vec_nmsub(Vc3[3], VbS3, Vc7[3]);
|
||||
|
||||
a[32] = (c4[0] *= b[36]);
|
||||
a[33] = (c4[1] *= b[36]);
|
||||
a[34] = (c4[2] *= b[36]);
|
||||
a[35] = (c4[3] *= b[36]);
|
||||
a[36] = (c4[4] *= b[36]);
|
||||
a[37] = (c4[5] *= b[36]);
|
||||
a[38] = (c4[6] *= b[36]);
|
||||
a[39] = (c4[7] *= b[36]);
|
||||
VbS0 = vec_splat(Vb[18], 1);
|
||||
VbS1 = vec_splat(Vb[19], 0);
|
||||
VbS2 = vec_splat(Vb[19], 1);
|
||||
Vc5[0] = vec_nmsub(Vc4[0], VbS0, Vc5[0]);
|
||||
Vc5[1] = vec_nmsub(Vc4[1], VbS0, Vc5[1]);
|
||||
Vc5[2] = vec_nmsub(Vc4[2], VbS0, Vc5[2]);
|
||||
Vc5[3] = vec_nmsub(Vc4[3], VbS0, Vc5[3]);
|
||||
Vc6[0] = vec_nmsub(Vc4[0], VbS1, Vc6[0]);
|
||||
Vc6[1] = vec_nmsub(Vc4[1], VbS1, Vc6[1]);
|
||||
Vc6[2] = vec_nmsub(Vc4[2], VbS1, Vc6[2]);
|
||||
Vc6[3] = vec_nmsub(Vc4[3], VbS1, Vc6[3]);
|
||||
Vc7[0] = vec_nmsub(Vc4[0], VbS2, Vc7[0]);
|
||||
Vc7[1] = vec_nmsub(Vc4[1], VbS2, Vc7[1]);
|
||||
Vc7[2] = vec_nmsub(Vc4[2], VbS2, Vc7[2]);
|
||||
Vc7[3] = vec_nmsub(Vc4[3], VbS2, Vc7[3]);
|
||||
|
||||
a[40] = (c5[0] *= b[45]);
|
||||
a[41] = (c5[1] *= b[45]);
|
||||
a[42] = (c5[2] *= b[45]);
|
||||
a[43] = (c5[3] *= b[45]);
|
||||
a[44] = (c5[4] *= b[45]);
|
||||
a[45] = (c5[5] *= b[45]);
|
||||
a[46] = (c5[6] *= b[45]);
|
||||
a[47] = (c5[7] *= b[45]);
|
||||
VbS0 = vec_splat(Vb[23], 0);
|
||||
VbS1 = vec_splat(Vb[23], 1);
|
||||
Vc6[0] = vec_nmsub(Vc5[0], VbS0, Vc6[0]);
|
||||
Vc6[1] = vec_nmsub(Vc5[1], VbS0, Vc6[1]);
|
||||
Vc6[2] = vec_nmsub(Vc5[2], VbS0, Vc6[2]);
|
||||
Vc6[3] = vec_nmsub(Vc5[3], VbS0, Vc6[3]);
|
||||
Vc7[0] = vec_nmsub(Vc5[0], VbS1, Vc7[0]);
|
||||
Vc7[1] = vec_nmsub(Vc5[1], VbS1, Vc7[1]);
|
||||
Vc7[2] = vec_nmsub(Vc5[2], VbS1, Vc7[2]);
|
||||
Vc7[3] = vec_nmsub(Vc5[3], VbS1, Vc7[3]);
|
||||
|
||||
a[48] = (c6[0] *= b[54]);
|
||||
a[49] = (c6[1] *= b[54]);
|
||||
a[50] = (c6[2] *= b[54]);
|
||||
a[51] = (c6[3] *= b[54]);
|
||||
a[52] = (c6[4] *= b[54]);
|
||||
a[53] = (c6[5] *= b[54]);
|
||||
a[54] = (c6[6] *= b[54]);
|
||||
a[55] = (c6[7] *= b[54]);
|
||||
VbS0 = vec_splat(Vb[27], 1);
|
||||
Vc7[0] = vec_nmsub(Vc6[0], VbS0, Vc7[0]);
|
||||
Vc7[1] = vec_nmsub(Vc6[1], VbS0, Vc7[1]);
|
||||
Vc7[2] = vec_nmsub(Vc6[2], VbS0, Vc7[2]);
|
||||
Vc7[3] = vec_nmsub(Vc6[3], VbS0, Vc7[3]);
|
||||
|
||||
a[56] = (c7[0] *= b[63]);
|
||||
a[57] = (c7[1] *= b[63]);
|
||||
a[58] = (c7[2] *= b[63]);
|
||||
a[59] = (c7[3] *= b[63]);
|
||||
a[60] = (c7[4] *= b[63]);
|
||||
a[61] = (c7[5] *= b[63]);
|
||||
a[62] = (c7[6] *= b[63]);
|
||||
a[63] = (c7[7] *= b[63]);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static inline __attribute__ ((always_inline)) void solve16x8(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc) {
|
||||
FLOAT *c0, *c1, *c2, *c3, *c4, *c5, *c6, *c7;
|
||||
c0 = &c[0*ldc];
|
||||
c1 = &c[1*ldc];
|
||||
c2 = &c[2*ldc];
|
||||
c3 = &c[3*ldc];
|
||||
c4 = &c[4*ldc];
|
||||
c5 = &c[5*ldc];
|
||||
c6 = &c[6*ldc];
|
||||
c7 = &c[7*ldc];
|
||||
vector FLOAT *Va = (vector FLOAT *) a;
|
||||
vector FLOAT *Vb = (vector FLOAT *) b;
|
||||
vector FLOAT *Vc0 = (vector FLOAT *) c0;
|
||||
vector FLOAT *Vc1 = (vector FLOAT *) c1;
|
||||
vector FLOAT *Vc2 = (vector FLOAT *) c2;
|
||||
vector FLOAT *Vc3 = (vector FLOAT *) c3;
|
||||
vector FLOAT *Vc4 = (vector FLOAT *) c4;
|
||||
vector FLOAT *Vc5 = (vector FLOAT *) c5;
|
||||
vector FLOAT *Vc6 = (vector FLOAT *) c6;
|
||||
vector FLOAT *Vc7 = (vector FLOAT *) c7;
|
||||
vector FLOAT VbS0, VbS1, VbS2, VbS3, VbS4, VbS5, VbS6, VbS7;
|
||||
|
||||
VbS0 = vec_splat(Vb[0], 0);
|
||||
VbS1 = vec_splat(Vb[0], 1);
|
||||
VbS2 = vec_splat(Vb[0], 2);
|
||||
VbS3 = vec_splat(Vb[0], 3);
|
||||
VbS4 = vec_splat(Vb[1], 0);
|
||||
VbS5 = vec_splat(Vb[1], 1);
|
||||
VbS6 = vec_splat(Vb[1], 2);
|
||||
VbS7 = vec_splat(Vb[1], 3);
|
||||
|
||||
Vc0[ 0] = vec_mul(VbS0, Vc0[ 0]);
|
||||
Vc0[ 1] = vec_mul(VbS0, Vc0[ 1]);
|
||||
Vc0[ 2] = vec_mul(VbS0, Vc0[ 2]);
|
||||
Vc0[ 3] = vec_mul(VbS0, Vc0[ 3]);
|
||||
Va[0] = Vc0[0];
|
||||
Va[1] = Vc0[1];
|
||||
Va[2] = Vc0[2];
|
||||
Va[3] = Vc0[3];
|
||||
Vc1[0] = vec_nmsub(VbS1, Va[0], Vc1[0]);
|
||||
Vc1[1] = vec_nmsub(VbS1, Va[1], Vc1[1]);
|
||||
Vc1[2] = vec_nmsub(VbS1, Va[2], Vc1[2]);
|
||||
Vc1[3] = vec_nmsub(VbS1, Va[3], Vc1[3]);
|
||||
Vc2[0] = vec_nmsub(VbS2, Va[0], Vc2[0]);
|
||||
Vc2[1] = vec_nmsub(VbS2, Va[1], Vc2[1]);
|
||||
Vc2[2] = vec_nmsub(VbS2, Va[2], Vc2[2]);
|
||||
Vc2[3] = vec_nmsub(VbS2, Va[3], Vc2[3]);
|
||||
Vc3[0] = vec_nmsub(VbS3, Va[0], Vc3[0]);
|
||||
Vc3[1] = vec_nmsub(VbS3, Va[1], Vc3[1]);
|
||||
Vc3[2] = vec_nmsub(VbS3, Va[2], Vc3[2]);
|
||||
Vc3[3] = vec_nmsub(VbS3, Va[3], Vc3[3]);
|
||||
Vc4[0] = vec_nmsub(VbS4, Va[0], Vc4[0]);
|
||||
Vc4[1] = vec_nmsub(VbS4, Va[1], Vc4[1]);
|
||||
Vc4[2] = vec_nmsub(VbS4, Va[2], Vc4[2]);
|
||||
Vc4[3] = vec_nmsub(VbS4, Va[3], Vc4[3]);
|
||||
Vc5[0] = vec_nmsub(VbS5, Va[0], Vc5[0]);
|
||||
Vc5[1] = vec_nmsub(VbS5, Va[1], Vc5[1]);
|
||||
Vc5[2] = vec_nmsub(VbS5, Va[2], Vc5[2]);
|
||||
Vc5[3] = vec_nmsub(VbS5, Va[3], Vc5[3]);
|
||||
Vc6[0] = vec_nmsub(VbS6, Va[0], Vc6[0]);
|
||||
Vc6[1] = vec_nmsub(VbS6, Va[1], Vc6[1]);
|
||||
Vc6[2] = vec_nmsub(VbS6, Va[2], Vc6[2]);
|
||||
Vc6[3] = vec_nmsub(VbS6, Va[3], Vc6[3]);
|
||||
Vc7[0] = vec_nmsub(VbS7, Va[0], Vc7[0]);
|
||||
Vc7[1] = vec_nmsub(VbS7, Va[1], Vc7[1]);
|
||||
Vc7[2] = vec_nmsub(VbS7, Va[2], Vc7[2]);
|
||||
Vc7[3] = vec_nmsub(VbS7, Va[3], Vc7[3]);
|
||||
|
||||
VbS0 = vec_splat(Vb[2], 1);
|
||||
VbS1 = vec_splat(Vb[2], 2);
|
||||
VbS2 = vec_splat(Vb[2], 3);
|
||||
VbS3 = vec_splat(Vb[3], 0);
|
||||
VbS4 = vec_splat(Vb[3], 1);
|
||||
VbS5 = vec_splat(Vb[3], 2);
|
||||
VbS6 = vec_splat(Vb[3], 3);
|
||||
|
||||
Vc1[0] = vec_mul(VbS0, Vc1[0]);
|
||||
Vc1[1] = vec_mul(VbS0, Vc1[1]);
|
||||
Vc1[2] = vec_mul(VbS0, Vc1[2]);
|
||||
Vc1[3] = vec_mul(VbS0, Vc1[3]);
|
||||
Va[4] = Vc1[0];
|
||||
Va[5] = Vc1[1];
|
||||
Va[6] = Vc1[2];
|
||||
Va[7] = Vc1[3];
|
||||
Vc2[0] = vec_nmsub(VbS1, Va[4], Vc2[0]);
|
||||
Vc2[1] = vec_nmsub(VbS1, Va[5], Vc2[1]);
|
||||
Vc2[2] = vec_nmsub(VbS1, Va[6], Vc2[2]);
|
||||
Vc2[3] = vec_nmsub(VbS1, Va[7], Vc2[3]);
|
||||
Vc3[0] = vec_nmsub(VbS2, Va[4], Vc3[0]);
|
||||
Vc3[1] = vec_nmsub(VbS2, Va[5], Vc3[1]);
|
||||
Vc3[2] = vec_nmsub(VbS2, Va[6], Vc3[2]);
|
||||
Vc3[3] = vec_nmsub(VbS2, Va[7], Vc3[3]);
|
||||
Vc4[0] = vec_nmsub(VbS3, Va[4], Vc4[0]);
|
||||
Vc4[1] = vec_nmsub(VbS3, Va[5], Vc4[1]);
|
||||
Vc4[2] = vec_nmsub(VbS3, Va[6], Vc4[2]);
|
||||
Vc4[3] = vec_nmsub(VbS3, Va[7], Vc4[3]);
|
||||
Vc5[0] = vec_nmsub(VbS4, Va[4], Vc5[0]);
|
||||
Vc5[1] = vec_nmsub(VbS4, Va[5], Vc5[1]);
|
||||
Vc5[2] = vec_nmsub(VbS4, Va[6], Vc5[2]);
|
||||
Vc5[3] = vec_nmsub(VbS4, Va[7], Vc5[3]);
|
||||
Vc6[0] = vec_nmsub(VbS5, Va[4], Vc6[0]);
|
||||
Vc6[1] = vec_nmsub(VbS5, Va[5], Vc6[1]);
|
||||
Vc6[2] = vec_nmsub(VbS5, Va[6], Vc6[2]);
|
||||
Vc6[3] = vec_nmsub(VbS5, Va[7], Vc6[3]);
|
||||
Vc7[0] = vec_nmsub(VbS6, Va[4], Vc7[0]);
|
||||
Vc7[1] = vec_nmsub(VbS6, Va[5], Vc7[1]);
|
||||
Vc7[2] = vec_nmsub(VbS6, Va[6], Vc7[2]);
|
||||
Vc7[3] = vec_nmsub(VbS6, Va[7], Vc7[3]);
|
||||
|
||||
VbS0 = vec_splat(Vb[4], 2);
|
||||
VbS1 = vec_splat(Vb[4], 3);
|
||||
VbS2 = vec_splat(Vb[5], 0);
|
||||
VbS3 = vec_splat(Vb[5], 1);
|
||||
VbS4 = vec_splat(Vb[5], 2);
|
||||
VbS5 = vec_splat(Vb[5], 3);
|
||||
|
||||
Vc2[0] = vec_mul(VbS0, Vc2[0]);
|
||||
Vc2[1] = vec_mul(VbS0, Vc2[1]);
|
||||
Vc2[2] = vec_mul(VbS0, Vc2[2]);
|
||||
Vc2[3] = vec_mul(VbS0, Vc2[3]);
|
||||
Va[ 8] = Vc2[0];
|
||||
Va[ 9] = Vc2[1];
|
||||
Va[10] = Vc2[2];
|
||||
Va[11] = Vc2[3];
|
||||
Vc3[0] = vec_nmsub(VbS1, Va[ 8], Vc3[0]);
|
||||
Vc3[1] = vec_nmsub(VbS1, Va[ 9], Vc3[1]);
|
||||
Vc3[2] = vec_nmsub(VbS1, Va[10], Vc3[2]);
|
||||
Vc3[3] = vec_nmsub(VbS1, Va[11], Vc3[3]);
|
||||
Vc4[0] = vec_nmsub(VbS2, Va[ 8], Vc4[0]);
|
||||
Vc4[1] = vec_nmsub(VbS2, Va[ 9], Vc4[1]);
|
||||
Vc4[2] = vec_nmsub(VbS2, Va[10], Vc4[2]);
|
||||
Vc4[3] = vec_nmsub(VbS2, Va[11], Vc4[3]);
|
||||
Vc5[0] = vec_nmsub(VbS3, Va[ 8], Vc5[0]);
|
||||
Vc5[1] = vec_nmsub(VbS3, Va[ 9], Vc5[1]);
|
||||
Vc5[2] = vec_nmsub(VbS3, Va[10], Vc5[2]);
|
||||
Vc5[3] = vec_nmsub(VbS3, Va[11], Vc5[3]);
|
||||
Vc6[0] = vec_nmsub(VbS4, Va[ 8], Vc6[0]);
|
||||
Vc6[1] = vec_nmsub(VbS4, Va[ 9], Vc6[1]);
|
||||
Vc6[2] = vec_nmsub(VbS4, Va[10], Vc6[2]);
|
||||
Vc6[3] = vec_nmsub(VbS4, Va[11], Vc6[3]);
|
||||
Vc7[0] = vec_nmsub(VbS5, Va[ 8], Vc7[0]);
|
||||
Vc7[1] = vec_nmsub(VbS5, Va[ 9], Vc7[1]);
|
||||
Vc7[2] = vec_nmsub(VbS5, Va[10], Vc7[2]);
|
||||
Vc7[3] = vec_nmsub(VbS5, Va[11], Vc7[3]);
|
||||
|
||||
VbS0 = vec_splat(Vb[6], 3);
|
||||
VbS1 = vec_splat(Vb[7], 0);
|
||||
VbS2 = vec_splat(Vb[7], 1);
|
||||
VbS3 = vec_splat(Vb[7], 2);
|
||||
VbS4 = vec_splat(Vb[7], 3);
|
||||
|
||||
Vc3[0] = vec_mul(VbS0, Vc3[0]);
|
||||
Vc3[1] = vec_mul(VbS0, Vc3[1]);
|
||||
Vc3[2] = vec_mul(VbS0, Vc3[2]);
|
||||
Vc3[3] = vec_mul(VbS0, Vc3[3]);
|
||||
Va[12] = Vc3[0];
|
||||
Va[13] = Vc3[1];
|
||||
Va[14] = Vc3[2];
|
||||
Va[15] = Vc3[3];
|
||||
Vc4[0] = vec_nmsub(VbS1, Va[12], Vc4[0]);
|
||||
Vc4[1] = vec_nmsub(VbS1, Va[13], Vc4[1]);
|
||||
Vc4[2] = vec_nmsub(VbS1, Va[14], Vc4[2]);
|
||||
Vc4[3] = vec_nmsub(VbS1, Va[15], Vc4[3]);
|
||||
Vc5[0] = vec_nmsub(VbS2, Va[12], Vc5[0]);
|
||||
Vc5[1] = vec_nmsub(VbS2, Va[13], Vc5[1]);
|
||||
Vc5[2] = vec_nmsub(VbS2, Va[14], Vc5[2]);
|
||||
Vc5[3] = vec_nmsub(VbS2, Va[15], Vc5[3]);
|
||||
Vc6[0] = vec_nmsub(VbS3, Va[12], Vc6[0]);
|
||||
Vc6[1] = vec_nmsub(VbS3, Va[13], Vc6[1]);
|
||||
Vc6[2] = vec_nmsub(VbS3, Va[14], Vc6[2]);
|
||||
Vc6[3] = vec_nmsub(VbS3, Va[15], Vc6[3]);
|
||||
Vc7[0] = vec_nmsub(VbS4, Va[12], Vc7[0]);
|
||||
Vc7[1] = vec_nmsub(VbS4, Va[13], Vc7[1]);
|
||||
Vc7[2] = vec_nmsub(VbS4, Va[14], Vc7[2]);
|
||||
Vc7[3] = vec_nmsub(VbS4, Va[15], Vc7[3]);
|
||||
|
||||
VbS0 = vec_splat(Vb[9], 0);
|
||||
VbS1 = vec_splat(Vb[9], 1);
|
||||
VbS2 = vec_splat(Vb[9], 2);
|
||||
VbS3 = vec_splat(Vb[9], 3);
|
||||
|
||||
Vc4[0] = vec_mul(VbS0, Vc4[0]);
|
||||
Vc4[1] = vec_mul(VbS0, Vc4[1]);
|
||||
Vc4[2] = vec_mul(VbS0, Vc4[2]);
|
||||
Vc4[3] = vec_mul(VbS0, Vc4[3]);
|
||||
Va[16] = Vc4[0];
|
||||
Va[17] = Vc4[1];
|
||||
Va[18] = Vc4[2];
|
||||
Va[19] = Vc4[3];
|
||||
Vc5[0] = vec_nmsub(VbS1, Va[16], Vc5[0]);
|
||||
Vc5[1] = vec_nmsub(VbS1, Va[17], Vc5[1]);
|
||||
Vc5[2] = vec_nmsub(VbS1, Va[18], Vc5[2]);
|
||||
Vc5[3] = vec_nmsub(VbS1, Va[19], Vc5[3]);
|
||||
Vc6[0] = vec_nmsub(VbS2, Va[16], Vc6[0]);
|
||||
Vc6[1] = vec_nmsub(VbS2, Va[17], Vc6[1]);
|
||||
Vc6[2] = vec_nmsub(VbS2, Va[18], Vc6[2]);
|
||||
Vc6[3] = vec_nmsub(VbS2, Va[19], Vc6[3]);
|
||||
Vc7[0] = vec_nmsub(VbS3, Va[16], Vc7[0]);
|
||||
Vc7[1] = vec_nmsub(VbS3, Va[17], Vc7[1]);
|
||||
Vc7[2] = vec_nmsub(VbS3, Va[18], Vc7[2]);
|
||||
Vc7[3] = vec_nmsub(VbS3, Va[19], Vc7[3]);
|
||||
|
||||
VbS0 = vec_splat(Vb[11], 1);
|
||||
VbS1 = vec_splat(Vb[11], 2);
|
||||
VbS2 = vec_splat(Vb[11], 3);
|
||||
|
||||
Vc5[0] = vec_mul(VbS0, Vc5[0]);
|
||||
Vc5[1] = vec_mul(VbS0, Vc5[1]);
|
||||
Vc5[2] = vec_mul(VbS0, Vc5[2]);
|
||||
Vc5[3] = vec_mul(VbS0, Vc5[3]);
|
||||
Va[20] = Vc5[0];
|
||||
Va[21] = Vc5[1];
|
||||
Va[22] = Vc5[2];
|
||||
Va[23] = Vc5[3];
|
||||
Vc6[0] = vec_nmsub(VbS1, Va[20], Vc6[0]);
|
||||
Vc6[1] = vec_nmsub(VbS1, Va[21], Vc6[1]);
|
||||
Vc6[2] = vec_nmsub(VbS1, Va[22], Vc6[2]);
|
||||
Vc6[3] = vec_nmsub(VbS1, Va[23], Vc6[3]);
|
||||
Vc7[0] = vec_nmsub(VbS2, Va[20], Vc7[0]);
|
||||
Vc7[1] = vec_nmsub(VbS2, Va[21], Vc7[1]);
|
||||
Vc7[2] = vec_nmsub(VbS2, Va[22], Vc7[2]);
|
||||
Vc7[3] = vec_nmsub(VbS2, Va[23], Vc7[3]);
|
||||
|
||||
VbS0 = vec_splat(Vb[13], 2);
|
||||
VbS1 = vec_splat(Vb[13], 3);
|
||||
|
||||
Vc6[0] = vec_mul(VbS0, Vc6[0]);
|
||||
Vc6[1] = vec_mul(VbS0, Vc6[1]);
|
||||
Vc6[2] = vec_mul(VbS0, Vc6[2]);
|
||||
Vc6[3] = vec_mul(VbS0, Vc6[3]);
|
||||
Va[24] = Vc6[0];
|
||||
Va[25] = Vc6[1];
|
||||
Va[26] = Vc6[2];
|
||||
Va[27] = Vc6[3];
|
||||
Vc7[0] = vec_nmsub(VbS1, Va[24], Vc7[0]);
|
||||
Vc7[1] = vec_nmsub(VbS1, Va[25], Vc7[1]);
|
||||
Vc7[2] = vec_nmsub(VbS1, Va[26], Vc7[2]);
|
||||
Vc7[3] = vec_nmsub(VbS1, Va[27], Vc7[3]);
|
||||
|
||||
VbS0 = vec_splat(Vb[15], 3);
|
||||
|
||||
Vc7[0] = vec_mul(VbS0, Vc7[0]);
|
||||
Vc7[1] = vec_mul(VbS0, Vc7[1]);
|
||||
Vc7[2] = vec_mul(VbS0, Vc7[2]);
|
||||
Vc7[3] = vec_mul(VbS0, Vc7[3]);
|
||||
Va[28] = Vc7[0];
|
||||
Va[29] = Vc7[1];
|
||||
Va[30] = Vc7[2];
|
||||
Va[31] = Vc7[3];
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static inline __attribute__ ((always_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 __attribute__ ((always_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);
|
||||
kk = -offset;
|
||||
|
||||
#ifdef DOUBLE
|
||||
int well_aligned = (GEMM_UNROLL_M==8) && (GEMM_UNROLL_N==8) && ((((unsigned long) a) & 0x7) == 0);
|
||||
#else
|
||||
int well_aligned = (GEMM_UNROLL_M==16) && (GEMM_UNROLL_N==8) && ((((unsigned long) a) & 0x7) == 0);
|
||||
#endif
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
if (well_aligned) {
|
||||
#ifdef DOUBLE
|
||||
solve8x8(aa + kk * GEMM_UNROLL_M * COMPSIZE,
|
||||
b + kk * GEMM_UNROLL_N * COMPSIZE, cc, ldc);
|
||||
#else
|
||||
solve16x8(aa + kk * GEMM_UNROLL_M * COMPSIZE,
|
||||
b + kk * GEMM_UNROLL_N * COMPSIZE, cc, ldc);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
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;
|
||||
}
|
||||
|
||||
if (n & (GEMM_UNROLL_N - 1)) {
|
||||
|
||||
j = (GEMM_UNROLL_N >> 1);
|
||||
while (j > 0) {
|
||||
if (n & 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,855 @@
|
|||
/*********************************************************************/
|
||||
/* 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"
|
||||
#include <altivec.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
|
||||
|
||||
#ifdef DOUBLE
|
||||
|
||||
static inline __attribute__ ((always_inline)) void solve8x8(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc) {
|
||||
FLOAT *c0, *c1, *c2, *c3, *c4, *c5, *c6, *c7;
|
||||
c0 = &c[0*ldc];
|
||||
c1 = &c[1*ldc];
|
||||
c2 = &c[2*ldc];
|
||||
c3 = &c[3*ldc];
|
||||
c4 = &c[4*ldc];
|
||||
c5 = &c[5*ldc];
|
||||
c6 = &c[6*ldc];
|
||||
c7 = &c[7*ldc];
|
||||
vector FLOAT *Vb = (vector FLOAT *) b;
|
||||
vector FLOAT *Vc0 = (vector FLOAT *) c0;
|
||||
vector FLOAT *Vc1 = (vector FLOAT *) c1;
|
||||
vector FLOAT *Vc2 = (vector FLOAT *) c2;
|
||||
vector FLOAT *Vc3 = (vector FLOAT *) c3;
|
||||
vector FLOAT *Vc4 = (vector FLOAT *) c4;
|
||||
vector FLOAT *Vc5 = (vector FLOAT *) c5;
|
||||
vector FLOAT *Vc6 = (vector FLOAT *) c6;
|
||||
vector FLOAT *Vc7 = (vector FLOAT *) c7;
|
||||
vector FLOAT VbS0, VbS1, VbS2, VbS3, VbS4, VbS5, VbS6;
|
||||
|
||||
a[56] = (c7[0] *= b[63]);
|
||||
a[57] = (c7[1] *= b[63]);
|
||||
a[58] = (c7[2] *= b[63]);
|
||||
a[59] = (c7[3] *= b[63]);
|
||||
a[60] = (c7[4] *= b[63]);
|
||||
a[61] = (c7[5] *= b[63]);
|
||||
a[62] = (c7[6] *= b[63]);
|
||||
a[63] = (c7[7] *= b[63]);
|
||||
VbS0 = vec_splat(Vb[28], 0);
|
||||
VbS1 = vec_splat(Vb[28], 1);
|
||||
VbS2 = vec_splat(Vb[29], 0);
|
||||
VbS3 = vec_splat(Vb[29], 1);
|
||||
VbS4 = vec_splat(Vb[30], 0);
|
||||
VbS5 = vec_splat(Vb[30], 1);
|
||||
VbS6 = vec_splat(Vb[31], 0);
|
||||
Vc0[0] = vec_nmsub(Vc7[0], VbS0, Vc0[0]);
|
||||
Vc0[1] = vec_nmsub(Vc7[1], VbS0, Vc0[1]);
|
||||
Vc0[2] = vec_nmsub(Vc7[2], VbS0, Vc0[2]);
|
||||
Vc0[3] = vec_nmsub(Vc7[3], VbS0, Vc0[3]);
|
||||
Vc1[0] = vec_nmsub(Vc7[0], VbS1, Vc1[0]);
|
||||
Vc1[1] = vec_nmsub(Vc7[1], VbS1, Vc1[1]);
|
||||
Vc1[2] = vec_nmsub(Vc7[2], VbS1, Vc1[2]);
|
||||
Vc1[3] = vec_nmsub(Vc7[3], VbS1, Vc1[3]);
|
||||
Vc2[0] = vec_nmsub(Vc7[0], VbS2, Vc2[0]);
|
||||
Vc2[1] = vec_nmsub(Vc7[1], VbS2, Vc2[1]);
|
||||
Vc2[2] = vec_nmsub(Vc7[2], VbS2, Vc2[2]);
|
||||
Vc2[3] = vec_nmsub(Vc7[3], VbS2, Vc2[3]);
|
||||
Vc3[0] = vec_nmsub(Vc7[0], VbS3, Vc3[0]);
|
||||
Vc3[1] = vec_nmsub(Vc7[1], VbS3, Vc3[1]);
|
||||
Vc3[2] = vec_nmsub(Vc7[2], VbS3, Vc3[2]);
|
||||
Vc3[3] = vec_nmsub(Vc7[3], VbS3, Vc3[3]);
|
||||
Vc4[0] = vec_nmsub(Vc7[0], VbS4, Vc4[0]);
|
||||
Vc4[1] = vec_nmsub(Vc7[1], VbS4, Vc4[1]);
|
||||
Vc4[2] = vec_nmsub(Vc7[2], VbS4, Vc4[2]);
|
||||
Vc4[3] = vec_nmsub(Vc7[3], VbS4, Vc4[3]);
|
||||
Vc5[0] = vec_nmsub(Vc7[0], VbS5, Vc5[0]);
|
||||
Vc5[1] = vec_nmsub(Vc7[1], VbS5, Vc5[1]);
|
||||
Vc5[2] = vec_nmsub(Vc7[2], VbS5, Vc5[2]);
|
||||
Vc5[3] = vec_nmsub(Vc7[3], VbS5, Vc5[3]);
|
||||
Vc6[0] = vec_nmsub(Vc7[0], VbS6, Vc6[0]);
|
||||
Vc6[1] = vec_nmsub(Vc7[1], VbS6, Vc6[1]);
|
||||
Vc6[2] = vec_nmsub(Vc7[2], VbS6, Vc6[2]);
|
||||
Vc6[3] = vec_nmsub(Vc7[3], VbS6, Vc6[3]);
|
||||
|
||||
a[48] = (c6[0] *= b[54]);
|
||||
a[49] = (c6[1] *= b[54]);
|
||||
a[50] = (c6[2] *= b[54]);
|
||||
a[51] = (c6[3] *= b[54]);
|
||||
a[52] = (c6[4] *= b[54]);
|
||||
a[53] = (c6[5] *= b[54]);
|
||||
a[54] = (c6[6] *= b[54]);
|
||||
a[55] = (c6[7] *= b[54]);
|
||||
VbS0 = vec_splat(Vb[24], 0);
|
||||
VbS1 = vec_splat(Vb[24], 1);
|
||||
VbS2 = vec_splat(Vb[25], 0);
|
||||
VbS3 = vec_splat(Vb[25], 1);
|
||||
VbS4 = vec_splat(Vb[26], 0);
|
||||
VbS5 = vec_splat(Vb[26], 1);
|
||||
Vc0[0] = vec_nmsub(Vc6[0], VbS0, Vc0[0]);
|
||||
Vc0[1] = vec_nmsub(Vc6[1], VbS0, Vc0[1]);
|
||||
Vc0[2] = vec_nmsub(Vc6[2], VbS0, Vc0[2]);
|
||||
Vc0[3] = vec_nmsub(Vc6[3], VbS0, Vc0[3]);
|
||||
Vc1[0] = vec_nmsub(Vc6[0], VbS1, Vc1[0]);
|
||||
Vc1[1] = vec_nmsub(Vc6[1], VbS1, Vc1[1]);
|
||||
Vc1[2] = vec_nmsub(Vc6[2], VbS1, Vc1[2]);
|
||||
Vc1[3] = vec_nmsub(Vc6[3], VbS1, Vc1[3]);
|
||||
Vc2[0] = vec_nmsub(Vc6[0], VbS2, Vc2[0]);
|
||||
Vc2[1] = vec_nmsub(Vc6[1], VbS2, Vc2[1]);
|
||||
Vc2[2] = vec_nmsub(Vc6[2], VbS2, Vc2[2]);
|
||||
Vc2[3] = vec_nmsub(Vc6[3], VbS2, Vc2[3]);
|
||||
Vc3[0] = vec_nmsub(Vc6[0], VbS3, Vc3[0]);
|
||||
Vc3[1] = vec_nmsub(Vc6[1], VbS3, Vc3[1]);
|
||||
Vc3[2] = vec_nmsub(Vc6[2], VbS3, Vc3[2]);
|
||||
Vc3[3] = vec_nmsub(Vc6[3], VbS3, Vc3[3]);
|
||||
Vc4[0] = vec_nmsub(Vc6[0], VbS4, Vc4[0]);
|
||||
Vc4[1] = vec_nmsub(Vc6[1], VbS4, Vc4[1]);
|
||||
Vc4[2] = vec_nmsub(Vc6[2], VbS4, Vc4[2]);
|
||||
Vc4[3] = vec_nmsub(Vc6[3], VbS4, Vc4[3]);
|
||||
Vc5[0] = vec_nmsub(Vc6[0], VbS5, Vc5[0]);
|
||||
Vc5[1] = vec_nmsub(Vc6[1], VbS5, Vc5[1]);
|
||||
Vc5[2] = vec_nmsub(Vc6[2], VbS5, Vc5[2]);
|
||||
Vc5[3] = vec_nmsub(Vc6[3], VbS5, Vc5[3]);
|
||||
|
||||
a[40] = (c5[0] *= b[45]);
|
||||
a[41] = (c5[1] *= b[45]);
|
||||
a[42] = (c5[2] *= b[45]);
|
||||
a[43] = (c5[3] *= b[45]);
|
||||
a[44] = (c5[4] *= b[45]);
|
||||
a[45] = (c5[5] *= b[45]);
|
||||
a[46] = (c5[6] *= b[45]);
|
||||
a[47] = (c5[7] *= b[45]);
|
||||
VbS0 = vec_splat(Vb[20], 0);
|
||||
VbS1 = vec_splat(Vb[20], 1);
|
||||
VbS2 = vec_splat(Vb[21], 0);
|
||||
VbS3 = vec_splat(Vb[21], 1);
|
||||
VbS4 = vec_splat(Vb[22], 0);
|
||||
Vc0[0] = vec_nmsub(Vc5[0], VbS0, Vc0[0]);
|
||||
Vc0[1] = vec_nmsub(Vc5[1], VbS0, Vc0[1]);
|
||||
Vc0[2] = vec_nmsub(Vc5[2], VbS0, Vc0[2]);
|
||||
Vc0[3] = vec_nmsub(Vc5[3], VbS0, Vc0[3]);
|
||||
Vc1[0] = vec_nmsub(Vc5[0], VbS1, Vc1[0]);
|
||||
Vc1[1] = vec_nmsub(Vc5[1], VbS1, Vc1[1]);
|
||||
Vc1[2] = vec_nmsub(Vc5[2], VbS1, Vc1[2]);
|
||||
Vc1[3] = vec_nmsub(Vc5[3], VbS1, Vc1[3]);
|
||||
Vc2[0] = vec_nmsub(Vc5[0], VbS2, Vc2[0]);
|
||||
Vc2[1] = vec_nmsub(Vc5[1], VbS2, Vc2[1]);
|
||||
Vc2[2] = vec_nmsub(Vc5[2], VbS2, Vc2[2]);
|
||||
Vc2[3] = vec_nmsub(Vc5[3], VbS2, Vc2[3]);
|
||||
Vc3[0] = vec_nmsub(Vc5[0], VbS3, Vc3[0]);
|
||||
Vc3[1] = vec_nmsub(Vc5[1], VbS3, Vc3[1]);
|
||||
Vc3[2] = vec_nmsub(Vc5[2], VbS3, Vc3[2]);
|
||||
Vc3[3] = vec_nmsub(Vc5[3], VbS3, Vc3[3]);
|
||||
Vc4[0] = vec_nmsub(Vc5[0], VbS4, Vc4[0]);
|
||||
Vc4[1] = vec_nmsub(Vc5[1], VbS4, Vc4[1]);
|
||||
Vc4[2] = vec_nmsub(Vc5[2], VbS4, Vc4[2]);
|
||||
Vc4[3] = vec_nmsub(Vc5[3], VbS4, Vc4[3]);
|
||||
|
||||
a[32] = (c4[0] *= b[36]);
|
||||
a[33] = (c4[1] *= b[36]);
|
||||
a[34] = (c4[2] *= b[36]);
|
||||
a[35] = (c4[3] *= b[36]);
|
||||
a[36] = (c4[4] *= b[36]);
|
||||
a[37] = (c4[5] *= b[36]);
|
||||
a[38] = (c4[6] *= b[36]);
|
||||
a[39] = (c4[7] *= b[36]);
|
||||
VbS0 = vec_splat(Vb[16], 0);
|
||||
VbS1 = vec_splat(Vb[16], 1);
|
||||
VbS2 = vec_splat(Vb[17], 0);
|
||||
VbS3 = vec_splat(Vb[17], 1);
|
||||
Vc0[0] = vec_nmsub(Vc4[0], VbS0, Vc0[0]);
|
||||
Vc0[1] = vec_nmsub(Vc4[1], VbS0, Vc0[1]);
|
||||
Vc0[2] = vec_nmsub(Vc4[2], VbS0, Vc0[2]);
|
||||
Vc0[3] = vec_nmsub(Vc4[3], VbS0, Vc0[3]);
|
||||
Vc1[0] = vec_nmsub(Vc4[0], VbS1, Vc1[0]);
|
||||
Vc1[1] = vec_nmsub(Vc4[1], VbS1, Vc1[1]);
|
||||
Vc1[2] = vec_nmsub(Vc4[2], VbS1, Vc1[2]);
|
||||
Vc1[3] = vec_nmsub(Vc4[3], VbS1, Vc1[3]);
|
||||
Vc2[0] = vec_nmsub(Vc4[0], VbS2, Vc2[0]);
|
||||
Vc2[1] = vec_nmsub(Vc4[1], VbS2, Vc2[1]);
|
||||
Vc2[2] = vec_nmsub(Vc4[2], VbS2, Vc2[2]);
|
||||
Vc2[3] = vec_nmsub(Vc4[3], VbS2, Vc2[3]);
|
||||
Vc3[0] = vec_nmsub(Vc4[0], VbS3, Vc3[0]);
|
||||
Vc3[1] = vec_nmsub(Vc4[1], VbS3, Vc3[1]);
|
||||
Vc3[2] = vec_nmsub(Vc4[2], VbS3, Vc3[2]);
|
||||
Vc3[3] = vec_nmsub(Vc4[3], VbS3, Vc3[3]);
|
||||
|
||||
a[24] = (c3[0] *= b[27]);
|
||||
a[25] = (c3[1] *= b[27]);
|
||||
a[26] = (c3[2] *= b[27]);
|
||||
a[27] = (c3[3] *= b[27]);
|
||||
a[28] = (c3[4] *= b[27]);
|
||||
a[29] = (c3[5] *= b[27]);
|
||||
a[30] = (c3[6] *= b[27]);
|
||||
a[31] = (c3[7] *= b[27]);
|
||||
VbS0 = vec_splat(Vb[12], 0);
|
||||
VbS1 = vec_splat(Vb[12], 1);
|
||||
VbS2 = vec_splat(Vb[13], 0);
|
||||
Vc0[0] = vec_nmsub(Vc3[0], VbS0, Vc0[0]);
|
||||
Vc0[1] = vec_nmsub(Vc3[1], VbS0, Vc0[1]);
|
||||
Vc0[2] = vec_nmsub(Vc3[2], VbS0, Vc0[2]);
|
||||
Vc0[3] = vec_nmsub(Vc3[3], VbS0, Vc0[3]);
|
||||
Vc1[0] = vec_nmsub(Vc3[0], VbS1, Vc1[0]);
|
||||
Vc1[1] = vec_nmsub(Vc3[1], VbS1, Vc1[1]);
|
||||
Vc1[2] = vec_nmsub(Vc3[2], VbS1, Vc1[2]);
|
||||
Vc1[3] = vec_nmsub(Vc3[3], VbS1, Vc1[3]);
|
||||
Vc2[0] = vec_nmsub(Vc3[0], VbS2, Vc2[0]);
|
||||
Vc2[1] = vec_nmsub(Vc3[1], VbS2, Vc2[1]);
|
||||
Vc2[2] = vec_nmsub(Vc3[2], VbS2, Vc2[2]);
|
||||
Vc2[3] = vec_nmsub(Vc3[3], VbS2, Vc2[3]);
|
||||
|
||||
a[16] = (c2[0] *= b[18]);
|
||||
a[17] = (c2[1] *= b[18]);
|
||||
a[18] = (c2[2] *= b[18]);
|
||||
a[19] = (c2[3] *= b[18]);
|
||||
a[20] = (c2[4] *= b[18]);
|
||||
a[21] = (c2[5] *= b[18]);
|
||||
a[22] = (c2[6] *= b[18]);
|
||||
a[23] = (c2[7] *= b[18]);
|
||||
VbS0 = vec_splat(Vb[8], 0);
|
||||
VbS1 = vec_splat(Vb[8], 1);
|
||||
Vc0[0] = vec_nmsub(Vc2[0], VbS0, Vc0[0]);
|
||||
Vc0[1] = vec_nmsub(Vc2[1], VbS0, Vc0[1]);
|
||||
Vc0[2] = vec_nmsub(Vc2[2], VbS0, Vc0[2]);
|
||||
Vc0[3] = vec_nmsub(Vc2[3], VbS0, Vc0[3]);
|
||||
Vc1[0] = vec_nmsub(Vc2[0], VbS1, Vc1[0]);
|
||||
Vc1[1] = vec_nmsub(Vc2[1], VbS1, Vc1[1]);
|
||||
Vc1[2] = vec_nmsub(Vc2[2], VbS1, Vc1[2]);
|
||||
Vc1[3] = vec_nmsub(Vc2[3], VbS1, Vc1[3]);
|
||||
|
||||
a[ 8] = (c1[0] *= b[9]);
|
||||
a[ 9] = (c1[1] *= b[9]);
|
||||
a[10] = (c1[2] *= b[9]);
|
||||
a[11] = (c1[3] *= b[9]);
|
||||
a[12] = (c1[4] *= b[9]);
|
||||
a[13] = (c1[5] *= b[9]);
|
||||
a[14] = (c1[6] *= b[9]);
|
||||
a[15] = (c1[7] *= b[9]);
|
||||
VbS0 = vec_splat(Vb[4], 0);
|
||||
Vc0[0] = vec_nmsub(Vc1[0], VbS0, Vc0[0]);
|
||||
Vc0[1] = vec_nmsub(Vc1[1], VbS0, Vc0[1]);
|
||||
Vc0[2] = vec_nmsub(Vc1[2], VbS0, Vc0[2]);
|
||||
Vc0[3] = vec_nmsub(Vc1[3], VbS0, Vc0[3]);
|
||||
|
||||
a[0] = (c0[0] *= b[0]);
|
||||
a[1] = (c0[1] *= b[0]);
|
||||
a[2] = (c0[2] *= b[0]);
|
||||
a[3] = (c0[3] *= b[0]);
|
||||
a[4] = (c0[4] *= b[0]);
|
||||
a[5] = (c0[5] *= b[0]);
|
||||
a[6] = (c0[6] *= b[0]);
|
||||
a[7] = (c0[7] *= b[0]);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static inline __attribute__ ((always_inline)) void solve16x8(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc) {
|
||||
FLOAT *c0, *c1, *c2, *c3, *c4, *c5, *c6, *c7;
|
||||
c0 = &c[0*ldc];
|
||||
c1 = &c[1*ldc];
|
||||
c2 = &c[2*ldc];
|
||||
c3 = &c[3*ldc];
|
||||
c4 = &c[4*ldc];
|
||||
c5 = &c[5*ldc];
|
||||
c6 = &c[6*ldc];
|
||||
c7 = &c[7*ldc];
|
||||
|
||||
vector FLOAT *Va = (vector FLOAT *) a;
|
||||
vector FLOAT *Vb = (vector FLOAT *) b;
|
||||
vector FLOAT *Vc0 = (vector FLOAT *) c0;
|
||||
vector FLOAT *Vc1 = (vector FLOAT *) c1;
|
||||
vector FLOAT *Vc2 = (vector FLOAT *) c2;
|
||||
vector FLOAT *Vc3 = (vector FLOAT *) c3;
|
||||
vector FLOAT *Vc4 = (vector FLOAT *) c4;
|
||||
vector FLOAT *Vc5 = (vector FLOAT *) c5;
|
||||
vector FLOAT *Vc6 = (vector FLOAT *) c6;
|
||||
vector FLOAT *Vc7 = (vector FLOAT *) c7;
|
||||
vector FLOAT VbS0, VbS1, VbS2, VbS3, VbS4, VbS5, VbS6, VbS7;
|
||||
|
||||
VbS0 = vec_splat(Vb[14], 0);
|
||||
VbS1 = vec_splat(Vb[14], 1);
|
||||
VbS2 = vec_splat(Vb[14], 2);
|
||||
VbS3 = vec_splat(Vb[14], 3);
|
||||
VbS4 = vec_splat(Vb[15], 0);
|
||||
VbS5 = vec_splat(Vb[15], 1);
|
||||
VbS6 = vec_splat(Vb[15], 2);
|
||||
VbS7 = vec_splat(Vb[15], 3);
|
||||
|
||||
Vc7[0] = vec_mul(VbS7, Vc7[0]);
|
||||
Vc7[1] = vec_mul(VbS7, Vc7[1]);
|
||||
Vc7[2] = vec_mul(VbS7, Vc7[2]);
|
||||
Vc7[3] = vec_mul(VbS7, Vc7[3]);
|
||||
Va[28] = Vc7[0];
|
||||
Va[29] = Vc7[1];
|
||||
Va[30] = Vc7[2];
|
||||
Va[31] = Vc7[3];
|
||||
Vc0[0] = vec_nmsub(VbS0, Va[28], Vc0[0]);
|
||||
Vc0[1] = vec_nmsub(VbS0, Va[29], Vc0[1]);
|
||||
Vc0[2] = vec_nmsub(VbS0, Va[30], Vc0[2]);
|
||||
Vc0[3] = vec_nmsub(VbS0, Va[31], Vc0[3]);
|
||||
Vc1[0] = vec_nmsub(VbS1, Va[28], Vc1[0]);
|
||||
Vc1[1] = vec_nmsub(VbS1, Va[29], Vc1[1]);
|
||||
Vc1[2] = vec_nmsub(VbS1, Va[30], Vc1[2]);
|
||||
Vc1[3] = vec_nmsub(VbS1, Va[31], Vc1[3]);
|
||||
Vc2[0] = vec_nmsub(VbS2, Va[28], Vc2[0]);
|
||||
Vc2[1] = vec_nmsub(VbS2, Va[29], Vc2[1]);
|
||||
Vc2[2] = vec_nmsub(VbS2, Va[30], Vc2[2]);
|
||||
Vc2[3] = vec_nmsub(VbS2, Va[31], Vc2[3]);
|
||||
Vc3[0] = vec_nmsub(VbS3, Va[28], Vc3[0]);
|
||||
Vc3[1] = vec_nmsub(VbS3, Va[29], Vc3[1]);
|
||||
Vc3[2] = vec_nmsub(VbS3, Va[30], Vc3[2]);
|
||||
Vc3[3] = vec_nmsub(VbS3, Va[31], Vc3[3]);
|
||||
Vc4[0] = vec_nmsub(VbS4, Va[28], Vc4[0]);
|
||||
Vc4[1] = vec_nmsub(VbS4, Va[29], Vc4[1]);
|
||||
Vc4[2] = vec_nmsub(VbS4, Va[30], Vc4[2]);
|
||||
Vc4[3] = vec_nmsub(VbS4, Va[31], Vc4[3]);
|
||||
Vc5[0] = vec_nmsub(VbS5, Va[28], Vc5[0]);
|
||||
Vc5[1] = vec_nmsub(VbS5, Va[29], Vc5[1]);
|
||||
Vc5[2] = vec_nmsub(VbS5, Va[30], Vc5[2]);
|
||||
Vc5[3] = vec_nmsub(VbS5, Va[31], Vc5[3]);
|
||||
Vc6[0] = vec_nmsub(VbS6, Va[28], Vc6[0]);
|
||||
Vc6[1] = vec_nmsub(VbS6, Va[29], Vc6[1]);
|
||||
Vc6[2] = vec_nmsub(VbS6, Va[30], Vc6[2]);
|
||||
Vc6[3] = vec_nmsub(VbS6, Va[31], Vc6[3]);
|
||||
|
||||
VbS0 = vec_splat(Vb[12], 0);
|
||||
VbS1 = vec_splat(Vb[12], 1);
|
||||
VbS2 = vec_splat(Vb[12], 2);
|
||||
VbS3 = vec_splat(Vb[12], 3);
|
||||
VbS4 = vec_splat(Vb[13], 0);
|
||||
VbS5 = vec_splat(Vb[13], 1);
|
||||
VbS6 = vec_splat(Vb[13], 2);
|
||||
|
||||
Vc6[0] = vec_mul(VbS6, Vc6[0]);
|
||||
Vc6[1] = vec_mul(VbS6, Vc6[1]);
|
||||
Vc6[2] = vec_mul(VbS6, Vc6[2]);
|
||||
Vc6[3] = vec_mul(VbS6, Vc6[3]);
|
||||
Va[24] = Vc6[0];
|
||||
Va[25] = Vc6[1];
|
||||
Va[26] = Vc6[2];
|
||||
Va[27] = Vc6[3];
|
||||
Vc0[0] = vec_nmsub(VbS0, Va[24], Vc0[0]);
|
||||
Vc0[1] = vec_nmsub(VbS0, Va[25], Vc0[1]);
|
||||
Vc0[2] = vec_nmsub(VbS0, Va[26], Vc0[2]);
|
||||
Vc0[3] = vec_nmsub(VbS0, Va[27], Vc0[3]);
|
||||
Vc1[0] = vec_nmsub(VbS1, Va[24], Vc1[0]);
|
||||
Vc1[1] = vec_nmsub(VbS1, Va[25], Vc1[1]);
|
||||
Vc1[2] = vec_nmsub(VbS1, Va[26], Vc1[2]);
|
||||
Vc1[3] = vec_nmsub(VbS1, Va[27], Vc1[3]);
|
||||
Vc2[0] = vec_nmsub(VbS2, Va[24], Vc2[0]);
|
||||
Vc2[1] = vec_nmsub(VbS2, Va[25], Vc2[1]);
|
||||
Vc2[2] = vec_nmsub(VbS2, Va[26], Vc2[2]);
|
||||
Vc2[3] = vec_nmsub(VbS2, Va[27], Vc2[3]);
|
||||
Vc3[0] = vec_nmsub(VbS3, Va[24], Vc3[0]);
|
||||
Vc3[1] = vec_nmsub(VbS3, Va[25], Vc3[1]);
|
||||
Vc3[2] = vec_nmsub(VbS3, Va[26], Vc3[2]);
|
||||
Vc3[3] = vec_nmsub(VbS3, Va[27], Vc3[3]);
|
||||
Vc4[0] = vec_nmsub(VbS4, Va[24], Vc4[0]);
|
||||
Vc4[1] = vec_nmsub(VbS4, Va[25], Vc4[1]);
|
||||
Vc4[2] = vec_nmsub(VbS4, Va[26], Vc4[2]);
|
||||
Vc4[3] = vec_nmsub(VbS4, Va[27], Vc4[3]);
|
||||
Vc5[0] = vec_nmsub(VbS5, Va[24], Vc5[0]);
|
||||
Vc5[1] = vec_nmsub(VbS5, Va[25], Vc5[1]);
|
||||
Vc5[2] = vec_nmsub(VbS5, Va[26], Vc5[2]);
|
||||
Vc5[3] = vec_nmsub(VbS5, Va[27], Vc5[3]);
|
||||
|
||||
VbS0 = vec_splat(Vb[10], 0);
|
||||
VbS1 = vec_splat(Vb[10], 1);
|
||||
VbS2 = vec_splat(Vb[10], 2);
|
||||
VbS3 = vec_splat(Vb[10], 3);
|
||||
VbS4 = vec_splat(Vb[11], 0);
|
||||
VbS5 = vec_splat(Vb[11], 1);
|
||||
|
||||
Vc5[0] = vec_mul(VbS5, Vc5[0]);
|
||||
Vc5[1] = vec_mul(VbS5, Vc5[1]);
|
||||
Vc5[2] = vec_mul(VbS5, Vc5[2]);
|
||||
Vc5[3] = vec_mul(VbS5, Vc5[3]);
|
||||
Va[20] = Vc5[0];
|
||||
Va[21] = Vc5[1];
|
||||
Va[22] = Vc5[2];
|
||||
Va[23] = Vc5[3];
|
||||
Vc0[0] = vec_nmsub(VbS0, Va[20], Vc0[0]);
|
||||
Vc0[1] = vec_nmsub(VbS0, Va[21], Vc0[1]);
|
||||
Vc0[2] = vec_nmsub(VbS0, Va[22], Vc0[2]);
|
||||
Vc0[3] = vec_nmsub(VbS0, Va[23], Vc0[3]);
|
||||
Vc1[0] = vec_nmsub(VbS1, Va[20], Vc1[0]);
|
||||
Vc1[1] = vec_nmsub(VbS1, Va[21], Vc1[1]);
|
||||
Vc1[2] = vec_nmsub(VbS1, Va[22], Vc1[2]);
|
||||
Vc1[3] = vec_nmsub(VbS1, Va[23], Vc1[3]);
|
||||
Vc2[0] = vec_nmsub(VbS2, Va[20], Vc2[0]);
|
||||
Vc2[1] = vec_nmsub(VbS2, Va[21], Vc2[1]);
|
||||
Vc2[2] = vec_nmsub(VbS2, Va[22], Vc2[2]);
|
||||
Vc2[3] = vec_nmsub(VbS2, Va[23], Vc2[3]);
|
||||
Vc3[0] = vec_nmsub(VbS3, Va[20], Vc3[0]);
|
||||
Vc3[1] = vec_nmsub(VbS3, Va[21], Vc3[1]);
|
||||
Vc3[2] = vec_nmsub(VbS3, Va[22], Vc3[2]);
|
||||
Vc3[3] = vec_nmsub(VbS3, Va[23], Vc3[3]);
|
||||
Vc4[0] = vec_nmsub(VbS4, Va[20], Vc4[0]);
|
||||
Vc4[1] = vec_nmsub(VbS4, Va[21], Vc4[1]);
|
||||
Vc4[2] = vec_nmsub(VbS4, Va[22], Vc4[2]);
|
||||
Vc4[3] = vec_nmsub(VbS4, Va[23], Vc4[3]);
|
||||
|
||||
VbS0 = vec_splat(Vb[8], 0);
|
||||
VbS1 = vec_splat(Vb[8], 1);
|
||||
VbS2 = vec_splat(Vb[8], 2);
|
||||
VbS3 = vec_splat(Vb[8], 3);
|
||||
VbS4 = vec_splat(Vb[9], 0);
|
||||
|
||||
Vc4[0] = vec_mul(VbS4, Vc4[0]);
|
||||
Vc4[1] = vec_mul(VbS4, Vc4[1]);
|
||||
Vc4[2] = vec_mul(VbS4, Vc4[2]);
|
||||
Vc4[3] = vec_mul(VbS4, Vc4[3]);
|
||||
Va[16] = Vc4[0];
|
||||
Va[17] = Vc4[1];
|
||||
Va[18] = Vc4[2];
|
||||
Va[19] = Vc4[3];
|
||||
Vc0[0] = vec_nmsub(VbS0, Va[16], Vc0[0]);
|
||||
Vc0[1] = vec_nmsub(VbS0, Va[17], Vc0[1]);
|
||||
Vc0[2] = vec_nmsub(VbS0, Va[18], Vc0[2]);
|
||||
Vc0[3] = vec_nmsub(VbS0, Va[19], Vc0[3]);
|
||||
Vc1[0] = vec_nmsub(VbS1, Va[16], Vc1[0]);
|
||||
Vc1[1] = vec_nmsub(VbS1, Va[17], Vc1[1]);
|
||||
Vc1[2] = vec_nmsub(VbS1, Va[18], Vc1[2]);
|
||||
Vc1[3] = vec_nmsub(VbS1, Va[19], Vc1[3]);
|
||||
Vc2[0] = vec_nmsub(VbS2, Va[16], Vc2[0]);
|
||||
Vc2[1] = vec_nmsub(VbS2, Va[17], Vc2[1]);
|
||||
Vc2[2] = vec_nmsub(VbS2, Va[18], Vc2[2]);
|
||||
Vc2[3] = vec_nmsub(VbS2, Va[19], Vc2[3]);
|
||||
Vc3[0] = vec_nmsub(VbS3, Va[16], Vc3[0]);
|
||||
Vc3[1] = vec_nmsub(VbS3, Va[17], Vc3[1]);
|
||||
Vc3[2] = vec_nmsub(VbS3, Va[18], Vc3[2]);
|
||||
Vc3[3] = vec_nmsub(VbS3, Va[19], Vc3[3]);
|
||||
|
||||
VbS0 = vec_splat(Vb[6], 0);
|
||||
VbS1 = vec_splat(Vb[6], 1);
|
||||
VbS2 = vec_splat(Vb[6], 2);
|
||||
VbS3 = vec_splat(Vb[6], 3);
|
||||
|
||||
Vc3[0] = vec_mul(VbS3, Vc3[0]);
|
||||
Vc3[1] = vec_mul(VbS3, Vc3[1]);
|
||||
Vc3[2] = vec_mul(VbS3, Vc3[2]);
|
||||
Vc3[3] = vec_mul(VbS3, Vc3[3]);
|
||||
Va[12] = Vc3[0];
|
||||
Va[13] = Vc3[1];
|
||||
Va[14] = Vc3[2];
|
||||
Va[15] = Vc3[3];
|
||||
Vc0[0] = vec_nmsub(VbS0, Va[12], Vc0[0]);
|
||||
Vc0[1] = vec_nmsub(VbS0, Va[13], Vc0[1]);
|
||||
Vc0[2] = vec_nmsub(VbS0, Va[14], Vc0[2]);
|
||||
Vc0[3] = vec_nmsub(VbS0, Va[15], Vc0[3]);
|
||||
Vc1[0] = vec_nmsub(VbS1, Va[12], Vc1[0]);
|
||||
Vc1[1] = vec_nmsub(VbS1, Va[13], Vc1[1]);
|
||||
Vc1[2] = vec_nmsub(VbS1, Va[14], Vc1[2]);
|
||||
Vc1[3] = vec_nmsub(VbS1, Va[15], Vc1[3]);
|
||||
Vc2[0] = vec_nmsub(VbS2, Va[12], Vc2[0]);
|
||||
Vc2[1] = vec_nmsub(VbS2, Va[13], Vc2[1]);
|
||||
Vc2[2] = vec_nmsub(VbS2, Va[14], Vc2[2]);
|
||||
Vc2[3] = vec_nmsub(VbS2, Va[15], Vc2[3]);
|
||||
|
||||
VbS0 = vec_splat(Vb[4], 0);
|
||||
VbS1 = vec_splat(Vb[4], 1);
|
||||
VbS2 = vec_splat(Vb[4], 2);
|
||||
|
||||
Vc2[0] = vec_mul(VbS2, Vc2[0]);
|
||||
Vc2[1] = vec_mul(VbS2, Vc2[1]);
|
||||
Vc2[2] = vec_mul(VbS2, Vc2[2]);
|
||||
Vc2[3] = vec_mul(VbS2, Vc2[3]);
|
||||
Va[ 8] = Vc2[0];
|
||||
Va[ 9] = Vc2[1];
|
||||
Va[10] = Vc2[2];
|
||||
Va[11] = Vc2[3];
|
||||
Vc0[0] = vec_nmsub(VbS0, Va[ 8], Vc0[0]);
|
||||
Vc0[1] = vec_nmsub(VbS0, Va[ 9], Vc0[1]);
|
||||
Vc0[2] = vec_nmsub(VbS0, Va[10], Vc0[2]);
|
||||
Vc0[3] = vec_nmsub(VbS0, Va[11], Vc0[3]);
|
||||
Vc1[0] = vec_nmsub(VbS1, Va[ 8], Vc1[0]);
|
||||
Vc1[1] = vec_nmsub(VbS1, Va[ 9], Vc1[1]);
|
||||
Vc1[2] = vec_nmsub(VbS1, Va[10], Vc1[2]);
|
||||
Vc1[3] = vec_nmsub(VbS1, Va[11], Vc1[3]);
|
||||
|
||||
VbS0 = vec_splat(Vb[2], 0);
|
||||
VbS1 = vec_splat(Vb[2], 1);
|
||||
|
||||
Vc1[0] = vec_mul(VbS1, Vc1[0]);
|
||||
Vc1[1] = vec_mul(VbS1, Vc1[1]);
|
||||
Vc1[2] = vec_mul(VbS1, Vc1[2]);
|
||||
Vc1[3] = vec_mul(VbS1, Vc1[3]);
|
||||
Va[4] = Vc1[0];
|
||||
Va[5] = Vc1[1];
|
||||
Va[6] = Vc1[2];
|
||||
Va[7] = Vc1[3];
|
||||
Vc0[0] = vec_nmsub(VbS0, Va[4], Vc0[0]);
|
||||
Vc0[1] = vec_nmsub(VbS0, Va[5], Vc0[1]);
|
||||
Vc0[2] = vec_nmsub(VbS0, Va[6], Vc0[2]);
|
||||
Vc0[3] = vec_nmsub(VbS0, Va[7], Vc0[3]);
|
||||
|
||||
VbS0 = vec_splat(Vb[0], 0);
|
||||
|
||||
Vc0[0] = vec_mul(VbS0, Vc0[0]);
|
||||
Vc0[1] = vec_mul(VbS0, Vc0[1]);
|
||||
Vc0[2] = vec_mul(VbS0, Vc0[2]);
|
||||
Vc0[3] = vec_mul(VbS0, Vc0[3]);
|
||||
Va[0] = Vc0[0];
|
||||
Va[1] = Vc0[1];
|
||||
Va[2] = Vc0[2];
|
||||
Va[3] = Vc0[3];
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static inline __attribute__ ((always_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 __attribute__ ((always_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
|
||||
|
||||
#ifdef DOUBLE
|
||||
int well_aligned = (GEMM_UNROLL_M==8) && (GEMM_UNROLL_N==8) && ((((unsigned long) a) & 0x7) == 0);
|
||||
#else
|
||||
int well_aligned = (GEMM_UNROLL_M==16) && (GEMM_UNROLL_N==8) && ((((unsigned long) a) & 0x7) == 0);
|
||||
#endif
|
||||
|
||||
kk = n - offset;
|
||||
c += n * ldc * COMPSIZE;
|
||||
b += n * k * COMPSIZE;
|
||||
|
||||
if (n & (GEMM_UNROLL_N - 1)) {
|
||||
|
||||
j = 1;
|
||||
while (j < GEMM_UNROLL_N) {
|
||||
if (n & 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);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
if (well_aligned) {
|
||||
#ifdef DOUBLE
|
||||
solve8x8(aa + (kk - GEMM_UNROLL_N) * GEMM_UNROLL_M * COMPSIZE,
|
||||
b + (kk - GEMM_UNROLL_N) * GEMM_UNROLL_N * COMPSIZE, cc, ldc);
|
||||
#else
|
||||
solve16x8(aa + (kk - GEMM_UNROLL_N) * GEMM_UNROLL_M * COMPSIZE,
|
||||
b + (kk - GEMM_UNROLL_N) * GEMM_UNROLL_N * COMPSIZE, cc, ldc);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
@ -933,6 +933,77 @@ static void init_parameter(void) {
|
|||
|
||||
}
|
||||
#else // (ARCH_ARM64)
|
||||
#if defined(ARCH_MIPS64)
|
||||
static void init_parameter(void) {
|
||||
TABLE_NAME.sgemm_p = SGEMM_DEFAULT_P;
|
||||
TABLE_NAME.dgemm_p = DGEMM_DEFAULT_P;
|
||||
TABLE_NAME.cgemm_p = CGEMM_DEFAULT_P;
|
||||
TABLE_NAME.zgemm_p = ZGEMM_DEFAULT_P;
|
||||
|
||||
TABLE_NAME.sgemm_q = SGEMM_DEFAULT_Q;
|
||||
TABLE_NAME.dgemm_q = DGEMM_DEFAULT_Q;
|
||||
TABLE_NAME.cgemm_q = CGEMM_DEFAULT_Q;
|
||||
TABLE_NAME.zgemm_q = ZGEMM_DEFAULT_Q;
|
||||
|
||||
TABLE_NAME.sgemm_r = SGEMM_DEFAULT_R;
|
||||
TABLE_NAME.dgemm_r = 640;
|
||||
TABLE_NAME.cgemm_r = CGEMM_DEFAULT_R;
|
||||
TABLE_NAME.zgemm_r = ZGEMM_DEFAULT_R;
|
||||
|
||||
#ifdef EXPRECISION
|
||||
TABLE_NAME.qgemm_p = QGEMM_DEFAULT_P;
|
||||
TABLE_NAME.xgemm_p = XGEMM_DEFAULT_P;
|
||||
TABLE_NAME.qgemm_q = QGEMM_DEFAULT_Q;
|
||||
TABLE_NAME.xgemm_q = XGEMM_DEFAULT_Q;
|
||||
TABLE_NAME.qgemm_r = QGEMM_DEFAULT_R;
|
||||
TABLE_NAME.xgemm_r = XGEMM_DEFAULT_R;
|
||||
#endif
|
||||
|
||||
#if defined(USE_GEMM3M)
|
||||
#ifdef CGEMM3M_DEFAULT_P
|
||||
TABLE_NAME.cgemm3m_p = CGEMM3M_DEFAULT_P;
|
||||
#else
|
||||
TABLE_NAME.cgemm3m_p = TABLE_NAME.sgemm_p;
|
||||
#endif
|
||||
|
||||
#ifdef ZGEMM3M_DEFAULT_P
|
||||
TABLE_NAME.zgemm3m_p = ZGEMM3M_DEFAULT_P;
|
||||
#else
|
||||
TABLE_NAME.zgemm3m_p = TABLE_NAME.dgemm_p;
|
||||
#endif
|
||||
|
||||
#ifdef CGEMM3M_DEFAULT_Q
|
||||
TABLE_NAME.cgemm3m_q = CGEMM3M_DEFAULT_Q;
|
||||
#else
|
||||
TABLE_NAME.cgemm3m_q = TABLE_NAME.sgemm_q;
|
||||
#endif
|
||||
|
||||
#ifdef ZGEMM3M_DEFAULT_Q
|
||||
TABLE_NAME.zgemm3m_q = ZGEMM3M_DEFAULT_Q;
|
||||
#else
|
||||
TABLE_NAME.zgemm3m_q = TABLE_NAME.dgemm_q;
|
||||
#endif
|
||||
|
||||
#ifdef CGEMM3M_DEFAULT_R
|
||||
TABLE_NAME.cgemm3m_r = CGEMM3M_DEFAULT_R;
|
||||
#else
|
||||
TABLE_NAME.cgemm3m_r = TABLE_NAME.sgemm_r;
|
||||
#endif
|
||||
|
||||
#ifdef ZGEMM3M_DEFAULT_R
|
||||
TABLE_NAME.zgemm3m_r = ZGEMM3M_DEFAULT_R;
|
||||
#else
|
||||
TABLE_NAME.zgemm3m_r = TABLE_NAME.dgemm_r;
|
||||
#endif
|
||||
|
||||
#ifdef EXPRECISION
|
||||
TABLE_NAME.xgemm3m_p = TABLE_NAME.qgemm_p;
|
||||
TABLE_NAME.xgemm3m_q = TABLE_NAME.qgemm_q;
|
||||
TABLE_NAME.xgemm3m_r = TABLE_NAME.qgemm_r;
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
#else // (ARCH_MIPS64)
|
||||
#if (ARCH_POWER)
|
||||
static void init_parameter(void) {
|
||||
|
||||
|
@ -1780,4 +1851,5 @@ static void init_parameter(void) {
|
|||
}
|
||||
#endif //POWER
|
||||
#endif //ZARCH
|
||||
#endif //(ARCH_MIPS64)
|
||||
#endif //(ARCH_ARM64)
|
||||
|
|
106
param.h
106
param.h
|
@ -644,9 +644,10 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
#define CGEMM_DEFAULT_UNROLL_N 2
|
||||
#define ZGEMM_DEFAULT_UNROLL_N 2
|
||||
#define XGEMM_DEFAULT_UNROLL_N 1
|
||||
|
||||
/*
|
||||
#define SGEMM_DEFAULT_UNROLL_MN 32
|
||||
#define DGEMM_DEFAULT_UNROLL_MN 32
|
||||
*/
|
||||
#endif
|
||||
|
||||
#ifdef ARCH_X86
|
||||
|
@ -1552,9 +1553,10 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
#define CGEMM_DEFAULT_UNROLL_N 2
|
||||
#define ZGEMM_DEFAULT_UNROLL_N 2
|
||||
#define XGEMM_DEFAULT_UNROLL_N 1
|
||||
|
||||
/*
|
||||
#define SGEMM_DEFAULT_UNROLL_MN 32
|
||||
#define DGEMM_DEFAULT_UNROLL_MN 32
|
||||
*/
|
||||
#endif
|
||||
|
||||
#ifdef ARCH_X86
|
||||
|
@ -2570,8 +2572,63 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
#define SYMV_P 16
|
||||
#endif
|
||||
|
||||
#ifdef LOONGSON3A
|
||||
/*Copy from SICORTEX*/
|
||||
#if defined(LOONGSON3R4)
|
||||
#define SNUMOPT 2
|
||||
#define DNUMOPT 2
|
||||
|
||||
#define GEMM_DEFAULT_OFFSET_A 0
|
||||
#define GEMM_DEFAULT_OFFSET_B 0
|
||||
#define GEMM_DEFAULT_ALIGN 0x03fffUL
|
||||
|
||||
#ifdef HAVE_MSA
|
||||
#define SGEMM_DEFAULT_UNROLL_M 8
|
||||
#define SGEMM_DEFAULT_UNROLL_N 8
|
||||
|
||||
#define DGEMM_DEFAULT_UNROLL_M 8
|
||||
#define DGEMM_DEFAULT_UNROLL_N 4
|
||||
|
||||
#define CGEMM_DEFAULT_UNROLL_M 8
|
||||
#define CGEMM_DEFAULT_UNROLL_N 4
|
||||
|
||||
#define ZGEMM_DEFAULT_UNROLL_M 4
|
||||
#define ZGEMM_DEFAULT_UNROLL_N 4
|
||||
#else
|
||||
#define SGEMM_DEFAULT_UNROLL_M 8
|
||||
#define SGEMM_DEFAULT_UNROLL_N 4
|
||||
|
||||
#define DGEMM_DEFAULT_UNROLL_M 4
|
||||
#define DGEMM_DEFAULT_UNROLL_N 4
|
||||
|
||||
#define CGEMM_DEFAULT_UNROLL_M 4
|
||||
#define CGEMM_DEFAULT_UNROLL_N 2
|
||||
|
||||
#define ZGEMM_DEFAULT_UNROLL_M 2
|
||||
#define ZGEMM_DEFAULT_UNROLL_N 2
|
||||
#endif
|
||||
|
||||
#define SGEMM_DEFAULT_P 64
|
||||
#define DGEMM_DEFAULT_P 44
|
||||
#define CGEMM_DEFAULT_P 64
|
||||
#define ZGEMM_DEFAULT_P 32
|
||||
|
||||
#define SGEMM_DEFAULT_Q 192
|
||||
#define DGEMM_DEFAULT_Q 92
|
||||
#define CGEMM_DEFAULT_Q 128
|
||||
#define ZGEMM_DEFAULT_Q 80
|
||||
|
||||
#define SGEMM_DEFAULT_R 640
|
||||
#define DGEMM_DEFAULT_R dgemm_r
|
||||
#define CGEMM_DEFAULT_R 640
|
||||
#define ZGEMM_DEFAULT_R 640
|
||||
|
||||
#define GEMM_OFFSET_A1 0x10000
|
||||
#define GEMM_OFFSET_B1 0x100000
|
||||
|
||||
#define SYMV_P 16
|
||||
#endif
|
||||
|
||||
#if defined(LOONGSON3R3)
|
||||
////Copy from SICORTEX
|
||||
#define SNUMOPT 2
|
||||
#define DNUMOPT 2
|
||||
|
||||
|
@ -2612,47 +2669,6 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
#define SYMV_P 16
|
||||
#endif
|
||||
|
||||
#ifdef LOONGSON3B
|
||||
#define SNUMOPT 2
|
||||
#define DNUMOPT 2
|
||||
|
||||
#define GEMM_DEFAULT_OFFSET_A 0
|
||||
#define GEMM_DEFAULT_OFFSET_B 0
|
||||
#define GEMM_DEFAULT_ALIGN 0x03fffUL
|
||||
|
||||
#define SGEMM_DEFAULT_UNROLL_M 2
|
||||
#define SGEMM_DEFAULT_UNROLL_N 2
|
||||
|
||||
#define DGEMM_DEFAULT_UNROLL_M 2
|
||||
#define DGEMM_DEFAULT_UNROLL_N 2
|
||||
|
||||
#define CGEMM_DEFAULT_UNROLL_M 2
|
||||
#define CGEMM_DEFAULT_UNROLL_N 2
|
||||
|
||||
#define ZGEMM_DEFAULT_UNROLL_M 2
|
||||
#define ZGEMM_DEFAULT_UNROLL_N 2
|
||||
|
||||
#define SGEMM_DEFAULT_P 64
|
||||
#define DGEMM_DEFAULT_P 24
|
||||
#define CGEMM_DEFAULT_P 24
|
||||
#define ZGEMM_DEFAULT_P 20
|
||||
|
||||
#define SGEMM_DEFAULT_Q 192
|
||||
#define DGEMM_DEFAULT_Q 128
|
||||
#define CGEMM_DEFAULT_Q 128
|
||||
#define ZGEMM_DEFAULT_Q 64
|
||||
|
||||
#define SGEMM_DEFAULT_R 512
|
||||
#define DGEMM_DEFAULT_R 512
|
||||
#define CGEMM_DEFAULT_R 512
|
||||
#define ZGEMM_DEFAULT_R 512
|
||||
|
||||
#define GEMM_OFFSET_A1 0x10000
|
||||
#define GEMM_OFFSET_B1 0x100000
|
||||
|
||||
#define SYMV_P 16
|
||||
#endif
|
||||
|
||||
#if defined(P5600) || defined(MIPS1004K) || defined(MIPS24K) || defined(I6400) || defined(P6600) || defined(I6500)
|
||||
#define SNUMOPT 2
|
||||
#define DNUMOPT 2
|
||||
|
|
Loading…
Reference in New Issue