#endif
#define foreach_x86_64_flags \
_ (sse3, 1, ecx, 0) \
+_ (pclmulqdq, 1, ecx, 1) \
_ (ssse3, 1, ecx, 9) \
_ (sse41, 1, ecx, 19) \
_ (sse42, 1, ecx, 20) \
_ (avx, 1, ecx, 28) \
+_ (rdrand, 1, ecx, 30) \
_ (avx2, 7, ebx, 5) \
+_ (rtm, 7, ebx, 11) \
+_ (pqm, 7, ebx, 12) \
+_ (pqe, 7, ebx, 15) \
_ (avx512f, 7, ebx, 16) \
+_ (rdseed, 7, ebx, 18) \
_ (x86_aes, 1, ecx, 25) \
_ (sha, 7, ebx, 29) \
+_ (vaes, 7, ecx, 9) \
+_ (vpclmulqdq, 7, ecx, 10) \
+_ (avx512_vnni, 7, ecx, 11) \
+_ (avx512_bitalg, 7, ecx, 12) \
+_ (avx512_vpopcntdq, 7, ecx, 14) \
_ (invariant_tsc, 0x80000007, edx, 8)
static inline int
clib_cpu_supports_aes ()
{
-#if defined (__aarch64__)
+#if defined(__x86_64__)
return clib_cpu_supports_x86_aes ();
#elif defined (__aarch64__)
return clib_cpu_supports_aarch64_aes ();
}
static inline int
-clib_cpu_march_priority_avx512 ()
+clib_cpu_march_priority_icl ()
+{
+ if (clib_cpu_supports_avx512_bitalg ())
+ return 200;
+ return -1;
+}
+
+static inline int
+clib_cpu_march_priority_skx ()
{
if (clib_cpu_supports_avx512f ())
- return 20;
+ return 100;
return -1;
}
static inline int
-clib_cpu_march_priority_avx2 ()
+clib_cpu_march_priority_hsw ()
{
if (clib_cpu_supports_avx2 ())
- return 10;
+ return 50;
return -1;
}
return part;
}
-#define AARCH64_CPU_IMPLEMENTER_THUNERDERX2 0x43
-#define AARCH64_CPU_PART_THUNERDERX2 0x0af
+#define AARCH64_CPU_IMPLEMENTER_CAVIUM 0x43
+#define AARCH64_CPU_PART_THUNDERX2 0x0af
+#define AARCH64_CPU_PART_OCTEONTX2T96 0x0b2
+#define AARCH64_CPU_PART_OCTEONTX2T98 0x0b1
#define AARCH64_CPU_IMPLEMENTER_QDF24XX 0x51
#define AARCH64_CPU_PART_QDF24XX 0xc00
#define AARCH64_CPU_IMPLEMENTER_CORTEXA72 0x41
#define AARCH64_CPU_PART_CORTEXA72 0xd08
+#define AARCH64_CPU_IMPLEMENTER_NEOVERSEN1 0x41
+#define AARCH64_CPU_PART_NEOVERSEN1 0xd0c
+
+static inline int
+clib_cpu_march_priority_octeontx2 ()
+{
+ if ((AARCH64_CPU_IMPLEMENTER_CAVIUM == clib_cpu_implementer ()) &&
+ ((AARCH64_CPU_PART_OCTEONTX2T96 == clib_cpu_part ())
+ || AARCH64_CPU_PART_OCTEONTX2T98 == clib_cpu_part ()))
+ return 20;
+ return -1;
+}
static inline int
clib_cpu_march_priority_thunderx2t99 ()
{
- if ((AARCH64_CPU_IMPLEMENTER_THUNERDERX2 == clib_cpu_implementer ()) &&
- (AARCH64_CPU_PART_THUNERDERX2 == clib_cpu_part ()))
+ if ((AARCH64_CPU_IMPLEMENTER_CAVIUM == clib_cpu_implementer ()) &&
+ (AARCH64_CPU_PART_THUNDERX2 == clib_cpu_part ()))
return 20;
return -1;
}
return -1;
}
+static inline int
+clib_cpu_march_priority_neoversen1 ()
+{
+ if ((AARCH64_CPU_IMPLEMENTER_NEOVERSEN1 == clib_cpu_implementer ()) &&
+ (AARCH64_CPU_PART_NEOVERSEN1 == clib_cpu_part ()))
+ return 10;
+ return -1;
+}
+
#ifdef CLIB_MARCH_VARIANT
#define CLIB_MARCH_FN_PRIORITY() CLIB_MARCH_SFX(clib_cpu_march_priority)()
#else
#else
#define CLIB_MARCH_FN(fn, rtype, _args...) \
static rtype CLIB_CPU_OPTIMIZED CLIB_MARCH_SFX (fn ## _ma)(_args); \
- extern int (*fn ## _selected) (_args); \
+ extern rtype (*fn ## _selected) (_args); \
extern int fn ## _selected_priority; \
CLIB_MARCH_FN_CONSTRUCTOR (fn) \
static rtype CLIB_CPU_OPTIMIZED CLIB_MARCH_SFX (fn ## _ma)(_args)