gpt4 book ai didi

c - SSE2 和内联汇编插入结构

转载 作者:太空宇宙 更新时间:2023-11-04 01:16:45 25 4
gpt4 key购买 nike

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

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

#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]' "

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

最佳答案

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

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

关于c - SSE2 和内联汇编插入结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56485021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com