-
Notifications
You must be signed in to change notification settings - Fork 262
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* Add macros for LOONGARCH hwcaps * Update hwcaps.h * LoongArch Support * Remove unused definitions. * Add ignored feature in test.
- Loading branch information
1 parent
804eaa0
commit 0d5f398
Showing
9 changed files
with
388 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
// Copyright 2023 Google LLC | ||
// | ||
// Licensed under the Apache License, Version 2.0 (the "License"); | ||
// you may not use this file except in compliance with the License. | ||
// You may obtain a copy of the License at | ||
// | ||
// http://www.apache.org/licenses/LICENSE-2.0 | ||
// | ||
// Unless required by applicable law or agreed to in writing, software | ||
// distributed under the License is distributed on an "AS IS" BASIS, | ||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
// See the License for the specific language governing permissions and | ||
// limitations under the License. | ||
|
||
#ifndef CPU_FEATURES_INCLUDE_CPUINFO_LOONGARCH_H_ | ||
#define CPU_FEATURES_INCLUDE_CPUINFO_LOONGARCH_H_ | ||
|
||
#include "cpu_features_cache_info.h" | ||
#include "cpu_features_macros.h" | ||
|
||
#if !defined(CPU_FEATURES_ARCH_LOONGARCH) | ||
#error "Including cpuinfo_loongarch.h from a non-loongarch target." | ||
#endif | ||
|
||
CPU_FEATURES_START_CPP_NAMESPACE | ||
|
||
typedef struct { | ||
// Base | ||
int CPUCFG : 1; // Instruction for Identify CPU Features | ||
|
||
// Extension | ||
int LAM : 1; // Extension for Atomic Memory Access Instructions | ||
int UAL : 1; // Extension for Non-Aligned Memory Access | ||
int FPU : 1; // Extension for Basic Floating-Point Instructions | ||
int LSX : 1; // Extension for Loongson SIMD eXtension | ||
int LASX : 1; // Extension for Loongson Advanced SIMD eXtension | ||
int CRC32 : 1; // Extension for Cyclic Redundancy Check Instructions | ||
int COMPLEX : 1; // Extension for Complex Vector Operation Instructions | ||
int CRYPTO : 1; // Extension for Encryption And Decryption Vector Instructions | ||
int LVZ : 1; // Extension for Virtualization | ||
int LBT_X86 : 1; // Extension for X86 Binary Translation Extension | ||
int LBT_ARM : 1; // Extension for ARM Binary Translation Extension | ||
int LBT_MIPS : 1; // Extension for MIPS Binary Translation Extension | ||
int PTW : 1; // Extension for Page Table Walker | ||
|
||
} LoongArchFeatures; | ||
|
||
typedef struct { | ||
LoongArchFeatures features; | ||
} LoongArchInfo; | ||
|
||
typedef enum { | ||
LOONGARCH_CPUCFG, | ||
LOONGARCH_LAM, | ||
LOONGARCH_UAL, | ||
LOONGARCH_FPU, | ||
LOONGARCH_LSX, | ||
LOONGARCH_LASX, | ||
LOONGARCH_CRC32, | ||
LOONGARCH_COMPLEX, | ||
LOONGARCH_CRYPTO, | ||
LOONGARCH_LVZ, | ||
LOONGARCH_LBT_X86, | ||
LOONGARCH_LBT_ARM, | ||
LOONGARCH_LBT_MIPS, | ||
LOONGARCH_PTW, | ||
LOONGARCH_LAST_, | ||
} LoongArchFeaturesEnum; | ||
|
||
LoongArchInfo GetLoongArchInfo(void); | ||
int GetLoongArchFeaturesEnumValue(const LoongArchFeatures* features, | ||
LoongArchFeaturesEnum value); | ||
const char* GetLoongArchFeaturesEnumName(LoongArchFeaturesEnum); | ||
|
||
CPU_FEATURES_END_CPP_NAMESPACE | ||
|
||
#endif // CPU_FEATURES_INCLUDE_CPUINFO_LOONGARCH_H_ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -20,6 +20,7 @@ enum Cpu | |
MIPS, | ||
POWER, | ||
RISCV, | ||
LOONGARCH, | ||
s390x, | ||
} | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
// Copyright 2023 Google LLC | ||
// | ||
// Licensed under the Apache License, Version 2.0 (the "License"); | ||
// you may not use this file except in compliance with the License. | ||
// You may obtain a copy of the License at | ||
// | ||
// http://www.apache.org/licenses/LICENSE-2.0 | ||
// | ||
// Unless required by applicable law or agreed to in writing, software | ||
// distributed under the License is distributed on an "AS IS" BASIS, | ||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
// See the License for the specific language governing permissions and | ||
// limitations under the License. | ||
|
||
#include "cpu_features_macros.h" | ||
|
||
#ifdef CPU_FEATURES_ARCH_LOONGARCH | ||
#if defined(CPU_FEATURES_OS_LINUX) | ||
|
||
#include "cpuinfo_loongarch.h" | ||
|
||
//////////////////////////////////////////////////////////////////////////////// | ||
// Definitions for introspection. | ||
//////////////////////////////////////////////////////////////////////////////// | ||
#define INTROSPECTION_TABLE \ | ||
LINE(LOONGARCH_CPUCFG, CPUCFG, "cfg", HWCAP_LOONGARCH_CPUCFG, 0) \ | ||
LINE(LOONGARCH_LAM, LAM, "lam", HWCAP_LOONGARCH_LAM, 0) \ | ||
LINE(LOONGARCH_UAL, UAL, "ual", HWCAP_LOONGARCH_UAL, 0) \ | ||
LINE(LOONGARCH_FPU, FPU, "fpu", HWCAP_LOONGARCH_FPU, 0) \ | ||
LINE(LOONGARCH_LSX, LSX, "lsx", HWCAP_LOONGARCH_LSX, 0) \ | ||
LINE(LOONGARCH_LASX, LASX, "lasx", HWCAP_LOONGARCH_LASX, 0) \ | ||
LINE(LOONGARCH_CRC32, CRC32, "crc32", HWCAP_LOONGARCH_CRC32, 0) \ | ||
LINE(LOONGARCH_COMPLEX, COMPLEX, "complex", HWCAP_LOONGARCH_COMPLEX, 0) \ | ||
LINE(LOONGARCH_CRYPTO, CRYPTO, "crypto", HWCAP_LOONGARCH_CRYPTO, 0) \ | ||
LINE(LOONGARCH_LVZ, LVZ, "lvz", HWCAP_LOONGARCH_LVZ, 0) \ | ||
LINE(LOONGARCH_LBT_X86, LBT_X86, "lbt_x86", HWCAP_LOONGARCH_LBT_X86, 0) \ | ||
LINE(LOONGARCH_LBT_ARM, LBT_ARM, "lbt_arm", HWCAP_LOONGARCH_LBT_ARM, 0) \ | ||
LINE(LOONGARCH_LBT_MIPS, LBT_MIPS, "lbt_mips", HWCAP_LOONGARCH_LBT_MIPS, 0) \ | ||
LINE(LOONGARCH_PTW, PTW, "ptw", HWCAP_LOONGARCH_PTW, 0) | ||
#define INTROSPECTION_PREFIX LoongArch | ||
#define INTROSPECTION_ENUM_PREFIX LOONGARCH | ||
#include "define_introspection_and_hwcaps.inl" | ||
|
||
//////////////////////////////////////////////////////////////////////////////// | ||
// Implementation. | ||
//////////////////////////////////////////////////////////////////////////////// | ||
|
||
#include <stdbool.h> | ||
#include <stdio.h> | ||
|
||
#include "internal/filesystem.h" | ||
#include "internal/stack_line_reader.h" | ||
|
||
static const LoongArchInfo kEmptyLoongArchInfo; | ||
|
||
static bool HandleLoongArchLine(const LineResult result, LoongArchInfo* const info) { | ||
StringView line = result.line; | ||
StringView key, value; | ||
if (CpuFeatures_StringView_GetAttributeKeyValue(line, &key, &value)) { | ||
if (CpuFeatures_StringView_IsEquals(key, str("Features"))) { | ||
for (size_t i = 0; i < LOONGARCH_LAST_; ++i) { | ||
kSetters[i](&info->features, CpuFeatures_StringView_HasWord( | ||
value, kCpuInfoFlags[i], ' ')); | ||
} | ||
} | ||
} | ||
return !result.eof; | ||
} | ||
|
||
static void FillProcCpuInfoData(LoongArchInfo* const info) { | ||
const int fd = CpuFeatures_OpenFile("/proc/cpuinfo"); | ||
if (fd >= 0) { | ||
StackLineReader reader; | ||
StackLineReader_Initialize(&reader, fd); | ||
for (;;) { | ||
if (!HandleLoongArchLine(StackLineReader_NextLine(&reader), info)) break; | ||
} | ||
CpuFeatures_CloseFile(fd); | ||
} | ||
} | ||
|
||
LoongArchInfo GetLoongArchInfo(void) { | ||
LoongArchInfo info = kEmptyLoongArchInfo; | ||
FillProcCpuInfoData(&info); | ||
return info; | ||
} | ||
|
||
#endif // defined(CPU_FEATURES_OS_LINUX) | ||
#endif // CPU_FEATURES_ARCH_LOONGARCH |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.