[0,5000) の範囲の整数の配列があり、アセンブリで 5 つの間隔 ([0,1000)、[1000,2000)、...、[4000,5000)) に分割したい。私は正しいが改善の余地があるアプローチを使用しました:
sltiu $t2, $t0, 1000 ; array element in $t0, compare to 1000
;...
bne $t2, $zero, condition ; if $t0 was in the interval done
残りはこのように進みます。これにより、最悪の場合、あらゆる種類の避けられない失速を伴う 5 つのブランチが発生します。値が対象の間隔に属しているかどうかに応じて、異なるビットパターンになる配列要素にマスクを適用するアプローチを取りたいと思います。次に、ビット パターンの値を使用して.space
、関連する間隔 (疑似コード) に +1 を配置する配列位置 ( で予約)にジャンプします。
daddi $v0, $zero, array_of_interval_hits
; loop
xor $t3, $t0, mask ; $t0 contains the array element
lwu $t4, array_of_interval_hits($t3)
daddi $t4, $t4, 1
sw $t4, array_of_interval_hits($t3)
そのようなマスクはありますか?
PS : 数値 >= 5000 または数値 < 0 の場合 (メッセージを出力して) 終了する必要があります - 符号なし算術演算を使用します 数値 >= 5000 の場合のみ気にします (負の数は 2 の補数では大きな正です)