linux - .double 数组到 sse 向量和对它们的操作

标签 linux assembly 64-bit sse simd

这是我第一次接触SSE。我正在尝试基于 .double 数组创建两个 SSE 向量,然后相互相乘并将结果存储回其中一个数组。这是代码的重要部分:

.data
counts: .double 1.0,2.0,3.0,4.0
twos: .double 2.0,2.0,2.0,2.0

.text

movupd counts, %xmm7
movupd twos, %xmm6

mulpd %xmm6, %xmm7

movupd %xmm7, counts

但是,这些指令似乎只影响向量的前两个元素。

这是结果:2.0、4.0、3.0、4.0 虽然它应该是:2.0、4.0、6.0、8.0

有人能指出我做错了什么吗?

如果我可以将一个向量乘以一个标量,那当然会容易得多,但我在任何地方都找不到这样做的合适指令。

我正在通过使用以下代码对它们求和来检查这些值(解决这个问题后我的后续任务是什么):

mov $0, %rsi
addsd counts(%rsi), %xmm0
mov $8, %rsi
addsd counts(%rsi), %xmm0
mov $16, %rsi
addsd counts(%rsi), %xmm0
mov $24, %rsi
addsd counts(%rsi), %xmm0

提前感谢您的帮助!

最佳答案

xmm 寄存器只能保存两个 double 值,因此一次只能保存两个。如果您需要一次完成所有四个操作,请使用单个 float 或迁移到 AVX。

关于linux - .double 数组到 sse 向量和对它们的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23748620/

相关文章:

.net - Mono 在 Linux 中哪里安装 X509 证书?

c++ - 如何在 C++ 中将 x64 机器代码写入虚拟内存并在 Windows 中执行

退出 fork 窗口管理器后无法输入 GtkEntry

python - 从 bash 脚本运行 Python 导致自定义模块导入错误

assembly - MIPS 汇编乘法并将 Hi 和 Lo 移入寄存器

assembly - Homoiconic和 “unrestricted”自修改代码+ Lisp真的是自修改的吗?

math - Z80 上的溢出和进位标志

ms-access - 'Microsoft.ACE.OLEDB.12.0' 提供程序未注册 - 但它是

c++ - 将 QT 32 位库与 64 位应用程序(MinGW64 编译器)链接起来?

java - .jar 适用于 Windows 但不适用于 Linux (stacktrace)