我已经开始使用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的值。
答案 0 :(得分:4)
sizeof(Test)==4。movapd不能很好地玩!另请注意,对malloc的调用并不总是返回16字节对齐的内存,因此您可能希望使用_mm_malloc(或等效方法)。
除了前面的注释外,还可以使用内在函数(并将代码放入Godbolt中以查看生成的ASM /机器代码),或在ASM中编写整个方法。内联ASM除了在100英尺高的报纸上可读性外,还不能在编译器之间移植,并且在某些编译器(例如VC ++)上根本不允许。本征是首选。