Add LSX and LASX configure detection
Adds loongarch simd extension(LSX LASX) configure test and -feature-lsx and -feature-lasx configure options. Add detection of LSX and LASX at run-time in qsimd.cpp. Change-Id: I63eab2f4f45c306b672a89b376e0cbc01da0df83 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io> Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
This commit is contained in:
parent
6d49bd766f
commit
73ce5a940a
@ -68,6 +68,8 @@ if(GCC OR CLANG OR QCC)
|
|||||||
endif()
|
endif()
|
||||||
set(QT_CFLAGS_ARM_SVE "${__prefix}-march=armv8-a+sve")
|
set(QT_CFLAGS_ARM_SVE "${__prefix}-march=armv8-a+sve")
|
||||||
set(QT_CFLAGS_ARM_CRYPTO "${__prefix}-march=armv8-a+crypto")
|
set(QT_CFLAGS_ARM_CRYPTO "${__prefix}-march=armv8-a+crypto")
|
||||||
|
set(QT_CFLAGS_LSX "${__prefix}-mlsx")
|
||||||
|
set(QT_CFLAGS_LASX "${__prefix}-mlasx")
|
||||||
set(QT_CFLAGS_MIPS_DSP "${__prefix}-mdsp")
|
set(QT_CFLAGS_MIPS_DSP "${__prefix}-mdsp")
|
||||||
set(QT_CFLAGS_MIPS_DSPR2 "${__prefix}-mdspr2")
|
set(QT_CFLAGS_MIPS_DSPR2 "${__prefix}-mdspr2")
|
||||||
unset(__prefix)
|
unset(__prefix)
|
||||||
|
@ -1308,6 +1308,31 @@ function(qt_config_compile_test_armintrin extension label)
|
|||||||
set(TEST_subarch_${extension} "${TEST_ARMINTRIN_${extension}}" CACHE INTERNAL "${label}")
|
set(TEST_subarch_${extension} "${TEST_ARMINTRIN_${extension}}" CACHE INTERNAL "${label}")
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
function(qt_config_compile_test_loongarchsimd extension label)
|
||||||
|
if (DEFINED TEST_LOONGARCHSIMD_${extension})
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(flags "-DSIMD:string=${extension}")
|
||||||
|
|
||||||
|
qt_get_platform_try_compile_vars(platform_try_compile_vars)
|
||||||
|
list(APPEND flags ${platform_try_compile_vars})
|
||||||
|
|
||||||
|
message(STATUS "Performing Test ${label} intrinsics")
|
||||||
|
try_compile("TEST_LOONGARCHSIMD_${extension}"
|
||||||
|
"${CMAKE_CURRENT_BINARY_DIR}/config.tests/loongarch_simd_${extension}"
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/config.tests/loongarch_simd"
|
||||||
|
loongarch_simd
|
||||||
|
CMAKE_FLAGS ${flags})
|
||||||
|
if(${TEST_LOONGARCHSIMD_${extension}})
|
||||||
|
set(status_label "Success")
|
||||||
|
else()
|
||||||
|
set(status_label "Failed")
|
||||||
|
endif()
|
||||||
|
message(STATUS "Performing Test ${label} intrinsics - ${status_label}")
|
||||||
|
set(TEST_subarch_${extension} "${TEST_LOONGARCHSIMD_${extension}}" CACHE INTERNAL "${label}")
|
||||||
|
endfunction()
|
||||||
|
|
||||||
function(qt_config_compile_test_machine_tuple label)
|
function(qt_config_compile_test_machine_tuple label)
|
||||||
if(DEFINED TEST_MACHINE_TUPLE OR NOT (LINUX OR HURD) OR ANDROID)
|
if(DEFINED TEST_MACHINE_TUPLE OR NOT (LINUX OR HURD) OR ANDROID)
|
||||||
return()
|
return()
|
||||||
|
@ -245,6 +245,7 @@ defstub(qt_config_compile_test)
|
|||||||
defstub(qt_config_compile_test_armintrin)
|
defstub(qt_config_compile_test_armintrin)
|
||||||
defstub(qt_config_compile_test_machine_tuple)
|
defstub(qt_config_compile_test_machine_tuple)
|
||||||
defstub(qt_config_compile_test_x86simd)
|
defstub(qt_config_compile_test_x86simd)
|
||||||
|
defstub(qt_config_compile_test_loongarchsimd)
|
||||||
defstub(qt_config_compiler_supports_flag_test)
|
defstub(qt_config_compiler_supports_flag_test)
|
||||||
defstub(qt_config_linker_supports_flag_test)
|
defstub(qt_config_linker_supports_flag_test)
|
||||||
defstub(qt_configure_add_report_entry)
|
defstub(qt_configure_add_report_entry)
|
||||||
|
26
config.tests/loongarch_simd/CMakeLists.txt
Normal file
26
config.tests/loongarch_simd/CMakeLists.txt
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
# Copyright (C) 2022 The Qt Company Ltd.
|
||||||
|
# SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
|
||||||
|
cmake_minimum_required(VERSION 3.16)
|
||||||
|
project(loongarch_simd LANGUAGES CXX)
|
||||||
|
|
||||||
|
include(../../cmake/QtPlatformSupport.cmake)
|
||||||
|
include(../../cmake/QtCompilerOptimization.cmake)
|
||||||
|
|
||||||
|
# FIXME: Make the this project handle a list of SIMD entries.
|
||||||
|
# FIXME: Make this project handle appending of the cflags (similar to the qmake project).
|
||||||
|
# This is needed for the loongarchsimd configure test (
|
||||||
|
# aka we test to see if setting no SIMD (-mlsx) cflags at all, will result in their implicit
|
||||||
|
# addition by the compiler).
|
||||||
|
string(TOUPPER "${SIMD}" upper_simd)
|
||||||
|
|
||||||
|
if(NOT DEFINED "QT_CFLAGS_${upper_simd}")
|
||||||
|
# Don't use CMake error() because a configure error also fails the try_compile() call.
|
||||||
|
# Instead use a compile flag that doesn't exist to force a compiler error.
|
||||||
|
set(QT_CFLAGS_${upper_simd} "--qt-cflags-not-found")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_executable("SimdTest${SIMD}")
|
||||||
|
target_sources("SimdTest${SIMD}" PRIVATE main.cpp)
|
||||||
|
target_compile_options("SimdTest${SIMD}" PRIVATE ${QT_CFLAGS_${upper_simd}})
|
||||||
|
target_compile_definitions("SimdTest${SIMD}" PRIVATE QT_COMPILER_SUPPORTS_${upper_simd})
|
29
config.tests/loongarch_simd/main.cpp
Normal file
29
config.tests/loongarch_simd/main.cpp
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
// Copyright (C) 2017 Intel Corporation.
|
||||||
|
// SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
|
||||||
|
#define T(x) (QT_COMPILER_SUPPORTS_ ## x)
|
||||||
|
|
||||||
|
#if T(LSX)
|
||||||
|
#include <lsxintrin.h>
|
||||||
|
void test_lsx()
|
||||||
|
{
|
||||||
|
__m128i a = __lsx_vldi(0);
|
||||||
|
(void) __lsx_vshuf_h(__lsx_vldi(0), a, a);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if T(LASX)
|
||||||
|
#include <lsxintrin.h>
|
||||||
|
#include <lasxintrin.h>
|
||||||
|
void test_lasx()
|
||||||
|
{
|
||||||
|
__m256i a = __lasx_xvldi(0);
|
||||||
|
__m256i b = __lasx_xvadd_b(a, a);
|
||||||
|
(void) __lasx_xvadd_b(a, b);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
@ -376,6 +376,12 @@ qt_config_compile_test_armintrin(crypto "CRYPTO")
|
|||||||
# arm: sve
|
# arm: sve
|
||||||
qt_config_compile_test_armintrin(sve "SVE")
|
qt_config_compile_test_armintrin(sve "SVE")
|
||||||
|
|
||||||
|
# loongarch: lsx
|
||||||
|
qt_config_compile_test_loongarchsimd(lsx "LSX")
|
||||||
|
|
||||||
|
# loongarch: lasx
|
||||||
|
qt_config_compile_test_loongarchsimd(lasx "LASX")
|
||||||
|
|
||||||
# localtime_r
|
# localtime_r
|
||||||
qt_config_compile_test(localtime_r
|
qt_config_compile_test(localtime_r
|
||||||
LABEL "localtime_r()"
|
LABEL "localtime_r()"
|
||||||
@ -901,6 +907,18 @@ qt_feature("shani" PRIVATE
|
|||||||
)
|
)
|
||||||
qt_feature_definition("shani" "QT_COMPILER_SUPPORTS_SHA" VALUE "1")
|
qt_feature_definition("shani" "QT_COMPILER_SUPPORTS_SHA" VALUE "1")
|
||||||
qt_feature_config("shani" QMAKE_PRIVATE_CONFIG)
|
qt_feature_config("shani" QMAKE_PRIVATE_CONFIG)
|
||||||
|
qt_feature("lsx" PRIVATE
|
||||||
|
LABEL "LSX"
|
||||||
|
CONDITION ( TEST_architecture_arch STREQUAL loongarch64 ) AND TEST_subarch_lsx
|
||||||
|
)
|
||||||
|
qt_feature_definition("lsx" "QT_COMPILER_SUPPORTS_LSX" VALUE "1")
|
||||||
|
qt_feature_config("lsx" QMAKE_PRIVATE_CONFIG)
|
||||||
|
qt_feature("lasx" PRIVATE
|
||||||
|
LABEL "LASX"
|
||||||
|
CONDITION ( TEST_architecture_arch STREQUAL loongarch64 ) AND TEST_subarch_lasx
|
||||||
|
)
|
||||||
|
qt_feature_definition("lasx" "QT_COMPILER_SUPPORTS_LASX" VALUE "1")
|
||||||
|
qt_feature_config("lasx" QMAKE_PRIVATE_CONFIG)
|
||||||
qt_feature("mips_dsp" PRIVATE
|
qt_feature("mips_dsp" PRIVATE
|
||||||
LABEL "DSP"
|
LABEL "DSP"
|
||||||
CONDITION ( TEST_architecture_arch STREQUAL mips ) AND TEST_arch_${TEST_architecture_arch}_subarch_dsp
|
CONDITION ( TEST_architecture_arch STREQUAL mips ) AND TEST_arch_${TEST_architecture_arch}_subarch_dsp
|
||||||
@ -1301,6 +1319,12 @@ qt_configure_add_summary_entry(
|
|||||||
MESSAGE "ARM Extensions"
|
MESSAGE "ARM Extensions"
|
||||||
CONDITION ( TEST_architecture_arch STREQUAL arm ) OR ( TEST_architecture_arch STREQUAL arm64 )
|
CONDITION ( TEST_architecture_arch STREQUAL arm ) OR ( TEST_architecture_arch STREQUAL arm64 )
|
||||||
)
|
)
|
||||||
|
qt_configure_add_summary_entry(
|
||||||
|
TYPE "featureList"
|
||||||
|
ARGS "lsx lasx"
|
||||||
|
MESSAGE "LOONGARCH Extensions"
|
||||||
|
CONDITION ( TEST_architecture_arch STREQUAL loongarch64 )
|
||||||
|
)
|
||||||
qt_configure_add_summary_entry(
|
qt_configure_add_summary_entry(
|
||||||
ARGS "mips_dsp"
|
ARGS "mips_dsp"
|
||||||
CONDITION ( TEST_architecture_arch STREQUAL mips )
|
CONDITION ( TEST_architecture_arch STREQUAL mips )
|
||||||
|
@ -119,6 +119,8 @@ QMAKE_CFLAGS_VAES += -mvaes
|
|||||||
QMAKE_CFLAGS_NEON += -mfpu=neon
|
QMAKE_CFLAGS_NEON += -mfpu=neon
|
||||||
QMAKE_CFLAGS_MIPS_DSP += -mdsp
|
QMAKE_CFLAGS_MIPS_DSP += -mdsp
|
||||||
QMAKE_CFLAGS_MIPS_DSPR2 += -mdspr2
|
QMAKE_CFLAGS_MIPS_DSPR2 += -mdspr2
|
||||||
|
QMAKE_CFLAGS_LSX += -mlsx
|
||||||
|
QMAKE_CFLAGS_LASX += -mlasx
|
||||||
|
|
||||||
# -march=haswell is supported as of GCC 4.9 and Clang 3.6
|
# -march=haswell is supported as of GCC 4.9 and Clang 3.6
|
||||||
QMAKE_CFLAGS_ARCH_HASWELL = -march=core-avx2
|
QMAKE_CFLAGS_ARCH_HASWELL = -march=core-avx2
|
||||||
|
@ -146,6 +146,8 @@ addSimdCompiler(rdseed)
|
|||||||
addSimdCompiler(neon)
|
addSimdCompiler(neon)
|
||||||
addSimdCompiler(mips_dsp)
|
addSimdCompiler(mips_dsp)
|
||||||
addSimdCompiler(mips_dspr2)
|
addSimdCompiler(mips_dspr2)
|
||||||
|
addSimdCompiler(lsx)
|
||||||
|
addSimdCompiler(lasx)
|
||||||
|
|
||||||
# Haswell sub-architecture
|
# Haswell sub-architecture
|
||||||
defineTest(addSimdArch) {
|
defineTest(addSimdArch) {
|
||||||
|
@ -33,7 +33,7 @@
|
|||||||
# endif
|
# endif
|
||||||
#elif defined(Q_OS_LINUX) && defined(Q_PROCESSOR_MIPS_32)
|
#elif defined(Q_OS_LINUX) && defined(Q_PROCESSOR_MIPS_32)
|
||||||
# include "private/qcore_unix_p.h"
|
# include "private/qcore_unix_p.h"
|
||||||
#elif QT_CONFIG(getauxval) && defined(Q_PROCESSOR_ARM)
|
#elif QT_CONFIG(getauxval) && (defined(Q_PROCESSOR_ARM) || defined(Q_PROCESSOR_LOONGARCH))
|
||||||
# include <sys/auxv.h>
|
# include <sys/auxv.h>
|
||||||
|
|
||||||
// the kernel header definitions for HWCAP_*
|
// the kernel header definitions for HWCAP_*
|
||||||
@ -95,6 +95,19 @@ static const char features_string[] =
|
|||||||
" dsp\0"
|
" dsp\0"
|
||||||
" dspr2\0";
|
" dspr2\0";
|
||||||
|
|
||||||
|
static const int features_indices[] = {
|
||||||
|
0, 1, 6
|
||||||
|
};
|
||||||
|
#elif defined(Q_PROCESSOR_LOONGARCH)
|
||||||
|
/* Data:
|
||||||
|
lsx
|
||||||
|
lasx
|
||||||
|
*/
|
||||||
|
static const char features_string[] =
|
||||||
|
"\0"
|
||||||
|
" lsx\0"
|
||||||
|
" lasx\0";
|
||||||
|
|
||||||
static const int features_indices[] = {
|
static const int features_indices[] = {
|
||||||
0, 1, 6
|
0, 1, 6
|
||||||
};
|
};
|
||||||
@ -192,6 +205,40 @@ static inline quint64 detectProcessorFeatures()
|
|||||||
return features;
|
return features;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#elif defined(Q_PROCESSOR_LOONGARCH)
|
||||||
|
static inline quint64 detectProcessorFeatures()
|
||||||
|
{
|
||||||
|
quint64 features = 0;
|
||||||
|
# if QT_CONFIG(getauxval)
|
||||||
|
quint64 hwcap = getauxval(AT_HWCAP);
|
||||||
|
|
||||||
|
if (hwcap & HWCAP_LOONGARCH_LSX)
|
||||||
|
features |= CpuFeatureLSX;
|
||||||
|
if (hwcap & HWCAP_LOONGARCH_LASX)
|
||||||
|
features |= CpuFeatureLASX;
|
||||||
|
# else
|
||||||
|
enum LoongArchFeatures {
|
||||||
|
LOONGARCH_CFG2 = 0x2,
|
||||||
|
LOONGARCH_CFG2_LSX = (1 << 6),
|
||||||
|
LOONGARCH_CFG2_LASX = (1 << 7)
|
||||||
|
};
|
||||||
|
|
||||||
|
quint64 reg = 0;
|
||||||
|
|
||||||
|
__asm__ volatile(
|
||||||
|
"cpucfg %0, %1 \n\t"
|
||||||
|
: "+&r"(reg)
|
||||||
|
: "r"(LOONGARCH_CFG2)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (reg & LOONGARCH_CFG2_LSX)
|
||||||
|
features |= CpuFeatureLSX;
|
||||||
|
if (reg & LOONGARCH_CFG2_LASX)
|
||||||
|
features |= CpuFeatureLASX;
|
||||||
|
# endif
|
||||||
|
return features;
|
||||||
|
}
|
||||||
|
|
||||||
#elif defined(Q_PROCESSOR_X86)
|
#elif defined(Q_PROCESSOR_X86)
|
||||||
|
|
||||||
#ifdef Q_PROCESSOR_X86_32
|
#ifdef Q_PROCESSOR_X86_32
|
||||||
|
@ -21,6 +21,8 @@
|
|||||||
* sse4_1 | x86
|
* sse4_1 | x86
|
||||||
* sse4_2 | x86
|
* sse4_2 | x86
|
||||||
* avx | x86
|
* avx | x86
|
||||||
|
* lsx | loongarch
|
||||||
|
* lasx | loongarch
|
||||||
*
|
*
|
||||||
* Code can use the following constructs to determine compiler support & status:
|
* Code can use the following constructs to determine compiler support & status:
|
||||||
* - #if QT_COMPILER_USES(XXX) (e.g: #if QT_COMPILER_USES(neon) or QT_COMPILER_USES(sse4_1)
|
* - #if QT_COMPILER_USES(XXX) (e.g: #if QT_COMPILER_USES(neon) or QT_COMPILER_USES(sse4_1)
|
||||||
@ -53,6 +55,20 @@
|
|||||||
# define QT_COMPILER_USES_mips_dspr2 -1
|
# define QT_COMPILER_USES_mips_dspr2 -1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(Q_PROCESSOR_LOONGARCH) && defined(__loongarch_sx)
|
||||||
|
# include <lsxintrin.h>
|
||||||
|
# define QT_COMPILER_USES_lsx 1
|
||||||
|
#else
|
||||||
|
# define QT_COMPILER_USES_lsx -1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(Q_PROCESSOR_LOONGARCH) && defined(__loongarch_asx)
|
||||||
|
# include <lasxintrin.h>
|
||||||
|
# define QT_COMPILER_USES_lasx 1
|
||||||
|
#else
|
||||||
|
# define QT_COMPILER_USES_lasx -1
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(Q_PROCESSOR_X86) && defined(Q_CC_MSVC)
|
#if defined(Q_PROCESSOR_X86) && defined(Q_CC_MSVC)
|
||||||
// MSVC doesn't define __SSE2__, so do it ourselves
|
// MSVC doesn't define __SSE2__, so do it ourselves
|
||||||
# if (defined(_M_X64) || _M_IX86_FP >= 2) && defined(QT_COMPILER_SUPPORTS_SSE2)
|
# if (defined(_M_X64) || _M_IX86_FP >= 2) && defined(QT_COMPILER_SUPPORTS_SSE2)
|
||||||
|
@ -120,6 +120,9 @@ QT_WARNING_DISABLE_INTEL(103)
|
|||||||
# if !defined(__MIPS_DSPR2__) && defined(__mips_dspr2) && defined(Q_PROCESSOR_MIPS_32)
|
# if !defined(__MIPS_DSPR2__) && defined(__mips_dspr2) && defined(Q_PROCESSOR_MIPS_32)
|
||||||
# define __MIPS_DSPR2__
|
# define __MIPS_DSPR2__
|
||||||
# endif
|
# endif
|
||||||
|
#elif defined(Q_PROCESSOR_LOONGARCH)
|
||||||
|
# define QT_COMPILER_SUPPORTS_HERE(x) QT_COMPILER_SUPPORTS(x)
|
||||||
|
# define QT_FUNCTION_TARGET(x)
|
||||||
#elif defined(Q_PROCESSOR_X86)
|
#elif defined(Q_PROCESSOR_X86)
|
||||||
# if defined(Q_CC_CLANG) && defined(Q_CC_MSVC)
|
# if defined(Q_CC_CLANG) && defined(Q_CC_MSVC)
|
||||||
# define QT_COMPILER_SUPPORTS_HERE(x) (__ ## x ## __)
|
# define QT_COMPILER_SUPPORTS_HERE(x) (__ ## x ## __)
|
||||||
@ -383,6 +386,9 @@ enum CPUFeatures {
|
|||||||
#elif defined(Q_PROCESSOR_MIPS)
|
#elif defined(Q_PROCESSOR_MIPS)
|
||||||
CpuFeatureDSP = 2,
|
CpuFeatureDSP = 2,
|
||||||
CpuFeatureDSPR2 = 4,
|
CpuFeatureDSPR2 = 4,
|
||||||
|
#elif defined(Q_PROCESSOR_LOONGARCH)
|
||||||
|
CpuFeatureLSX = 2,
|
||||||
|
CpuFeatureLASX = 4,
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -411,6 +417,12 @@ static const uint64_t qCompilerCpuFeatures = 0
|
|||||||
#endif
|
#endif
|
||||||
#if defined __mips_dspr2
|
#if defined __mips_dspr2
|
||||||
| CpuFeatureDSPR2
|
| CpuFeatureDSPR2
|
||||||
|
#endif
|
||||||
|
#if defined __loongarch_sx
|
||||||
|
| CpuFeatureLSX
|
||||||
|
#endif
|
||||||
|
#if defined __loongarch_asx
|
||||||
|
| CpuFeatureLASX
|
||||||
#endif
|
#endif
|
||||||
;
|
;
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user