如何将MIPS ADD 1 / SLT / BNE简化为更少的指令?

问题描述 投票:1回答:1

如何将这些MIPS指令减少为更少的指令?

addi  $8, $3, 1
slt   $9, $2, $8
bne   $9, $0, End
assembly mips micro-optimization
1个回答
1
投票

如何简化这些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得到的准确的0sle答案,添加了一些附加的指令,您仍然必须在其中添加分支指令,因此使得4说明! (而且在该扩展的初始指令之后,我们可能会在false上分支。)此外,也不存在“立即反向减法”,因此R-Type减法与单独生成的常量一起使用。

© www.soinside.com 2019 - 2024. All rights reserved.