我可以在 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 代码,或者自己移植汇编器。
我尝试在 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 代码,或者自己移植汇编器。