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++)。内部函数是首选。
我已经开始使用 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++)。内部函数是首选。