gpt4 book ai didi

assembly - 基于标量整数条件的 AVX 矢量寄存器的条件移动 (cmov)?

转载 作者:行者123 更新时间:2023-12-03 23:00:39 26 4
gpt4 key购买 nike

对于 64 位寄存器,有 CMOVcc A, B指令,只写 BA如果条件cc满意:

; Do rax <- rdx iff rcx == 0
test rcx, rcx
cmove rax, rdx
但是,我找不到任何与 AVX 等效的东西。我还想根据 RFLAGS的值移动,只是使用更大的操作数:
; Do ymm1 <- ymm2 iff rcx == 0
test rcx, rcx
cmove ymm1, ymm2 (invalid)
cmov 是否有 AVX 等价物? ?如果没有,我怎样才能以无分支的方式实现这个操作?

最佳答案

虽然没有矢量化版本的 cmov ,可以使用位掩码和 blending 实现等效的功能。 .

假设我们有两个 256 位向量 value1value2 ,驻留在相应的向量寄存器 ymm1ymm2 :

align 32
value1: dq 1.0, 2.0, 3.0, 4.0
value2: dq 5.0, 6.0, 7.0, 8.0
; Operands for our conditional move
vmovdqa ymm1, [rel value1]
vmovdqa ymm2, [rel value2]
我们要比较两个寄存器 rcxrdx :
; Values to compare
mov rcx, 1
mov rdx, 2
如果它们相等,我们要复制 ymm2进入 ymm1 (因此选择 value2 ),否则我们要保留 ymm1因此 value1 .
使用 cmov 的等效(无效)符号:
cmp rcx, rdx
cmove ymm1, ymm2 (invalid)

首先,我们加载 rcxrdx进入向量寄存器和 broadcast它们,因此它们被复制到相应寄存器的所有 64 位块( . 描述了一个连接):
vmovq xmm0, rcx          ; xmm0 <- 0 . rcx
vpbroadcastq ymm1, xmm0 ; ymm1 <- rcx . rcx . rcx . rcx
vmovq xmm0, rdx ; xmm0 <- 0 . rdx
vpbroadcastq ymm2, xmm0 ; ymm2 <- rdx . rdx . rdx . rdx
然后,我们使用 vpcmpeqq 生成一个掩码:
; If rcx == rdx:  ymm0 <- ffffffffffffffff.ffffffffffffffff.ffffffffffffffff.ffffffffffffffff
; If rcx != rdx: ymm0 <- 0000000000000000.0000000000000000.0000000000000000.0000000000000000
vpcmpeqq ymm0, ymm1, ymm2
最后,我们 blend ymm2进入 ymm1 , 使用 ymm0 中的掩码:
; If rcx == rdx: ymm1 <- ymm2
; If rcx != rdx: ymm1 <- ymm1
vpblendvb ymm1, ymm1, ymm2, ymm0

感谢 @fuz ,谁在评论中概述了这种方法!

关于assembly - 基于标量整数条件的 AVX 矢量寄存器的条件移动 (cmov)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66014601/

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