Add new AMX and other feature flags

This commit is contained in:
Sander van den Bosch
2024-11-20 13:50:24 +01:00
committed by Christoffer Lerno
parent ba54232b8d
commit 2788c4cc00
3 changed files with 74 additions and 40 deletions

View File

@@ -25,6 +25,11 @@ enum X86Feature
{
ADX,
AES,
AMX_AVX512,
AMX_FP8,
AMX_MOVRS,
AMX_TF32,
AMX_TRANSPOSE,
AMX_BF16,
AMX_COMPLEX,
AMX_FP16,
@@ -34,6 +39,8 @@ enum X86Feature
AVX,
AVX10_1_256,
AVX10_1_512,
AVX10_2_256,
AVX10_2_512,
AVX2,
AVX5124FMAPS,
AVX5124VNNIW,
@@ -84,6 +91,7 @@ enum X86Feature
MOVBE,
MOVDIR64B,
MOVDIRI,
MOVRS,
MWAITX,
PCLMUL,
PCONFIG,

View File

@@ -1471,22 +1471,29 @@ typedef enum
{
X86_FEAT_ADX,
X86_FEAT_AES,
X86_FEAT_AMX_AVX512,
X86_FEAT_AMX_FP8,
X86_FEAT_AMX_MOVRS,
X86_FEAT_AMX_TF32,
X86_FEAT_AMX_TRANSPOSE,
X86_FEAT_AMX_BF16,
X86_FEAT_AMX_COMPLEX,
X86_FEAT_AMX_FP16,
X86_FEAT_AMX_INT8,
X86_FEAT_AMX_TILE,
X86_FEAT_APX_EGPR,
X86_FEAT_APX_PUSH2POP2,
X86_FEAT_APX_PPX,
X86_FEAT_APX_NDD,
X86_FEAT_APX_CCMP,
X86_FEAT_APX_NF,
X86_FEAT_APX_CF,
X86_FEAT_APX_ZU,
X86_FEAT_APX_PUSH2POP2,
X86_FEAT_APX_PPX,
X86_FEAT_APX_NDD,
X86_FEAT_APX_CCMP,
X86_FEAT_APX_NF,
X86_FEAT_APX_CF,
X86_FEAT_APX_ZU,
X86_FEAT_AVX,
X86_FEAT_AVX10_1_512,
X86_FEAT_AVX10_1_256,
X86_FEAT_AVX10_2_512,
X86_FEAT_AVX10_2_256,
X86_FEAT_AVX2,
X86_FEAT_AVX5124FMAPS,
X86_FEAT_AVX5124VNNIW,
@@ -1539,6 +1546,7 @@ typedef enum
X86_FEAT_MOVBE,
X86_FEAT_MOVDIR64B,
X86_FEAT_MOVDIRI,
X86_FEAT_MOVRS,
X86_FEAT_MWAITX,
X86_FEAT_PCLMUL,
X86_FEAT_PCONFIG,

View File

@@ -2,11 +2,11 @@
#include <llvm-c/Target.h>
#include <llvm-c/TargetMachine.h>
#include <llvm-c/Core.h>
#endif
#endif
#include "compiler_internal.h"
#if LLVM_AVAILABLE
#include "c3_llvm.h"
#else
#else
#include "utils/hostinfo.h"
#endif
@@ -299,17 +299,19 @@ static char *x86_feature_name[] = {
[X86_FEAT_SSE4_1] = "sse4.1",
[X86_FEAT_SSE4_2] = "sse4.2",
[X86_FEAT_APX_EGPR] = "egpr",
[X86_FEAT_APX_PUSH2POP2] = "push2pop2",
[X86_FEAT_APX_PPX] = "ppx",
[X86_FEAT_APX_NDD] = "ndd",
[X86_FEAT_APX_CCMP] = "ccmp",
[X86_FEAT_APX_NF] = "nf",
[X86_FEAT_APX_CF] = "cf",
[X86_FEAT_APX_ZU] = "zu",
[X86_FEAT_AVX] = "avx",
[X86_FEAT_APX_PUSH2POP2] = "push2pop2",
[X86_FEAT_APX_PPX] = "ppx",
[X86_FEAT_APX_NDD] = "ndd",
[X86_FEAT_APX_CCMP] = "ccmp",
[X86_FEAT_APX_NF] = "nf",
[X86_FEAT_APX_CF] = "cf",
[X86_FEAT_APX_ZU] = "zu",
[X86_FEAT_AVX] = "avx",
[X86_FEAT_AVX2] = "avx2",
[X86_FEAT_AVX10_1_512] = "avx10.1-512",
[X86_FEAT_AVX10_1_256] = "avx10.1-256",
[X86_FEAT_AVX10_2_512] = "avx10.2-512",
[X86_FEAT_AVX10_2_256] = "avx10.2-256",
[X86_FEAT_SSE4_A] = "sse4a",
[X86_FEAT_FMA4] = "fma4",
[X86_FEAT_XOP] = "xop",
@@ -341,6 +343,12 @@ static char *x86_feature_name[] = {
[X86_FEAT_AMX_BF16] = "amx-bf16",
[X86_FEAT_AMX_INT8] = "amx-int8",
[X86_FEAT_AMX_TILE] = "amx-tile",
[X86_FEAT_AMX_AVX512] = "amx-avx512",
[X86_FEAT_AMX_FP8] = "amx-fp8",
[X86_FEAT_AMX_MOVRS] = "amx-movrs",
[X86_FEAT_AMX_TF32] = "amx-tf32",
[X86_FEAT_AMX_TRANSPOSE] = "amx-transpose",
[X86_FEAT_MOVRS] = "movrs",
[X86_FEAT_CLDEMOTE] = "cldemote",
[X86_FEAT_CLFLUSHOPT] = "clflushopt",
[X86_FEAT_CLWB] = "clwb",
@@ -591,8 +599,13 @@ static void x86_features_add_feature(X86Features *cpu_features, X86Feature featu
return;
case X86_FEAT_AMX_BF16:
case X86_FEAT_AMX_FP16:
case X86_FEAT_AMX_FP8:
case X86_FEAT_AMX_INT8:
case X86_FEAT_AMX_COMPLEX:
case X86_FEAT_AMX_TRANSPOSE:
case X86_FEAT_AMX_TF32:
case X86_FEAT_AMX_MOVRS:
case X86_FEAT_AMX_AVX512:
x86_features_add_feature(cpu_features, X86_FEAT_AMX_TILE);
return;
case X86_FEAT_AVXVNNIINT8:
@@ -647,6 +660,7 @@ static void x86_features_add_feature(X86Features *cpu_features, X86Feature featu
case X86_FEAT_MOVBE:
case X86_FEAT_MOVDIR64B:
case X86_FEAT_MOVDIRI:
case X86_FEAT_MOVRS:
case X86_FEAT_PCONFIG:
case X86_FEAT_POPCNT:
case X86_FEAT_PKU:
@@ -675,20 +689,24 @@ static void x86_features_add_feature(X86Features *cpu_features, X86Feature featu
case X86_FEAT_XSAVE:
case X86_FEAT_EVEX512:
case X86_FEAT_USERMSR:
case X86_FEAT_APX_EGPR:
case X86_FEAT_APX_PUSH2POP2:
case X86_FEAT_APX_PPX:
case X86_FEAT_APX_NDD:
case X86_FEAT_APX_CCMP:
case X86_FEAT_APX_NF:
case X86_FEAT_APX_CF:
case X86_FEAT_APX_ZU:
case X86_FEAT_APX_EGPR:
case X86_FEAT_APX_PUSH2POP2:
case X86_FEAT_APX_PPX:
case X86_FEAT_APX_NDD:
case X86_FEAT_APX_CCMP:
case X86_FEAT_APX_NF:
case X86_FEAT_APX_CF:
case X86_FEAT_APX_ZU:
return;
case X86_FEAT_AVX10_1_512:
x86_features_add_feature(cpu_features, X86_FEAT_AVX10_1_256);
x86_features_add_feature(cpu_features, X86_FEAT_EVEX512);
case X86_FEAT_AVX10_2_512:
x86_features_add_feature(cpu_features, X86_FEAT_AVX10_1_256);
x86_features_add_feature(cpu_features, X86_FEAT_EVEX512);
return;
case X86_FEAT_AVX10_1_256:
case X86_FEAT_AVX10_2_256:
x86_features_add_feature(cpu_features, X86_FEAT_AVX512CD);
x86_features_add_feature(cpu_features, X86_FEAT_AVX512VBMI);
x86_features_add_feature(cpu_features, X86_FEAT_AVX512VBMI2);
@@ -806,10 +824,10 @@ static const char *x86_cpu_from_set(X86CpuSet set)
case X86CPU_NATIVE:
#if LLVM_AVAILABLE
return LLVMGetHostCPUName();
#else
return hostinfo_x86_cpu_name();
#else
return hostinfo_x86_cpu_name();
#endif
}
}
UNREACHABLE
}
@@ -818,10 +836,10 @@ static void x86_features_from_host(X86Features *cpu_features)
#if LLVM_AVAILABLE
char *features = LLVMGetHostCPUFeatures();
INFO_LOG("Detected the following host features: %s", features);
INFO_LOG("For %s",
LLVMGetHostCPUName());
INFO_LOG("For %s",
LLVMGetHostCPUName());
char *tok = strtok(features, ",");
char *tok = strtok(features, ",");
*cpu_features = x86_feature_zero;
while (tok != NULL)
{
@@ -851,8 +869,8 @@ static void x86_features_from_host(X86Features *cpu_features)
tok = strtok(NULL, ",");
}
LLVMDisposeMessage(features);
#else
hostinfo_x86_features(cpu_features);
#else
hostinfo_x86_features(cpu_features);
#endif
}
@@ -1845,7 +1863,7 @@ void *llvm_target_machine_create(void)
return result;
}
#else
#else
#define XTENSA_AVAILABLE 1
@@ -1907,9 +1925,9 @@ void target_setup(BuildTarget *target)
INFO_LOG("Triple picked was %s.", compiler.platform.target_triple);
#if LLVM_AVAILABLE
INFO_LOG("Default was %s.", LLVM_DEFAULT_TARGET_TRIPLE);
#else
INFO_LOG("Default was %s.", hostinfo_default_triple());
INFO_LOG("Default was %s.", LLVM_DEFAULT_TARGET_TRIPLE);
#else
INFO_LOG("Default was %s.", hostinfo_default_triple());
#endif
StringSlice target_triple_string = slice_from_string(compiler.platform.target_triple);
@@ -2054,9 +2072,9 @@ void target_setup(BuildTarget *target)
compiler.platform.arch,
compiler.platform.environment_type);
compiler.platform.reloc_model = arch_os_reloc_default(compiler.platform.arch,
compiler.platform.os,
compiler.platform.environment_type,
compiler.build.type != TARGET_TYPE_EXECUTABLE);
compiler.platform.os,
compiler.platform.environment_type,
compiler.build.type != TARGET_TYPE_EXECUTABLE);
compiler.platform.pic_required = arch_os_pic_default_forced(compiler.platform.arch, compiler.platform.os);
// Override PIC, but only if the platform does not require PIC
if (target->reloc_model != RELOC_DEFAULT