2013-05-12 37 views
1

我有一个[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个分支有各种不可避免的摊位。我想去一个方法,我会应用掩码数组元素,这将导致不同的位模式,取决于值是否属于感兴趣的区间。然后我会使用的位模式的价值跳进那里我把一个+1的相关区间(伪)的阵列位置(.space保留):

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:if number> = 5000或number < 0我必须(打印一条消息并退出) - 使用无符号算术我只关心病例号> = 5000(负数是2的补码中的大正数)

回答

0

我不熟悉mips组件,所以我不会进入特定的机器说明。我的想法是不使用掩码,而是将您的数字除以1000(整数除法而不是浮点除法)。您可以使用结果0, 1, 2, ...来确定跳转的位置。

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

要处理你的PS - 任何负面结果(假设签署分割操作),你可以跳转到正确的处理程序。任何5个或更多的结果相同。

+0

谢谢 - 不幸的是,nono-division需要24个周期,所以它会将性能完全吹出:(这就是为什么我试图去找一个面具 – 2013-05-12 15:27:39

+0

@Mr_and_Mrs_D - 有趣的,所以就我的理解而言--24个周期比“5个分支种类不可避免的摊位“? – 2013-05-12 16:29:47

+0

是:)我在1700与我目前的实施 - 这将吹到超过2500 - 公平我会尽力计算并尽快回复您 – 2013-05-12 16:32:07