gpt4 book ai didi

assembly - x64 ymm/SIMD/向量指令,其中 ymm 寄存器在寄存器中指定?

转载 作者:行者123 更新时间:2023-12-03 06:29:28 35 4
gpt4 key购买 nike

是否存在任何 SIMD/向量寄存器指令,其中 ymm 寄存器是在通用寄存器(或 SIMD 寄存器)中指定的,而不是在指令本身中指定的?

本质上,我想做的是编写一个函数,将任何一系列连续的 ymm 寄存器保存到本地帧上。这是我的想法,只不过我正在为我正在寻找的指令发明我认为半合理的虚构语法。

.text
.align 64
funcname:
orq %rcx, %rcx # is register count <= 0 ???
jle funcdone # # of registers to save is <= 0

xorq %rax, %rax # rax = 0 == vector save element #

funcloop:
vmovapd %ymm(%rsi), (%rdi, %rax) # save ymm?? to address rdi + rax
addq $32, %rax # each ymm vector is 32-bytes
loop funcloop # --rcx; if (rcx > 0) { goto funcloop }

funcdone:
ret

vmovapd 指令是一个奇怪的指令,它可以完成我正在寻找的任务。我确信我从未见过类似的指令,但这并不意味着没有一些不寻常的指令可以完成我需要做的事情。

或者指令可能看起来像以下之一:

    vmovapd     %rsi, (%rdi, %rax)
vmovapd (%rsi), (%rdi, %rax)

另一种选择是%rsi中的位0到15对应于向量寄存器ymm00ymm15,并且该寄存器对应于最低的保存设置位(或保存所有“设置位”ymm 寄存器)。

顺便说一句,对于我需要完成的任务, self 修改代码不是一个选项。

最佳答案

x86 的状态保存指令 (xsave/xrstor) do 采用 edx:eax 中的掩码来控制保存/恢复什么状态。它真的很复杂,insn 引用手册只是向您指出另一本手册的整个单独部分。不过,如果您要在单个向量寄存器级别进行选择,我不知道。更有可能的是,有一个位用于“所有 16 个向量寄存器的 low128”,但 ymm0-7 与其余部分分开,以避免在 32 位代码无法影响它们时保存/恢复 ymm8-15。

The specific state components saved correspond to the bits set in the requested-feature bitmap (RFBM), which is the logical-AND of EDX:EAX and XCR0.

对于在函数序言/结尾中保存/恢复一些 ymm 寄存器,它不太可能有用。我还没有研究过。 xsavec 执行“压缩”:CPU 跟踪实际修改了哪些状态。

没有其他指令具有额外的寄存器间接级别(寄存器指定哪个寄存器)。对于无序机器的实现来说,这将是一个很大的复杂性。即使 ARM 加载多个指令(请参阅其他答案)也将寄存器位掩码嵌入到指令中,因此它在指令被解码时可用(而不是稍后填充)。

<小时/>

您可能最好对您想要使用的任何向量寄存器进行明显的存储/重新加载,但这些寄存器在您正在设计的调用约定中进行了调用保留。

请注意, future 对更宽向量的扩展意味着您最终将仅保留所选向量寄存器的低 256b,而上面的位将被破坏。 (当被调用者不接触它们时,是否归零,而不是保存/恢复)。

关于assembly - x64 ymm/SIMD/向量指令,其中 ymm 寄存器在寄存器中指定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21524416/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com