mirror of
https://github.com/google/cpu_features.git
synced 2025-07-04 06:25:17 +02:00
[NFC] Generate separate tables via macro (#137)
This is a non functional change, it allows: - Getting rid of `unix_features_aggregator` - Have a single blob describing the features - Fix wrong mocking of `hwcaps` Downside: abuse of macros makes the code slightly magical and harder to understand. It think it's still an improvement over the current situation as there's less repetition and less chances to get something wrong.
This commit is contained in:

committed by
GitHub

parent
3cc8f310d9
commit
9a8f04b24c
@ -22,69 +22,12 @@
|
||||
#include "internal/hwcaps.h"
|
||||
#include "internal/stack_line_reader.h"
|
||||
#include "internal/string_view.h"
|
||||
#include "internal/unix_features_aggregator.h"
|
||||
|
||||
DECLARE_SETTER_AND_GETTER(ArmFeatures, swp)
|
||||
DECLARE_SETTER_AND_GETTER(ArmFeatures, half)
|
||||
DECLARE_SETTER_AND_GETTER(ArmFeatures, thumb)
|
||||
DECLARE_SETTER_AND_GETTER(ArmFeatures, _26bit)
|
||||
DECLARE_SETTER_AND_GETTER(ArmFeatures, fastmult)
|
||||
DECLARE_SETTER_AND_GETTER(ArmFeatures, fpa)
|
||||
DECLARE_SETTER_AND_GETTER(ArmFeatures, vfp)
|
||||
DECLARE_SETTER_AND_GETTER(ArmFeatures, edsp)
|
||||
DECLARE_SETTER_AND_GETTER(ArmFeatures, java)
|
||||
DECLARE_SETTER_AND_GETTER(ArmFeatures, iwmmxt)
|
||||
DECLARE_SETTER_AND_GETTER(ArmFeatures, crunch)
|
||||
DECLARE_SETTER_AND_GETTER(ArmFeatures, thumbee)
|
||||
DECLARE_SETTER_AND_GETTER(ArmFeatures, neon)
|
||||
DECLARE_SETTER_AND_GETTER(ArmFeatures, vfpv3)
|
||||
DECLARE_SETTER_AND_GETTER(ArmFeatures, vfpv3d16)
|
||||
DECLARE_SETTER_AND_GETTER(ArmFeatures, tls)
|
||||
DECLARE_SETTER_AND_GETTER(ArmFeatures, vfpv4)
|
||||
DECLARE_SETTER_AND_GETTER(ArmFeatures, idiva)
|
||||
DECLARE_SETTER_AND_GETTER(ArmFeatures, idivt)
|
||||
DECLARE_SETTER_AND_GETTER(ArmFeatures, vfpd32)
|
||||
DECLARE_SETTER_AND_GETTER(ArmFeatures, lpae)
|
||||
DECLARE_SETTER_AND_GETTER(ArmFeatures, evtstrm)
|
||||
DECLARE_SETTER_AND_GETTER(ArmFeatures, aes)
|
||||
DECLARE_SETTER_AND_GETTER(ArmFeatures, pmull)
|
||||
DECLARE_SETTER_AND_GETTER(ArmFeatures, sha1)
|
||||
DECLARE_SETTER_AND_GETTER(ArmFeatures, sha2)
|
||||
DECLARE_SETTER_AND_GETTER(ArmFeatures, crc32)
|
||||
|
||||
static const CapabilityConfig kConfigs[] = {
|
||||
// clang-format off
|
||||
[ARM_SWP] = {{ARM_HWCAP_SWP, 0}, "swp", &set_swp, &get_swp},
|
||||
[ARM_HALF] = {{ARM_HWCAP_HALF, 0}, "half", &set_half, &get_half},
|
||||
[ARM_THUMB] = {{ARM_HWCAP_THUMB, 0}, "thumb", &set_thumb, &get_thumb},
|
||||
[ARM_26BIT] = {{ARM_HWCAP_26BIT, 0}, "26bit", &set__26bit, &get__26bit},
|
||||
[ARM_FASTMULT] = {{ARM_HWCAP_FAST_MULT, 0}, "fastmult", &set_fastmult, &get_fastmult},
|
||||
[ARM_FPA] = {{ARM_HWCAP_FPA, 0}, "fpa", &set_fpa, &get_fpa},
|
||||
[ARM_VFP] = {{ARM_HWCAP_VFP, 0}, "vfp", &set_vfp, &get_vfp},
|
||||
[ARM_EDSP] = {{ARM_HWCAP_EDSP, 0}, "edsp", &set_edsp, &get_edsp},
|
||||
[ARM_JAVA] = {{ARM_HWCAP_JAVA, 0}, "java", &set_java, &get_java},
|
||||
[ARM_IWMMXT] = {{ARM_HWCAP_IWMMXT, 0}, "iwmmxt", &set_iwmmxt, &get_iwmmxt},
|
||||
[ARM_CRUNCH] = {{ARM_HWCAP_CRUNCH, 0}, "crunch", &set_crunch, &get_crunch},
|
||||
[ARM_THUMBEE] = {{ARM_HWCAP_THUMBEE, 0}, "thumbee", &set_thumbee, &get_thumbee},
|
||||
[ARM_NEON] = {{ARM_HWCAP_NEON, 0}, "neon", &set_neon, &get_neon},
|
||||
[ARM_VFPV3] = {{ARM_HWCAP_VFPV3, 0}, "vfpv3", &set_vfpv3, &get_vfpv3},
|
||||
[ARM_VFPV3D16] = {{ARM_HWCAP_VFPV3D16, 0}, "vfpv3d16", &set_vfpv3d16, &get_vfpv3d16},
|
||||
[ARM_TLS] = {{ARM_HWCAP_TLS, 0}, "tls", &set_tls, &get_tls},
|
||||
[ARM_VFPV4] = {{ARM_HWCAP_VFPV4, 0}, "vfpv4", &set_vfpv4, &get_vfpv4},
|
||||
[ARM_IDIVA] = {{ARM_HWCAP_IDIVA, 0}, "idiva", &set_idiva, &get_idiva},
|
||||
[ARM_IDIVT] = {{ARM_HWCAP_IDIVT, 0}, "idivt", &set_idivt, &get_idivt},
|
||||
[ARM_VFPD32] = {{ARM_HWCAP_VFPD32, 0}, "vfpd32", &set_vfpd32, &get_vfpd32},
|
||||
[ARM_LPAE] = {{ARM_HWCAP_LPAE, 0}, "lpae", &set_lpae, &get_lpae},
|
||||
[ARM_EVTSTRM] = {{ARM_HWCAP_EVTSTRM, 0}, "evtstrm", &set_evtstrm, &get_evtstrm},
|
||||
[ARM_AES] = {{0, ARM_HWCAP2_AES}, "aes", &set_aes, &get_aes},
|
||||
[ARM_PMULL] = {{0, ARM_HWCAP2_PMULL}, "pmull", &set_pmull, &get_pmull},
|
||||
[ARM_SHA1] = {{0, ARM_HWCAP2_SHA1}, "sha1", &set_sha1, &get_sha1},
|
||||
[ARM_SHA2] = {{0, ARM_HWCAP2_SHA2}, "sha2", &set_sha2, &get_sha2},
|
||||
[ARM_CRC32] = {{0, ARM_HWCAP2_CRC32}, "crc32", &set_crc32, &get_crc32},
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static const size_t kConfigsSize = sizeof(kConfigs) / sizeof(CapabilityConfig);
|
||||
// Generation of feature's getters/setters functions and kGetters, kSetters,
|
||||
// kCpuInfoFlags and kHardwareCapabilities global tables.
|
||||
#define DEFINE_TABLE_FEATURE_TYPE ArmFeatures
|
||||
#define DEFINE_TABLE_DB_FILENAME "cpuinfo_arm_db.inl"
|
||||
#include "define_tables.h"
|
||||
|
||||
typedef struct {
|
||||
bool processor_reports_armv6;
|
||||
@ -106,7 +49,10 @@ static bool HandleArmLine(const LineResult result, ArmInfo* const info,
|
||||
StringView key, value;
|
||||
if (CpuFeatures_StringView_GetAttributeKeyValue(line, &key, &value)) {
|
||||
if (CpuFeatures_StringView_IsEquals(key, str("Features"))) {
|
||||
CpuFeatures_SetFromFlags(kConfigsSize, kConfigs, value, &info->features);
|
||||
for (size_t i = 0; i < ARM_LAST_; ++i) {
|
||||
kSetters[i](&info->features,
|
||||
CpuFeatures_StringView_HasWord(value, kCpuInfoFlags[i]));
|
||||
}
|
||||
} else if (CpuFeatures_StringView_IsEquals(key, str("CPU implementer"))) {
|
||||
info->implementer = CpuFeatures_StringView_ParsePositiveNumber(value);
|
||||
} else if (CpuFeatures_StringView_IsEquals(key, str("CPU variant"))) {
|
||||
@ -212,9 +158,12 @@ ArmInfo GetArmInfo(void) {
|
||||
ProcCpuInfoData proc_cpu_info_data = kEmptyProcCpuInfoData;
|
||||
|
||||
FillProcCpuInfoData(&info, &proc_cpu_info_data);
|
||||
CpuFeatures_OverrideFromHwCaps(kConfigsSize, kConfigs,
|
||||
CpuFeatures_GetHardwareCapabilities(),
|
||||
&info.features);
|
||||
const HardwareCapabilities hwcaps = CpuFeatures_GetHardwareCapabilities();
|
||||
for (size_t i = 0; i < ARM_LAST_; ++i) {
|
||||
if (CpuFeatures_IsHwCapsSet(kHardwareCapabilities[i], hwcaps)) {
|
||||
kSetters[i](&info.features, true);
|
||||
}
|
||||
}
|
||||
|
||||
FixErrors(&info, &proc_cpu_info_data);
|
||||
|
||||
@ -226,11 +175,11 @@ ArmInfo GetArmInfo(void) {
|
||||
|
||||
int GetArmFeaturesEnumValue(const ArmFeatures* features,
|
||||
ArmFeaturesEnum value) {
|
||||
if (value >= kConfigsSize) return false;
|
||||
return kConfigs[value].get_bit((ArmFeatures*)features);
|
||||
if (value >= ARM_LAST_) return false;
|
||||
return kGetters[value](features);
|
||||
}
|
||||
|
||||
const char* GetArmFeaturesEnumName(ArmFeaturesEnum value) {
|
||||
if (value >= kConfigsSize) return "unknown feature";
|
||||
return kConfigs[value].proc_cpuinfo_flag;
|
||||
if (value >= ARM_LAST_) return "unknown feature";
|
||||
return kCpuInfoFlags[value];
|
||||
}
|
||||
|
Reference in New Issue
Block a user