2016-04-24 17 views
0

Der folgende Code versucht einfach, die Daten von den 'in *' - Arrays in die 'out *' - Arrays zu kopieren, aber segfolds bei der ersten vst1.32-Anweisung, aber warum?arm neon vst1.32 segfault

int* in0 = new int[4]{ 0x0, 0x1, 0x2, 0x3 }; 
int* in1 = new int[4]{ 0x4, 0x5, 0x6, 0x7 }; 
int* in2 = new int[4]{ 0x8, 0x9, 0xA, 0xB }; 
int* in3 = new int[4]{ 0xC, 0xD, 0xE, 0xF }; 

int* out0 = new int[4]{}; 
int* out1 = new int[4]{}; 
int* out2 = new int[4]{}; 
int* out3 = new int[4]{}; 

asm volatile("vld1.32 {d0, d1}, [%[in0]]  \n" 
      "vld1.32 {d2, d3}, [%[in1]]  \n" 
      "vld1.32 {d4, d5}, [%[in2]]  \n" 
      "vld1.32 {d6, d7}, [%[in3]]  \n" 
      "vst1.32 {d0, d1}, [%[out0]]  \n" 
      "vst1.32 {d2, d3}, [%[out1]]  \n" 
      "vst1.32 {d4, d5}, [%[out2]]  \n" 
      "vst1.32 {d6, d7}, [%[out3]]  \n" 
      : [out0]"=r"(out0), [out1]"=r"(out1), [out2]"=r"(out2), [out3]"=r"(out3) 
      : [in0]"r"(in0), [in1]"r"(in1), [in2]"r"(in2), [in3]"r"(in3) 
      : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "memory", "cc" 
      ); 
+0

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0491f/BABDCGGF.html ist als "überholt" gekennzeichnet. Vielleicht sollten Sie nach etwas suchen, das diesen Befehl ersetzt hat. – BitTickler

+0

mit der Suchfunktion produziert diese Seite: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0491f/BABDCGGF.html - So denke ich, dass es tatsächlich die _version_ der Dokumentation als Ganzes, die ersetzt wurde, und nicht die einzelne Anweisung. – bitwise

+1

'[out0]" = r "(out0)' bedeutet, dass der Wert in out0 von der ASM überschrieben wird. Und da der Wert nie verwendet wird, bevor er überschrieben wird, was ist der Sinn etwas zuzuordnen? IOW, so kontraintuitiv wie es scheint, out0 ist eine Eingabe. Wie sagst du gcc, dass du den * Inhalt * von out0 modifizierst? In diesem Fall sollte der Memory Clobber ausreichen. –

Antwort

3

[out0]"=r"(out0) bedeutet, dass der Wert in OUT0 wird vom ASM überschrieben. Und da der Wert nie verwendet wird, bevor er überschrieben wird, was ist der Sinn etwas zuzuordnen?

Mit anderen Worten, so intuitiv wie es scheint, ist out0 eine Eingabe.

Also wie sagen Sie GCC, dass Sie die Inhalt von out0 ändern? In diesem Fall sollte der Memory Clobber ausreichen.