2013-12-10 146 views
3

我正在嘗試iOS上的新arm64指令,並遇到一個特殊問題。我希望有人能幫助我。ARM64(iOS)上的內聯彙編指令

尤其是這個過程出現「無效的操作數指令」

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

我能夠通過使用建議在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示例。

+0

啊!完善!我懷疑這肯定是一個語法問題,並且必須以某種方式指定寄存器寬度,但不知道該怎麼做!謝謝! – bitwise