assembly - 使用相同的小正数有效加载 RAX 和 R8

标签 assembly x86-64 micro-optimization instruction-encoding

我可以写 mov rax, 1(7 字节编码 48, C7, C0, 01, 00, 00, 00),而不是写 mov eax, 1 (5字节编码B8,01,00,00,00)依赖自动 高位双字归零。

要将 RAX 复制到 R8,我可以在 mov r8, rax(3 字节编码 49, 89, C0)或 mov r8d, eax(3 字节编码41、89、C0)再次依赖于高位双字的自动归零。

有没有比另一种更喜欢一种复制方法的比例?
REX 前缀无法避免,因为 R8 是"new"寄存器之一,因此需要 REX.B。在这种情况下,是否应该尽量避免设置 REX.W 位?

最佳答案

如果您无论如何都需要 REX 前缀,那么其中设置的位并不重要。几乎所有 64 位指令都与其对应的 32 位指令一样快;异常(exception)包括常见的嫌疑人(乘法和除法)。

至于这两者中哪个更快:尽管依赖链更长,但第二种变体

mov eax, 1
mov r8d, eax

可能会更快,因为第二条指令可能会通过寄存器重命名来处理,不会产生延迟,也不会产生微操作。有一些不太明显的异常(exception)情况,其中寄存器重命名可能不会触发;使用微架构分析器来找到这些。在这种情况下,加载两个立即数可能会更好,因为它们可以并行执行。

关于assembly - 使用相同的小正数有效加载 RAX 和 R8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73084190/

相关文章:

assembly - 对一对有符号和无符号数字进行算术运算是否合法?

macos - OSX (XNU) 系统调用实际记录在哪里?

assembly - 向量中断

linux - 我如何开始学习 asm(gas)?

java - 在 Java 中,Integer 对象是否应该优先于 int primitive(对于其他数字类型也是如此)?

程序集引导加载程序在虚拟 PC 上运行,而不是在真实 PC 上运行

c - 函数指针编译错误

x86 - 障碍/围栏和获取、释放语义是如何在微架构上实现的?

performance - 简单阵列处理循环的 AVX 512 与 AVX2 性能对比

memory-management - 为什么 clang 的 `-O3` alloca 比 g++ 快 2 倍