mirror of
https://github.com/Fennix-Project/Kernel.git
synced 2025-05-29 07:47:59 +00:00
Check SIMD implementation
This commit is contained in:
parent
303dec8dfb
commit
450fe4f0ac
104
Core/CPU.cpp
104
Core/CPU.cpp
@ -273,4 +273,108 @@ namespace CPU
|
|||||||
#endif
|
#endif
|
||||||
return Counter;
|
return Counter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
x86SIMDType CheckSIMD()
|
||||||
|
{
|
||||||
|
if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_AMD) == 0)
|
||||||
|
{
|
||||||
|
#if defined(__amd64__)
|
||||||
|
CPU::x64::AMD::CPUID0x1 cpuid1amd;
|
||||||
|
#elif defined(__i386__)
|
||||||
|
CPU::x32::AMD::CPUID0x1 cpuid1amd;
|
||||||
|
#endif
|
||||||
|
#if defined(__amd64__) || defined(__i386__)
|
||||||
|
asmv("cpuid"
|
||||||
|
: "=a"(cpuid1amd.EAX.raw), "=b"(cpuid1amd.EBX.raw), "=c"(cpuid1amd.ECX.raw), "=d"(cpuid1amd.EDX.raw)
|
||||||
|
: "a"(0x1));
|
||||||
|
#endif
|
||||||
|
if (cpuid1amd.ECX.SSE4_2)
|
||||||
|
return SIMD_SSE42;
|
||||||
|
else if (cpuid1amd.ECX.SSE4_1)
|
||||||
|
return SIMD_SSE41;
|
||||||
|
else if (cpuid1amd.ECX.SSE3)
|
||||||
|
return SIMD_SSE3;
|
||||||
|
else if (cpuid1amd.EDX.SSE2)
|
||||||
|
return SIMD_SSE2;
|
||||||
|
else if (cpuid1amd.EDX.SSE)
|
||||||
|
return SIMD_SSE;
|
||||||
|
}
|
||||||
|
if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_INTEL) == 0)
|
||||||
|
{
|
||||||
|
#if defined(__amd64__)
|
||||||
|
CPU::x64::Intel::CPUID0x1 cpuid1intel;
|
||||||
|
#elif defined(__i386__)
|
||||||
|
CPU::x32::Intel::CPUID0x1 cpuid1intel;
|
||||||
|
#endif
|
||||||
|
#if defined(__amd64__) || defined(__i386__)
|
||||||
|
asmv("cpuid"
|
||||||
|
: "=a"(cpuid1intel.EAX.raw), "=b"(cpuid1intel.EBX.raw), "=c"(cpuid1intel.ECX.raw), "=d"(cpuid1intel.EDX.raw)
|
||||||
|
: "a"(0x1));
|
||||||
|
#endif
|
||||||
|
if (cpuid1intel.ECX.SSE4_2)
|
||||||
|
return SIMD_SSE42;
|
||||||
|
else if (cpuid1intel.ECX.SSE4_1)
|
||||||
|
return SIMD_SSE41;
|
||||||
|
else if (cpuid1intel.ECX.SSE3)
|
||||||
|
return SIMD_SSE3;
|
||||||
|
else if (cpuid1intel.EDX.SSE2)
|
||||||
|
return SIMD_SSE2;
|
||||||
|
else if (cpuid1intel.EDX.SSE)
|
||||||
|
return SIMD_SSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return SIMD_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CheckSIMD(x86SIMDType Type)
|
||||||
|
{
|
||||||
|
if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_AMD) == 0)
|
||||||
|
{
|
||||||
|
#if defined(__amd64__)
|
||||||
|
CPU::x64::AMD::CPUID0x1 cpuid1amd;
|
||||||
|
#elif defined(__i386__)
|
||||||
|
CPU::x32::AMD::CPUID0x1 cpuid1amd;
|
||||||
|
#endif
|
||||||
|
#if defined(__amd64__) || defined(__i386__)
|
||||||
|
asmv("cpuid"
|
||||||
|
: "=a"(cpuid1amd.EAX.raw), "=b"(cpuid1amd.EBX.raw), "=c"(cpuid1amd.ECX.raw), "=d"(cpuid1amd.EDX.raw)
|
||||||
|
: "a"(0x1));
|
||||||
|
#endif
|
||||||
|
if (Type == SIMD_SSE42)
|
||||||
|
return cpuid1amd.ECX.SSE4_2;
|
||||||
|
else if (Type == SIMD_SSE41)
|
||||||
|
return cpuid1amd.ECX.SSE4_1;
|
||||||
|
else if (Type == SIMD_SSE3)
|
||||||
|
return cpuid1amd.ECX.SSE3;
|
||||||
|
else if (Type == SIMD_SSE2)
|
||||||
|
return cpuid1amd.EDX.SSE2;
|
||||||
|
else if (Type == SIMD_SSE)
|
||||||
|
return cpuid1amd.EDX.SSE;
|
||||||
|
}
|
||||||
|
if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_INTEL) == 0)
|
||||||
|
{
|
||||||
|
#if defined(__amd64__)
|
||||||
|
CPU::x64::Intel::CPUID0x1 cpuid1intel;
|
||||||
|
#elif defined(__i386__)
|
||||||
|
CPU::x32::Intel::CPUID0x1 cpuid1intel;
|
||||||
|
#endif
|
||||||
|
#if defined(__amd64__) || defined(__i386__)
|
||||||
|
asmv("cpuid"
|
||||||
|
: "=a"(cpuid1intel.EAX.raw), "=b"(cpuid1intel.EBX.raw), "=c"(cpuid1intel.ECX.raw), "=d"(cpuid1intel.EDX.raw)
|
||||||
|
: "a"(0x1));
|
||||||
|
#endif
|
||||||
|
if (Type == SIMD_SSE42)
|
||||||
|
return cpuid1intel.ECX.SSE4_2;
|
||||||
|
else if (Type == SIMD_SSE41)
|
||||||
|
return cpuid1intel.ECX.SSE4_1;
|
||||||
|
else if (Type == SIMD_SSE3)
|
||||||
|
return cpuid1intel.ECX.SSE3;
|
||||||
|
else if (Type == SIMD_SSE2)
|
||||||
|
return cpuid1intel.EDX.SSE2;
|
||||||
|
else if (Type == SIMD_SSE)
|
||||||
|
return cpuid1intel.EDX.SSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -114,6 +114,17 @@ namespace CPU
|
|||||||
Disable
|
Disable
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum x86SIMDType
|
||||||
|
{
|
||||||
|
SIMD_NONE,
|
||||||
|
SIMD_SSE,
|
||||||
|
SIMD_SSE2,
|
||||||
|
SIMD_SSE3,
|
||||||
|
SIMD_SSSE3,
|
||||||
|
SIMD_SSE41,
|
||||||
|
SIMD_SSE42,
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get CPU vendor identifier.
|
* @brief Get CPU vendor identifier.
|
||||||
*
|
*
|
||||||
@ -135,6 +146,21 @@ namespace CPU
|
|||||||
*/
|
*/
|
||||||
char *Hypervisor();
|
char *Hypervisor();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Check SIMD support.
|
||||||
|
*
|
||||||
|
* @return x86SIMDType
|
||||||
|
*/
|
||||||
|
x86SIMDType CheckSIMD();
|
||||||
|
/**
|
||||||
|
* @brief Check SIMD support.
|
||||||
|
*
|
||||||
|
* @param Type SIMD type.
|
||||||
|
* @return true if supported.
|
||||||
|
* @return false if not supported.
|
||||||
|
*/
|
||||||
|
bool CheckSIMD(x86SIMDType Type);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Pause the CPU
|
* @brief Pause the CPU
|
||||||
*/
|
*/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user