【问题标题】:Strange SIMD instruction behavior奇怪的 SIMD 指令行为
【发布时间】:2014-03-08 21:16:03
【问题描述】:

SSE2 指令 (paddd xmm, m128) 的工作方式非常奇怪。代码说明一切。

#include <iostream>
using namespace std;

int main()
{
     int * v0 = new int [80];
     for (int i=0; i<80; ++i)
          v0[i] = i;
     int * v1 = new int [80];
     for (int i=0; i<80; ++i)
          v1[i] = i;

     asm(
     ".intel_syntax noprefix;"
     "mov rcx , 20;"
     "mov rax , %0;"
     "mov rbx , %1;"

     "m_start:;"
     "cmp rcx , 0;"
     "je m_end;"

     "movdqu xmm0 , [rax];"
     "paddd xmm0 , [rbx];"
     "movdqu [rax] , xmm0;"

     "add rbx , 16;" /* WTF?? If I put there 128, it's work really bad */
     "add rax , 16;" /* but why?? I must add 128 because XMM width is 128 bits ... */
     "dec rcx;"
     "jmp m_start;"
     "m_end:;"

     ".att_syntax noprefix;"
     : //
     : "r"(v0) , "r"(v1)
     : //
     );

     for (int i=1; i<81; ++i)
     {
          cout << v0[i-1] << (char*)((i%10==0) ? "\n" : ", ");
     }

     return 0;
}

【问题讨论】:

  • 请比“真的很奇怪”更具体。您至少应该说出您的期望和实际发生的情况。

标签: c++ gcc assembly x86-64 sse2


【解决方案1】:

您必须添加 16,因为 128 位是 16 个字节。

附加说明:您忘记告诉编译器您破坏了一些寄存器,并且您不应该在不告诉编译器的情况下切换语法(改用-masm=intel 开关)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 2017-01-23
    • 2013-07-03
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多