我试图在 Android Studio 上为 Android Native 应用程序编译 ODE(Open Dynamics Engine)物理 C++ 库。
当我尝试构建它时,它给了我一些错误,告诉我一些内联 ASM 代码不正确,因为它们是为 INTEL 处理器语法编写的。这主要是为了获得物理模拟目的的 CPU 时钟频率。
(编者注:这个 x86 GNU C 内联汇编效率低下,甚至不安全或可移植。有关使用 i386 / x86-64 的正确方法,请参阅How to get the CPU cycle count in x86_64 from C++?rdtsc)
static inline void getClockCount (unsigned long cc[2])
{
#ifndef X86_64_SYSTEM
asm volatile (
"rdtsc\n"
"movl %%eax,(%%esi)\n"
"movl %%edx,4(%%esi)\n"
: : "S" (cc) : "%eax","%edx","cc","memory");
#else
asm volatile (
"rdtsc\n"
"movl %%eax,(%%rsi)\n"
"movl %%edx,4(%%rsi)\n"
: : "S" (cc) : "%eax","%edx","cc","memory");
#endif
}
static inline void serialize()
{
#ifndef X86_64_SYSTEM
asm volatile (
"mov $0,%%eax\n"
"push %%ebx\n"
"cpuid\n"
"pop %%ebx\n"
: : : "%eax","%ecx","%edx","cc","memory");
#else
asm volatile (
"mov $0,%%rax\n"
"push %%rbx\n"
"cpuid\n"
"pop %%rbx\n"
: : : "%rax","%rcx","%rdx","cc","memory");
#endif
}
static inline double loadClockCount (unsigned long a[2])
{
double ret;
#ifndef X86_64_SYSTEM
asm volatile ("fildll %1; fstpl %0" : "=m" (ret) : "m" (a[0]) :
"cc","memory");
#else
asm volatile ("fildll %1; fstpl %0" : "=m" (ret) : "m" (a[0]) :
"cc","memory");
#endif
return ret;
}
我不知道如何为ARM做同样的事情?有什么帮助吗?