xmm
和ymm
寄存器有什么区别?我认为xmm
用于SSE,ymm
用于AVX,但我编写了一些代码:
vmovups ymm1, [r9]
vcvtss2si rcx, ymm1
它给了我:
error: invalid combination of opcode and operands
是关于台词的:
vcvtss2si rcx, ymm1
所以我写到:
vcvtss2si rcx, xmm1
它的工作方式和预期一样。转换为整数的ymm1
向量的第一个值现在在rcx
中。
ymm1
和xmm1
是相同的寄存器吗?
发布于 2018-01-07 17:55:22
xmm0
是ymm0
的下半部分,就像eax
是rax
的下半部分一样。
写入xmm0
(使用VEX编码指令,而不是遗留SSE)对ymm0
,以避免错误依赖关系的上车道进行零。没有对遗留SSE指令的上字节进行归零是存在AVX和遗留SSE指令混合的惩罚的原因。
大多数AVX指令都有128位或256位大小.例如vaddps xmm0, xmm1, xmm2
或vaddps ymm0, ymm1, ymm2
。(大多数整数指令的256位版本仅在AVX2中可用,AVX仅提供128位版本。有几个例外,比如vptest ymm, ymm
in AVX1。如果将其计算为“整数”指令,则为vmovdqu
)。
像vmovd
、vcvtss2si
和vcvtsi2ss
这样的标量指令只能在XMM寄存器中使用。读取YMM寄存器在逻辑上与读取XMM寄存器没有什么区别,但是编写低元素(并保留其他元素未经修改,就像设计糟糕的vcvtsi2ss
做的那样)对于XMM和YMM来说是不同的,因为YMM版本将使上车道不归零。
在机器代码编码中不存在带有ymm的标量,即使对于真正有用的指令(如vpinsrd
/ vpextrd
(插入/提取标量))也是如此。
请注意,即使读取XMM寄存器并只使用低标量元素在逻辑上与YMM相同,但对于实际实现而言,它将不是相同的。读取YMM寄存器意味着AVX-256指令,它必须将CPU从“保存的上层”状态转换出来(对于带有SSE/AVX转换/状态的Intel CPU )。
在任何情况下,vcvtss2si rax, ymm0
都是不可编码的,汇编程序也不会神奇地将它组装成vcvtss2si rax, xmm0
。如果你用asm写作,你应该知道你在做什么。(尽管有些汇编程序会为您优化mov rax, 1
到mov eax, 1
,所以让您将ymm
写成源寄存器就可以了。)但是,让您将ymm
作为vcvtsi2ss
的目标寄存器将改变其含义,因此,为了一致性起见,最好不要这样做)。
https://stackoverflow.com/questions/48139513
复制