无分支代码里为何仍有分支:RV32 缺 cmov 的进位传播难题
jedisct1 · x · 2026-10-09
Frank DENIS 的博文《Branches in branch-free code》从一个看似简单的例子切入:用 clang 把 128 位无符号加法编译到 RV32(-march=rv32imac -O2),输出里居然出现了条件分支 beq——加法里为什么会有分支?
要点:
- RV32 寄存器只有 32 位,LLVM 要把 128 位加法拆成四个 32 位加法并逐级传递进位;
- x86 和 AArch64 有条件移动指令 cmov,可以无分支地做进位传播,但 RV32 没有,连 64 位整数的 < 比较都会产生分支;
- 编译器于是用 sum1 == b1 这类判断来决定沿用旧进位,制造了『无分支代码里的分支』;
- 文章还讨论了常时(constant-time)代码中广泛使用的位掩码 ctselect 技巧。
对写密码学常时代码或嵌入式 RISC-V 的人都有参考价值。
「研究」频道最新
- Perturb-seq 前进一大步:RNA fingerprinting 方法登上 Cell — anshulkundaje · 2026-10-10
- 30 天建 8000 平方英尺高通量湿实验室,AI 模型合成化合物杀死草地贪夜蛾 — aadityabuilds · 2026-10-10
- Snorkel 开放基准资助扩至 3000 万美元,Marin 负责人谈评测之道 — dlwh · 2026-10-10
- 计算生物学家讨论在潜空间重建关键生物变异轴 — anshulkundaje · 2026-10-10
- Success-Guided Sampling:纯仿真 RL 零样本实现精细机械臂装配 — kevin_zakka · 2026-10-10
- 单细胞扰动建模之争:表型读出比逐基因重构更关键 — fabian_theis · 2026-10-10