段2262B。
[0093] 針對通用向量友好指令格式2200,示出完整操作碼字段2274包括格式字段2240、 基礎操作字段2242以及數據元素寬度字段2264。盡管示出了其中完整操作碼字段2274包 括所有這些字段的一個實施例,但是在不支持所有這些字段的實施例中,完整操作碼字段 2274包括少于所有這些字段的字段。完整操作碼字段2274提供操作碼(opcode)。
[0094] 擴充操作字段2250、數據元素寬度字段2264以及寫掩碼字段2270允許以通用向 量友好指令格式逐指令地指定這些特征。寫掩碼字段和數據元素寬度字段的組合創建類型 化的指令,因為它們允許基于不同的數據元素寬度應用該掩碼。
[0095] 在A類和B類內出現的各種指令模板在不同的情形下是有益的。在本發明的一些 實施例中,不同處理器或者處理器內的不同核可支持僅A類、僅B類或者可支持兩類。舉例 而言,旨在用于通用計算的高性能通用無序核可僅支持B類,旨在主要用于圖形和/或科 學(吞吐量)計算的核可僅支持A類,并且旨在用于兩者的核可支持兩者(當然,具有來自 兩類的模板和指令的一些混合、但是并非來自兩類的所有模板和指令的核在本發明的范圍 內)。同樣,單一處理器可包括多個核,所有核支持相同的類,或者其中不同的核支持不同的 類。舉例而言,在具有單獨的圖形和通用核的處理器中,旨在主要用于圖形和/或科學計算 的圖形核中的一個核可僅支持A類,而通用核中的一個或多個可以是具有旨在用于通用計 算的、僅支持B類的無序執行和寄存器重命名的高性能通用核。不具有單獨的圖形核的另 一處理器可包括既支持A類又支持B類的一個或多個通用有序或無序核。當然,在本發明 的不同實施例中,來自一類的特征也可在其他類中實現。可使以高級語言撰寫的程序成為 (例如,恰被及時編譯或靜態編譯)各種不同的可執行形式,包括:1)僅具有由用于執行的 目標處理器支持的類的指令的形式;或者2)具有使用所有類的指令的不同組合而編寫的 替代例程且具有選擇這些例程以基于由當前正在執行代碼的處理器支持的指令而執行的 控制流代碼的形式。
[0096] 圖9是示出根據本發明的多個實施例的示例性專用向量友好指令格式的框圖。圖 9示出專用向量友好指令格式2300,其指定位置、尺寸、解釋和字段的次序以及那些字段中 的一些字段的值,在這個意義上向量友好指令格式2300是專用的。專用向量友好指令格式 2300可用于擴展x86指令集,并且由此這些字段中的一些與現有x86指令集及其擴展(例 如,AVX)中使用的那些字段類似或相同。該格式保持與具有擴展的現有x86指令集的前綴 編碼字段、實操作碼字節字段、MOD R/M字段、SIB字段、位移字段、以及立即數字段一致。示 出來自圖8的、將來自圖9的字段映射到其的字段。
[0097] 應當理解,雖然出于說明的目的,在通用向量友好指令格式2200的上下文中參考 專用向量友好指令格式2300描述了本發明的多個實施例,但是本發明不限于專用向量友 好指令格式2300,除非另有聲明。例如,通用向量友好指令格式2200構想各種字段的各種 可能的尺寸,而專用向量友好指令格式2300被示出為具有特定尺寸的字段。作為具體示 例,盡管在專用向量友好指令格式2300中,數據元素寬度字段2264被示出為一位的字段, 但是本發明不限于此(也就是說,通用向量友好指令格式2200構想數據元素寬度字段2264 的其他尺寸)。
[0098] 通用向量友好指令格式2200包括以下按照圖9A中示出的順序列出的下列字 段。EVEX前綴(字節0-3) 2302 -以四字節形式進行編碼。格式字段2240 (EVEX字節0,位 [7:0]) -第一字節(EVEX字節0)是格式字段2240,并且它包含0x62 (在本發明的一個實 施例中用于區分向量友好指令格式的唯一值)。第二一第四字節(EVEX字節1-3)包括提供 專用能力的多個位字段。
[0099] REX 字段 2305 (EVEX 字節 1,位[7-5]) -由 EVEX. R 位字段(EVEX 字節 1,位[7]-R)、EVEX. X 位字段(EVEX 字節 1,位[6] -X)以及 2257BEX 字節 1,位[5] -B)組成。EVEX. R、EVEX. X和EVEX. B位字段提供與對應VEX位字段相同的功能,并且使用1補碼的形式進行 編碼,即ZMM0被編碼為1111B,ZMM15被編碼為0000B。這些指令的其他字段對如在本領域 中已知的寄存器索引的較低三個位(rrr、xxx以及bbb)進行編碼,由此可通過增加EVEX. R、EVEX. X 以及 EVEX. B 來形成 Rrrr、Xxxx 以及 Bbbb。
[0100]REX'字段2210-這是REX'字段2210的第一部分,并且是用于對擴展的32個 寄存器集合的較高16個或較低16個寄存器進行編碼的EVEX. R'位字段(EVEX字節1,位 [4] -R')。在本發明的一個實施例中,該位與以下指示的其他位一起以位反轉的格式被存 儲以(在公知x86的32位模式下)與實操作碼字節是62的BOUND指令進行區分,但是在 MOD R/M字段(在下文中描述)中不接受MOD字段中的值11;本發明的替代實施例不以反 轉的格式存儲該以下其他被指示的位。值1用于對較低16個寄存器進行編碼。換句話說, 通過組合EVEX. R'、EVEX. R和來自其他字段的其他RRR來形成R' Rrrr。
[0101] 操作碼映射字段2315(EVEX字節1,位[3:0] -_m)-其內容對隱含的前導操作 碼字節(0F、0F 38、或0F 3)進行編碼。數據元素寬度字段2264 (EVEX字節2,位[7] -W) - 由記號EVEX. W表示。EVEX. W用于定義數據類型(32位數據元素或64位數據元素)的粒度 (尺寸)。EVEX.vvvv2320(EVEX 字節 2,位[6:3]_vvvv) - EVEX.vvvv 的作用可包括如下: 1)以反轉(1補碼)形式被指定并且對具有2個或更多源操作數的指令有效VEX. vvvv對 第一源寄存器操作數進行編碼;2)針對某些向量偏移以1補碼形式被指定的VEX. vvvv對 目的地寄存器操作數進行編碼;或者3) VEX. vvvv不對任何操作數進行編碼,保留該字段, 并且該字段應當包含1111b。由此,EVEX. vvvv字段2320對以反轉(1補碼)的形式存儲的 第一源寄存器指定符的4個低階位進行編碼。取決于該指令,附加的不同的EVEX位字段用 于將指定符尺寸擴展到32個寄存器。EVEX. U 2268類字段(EVEX字節2,位[2]-U) -如果 EVEX. U = 0,則它指示A類或EVEX. U0 ;如果EVEX. U = 1,則它指示B類或EVEX. U1。
[0102] 前綴編碼字段2325 (EVEX字節2,位[l:0]-pp) -提供用于基礎操作字段的附加 位。除了對以EVEX前綴格式的傳統SSE指令提供支持以外,這也具有壓縮SMD前綴的益 處(EVEX前綴只需要2位,而不是需要字節來表達SMD前綴)。在一個實施例中,為了支持 使用以傳統格式和以EVEX前綴格式兩者的SIMD前綴(66H、F2H、F3H)的傳統SSE指令,將 這些傳統SMD前綴編碼為SMD前綴編碼字段;在提供給解碼器的PLA之前,在運行時可被 擴展為傳統SMD前綴(因此,PLA可執行傳統和EVEX格式的這些傳統指令,而無需修改)。 雖然較新的指令可將EVEX前綴編碼字段的內容直接用作操作碼擴展,但是為了一致性,某 些實施例以類似的方式擴展,但允許由這些傳統SMD前綴指定不同的含義。替代實施例可 重新設計PLA以支持2位SMD前綴編碼,并且因此不需要擴展。
[0103] a 字段 2252 (EVEX 字節 3,位[7] - H1,也稱為 EVEX. Hl、EVEX. rs、EVEX. RL、EVEX. 寫掩碼控制以及EVEX. N;也以a示出)一如先前所述,該字段是針對上下文的。0字段 2254(EVEX 字節 3,位[6:4]-SSS,也稱為 EVEX. s2_。、EVEX. r2_。、EVEX. rrl、EVEX. LLO、EVEX. LLB ;也以示出)一如先前所述,該字段是針對上下文的。
[0104] REX'字段2210 -這是REX'字段的其余部分,并且是可用于對擴展的32個寄存 器集合的較高16個或較低16個寄存器進行編碼的EVEX. V'位字段(EVEX字節3,位[3]-V')。該位以位反轉的格式存儲。值1用于對較低16個寄存器進行編碼。換句話說,通過 組合 EVEX. V'、EVEX. vvvv 來形成 V' VVVV。
[0105] 寫掩碼字段2270(EVEX字節3,位[2:0]-kkk) -其內容指定寫掩碼寄存器中的寄 存器索引,如先前所述。在本發明的一個實施例中,特定值EVEX. kkk = 000具有暗示沒有 寫掩碼用于特定指令的特殊行為(這能以各種方式實現,包括使用硬連線到所有的寫掩碼 或者繞過掩碼硬件的硬件來實現)。
[0106] 實操作碼字段2330 (字節4)也被稱為操作碼字節。在該字段中指定操作碼的部 分。MOD R/M字段2340 (字節5)包括MOD字段2342、Reg字段2344以及R/M字段2346。如 先前所述,MOD字段2342的內容在存儲器訪問和非存儲器訪問操作之間進行區分。Reg字 段2344的作用可被歸結為兩種情形:對目的地寄存器操作數或源寄存器操作數進行編碼; 或者被視為操作碼擴展且不用于對任何指令操作數進行編碼。R/M字段2346的作用可包括 如下:對引用存儲器地址的指令操作數進行編碼;或者對目的地寄存器操作數或源寄存器 操作數進行編碼。
[0107] 比例、索引、基址(SIB)字節(字節6) -如先前所述,比例字段2250的內容用于存 儲器地址生成。SIB. xxx 2354和SIB. bbb 2356 -先前已經針對寄存器索引Xxxx和Bbbb 提及了這些字段的內容。位移字段2262A(字節7-10) -當MOD字段2342包含10時,字節 7-10是位移字段2262A,并且它以與傳統32位位移(disp32)相同的方式工作,以字節粒度 工作。
[0108] 位移因數字段2262B (字節7) -當MOD字段2342包含01時,字節7是位移因數字 段2262B。該字段的位置與以字節粒度工作的傳統x86指令集8位位移(disp8)的位置相 同。由于disp8是符號擴展的,因此它僅能在-128和127字節偏移量之間尋址;在64字節 高速緩存行的方面,disp8使用可被設為僅四個真正有用的值-128、-64、0和64的8位;由 于常常需要更大的范圍,所以使用disp32 ;然而,disp32需要4個字節。與disp8和disp32 對比,位移因數字段2262B是對disp8的重新解釋;當使用位移因數字段2262B時,通過將 位移因數字段的內容乘以存儲器操作數訪問的尺寸(N)來確定實際位移。該類型的位移被 稱為disp8*N。這減小了平均指令長度(單個字節用于位移,但具有大得多的范圍)。此類 壓縮位移基于有效位移是存儲器訪問的粒度的倍數的假設,并且由此,不需要對地址偏移 量的冗余低階位進行編碼。換句話說,位移因數字段2262B替代傳統x86指令集的8位位 移。由此,以與x86指令集的