我在iOS上尝试新的arm64指令,我有一个特殊的问题。我希望有人可以帮助我。
特别是“指令操作数无效”
失败void test()
{
register long long signed int r=0,c=0,d=0;
register signed int a=0,b=0,e=0,f=0;
// this fails
asm volatile("smaddl %0, %1, %2, %3" : "=r"(r) : "r"(a), "r"(b), "r"(c));
};
我不确定我做错了什么,我能说的最好,我正确地遵循指令和语法。以下是文档中的定义方式:
“SMADDL Xd,Wn,Wm,Xa 有符号乘法加长:Xd = Xa +(Wn×Wm),将源操作数视为有符号。“
其中X表示64位寄存器,W表示32位寄存器。
任何帮助将不胜感激。
THX
答案 0 :(得分:1)
我可以使用this post中的推荐来修复它:
asm volatile("smaddl %x0, %w1, %w2, %x3" : "=r"(r) : "r"(a), "r"(b), "r"(c));
这会产生以下程序集:
_test: ; @test
; BB#0:
sub sp, sp, #48
movz w8, #0
movz x9, #0
stp x9, x9, [sp, #32]
str x9, [sp, #24]
stp w8, w8, [sp, #16]
stp w8, w8, [sp, #8]
ldp w10, w8, [sp, #16]
ldr x9, [sp, #32]
; InlineAsm Start
smaddl x9, w8, w10, x9
; InlineAsm End
str x9, [sp, #40]
add sp, sp, #48
ret lr
似乎你需要使用'w'来专门标记32位寄存器。
另请参阅aarch64-inline-asm.c以获取更多内联asm示例。