linuxのメモ

Linux kernelの実装を解説していきます (対象ver 4.5)

自己修正コード - alt_max_short()

概要

2つの値の最大値を返す

詳細

((a) ^ (((a) ^ (b)) & -(-((a) < (b)))))

上記のコードで分岐を使わずに算術演算だけで最大値を取得できる*1

分岐はコストのかかる処理なので、分岐が無いことで高速に動作する

このマクロはarch/x86/include/asm/alternative-asm.harch/x86/include/asm/alternative.hの両方で宣言されているが、若干記述が異なる 後者のコード無いでは

(a) < (b)

ではなく

(a) - (b)

となっているが、おそらく負数は0となることになっているのだと思う

ソースが無いので本当のところはよくわかないけど、実際に動いてるしちゃんと動作するようになっているのだろう。。。

ちなみに負数が負数として扱われるとしたら、取得した値はa, bのいずれでもない値になる可能性がある

*1:マイナスを2回使っているのは値を32bitにするためとコメントに記載されているが、なんでそうなるかは解らず終い