我可以在 iphone6(即 A64 机器)上执行 a32 内联 neon 代码吗?

can I have a32 inline neon code excuted on iphone6(i.e. A64 machine)?

我尝试在 iOS 项目中使用内联 asm neon 代码,如下所示:

 float modf_neon_sfp(float x, int *i)
 {
    #ifdef __MATH_NEON
    asm volatile (
    "vdup.f32       d0, r0                  \n\t"   //d0 = {x, x}   
    "vcvt.s32.f32   d1, d0                  \n\t"   //d1 = (int) d0; 
    "vcvt.f32.s32   d2, d1                  \n\t"   //d2 = (float) d1;
    "vsub.f32       d0, d0, d2              \n\t"   //d0 = d0 - d2; 
    "vstr.i32       s2, [r1]                \n\t"   //[r0] = d1[0] 
    "vmov.f32       r0, s0                  \n\t"   //r0 = d0[0];
    ::: "d0", "d1", "d2"
 );

#else
    return modf_c(x, i);
#endif
}

代码是A32 neon asm指令。但它在 iphone6 上 运行 失败了: error:Unrecognized 指令助记符

有没有办法在 64 位机器上执行 32 位 asm neon 代码?

简单回答:否

更详细的答案:ARMv8-A 架构允许执行状态在异常边界上在 AArch64 和 AArch32 之间更改,例如在移入或移出内核时。虽然许多 ARMv8-A 操作系统确实支持在系统上执行 AArch32 和 AArch64 二进制文件,但这往往是在任务粒度上完成的,而不是你所要求的在函数(甚至在函数内!)粒度。此外,您需要工具来支持 AArch32 和 AArch64 代码的编译和组装,这些不存在,因为用例不常见。

您需要使用内部函数重写 Neon 代码,或者自己移植汇编器。