如何将这些MIPS指令减少为更少的指令?
addi $8, $3, 1
slt $9, $2, $8
bne $9, $0, End
如何简化这些MIPS指令?
slt $9, $3, $2
beq $9, $0, End
这是推理出来的一种方法。您想做:
if ( $2 < $3+1 ) goto End;
我们将其转换为删除添加项:
if ( $2 <= $3 ) goto End;
但是我们在MIPS上没有<=
,因此,我们反转条件并且]取反它] >>。这种双重否定相抵消,因此仍然代表着相同的逻辑。这将删除比较的相等部分:if ( ! ( $2 > $3 ) ) goto End;
现在,我们交换操作数...,因为MIPS也没有>
:
if ( ! ( $3 < $2 ) ) goto End;
[翻转运算符并更改其相等部分。)好消息是,我们只能在两条指令中执行此操作,因为可以将求和运算折叠到分支指令中使用beq
(分支为false)而不是bne
(分支为true) 。
实际上,如果您使用ble
伪指令,则上面的两个指令序列将得到相同的结果。ble $2, $3, End
顺便说一句,根据您的标准,sle
是一个较差的选择。
[MIPS没有sle
作为指令,它是一个伪指令,它具有:
sle $9, $2, $3
生成:
slt $9, $3, $2 # generate the opposite condition ori $1, $0, 0x1 # generate the constant 1 sub $9, $1, $9 # generate 1 - "the opposite condition"
[正如您所看到的,它为我们应该为
1
得到的准确的0
与sle
答案,添加了一些附加的指令,您仍然必须在其中添加分支指令,因此使得4说明! (而且在该扩展的初始指令之后,我们可能会在false上分支。)此外,也不存在“立即反向减法”,因此R-Type减法与单独生成的常量一起使用。