Bug#1062361: gnss-sdr: add support for loongarch64
Source: gnss-sdr
Version: 0.0.18-2
Severity: wishlist
Tags: patch
User: debian-loongarch@lists.debian.org
Usertags: loong64
Dear maintainers,
We need to add loongarch64 support in gnss-sdr.
Please consider the patch I have attached.
If the maintainer sees no problem with the patch, can also submit to
upstream.
In addition, I give feedback on an error when compiling on my local ENV,
for example:
```
......
/usr/include/gnuradio/io_signature.h:194:73: error: ‘string_view’ is not
a member of ‘std’
194 | struct GR_RUNTIME_API fmt::formatter<gr::io_signature> :
formatter<std::string_view> {
| ^~~~~~~~~~~
/usr/include/gnuradio/io_signature.h:194:73: note: ‘std::string_view’ is
only available from C++17 onwards
/usr/include/gnuradio/io_signature.h:194:73: error: ‘string_view’ is not
a member of ‘std’
/usr/include/gnuradio/io_signature.h:194:73: note: ‘std::string_view’ is
only available from C++17 onwards
/usr/include/gnuradio/io_signature.h:194:84: error: template argument 1
is invalid
194 | struct GR_RUNTIME_API fmt::formatter<gr::io_signature> :
formatter<std::string_view> {
|
```
If you have any questions, you can contact me at any time.
Thanks,
Dandan Zhang
Description: Add loongarch64 support
Last-Update: 2024-01-30
--- gnss-sdr-0.0.18.orig/CMakeLists.txt
+++ gnss-sdr-0.0.18/CMakeLists.txt
@@ -1200,7 +1200,7 @@ if(NOT VOLKGNSSSDR_FOUND)
include(GNUInstallDirs)
set(SUPPORTED_CPU_FEATURES_ARCH FALSE)
if(CMAKE_SYSTEM_PROCESSOR MATCHES
- "(^mips)|(^arm)|(^aarch64)|(x86_64)|(AMD64|amd64)|(^i.86$)|(^powerpc)|(^ppc)|(^s390x)|^riscv")
+ "(^mips)|(^arm)|(^aarch64)|(x86_64)|(AMD64|amd64)|(^i.86$)|(^loongarch64)|(^loong64)|(^powerpc)|(^ppc)|(^s390x)|^riscv")
set(SUPPORTED_CPU_FEATURES_ARCH TRUE)
endif()
if(${CMAKE_INSTALL_LIBDIR} MATCHES lib64)
@@ -1239,7 +1239,7 @@ if(NOT VOLKGNSSSDR_FOUND)
set_package_properties(CPUFEATURES PROPERTIES
DESCRIPTION "A cross platform C99 library to get CPU features at runtime (version: ${CPUFEATURES_VERSION})"
)
- if((CMAKE_SYSTEM_PROCESSOR MATCHES "(^s390x)|^riscv") AND (CPUFEATURES_VERSION VERSION_LESS "0.8.0")) # detect cpu_features without s390x / riscv support
+ if((CMAKE_SYSTEM_PROCESSOR MATCHES "(^s390x)|^riscv|(^loongarch64)|(^loong64)") AND (CPUFEATURES_VERSION VERSION_LESS "0.8.0")) # detect cpu_features without s390x / riscv support
set(ENABLE_CPUFEATURES OFF)
endif()
else()
--- gnss-sdr-0.0.18.orig/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/CMakeLists.txt
+++ gnss-sdr-0.0.18/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/CMakeLists.txt
@@ -258,7 +258,7 @@ endif()
# cpu_features - sensible defaults, user settable option
if(CMAKE_SYSTEM_PROCESSOR MATCHES
- "(^mips)|(^arm)|(^aarch64)|(x86_64)|(AMD64|amd64)|(^i.86$)|(^powerpc)|(^ppc)|(^s390x)|^riscv")
+ "(^mips)|(^arm)|(^aarch64)|(x86_64)|(AMD64|amd64)|(^i.86$)|(^loongarch64)|(^loong64)|(^powerpc)|(^ppc)|(^s390x)|^riscv")
option(VOLK_CPU_FEATURES "volk-gnsssdr uses cpu_features" ON)
else()
option(VOLK_CPU_FEATURES "volk-gnsssdr uses cpu_features" OFF)
@@ -266,7 +266,7 @@ endif()
if(CMAKE_VERSION VERSION_GREATER 3.0 AND VOLK_CPU_FEATURES)
find_package(CPUFEATURES)
- if(CPUFEATURES_FOUND AND (CMAKE_SYSTEM_PROCESSOR MATCHES "(^s390x)|^riscv") AND (CPUFEATURES_VERSION VERSION_LESS "0.8.0"))
+ if(CPUFEATURES_FOUND AND (CMAKE_SYSTEM_PROCESSOR MATCHES "(^s390x)|^riscv|(^loongarch64)|(^loong64)") AND (CPUFEATURES_VERSION VERSION_LESS "0.8.0"))
set(USE_CPU_FEATURES OFF)
unset(CPUFEATURES_FOUND CACHE)
message(STATUS "Building volk-gnsssdr without cpu_features, installed version v${CPUFEATURES_VERSION} does not support the ${CMAKE_SYSTEM_PROCESSOR} architecture")
--- gnss-sdr-0.0.18.orig/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/CMakeLists.txt
+++ gnss-sdr-0.0.18/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/CMakeLists.txt
@@ -54,6 +54,7 @@ set(PROCESSOR_IS_MIPS FALSE)
set(PROCESSOR_IS_ARM FALSE)
set(PROCESSOR_IS_AARCH64 FALSE)
set(PROCESSOR_IS_X86 FALSE)
+set(PROCESSOR_IS_LOONGARCH64 FALSE)
set(PROCESSOR_IS_POWER FALSE)
set(PROCESSOR_IS_S390X FALSE)
set(PROCESSOR_IS_RISCV FALSE)
@@ -66,6 +67,8 @@ elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^
set(PROCESSOR_IS_ARM TRUE)
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "(x86_64)|(AMD64|amd64)|(^i.86$)")
set(PROCESSOR_IS_X86 TRUE)
+elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(loongarch64)|^(loong64)")
+ set(PROCESSOR_IS_LOONGARCH64 TRUE)
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)")
set(PROCESSOR_IS_POWER TRUE)
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(s390x)")
@@ -90,6 +93,8 @@ macro(add_cpu_features_headers_and_sourc
list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpuinfo_x86.h)
list(APPEND ${SRCS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/internal/cpuid_x86.h)
list(APPEND ${SRCS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/internal/windows_utils.h)
+ elseif(PROCESSOR_IS_LOONGARCH64)
+ list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpuinfo_loongarch64.h)
elseif(PROCESSOR_IS_POWER)
list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpuinfo_ppc.h)
elseif(PROCESSOR_IS_S390X)
--- gnss-sdr-0.0.18.orig/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/README.md
+++ gnss-sdr-0.0.18/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/README.md
@@ -158,14 +158,14 @@ flags : aes,avx,cx16,smx,sse4_
## What's supported
-| | x86³ | AArch64 | ARM | MIPS⁴ | POWER | RISCV | s390x |
-| ------- | :--: | :-----: | :-----: | :-----: | :-----: | :---: | :-----: |
-| Linux | yes² | yes¹ | yes¹ | yes¹ | yes¹ | yes¹ | yes¹ |
-| FreeBSD | yes² | not yet | not yet | not yet | not yet | N/A | not yet |
-| MacOs | yes² | not yet | N/A | N/A | no | N/A | no |
-| Windows | yes² | not yet | not yet | N/A | N/A | N/A | N/A |
-| Android | yes² | yes¹ | yes¹ | yes¹ | N/A | N/A | N/A |
-| iOS | N/A | not yet | not yet | N/A | N/A | N/A | N/A |
+| | x86³ | AArch64 | ARM | LOONGARCH64 | MIPS⁴ | POWER | RISCV | s390x |
+| ------- | :--: | :-----: | :-----: | :-----: | :-----: | :-----: | :---: | :-----: |
+| Linux | yes² | yes¹ | yes¹ | yes¹ | yes¹ | yes¹ | yes¹ | yes¹ |
+| FreeBSD | yes² | not yet | not yet | not yet | not yet | not yet | N/A | not yet |
+| MacOs | yes² | not yet | N/A | N/A | N/A | no | N/A | no |
+| Windows | yes² | not yet | not yet | N/A | N/A | N/A | N/A | N/A |
+| Android | yes² | yes¹ | yes¹ | N/A | yes¹ | N/A | N/A | N/A |
+| iOS | N/A | not yet | not yet | N/A | N/A | N/A | N/A | N/A |
1. **Features revealed from Linux.** We gather data from several sources
depending on availability:
--- gnss-sdr-0.0.18.orig/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/include/cpu_features_macros.h
+++ gnss-sdr-0.0.18/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/include/cpu_features_macros.h
@@ -36,6 +36,10 @@
#define CPU_FEATURES_ARCH_ANY_ARM
#endif
+#if (defined(__loongarch64)
+#define CPU_FEATURES_ARCH_LOONGARCH64
+#endif
+
#if defined(__mips64)
#define CPU_FEATURES_ARCH_MIPS64
#endif
--- /dev/null
+++ gnss-sdr-0.0.18/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/include/cpuinfo_loongarch64.h
@@ -0,0 +1,61 @@
+// SPDX-FileCopyrightText: 2023 Google LLC
+// SPDX-License-Identifier: Apache-2.0
+
+#ifndef CPU_FEATURES_INCLUDE_CPUINFO_LOONGARCH64_H_
+#define CPU_FEATURES_INCLUDE_CPUINFO_LOONGARCH64_H_
+
+#include "cpu_features_cache_info.h"
+#include "cpu_features_macros.h"
+#include <stdint.h>
+
+CPU_FEATURES_START_CPP_NAMESPACE
+
+typedef struct
+{
+ int cpucfg : 1;
+ int lam : 1;
+ int ual : 1;
+ int fpu : 1;
+ int lsx : 1;
+ int lasx : 1;
+ int crc32 : 1;
+ int complex : 1;
+ int crypto : 1;
+ int lvz : 1;
+
+} Loongarch64Features;
+
+typedef struct
+{
+ Loongarch64Features features;
+} Loongarch64Info;
+
+Loongarch64Info GetLoongarch64Info(void);
+
+typedef enum
+{
+ LOONGARCH64_CPUCFG,
+ LOONGARCH64_LAM,
+ LOONGARCH64_UAL,
+ LOONGARCH64_FPU,
+ LOONGARCH64_LSX,
+ LOONGARCH64_LASX,
+ LOONGARCH64_CRC32,
+ LOONGARCH64_COMPLEX,
+ LOONGARCH64_CRYPTO,
+ LOONGARCH64_LVZ,
+ LOONGARCH64_LAST_,
+} Loongarch64FeaturesEnum;
+
+int GetLoongarch64FeaturesEnumValue(const Loongarch64Features* features,
+ Loongarch64FeaturesEnum value);
+
+const char* GetLoongarch64FeaturesEnumName(Loongarch64FeaturesEnum);
+
+CPU_FEATURES_END_CPP_NAMESPACE
+
+#if !defined(CPU_FEATURES_ARCH_LOONGARCH64)
+#error "Including cpuinfo_loongarch64.h from a non-loongarch64 target."
+#endif
+
+#endif // CPU_FEATURES_INCLUDE_CPUINFO_LOONGARCH64_H_
--- gnss-sdr-0.0.18.orig/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/include/internal/hwcaps.h
+++ gnss-sdr-0.0.18/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/include/internal/hwcaps.h
@@ -101,6 +101,18 @@ CPU_FEATURES_START_CPP_NAMESPACE
#define ARM_HWCAP2_SHA2 (1UL << 3)
#define ARM_HWCAP2_CRC32 (1UL << 4)
+//LOONGARCH64
+#define LOONGARCH64_HWCAP_CPUCFG (1UL << 0)
+#define LOONGARCH64_HWCAP_LAM (1UL << 1)
+#define LOONGARCH64_HWCAP_UAL (1UL << 2)
+#define LOONGARCH64_HWCAP_FPU (1UL << 3)
+#define LOONGARCH64_HWCAP_LSX (1UL << 4)
+#define LOONGARCH64_HWCAP_LASX (1UL << 5)
+#define LOONGARCH64_HWCAP_CRC32 (1UL << 6)
+#define LOONGARCH64_HWCAP_COMPLEX (1UL << 7)
+#define LOONGARCH64_HWCAP_CRYPTO (1UL << 8)
+#define LOONGARCH64_HWCAP_LVZ (1UL << 9)
+
// http://elixir.free-electrons.com/linux/latest/source/arch/mips/include/uapi/asm/hwcap.h
#define MIPS_HWCAP_R6 (1UL << 0)
#define MIPS_HWCAP_MSA (1UL << 1)
--- /dev/null
+++ gnss-sdr-0.0.18/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/src/impl_loongarch64_linux.c
@@ -0,0 +1,90 @@
+// SPDX-FileCopyrightText: 2023 Google LLC
+// SPDX-License-Identifier: Apache-2.0
+
+#include "cpu_features_macros.h"
+
+#ifdef CPU_FEATURES_ARCH_LOONGARCH64
+#if defined(CPU_FEATURES_OS_LINUX)
+
+#include "cpuinfo_loongarch64.h"
+
+////////////////////////////////////////////////////////////////////////////////
+// Definitions for introspection.
+////////////////////////////////////////////////////////////////////////////////
+#define INTROSPECTION_TABLE \
+ LINE(LOONGARCH64_CPUCFG, cpucfg, "cpucfg", LOONGARCH64_HWCAP_CPUCFG, 0) \
+ LINE(LOONGARCH64_LAM, lam, "lam", LOONGARCH64_HWCAP_LAM, 0) \
+ LINE(LOONGARCH64_UAL, ual, "ual", LOONGARCH64_HWCAP_UAL, 0) \
+ LINE(LOONGARCH64_FPU, fpu, "fpu", LOONGARCH64_HWCAP_FPU, 0) \
+ LINE(LOONGARCH64_LSX, lsx, "lsx", LOONGARCH64_HWCAP_LSX, 0) \
+ LINE(LOONGARCH64_LASX, lasx, "lasx", LOONGARCH64_HWCAP_LASX, 0) \
+ LINE(LOONGARCH64_CRC32, crc32, "crc32", LOONGARCH64_HWCAP_CRC32, 0) \
+ LINE(LOONGARCH64_COMPLEX, complex, "complex", LOONGARCH64_HWCAP_COMPLEX, 0) \
+ LINE(LOONGARCH64_CRYPTO, crypto, "crypto", LOONGARCH64_HWCAP_CRYPTO, 0) \
+ LINE(LOONGARCH64_LVZ, lvz, "lvz", LOONGARCH64_HWCAP_LVZ, 0) \
+#define INTROSPECTION_PREFIX Loongarch64
+#define INTROSPECTION_ENUM_PREFIX LOONGARCH64
+#include "define_introspection_and_hwcaps.inl"
+
+////////////////////////////////////////////////////////////////////////////////
+// Implementation.
+////////////////////////////////////////////////////////////////////////////////
+
+#include "internal/filesystem.h"
+#include "internal/stack_line_reader.h"
+#include <stdbool.h>
+#include <stdio.h>
+
+static const Loongarch64Info kEmptyLoongarch64Info;
+
+static void HandleLoongarch64Line(StringView line, Loongarch64Features* const features)
+{
+ for (size_t i = 0; i < LOONGARCH64_LAST_; ++i)
+ {
+ StringView flag = str(kCpuInfoFlags[i]);
+ int index_of_flag = CpuFeatures_StringView_IndexOf(line, flag);
+ bool is_set = index_of_flag != -1;
+ kSetters[i](features, is_set);
+ if (is_set)
+ line = CpuFeatures_StringView_PopFront(line, index_of_flag + flag.size);
+ }
+}
+
+static bool HandleLoongarch64Line(const LineResult result, Loongarch64Info* const info)
+{
+ StringView line = result.line;
+ StringView key, value;
+ if (CpuFeatures_StringView_GetAttributeKeyValue(line, &key, &value))
+ {
+ if (CpuFeatures_StringView_IsEquals(key, str("Features")))
+ {
+ HandleLoongarch64Line(value, &info->features);
+ }
+ }
+ return !result.eof;
+}
+
+static void FillProcCpuInfoData(Loongarch64Info* const info)
+{
+ const int fd = CpuFeatures_OpenFile("/proc/cpuinfo");
+ if (fd >= 0)
+ {
+ StackLineReader reader;
+ StackLineReader_Initialize(&reader, fd);
+ for (;;)
+ {
+ if (!HandleLoongarch64Line(StackLineReader_NextLine(&reader), info)) break;
+ }
+ CpuFeatures_CloseFile(fd);
+ }
+}
+
+Loongarch64Info GetLoongarch64Info(void)
+{
+ Loongarch64Info info = kEmptyLoongarch64Info;
+ FillProcCpuInfoData(&info);
+ return info;
+}
+
+#endif // defined(CPU_FEATURES_OS_LINUX) || defined(CPU_FEATURES_OS_ANDROID)
+#endif // CPU_FEATURES_ARCH_LOONGARCH64
--- gnss-sdr-0.0.18.orig/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/src/utils/list_cpu_features.c
+++ gnss-sdr-0.0.18/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/src/utils/list_cpu_features.c
@@ -19,6 +19,8 @@
#include "cpuinfo_arm.h"
#elif defined(CPU_FEATURES_ARCH_AARCH64)
#include "cpuinfo_aarch64.h"
+#elif defined(CPU_FEATURES_ARCH_LOONGARCH64)
+#include "cpuinfo_loongarch64.h"
#elif defined(CPU_FEATURES_ARCH_MIPS)
#include "cpuinfo_mips.h"
#elif defined(CPU_FEATURES_ARCH_PPC)
@@ -210,6 +212,9 @@ DEFINE_ADD_FLAGS(GetArmFeaturesEnumValue
#elif defined(CPU_FEATURES_ARCH_AARCH64)
DEFINE_ADD_FLAGS(GetAarch64FeaturesEnumValue, GetAarch64FeaturesEnumName,
Aarch64Features, AARCH64_LAST_)
+#elif defined(CPU_FEATURES_ARCH_LOONGARCH64)
+DEFINE_ADD_FLAGS(GetLoongarch64FeaturesEnumValue, GetLoongarch64FeaturesEnumName,
+ Loongarch64Features, LOONGARCH64_LAST_)
#elif defined(CPU_FEATURES_ARCH_MIPS)
DEFINE_ADD_FLAGS(GetMipsFeaturesEnumValue, GetMipsFeaturesEnumName,
MipsFeatures, MIPS_LAST_)
@@ -428,6 +433,10 @@ static Node* CreateTree(void)
AddMapEntry(root, "part", CreateInt(info.part));
AddMapEntry(root, "revision", CreateInt(info.revision));
AddFlags(root, &info.features);
+#elif defined(CPU_FEATURES_ARCH_LOONGARCH64)
+ const Loongarch64Info info = GetLoongarch64Info();
+ AddMapEntry(root, "arch", CreateString("loongarch64"));
+ AddFlags(root, &info.features);
#elif defined(CPU_FEATURES_ARCH_MIPS)
const MipsInfo info = GetMipsInfo();
AddMapEntry(root, "arch", CreateString("mips"));
--- gnss-sdr-0.0.18.orig/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/test/CMakeLists.txt
+++ gnss-sdr-0.0.18/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/test/CMakeLists.txt
@@ -83,6 +83,13 @@ if(PROCESSOR_IS_AARCH64)
add_test(NAME cpuinfo_aarch64_test COMMAND cpuinfo_aarch64_test)
endif()
##------------------------------------------------------------------------------
+## cpuinfo_loongarch64_test
+if(PROCESSOR_IS_LOONGARCH64)
+ add_executable(cpuinfo_loongarch64_test cpuinfo_loongarch64_test.cc ../src/impl_loongarch64_linux.c)
+ target_link_libraries(cpuinfo_loongarch64_test all_libraries)
+ add_test(NAME cpuinfo_loongarch64_test COMMAND cpuinfo_loongarch64_test)
+endif()
+##------------------------------------------------------------------------------
## cpuinfo_mips_test
if(PROCESSOR_IS_MIPS)
add_executable(cpuinfo_mips_test cpuinfo_mips_test.cc ../src/impl_mips_linux_or_android.c)
@@ -109,4 +116,4 @@ if(PROCESSOR_IS_RISCV)
add_executable(cpuinfo_riscv_test cpuinfo_riscv_test.cc ../src/impl_riscv_linux.c)
target_link_libraries(cpuinfo_riscv_test all_libraries)
add_test(NAME cpuinfo_riscv_test COMMAND cpuinfo_riscv_test)
-endif()
\ No newline at end of file
+endif()
--- /dev/null
+++ gnss-sdr-0.0.18/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/test/cpuinfo_loongarch64_test.cc
@@ -0,0 +1,113 @@
+// SPDX-FileCopyrightText: 2023 Google LLC
+// SPDX-License-Identifier: Apache-2.0
+
+#include "cpuinfo_loongarch64.h"
+#include "filesystem_for_testing.h"
+#include "gtest/gtest.h"
+#include "hwcaps_for_testing.h"
+
+namespace cpu_features
+{
+namespace
+{
+
+TEST(CpuinfoLoongarch64Test, Loongarch64FeaturesEnum)
+{
+ const char* last_name = GetLoongarch64FeaturesEnumName(LOONGARCH64_LAST_);
+ EXPECT_STREQ(last_name, "unknown_feature");
+ for (int i = static_cast<int>(LOONGARCH64_CPUCFG); i != static_cast<int>(LOONGARCH64_LAST_); ++i)
+ {
+ const auto feature = static_cast<Loongarch64FeaturesEnum>(i);
+ const char* name = GetLoongarch64FeaturesEnumName(feature);
+ ASSERT_FALSE(name == nullptr);
+ EXPECT_STRNE(name, "");
+ EXPECT_STRNE(name, last_name);
+ }
+}
+
+TEST(CpuinfoLoongarch64Test, Loongarch64CpuInfo)
+{
+ ResetHwcaps();
+ auto& fs = GetEmptyFilesystem();
+ fs.CreateFile("/proc/cpuinfo", R"(
+system type : generic-loongson-machine
+
+processor : 0
+package : 0
+core : 0
+global_id : 0
+CPU Family : Loongson-64bit
+Model Name : Loongson-3A5000-HV
+CPU Revision : 0x11
+FPU Revision : 0x00
+CPU MHz : 2500.00
+BogoMIPS : 5000.00
+TLB Entries : 2112
+Address Sizes : 48 bits physical, 48 bits virtual
+ISA : loongarch32 loongarch64
+Features : cpucfg lam ual fpu lsx lasx crc32 lvz
+Hardware Watchpoint : yes, iwatch count: 8, dwatch count: 8
+
+processor : 1
+package : 0
+core : 1
+global_id : 1
+CPU Family : Loongson-64bit
+Model Name : Loongson-3A5000-HV
+CPU Revision : 0x11
+FPU Revision : 0x00
+CPU MHz : 2500.00
+BogoMIPS : 5000.00
+TLB Entries : 2112
+Address Sizes : 48 bits physical, 48 bits virtual
+ISA : loongarch32 loongarch64
+Features : cpucfg lam ual fpu lsx lasx crc32 lvz
+Hardware Watchpoint : yes, iwatch count: 8, dwatch count: 8
+
+processor : 2
+package : 0
+core : 2
+global_id : 2
+CPU Family : Loongson-64bit
+Model Name : Loongson-3A5000-HV
+CPU Revision : 0x11
+FPU Revision : 0x00
+CPU MHz : 2500.00
+BogoMIPS : 5000.00
+TLB Entries : 2112
+Address Sizes : 48 bits physical, 48 bits virtual
+ISA : loongarch32 loongarch64
+Features : cpucfg lam ual fpu lsx lasx crc32 lvz
+Hardware Watchpoint : yes, iwatch count: 8, dwatch count: 8
+
+processor : 3
+package : 0
+core : 3
+global_id : 3
+CPU Family : Loongson-64bit
+Model Name : Loongson-3A5000-HV
+CPU Revision : 0x11
+FPU Revision : 0x00
+CPU MHz : 2500.00
+BogoMIPS : 5000.00
+TLB Entries : 2112
+Address Sizes : 48 bits physical, 48 bits virtual
+ISA : loongarch32 loongarch64
+Features : cpucfg lam ual fpu lsx lasx crc32 lvz
+Hardware Watchpoint : yes, iwatch count: 8, dwatch count: 8)");
+ const auto info = GetLoongarch64Info();
+
+ EXPECT_TRUE(info.features.cpucfg);
+ EXPECT_TRUE(info.features.isa);
+ EXPECT_TRUE(info.features.ual);
+ EXPECT_TRUE(info.features.fpu);
+ EXPECT_FALSE(info.features.lsx);
+ EXPECT_TRUE(info.features.lasx);
+ EXPECT_TRUE(info.features.crc32);
+ EXPECT_TRUE(info.features.complex);
+ EXPECT_TRUE(info.features.crypto);
+ EXPECT_FALSE(info.features.lvz);
+}
+
+} // namespace
+} // namespace cpu_features
--- gnss-sdr-0.0.18.orig/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/tmpl/volk_gnsssdr_cpu.tmpl.c
+++ gnss-sdr-0.0.18/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/tmpl/volk_gnsssdr_cpu.tmpl.c
@@ -22,6 +22,8 @@
#include "cpuinfo_arm.h"
#elif defined(CPU_FEATURES_ARCH_AARCH64)
#include "cpuinfo_aarch64.h"
+#elif defined(CPU_FEATURES_ARCH_LOONGARCH64)
+#include "cpuinfo_loongarch64.h"
#elif defined(CPU_FEATURES_ARCH_MIPS)
#include "cpuinfo_mips.h"
#elif defined(CPU_FEATURES_ARCH_PPC)
@@ -53,6 +55,10 @@ static int i_can_has_${arch.name} (void)
#if defined(CPU_FEATURES_ARCH_MIPS)
if (GetMipsInfo().features.${check} == 0){ return 0; }
#endif
+ %elif "loongarch64" in arch.name:
+#if defined(CPU_FEATURES_ARCH_LOONGARCH64)
+ if (GetLoongarch64Info().features.${check} == 0){ return 0; }
+#endif
%elif "ppc" in arch.name:
#if defined(CPU_FEATURES_ARCH_PPC)
if (GetPPCInfo().features.${check} == 0){ return 0; }
Reply to: