我正在努力理解SLL如何帮助我在MIPS中执行复杂的计算。例如,how是,我必须跟踪位的位置:
sll $t1, $t0, 3 // essentially $t1 = $t0 * 8
优于(除额外作业外):
addi $t2,$zero,8 mult $t1, $t0, $t2
insrf1ej1#
最大的原因很简单:移位运算比乘法运算快得多。几乎每个CPU都是如此。这是唯一“简单”的部分,使用移位运算更难写,但比mult或div更有效。即使关闭优化,大多数C编译器也会使用移位和加法,而不是硬件乘法。但是,请记住,左移时仍有可能出现有符号溢出。如果在第一个例子中,$t0包含0x7FFFFFFF,那么在移位三次后,$1中将出现0xFFFFFFF8或-8。
mult
div
$t0
0x7FFFFFFF
$1
0xFFFFFFF8
-8
1条答案
按热度按时间insrf1ej1#
最大的原因很简单:移位运算比乘法运算快得多。几乎每个CPU都是如此。这是唯一“简单”的部分,使用移位运算更难写,但比
mult
或div
更有效。即使关闭优化,大多数C编译器也会使用移位和加法,而不是硬件乘法。但是,请记住,左移时仍有可能出现有符号溢出。如果在第一个例子中,
$t0
包含0x7FFFFFFF
,那么在移位三次后,$1
中将出现0xFFFFFFF8
或-8
。