ARM64(iOS)上的内联汇编指令失败

时间:2013-12-10 22:23:13

标签: arm inline-assembly

我在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

1 个答案:

答案 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示例。