モジュロ関数とtimespec 正規化の両方で、カーネル コードはループによってモジュロを計算し、コンパイラがループをモジュロ演算子に最適化するのを防ぎます。
なぜそれが必要なのですか?
この最適化が適切でない場合、コンパイラは単純にそれを行わないことを期待しています。ただし、この最適化がより高速なアーキテクチャが存在する可能性があります。このコードがすべてのアーキテクチャに必要なのはなぜですか?
モジュロ関数とtimespec 正規化の両方で、カーネル コードはループによってモジュロを計算し、コンパイラがループをモジュロ演算子に最適化するのを防ぎます。
なぜそれが必要なのですか?
この最適化が適切でない場合、コンパイラは単純にそれを行わないことを期待しています。ただし、この最適化がより高速なアーキテクチャが存在する可能性があります。このコードがすべてのアーキテクチャに必要なのはなぜですか?
これは、被除数が除数より少しだけ大きいと予想されることをプログラマーが知っている場合に行われます(したがって、反復バージョンは 1 回または 2 回だけループします)。コンパイラがこれを理解することは期待できません。これは、次のコメントで説明されていdiv64.c
ます。
/*
* Iterative div/mod for use when dividend is not expected to be much
* bigger than divisor.
*/
あなたが指摘したモジュロ関数はiter_div_u64_rem()
、これが必要なときに明示的に使用されます。通常のモジュロ バージョンの場合、 がありdiv_u64_rem()
ます。