版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第二章 指令系統(tǒng)原理與實(shí)例1第二章 指令系統(tǒng)原理與實(shí)例指令集系統(tǒng)結(jié)構(gòu),即計算機(jī)對程序員和編譯器開發(fā)者可見的部分 主要介紹現(xiàn)有的各種指令集系統(tǒng)結(jié)構(gòu)設(shè)計方案,主要包括四個方面: (1)介紹一種指令系統(tǒng)分類的方法,并對各種指令系統(tǒng)設(shè)計方案的優(yōu)缺點(diǎn)進(jìn)行定性評價 (2)介紹并分析幾種指令系統(tǒng)評價方法 (3)討論有關(guān)計算機(jī)語言、編譯器以及這兩者與指令系統(tǒng)結(jié)構(gòu)關(guān)系的相關(guān)問題 (4)在“綜合”小節(jié)中介紹典型的RISC系統(tǒng)結(jié)構(gòu)MIPS指令系統(tǒng)是如何體現(xiàn)這些思想的。討論了多種不同指令集系統(tǒng)結(jié)構(gòu)的評價方法2第二章 指令系統(tǒng)原理與實(shí)例2.1 簡介2.2 指令集系統(tǒng)結(jié)構(gòu)的分類2.3 存儲器尋址2.4 操作數(shù)的大小和類別
2、2.5 指令系統(tǒng)的操作2.6 控制流指令2.7 指令系統(tǒng)的編碼2.8 相關(guān)問題:編譯器的角色 2.9 MIPS系統(tǒng)結(jié)構(gòu)2.10 謬誤和易犯的錯誤2.11 結(jié)論32.1 簡介回顧第一章提到的三個應(yīng)用領(lǐng)域:桌面計算注重程序的定點(diǎn)和浮點(diǎn)運(yùn)算性能,而不太考慮程序的大小以及處理器的功耗。服務(wù)器主要應(yīng)用于數(shù)據(jù)庫、文件服務(wù)器、Web應(yīng)用以及一些多用戶分時應(yīng)用。盡管所有服務(wù)器的處理器都支持浮點(diǎn)指令,但浮點(diǎn)運(yùn)算性能的重要性遠(yuǎn)不及定點(diǎn)和字符串方面的處理性能。嵌入式應(yīng)用注重成本和功耗,所以代碼量的大小是至關(guān)重要的,因?yàn)榇鎯ζ髟叫【鸵馕吨杀靖?。為了降低芯片的成本,一些指令(比如浮點(diǎn)指令)則稱為可定制的選項。4因此
3、,指令系統(tǒng)在這三個應(yīng)用領(lǐng)域的情況和相似實(shí)際上,本章的MIPS系統(tǒng)結(jié)構(gòu)在桌面、服務(wù)器及嵌入式應(yīng)用中均有廣泛應(yīng)用52.2指令集系統(tǒng)結(jié)構(gòu)的分類指令集系統(tǒng)結(jié)構(gòu)最根本的區(qū)別在于處理器內(nèi)部的存儲類型,所以本節(jié)主要討論這方面的內(nèi)容。主要的設(shè)計方案包括使用堆棧、累加器或者一組寄存器。操作數(shù)可以顯式指定或者隱含指定: (1)堆棧系統(tǒng)結(jié)構(gòu)中操作數(shù)隱含地位于棧頂 (2)累加器系統(tǒng)結(jié)構(gòu)中的一個隱含操作數(shù)就是累加器。 (3)通用寄存器系統(tǒng)結(jié)構(gòu)只能明確地指定操作數(shù),不是寄存器就是存儲器地址。6通用寄存器系統(tǒng)結(jié)構(gòu)按照寄存器訪問方式劃分:(1)register-memory系統(tǒng)結(jié)構(gòu),任何一條指令都可以訪問存儲器。(2)loa
4、d-store系統(tǒng)結(jié)構(gòu),只能通過load和store指令來訪問內(nèi)存。(3)memory-momery系統(tǒng)結(jié)構(gòu),所有操作數(shù)都在存儲器中,現(xiàn)代處理器已不使用。 早期的計算機(jī)使用堆棧型或累加器型指令系統(tǒng)結(jié)構(gòu),但1980年代后計算機(jī)都基本采用load-store系統(tǒng)結(jié)構(gòu)。主要原因來自于General-purpose寄存器(GPR)的出現(xiàn)。7不同的系統(tǒng)結(jié)構(gòu)的方塊圖(四類指令系統(tǒng)結(jié)構(gòu)中操作數(shù)的位置) 棧頂寄存器(TOS)8輸入輸出堆棧結(jié)構(gòu)累加器結(jié)構(gòu)通用寄存器結(jié)構(gòu)通用寄存器(GPR)出現(xiàn)的原因: 寄存器同其他的處理器內(nèi)部存儲結(jié)構(gòu)一樣,但比存儲器快。編譯器使用寄存器很方便,比使用其他的內(nèi)部存儲形式效率更高。例
5、如:(A*B) (C*D) (E*F) 在寄存器系統(tǒng)結(jié)構(gòu)的計算機(jī)上,可以按任意順序來執(zhí)行三個乘法,但是在堆棧計算機(jī)上則只有一種計算順序,因?yàn)椴僮鲾?shù)隱含在堆棧中,且必須多次載入。 寄存器用來存放變量,減少了數(shù)據(jù)流量,加速程序運(yùn)行(因?yàn)榧拇嫫鞅却鎯ζ饕欤?,改善代碼密度(指明一個寄存器比指明一個存儲器地址所需的位數(shù)要少)。 寄存器多少才夠用呢?取決于編譯器如何利用寄存器,其用途一般為進(jìn)行表達(dá)式計算、傳遞參數(shù)、存放變量。9通用寄存器系統(tǒng)結(jié)構(gòu)由兩個特性來劃分:指令是否有兩個或者三個操作數(shù)。 在三個操作數(shù)格式中,指令包含一個結(jié)果(目的操作數(shù))和兩個源操作數(shù)。在兩個操作數(shù)的格式中,有一個既是結(jié)果操作數(shù)也是
6、源操作數(shù)。ALU指令中可以有多少個操作數(shù)作為存儲器地址。 典型的ALU指令中所支持的存儲器操作數(shù)的數(shù)量可能從0個到3個不等。10存儲器地址個數(shù)最多操作數(shù)個數(shù)系統(tǒng)結(jié)構(gòu)類型舉例03Load-storeAlpha, ARM, MIPS, PowerPC, SPARC, superH, TM3212Reg-MemIBM360/370, Inter80 x86, Motorola 6800, T1 TMS320C54x22Mem-MemVAX(也有3個操作數(shù)的格式)33Mem-MemVAX(也有2個操作數(shù)的格式)11圖 每條經(jīng)典ALU指令中的操作數(shù)總數(shù)和存儲器操作數(shù)的組合情況類型優(yōu)點(diǎn)缺點(diǎn)Reg-Reg(
7、0,3)簡單、定長的指令編碼;簡單的代碼生成模式;每條指令運(yùn)行的時鐘周期相近指令數(shù)比可以直接訪問存儲器的系統(tǒng)結(jié)構(gòu)多;指令多和指令密度低使程序變得很大Reg-Mem(1,2)數(shù)據(jù)不需要專門的載入指令就可以直接訪問;指令格式更加易于編碼,代碼密度高 由于源操作數(shù)在二元操作中被破壞了,所以操作數(shù)不是等價的;在一條指令里面對存儲器地址和寄存器號進(jìn)行編碼會限制寄存器的數(shù)量;操作數(shù)位置不同使得每條指令執(zhí)行所需的時鐘周期不同Mem-Mem(2,2)或(3,3)最緊湊。不浪費(fèi)寄存器來做臨時交換空間 指令長短不相同,特別是三操作數(shù)指令;同樣,每條指令的操作各不相同;存儲器訪問帶來了寄存器瓶頸 三種常見通用寄存器
8、計算機(jī)的優(yōu)缺點(diǎn)122.3存儲器尋址存儲器地址表示 我們討論的所有指令系統(tǒng)都是字節(jié)尋址的,都提供了字節(jié)(8位)、半字(16位)和字(32位)尋址,大多數(shù)的計算機(jī)還提供了雙字(64位)尋址。內(nèi)存中的字節(jié)內(nèi)存中的字13小端模式&大端模式小端模式把地址為“XX000”的字節(jié)放在整個字的最低有效位置上,字節(jié)內(nèi)各位編碼為大端模式把地址為“XX000”的字節(jié)放在整個字的最高有效位置上,字節(jié)內(nèi)各位編碼為 765432100123456714對齊:假設(shè)一個大小為s個字節(jié)的數(shù)據(jù)地址是A,如果A mod s=0,訪問該地址就是對齊的。字節(jié)地址的低三位數(shù)據(jù)寬度012345671字節(jié)(字節(jié))對齊對齊對齊對齊對齊對齊對齊
9、對齊2字節(jié)(半字)對齊對齊對齊對齊2字節(jié)(半字)未對齊未對齊未對齊未對齊4字節(jié)(字)對齊對齊4字節(jié)(字)未對齊未對齊4字節(jié)(字)未對齊未對齊4字節(jié)(字)未對齊未對齊8字節(jié)(雙字)對齊8字節(jié)(雙字)未對齊8字節(jié)(雙字)未對齊8字節(jié)(雙字)未對齊8字節(jié)(雙字)未對齊8字節(jié)(雙字)未對齊8字節(jié)(雙字)未對齊8字節(jié)(雙字)未對齊15為什么要有對齊限制? 由于存儲器都是字或者雙字整數(shù)倍對齊的,不對齊會導(dǎo)致硬件實(shí)現(xiàn)的復(fù)雜性。一次不對齊的存儲器訪問會導(dǎo)致多次對齊存儲器訪問。因此,即使是在沒有對齊限制的計算機(jī)里面,對齊訪問的程序也會運(yùn)行得比較快。16尋址方式 尋址方式是指各種系統(tǒng)結(jié)構(gòu)如何指定它們所要訪問的對象
10、的地址。尋址方式指定常量和存儲器位置。選擇適合的尋址方式能明顯減少指令數(shù)量。但也增加了實(shí)現(xiàn)的復(fù)雜度和實(shí)現(xiàn)這些尋址方式的計算機(jī)的平均CPI。對于系統(tǒng)結(jié)構(gòu)設(shè)計者,如何選擇各種尋址方式很重要。17尋址方式指令舉例含義何時使用寄存器尋址Add R4,R3RegsR4RegsR4+RegsR3數(shù)值在寄存器中立即數(shù)尋址Add R4,#3RegsR4RegsR4+3數(shù)值是常量位移量尋址Add R4,100(R1)RegsR4RegsR4 +Mem100+RegsR1存取局部變量(+模擬寄存器間接、直接尋址)寄存器間接尋址Add R4,(R1)RegsR4RegsR4+MemRegsR1使用指針或者計算出的地
11、址進(jìn)行尋址間接尋址Add R3,R1+R2RegsR3RegsR3 +MemRegsR1+RegsR2有時用在數(shù)組尋址中索引尋址Add R1,(1001)RegsR1RegsR1 +Mem1001R1是數(shù)組的基址,R2是索引值用來存取靜態(tài)數(shù)據(jù);地址常量可能需要很大存儲器間接尋址Add R1,(R3)RegsR1RegsR1 +MemMemRegsR3如果P3是指針p的地址,那么就得到*p自動遞增尋址Add R1,(R2)+RegsR1RegsR1+MemRegsR2RegsR2RegsR2+d用在循環(huán)中遞增變量,R2是數(shù)組的起始地址,每次增加d自動遞減尋址Add R1,-(R2)RegsR2R
12、egsR2-dRegsR1RegsR1+MemRegsR2和自動遞增類似,自動遞增/遞減用來實(shí)現(xiàn)類似堆棧的push/pop功能比例尋址Add R1,100(R2)R3RegsR1RegsR1+Mem100+RegsR2+RegsR3*d用來對數(shù)組尋址。一些計算機(jī)可以用任意的索引(間接)尋址方式18 尋址方式下圖給出了VAX系統(tǒng)結(jié)構(gòu)(有豐富的尋址方式,支持上圖所有的方式) 上用三個程序所測試出的尋址方式的結(jié)果。19寄存器尋址未被統(tǒng)計。位移量尋址方式 位移量尋址方式的主要問題是位移的范圍。根據(jù)不同的位移量大小,可以決定到底使用多長的位移量。 選擇位移量的長度是很重要的,因?yàn)樗苯佑绊懙街噶畹拈L度。
13、20Alpha上運(yùn)行SPEC CPU2000的CINT2000和CFP2000測試程序數(shù)據(jù)訪問測試結(jié)果的平均值。 立即數(shù)尋址方式 立即數(shù)尋址可以用于算術(shù)運(yùn)算、比較指令(主要是分支轉(zhuǎn)移指令)以及寄存器存取常數(shù)的指令。其中最后一種情況在把常數(shù)寫進(jìn)代碼中時出現(xiàn),這些常數(shù)往往比較小,也有可能是很大的地址常數(shù)。對于立即數(shù)的使用,決定它們到底是需要支持所有操作還是只支持一部分操作是很重要的。21 大約1/4的數(shù)據(jù)傳輸和定點(diǎn)ALU操作有一個立即數(shù)操作數(shù)。列出了一個指令系統(tǒng)中常見定點(diǎn)操作使用立即數(shù)的頻率。 立即數(shù)尋址方式 另一個問題是指令立即數(shù)的取值范圍。立即數(shù)的數(shù)值大小會影響指令的長度。小立即數(shù)是最常用的。
14、有時也使用大立即數(shù),特別是在尋址計算中。 22Alpha上運(yùn)行SPECCPU2000的CINT2000和CFP2000測試程序結(jié)果的平均值2.4操作數(shù)的大小與類型操作數(shù)的類型如何指定:第一種,操作數(shù)類型可以通過操作碼的編碼來指定,這也是最常用的方法;第二種,數(shù)據(jù)上面附帶一個硬件解釋的表示數(shù)據(jù)類型的符號,這個符號指定操作數(shù)的類型以及相應(yīng)的操作(現(xiàn)在這種方法已很難見到)。常見的操作數(shù)類型:字符(1B)、半字( 2B )、字( 4B )、單精度浮點(diǎn)數(shù)( 4B )、雙精度浮點(diǎn)數(shù)( 8B )。定點(diǎn)幾乎都用二進(jìn)制補(bǔ)碼表示,字符幾乎都是ASCII編碼格式。23總結(jié):存儲器尋址一個新的系統(tǒng)結(jié)構(gòu)最少應(yīng)支持以下尋
15、址方式:位移量尋址 位移量的大小至少要有12位-16位;立即數(shù)尋址 立即數(shù)的大小至少不少于8位到16位;寄存器間接尋址這三類尋址占了測試所用到的尋址方式的75%-99%24基準(zhǔn)測試程序中數(shù)據(jù)訪問的大小分布10%5%26%29%70%59%1%0%0%10%20%30%40%50%60%70%80%雙字(64位)浮點(diǎn)平均值定點(diǎn)平均值字(32位)半字(16位)字節(jié)(8位)25在決定哪些類型比較重要且需要有效支持時,數(shù)據(jù)類型的訪問頻率能提供很大的依據(jù)。操作數(shù)的大小與類型2.5指令系統(tǒng)的操作大多數(shù)指令集系統(tǒng)結(jié)構(gòu)都支持的操作可以按下圖進(jìn)行分類:操作類型舉例算術(shù)和邏輯運(yùn)算定點(diǎn)算術(shù)和邏輯操作:加、減、與、或
16、、乘、除數(shù)據(jù)傳輸Load-store指令(在存儲器尋址的計算機(jī)上是傳送指令)控制轉(zhuǎn)移、跳轉(zhuǎn)、過程調(diào)用和返回、陷阱系統(tǒng)操作系統(tǒng)調(diào)用、虛擬存儲器管理指令浮點(diǎn)浮點(diǎn)操作:加、乘、除、比較十進(jìn)制十進(jìn)制加、十進(jìn)制乘、十進(jìn)制到字符的轉(zhuǎn)換字符串字符串傳送、字符串比較、字符串匹配圖像像素、頂點(diǎn)操作、壓縮/解壓縮操作共同的規(guī)律:指令系統(tǒng)中使用最多的是一些簡單指令。一般所有的計算機(jī)都提供前三類指令。根據(jù)系統(tǒng)結(jié)構(gòu)不同指令系統(tǒng)對系統(tǒng)功能的支持有很大的差別,但是所有的計算機(jī)都必須提供對基本系統(tǒng)功能的支持。26這10類指令在流行的Intel 80X86計算機(jī)上運(yùn)行的一系列定點(diǎn)程序的所有指令中占96%。因此,它們是最常用的指
17、令,執(zhí)行起來應(yīng)該盡量快。排名80 x86指令定點(diǎn)平均值1載入22%2條件轉(zhuǎn)移20%3比較16%4存儲12%5加8%6與6%7減5%8Reg-Reg傳輸4%9調(diào)用1%10返回1%總計96%80X86中執(zhí)行最多的前10類指令:2.5指令系統(tǒng)的操作272.6控制流指令控制流指令分類 條件轉(zhuǎn)移,跳轉(zhuǎn),過程調(diào)用,過程返回控制流指令出現(xiàn)的相對頻率82%10%8%75%6%19%0%20%40%60%80%100%條件轉(zhuǎn)移跳轉(zhuǎn)調(diào)用/返回定點(diǎn)平均值浮點(diǎn)平均值28在load-store計算機(jī)上運(yùn)行基準(zhǔn)測試程序過程中這幾種指令的使用頻率??刂屏髦噶畹膶ぶ贩绞?控制流指令需要指明轉(zhuǎn)移的目標(biāo)地址。 最常見的方式是使用
18、基于程序計數(shù)器(PC)的位移量來指定目標(biāo)地址,這種類型的控制流指令稱為PC相對尋址指令。PC相對尋址指令的優(yōu)點(diǎn) 目標(biāo)通常都和當(dāng)前的指令離得不遠(yuǎn),而且使用相對偏移地址可以縮減指令的長度。 使用程序的運(yùn)行與載入位置無關(guān),稱為位置無關(guān),可以減少程序在鏈接時的工作量,對在執(zhí)行時才鏈接的程序有好處。29 編譯時不知道目標(biāo)位置,為了實(shí)現(xiàn)返回和間接跳轉(zhuǎn),需要使用寄存器間接跳轉(zhuǎn),需要給出包含目標(biāo)地址的寄存器名稱。寄存器間接跳轉(zhuǎn)還用于其他四個重要地方: 分支選擇語句case或者switch 面向?qū)ο笳Z言中的虛擬函數(shù)或者方法 高階函數(shù)或者函數(shù)指針 動態(tài)共享庫以上四種情況,編譯時都不知道目標(biāo)地址,因此通常在寄存器間
19、接跳轉(zhuǎn)之間,才把地址從存儲器載入到寄存器中。30另一個問題就是跳轉(zhuǎn)的目標(biāo)地址離跳轉(zhuǎn)指令有多遠(yuǎn)。了解跳轉(zhuǎn)距離的分布有助于選擇轉(zhuǎn)移所使用的位移量,進(jìn)一步影響指令長度和編碼。分支距離 用轉(zhuǎn)移指令與目標(biāo)之間的指令數(shù)來表示轉(zhuǎn)移距離。在定點(diǎn)程序中最常見的轉(zhuǎn)移間隔可用48位來編碼,這告訴我們較短的位移量字段對轉(zhuǎn)移通常是足夠的。31名稱舉例如何測試條件優(yōu)點(diǎn)缺點(diǎn)條件碼(CC)80 x86,ARM,PowerPC,SPARC,SuperH由ALU操作設(shè)定的某些特定位,可能是由程序控制的有時條件可自由設(shè)置CC是附加狀態(tài)。條件碼強(qiáng)制改變指令順序,因?yàn)樗研畔囊粭l指令傳送給一個轉(zhuǎn)移條件寄存器Alpha,MIPS用比較
20、結(jié)果測試任意寄存器簡單占用一個寄存器比較并轉(zhuǎn)移PA-RISC,VAX比較是轉(zhuǎn)移的一部分,通常比較只限于子集內(nèi)部一個轉(zhuǎn)移是一條而不是兩條指令對流水線執(zhí)行來說,一條指令要做的事情可能太多了大多數(shù)改變程序流程的指令是轉(zhuǎn)移,如何指明轉(zhuǎn)移條件就顯得十分重要。條件轉(zhuǎn)移的可選方案32條件轉(zhuǎn)移的特點(diǎn)就是大量的比較僅僅是簡單的測試,而且大部分是測試某個值是否為0。不同類型條件轉(zhuǎn)移中的頻率條件轉(zhuǎn)移中使用的不同比較情形的頻率分布小于等于轉(zhuǎn)移占主要地位。(跟編譯器有主要關(guān)系)33過程調(diào)用的方式 過程調(diào)用和返回包括控制轉(zhuǎn)移,可能還包括狀態(tài)的保存,至少要保存返回地址。 有兩種基本、傳統(tǒng)的方法用來保存寄存器:調(diào)用者保存和被
21、調(diào)用者保存。調(diào)用者保存:調(diào)用其他過程時,必須保存在調(diào)用過程之后還要使用的寄存器,被調(diào)用者則無須維護(hù)這些寄存器。被調(diào)用者保存:被調(diào)用的過程必須保存它要使用的寄存器,調(diào)用者則不受這種限制。342.6控制流指令有時候,由于兩個不同的過程都用到全局變量的訪問模式,因此必須使用調(diào)用者保存方法: 假設(shè)進(jìn)程P1調(diào)用進(jìn)程 P2,且這兩個進(jìn)程對同一個全局變量x進(jìn)行操作。如果P1在調(diào)用 P2之間已經(jīng)將x載入到寄存器中,那么必須在調(diào)用 P2之前把x存在一個P2可以訪問的地方。編譯器很難發(fā)現(xiàn)被調(diào)用的進(jìn)程使用了哪些變量,因?yàn)槊總€部分是分別編譯的。另外還有一種情況,被調(diào)用的進(jìn)程P2可能本身并不訪問x,而是調(diào)用了另外一個進(jìn)
22、程來訪問變量x。因?yàn)檫@種情況很復(fù)雜,在大多數(shù)編譯器中,由調(diào)用的進(jìn)程保存本次調(diào)用中可能用到的所有變量。 在兩種方法都可以使用的情況下,有的程序適用于調(diào)用者保存,有的程序適用于被調(diào)用者保存。因此,大多數(shù)實(shí)際使用的編譯器會結(jié)合這兩種方法。這種方法需要應(yīng)用程序二進(jìn)制接口(ABI)來指定變量采用哪種保存方式。352.7 指令系統(tǒng)的編碼對指令進(jìn)行編碼時,寄存器和尋址方式的數(shù)量對指令的大小有明顯的影響,因?yàn)樵谝粭l指令中,寄存器字段和地址字段都可能出現(xiàn)很多次。實(shí)際上,大多數(shù)指令用于尋址方式和寄存器編碼上的位數(shù)比用在操作碼上的位數(shù)還要多。對指令進(jìn)行編碼時,應(yīng)該在下面的幾個因素之間找到一個最佳平衡點(diǎn):1、盡可能多
23、的寄存器和尋址方式。2、平均指令長度中用來存放寄存器和尋址方式的字段盡量少,從而使程序盡量小。3、指令的長度應(yīng)該易于用流水線處理。36三種常見編碼方式操作和操作數(shù)個數(shù)地址標(biāo)識符1地址字段1地址標(biāo)識符n地址字段n操作地址字段1地址字段2地址字段3操作地址標(biāo)識符地址字段操作地址標(biāo)識符1地址標(biāo)識符2地址字段操作地址標(biāo)識符地址字段1地址字段2(a)變長編碼(如VAX和Intel 80 x86)(b)定長編碼(如Alpha,ARM,MIPS,PowerPC,SPARK,SuperH)(c)混合編碼(如IBM360/370,MIPS16,Thumb, TI TMS320C54x)支持多個操作數(shù),代碼長度通
24、常最小。代碼長度通常最大。以減輕多種結(jié)構(gòu)的指令帶來的工作負(fù)擔(dān),但仍提供多種指令長度以減少代碼長度。37適合尋址方式和操作比較多的情形適合尋址方式和操作比較少的情形變長編碼的例子X86指令:Add EAX, 1000(EBX)Add是有兩個操作數(shù)的32位加法指令,其中操作碼1個字節(jié);地址標(biāo)識符占1個字節(jié),用于確定源或目標(biāo)寄存器(EAX)和尋址方式及第二個操作數(shù)的基址寄存器(EBA);地址字段4個字節(jié)指令長度為1+1+4=6字節(jié)X86指令長度從1字節(jié)到7字節(jié)不等。它的程序通常比使用定長編碼的RISC程序要小。38RISC中的精簡代碼 混合編碼方式,包括16位和32位指令。較短的指令支持較少的操作,
25、較小且相近的地址和較少的寄存器,同時還放棄了典型RISC的三地址指令格式而采用兩地址格式。(ARM Thumb,MIPS 16)IBM CodePack:將標(biāo)準(zhǔn)指令壓縮,添加新硬件來譯碼。指令Cache只保存32位指令,壓縮的指令留在存儲器、ROM和磁盤中。編譯器無須修改就可以處理不同的指令系統(tǒng),而且指令的譯碼也很容易。SuperH:為配合較短的指令格式和較少的操作,這種指令系統(tǒng)只有16個寄存器而不是32個,但其它方面均與典型的RISC系統(tǒng)類似。392.8 編譯器的角色編譯器對計算機(jī)的性能影響很大,如果想要設(shè)計或高效率地實(shí)現(xiàn)一個指令系統(tǒng),就要理解編譯技術(shù)。系統(tǒng)的選擇的選擇除了會影響機(jī)器產(chǎn)生代碼
26、的質(zhì)量外,還將影響為該機(jī)器構(gòu)建一個高效編譯器的復(fù)雜度。4041編譯器的首要功能是正確性,其次是編譯后的運(yùn)行速度編譯器把高級的、抽象的表示方式逐步轉(zhuǎn)換成低級的表示方式編譯器通常包括2-4遍掃描編譯器的結(jié)構(gòu)近代編譯器一般包括24遍掃描,而性能更高的編譯器包括更多次的掃描。這種結(jié)構(gòu)最大限度地提高了在相同輸入前提下以不同的優(yōu)化級別編譯的程序可以產(chǎn)生相同輸出的可能性。 當(dāng)編譯的目標(biāo)是更高的編譯速度同時較低的代碼質(zhì)量能被接受時,優(yōu)化掃描可以被跳過。一遍掃描簡單來說就是編譯器讀取并且翻譯整個程序的一個步驟。供貨掃描被設(shè)計成一個可選項。由于優(yōu)化掃描是獨(dú)立的,因此不同的語言可以使用相同的優(yōu)化與代碼生成步驟。對于
27、一個新的語言,只需要一個新的前端程序就可以了。42編譯器優(yōu)化方式的分類高層優(yōu)化,一般在源碼上進(jìn)行,同時把輸出傳遞給以后的優(yōu)化掃描步驟。局部優(yōu)化,僅在一系列代碼片段之內(nèi)將代碼優(yōu)化。全局優(yōu)化,將局部優(yōu)化擴(kuò)展為跨越分支,并且引入一組針對優(yōu)化循環(huán)的轉(zhuǎn)換。寄存器分配,將寄存器和操作數(shù)聯(lián)系起來。處理器相關(guān)的優(yōu)化,充分利用特定的系統(tǒng)結(jié)構(gòu)。43由于寄存器分配在加速代碼和使其他優(yōu)化發(fā)揮作用這兩方面扮演核心角色,因而是最重要的優(yōu)化方案之一。寄存器分配 分配算法基于圖著色的算法,其基本思想是:構(gòu)造一個圖,用它來代表分配寄存器的各個可能候選方案,然后用此圖來分配寄存器。即如何用有限的顏色使圖中相鄰的節(jié)點(diǎn)分別著以不同的
28、顏色。這種方法要強(qiáng)調(diào)是要100%地完成活動變量的分配。圖著色是一個NP完全問題,有些啟發(fā)式算法在實(shí)際中效果不錯。在全局分配中如果能夠有16個(最好更多)通用寄存器用于整形變量,同時另有其他的寄存器用于浮點(diǎn)數(shù),在這種情況下,圖著色將會正常工作。44下圖列出了優(yōu)化轉(zhuǎn)換用于源程序的頻率。優(yōu)化名稱 說明在優(yōu)化轉(zhuǎn)換中所占比例高級語言層接近或者在源代碼級,與機(jī)器無關(guān)過程集成用過程體替代過程調(diào)用未被測試局部在一系列代碼中公共子表達(dá)式消去用一份副本替代一個計算的兩個實(shí)例18%常量傳遞把所有分配了一個常量的變量的實(shí)例用該常量替換22%堆棧高度縮減重新安排表達(dá)式樹使表達(dá)式計算所需要的資源最少未被測試全局跨越分支全
29、局公共子表達(dá)式消去與局部的方法相同,但是這里會跨越分支13%副本傳遞用X(如A=X)替換已經(jīng)賦值以X的變量A的所有實(shí)例11%代碼移動把循環(huán)中每次迭代計算同一變量的代碼從循環(huán)中移動16%歸納變量消去在循環(huán)中簡化或者消去數(shù)組地址的計算2%處理器相關(guān)依賴處理器結(jié)構(gòu)長度縮減有很多例子,如用一個常數(shù)的加法和移位來代替乘法未被測試流水線調(diào)度重新對指令進(jìn)行排序以改進(jìn)流水線的性能未被測試分支偏移優(yōu)化選擇到達(dá)目標(biāo)的最短分支位移路徑未被測試45在12個小型FORTRANT和Pascal程序中一些普通優(yōu)化的靜態(tài)頻率。下圖所示為兩個程序采用不同的優(yōu)化方法對指令執(zhí)行時間產(chǎn)生的影響。11%100%12%21%100%76
30、%76%84%0級:未優(yōu)化1級:局部優(yōu)化、代碼調(diào)度和局部寄存器分配2級:全局優(yōu)化、循環(huán)轉(zhuǎn)換和全局寄存器分配3級:過程集成SPEC2000中的Iucas和mcf兩個指令條數(shù)的變化46編譯技術(shù)對系統(tǒng)結(jié)構(gòu)設(shè)計者的決策所產(chǎn)生的影響兩個重要問題:變量是如何分配和尋址的?需要多少個寄存器才能有效地分配變量?首先需了解語言在何處分配數(shù)據(jù):堆棧,被用來分配局部變量。在過程調(diào)用或過程返回時堆棧會相應(yīng)增大或縮小。堆棧用于記錄,而不是計算表達(dá)式。數(shù)值一般不會被壓入堆棧。全局?jǐn)?shù)據(jù)區(qū),用來分配靜態(tài)聲明的對象,如全局變量和常量。這些對象大部分是數(shù)組或其他聚合數(shù)據(jù)結(jié)構(gòu)。堆,用來分配那些不適于放在堆棧中的動態(tài)對象。堆中的對象
31、要用指針來訪問。47編譯技術(shù)對系統(tǒng)結(jié)構(gòu)設(shè)計者的決策所產(chǎn)生的影響 為堆棧分配對象進(jìn)行寄存器分配要比對全局變量更加有效,而寄存器分配對于堆分配對象來說基本上是不可能的,因?yàn)楹笳呤鞘褂弥羔樳M(jìn)行訪問的。 全局變量以及某些堆變量也不可能進(jìn)行分配,因?yàn)樗鼈兙哂小皠e名”,即有多種不同方式可以訪問這個變量的地直,這使得將它放入寄存器是非法的。48系統(tǒng)結(jié)構(gòu)設(shè)計者對編譯器設(shè)計者的技術(shù)支持遵循原則:確保經(jīng)常出現(xiàn)的事件要盡量快且正確,而不經(jīng)常出現(xiàn)的事件則一定正確。一些有助于編譯器設(shè)計者的系統(tǒng)特性:規(guī)則性:操作、數(shù)據(jù)類型和尋址方式要正交。若每一種操作可采用任一種尋址方式,稱為正交,有助于簡化代碼的生成。提供原語,而不是
32、解決方案,只適合某一種語言結(jié)構(gòu)的特性通常沒有太大用處。在取舍時考慮簡化的折中:例,一個變量應(yīng)該被訪問多少次后放入寄存器比較好。但出現(xiàn)Cache和流水線后,折中變得復(fù)雜。對于編譯時作為常量的數(shù)值量,提供能將其確定為常量的指令。492.9 MIPS系統(tǒng)結(jié)構(gòu)一種簡單64位load-store系統(tǒng)結(jié)構(gòu)設(shè)計上重視流水線效率,包括固定長度指令編碼。使編譯器更容易產(chǎn)生高效的目標(biāo)代碼。MIPS的寄存器32個64位通用寄存器(GPR):R0,R1,R3132個浮點(diǎn)寄存器(FPR):F0,F(xiàn)1, ,F(xiàn)31,即可以作為32個32位單精度寄存器來使用(存儲單精度浮點(diǎn)數(shù)時,另一半未使用),也可以作為32個64位雙精度寄
33、存器來使用。MIPS提供單精度和雙精度操作(32位和64位),還提供一個64位寄存器上的兩個單精度的操作。R0的值永遠(yuǎn)是0。50MIPS的數(shù)據(jù)類型定點(diǎn)數(shù)據(jù)類型有8位字節(jié)、16位半字、32位字和64位雙字,浮點(diǎn)數(shù)有32位單精度和64位雙精度浮點(diǎn)數(shù)。MIPS的操作是面向64位定點(diǎn)以及32位或64位浮點(diǎn)數(shù)的。字節(jié)、半字或者字在調(diào)入64位寄存器中時,用零或者符號來填充64位寄存器的剩余部分。51MIPS的數(shù)據(jù)傳輸和尋址方式MIPS數(shù)據(jù)尋址方式只有立即數(shù)和位移量方式兩種,這兩種方式都是16位的。寄存器間接尋址是通過把0放入16位位移字段中完成的。16位絕對尋址字段是通過 R0作為基址寄存器完成的。MIP
34、S的存儲器是用64位地址字節(jié)尋址的。有一個供軟件選擇的模式位來決定是高位字節(jié)先傳格式還是低位字節(jié)先傳格式。但必須是load-store方式。存儲器訪問可以是一個字節(jié)、半字或字。但訪問地址必須對齊。52MIPS的指令格式由于MIPS只有兩種尋址方式,所以它們可以編碼到操作碼中。為了使機(jī)器更容易進(jìn)行流水線操作和譯碼,所有指令都是32位的,其中6位是基本操作碼。MIPS指令格式I型指令65516Opcodersrt立即數(shù)操作 編碼:加載/存儲字節(jié)、半字、字、雙字。 所有立即數(shù)(rt rs op 立即數(shù)操作) 條件分支指令(rs表示寄存器) 跳轉(zhuǎn)寄存器、跳轉(zhuǎn)并鏈接寄存器(rs表示目標(biāo),立即數(shù)為0)R型
35、指令655556Opcodersrtrdshamtfunct 寄存器-寄存器ALU操作:rdrs funct rt 函數(shù)編碼數(shù)據(jù)通路操作:Add,Sub, 讀/寫專用寄存器和數(shù)據(jù)移動J型指令626Opcode加到PC的偏移量 跳轉(zhuǎn),跳轉(zhuǎn)并鏈接 陷阱和從異常中返回532.9 MIPS系統(tǒng)結(jié)構(gòu)指令舉例指令名稱含義LD R1,30(R2)載入雙字RegsR164Mem30+RegsR2LD R1,1000(R0)載入雙字RegsR164Mem1000+0LW R1,60(R2)載入字RegsR164(Mem60+RegsR20)32#Mem60+RegsR2LB R1,40(R3)載入字節(jié)RegsR
36、164(Mem40+RegsR30)56#Mem40+RegsR3LBU R1,40(R3)載入無符號字節(jié)RegsR164056#Mem40+RegsR3LH R1,40(R3)載入半字RegsR164(Mem40+RegsR30)48# Mem40+RegsR3#Mem41+RegsR3L.S F0,50(R3)載入單精度浮點(diǎn)數(shù)RegsF064Mem50+RegsR3#032L.D F0,50(R2)載入雙精度浮點(diǎn)數(shù)RegsF064Mem50+RegsR2SD R3,500(R4)存儲雙字Mem500+RegsR464RegsR3SW R3,500(R4)存儲字Mem500+RegsR332
37、RegsR332.63S.S F0,40(R3)存儲單精度浮點(diǎn)數(shù)Mem40+RegsR332RegsF00.31S.D F0,40(R2)存儲雙精度浮點(diǎn)數(shù)Mem40+RegsR364RegsF0SH R3,502(R2)存儲半字Mem502+RegsR216RegsR3148.63SB R2,41(R3)存儲字節(jié)Mem41+RegsR332RegsF056.63MIPS操作大致可以分為四類:載入和存儲、ALU操作、分支與跳轉(zhuǎn)以及浮點(diǎn)操作。54MIPS操作當(dāng)被傳送的數(shù)據(jù)長度不確切時,在符號上附加一個下標(biāo),表示傳送n位。下標(biāo)用于標(biāo)識字段中特定的位。位從以0開始的最高位開始標(biāo)注。變量Mem用來表示主
38、存儲器(內(nèi)存),按字節(jié)編址,可以傳輸任意字節(jié)的數(shù)據(jù)。上標(biāo)用來表示對字段進(jìn)行復(fù)制。符號#用來鏈接兩個字段并且可以出現(xiàn)在數(shù)據(jù)傳送的任何一邊。55MIPS操作 所有的ALU指令都是寄存器-寄存器指令。下圖給出了一些算術(shù)和邏輯指令的例子,包括算術(shù)和邏輯操作:加、減、與、或、異或和移位。所有這些指令都支持立即尋址方式,它帶一個16位的符號擴(kuò)展立即數(shù)。指令舉例指令名稱含義DAADU R1,R2,R3無符號加RegsR1RegsR2+RegsR3DAADIU R1,R2,#3加無符號立即數(shù)RegsR1RegsR2+3LUI R1,#42載入立即數(shù)到高位RegsR1032#42#016DSLL R1,R2,#
39、5 邏輯左移立即數(shù)RegsR1RegsR25DSLT R1,R2,R3置小于If(RegsR1RegsR2)RegsR11 else RegsR1056MIPS比較指令 MIPS也有比較指令,比較兩個寄存器的值。如果第一個寄存器的值小于第二個的值,則比較指令將置目標(biāo)寄存器為1(代表真),否則將置為0(代表假)。由于這些操作都設(shè)置寄存器,因此它們稱為置等于、置不等于和置小于,等待。同時這些比較指令也具有立即數(shù)的形式??刂朴梢唤M跳轉(zhuǎn)與一組分支來處理。57MIPS控制流指令指令舉例指令名稱含義J name跳轉(zhuǎn)PC36.63nameJAL name跳轉(zhuǎn)并鏈接RegsR31PC+8;PC36.63nam
40、e;(PC+4)-227)name(PC+4)+227)JALR R2寄存器跳轉(zhuǎn)并鏈接RegsR31PC+8;PCRegsR2JR R3寄存器跳轉(zhuǎn)PCRegsR3;BEQZ R4,name等于零時分支If(RegsR4=0) PCname;(PC+4)-227)name(PC+4)+227)BNE R3,R4,name不等于零時分支If(RegsR3!=(RegsR4) PCname;(PC+4)-217)name(PC+4)+217)MOVZ R1,R2,R3等于零時轉(zhuǎn)換If(RegsR3=0) RegsR1RegsR2所有的控制指令,除了以寄存器中的地址為目標(biāo)地址進(jìn)行的跳轉(zhuǎn)以外,都是PC相
41、對的。分支轉(zhuǎn)移的距離通過超過了地址字段所能提供的距離:由于MIPS指令提32位長,所以把字節(jié)分支地址乘以4得到較長的地址。16位帶符號數(shù)左移2位與PC相加26位帶符號數(shù)左移2位覆蓋PC58MIPS的浮點(diǎn)操作浮點(diǎn)指令對浮點(diǎn)數(shù)寄存器進(jìn)行操作,并指出將被使用的操作數(shù)是單精度(SP)還是雙精度(DP)。MOV.S和MOV.D分別把一個單精度浮點(diǎn)數(shù)寄存器的值復(fù)制到另一個同類型的寄存器中。MFC1,MTC1,DMFC1和DMTC1在一個單精度或雙精度浮點(diǎn)數(shù)寄存器和一個定點(diǎn)寄存器之間傳送數(shù)據(jù)。浮點(diǎn)操作包括加、減、乘、除。后綴S表示單精度浮點(diǎn)數(shù),而后綴D表示雙精度浮點(diǎn)數(shù)。 為提高圖形處理性能,MIPS64提供
42、了在一個64位浮點(diǎn)數(shù)寄存器兩半部分中分別進(jìn)行兩個32位浮點(diǎn)數(shù)的操作。592.9 MIPS系統(tǒng)結(jié)構(gòu)MIPS指令系統(tǒng)的使用 為了說明哪些指令更常用,后圖給出了5個SPECint2000程序的指令類別和指令調(diào)用頻率。60612.9 MIPS系統(tǒng)結(jié)構(gòu)MIPS指令系統(tǒng)的使用下圖給出了5個SPECfp2000程序的指令類別和指令調(diào)用頻率。62632.10 謬誤和易犯的錯誤易犯的錯誤:設(shè)計一種“高級”指令系統(tǒng)特性就意味著要支持一種高級語言結(jié)構(gòu)。 試圖將高級語言的特征并入指令系統(tǒng)中使得設(shè)計者們設(shè)計出一些靈活性很強(qiáng)、強(qiáng)有力的指令。但是,這些指令經(jīng)常會做些需求以外的工作,或者不能準(zhǔn)確地符合一些語言的要求。曾經(jīng)有很
43、多的努力花在20世紀(jì)70年代稱為“語義缺口”的問題上。雖然出發(fā)點(diǎn)是想補(bǔ)充指令系統(tǒng)使得硬件的功能達(dá)到語言的水平,但是,這些增加的功能卻又導(dǎo)致了被Wulf1984稱為語義沖突的問題: 由于給指令賦予了過多內(nèi)容,因此機(jī)器的設(shè)計者僅能夠在有限的環(huán)境中使用指令。 對于經(jīng)常發(fā)生的情況來說,這種指令的功能通常過于強(qiáng)大,這就導(dǎo)致了許多不必要的工作以及指令速度的降低。642.10謬誤和易犯的錯誤謬誤:存在一種典型的程序。 很多人都傾向于相信存在一個典型的程序,可以用它來設(shè)計一個理想的指令系統(tǒng)。我們可以參考綜合基準(zhǔn)測試程序,其中的數(shù)據(jù)清楚地表明程序在使用指令系統(tǒng)方面存在顯著的差別。例如,如下圖所示的在四個SPEC
44、2000的程序中數(shù)據(jù)傳輸大小的情況:很難說這四個程序中哪一個是典型的。對于專門支持一類應(yīng)用的指令系統(tǒng),這種差異可能會更大,例如十進(jìn)制指令在其他應(yīng)用中就不會被使用。652.10謬誤和易犯的錯誤謬誤:存在一種典型的程序。662.10謬誤和易犯的錯誤易犯的錯誤:可以不考慮編譯器而改進(jìn)指令系統(tǒng)以縮減代碼大小。下表顯示的MIPS指令系統(tǒng)下四個編譯器產(chǎn)生的相對代碼大小。盡管設(shè)計師努力使代碼減少了30%40%,不同的編譯器策略卻更大程度地影響著代碼的大小。就像性能優(yōu)化技術(shù)一樣,在試圖改進(jìn)硬件以節(jié)約空間之間首先應(yīng)該考慮編譯器如何產(chǎn)生較少的代碼。編譯器Apogee softwareVersion 4.1Green hillsMulti2000 V 2.0AlgorithmicsSde 4.0bIdt/c 7.2.1系統(tǒng)結(jié)構(gòu)MIPS IVMIPS IVMIPS 32MIPS 32處理器NEC VR5432NEC VR5000IDT
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024民事訴訟委托代理合同
- 2024工程維修合同樣本
- 2024種豬銷售合同范文
- 2024廣告互換合同范文
- 2024個人汽車的租賃合同范本
- 權(quán)威借款合同范文匯編
- 2024的進(jìn)出口貿(mào)易合同范文
- 品牌代理合作協(xié)議
- 2024小產(chǎn)權(quán)房買賣合同模板2
- 2024臨時工合同協(xié)議書關(guān)于臨時工的協(xié)議書
- 國開(甘肅)2024年春《地域文化(專)》形考任務(wù)1-4終考答案
- 檔案整理及數(shù)字化服務(wù)方案(技術(shù)標(biāo) )
- 建筑樁基技術(shù)規(guī)范 JGJ942008
- C站使用說明JRC
- 習(xí)作:推薦一個好地方 推薦ppt課件
- 角的度量 華應(yīng)龍(課堂PPT)
- 公路銑刨機(jī)整機(jī)的設(shè)計含全套CAD圖紙
- 機(jī)器人學(xué)課程教學(xué)大綱
- 浙江世貿(mào)君瀾酒店集團(tuán)介紹
- GHTF—質(zhì)量管理體系--過程驗(yàn)證指南中文版
- 鋁及鋁合金焊接作業(yè)指導(dǎo)書
評論
0/150
提交評論