我阅读了这两个操作的手册描述,但还不明白其中的区别。有人可以举例说明 shufpd 与 pshufd 的比较吗?
pshufd将 32 位作为一个单元进行混洗。shufpd将 64 位作为一个单元进行混洗。pshufd在单个寄存器内随机播放。shufpd可以合并洗牌 2 个寄存器。pshufd有单独的源操作数和目标操作数,因此有时可以在寄存器之间保存副本。pshufd使用浮点或shufpd整数)可能会导致旁路延迟。下面是英特尔文档的复制粘贴,用伪代码解释了每个操作。当你仔细阅读时,差异是非常明显的。
pshufd a, a, imm8
DEFINE SELECT4(src, control) {
CASE(control[1:0]) OF
0: tmp[31:0] := src[31:0]
1: tmp[31:0] := src[63:32]
2: tmp[31:0] := src[95:64]
3: tmp[31:0] := src[127:96]
ESAC
RETURN tmp[31:0]
}
dst[31:0] := SELECT4(a[127:0], imm8[1:0])
dst[63:32] := SELECT4(a[127:0], imm8[3:2])
dst[95:64] := SELECT4(a[127:0], imm8[5:4])
dst[127:96] := SELECT4(a[127:0], imm8[7:6])
shufpd a, b, imm8
dst[63:0] := (imm8[0] == 0) ? a[63:0] : a[127:64]
dst[127:64] := (imm8[1] == 0) ? b[63:0] : b[127:64]
Run Code Online (Sandbox Code Playgroud)
例子?
a = [1, 1, 2, 2]
b = [3, 3, 4, 4]
shufpd a, b, 1 -> [2, 2, 3, 3]
Run Code Online (Sandbox Code Playgroud)
您不能使用 来执行此操作pshufd,但有时两者可以用于同一任务。
a = [1, 1, 2, 2]
pshufd a, a, 0x4e -> [2, 2, 1, 1]
shufpd a, a, 1 -> [2, 2, 1, 1]
Run Code Online (Sandbox Code Playgroud)