【发布时间】:2019-04-28 15:31:24
【问题描述】:
我有两个 UInt64(即 64 位四字)整数。
- 它们与 8 字节 (
sizeof(UInt64)) 边界对齐(如果对任何事情有用,我也可以将它们对齐到 16 字节) - 它们被打包在一起,因此它们在内存中并排
如何将它们加载到 xmm 寄存器中,例如xmm0:
我找到了:
movq xmm0, v[0]
但这只会移动 v[0],并将xmm0 中的高 64 位设置为零:
xmm0
0000000000000000 24FC18D93B2C9D8F
额外问题
- 如何将它们取出?
- 如果它们不在内存中并排怎么办?
- 如果它们是 4 字节对齐的呢?
编辑
正如 W. Chang 所指出的,字节顺序化很少,我可以接受其他方式:
我的难题是如何让他们进来,然后让他们出去。
【问题讨论】:
-
对于未来的此类问题,请参阅this nice overview 的可用说明。
-
有解说指南的指南吗?在不知道参考是什么的情况下,我看到的只是,“下划线五一二下划线四下划线小便双 u es es dee 下划线小便眼三十二”。然而,我正在寻找 i) 如何将 UInt64 放入 xmm ii) 如何并行添加两个 64 位整数,以及如何得到答案。没有解码指南的指南,我盯着...上帝...那里必须有 900 次操作。我想要的三个似乎是一个秘密。
-
Intrinsics 是与汇编密切相关的 C 风格函数。每个内在函数对应一个或几个汇编指令。它们是内联的(没有函数调用开销)并且在大多数情况下与编写汇编一样高效。
-
是否有必要像这样反向加载它们(将第二个元素放入向量寄存器的低半部分)?
-
请注意,下面彼得的回答将 V[0] 加载到 XMM 寄存器的下半部分。在您的绘图中,V[0] 位于上半部分。 Intel/AMD CPU 是 little-endian,这意味着第一个字节存储在最低 8 位中,依此类推。所以 V[0] 在上半部分是不寻常的。
标签: assembly x86 language-agnostic sse2