装配 - 两个间隔的非功率位掩码

时间:2013-05-12 15:00:20

标签: assembly binary boolean-logic mips64

我有一个[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的补码中的大正数)

2 个答案:

答案 0 :(得分:0)

我不熟悉mips程序集,因此我不会涉及具体的机器指令。我的想法是不使用掩码,而是将你的数字除以(整数除以非浮点除)你的数字1000.你可以使用结果0, 1, 2, ...来确定跳转的位置。

因此,例如,数组中0到999之间的数字会得到0的结果;数组编号1000 - 1999将得到1的结果;等。

处理你的PS - 任何负面结果(假设有符号除法运算)你可以跳转到正确的处理程序。与5或更多的结果相同。

答案 1 :(得分:0)

嗯,我不认为这样的面具存在 - 如果有人想出一个解决方案请发帖并接受但现在关闭它(为了解决我的编程问题,请参阅我的评论:Assembly - bit mask for non power of two intervals)< / p>