4 Stimmen

Inline-Assembleranweisung auf ARM64 (iOS) schlägt fehl

Ich probiere die neuen arm64-Anweisungen auf iOS aus und habe ein eigenartiges Problem. Ich hoffe, jemand kann mir dabei helfen.

Insbesondere schlägt dies mit 'Ungültige Operanden für die Anweisung' fehl

void test()
{
    register long long signed int r=0,c=0,d=0;
    register signed int a=0,b=0,e=0,f=0;

    // dies schlägt fehl
    asm volatile("smaddl %0, %1, %2, %3" : "=r"(r) : "r"(a), "r"(b), "r"(c));
};

Ich bin mir nicht sicher, was ich falsch mache, soweit ich das beurteilen kann, befolge ich die Anweisung und Syntax korrekt. Hier ist, wie es in den Dokumenten definiert ist:

"SMADDL Xd, Wn, Wm, Xa Signed Multiply-Add Long: Xd = Xa + (Wn × Wm), wobei die Quelloperanden als vorzeichenbehaftet behandelt werden."

wobei X ein 64-Bit-Register bezeichnet und W ein 32-Bit-Register.

Jede Hilfe wird geschätzt.

Danke

2voto

Igor Skochinsky Punkte 23848

Ich konnte es reparieren, indem ich die Empfehlung in diesem Beitrag verwendet habe:

asm volatile("smaddl %x0, %w1, %w2, %x3" : "=r"(r) : "r"(a), "r"(b), "r"(c));

Dies erzeugt den folgenden Assembly-Code:

_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

Es scheint, dass Sie 'w' verwenden müssen, um explizit 32-Bit-Register zu kennzeichnen.

Siehe auch aarch64-inline-asm.c für ein paar weitere Beispiele für Inline-Assembler.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X