SSE2和内联汇编插入结构

时间:2019-06-06 21:00:30

标签: c gcc simd inline-assembly sse2

我已经开始使用c代码和gcc内联汇编的组合来学习SIMD命令。我试图了解如何将结构中的值添加到浮动指针(xmm0)。我不知道这样做的正确方法是什么。

我已经动态分配了一个结构并将其命名为tmp。现在,我希望仅使用SSE2指令将struct的值添加到浮动指针中。

#include <stdio.h>
#include <stdlib.h>

struct Test{
  unsigned char a;
  unsigned char b;
  unsigned char c;
  unsigned char d;
} test;

int main()
{
  struct Test *tmp = malloc(sizeof(test));
  tmp->a = 10;
  tmp->b = 2;
  tmp->c = 3;
  tmp->d = 4;
  asm ( "movapd [tmp], %%xmm0;"
  );
  free(tmp);
  return 0;
}

编译此代码后,我将变成错误消息: “错误:无效的char'['开始操作数1`[tmp]'”

我想知道我在做错什么,以及如何在浮动指针中插入structure的值。

1 个答案:

答案 0 :(得分:4)

sizeof(Test)==4。movapd不能很好地玩!另请注意,对malloc的调用并不总是返回16字节对齐的内存,因此您可能希望使用_mm_malloc(或等效方法)。

除了前面的注释外,还可以使用内在函数(并将代码放入Godbolt中以查看生成的ASM /机器代码),或在ASM中编写整个方法。内联ASM除了在100英尺高的报纸上可读性外,还不能在编译器之间移植,并且在某些编译器(例如VC ++)上根本不允许。本征是首选。