1. Use getauxval instead of cpucfg to test hardware capability. 2. Remove unnecessary code and option for compiler check in c_check.tags/v0.3.26
@@ -199,8 +199,7 @@ if [ "$architecture" = "loongarch64" ]; then | |||||
tmpd="$(mktemp -d)" | tmpd="$(mktemp -d)" | ||||
tmplsx="$tmpd/lsx.c" | tmplsx="$tmpd/lsx.c" | ||||
codelsx='"vadd.b $vr0, $vr0, $vr0"' | codelsx='"vadd.b $vr0, $vr0, $vr0"' | ||||
lsx_flags='-march=loongarch64 -mlsx' | |||||
printf "#include <lsxintrin.h>\n\n" >> "$tmplsx" | |||||
lsx_flags='-march=loongarch64' | |||||
printf "void main(void){ __asm__ volatile(%s);}\n" "$codelsx" >> "$tmplsx" | printf "void main(void){ __asm__ volatile(%s);}\n" "$codelsx" >> "$tmplsx" | ||||
args="$lsx_flags -o $tmplsx.o $tmplsx" | args="$lsx_flags -o $tmplsx.o $tmplsx" | ||||
{ | { | ||||
@@ -211,8 +210,7 @@ if [ "$architecture" = "loongarch64" ]; then | |||||
tmplasx="$tmpd/lasx.c" | tmplasx="$tmpd/lasx.c" | ||||
codelasx='"xvadd.b $xr0, $xr0, $xr0"' | codelasx='"xvadd.b $xr0, $xr0, $xr0"' | ||||
lasx_flags='-march=loongarch64 -mlasx' | |||||
printf "#include <lasxintrin.h>\n\n" >> "$tmplasx" | |||||
lasx_flags='-march=loongarch64' | |||||
printf "void main(void){ __asm__ volatile(%s);}\n" "$codelasx" >> "$tmplasx" | printf "void main(void){ __asm__ volatile(%s);}\n" "$codelasx" >> "$tmplasx" | ||||
args="$lasx_flags -o $tmplasx.o $tmplasx" | args="$lasx_flags -o $tmplasx.o $tmplasx" | ||||
{ | { | ||||
@@ -241,8 +241,7 @@ if (($architecture eq "loongarch64")) { | |||||
} else { | } else { | ||||
$tmplsx = new File::Temp( SUFFIX => '.c' , UNLINK => 1 ); | $tmplsx = new File::Temp( SUFFIX => '.c' , UNLINK => 1 ); | ||||
$codelsx = '"vadd.b $vr0, $vr0, $vr0"'; | $codelsx = '"vadd.b $vr0, $vr0, $vr0"'; | ||||
$lsx_flags = "-march=loongarch64 -mlsx"; | |||||
print $tmplsx "#include <lsxintrin.h>\n\n"; | |||||
$lsx_flags = "-march=loongarch64"; | |||||
print $tmplsx "void main(void){ __asm__ volatile($codelsx); }\n"; | print $tmplsx "void main(void){ __asm__ volatile($codelsx); }\n"; | ||||
$args = "$lsx_flags -o $tmplsx.o $tmplsx"; | $args = "$lsx_flags -o $tmplsx.o $tmplsx"; | ||||
@@ -257,8 +256,7 @@ if (($architecture eq "loongarch64")) { | |||||
$tmplasx = new File::Temp( SUFFIX => '.c' , UNLINK => 1 ); | $tmplasx = new File::Temp( SUFFIX => '.c' , UNLINK => 1 ); | ||||
$codelasx = '"xvadd.b $xr0, $xr0, $xr0"'; | $codelasx = '"xvadd.b $xr0, $xr0, $xr0"'; | ||||
$lasx_flags = "-march=loongarch64 -mlasx"; | |||||
print $tmplasx "#include <lasxintrin.h>\n\n"; | |||||
$lasx_flags = "-march=loongarch64"; | |||||
print $tmplasx "void main(void){ __asm__ volatile($codelasx); }\n"; | print $tmplasx "void main(void){ __asm__ volatile($codelasx); }\n"; | ||||
$args = "$lasx_flags -o $tmplasx.o $tmplasx"; | $args = "$lasx_flags -o $tmplasx.o $tmplasx"; | ||||
@@ -47,8 +47,8 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||||
#define CPU_LOONGSON3R5 1 | #define CPU_LOONGSON3R5 1 | ||||
#define CPU_LOONGSON2K1000 2 | #define CPU_LOONGSON2K1000 2 | ||||
#define LA_HWCAP_LSX (1<<4) | |||||
#define LA_HWCAP_LASX (1<<5) | |||||
#define LA_HWCAP_LSX (1U << 4) | |||||
#define LA_HWCAP_LASX (1U << 5) | |||||
static char *cpuname[] = { | static char *cpuname[] = { | ||||
"LOONGSONGENERIC", | "LOONGSONGENERIC", | ||||
@@ -64,11 +64,11 @@ static char *cpuname_lower[] = { | |||||
int detect(void) { | int detect(void) { | ||||
#ifdef __linux | #ifdef __linux | ||||
int flag = (int)getauxval(AT_HWCAP); | |||||
int hwcap = (int)getauxval(AT_HWCAP); | |||||
if (flag & LA_HWCAP_LASX) | |||||
if (hwcap & LA_HWCAP_LASX) | |||||
return CPU_LOONGSON3R5; | return CPU_LOONGSON3R5; | ||||
else if (flag & LA_HWCAP_LSX) | |||||
else if (hwcap & LA_HWCAP_LSX) | |||||
return CPU_LOONGSON2K1000; | return CPU_LOONGSON2K1000; | ||||
else | else | ||||
return CPU_GENERIC; | return CPU_GENERIC; | ||||
@@ -94,7 +94,9 @@ void get_subdirname(void) { | |||||
} | } | ||||
void get_cpuconfig(void) { | void get_cpuconfig(void) { | ||||
uint32_t hwcaps = 0; | |||||
int d = detect(); | int d = detect(); | ||||
switch (d) { | switch (d) { | ||||
case CPU_LOONGSON3R5: | case CPU_LOONGSON3R5: | ||||
printf("#define LOONGSON3R5\n"); | printf("#define LOONGSON3R5\n"); | ||||
@@ -129,6 +131,10 @@ void get_cpuconfig(void) { | |||||
printf("#define L2_ASSOCIATIVE 16\n"); | printf("#define L2_ASSOCIATIVE 16\n"); | ||||
break; | break; | ||||
} | } | ||||
hwcaps = (uint32_t)getauxval( AT_HWCAP ); | |||||
if (hwcaps & LA_HWCAP_LSX) printf("#define HAVE_LSX\n"); | |||||
if (hwcaps & LA_HWCAP_LASX) printf("#define HAVE_LASX\n"); | |||||
} | } | ||||
void get_libname(void){ | void get_libname(void){ | ||||
@@ -25,6 +25,7 @@ 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. | USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
*******************************************************************************/ | *******************************************************************************/ | ||||
#include <sys/auxv.h> | |||||
#include "common.h" | #include "common.h" | ||||
extern gotoblas_t gotoblas_LOONGSON3R5; | extern gotoblas_t gotoblas_LOONGSON3R5; | ||||
@@ -74,21 +75,15 @@ static gotoblas_t *force_coretype(char *coretype) { | |||||
return NULL; | return NULL; | ||||
} | } | ||||
#define LASX_MASK 1<<7 | |||||
#define LSX_MASK 1<<6 | |||||
#define LOONGARCH_CFG2 0x02 | |||||
#define LA_HWCAP_LSX (1U << 4) | |||||
#define LA_HWCAP_LASX (1U << 5) | |||||
static gotoblas_t *get_coretype(void) { | static gotoblas_t *get_coretype(void) { | ||||
int ret = 0; | |||||
__asm__ volatile ( | |||||
"cpucfg %0, %1 \n\t" | |||||
: "+&r"(ret) | |||||
: "r"(LOONGARCH_CFG2) | |||||
); | |||||
if (ret & LASX_MASK) | |||||
int hwcap = (int)getauxval(AT_HWCAP); | |||||
if (hwcap & LA_HWCAP_LASX) | |||||
return &gotoblas_LOONGSON3R5; | return &gotoblas_LOONGSON3R5; | ||||
else if (ret & LSX_MASK) | |||||
else if (hwcap & LA_HWCAP_LSX) | |||||
return &gotoblas_LOONGSON2K1000; | return &gotoblas_LOONGSON2K1000; | ||||
else | else | ||||
return &gotoblas_LOONGSONGENERIC; | return &gotoblas_LOONGSONGENERIC; | ||||