Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 组件-两个间隔的非幂次位掩码_Assembly_Binary_Boolean Logic_Mips64 - Fatal编程技术网

Assembly 组件-两个间隔的非幂次位掩码

Assembly 组件-两个间隔的非幂次位掩码,assembly,binary,boolean-logic,mips64,Assembly,Binary,Boolean Logic,Mips64,我有一个[05000]范围内的整数数组,我想将它们拆分为5个区间[01000、[10002000、[40005000]。我使用的方法虽然正确,但仍有改进的余地: sltiu $t2, $t0, 1000 ; array element in $t0, compare to 1000 ;... bne $t2, $zero, condition ; if $t0 was in the interval done 接下来就是这样。最坏的情况下,这会导致5个分支出现各种不可避免的停顿。我想采用一种方

我有一个[05000]范围内的整数数组,我想将它们拆分为5个区间[01000、[10002000、[40005000]。我使用的方法虽然正确,但仍有改进的余地:

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的补码中是大正数

我不熟悉mips汇编,所以我不会进入特定的机器指令。我的想法是不使用掩码,而只是划分整数ger除法不是浮点除法。您可以使用结果0、1、2…来确定跳转的位置

例如,0-999之间的数组中的数字将给出0的结果;1000-1999之间的数组中的数字将给出1的结果;等等


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

我认为不存在这样的掩码-如果有人提出解决方案,请发布并接受,但现在关闭此项。有关我的编程问题的解决方案,请参阅我的通信ent:

谢谢-不幸的是,非O除法需要24个周期,所以它会彻底破坏性能:。这就是为什么我要尝试使用非O除法mask@Mr_and_Mrs_D-很有意思。就我的理解而言-24个周期比5个分支更糟糕,有各种不可避免的停顿?是的:我目前的实现是1700-这会让它崩溃对于超过2500个-公平地说,我会尝试并计算它,然后返回给你ASAPI确实尝试了一种类似于你所说的方法-但是我没有除以常数,然后使用左移-讨论了这种方法,我的代码是-1200个循环。但是如果有某种掩码,代码会快得多。