看板 Grad-ProbAsk 關於我們 聯絡資訊
假設處理器一次可以分發兩個指令(ex.左:ALU or branches, 右:LW or SW) Loop: lw $t0, 0($s1) addu $t0, $t0, $s2 sw $t0, 0($s1) addi $s1, $s1, -4 bne $s1, $zero, Loop code scheduling 後: Loop: lw $t0, 0($s1) addi $s1, $s1, -4 addu $t0, $t0, $s2 bne $s1, $zero, Loop sw $t0, 4($s1) ↑ 1. 這邊為什麼會是4,而不是16? 2. 上面的addi跟addu可以互換嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.123.237.64
BuliBuchi:1.addi 先-了4 sw要加回來 2.NO 會有load use 01/12 14:01
kiwidoit:小的知道因為addi先-4所以sw要加回來0.0 可是不用對齊 01/12 17:57
kiwidoit:byte address嗎==? 01/12 17:57
kiwidoit:$s1扣4後,sw不是應該加上4*4的offset嗎,還是我觀念有錯 01/12 17:58
kiwidoit:另外2.原來有load-use,感謝回答! 01/12 18:00
BuliBuchi:對"暫存器S1"來說 +4 等於移一格而已 你可以舉例子看看 01/12 20:32
ab170926:sw那行原本是Mem[0+s1]=t0,減過以後+回去所以是[4+s1] 01/12 22:27
kiwidoit:sw那一行原本不是address[0+$s1的值*4]嗎= =? 01/13 12:06
kiwidoit:那s1-4後,相當於-16,所以應該要+16回來吧... 01/13 12:07
kiwidoit:有人可以跟我說我哪裡觀念有錯嗎......... 01/14 23:48
monkeyleo:sw跟lw裡的常數本身就是以對齊byte address表示了吧 01/26 11:07