arm64 detect marcos

This commit is contained in:
hymei
2022-02-23 20:00:04 +08:00
committed by nillerusr
parent ff588a8810
commit c7308906d1
11 changed files with 66 additions and 28 deletions

View File

@@ -6,24 +6,48 @@
// $NoKeywords: $
//=============================================================================//
#include "platform.h"
#if defined __SANITIZE_ADDRESS__
bool CheckMMXTechnology(void) { return false; }
bool CheckSSETechnology(void) { return false; }
bool CheckSSE2Technology(void) { return false; }
bool Check3DNowTechnology(void) { return false; }
#elif defined (__arm__)
#elif defined (__arm__) || defined (__arm64__)
bool CheckMMXTechnology(void) { return false; }
bool CheckSSETechnology(void) { return false; }
bool CheckSSE2Technology(void) { return false; }
bool Check3DNowTechnology(void) { return false; }
#else
#define cpuid(in,a,b,c,d) \
asm("pushl %%ebx\n\t" "cpuid\n\t" "movl %%ebx,%%esi\n\t" "pop %%ebx": "=a" (a), "=S" (b), "=c" (c), "=d" (d) : "a" (in));
static void cpuid(uint32 function, uint32& out_eax, uint32& out_ebx, uint32& out_ecx, uint32& out_edx)
{
#if defined(PLATFORM_64BITS)
asm("mov %%rbx, %%rsi\n\t"
"cpuid\n\t"
"xchg %%rsi, %%rbx"
: "=a" (out_eax),
"=S" (out_ebx),
"=c" (out_ecx),
"=d" (out_edx)
: "a" (function)
);
#else
asm("mov %%ebx, %%esi\n\t"
"cpuid\n\t"
"xchg %%esi, %%ebx"
: "=a" (out_eax),
"=S" (out_ebx),
"=c" (out_ecx),
"=d" (out_edx)
: "a" (function)
);
#endif
}
bool CheckMMXTechnology(void)
{
unsigned long eax,ebx,edx,unused;
uint32 eax,ebx,edx,unused;
cpuid(1,eax,ebx,unused,edx);
return edx & 0x800000;
@@ -31,7 +55,7 @@ bool CheckMMXTechnology(void)
bool CheckSSETechnology(void)
{
unsigned long eax,ebx,edx,unused;
uint32 eax,ebx,edx,unused;
cpuid(1,eax,ebx,unused,edx);
return edx & 0x2000000L;
@@ -39,7 +63,7 @@ bool CheckSSETechnology(void)
bool CheckSSE2Technology(void)
{
unsigned long eax,ebx,edx,unused;
uint32 eax,ebx,edx,unused;
cpuid(1,eax,ebx,unused,edx);
return edx & 0x04000000;
@@ -47,7 +71,7 @@ bool CheckSSE2Technology(void)
bool Check3DNowTechnology(void)
{
unsigned long eax, unused;
uint32 eax, unused;
cpuid(0x80000000,eax,unused,unused,unused);
if ( eax > 0x80000000L )