PSHUFD SHUFPD 有什么区别

sth*_*55 0 assembly sse

我阅读了这两个操作的手册描述,但还不明白其中的区别。有人可以举例说明 shufpd 与 pshufd 的比较吗?

xiv*_*r77 5

  1. pshufd将 32 位作为一个单元进行混洗。shufpd将 64 位作为一个单元进行混洗。
  2. pshufd在单个寄存器内随机播放。shufpd可以合并洗牌 2 个寄存器。
  3. pshufd有单独的源操作数和目标操作数,因此有时可以在寄存器之间保存副本。
  4. 它们可用于执行相同的任务,但混合整数和浮点指令(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)

  • `pshufd` 可以复制和洗牌,如果您仍然需要旧版本,有时会保存 `movdqa`。`shufpd` 的目的地是可读写的,并且必须包含其中的一个元素(作为低半部分)。但是,是的,有一个用例子集,其中任何一个都可用。(或“movhlps”或“unpckhpd”) (2认同)