【问题标题】:arm neon vst1.32 segfaultarm neon vst1.32 segfault
【发布时间】:2016-08-18 01:01:22
【问题描述】:

以下代码只是尝试将数据从“in*”数组复制到“out*”数组,但在第一条vst1.32 指令处出现段错误,但为什么呢?

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"
             );

【问题讨论】:

  • infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0491f/… 被水印为“已取代”。也许您应该寻找取代此命令的内容。
  • 使用搜索功能生成了这个页面:infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0491f/… - 所以我认为实际上可能整个文档的 version 已被取代,而不是个人指令。
  • [out0]"=r"(out0) 表示 out0 中的值将被 asm 覆盖。而且由于该值在被覆盖之前从未使用过,因此为它分配一些东西有什么意义呢? IOW,看似违反直觉,out0 是一个输入。那么如何告诉 gcc 你正在修改 out0 的 contents 呢?在这种情况下,内存破坏器就足够了。
  • @DavidWohlferd 谢谢!现在可以了。如果您发布答案,我会接受。

标签: assembly arm inline-assembly neon


【解决方案1】:

[out0]"=r"(out0) 表示 out0 中的值将被 asm 覆盖。而且由于该值在被覆盖之前从未使用过,因此为它分配一些东西有什么意义?

换句话说,尽管看起来违反直觉,但 out0 是一个输入。

那么你如何告诉gcc你正在修改out0的contents呢?在这种情况下,内存破坏器就足够了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-25
    • 1970-01-01
    • 2015-11-22
    • 2012-09-09
    • 2013-02-20
    • 2013-09-10
    • 2013-06-06
    • 1970-01-01
    相关资源
    最近更新 更多