2016-04-24 3 views
0

Следующий код просто пытается скопировать данные из массивов 'in *' в массивы 'out *', но segfaults в первой инструкции vst1.32, но почему?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 обозначен водяным знаком как «замененный». Может быть, вы должны искать то, что заменило эту команду. – BitTickler

+0

, используя функцию поиска, созданную на этой странице: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0491f/BABDCGGF.html - Поэтому я думаю, что на самом деле это может быть _версия_ документация в целом, которая была заменена, а не отдельная инструкция. – bitwise

+1

'[out0]" = r "(out0)' означает, что значение в out0 будет перезаписано asm. И поскольку значение никогда не используется до того, как оно будет перезаписано, в чем смысл назначать ему что-то? IOW, как контринтуитивный, как кажется, out0 - это вход. Итак, как вы говорите gcc о том, что вы изменяете * содержимое * out0? В этом случае хватка памяти должна быть достаточной. –

ответ

3

[out0]"=r"(out0) означает, что значение в out0 будет перезаписано asm. И поскольку значение никогда не используется до того, как оно будет перезаписано, в чем смысл назначать ему что-то?

Другими словами, как противозаконный, как кажется, out0 является входом.

Итак, как вы говорите gcc о том, что вы изменяете содержимое out0? В этом случае хватка памяти должна быть достаточной.

Смежные вопросы