【要約】XOR'ing a register with itself is the idiom for zeroing it out. Why not sub? [Hacker_News] | Summary by TechDistill
> Source: Hacker_News
Execute Primary Source
// Discussion Topic
レジスタをゼロクリアする際のイディオム(慣習)に関する技術的考察。
- ・論理ゲートの複雑性とキャリー伝搬による遅延の有無。
- ・現代のx86プロセッサにおける実行サイクルとOoO最適化。
- ・命令エンコードサイズ(マシンコードの長さ)の影響。
- ・RISC系アーキテクチャにおけるゼロレジスタの有用性。
// Community Consensus
議論の結論は、技術的必然性と歴史的経緯の混合である。
【性能・回路面】
【性能・回路面】
- ・論理的にはXORの方が単純で、キャリー伝搬のコストがない。
- ・現代のx86では、両者の実行サイクルに実質的な差はない。
- ・OoO CPUでは、XORは依存関係を断ち切る命令として最適化される。
- ・8080/Z80等の旧世代での命令サイズや速度の差が、慣習を形成した。
- ・IBMの古いプロセッサでは、XORがエラーチェックを抑制する特殊機能を持っていた。
- ・現代では性能差はほぼないが、エンコード効率や最適化の観点からXORが有利。
// Alternative Solutions
- ・ゼロレジスタへの移動(MIPSの$zero, RISC-Vのx0, ARM64のXZR等)。
- ・Itaniumにおける専用ゼロレジスタの使用。
- ・68kにおけるmoveq #0による高速クリア。
// Technical Terms
Senior Engineer Insight
> 本議論は、抽象化された高レイヤーのプログラミングでは見落とされる「物理的実態」の重要性を突いている。現代のx86においてXORが有利なのは、単なる古い慣習ではない。OoOエンジンが「依存関係の切断」として認識し、実行ユニットの負荷を軽減するという、ハードウェアとソフトウェアの高度な相互作用の結果だ。低レイテンシが要求される現場では、コンパイラの最適化を盲信するのではなく、ターゲットとするアーキテクチャの命令が、物理的にどのような依存関係や回路パスを通るかを理解しておくべきである。それが、真にシビアな最適化を実現する唯一の道だ。