x86_64架构是否有掩码和比较指令?

Is there a mask-and-compare instruction for the x86_64 architecture?

提问人:Marc 提问时间:11/12/2023 最后编辑:TylerHMarc 更新时间:11/14/2023 访问量:120

问:

需要在运行时保留类型信息的编程语言的实现通常使用整数值的某些位作为标记位。C 编程语言中处理此类标记的典型表达式如下所示:

(val && MASK) == TAG

在机器语言中,必须实现这样的测试,例如,如下所示:

movq val,%rax
andq MASK,%rax
cmpq TAG,%rax

换句话说,如果需要保留原始值,则需要暂存寄存器。由于这是在动态类型语言中实现类型安全的典型代码,并且需要高效,因此我想知道 x86_64 ISA 中是否有单个掩码和比较指令。或者在我不知道的 AMD64 平台的较新扩展之一中是否真的有这样的说明?

汇编 x86-64 cpu 架构 动态类型

评论

1赞 fuz 11/12/2023
根据标签是什么,您通常可以检查掩码中的各个位。如果标记为 8 位,则可以在最低有效位上使用字节比较。但除此之外,是的,你将不得不掩盖我们的,然后进行比较。我不知道有任何架构对您设想的操作有专门的指令。TEST
4赞 harold 11/12/2023
将其编码为具有 2 个寄存器操作数和 1 个直接操作数的指令在理论上已经存在了很长时间,但还没有完成。如今,具有 3 个寄存器操作数的版本是可能的。截至 Haswell,有(一些)直接支持 3 输入 μops,而 Skylake 对此进行了改进(例如,您可以在改进中看到这一点)cmov
3赞 fuz 11/12/2023
@Marc 随意改写。有没有:据我所知,没有。可以编码吗?当然,没问题。有多种方法可以对即时掩码和套准掩码进行处理。承保的特殊情况?如果标记是基准面的低 8 位、16 位或 32 位,则可以使用字节、字或 dword 指令进行比较。如果标签设计良好,您可以使用该指令来测试其中的各个位(例如,如果标签是最有效位加上另一个位,则可以使用一个来区分四种可能情况中的三种)。testtest
3赞 Peter Cordes 11/13/2023
APX (intel.com/content/www/us/en/developer/articles/technical/...) 将提供一个非破坏性的 AND(进入带有 EVEX 前缀的不同寄存器),以避免 .在现代 CPU 中不需要后端执行单元(Ice Lake 除外,其中禁用了整数 mov-elim),但它仍然占用 ROB 条目和前端带宽。至于检查所有选定位是否已设置的单个指令,在我所知道的任何现代 ISA 中都没有。可能有,甚至 BMI1/2 也为新的操作码提供了充足的编码空间。movmov
2赞 Nate Eldredge 11/13/2023
你可能会期望一个像样的编译器会从性能关键的内部循环中提升类型检查,所以我真的不希望能够有效地执行这个操作是那么有益的。此外,由于替代实现在现代机器上大约是两个周期的延迟(0 表示 mov,1 个用于简单的 ALU 指令),因此您最多只能节省一个时钟周期。与其他获得自己指令的位操作相比,例如,等效的软件实现要慢得多。lzcnt

答: 暂无答案