2012-11-21 14 views
5

Ich versuche, eine Funktion aufzurufen, die in ARM NEON Anordnung in einer .s-Datei codiert, die wie folgt aussieht:ARM NEON Montage auf Windows Phone 8 nicht funktioniert

AREA myfunction, code, readonly, ARM 
    global fun 
    align 4 
fun 
    push {r4, r5, r6, r7, lr} 
    add r7, sp, #12 
    push {r8, r10, r11} 
    sub r4, sp, #64 
    bic r4, r4, #15 
    mov sp, r4 
    vst1.64 {d8, d9, d10, d11}, [r4]! 
    vst1.64 {d12, d13, d14, d15}, [r4] 
    [....] 

und ich bin es zusammenbauen wie folgt:

armasm.exe -32 func.s func.obj 

Leider funktioniert das nicht, und ich bekomme ungültige Anweisung Ausnahme, wenn ich versuche und die Funktion aufrufen. Als ich dumpbin.exe zum Zerlegen der OBJ verwendete, scheint es, als wäre es ein Thumb-Code, trotz der ARM-Direktive in der Assembly zu disassemblieren (siehe Code oben).

Ich vermute, dass die Funktion im Thumb-Modus aufgerufen wird und dass alle Funktionen im Windows-Modus standardmäßig im Thumb-Modus sind. Ich kann jedoch keine Informationen dazu finden.

Weiß jemand, was hier vor sich geht?

EDIT: Dies geschieht auf Microsoft Surface sowie

+0

Ah, Silly Frage: Was macht Sie denken, ARM Neon wird auf WP8 unterstützt? Ich habe nichts gesehen sagen, dass es auf WP8 unterstützt wird ... – JustinAngel

+0

armasm.exe beschwerte sich über ein paar Dinge , was ich behoben habe, aber es hat keine Warnungen über den NEON, und 95% der insns waren NEON –

+1

Ich weiß nicht über WP8, aber ich habe gehört, dass WinRT nur Thumb2-Code unterstützt (auch wenn CPU akzeptiert ARM). Warum kannst du das nicht als Thumb2 zusammenstellen? –

Antwort

1

VS 2012 standardmäßig produziert Daumen Code für Windows RT und Windows Phone 8, so dass die Fehler, den Sie haben es wahrscheinlich durch den Aufruf in Arm Code aus Daumen Code verursacht wird. Sie haben zwei Optionen:
1. Wechseln Sie vom Daumodus in den Armmodus, bevor Sie Ihre Funktion aufrufen (Sie können BX asm verwenden), oder
2. Sie können versuchen, Ihren NEON-Code in C++ mit ARM/NEON neu zu schreiben Intrinsics - sie werden von VS 2012 unterstützt. Fügen Sie einfach "arm_neon.h" ein und Sie sind fertig.
Für die ARM-Spezifika verweisen auf den folgenden Link finden Sie unter: http://msdn.microsoft.com/en-us/library/hh875058.aspx
Für NEON intrinsics verweist auf diesen Link finden Sie unter: http://infocenter.arm.com/help/topic/com.arm.doc.dui0491c/DUI0491C_arm_compiler_reference.pdf

Diese NEON-Spezifika von der Verbindung werden von VS 2012 über allgemein unterstützt wird, könnte es einige kleine Unterschiede obwohl - wenn Sie sich nicht sicher sind, überprüfen Sie das "arm_neon.h" Include, um herauszufinden.

+0

Ja, ich endete mit intrinsics, aber dieser Code ist nicht so schnell wie die Assembly, weil ich Insns wie VSWP verwenden, die nicht zu intrinsics zuordnen. –

+0

Außerdem schien der Assembler ARM-Code nicht zu assemblieren - er schien im ARMCE-Modus zu stecken, was auch immer das ist. –

0

Sie könnten Ihren Assembler-Code mit einer bx-Anweisung im Thumb-Modus starten und einfach zum ARM-Teil in derselben Quelldatei verzweigen.

Und Sie müssen am Ende nicht wieder in den Thumb-Modus wechseln, da Sie die ARM-Funktion in bx oder pop {pc} sowieso beenden, was das Umschalten automatisch bewirkt.

Meine Antwort ist WAAAAAAY spät, aber ich bin wirklich neugierig, ob es auf einem WP funktioniert. (Ich habe keine)

+0

Immer noch neugierig? Siehe [hier] (http://stackoverflow.com/questions/18344419/is-arm-not-thumb-supported-on-winphone8-at-all). Kurz, nein. –