2016-10-02 4 views
0

レジスタの内容を見て、0に設定されたビット数を数え、その数を別のレジスタに保存する最も効率的な方法は何ですか?レジスタのビット数を0に設定する

明らかにループはLSRと一緒に必要ですが、私はAND命令とEORを一緒に実装する方法がわかりません。

+2

[レジスタ、ARMアセンブリで1の数を数える最速の方法](http://stackoverflow.com/questions/15736602/fastest-way-to-count-number-of-1s-in- a-register-arm-assembly) – Notlikethat

答えて

0

ここでは本当に答えはありません。いくつかのプロセッサは、設定されたビット数を与える命令を持っています(汎用プログラミングにとっては無用な命令ですが、エラー検出には適しています)。このような指示がないと仮定すると、レジスタが保持する可能性が最も高いのは圧倒的にゼロであることが多く、それを特別にテストする必要があります。その後、ビットを数えることに頼らなければなりません。基本的なアルゴリズムは1つとANDであり、結果をアキュムレータに加え、右にシフトし、そして1つでシフトし、すべてのビットが得られるまで繰り返す。それとも、0ビットでXORを1にしたいからですが、速度を上げる可能性があります。あなたは8ビットを取って検索することができます。しかし、それは8をクロックアウトするより速いか遅いでしょうか?特定の命令セット、メモリキャッシュなどに依存します。レジスタがインデックス番号で識別されるような「レジスタファイル」がある場合、レジスタ0を4、レジスタ1を3、レジスタ2を3、レジスタ3を2と設定することができます。ゼロビット)、4ビットをクロックアウトし、その結果を使用してレジスタファイルにインデックスを付けます。オーバーヘッドを正当化するには、いくつかのことを行う必要があります。

もう1つの問題は、ループ処理またはアンローリング処理が高速化されるかどうかです。ここでもまた、アーキテクチャに非常に依存しています。

次に、MSBが設定されている場合は、数値が負であるということです。負数の検定はANDより速いのですか?非常に可能性が高いです。もう1つは、2つの乗算またはそれ自身の加算は、キャリーフラグを設定する可能性が高く、キャリーを使用してゼロを加算することは、レジスタを追加するよりも速いことです。

可能な小さなストラテジがたくさんあります。

関連する問題