更好的解决方法:B[8] = (i - j) + A[20]?

Better way to solve: B[8] = (i - j) + A[20]?

对于背景,

A[20] = s0,B[8] = s1,i = s4 和 j = s5

所以有个同学帮我做了这个,得到了:

lw t0,80(s0)
add t0, t0,s4
Sub t0,t0,s5
sw to,32(s1)

会不会better/possible有一个:

lw t0,80(s0)
sub t1,s4,s5  for i - j
add t2, t0,t1  for A[20] + (i-j)
sw t2, 32(s1) 

现在我不知道我认为的答案是否正确,但希望我在正确的轨道上。

这些基本是这样的:

val = a[20]
val = val + i 
val = val - j 
b[8] = val

对比

val = a[20]
diff = i - j
result = val + diff
b[8] = result

这两个应该完成同样的事情,并且用相同数量的指令完成。

您的版本减去 i-j,然后将差异添加到 a[20],然后将其存储在 b[8] 中。你同学的版本是加上 a[20]i,然后从那个和中减去 j,然后将结果存储在 b[8] 中。这基本上只是做同样事情的不同顺序。

虽然你同学的版本确实使用了更少的寄存器。这本身并没有使它变得更好,但我知道有人可能会因此而认为它更可取。

您的版本更好,原因如下:

  1. 原话是真的
  2. 它可能会减少溢出的机会:(A + i) - j 可能会溢出,而 A + ( i - j ) 不一定(见 1,这里对原始表达式是真实的意味着它将表现相同)
  3. 下一个周期不使用 t0 的负载,因此覆盖了负载使用延迟 — 它实际上 运行 比替代方案
  4. 快 1 个周期

请注意,subadd 指令会在溢出时陷入陷阱。问题中没有说明溢出是否有趣或重要。要完全忽略溢出,请改用 subuaddu