0

プログラム内のすべてのメモリ操作を計測する LLVM パス モジュールを作成しています。ロジックの一部では、ポインターに対して非常にホットなバイナリ ロジックを実行する必要があります。

「bit ? u64_value : zero」をできるだけ少ないサイクルで、できれば明示的な分岐を使用せずに実装するにはどうすればよいですか? レジスタの最下位ビットにビットがあり、別のレジスタに値 (u64 と仮定) があります。ビットが設定されている場合は、値を保持します。ビットがゼロの場合、レジスタをゼロにします。

x86 BMI 命令を使用できます。

4

2 に答える 2

1

selectあなたの友達です。ほとんどの場合はコンパイルされますcmovが、そうでない場合でもバックエンドが処理します。意味的には、「arg1がtrueの場合、arg2がそうでなければarg3」であり、C / C ++ / Javaの?:のようです。C++ API では、 を呼び出しますSelectInst::Create(yourBool, yourInputValue, ConstantInt::get(i64, 0), instructionName, currentBlock);

指示に意味のある名前を付けることができれば、作業が楽になります。最初は問題ありませんが、コードが大きくなるにつれて、デバッグがますます簡素化されます。

于 2018-12-21T22:29:25.410 に答える