我该如何优化这个mips代码?

Mar*_*ark 1 assembly loops mips

下面我尝试使用bne循环100次,但我想修改代码,以便它运行得更快.也许以某种方式删除nop?我该如何改进这段代码?

addi $1, $0, 100
addi $2, $0, 0
lw $3, 0($4)
add $2, $2, $3
addi $4, $4, 4
addi $1, $1, -1
bne $1, $0, -5
nop
Run Code Online (Sandbox Code Playgroud)

Var*_*der 5

您可以做的第一件事是使用分支延迟槽.nop在每个循环中执行但没有完成任何操作.为什么不把那些增加$ 4的指令放在那里(因为你不需要它来进行循环计算)?

快速运行的第二步是查看相关指令.例如,将$ 3添加到$ 2必须等到lw完成,这可能需要几个机器周期.从$ 1减1不需要等待任何事情.如果颠倒这两条指令的顺序,则可以在负载仍在进行时进行减法,而不是等待它完成(这取决于体系结构,可能不会出现在所有系统上,特别是在模拟器上).

第三步是重新构建循环.您正在递增指针($ 4)并在每个循环上递减循环计数器($ 1).为什么不结合它们?你知道开始时4美元是什么,你知道最后会有4美元(4美元+(4*100)).所以你可以增加4美元,看它是否到了最后.这应该为每个循环节省一条指令.