我有一个[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的补码中的大正数)
谢谢 - 不幸的是,nono-division需要24个周期,所以它会将性能完全吹出:(这就是为什么我试图去找一个面具 – 2013-05-12 15:27:39
@Mr_and_Mrs_D - 有趣的,所以就我的理解而言--24个周期比“5个分支种类不可避免的摊位“? – 2013-05-12 16:29:47
是:)我在1700与我目前的实施 - 这将吹到超过2500 - 公平我会尽力计算并尽快回复您 – 2013-05-12 16:32:07