首页 > 解决方案 > 交换 aarch64 中的两个寄存器

问题描述

我正在学习 AArch64 汇编。来自 x86,我发现有趣的是似乎没有任何一条指令喜欢xchg交换两个寄存器。除非我弄错了,否则该swp指令只会将寄存器与内存交换(由于原子性,这当然是更重要的情况)。

有一些明显的方法可以做到这一点,并进行各种权衡。我将x0, x1用作示例。

  1. 使用暂存器:三个指令,一个额外的寄存器。
mov x2, x0
mov x0, x1
mov x1, x2
  1. 使用异或技巧:三个指令,没有额外的寄存器
eor x0, x0, x1
eor x1, x0, x1
eor x0, x0, x1
  1. 使用堆栈:两条指令,没有额外的寄存器,两个 16 字节的内存访问:
stp x0, x1, [sp, -16]!
ldp x1, x0, [sp], 16

我还缺少什么更好的方法吗?“更好”可以是以下任何一种:更小的代码、更快的代码(在典型机器上)、需要的寄存器更少、内存访问更少、更惯用。

我也对适用于 SIMD/FP 寄存器的方法感兴趣。

(我知道在大多数情况下尝试优化这将是一件愚蠢的事情;这只是我了解指令集的一种方式,而不是其他任何东西。)

标签: assemblyswaparm64micro-optimization

解决方案


推荐阅读