0

我试图在 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做同样的事情?有什么帮助吗?

4

0 回答 0