MIPS 指令数会随着实现而改变吗?
Does MIPS instruction count change with implementation?
这是一个非常普遍的问题,来自一个非常新的 MIPS 编码器,但是当将代码从 C 转换为 MIPS 时,指令计数是根据实现而改变还是始终相同?例如,我使用一个等式来计算:
for(i=0; i<a; i++)
for(j=0; j<b; j++)
D[4*j] = i+j;
我的指令数是(4*a)+(8*a*b)+4。但这会根据我实际编写代码的方式而改变吗?谢谢!
当然,几乎从来没有一种方法可以做某事。
例如,对于那些 for
循环,有 "boring" 方式,测试在顶部,无条件跳回,而 "slightly more clever" 形式,测试在底部和从 "before the loop" 直接无条件跳转到测试。这是一种特殊形式的循环反转,它不会花费更多代码,但动态执行的指令更少(j
不再在循环中,它只发生一次)除非循环有零次迭代。
更一般地说,您可以决定始终将局部变量保存在寄存器中,或者让它们在内存中花费不同的时间(从最愚蠢的 "load at every use and store at every assignment" 到许多无意义的加载和存储可能想要删除)。
显然,这个故事中的 "you" 也可以是编译器。而你(这次是真实的你)通常可以通过给它特定的标志来控制它发出的指令数量。通常告诉它根本不做优化会导致编译器在每次使用变量时发出负载并在每次赋值时存储,而在任何非零优化中它不应该这样做。
这是一个非常普遍的问题,来自一个非常新的 MIPS 编码器,但是当将代码从 C 转换为 MIPS 时,指令计数是根据实现而改变还是始终相同?例如,我使用一个等式来计算:
for(i=0; i<a; i++)
for(j=0; j<b; j++)
D[4*j] = i+j;
我的指令数是(4*a)+(8*a*b)+4。但这会根据我实际编写代码的方式而改变吗?谢谢!
当然,几乎从来没有一种方法可以做某事。
例如,对于那些 for
循环,有 "boring" 方式,测试在顶部,无条件跳回,而 "slightly more clever" 形式,测试在底部和从 "before the loop" 直接无条件跳转到测试。这是一种特殊形式的循环反转,它不会花费更多代码,但动态执行的指令更少(j
不再在循环中,它只发生一次)除非循环有零次迭代。
更一般地说,您可以决定始终将局部变量保存在寄存器中,或者让它们在内存中花费不同的时间(从最愚蠢的 "load at every use and store at every assignment" 到许多无意义的加载和存储可能想要删除)。
显然,这个故事中的 "you" 也可以是编译器。而你(这次是真实的你)通常可以通过给它特定的标志来控制它发出的指令数量。通常告诉它根本不做优化会导致编译器在每次使用变量时发出负载并在每次赋值时存储,而在任何非零优化中它不应该这样做。