我可以在iphone6(即A64机器)上使用32个内联霓虹灯代码吗?

时间:2016-01-26 07:17:42

标签: ios arm neon

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

 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上运行: 错误:无法识别的指令助记符

有没有办法在64机器上执行a32 asm霓虹灯代码?

1 个答案:

答案 0 :(得分:1)

简单回答:不。

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

您想要使用内在函数重写您的Neon代码,或者自己移植汇编程序。