我尝试在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霓虹灯代码?
答案 0 :(得分:1)
简单回答:不。
更详细的答案:ARMv8-A架构允许执行状态在异常边界上的AArch64和AArch32之间切换,例如进入或退出内核时。虽然许多ARMv8-A操作系统确实支持在系统上执行AArch32和AArch64二进制文件,但这往往是以任务粒度完成的,而不是您要求的功能(甚至功能!)粒度。此外,您需要工具来支持编译和汇编AArch32和AArch64代码,这些代码不存在,因为用例不常见。
您想要使用内在函数重写您的Neon代码,或者自己移植汇编程序。