為什麼 ARM 和 MIPS 那麼多寄存器,x86 那麼少?

為什麼 ARM 和 MIPS 那麼多寄存器,x86 那麼少?

RISC目前有一款勢頭很猛的開源ISA,叫做RISCV,是體系結構界開山鼻祖,Berkley的David Patterson帶領完成的。(之前所有RISC也是他...)題主提到的MIPS和ARM和它差不太多,一些基本的設計思路都一樣。

到底有多少個寄存器,和編譯時的寄存器分配關係很大——寄存器太少的話,就要經常把寄存器上的內容倒騰到內存裡去,這一來一回用時實在是太大了;寄存器太多的話,根本用不完,白白花了材料錢和製作費。Patterson在他的《計算機體系結構:量化研究方法》這本教材裡給出了一個寄存器數目的效用曲線,根據他的統計結果,大致結論是寄存器數目在16-32個之間,對於目前的編譯技術而言是最優的選擇。(書不在手邊,有時間了會補上這個圖。)

所以回過頭,來看RISCV,五位寄存器編碼,剛好32個寄存器。說一句題外話,RISCV的編碼設計極其精巧,有興趣的同學一定要寫一下RISCV模擬器,體會一下Patterson大佬的設計有多精巧。

為什麼 ARM 和 MIPS 那麼多寄存器,x86 那麼少?

RISC ISA有一個大概的通性,就是指令的編碼非常巧妙,即可以壓縮編碼,又能快速解碼。這應該是CISC遠遠比不上的,所以現在的CISC芯片裡實際上是包了一個RISC芯片的...

最後說一下CISC的寄存器。按照本篇回答的觀點,寄存器在16-32個效用最高,再加上x86的歷史遺留的尋址問題,(386尋址是上計算機組成的時候過不去的坎...)導致x86不可能支持過多的通用寄存器——一是成本和收益不對等,二是通用寄存器會擠佔別的特殊寄存器(比如尋址需要用到的基地址寄存器等)。除此之外,寄存器過多,會使得指令編碼難以設計,尤其是解碼器難以快速解碼。

比如你原來有32個通用寄存器,然後你有一套用在32個寄存器上的CISC指令。現在突然變成64個寄存器,怎麼在兼容原有指令的基礎之上給新加的32個寄存器編碼呢?一種思路是直接在所有指令後面加上幾位,用來指示各個寄存器的“新舊”,這樣設計的話,本來就複雜的CISC解碼器就更復雜了...另外一種思路是在原來的那套指令上就留好冗餘,用於擴展,但這樣浪費太大,一條指令可能也就32到64位,裡面有三到四位留作冗餘...

為什麼 ARM 和 MIPS 那麼多寄存器,x86 那麼少?

為什麼 ARM 和 MIPS 那麼多寄存器,x86 那麼少?

為什麼 ARM 和 MIPS 那麼多寄存器,x86 那麼少?

為什麼 ARM 和 MIPS 那麼多寄存器,x86 那麼少?


分享到:


相關文章: