目录
-
- [1. 分支指令](#1. 分支指令)
-
- [1.1 无条件分支(B/BL)](#1.1 无条件分支(B/BL))
- [1.2 条件分支(CBNZ/CBZ)](#1.2 条件分支(CBNZ/CBZ))
- [2. 循环优化](#2. 循环优化)
-
- [2.1 循环展开(LOOP Unrolling)](#2.1 循环展开(LOOP Unrolling))
- [2.2 优化策略](#2.2 优化策略)

1. 分支指令
1.1 无条件分支(B/BL)
assembly
B label ; 跳转到label处(不保存返回地址)
BL label ; 跳转并保存返回地址到LR寄存器(用于函数调用)
- 特点 :
B
指令不保存返回地址,适用于简单跳转BL
自动保存PC+4
到LR(x30)
,用于子程序调用- 跳转范围:±128MB(26位偏移)
1.2 条件分支(CBNZ/CBZ)
assembly
CBZ Wn, label ; 当Wn==0时跳转
CBNZ Xn, label ; 当Xn!=0时跳转
- 应用场景 :
- 循环条件检查
- 空指针检测
- 快速路径优化
- 注意 :
- 仅支持32/64位寄存器(Wn/Xn)
- 跳转范围:±1MB(19位偏移)
2. 循环优化
2.1 循环展开(LOOP Unrolling)
原始循环:
assembly
mov x0, #100 ; 循环100次
loop:
subs x0, x0, #1 ; x0--
b.ne loop ; 若x0!=0则继续
展开4次后的循环:
assembly
mov x0, #25 ; 100/4=25次
loop:
subs x0, x0, #1 ; x0--
b.ne loop ; 实际执行4条指令/迭代
2.2 优化策略
技术 | 优点 | 缺点 |
---|---|---|
部分展开 | 减少分支预测失败 | 代码量适度增加 |
完全展开 | 消除所有分支开销 | 显著增加代码尺寸 |
软件流水 | 隐藏指令延迟 | 增加寄存器压力 |
最佳实践:
- 优先展开小循环(迭代次数<100)
- 平衡展开因子(通常4-8次)
- 使用
PRFM
预取指令减少内存延迟 - 结合条件执行(如
CSEL
)处理剩余迭代