自己動手寫CPU之第五階段(3)——MIPS指令集中的邏輯、移位與空指令


將陸續上傳本人寫的新書《自己動手寫CPU》(尚未出版),今天是第17篇。我盡量每周四篇


5.4 邏輯、移位操作與空指令說明

      MIPS32指令集架構中定義的邏輯操作指令有8條:andandiororixorxorinorlui。當中ori指令已經實現了,本章要實現其余7條指令。

      MIPS32指令集架構中定義的移位操作指令有6條:sllsllvsrasravsrlsrlv

      MIPS32指令集架構中定義的空指令有2條:nopssnop

當中ssnop是一種特殊類型的空操作。在每一個周期發射多條指令的CPU中,使用ssnop指令能夠確保單獨占用一個發射周期。OpenMIPS設計為標量處理器,也就是每一個周期發射一條指令,所以ssnop的作用與nop同樣。能夠依照nop指令的處理方式來處理ssnop指令。

      另外,MIPS32指令集架構中還定義了syncpref2條指令,當中sync指令用於保證載入、存儲操作的順序,對於OpenMIPS而言,是嚴格依照指令順序運行的,載入、存儲操作也是依照順序進行的,所以能夠將sync指令當作nop指令處理,在這里將其歸納為空指令。pref指令用於緩存預取,OpenMIPS沒有實現緩存,所以也能夠將pref指令當作nop指令處理,此處也將其歸納為空指令。

      以上17條指令依照格式、作用的不用,又可分為幾類,分別說明例如以下。

      1andorxornor

      這4條指令的格式如圖5-10所看到的。從圖中能夠發現這4條指令都是R類型指令。而且指令碼都是6'b000000,也就是MIPS32指令集架構中定義的SPECIAL類。此外,第6-10bit都為0,須要根據指令中0-5bit功能碼的值進一步推斷是哪一種指令。


  •  當功能碼是6'b100100時,表示是and指令。邏輯“與”運算

      指令使用方法為:and rd, rs, rt

      指令作用為:rd <- rs AND rt,將地址為rs的通用寄存器的值。與地址為rt的通用寄存器的值進行邏輯“與”運算。運算結果保存到地址為rd的通用寄存器中。

  •  當功能碼是6'b100101時。表示是or指令,邏輯“或”運算

      指令使用方法為:or rd, rs, rt

      指令作用為:rd <- rs OR rt。將地址為rs的通用寄存器的值,與地址為rt的通用寄存器的值進行邏輯“或”運算,運算結果保存到地址為rd的通用寄存器中。

  •  當功能碼是6'b100110時,表示是xor指令,異或運算

      指令使用方法為:xor rd, rs, rt

      指令作用為:rd <- rs XOR rt,將地址為rs的通用寄存器的值,與地址為rt的通用寄存器的值進行邏輯“異或”運算,運算結果保存到地址為rd的通用寄存器中。

  •  當功能碼是6'b100111時,表示是nor指令。或非運算

      指令使用方法為:nor rd, rs, rt

      指令作用為:rd <- rs NOR rt。將地址為rs的通用寄存器的值。與地址為rt的通用寄存器的值進行邏輯“或非”運算,運算結果保存到地址為rd的通用寄存器中。

      2andixori指令

      這2條指令的格式如圖5-11所看到的。從圖中能夠發現這2條指令都是I類型指令,能夠根據指令中26-31bit指令碼的值推斷是哪一種指令。

 

 

  •  當指令碼是6'b001100,表示是andi指令,邏輯“與”運算

      指令使用方法為:andi rt, rs, immediate

      指令作用為:rt <- rs AND zero_extended(immediate)。將地址為rs的通用寄存器的值,與指令中馬上數進行零擴展后的值進行邏輯“與”運算,運算結果保存到地址為rt的通用寄存器中。

  •  當指令碼是6'b001110。表示是xori指令。異或運算

      指令使用方法為:xori rt, rs, immediate

      指令作用為:rt <- rs XOR zero_extended(immediate)。將地址為rs的通用寄存器的值。與指令中馬上數進行零擴展后的值進行邏輯“異或”運算,運算結果保存到地址為rt的通用寄存器中。

      3lui指令

      lui指令的格式如圖5-12所看到的。

從圖中能夠發現lui指令是I類型指令,能夠根據指令中26-31bit指令碼的值是否為6'b001111。從而推斷是否是lui指令。


      指令使用方法為:lui rt, immediate

      指令作用為:rt <- immediate || 016,將指令中的16bit馬上數保存到地址為rt的通用寄存器的高16位。另外。地址為rt的通用寄存器的低16位使用0填充。

      4sllsllvsrasravsrlsrlv指令

      這6條指令的格式如圖5-13所看到的,從圖中能夠發現這6條指令都是R類型指令。而且指令碼都是6'b000000。也就是都是SPECIAL類,須要根據指令中0-5bit功能碼的值進一步推斷是哪一種指令。


  •  當功能碼是6'b000000,表示是sll指令,邏輯左移

      指令使用方法為:sll rd, rt, sa

      指令作用為:rd <- rt << sa (logic),將地址為rt的通用寄存器的值,向左移sa位。空出來的位置使用0填充。結果保存到地址為rd的通用寄存器中。

  •  當功能碼是6'b000010,表示是srl指令。邏輯右移

      指令使用方法為:srl rd, rt, sa

      指令作用為:rd <- rt >> sa (logic),將地址為rt的通用寄存器的值,向右移sa位,空出來的位置使用0填充,結果保存到地址為rd的通用寄存器中。

  •  當功能碼是6'b000011。表示是sra指令,算術右移

      指令使用方法為:sra rd, rt, sa

      指令作用為:rd <- rt >> sa (arithmetic),將地址為rt的通用寄存器的值,向右移sa位。空出來的位置使用rt[31]的值填充,結果保存到地址為rd的通用寄存器中。

  •  當功能碼是6'b000100。表示是sllv指令,邏輯左移

      指令使用方法為:sllv rd, rt, rs

      指令作用為:rd <- rt << rs[4:0](logic)。將地址為rt的通用寄存器的值。向左移位,空出來的位置使用0填充,結果保存到地址為rd的通用寄存器中。移位位數由地址為rs的寄存器值的0-4bit確定。

  •  當功能碼是6'b000110,表示是srlv指令。邏輯右移

      指令使用方法為:srlv rd, rt, rs

      指令作用為:rd <- rt >> rs[4:0](logic),將地址為rt的通用寄存器的值,向右移位,空出來的位置使用0填充。結果保存到地址為rd的通用寄存器中。

移位位數由地址為rs的寄存器值的0-4bit確定。

  •  當功能碼是6'b000111,表示是srav指令,算術右移

      指令使用方法為:srav rd, rt, rs

      指令作用為:rd <- rt >> rs[4:0](arithmetic),將地址為rt的通用寄存器的值,向右移位。空出來的位置使用rt[31]填充,結果保存到地址為rd的通用寄存器中。

移位位數由地址為rs的寄存器值的0-4bit確定。

      總結來說。這六條移位操作指令能夠分為兩種情況:sllvsravsrlv3條指令的助記符最后有“v”。表示移位位數是通過寄存器的值確定的,sllsrasrl3條指令的助記符最后沒有“v”,表示移位位數就是指令中6-10bitsa的值。

      5nopssnopsyncpref指令

      這4條指令的格式如圖5-14所看到的。從圖中能夠發現nopssnopsync3條指令都是R類型指令,而且指令碼都是6'b000000。也就是都是SPECIAL類。


      更進一步,能夠發現nopssnop兩條指令的功能碼都是6'b000000,與之前介紹的邏輯左移指令sll的功能碼同樣。這樣在譯碼的時候會不會有沖突:nop指令的二進制碼與sll $0,$0,0的二進制碼一樣,處理器怎樣譯碼?ssnop指令的二進制碼與sll $0,$0,1的二進制碼一樣,處理器怎樣譯碼?

nop      =     sll $0,$0,0
ssnop    =     sll $0,$0,1

      事實上兩者是等價的。sll指令向$0寄存器保存移位結果,實際不會有不論什么效果,由於不管向$0寫不論什么數,其值始終為0,所以效果等同於什么都不做,這也正是空指令nopssnop的效果。所以nopssnop指令不用特意實現,全然能夠當作特殊的邏輯左移指令sll


下一次將實現上面介紹的邏輯、移位、空指令,敬請關注!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM