assembly - 交换 aarch64 中的两个寄存器
问题描述
我正在学习 AArch64 汇编。来自 x86,我发现有趣的是似乎没有任何一条指令喜欢xchg
交换两个寄存器。除非我弄错了,否则该swp
指令只会将寄存器与内存交换(由于原子性,这当然是更重要的情况)。
有一些明显的方法可以做到这一点,并进行各种权衡。我将x0, x1
用作示例。
- 使用暂存器:三个指令,一个额外的寄存器。
mov x2, x0
mov x0, x1
mov x1, x2
- 使用异或技巧:三个指令,没有额外的寄存器
eor x0, x0, x1
eor x1, x0, x1
eor x0, x0, x1
- 使用堆栈:两条指令,没有额外的寄存器,两个 16 字节的内存访问:
stp x0, x1, [sp, -16]!
ldp x1, x0, [sp], 16
我还缺少什么更好的方法吗?“更好”可以是以下任何一种:更小的代码、更快的代码(在典型机器上)、需要的寄存器更少、内存访问更少、更惯用。
我也对适用于 SIMD/FP 寄存器的方法感兴趣。
(我知道在大多数情况下尝试优化这将是一件愚蠢的事情;这只是我了解指令集的一种方式,而不是其他任何东西。)
解决方案
推荐阅读
- python-3.x - Python 3 - xvfb-run 上的 selenium - 无法处理扩展
- android - 无法使用 RecyclerView 对 Fragment 进行改造读取数据
- java - 当 Source 为 null MapStruct 时,另一个 bean 属性的默认值
- python - 如何在 Pyomo 中创建 OR 约束?
- prestashop - PrestaShop 1.7.6.7 如何将卖家地址设置为自动生成的发票?
- node.js - 在作为 Windows 服务运行的 node.js 应用程序中增加 max-old-space-size
- vim - “未知功能:
37_repo_dir" 在 vim 中打开新文件时 - r - 根据另一个数据框 R 更改整行的值
- javascript - 如何用这种形式制作模态?
- terraform - 有没有办法重用 terraform 脚本并对其进行更改?