x86汇编中movss后执行unpcklps xmm4,xmm0是否冗余?
x86汇编:unpcklps指令是否冗余?
先明确两条指令的具体行为:
movss xmm4,[rcx+000003F8]:只把内存中的32位浮点数写入xmm4的低32位(第一个单精度浮点元素),xmm4剩下的高96位(另外三个单精度元素)会保留之前的垃圾值(如果xmm4没提前初始化过)。unpcklps xmm4,xmm0:对xmm4和xmm0的低两个单精度元素做交叉合并,结果存回xmm4,具体变化如下:- xmm4第0位元素:保持原加载的浮点数不变
- xmm4第1位元素:从原来的垃圾值变为0(来自xmm0的第0位)
- xmm4第2位元素:保留原xmm4第1位的垃圾值
- xmm4第3位元素:从原来的垃圾值变为0(来自xmm0的第1位)
所以这条unpcklps指令不是冗余的,它确实修改了xmm4的内容——把原本不确定的高96位里的第1、3个元素换成了0。
你觉得它没作用,大概率是误以为movss会把xmm4整个寄存器清零后再写入低32位,但实际上movss只修改低32位,高96位的内容是不确定的旧值。
内容的提问来源于stack exchange,提问作者Theo Schrenk
相关产品推荐
相关产品推荐

