/*- * Copyright (c) 2024 Robert Clausecker * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include #include #include #include extern void _libmd_md5block_baseline(MD5_CTX *, const void *, size_t); extern void _libmd_md5block_bmi1(MD5_CTX *, const void *, size_t); extern void _libmd_md5block_avx512(MD5_CTX *, const void *, size_t); DEFINE_UIFUNC(, void, _libmd_md5block, (MD5_CTX *, const void *, size_t)) { if ((cpu_stdext_feature & (CPUID_STDEXT_AVX512F | CPUID_STDEXT_AVX512VL)) == (CPUID_STDEXT_AVX512F | CPUID_STDEXT_AVX512VL)) { u_int regs[4]; char cpu_vendor[12]; do_cpuid(0, regs); ((u_int *)&cpu_vendor)[0] = regs[1]; ((u_int *)&cpu_vendor)[1] = regs[3]; ((u_int *)&cpu_vendor)[2] = regs[2]; /* the AVX-512 kernel performs poorly on AMD */ if (memcmp(cpu_vendor, AMD_VENDOR_ID, sizeof(cpu_vendor)) != 0) return (_libmd_md5block_avx512); } if (cpu_stdext_feature & CPUID_STDEXT_BMI1) return (_libmd_md5block_bmi1); else return (_libmd_md5block_baseline); }