【要約】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
なぜレジスタをゼロにする際、SUBではなくXORが慣習的に用いられるのか。ビット演算の特性、命令のエンコードサイズ、そして現代のプロセッサにおけるデコーダの最適化メカニズム(Register Renaming)が議論の核心である。
// Community Consensus
現代のx86アーキテクチャにおいては、'XOR reg, reg' はデコーダによって「ゼロレジスタへのリネーム」として検知され、実行ユニットを介さずに処理される(Zero-cycle execution)。これにより、実行リソースの節約とデータ依存性の排除が可能となる。かつては命令サイズや単純な計算速度の差が理由であったが、現在はハードウェアによる高度な最適化がこの慣習を支える強力な技術的根拠となっている。
// Alternative Solutions
RISC系アーキテクチャ(MIPS, RISC-V, ARM64等)では、専用のゼロレジスタ(x0, $zero, XZR等)が存在するため、XORのテクニックは不要であり、ゼロレジスタへのMOVが推奨される。また、実務的なアプローチとして、現代ではコンパイラの最適化能力を信頼し、手動でのアセンブリ記述を避けるべきとの意見もある。
// Technical Terms
Senior Engineer Insight
> 本議論は、低レイテンシを追求する我々の現場において極めて示唆に富む。単なる「慣習」として片付けられがちなコードも、ハードウェアのデコーダレベルでの最適化(Register Renaming)という、極めて具体的なパフォーマンス上の利点に直結している。\n\nしかし、注意すべきは「アーキテクチャへの依存」だ。x86ではXORが有利だが、RISC系では専用レジスタを用いるのが定石である。最適化を追求する際は、言語レベルの抽象化に頼らず、ターゲットとする命令セットアーキテクチャ(ISA)の内部挙動を理解した上で、コンパイラに任せるべき領域と手動で制御すべき領域を峻別する審美眼が求められる。プラットフォームの特性を無視した「知識に基づかない最適化」は、移植性と保守性を損なうリスクでしかない。