Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/if_wg/include/sys/simd-x86_64.h
- This file was added.
#ifndef _SIMD_X86_64_H_ | |||||
#define _SIMD_X86_64_H_ | |||||
#include <x86/x86_var.h> | |||||
#include <x86/specialreg.h> | |||||
static inline uint64_t | |||||
xgetbv(uint32_t index) | |||||
{ | |||||
uint32_t eax, edx; | |||||
/* xgetbv - instruction byte code */ | |||||
__asm__ __volatile__(".byte 0x0f; .byte 0x01; .byte 0xd0" | |||||
: "=a" (eax), "=d" (edx) | |||||
: "c" (index)); | |||||
return ((((uint64_t)edx)<<32) | (uint64_t)eax); | |||||
} | |||||
/* | |||||
* Detect register set support | |||||
*/ | |||||
static inline boolean_t | |||||
__simd_state_enabled(const uint64_t state) | |||||
{ | |||||
boolean_t has_osxsave; | |||||
uint64_t xcr0; | |||||
has_osxsave = !!(cpu_feature2 & CPUID2_OSXSAVE); | |||||
if (!has_osxsave) | |||||
return (0); | |||||
xcr0 = xgetbv(0); | |||||
return ((xcr0 & state) == state); | |||||
} | |||||
#define _XSTATE_SSE_AVX (0x2 | 0x4) | |||||
#define _XSTATE_AVX512 (0xE0 | _XSTATE_SSE_AVX) | |||||
#define __ymm_enabled() __simd_state_enabled(_XSTATE_SSE_AVX) | |||||
#define __zmm_enabled() __simd_state_enabled(_XSTATE_AVX512) | |||||
#endif | |||||