ASM x86_64 AVX:xmm和ymm记录差异

时间:2018-01-07 17:02:41

标签: assembly nasm x86-64 avx

ymmxmm个注册表之间有什么区别? 我认为ymm用于SSE,vmovups ymm1, [r9] vcvtss2si rcx, ymm1 用于AVX,但我写了一些代码:

error: invalid combination of opcode and operands

它给了我:

vcvtss2si   rcx, ymm1

关于这条线:

vcvtss2si   rcx, xmm1

所以我写道:

ymm1

它按预期工作。转换为整数的rcx向量的第一个值现在位于ymm1

这是什么一回事? xmm1driver.get(url) driver.execute_script("window.scrollTo(0, 60000)") images = WebDriverWait(driver, 20).until(EC.presence_of_all_elements_located((By.CLASS_NAME, "shared-components-ShopSearchResultsGridImage-ShopSearchResultsGridImage__primary--3pEtg"))) im_links = [im.get_attribute('src') for im in images] 是相同的寄存器吗?

2 个答案:

答案 0 :(得分:5)

xmm0ymm0的低半部分,与eax完全相同,是rax的低半部分。

写入xmm0(使用VEX编码指令,而不是传统SSE)将ymm0just like writing to eax zeros the upper half of rax to avoid false dependencies的上部通道归零。缺少将传统SSE指令的高位字节归零是为什么有penalty for mixing AVX and legacy SSE instructions

大多数AVX指令可以使用128位或256位大小。例如vaddps xmm0, xmm1, xmm2vaddps ymm0, ymm1, ymm2。 (大多数整数指令的256位版本仅在AVX2中可用,AVX仅提供128位版本。有一些例外,例如AVX1中的vptest ymm, ymm。如果算上vmovdqu那是一个"整数"指令)。

vmovdvcvtss2sivcvtsi2ss等标量指令仅适用于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, 1mov eax, 1,但是让你放弃编写ymm作为源寄存器会起作用。但是让你写ymm作为vcvtsi2ss的目标寄存器会改变其含义,因此为了保持一致性,它不会做任何事情。

答案 1 :(得分:4)

根据wikipedia,在AVX中:

YMM个寄存器 256位长。

XMM寄存器长 128位,代表{strong> YMM寄存器的低128位

YMMXMM个寄存器重叠,XMM包含YMM

来自wikimedia的图表:

https://commons.wikimedia.org/wiki/File:AVX_registers.svg