SSE2 和内联汇编插入结构

SSE2 and inline assembly insert structur

我已经开始使用 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;
}

编译此代码后,出现错误消息: " 错误:无效的字符 '[' 开始操作数 1 `[tmp]' "

我想知道我做错了什么以及如何将结构的值插入到浮动指针中。

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

添加到之前的评论中,要么使用内在函数 (并将代码扔进 godbolt 以查看生成的 ASM/machine 代码),要么在 ASM 中编写整个方法.除了像 100 英尺的报纸一样可读之外,内联 ASM 不可在编译器之间移植,并且在某些编译器上根本不允许(例如 VC++)。内部函数是首选。