Skip to content

Commit f229ba4

Browse files
authoredNov 10, 2023
[X86][AVX10] Permit AVX512 options/features used together with AVX10 (#71318)
This patch relaxes the driver logic to permit combinations between AVX512 and AVX10 options and makes sure we have a unified behavior between options and features combination. Here are rules we are following when handle these combinations: 1. evex512 can only be used for avx512xxx options/features. It will be ignored if used without them; 2. avx512xxx and avx10.xxx are options in two worlds. Avoid to use them together in any case. It will enable a common super set when they are used together. E.g., "-mavx512f -mavx10.1-256" euqals "-mavx10.1-512". Compiler emits warnings when user using combinations like "-mavx512f -mavx10.1-256" in case they won't get unexpected result silently. Function target feature attribute follows the same rule now. We have to add "no-evex512" feature for intrinsics shared between AVX512 and AVX10. We also add "no-evex512" for early ISAs like AVX etc., because some of them are called by AVX512 intrinsics.
1 parent 6343ee7 commit f229ba4

33 files changed

+245
-101
lines changed
 

‎clang/include/clang/Basic/DiagnosticCommonKinds.td

+2
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,8 @@ def err_opt_not_valid_on_target : Error<
346346
"option '%0' cannot be specified on this target">;
347347
def err_invalid_feature_combination : Error<
348348
"invalid feature combination: %0">;
349+
def warn_invalid_feature_combination : Warning<
350+
"invalid feature combination: %0">, InGroup<DiagGroup<"invalid-feature-combination">>;
349351
def warn_target_unrecognized_env : Warning<
350352
"mismatch between architecture and environment in target triple '%0'; did you mean '%1'?">,
351353
InGroup<InvalidCommandLineArgument>;

‎clang/lib/Basic/Targets/X86.cpp

+42-21
Original file line numberDiff line numberDiff line change
@@ -119,9 +119,14 @@ bool X86TargetInfo::initFeatureMap(
119119
setFeatureEnabled(Features, F, true);
120120

121121
std::vector<std::string> UpdatedFeaturesVec;
122-
bool HasEVEX512 = true;
122+
std::vector<std::string> UpdatedAVX10FeaturesVec;
123+
enum { FE_NOSET = -1, FE_FALSE, FE_TRUE };
124+
int HasEVEX512 = FE_NOSET;
123125
bool HasAVX512F = false;
124126
bool HasAVX10 = false;
127+
bool HasAVX10_512 = false;
128+
std::string LastAVX10;
129+
std::string LastAVX512;
125130
for (const auto &Feature : FeaturesVec) {
126131
// Expand general-regs-only to -x86, -mmx and -sse
127132
if (Feature == "+general-regs-only") {
@@ -131,35 +136,51 @@ bool X86TargetInfo::initFeatureMap(
131136
continue;
132137
}
133138

134-
if (Feature.substr(0, 7) == "+avx10.") {
135-
HasAVX10 = true;
136-
HasAVX512F = true;
137-
if (Feature.substr(Feature.size() - 3, 3) == "512") {
138-
HasEVEX512 = true;
139-
} else if (Feature.substr(7, 2) == "1-") {
140-
HasEVEX512 = false;
139+
if (Feature.substr(1, 6) == "avx10.") {
140+
if (Feature[0] == '+') {
141+
HasAVX10 = true;
142+
if (Feature.substr(Feature.size() - 3, 3) == "512")
143+
HasAVX10_512 = true;
144+
LastAVX10 = Feature;
145+
} else if (HasAVX10 && Feature == "-avx10.1-256") {
146+
HasAVX10 = false;
147+
HasAVX10_512 = false;
148+
} else if (HasAVX10_512 && Feature == "-avx10.1-512") {
149+
HasAVX10_512 = false;
141150
}
151+
// Postpone AVX10 features handling after AVX512 settled.
152+
UpdatedAVX10FeaturesVec.push_back(Feature);
153+
continue;
142154
} else if (!HasAVX512F && Feature.substr(0, 7) == "+avx512") {
143155
HasAVX512F = true;
156+
LastAVX512 = Feature;
144157
} else if (HasAVX512F && Feature == "-avx512f") {
145158
HasAVX512F = false;
146-
} else if (HasAVX10 && Feature == "-avx10.1-256") {
147-
HasAVX10 = false;
148-
HasAVX512F = false;
149-
} else if (!HasEVEX512 && Feature == "+evex512") {
150-
HasEVEX512 = true;
151-
} else if (HasEVEX512 && Feature == "-avx10.1-512") {
152-
HasEVEX512 = false;
153-
} else if (HasEVEX512 && Feature == "-evex512") {
154-
HasEVEX512 = false;
159+
} else if (HasEVEX512 != FE_TRUE && Feature == "+evex512") {
160+
HasEVEX512 = FE_TRUE;
161+
continue;
162+
} else if (HasEVEX512 != FE_FALSE && Feature == "-evex512") {
163+
HasEVEX512 = FE_FALSE;
164+
continue;
155165
}
156166

157167
UpdatedFeaturesVec.push_back(Feature);
158168
}
159-
if (HasAVX512F && HasEVEX512)
160-
UpdatedFeaturesVec.push_back("+evex512");
161-
else if (HasAVX10)
162-
UpdatedFeaturesVec.push_back("-evex512");
169+
llvm::append_range(UpdatedFeaturesVec, UpdatedAVX10FeaturesVec);
170+
// HasEVEX512 is a three-states flag. We need to turn it into [+-]evex512
171+
// according to other features.
172+
if (HasAVX512F) {
173+
UpdatedFeaturesVec.push_back(HasEVEX512 == FE_FALSE ? "-evex512"
174+
: "+evex512");
175+
if (HasAVX10 && !HasAVX10_512 && HasEVEX512 != FE_FALSE)
176+
Diags.Report(diag::warn_invalid_feature_combination)
177+
<< LastAVX512 + " " + LastAVX10 + "; will be promoted to avx10.1-512";
178+
} else if (HasAVX10) {
179+
if (HasEVEX512 != FE_NOSET)
180+
Diags.Report(diag::warn_invalid_feature_combination)
181+
<< LastAVX10 + (HasEVEX512 == FE_TRUE ? " +evex512" : " -evex512");
182+
UpdatedFeaturesVec.push_back(HasAVX10_512 ? "+evex512" : "-evex512");
183+
}
163184

164185
if (!TargetInfo::initFeatureMap(Features, Diags, CPU, UpdatedFeaturesVec))
165186
return false;

‎clang/lib/Driver/ToolChains/Arch/X86.cpp

-7
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,6 @@ void x86::getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
229229
<< D.getOpts().getOptionName(LVIOpt);
230230
}
231231

232-
bool HasAVX10 = false;
233232
for (const Arg *A : Args.filtered(options::OPT_m_x86_AVX10_Features_Group)) {
234233
StringRef Name = A->getOption().getName();
235234
A->claim();
@@ -251,7 +250,6 @@ void x86::getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
251250
#endif
252251

253252
Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
254-
HasAVX10 = true;
255253
}
256254

257255
// Now add any that the user explicitly requested on the command line,
@@ -271,14 +269,9 @@ void x86::getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
271269
continue;
272270
}
273271

274-
StringRef AVX512Name = Name;
275272
bool IsNegative = Name.startswith("no-");
276273
if (IsNegative)
277274
Name = Name.substr(3);
278-
if (HasAVX10 && (Name.startswith("avx512") || Name == "evex512")) {
279-
D.Diag(diag::warn_drv_unused_argument) << AVX512Name;
280-
continue;
281-
}
282275
Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
283276
}
284277

‎clang/lib/Headers/avx2intrin.h

+6-2
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,12 @@
1515
#define __AVX2INTRIN_H
1616

1717
/* Define the default attributes for the functions in this file. */
18-
#define __DEFAULT_FN_ATTRS256 __attribute__((__always_inline__, __nodebug__, __target__("avx2"), __min_vector_width__(256)))
19-
#define __DEFAULT_FN_ATTRS128 __attribute__((__always_inline__, __nodebug__, __target__("avx2"), __min_vector_width__(128)))
18+
#define __DEFAULT_FN_ATTRS256 \
19+
__attribute__((__always_inline__, __nodebug__, \
20+
__target__("avx2,no-evex512"), __min_vector_width__(256)))
21+
#define __DEFAULT_FN_ATTRS128 \
22+
__attribute__((__always_inline__, __nodebug__, \
23+
__target__("avx2,no-evex512"), __min_vector_width__(128)))
2024

2125
/* SSE4 Multiple Packed Sums of Absolute Difference. */
2226
/// Computes sixteen sum of absolute difference (SAD) operations on sets of

‎clang/lib/Headers/avx512bf16intrin.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ typedef __bf16 __bfloat16 __attribute__((deprecated("use __bf16 instead")));
2323
__attribute__((__always_inline__, __nodebug__, __target__("avx512bf16,evex512"), \
2424
__min_vector_width__(512)))
2525
#define __DEFAULT_FN_ATTRS \
26-
__attribute__((__always_inline__, __nodebug__, __target__("avx512bf16")))
26+
__attribute__((__always_inline__, __nodebug__, \
27+
__target__("avx512bf16,no-evex512")))
2728

2829
/// Convert One BF16 Data to One Single Float Data.
2930
///

‎clang/lib/Headers/avx512bwintrin.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ typedef unsigned long long __mmask64;
2020
/* Define the default attributes for the functions in this file. */
2121
#define __DEFAULT_FN_ATTRS512 __attribute__((__always_inline__, __nodebug__, __target__("avx512bw,evex512"), __min_vector_width__(512)))
2222
#define __DEFAULT_FN_ATTRS64 __attribute__((__always_inline__, __nodebug__, __target__("avx512bw,evex512")))
23-
#define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("avx512bw")))
23+
#define __DEFAULT_FN_ATTRS \
24+
__attribute__((__always_inline__, __nodebug__, \
25+
__target__("avx512bw,no-evex512")))
2426

2527
static __inline __mmask32 __DEFAULT_FN_ATTRS
2628
_knot_mask32(__mmask32 __M)

‎clang/lib/Headers/avx512dqintrin.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616

1717
/* Define the default attributes for the functions in this file. */
1818
#define __DEFAULT_FN_ATTRS512 __attribute__((__always_inline__, __nodebug__, __target__("avx512dq,evex512"), __min_vector_width__(512)))
19-
#define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("avx512dq")))
19+
#define __DEFAULT_FN_ATTRS \
20+
__attribute__((__always_inline__, __nodebug__, \
21+
__target__("avx512dq,no-evex512")))
2022

2123
static __inline __mmask8 __DEFAULT_FN_ATTRS
2224
_knot_mask8(__mmask8 __M)

‎clang/lib/Headers/avx512fintrin.h

+6-2
Original file line numberDiff line numberDiff line change
@@ -168,8 +168,12 @@ typedef enum
168168

169169
/* Define the default attributes for the functions in this file. */
170170
#define __DEFAULT_FN_ATTRS512 __attribute__((__always_inline__, __nodebug__, __target__("avx512f,evex512"), __min_vector_width__(512)))
171-
#define __DEFAULT_FN_ATTRS128 __attribute__((__always_inline__, __nodebug__, __target__("avx512f"), __min_vector_width__(128)))
172-
#define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("avx512f")))
171+
#define __DEFAULT_FN_ATTRS128 \
172+
__attribute__((__always_inline__, __nodebug__, \
173+
__target__("avx512f,no-evex512"), __min_vector_width__(128)))
174+
#define __DEFAULT_FN_ATTRS \
175+
__attribute__((__always_inline__, __nodebug__, \
176+
__target__("avx512f,no-evex512")))
173177

174178
/* Create vectors with repeated elements */
175179

‎clang/lib/Headers/avx512fp16intrin.h

+4-2
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,12 @@ typedef _Float16 __m512h_u __attribute__((__vector_size__(64), __aligned__(1)));
2525
__attribute__((__always_inline__, __nodebug__, \
2626
__target__("avx512fp16,evex512"), __min_vector_width__(512)))
2727
#define __DEFAULT_FN_ATTRS256 \
28-
__attribute__((__always_inline__, __nodebug__, __target__("avx512fp16"), \
28+
__attribute__((__always_inline__, __nodebug__, \
29+
__target__("avx512fp16,no-evex512"), \
2930
__min_vector_width__(256)))
3031
#define __DEFAULT_FN_ATTRS128 \
31-
__attribute__((__always_inline__, __nodebug__, __target__("avx512fp16"), \
32+
__attribute__((__always_inline__, __nodebug__, \
33+
__target__("avx512fp16,no-evex512"), \
3234
__min_vector_width__(128)))
3335

3436
static __inline__ _Float16 __DEFAULT_FN_ATTRS512 _mm512_cvtsh_h(__m512h __a) {

‎clang/lib/Headers/avx512ifmavlintrin.h

+8-2
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,14 @@
1515
#define __IFMAVLINTRIN_H
1616

1717
/* Define the default attributes for the functions in this file. */
18-
#define __DEFAULT_FN_ATTRS128 __attribute__((__always_inline__, __nodebug__, __target__("avx512ifma,avx512vl"), __min_vector_width__(128)))
19-
#define __DEFAULT_FN_ATTRS256 __attribute__((__always_inline__, __nodebug__, __target__("avx512ifma,avx512vl"), __min_vector_width__(256)))
18+
#define __DEFAULT_FN_ATTRS128 \
19+
__attribute__((__always_inline__, __nodebug__, \
20+
__target__("avx512ifma,avx512vl,no-evex512"), \
21+
__min_vector_width__(128)))
22+
#define __DEFAULT_FN_ATTRS256 \
23+
__attribute__((__always_inline__, __nodebug__, \
24+
__target__("avx512ifma,avx512vl,no-evex512"), \
25+
__min_vector_width__(256)))
2026

2127
#define _mm_madd52hi_epu64(X, Y, Z) \
2228
((__m128i)__builtin_ia32_vpmadd52huq128((__v2di)(X), (__v2di)(Y), \

‎clang/lib/Headers/avx512pfintrin.h

-5
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,6 @@
1414
#ifndef __AVX512PFINTRIN_H
1515
#define __AVX512PFINTRIN_H
1616

17-
/* Define the default attributes for the functions in this file. */
18-
#define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("avx512pf")))
19-
2017
#define _mm512_mask_prefetch_i32gather_pd(index, mask, addr, scale, hint) \
2118
__builtin_ia32_gatherpfdpd((__mmask8)(mask), (__v8si)(__m256i)(index), \
2219
(void const *)(addr), (int)(scale), \
@@ -92,6 +89,4 @@
9289
__builtin_ia32_scatterpfqps((__mmask8)(mask), (__v8di)(__m512i)(index), \
9390
(void *)(addr), (int)(scale), (int)(hint))
9491

95-
#undef __DEFAULT_FN_ATTRS
96-
9792
#endif

‎clang/lib/Headers/avx512vbmivlintrin.h

+8-3
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,14 @@
1515
#define __VBMIVLINTRIN_H
1616

1717
/* Define the default attributes for the functions in this file. */
18-
#define __DEFAULT_FN_ATTRS128 __attribute__((__always_inline__, __nodebug__, __target__("avx512vbmi,avx512vl"), __min_vector_width__(128)))
19-
#define __DEFAULT_FN_ATTRS256 __attribute__((__always_inline__, __nodebug__, __target__("avx512vbmi,avx512vl"), __min_vector_width__(256)))
20-
18+
#define __DEFAULT_FN_ATTRS128 \
19+
__attribute__((__always_inline__, __nodebug__, \
20+
__target__("avx512vbmi,avx512vl,no-evex512"), \
21+
__min_vector_width__(128)))
22+
#define __DEFAULT_FN_ATTRS256 \
23+
__attribute__((__always_inline__, __nodebug__, \
24+
__target__("avx512vbmi,avx512vl,no-evex512"), \
25+
__min_vector_width__(256)))
2126

2227
static __inline__ __m128i __DEFAULT_FN_ATTRS128
2328
_mm_permutex2var_epi8(__m128i __A, __m128i __I, __m128i __B)

‎clang/lib/Headers/avx512vlbf16intrin.h

+8-6
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,14 @@
1515
#ifndef __AVX512VLBF16INTRIN_H
1616
#define __AVX512VLBF16INTRIN_H
1717

18-
#define __DEFAULT_FN_ATTRS128 \
19-
__attribute__((__always_inline__, __nodebug__, \
20-
__target__("avx512vl, avx512bf16"), __min_vector_width__(128)))
21-
#define __DEFAULT_FN_ATTRS256 \
22-
__attribute__((__always_inline__, __nodebug__, \
23-
__target__("avx512vl, avx512bf16"), __min_vector_width__(256)))
18+
#define __DEFAULT_FN_ATTRS128 \
19+
__attribute__((__always_inline__, __nodebug__, \
20+
__target__("avx512vl,avx512bf16,no-evex512"), \
21+
__min_vector_width__(128)))
22+
#define __DEFAULT_FN_ATTRS256 \
23+
__attribute__((__always_inline__, __nodebug__, \
24+
__target__("avx512vl,avx512bf16,no-evex512"), \
25+
__min_vector_width__(256)))
2426

2527
/// Convert Two Packed Single Data to One Packed BF16 Data.
2628
///

‎clang/lib/Headers/avx512vlbitalgintrin.h

+8-2
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,14 @@
1515
#define __AVX512VLBITALGINTRIN_H
1616

1717
/* Define the default attributes for the functions in this file. */
18-
#define __DEFAULT_FN_ATTRS128 __attribute__((__always_inline__, __nodebug__, __target__("avx512vl,avx512bitalg"), __min_vector_width__(128)))
19-
#define __DEFAULT_FN_ATTRS256 __attribute__((__always_inline__, __nodebug__, __target__("avx512vl,avx512bitalg"), __min_vector_width__(256)))
18+
#define __DEFAULT_FN_ATTRS128 \
19+
__attribute__((__always_inline__, __nodebug__, \
20+
__target__("avx512vl,avx512bitalg,no-evex512"), \
21+
__min_vector_width__(128)))
22+
#define __DEFAULT_FN_ATTRS256 \
23+
__attribute__((__always_inline__, __nodebug__, \
24+
__target__("avx512vl,avx512bitalg,no-evex512"), \
25+
__min_vector_width__(256)))
2026

2127
static __inline__ __m256i __DEFAULT_FN_ATTRS256
2228
_mm256_popcnt_epi16(__m256i __A)

‎clang/lib/Headers/avx512vlbwintrin.h

+8-2
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,14 @@
1515
#define __AVX512VLBWINTRIN_H
1616

1717
/* Define the default attributes for the functions in this file. */
18-
#define __DEFAULT_FN_ATTRS128 __attribute__((__always_inline__, __nodebug__, __target__("avx512vl,avx512bw"), __min_vector_width__(128)))
19-
#define __DEFAULT_FN_ATTRS256 __attribute__((__always_inline__, __nodebug__, __target__("avx512vl,avx512bw"), __min_vector_width__(256)))
18+
#define __DEFAULT_FN_ATTRS128 \
19+
__attribute__((__always_inline__, __nodebug__, \
20+
__target__("avx512vl,avx512bw,no-evex512"), \
21+
__min_vector_width__(128)))
22+
#define __DEFAULT_FN_ATTRS256 \
23+
__attribute__((__always_inline__, __nodebug__, \
24+
__target__("avx512vl,avx512bw,no-evex512"), \
25+
__min_vector_width__(256)))
2026

2127
/* Integer compare */
2228

‎clang/lib/Headers/avx512vlcdintrin.h

+8-3
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,14 @@
1414
#define __AVX512VLCDINTRIN_H
1515

1616
/* Define the default attributes for the functions in this file. */
17-
#define __DEFAULT_FN_ATTRS128 __attribute__((__always_inline__, __nodebug__, __target__("avx512vl,avx512cd"), __min_vector_width__(128)))
18-
#define __DEFAULT_FN_ATTRS256 __attribute__((__always_inline__, __nodebug__, __target__("avx512vl,avx512cd"), __min_vector_width__(256)))
19-
17+
#define __DEFAULT_FN_ATTRS128 \
18+
__attribute__((__always_inline__, __nodebug__, \
19+
__target__("avx512vl,avx512cd,no-evex512"), \
20+
__min_vector_width__(128)))
21+
#define __DEFAULT_FN_ATTRS256 \
22+
__attribute__((__always_inline__, __nodebug__, \
23+
__target__("avx512vl,avx512cd,no-evex512"), \
24+
__min_vector_width__(256)))
2025

2126
static __inline__ __m128i __DEFAULT_FN_ATTRS128
2227
_mm_broadcastmb_epi64 (__mmask8 __A)

‎clang/lib/Headers/avx512vldqintrin.h

+8-2
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,14 @@
1515
#define __AVX512VLDQINTRIN_H
1616

1717
/* Define the default attributes for the functions in this file. */
18-
#define __DEFAULT_FN_ATTRS128 __attribute__((__always_inline__, __nodebug__, __target__("avx512vl,avx512dq"), __min_vector_width__(128)))
19-
#define __DEFAULT_FN_ATTRS256 __attribute__((__always_inline__, __nodebug__, __target__("avx512vl,avx512dq"), __min_vector_width__(256)))
18+
#define __DEFAULT_FN_ATTRS128 \
19+
__attribute__((__always_inline__, __nodebug__, \
20+
__target__("avx512vl,avx512dq,no-evex512"), \
21+
__min_vector_width__(128)))
22+
#define __DEFAULT_FN_ATTRS256 \
23+
__attribute__((__always_inline__, __nodebug__, \
24+
__target__("avx512vl,avx512dq,no-evex512"), \
25+
__min_vector_width__(256)))
2026

2127
static __inline__ __m256i __DEFAULT_FN_ATTRS256
2228
_mm256_mullo_epi64 (__m256i __A, __m256i __B) {

‎clang/lib/Headers/avx512vlfp16intrin.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@
1919
/* Define the default attributes for the functions in this file. */
2020
#define __DEFAULT_FN_ATTRS256 \
2121
__attribute__((__always_inline__, __nodebug__, \
22-
__target__("avx512fp16, avx512vl"), \
22+
__target__("avx512fp16,avx512vl,no-evex512"), \
2323
__min_vector_width__(256)))
2424
#define __DEFAULT_FN_ATTRS128 \
2525
__attribute__((__always_inline__, __nodebug__, \
26-
__target__("avx512fp16, avx512vl"), \
26+
__target__("avx512fp16,avx512vl,no-evex512"), \
2727
__min_vector_width__(128)))
2828

2929
static __inline__ _Float16 __DEFAULT_FN_ATTRS128 _mm_cvtsh_h(__m128h __a) {

‎clang/lib/Headers/avx512vlintrin.h

+8-2
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,14 @@
1414
#ifndef __AVX512VLINTRIN_H
1515
#define __AVX512VLINTRIN_H
1616

17-
#define __DEFAULT_FN_ATTRS128 __attribute__((__always_inline__, __nodebug__, __target__("avx512vl"), __min_vector_width__(128)))
18-
#define __DEFAULT_FN_ATTRS256 __attribute__((__always_inline__, __nodebug__, __target__("avx512vl"), __min_vector_width__(256)))
17+
#define __DEFAULT_FN_ATTRS128 \
18+
__attribute__((__always_inline__, __nodebug__, \
19+
__target__("avx512vl,no-evex512"), \
20+
__min_vector_width__(128)))
21+
#define __DEFAULT_FN_ATTRS256 \
22+
__attribute__((__always_inline__, __nodebug__, \
23+
__target__("avx512vl,no-evex512"), \
24+
__min_vector_width__(256)))
1925

2026
typedef short __v2hi __attribute__((__vector_size__(4)));
2127
typedef char __v4qi __attribute__((__vector_size__(4)));

0 commit comments

Comments
 (0)
Please sign in to comment.