Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly MOVDQA和MOVAPS x86指令之间的差异?_Assembly_X86_Sse_Simd_Mov - Fatal编程技术网

Assembly MOVDQA和MOVAPS x86指令之间的差异?

Assembly MOVDQA和MOVAPS x86指令之间的差异?,assembly,x86,sse,simd,mov,Assembly,X86,Sse,Simd,Mov,我正在查看英特尔数据表:英特尔64和IA-32体系结构 《软件开发人员手册》我找不到两者之间的区别 MOVDQA:移动对齐的双四字 MOVAPS:移动对齐压缩单精度 在“英特尔数据表”中,我可以找到两种指令: 此指令可用于从128位加载XMM寄存器 内存位置,用于将XMM寄存器的内容存储到 128位内存位置,或在两个XMM寄存器之间移动数据 唯一的区别是: 要在未对齐的内存位置之间移动双四字,请使用 MOVDQU指令 及 将压缩单精度浮点值移动到或从 未对齐的内存位置,请使用MOVUPS指令

我正在查看英特尔数据表:英特尔64和IA-32体系结构 《软件开发人员手册》我找不到两者之间的区别

  • MOVDQA:移动对齐的双四字
  • MOVAPS:移动对齐压缩单精度
在“英特尔数据表”中,我可以找到两种指令:

此指令可用于从128位加载XMM寄存器 内存位置,用于将XMM寄存器的内容存储到 128位内存位置,或在两个XMM寄存器之间移动数据

唯一的区别是:

要在未对齐的内存位置之间移动双四字,请使用 MOVDQU指令

将压缩单精度浮点值移动到或从 未对齐的内存位置,请使用MOVUPS指令

但是我找不到为什么有两种不同的说明


那么有人能解释这两者的区别吗?

在功能上,它们是相同的


在一些(但不是全部)微体系结构上,由于“域交叉惩罚”,存在时间差异。因此,当数据与整数SSE指令一起使用时,通常应使用
movdqa
,当数据与浮点指令一起使用时,通常应使用
movaps
。有关此主题的详细信息,请参阅《英特尔优化手册》或Agner Fog的《优秀微体系结构指南》。请注意,这些延迟通常与寄存器移动相关,而不是与加载或存储相关。

您可以链接到特定的手动条目吗?我很难相信这一点,因为SSE寄存器没有与其关联的类型(该类型在指令中编码),因此我认为没有不同的浮点和整数路径。但是,它们有不同的操作码,并且在不同的指令集中引入。MOVAPS是SSE1,而MOVDQA是SSE2。根据@Jasper Bekkers的说法,它们都有相同的延迟和吞吐量:你不能完全相信,但这仍然是事实。有关域及其之间的旁路延迟的一般性讨论,请参阅《英特尔优化手册》(例如,2.2.3讨论了Nehalem微体系结构上的域)。关于具体的危险示例,请参见Agner Fog的优秀参考资料第86页和第87页。Agner手册中的页面似乎已更改,最好只搜索“数据旁路延迟”,每个uArch都有一个部分。那么
movaps
movapd
的对比呢?它们都在浮点域中,所以我不明白为什么会有两条指令。@Zboson:保留将来引入单独浮点域/双域的可能性。这几乎肯定永远不会发生,但一些架构师认为这可能是多年前的事了。而且MOVAPD看起来和他们一样。