X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvppinfra%2Fcpu.h;h=0ca9edb97fcc1ba3d82d70443a708106058e398c;hb=5d9df1db07969fea8f391bd48ba14cceb840da1e;hp=f670f3e964b291a892a0d238f96101183f9a338f;hpb=2422317b4a9355869775f1e204749a1912ef5ebc;p=vpp.git diff --git a/src/vppinfra/cpu.h b/src/vppinfra/cpu.h index f670f3e964b..0ca9edb97fc 100644 --- a/src/vppinfra/cpu.h +++ b/src/vppinfra/cpu.h @@ -51,14 +51,16 @@ return & fn; \ } -#ifdef CLIB_MULTIARCH_VARIANT +#ifdef CLIB_MARCH_VARIANT #define __CLIB_MULTIARCH_FN(a,b) a##_##b #define _CLIB_MULTIARCH_FN(a,b) __CLIB_MULTIARCH_FN(a,b) -#define CLIB_MULTIARCH_FN(fn) _CLIB_MULTIARCH_FN(fn,CLIB_MULTIARCH_VARIANT) +#define CLIB_MULTIARCH_FN(fn) _CLIB_MULTIARCH_FN(fn,CLIB_MARCH_VARIANT) #else #define CLIB_MULTIARCH_FN(fn) fn #endif +#define CLIB_MARCH_SFX CLIB_MULTIARCH_FN + #define foreach_x86_64_flags \ _ (sse3, 1, ecx, 0) \ _ (ssse3, 1, ecx, 9) \ @@ -165,8 +167,148 @@ clib_cpu_supports_aes () #endif } +static inline int +clib_cpu_march_priority_avx512 () +{ + if (clib_cpu_supports_avx512f ()) + return 20; + return -1; +} + +static inline int +clib_cpu_march_priority_avx2 () +{ + if (clib_cpu_supports_avx2 ()) + return 10; + return -1; +} + +static inline u32 +clib_cpu_implementer () +{ + char buf[128]; + static u32 implementer = -1; + + if (-1 != implementer) + return implementer; + + FILE *fp = fopen ("/proc/cpuinfo", "r"); + if (!fp) + return implementer; + + while (!feof (fp)) + { + if (!fgets (buf, sizeof (buf), fp)) + break; + buf[127] = '\0'; + if (strstr (buf, "CPU implementer")) + implementer = (u32) strtol (memchr (buf, ':', 128) + 2, NULL, 0); + if (-1 != implementer) + break; + } + fclose (fp); + + return implementer; +} + +static inline u32 +clib_cpu_part () +{ + char buf[128]; + static u32 part = -1; + + if (-1 != part) + return part; + + FILE *fp = fopen ("/proc/cpuinfo", "r"); + if (!fp) + return part; + + while (!feof (fp)) + { + if (!fgets (buf, sizeof (buf), fp)) + break; + buf[127] = '\0'; + if (strstr (buf, "CPU part")) + part = (u32) strtol (memchr (buf, ':', 128) + 2, NULL, 0); + if (-1 != part) + break; + } + fclose (fp); + + return part; +} + +#define AARCH64_CPU_IMPLEMENTER_THUNERDERX2 0x43 +#define AARCH64_CPU_PART_THUNERDERX2 0x0af +#define AARCH64_CPU_IMPLEMENTER_QDF24XX 0x51 +#define AARCH64_CPU_PART_QDF24XX 0xc00 +#define AARCH64_CPU_IMPLEMENTER_CORTEXA72 0x41 +#define AARCH64_CPU_PART_CORTEXA72 0xd08 + +static inline int +clib_cpu_march_priority_thunderx2t99 () +{ + if ((AARCH64_CPU_IMPLEMENTER_THUNERDERX2 == clib_cpu_implementer ()) && + (AARCH64_CPU_PART_THUNERDERX2 == clib_cpu_part ())) + return 20; + return -1; +} + +static inline int +clib_cpu_march_priority_qdf24xx () +{ + if ((AARCH64_CPU_IMPLEMENTER_QDF24XX == clib_cpu_implementer ()) && + (AARCH64_CPU_PART_QDF24XX == clib_cpu_part ())) + return 20; + return -1; +} + +static inline int +clib_cpu_march_priority_cortexa72 () +{ + if ((AARCH64_CPU_IMPLEMENTER_CORTEXA72 == clib_cpu_implementer ()) && + (AARCH64_CPU_PART_CORTEXA72 == clib_cpu_part ())) + return 10; + return -1; +} + +#ifdef CLIB_MARCH_VARIANT +#define CLIB_MARCH_FN_PRIORITY() CLIB_MARCH_SFX(clib_cpu_march_priority)() +#else +#define CLIB_MARCH_FN_PRIORITY() 0 +#endif #endif /* included_clib_cpu_h */ +#define CLIB_MARCH_FN_CONSTRUCTOR(fn) \ +static void __clib_constructor \ +CLIB_MARCH_SFX(fn ## _march_constructor) (void) \ +{ \ + if (CLIB_MARCH_FN_PRIORITY() > fn ## _selected_priority) \ + { \ + fn ## _selected = & CLIB_MARCH_SFX (fn ## _ma); \ + fn ## _selected_priority = CLIB_MARCH_FN_PRIORITY(); \ + } \ +} \ + +#ifndef CLIB_MARCH_VARIANT +#define CLIB_MARCH_FN(fn, rtype, _args...) \ + static rtype CLIB_CPU_OPTIMIZED CLIB_MARCH_SFX (fn ## _ma)(_args); \ + rtype (*fn ## _selected) (_args) = & CLIB_MARCH_SFX (fn ## _ma); \ + int fn ## _selected_priority = 0; \ + static inline rtype CLIB_CPU_OPTIMIZED \ + CLIB_MARCH_SFX (fn ## _ma)(_args) +#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 int fn ## _selected_priority; \ + CLIB_MARCH_FN_CONSTRUCTOR (fn) \ + static rtype CLIB_CPU_OPTIMIZED CLIB_MARCH_SFX (fn ## _ma)(_args) +#endif + +#define CLIB_MARCH_FN_SELECT(fn) (* fn ## _selected) + format_function_t format_cpu_uarch; format_function_t format_cpu_model_name; format_function_t format_cpu_flags;