天天看點

自己動手寫CPU之第七階段(6)——乘累加指令實作思路

将陸續上傳本人寫的新書《自己動手寫CPU》,今天是第29篇,我盡量每周四篇

亞馬遜的銷售位址如下,歡迎大家圍觀呵!

http://www.amazon.cn/dp/b00mqkrlg8/ref=cm_sw_r_si_dp_5kq8tb1gyhja4

China-pub的銷售位址如下(有目錄、内容簡介、前言):

http://product.china-pub.com/3804025

7.6 乘累加、乘累減指令說明

      乘累加、乘累減指令有4條,包括:madd、maddu、msub、msubu,各指令的格式如圖7-11所示。從圖中可知這4條指令的指令碼都是SPECIAL2,第6-15bit都為0,可以依據第0-5bit的功能碼确定是哪一種指令。

自己動手寫CPU之第七階段(6)——乘累加指令實作思路
  •  當功能碼是6'b000000時,表示是madd指令,有符号乘累加運算

      指令用法為:madd rs, rt

      指令作用為:{HI, LO} <- {HI, LO} + rs × rt,将位址為rs的通用寄存器的值,與位址為rt的通用寄存器的值,作為有符号數進行乘法運算,運算結果與{HI, LO}相加,相加的結果儲存到{HI, LO}中。此處{HI, LO}表示的是HI、LO寄存器連接配接形成的64位數,HI是高32位,LO是低32位。

  •  當功能碼是6'b000001時,表示是maddu指令,無符号乘累加運算

      指令用法為:maddu rs, rt

      指令作用為:{HI, LO} <- {HI, LO} + rs × rt,将位址為rs的通用寄存器的值,與位址為rt的通用寄存器的值,作為無符号數進行乘法運算,運算結果與{HI, LO}相加,相加的結果儲存到{HI, LO}中。

  •  當功能碼是6'b000100時,表示是msub指令,有符号乘累減運算

      指令用法為:msub rs, rt

      指令作用為:{HI, LO} <- {HI, LO} - rs × rt,将位址為rs的通用寄存器的值,與位址為rt的通用寄存器的值,作為有符号數進行乘法運算。然後使用{HI, LO}減去乘法結果,相減的結果儲存到{HI, LO}中。

  •  當功能碼是6'b000101時,表示是msubu指令,無符号乘累減運算

      指令用法為:msubu rs, rt

      指令作用為:{HI, LO} <- {HI, LO} - rs × rt,将位址為rs的通用寄存器的值,與位址為rt的通用寄存器的值,作為無符号數進行乘法運算。然後使用{HI, LO}減去乘法結果,相減的結果儲存到{HI, LO}中。

7.7 乘累加、乘累減指令實作思路

7.7.1 實作思路

      在本章開始已經說明了乘累加、乘累減指令的實作思路,計劃在流水線執行階段采用兩個時鐘周期完成運算,第一個時鐘周期進行乘法運算,第二個時鐘周期将乘法結果與HI、LO寄存器進行加/減法。

7.7.2 系統結構的修改

      為了實作7.7.1節的思路,必須要儲存兩個資訊:(1)目前是第幾個時鐘周期;(2)乘法結果。OpenMIPS通過在EX/MEM子產品中添加兩個寄存器cnt、hilo,分别儲存上述資訊。修改系統結構如圖7-12所示。

自己動手寫CPU之第七階段(6)——乘累加指令實作思路

      執行階段EX子產品的輸出hilo_temp_o是乘法結果,傳遞到EX/MEM子產品,并在下一個時鐘周期送回EX子產品,參與第二個時鐘周期的加/減法運算。

      執行階段EX子產品的輸出cnt_o代表目前是第幾個時鐘周期,傳遞到EX/MEM子產品,并在下一個時鐘周期送回EX子產品,後者據此判斷目前處于乘累加、乘累減指令的第幾個執行周期。

下一次将給出實作乘累加、乘累減指令的代碼,敬請關注!

繼續閱讀