【发布时间】:2018-06-16 19:05:24
【问题描述】:
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 是同一个寄存器吗?
【问题讨论】:
-
xmm1和ymm1(以及其他索引)之间的主要区别在于前者的长度为 128 位,而后者的长度为 256。 -
那么
xmm1' andymm1`共享同一个内存?如果我想使用仅使用前 128 位的指令,使用xmm或ymm没关系?或者可能每条仅使用前 128 位的指令都需要使用xmm? -
好的,所以我从内存中处理 256 位数据:
vmovups ymm1, [r9]然后我转换xmm1的第一个元素(不是ymm1)并将其保存在rcx中:vcvtss2si rcx, xmm1怎么可能在rcx中是ymm1的第一个值?它不应该是来自xmm1的“随机”数字吗?如果xmm1和ymm1是独立的寄存器,为什么ymm1和xmm1的第一个元素是一样的? -
感谢您的链接。我现在明白我错了。你是对的,两个寄存器的低 128 位是通用的。请忽略我之前的评论。
-
@LeandroCaniglia:您可以(并且应该)删除不正确的 cmets。
xmm0是ymm0的下半部分,就像eax是rax的下半部分一样。 (写xmm0将ymm0的上车道归零)