Armv8 Armv9架構(gòu)入門指南_第1頁
Armv8 Armv9架構(gòu)入門指南_第2頁
Armv8 Armv9架構(gòu)入門指南_第3頁
Armv8 Armv9架構(gòu)入門指南_第4頁
Armv8 Armv9架構(gòu)入門指南_第5頁
已閱讀5頁,還剩241頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

Armv8/armv9cortex-A系列 目 ARMv8‐AARMv8-ARMv8‐AARMv8ARMv8ARMv8AArch64異常鏈接寄存器程序狀態(tài)保存寄存器改變執(zhí)行狀態(tài)(再次AArch32AArch32下的NEONAArch64AArch32執(zhí)行狀態(tài)的ARMv8ARMv8區(qū)分32位和64位A64C++A64Bitfield浮點和NEONPC-relative模式(字面加載NEONAArch64浮點數(shù)和AArch64中NEONNEON標(biāo)量數(shù)據(jù)和AArch64NEONNEONA64移植32-bit代碼到64-bitARMv8-A使用ARMCompiler6CARM64位架構(gòu)的AArch64返回值的傳遞(IndirectresultNEONFloating-PointAArch64系統(tǒng)響應(yīng)到AArch64緩存Inclusive和exclusive的轉(zhuǎn)址旁路緩存配置和啟用ARMv8-AAArch64安全和單項內(nèi)存屏障(One-wayCLDNP和探聽控制單元(SnoopControl加速器一致性端口(ACP:Acceleratorcoherencyport)big.LITTLEbig.LTTLETrustZoneARM調(diào)試Linux調(diào)試LinuxARMDS‐5DS‐5LinuxAndroidLinux使用DS‐5調(diào)試Linux使用DS‐5DS‐5ARMv8ARM哪里獲取到ARMARMv8-A從哪里獲得ARM啟動Foundation基礎(chǔ)平臺在調(diào)試器中使用配置從ModelShell在AEMv8‐A基礎(chǔ)平臺FVPCLCD將以太網(wǎng)與AEMv8‐A基礎(chǔ)平臺FVP與VE從哪里獲得ARMv8‐A基礎(chǔ)平臺ARMFeaturesinA- 第一 前 這是一篇由網(wǎng)友一起翻譯的文檔。原文是\hDEN0024A_v8_architecture_PG_1.0.pd。用,請勿傳播,請勿用于商業(yè)用途。我們也不承擔(dān)法律責(zé)任。翻譯中學(xué)習(xí),學(xué)習(xí)中進步。TODO參與翻譯工作的人員簡介(排名不分先后csdn博客:\h代碼改變世界\h個人博客地址-csdn博客\h\hcsdn博客:\hICcsdn博客\hcsdn博客:\hMrNon-ConfidentialInitializethis 第二 ARM架構(gòu)可以追溯到1985年,但它并沒有停滯不前。相反,它從早期的ARM內(nèi)核開始大規(guī)模發(fā)展,ARMv4及更早版本這些早期的處理器僅使用ARM32位指令集。ARMv4TARMv4T架構(gòu)將Thumb16位指令集添加到ARM32位指令集。這是第一個獲得廣泛許可的架構(gòu)。它由ARM7TDMI?和ARM9TDMI?處理ARMv5TE架構(gòu)增加了對DSP類型操作的改進,飽和算法,以及用于ARM和Thumb互通。ARMv6ARMv6外,還包括對在32位寄存器中的字節(jié)或半字上操作的SIMD操作的一些支持。ARM1136JF‐S?實現(xiàn)了這個架構(gòu)。ARMv6架構(gòu)還提供了一些可選擴展,特別是Thumb‐2和安全擴展(TrustZone?)。Thumb‐2將Thumb擴展為混合長度的16位和32位指令集。ARMv7-AARMv7-A架構(gòu)強制要求Thumb‐2擴展,并添加了高級SIMD擴展(NEON)。在ARMv7循基本相同的架構(gòu)或功能集。為了幫助解決越來越多的不同應(yīng)用程序,ARM引入了一組架構(gòu)配置文件:ARMv8-ARMv8‐A架構(gòu)是針對應(yīng)用程序配置文件的最新一代ARM架構(gòu)。ARMv8這個名稱用于描述整體架構(gòu),現(xiàn)在包括32位執(zhí)行狀態(tài)和64位執(zhí)行狀態(tài)。它引入了使用64位寬寄存器執(zhí)行的能力,同時保持與現(xiàn)有ARMv7軟件的向后兼容性。ARMv8‐A架構(gòu)引入了許多更改,可以設(shè)計出性能顯著提高的處理器實現(xiàn):大物理地址(Largephysicaladdress)這使處理器能夠訪問超過4GB64位虛擬尋址(64-bitvirtualaddressing)這使虛擬內(nèi)存超出4GB限制。這對于使用內(nèi)存映射文件I/O或稀疏尋址的現(xiàn)代桌面和服務(wù)器軟件自動事件信號(Automaticeventsignaling)更大的寄存器文件(Largerregisterfiles)31個64高效的64位立即生成(Efficient64-bitimmediategeneration)較大的PC相對尋址范圍(LargePC-relativeaddressingrange)一個+/‐4GB的尋址范圍,用于在共享庫和與位置無關(guān)的可執(zhí)行文件中進行有效的數(shù)據(jù)尋址。額外的16KB和64KB翻譯顆粒(Additional16KBand64KBtranslationgranules)這降低了翻譯后備緩沖區(qū)(TLB)未命中率和頁面遍歷深度。新的異常模型(Newexceptionmodel)高效的緩存管理理Efficientcachemanagement)硬件加速密碼學(xué)(Hardware-acceleratedcryptography)提供3到10倍更好的軟件加密性能。這對于小粒度解密和加密非常有用,因為太小而無法有效地卸載到硬件加速器,例如https。加載‐獲取、存儲‐釋放指令(Load-Acquire,Store-Releaseinstructions)專為C++11、C11、Java內(nèi)存模型而設(shè)計。它們通過消除顯式內(nèi)存屏障指令來提高線程安全代碼的NEON雙精度浮點高級SIMD(NEONdouble-precisionfloating-pointadvancedSIMD)這使得SIMD矢量化能夠應(yīng)用于更廣泛的算法集,例如科學(xué)計算、高性能計算(HPC)和超級計算Cortex‐A53Cortex‐A53L1緩存子系統(tǒng)、一個可選的集成GICv3/4接口和一個可選的L2Cortex‐A53處理器是一款非常節(jié)能的處理器,能夠支持32位和64位代碼。它提供了比非常成功的Cortex‐A7big.LITTLE配置中與Cortex‐A57處理器配對,以獲得最佳性能、可擴展性和能源效率。Cortex‐A53處理器具有以下特性:有序的八級流水線。通過使用分層時鐘門控、電源域和高級保留模式來降低功耗。通過重復(fù)執(zhí)行資源和雙指令解碼器提高雙發(fā)能力。功耗優(yōu)化的二級緩存設(shè)計可提供更低的延遲并在性能與效率之間取得平衡。Cortex‐A57Cortex‐A57處理器面向移動和企業(yè)計算應(yīng)用,包括計算密集型64位應(yīng)用,例如高端計算機、平板電腦和服務(wù)器產(chǎn)品。它可以與Cortex‐A53處理器一起使用到ARMbig.LITTLE和更高效的能源使用。Cortex‐A57處理器具有與其他處理器的高速緩存一致性互操作性,包括用于GPU計算的ARMMali?列圖形處理單元(GPU),并為高性能企業(yè)應(yīng)用程序提供可選的可靠性和可擴展性功能。它提供了比ARMv7Cortex‐A15處理器更高的性能,并具有更高的能效水平。加密擴展的包含將加密算法的性能提高了10倍于上一代處理器。Cortex‐A57處理器完全實現(xiàn)了ARMv8‐A架構(gòu)。它支持多核操作,在單個集群中具有一到四核多處理。AMBA5CHI或AMBA4ACE技術(shù),可以實現(xiàn)多個一致的SMP集群??赏ㄟ^CoreSight技術(shù)進行調(diào)試和Cortex‐A57處理器具有以下特性:亂序,15+階段流水線。省電功能包括路徑預(yù)測、標(biāo)記減少和緩存查找抑制。通過重復(fù)執(zhí)行資源增加峰值指令吞吐量。具有本地化解碼、3寬解碼帶寬的功率優(yōu)化指令解碼。性能優(yōu)化的L2緩存設(shè)計使集群中的多個核心可以同時訪問L2。 第三 ARMv8基礎(chǔ)知 在ARMv8中,執(zhí)行發(fā)生在四個異常級別之一。在AArch64中,異常級別決定了特權(quán)級別,類似于ARMv7中定義的特權(quán)級別。異常級別決定特權(quán)級別,因此在ELn執(zhí)行對應(yīng)于特權(quán)PLn。類似地,具有比另一個更大的n異常級別。異常級別提供了適用于ARMv8架構(gòu)的所有操作狀態(tài)的軟件執(zhí)行權(quán)限的邏輯分離。它類似于并支持計算EL0Normaluserapplications.EL1Operatingsystemkerneltypicallydescribedasprivileged.EL2Hypervisor.EL3Low-levelfirmware,includingtheSecureMonitor.是內(nèi)核中的虛擬機管理程序,例如KVM,它在EL2和EL1上運行。ARMv8‐A提供兩種安全狀態(tài),安全和非安全。非安全狀態(tài)也稱為正常世界。這使操作系統(tǒng)(OS)能夠與受信任的操作系統(tǒng)在同一硬件上并行運新g,并提供針對某些軟件攻擊和硬件攻擊的保護。ARMTrustZone技術(shù)使系統(tǒng)能夠在正常和安全世界之間進行分區(qū)。與ARMv7‐A架構(gòu)一樣,安全監(jiān)視器充當(dāng)ARMV8-ARMV8-ARMv8‐A還提供對虛擬化的支持,但僅在普通世界中。這意味著管理程序或虛擬機管理器(VMM)代碼操作系統(tǒng)都不會意識到它正在與其他客戶操作系統(tǒng)共享系統(tǒng)上的時間。正常世界(對應(yīng)于非安全狀態(tài))GuestOSkernels此類內(nèi)核包括在非安全EL1中運行的Linux或Windows。在管理程序下運行時,豐富的操作系統(tǒng)Hypervisor這在EL2上運行,它始終是非安全的。虛擬機管理程序在存在并啟用時,可為豐富的操作系統(tǒng)內(nèi)核Securefirmware化、可信操作系統(tǒng)的安裝以及安全監(jiān)視器調(diào)用的路由。TrustedOSARMv8特權(quán)的邏輯模型。ARMv8架構(gòu)定義了兩種執(zhí)行狀態(tài),AArch64和AArch32。每個狀態(tài)分別用于描述使用64位寬通用寄存32ARMv8AArch32ARMv7AArch64ELn的執(zhí)行對應(yīng)于特權(quán)PLn。當(dāng)處于AArch64狀態(tài)時,處理器執(zhí)行A64指令集。當(dāng)處于AArch32狀態(tài)時,處理器可以執(zhí)行A32(在早期版本的架構(gòu)中稱為ARM)或T32(Thumb)指令集。下圖顯示了AArch64和AArch32在AArch32狀態(tài)下,TrustedOS軟件在SecureEL3中執(zhí)行,而在AArch64狀態(tài)下,它主要在SecureEL1中執(zhí)行。在ARMv7架構(gòu)中,處理器模式可以在特權(quán)軟件控制下更改,也可以在發(fā)生異常時自動更改。當(dāng)發(fā)生異下表對此進行了總結(jié)。應(yīng)用程序以最低級別的特權(quán)PL0運行,即以前的非特權(quán)模式。操作系統(tǒng)在PL1上運行,Hypervisor在具有虛擬化擴展的系統(tǒng)中在PL2上運行。安全監(jiān)視器作為在安全和非安全(正常)世界之間移動的網(wǎng)關(guān),也在PL1上運行。在AArch64中,處理器模式映射到異常級別,如圖3‐6所示。與在ARMv7(AArch32)中一樣,當(dāng)發(fā)生移動到更高的異常級別,例如從EL0到EL1,表示軟件增加執(zhí)行特權(quán)。不能將異常處理到較低的異常級別。EL0級別沒有異常處理,必須在更高的異常級別處理異常異常導(dǎo)致程序流程發(fā)生變化。異常處理程序的執(zhí)行以高于EL0的異常級別從與所采取的異常相關(guān)的IRQFIQ等中斷。通過執(zhí)行ERET指令來結(jié)束異常處理并返回到上一個異常級別。從異常返回可以保持相同的異常級別或進入較低的異常級別。它不能移動到更高的異常級別。安全狀態(tài)確實會隨著異常級別的變化而變化,除非從EL3重新調(diào)整到非安全狀態(tài)有時您必須更改系統(tǒng)的執(zhí)行狀態(tài)。例如,如果您正在運行64位操作系統(tǒng),并且希望在EL0上運行32位應(yīng)用程序,則可能是這樣。為此,系統(tǒng)必須更改為AArch32。當(dāng)應(yīng)用程序完成或執(zhí)行返回操作系統(tǒng)時,系統(tǒng)可以切換回AArch64。第3‐9頁上的圖3‐7表明您不能反過來做。AArch32操作系統(tǒng)不能承載64位應(yīng)用程序要在相同的異常級別之間切換執(zhí)行狀態(tài),您必須切換到更高的異常級別,然后返回到原始的異常級別。例如,您可能有32位和64位應(yīng)用程序在64位操作系統(tǒng)下運行。在這種情況下,32行并生成主管調(diào)用(SVC)指令,或接收中斷,從而導(dǎo)致切換到EL1和AArch64。(請參閱第6‐21頁的異常處理說明。)然后操作系統(tǒng)可以執(zhí)行任務(wù)切換并返回到AArch64中的EL0。實際上,這意味著您不能擁有混合的32位和64位應(yīng)用程序,因為它們之間沒有直接的調(diào)用方式。您只能通過更改異常級別來更改執(zhí)行狀態(tài)。發(fā)生異??赡軙腁Arch32更改為AArch64,從異常返回可能會從AArch64更改為AArch32。EL3以下是在AArch64和AArch64和AArch32執(zhí)行狀態(tài):AArch64和AArch32執(zhí)行狀態(tài)都具有大致相似的異常級別,但安全和非安全操作之間存在一些差更改為AArch32需要從較高的異常級別轉(zhuǎn)到較低的異常級別。這是通過執(zhí)行ERET指令退出異常處理程序的結(jié)果。請參閱第6‐21頁的異常處理說明。更改為AArch64需要從較低的異常級別轉(zhuǎn)到較高的異常級別。異??赡苁侵噶顖?zhí)行或外部信號的如果在發(fā)生異?;驈漠惓7祷貢r,異常級別保持不變,則執(zhí)行狀態(tài)不能改變。ARMv8處理器在特定的AArch32執(zhí)行狀態(tài)下運行異常級別,它使用與ARMv7中相同的異常模型來處理該異常級別的異常。在AArch64執(zhí)行狀態(tài)下,它使用第10章AArch64異常處理中描述的異因此,這兩種狀態(tài)之間的互通是在安全監(jiān)視器、管理程序或操作系統(tǒng)的級別上執(zhí)行的。在AArch64狀態(tài)下執(zhí)行的管理程序或操作系統(tǒng)可以支持較低權(quán)限級別的AArch32操作。這意味著在AArch64作系統(tǒng)可以同時托管AArch32和AArch64應(yīng)用程序。同樣,AArch64管理程序可以同時托管AArch32和AArch64客戶操作系統(tǒng)。但是,32位操作系統(tǒng)不能托管64位應(yīng)用程序,32位虛擬機管理程序不能托管64位客戶操作系統(tǒng)。對于最高實現(xiàn)的異常級別(Cortex‐A53和Cortex‐A57處理器上的EL3),在接受異常時用于每個異常級別的執(zhí)行狀態(tài)是固定的。異常級別只能通過重置處理器來更改。對于EL2和EL1,它由第4‐7頁的系 第四 ARMv8寄存 AArch64執(zhí)行狀態(tài)提供了32個在任何時間任何特權(quán)級下都可訪問的64每個寄存器都有64位寬,它們通常被稱為寄存器X0-X30。每個AArch6464位通用寄存器(X0-X30)也具有32位(W0-W30)32位W寄存器取自相應(yīng)的64位X寄存器的低32位。也就是說,W0映射到X0的低32位,W1映射到X132從W寄存器讀取時,忽略相應(yīng)X寄存器高32位,并保持其它不變。寫入W寄存器時,將X寄存器的高32設(shè)置為零。也就是說,將0xFFFFFFFF寫入W0會將X0設(shè)置為0x00000000FFFFFFFF。AArch64除了31注意:沒有被稱為X31或W31的寄存器。許多指令被編碼,例如:31代表零寄存器,ZR(WZR/XZR)。還有一組受限制的指令,其中對一個或多個參數(shù)進行編碼,使數(shù)字31針(SP)。當(dāng)訪問零寄存器時,所有寫操作都被忽略,所有讀操作返回0。請注意,64位形式的SP寄存器不使用X綴。在ARMv8體系結(jié)構(gòu)中,當(dāng)CPU運行在AArch64存器中:SavedProcessorStateRegister(SPSR).每個異常級別都有一個專用的SP令中但不是所有指令中使用零寄存器。在ARMv8常時會選擇目標(biāo)異常級別的SP_ELn作為棧指針。例如,當(dāng)觸發(fā)到EL1的異常時,就會選擇SP_EL1作為棧指針。每個異常級別都有自己的棧指針,SP_EL0、SP_EL1、SP_EL2和SP_EL3。當(dāng)AArch64處于EL0與該異常級別相關(guān)聯(lián)的一個專用的64位棧指針(SP_ELn)與EL0關(guān)聯(lián)的棧指針(SP_EL0)雖然大多數(shù)指令都無法使用SP寄存器。但是有一些形式的算術(shù)指令可以操作SP,例如,ADD寫當(dāng)前的棧指針以調(diào)整函數(shù)中的棧指針。例如:ADDADDSP,SP,#0x10//AdjustSPtobe0x10bytesbeforeitscurrent原來的ARMv7指令集的一個特性是R15作為程序計數(shù)器(PC),并作為一個通用寄存器使用。PC寄存器的使用帶來了一些編程技巧,但它為編譯器和復(fù)雜的流水線的設(shè)計引入了復(fù)雜性。在ARMv8中刪除了對的直接訪問,使返回預(yù)測更容易,并簡化了ABI規(guī)范。PC永遠不能作為一個命名的寄存器來訪問。但是,可以在某些指令中隱式的使用PC,如PC地址生成。PC不能被指定為數(shù)據(jù)處理或加載指令的目的操作數(shù)。異常鏈接寄存器程序狀態(tài)保存寄存器AArch64下各bit 負(fù)數(shù)標(biāo)志位,如果結(jié)果為負(fù)數(shù),則N=1;如果結(jié)果為非負(fù)數(shù),則N=0 零標(biāo)志位,如果結(jié)果為零,Z=1,否則Z=0 軟件步進標(biāo)志位 D 試異常是否被屏蔽。 SError(系統(tǒng)錯誤) M[4]異常發(fā)生時的執(zhí)行狀態(tài),0表示M[3:0]異常發(fā)生時的modeELR_ELn和SPSR_ELn保存著在較低異常級別執(zhí)行期間的狀A(yù)Arch64沒有直接與ARMv7當(dāng)前程序狀態(tài)寄存器(CPSR)等價的寄存器。在AArch64中,傳統(tǒng)CPSR作為可以獨立訪問的字段提供。這些狀態(tài)被統(tǒng)稱為處理器狀態(tài)(PSTATE)。AArch64的處理器狀態(tài)或PSTATE在AArch64中,你可以通過執(zhí)行ERET指令從一個異常中返回,這將導(dǎo)致SPSR_ELn被復(fù)制到PSTATE這將恢復(fù)ALU標(biāo)志、執(zhí)行狀態(tài)、異常級別和處理器分支。從這里開始,將繼續(xù)從ELR_ELn中的地址開始執(zhí)行。PSTATE.{N,Z,C,V}字段可以在EL0EL1EL0在AArch64中,系統(tǒng)配置通過系統(tǒng)寄存器進行控制,并使用MSR和MRS指令進行訪問。這與ARMv7-A形成了鮮明對比,在ARMv7-A中,這些寄存器通常通過協(xié)處理器15(CP15)訴你可以訪問它的最低異常級別。TTBR0_EL2可以從EL2和EL3訪問具有后綴_ELn的系統(tǒng)寄存器在各異常級別中有一個獨立的的副本,但通常不是EL0可以從EL0訪問,盡管緩存類型寄存器(CTR_EL0)是一個可以從EL0訪問的系統(tǒng)寄存器的例子。MRSMRSx0,TTBR0_EL1//MoveTTBR0_EL1intox0MSRTTBR0_EL1,x0//Movex0intoARM體系結(jié)構(gòu)以前的版本使用協(xié)處理器來進行系統(tǒng)配置。但是,AArch64表4-5僅列出了本書中提到的系統(tǒng)寄存器。有關(guān)完整的列表,請參見ARM體系結(jié)構(gòu)參考手冊-ARMv8的附錄J,以了解ARMv8-A下表展示了具有獨立副本的寄存器異常級別。例如,輔助控制寄存器(ACTLRs)在各異常級別作為ACTLR_EL1、ACTLR_EL2和ACTLR_EL3系統(tǒng)控制寄存器(SCTLR)并不是所有bit在EL1都可用,各bit EL001 寫權(quán)限不可執(zhí)行XN(eXecuteNever)。SeeAccesspermissionson0可寫區(qū)域不設(shè)置不可執(zhí)行權(quán)限1可寫區(qū)域強制為不可執(zhí)行 不陷入WFE,此標(biāo)志為1表示W(wǎng)FE 不陷入WFI,此標(biāo)志為1表示W(wǎng)FI EL0DCAVA指令,0禁止執(zhí)行,1I 開啟指令緩存,這是在EL0和EL1被緩存。 禁止SETEND。在EL0使用AArch32禁止SETEND指令。0使能,1禁止 禁止IT指令0IT IT指令被當(dāng)作16位指令。僅另外16位指令或32位指令的頭16 CP15barrier使能。如果實現(xiàn)了,它是AArch32CP15DMB,DSB和ISBbarrier操作的使能 EL0 數(shù)據(jù)cache使能。EL0和EL1的數(shù)據(jù)訪問使能位。對cacheable 使能對SCTLRMRSMRS<Xt>,SCTLR_ELn//ReadSCTLR_ELnintoXtMSRSCTLR_ELn,<Xt>//WriteXttoSCTLR_ELn注意:處理器中各異常級別的cache必須在數(shù)據(jù)和指令的cache在內(nèi)存中查看字節(jié)有兩種基本的方式,一種是小端(LE),另一種是大端(BE)中高字節(jié)存儲在低地址(即接近于零的地址)。在小端機器上,低字節(jié)存儲在低地址。術(shù)語byte-ordering也可以用來代替大小端。EL1中其他位,SCTLR_EL1.E0E控制EL0的數(shù)據(jù)大小端的設(shè)置。在AArch64執(zhí)行狀態(tài)中,數(shù)據(jù)訪問可以為處理器是否支持LE和BE取決于處理器的實現(xiàn)。如果只支持小端,則EE位和E0E位始終為0果僅支持大端,則EE位和E0E位被設(shè)置為1。改變執(zhí)行狀態(tài)(再次在第3-8頁的更改執(zhí)行狀態(tài)時,我們從異常級別角度描述了AArch64和AArch32寄存器的角度來考慮這個變化。從AArch32的異常級別進入AArch64對于AArch32下訪問任何異常級別的高32位寄存器的值的行為都是未知的。在AArch32執(zhí)行期間不可訪問保留了它們在AArch32執(zhí)行之前的狀態(tài)的寄存器。當(dāng)EL2使用AArch32觸發(fā)一個到EL3的異常時,ELR_EL2的高32位是未知的。AArch32不可以訪問AArch64各異常級別的棧指針(SPs)和異常鏈接寄存器(ELRs),這些寄存器保存著它們在AArch32執(zhí)行之前的狀態(tài):SP_EL0、SP_EL1、SP_EL2、ELR_EL1通常,應(yīng)用程序程序員可以在AArch32或AArch64行狀態(tài)和它們之間的切換。兼容ARMv7意味著AArch32必須匹配ARMv7特權(quán)級別。這也意味著AArch32只處理ARMv732位通用寄請記住,在ARMv7體系結(jié)構(gòu)中有16個32位通用寄存器(R0-R15)用于軟件使用。其中15個(R0-R14)可用于通用數(shù)據(jù)存儲。剩下的寄存器R15是程序計數(shù)器(PC)可以訪問CPSR,而從之前執(zhí)行的模式中保存的CPSR是SPSR。在發(fā)生異常時,CPSR將被復(fù)制到發(fā)生異常的模式的SPSR中。訪問這些寄存器中的哪一個,取決于軟件正在執(zhí)行的處理器模式和寄存器本身,這稱為banking,第4-14頁圖4-7中的陰影寄存器稱為banked才能訪問。在ARMv7中使用了banking以使用的都不到一半。相比之下,AArch64執(zhí)行狀態(tài)有31個64位通用寄存器,并且可以在所有異常級別中隨時訪問。在AArch64和AArch32之間的執(zhí)行狀態(tài)的切換意味著AArch64寄存器必須映射到AArch32(ARMv7)集。此映射如圖4-8所示。當(dāng)在AArch32狀態(tài)下執(zhí)行時,AArch64寄存器的高32位是不可訪問的。如果處理器在AArch32作,它將使用32位W寄存器,這相當(dāng)于32位的ARMv7寄存器。AArch32需要將banked寄存器映射到AArch64AArch32中的SPSR和ELR_Hyp寄存器是只能被系統(tǒng)指令訪問的附加寄存器。它們沒有被映射到體系結(jié)構(gòu)的通用寄存器空間中。下面這些寄存器在AArch32和AArch64SPSR_svc映射到SPSR_EL1ELR_hyp映射到ELR_EL2以下寄存器僅在AArch32執(zhí)行期間使用。由于在EL1上使用AArch64執(zhí)行,所以,盡管在AArch64間這些寄存器不可訪問,但仍然保留了它們的狀態(tài)。SPSR_abtSPSR_undSPSR_irqSPSR_fiqSPSR寄存器只能在AArch64同樣,如果在AArch32的異常級別觸發(fā)一個到AArch64異常級別的異常,則AArch64ELR_ELn的高32位AArch32下的在AArch64中,傳統(tǒng)CPSR的不同組件被表示為可以獨立訪問的處理器狀態(tài)(PSTATE)字段。在有與ARMv7CPSR位對應(yīng)的附加字段。提供只能在AArch32上訪問的附加PSTATE除了通用寄存器之外,ARMv8還有32個128位浮點寄存器,標(biāo)記為V0-V31。32點指令的浮點操作數(shù),以及NEON操作的標(biāo)量操作數(shù)和向量操作數(shù)。NEON和浮點寄存器也在第7章AArch64Floating-pointandNEO也會介紹。在對標(biāo)量數(shù)據(jù)進行操作的NEON指令和浮點指令中,浮點和NEON寄存器的行為類似于主要的通用整數(shù)寄存器。因此,只訪問較低的位,在讀時忽略未使用的高位,在寫時將其設(shè)置為零。標(biāo)量浮點和名稱的限定名表示有效位的數(shù)目,如下所示,其中n是寄存器號0-31。注意:支持16位浮點數(shù),但僅作為要轉(zhuǎn)換的格式。不支持?jǐn)?shù)據(jù)處理操作。(譯注16位浮點數(shù)據(jù)進行操作前綴F和浮點數(shù)大小由浮點ADD指令指定FADDFADDSd,Sn,Sm//Single-precisionFADDDd,Dn,Dm//Double-FCVTFCVTSd,Hn//half-precisiontosingle-precisionFCVTDd,Hn//half-precisiontodouble-precisionFCVTHd,Sn//single-precisiontohalf-precisionFCVTHd,Dn//double-precisiontohalf-在AArch64中,整數(shù)標(biāo)量的映射已經(jīng)從ARMv7-A中使用的映射更改為圖4-11圖4-11S0是D0的低半部分,D0是Q0的低半部分。S1是D1的低半部分,D1同樣是Q1類推。這消除了編譯器在自動向量化高級代碼時遇到的許多問題。每個Q寄存器的低64位也可以看作是D0-D31,32個給浮點和NEON計算使用的64位寬寄存器。每個Q寄存器的低32位也可以看作是S0-S31,32個給浮點和NEON計算使用的32位寬寄存器。每個S寄存器的低16位也可以看作是H0-H31,32個給浮點和NEON計算使用的16位寬寄存器。每個H寄存器的低8位也可以看作是B0-B31,32個供NEON使用的8位寬寄存器。注意:時用0填充其余部分。這種映射的結(jié)果是,如果在AArch64中執(zhí)行的程序正在使用來自AArch32的D或SD或S寄存器之前,程序必須將它們從V對于標(biāo)量ADDADDADDVd,Vn,例如,如果大小為32ADDADDSd,Sn,向量的大小為64位,有一個或多個元素。也可以為128位,有兩個或多個元素。如圖4-12所示對于向量ADD指令:ADDADDVd.T,Vn.T,這里對于32位向量,有4個lanes(通道),ADDADDVd.4S,Vn.4S,數(shù)據(jù)元素的大小和其中包含的元素或通道的數(shù)量。在AArch32中,較小的寄存器被打包成較大的寄存器(比如D0和D1合并成Q1)迭代依賴關(guān)系,這會降低編譯器向量化循環(huán)結(jié)構(gòu)的能力。AArch32中的浮點寄存器和高級SIMD寄存器被映射到AArch64FP和SIMD用程序或虛擬機的浮點和NEON寄存器由更高級別的系統(tǒng)軟件(例如OS或Hypervisor)解釋(改)。AArch64V16-V31FP和NEON寄存器不能從AArch32訪問。與通用寄存器一樣,運行在AArch32中的異 第五 ARMv8架構(gòu)中引入的最重要的變化之一是增加了64位指令集。該指令集補充了現(xiàn)有的32這一指令集提供了對64位寬整數(shù)寄存器和數(shù)據(jù)操作的訪問,以及使用64位內(nèi)存指針的能力。新的指令集被稱為A6,并且在AArch64狀態(tài)下執(zhí)行。ARMv8架構(gòu)還包括原始的ARM指令集(現(xiàn)稱為A32)和Thumb(T32)指令集。A32和T32都以AArch32狀態(tài)執(zhí)行,并且向后與ARMv7架構(gòu)兼容。雖然ARMv8-A向后兼容了32位ARM架構(gòu)的特性,但A64指令集與舊的ISA指令是獨立且不同的,而且他們的編碼方式也不同。A64增加了一些額外的功能,同時也刪除了其他可能限制高性能實現(xiàn)速度或能效的功能。ARMv8架構(gòu)還包括對32位指令集(A32和T32)碼與舊的ARMv7實現(xiàn)不兼容。然而,A64指令集中的指令操作碼長度仍然是32位,而不是64位。更詳細描述A64匯編語言的編程指南也可以參考ARM?CompilerarmasmReferenceGuidev6.01ARMv8新的A64指令集與現(xiàn)有的A32指令集相似。指令寬度為32指令集使用ARMv8架構(gòu)中約定的通用命名,因此現(xiàn)在調(diào)用原始的32位狀態(tài)指令集是A32和T32A32在AArch32狀態(tài)下,盡管指令集存在差異,但是在很大程度上與ARMv7兼容。請參閱ARMv8-T32 Thumb指令集最初包含在ARM7TDMI處理器中,最初只包含16位指令。16位指令以犧牲一些性能為代價提供了更小的程序體積。ARMv7處理器包括Cortex-A系列處理器,支持Thumb-2技術(shù),該技術(shù)擴展了Thumb指令集,以提供16位和32位指令的混合指令集。這提供了與ARM性能,同時保留了縮小的代碼體積。由于其大小和性能優(yōu)勢,編譯或組合所有32位代碼以利用Thumb-2技術(shù)越來越常見。此外還引入了一個新的指令集,ARM核心在AArch64保持一致,并反映64A6。A64提供了與AArch32或ARMv7中的A32和T32指令集類似的功能。新的A64指令集的設(shè)計進行了一致的編碼方案A32中一些指令的延遲添加導(dǎo)致編碼方案存在一些不一致。例如,對半字的LDR和STR主流字節(jié)和單字傳輸指令的編碼略有不同,這就會導(dǎo)致尋址模式略有不同。種類繁多的常量A64算術(shù)指令通常接受12位立即數(shù)。邏輯指令通常接受32位或64位常量,其編碼存在一些約束。MOV指令接受16位立即操作,可以移動到任何16位邊界。地址生成指令適用于與4KB頁面大小對齊的地址。A64下合法地進行編碼,都可能是不太容易的。數(shù)據(jù)類型處理更容易A64可以自然地處理64位有符號和無符號數(shù)據(jù)類型,因為它提供了更簡潔、更高效的64數(shù)操作方法。這對所有提供64位整數(shù)(如C或Java)的語言都有好處。長偏移量A64指令通常為PC修復(fù)工作也少了。長期以來,對字詞池(嵌入代碼流中的字詞數(shù)據(jù)塊)的需求一直是ARM指令集的一個特點。這在A64指令集中仍然存在。然而,較大的PC相對加載偏移量對字詞池的管理有很大幫助,要。指針指針在AArch64中是64位的,這允許對更多的虛擬內(nèi)存進行尋址,并為地址映射提供更多的自由。然而,使用64位指針確實會產(chǎn)生一些代價。同一段代碼在使用64比使用32位指針時使用更多的內(nèi)存。每個指針存儲在內(nèi)存中,需要8個字節(jié)而不是4這聽起來很微不足道,但加起來就會有很大的損失。此外,由于遷移到64位后對內(nèi)存空間的使用增加,會導(dǎo)致訪問緩存的次數(shù)減少。這種高速緩存命中率的下降會降低系統(tǒng)性能。有些語言可以用壓縮指針來實現(xiàn),如Java使用條件結(jié)構(gòu)而不是IT塊IT塊是T32前分支。然而,它們有時很難被硬件有效地處理。因此A64刪除了這些塊,用CSEL(即條件選擇)和CINC(即條件增加)等條件指令來代替它們。這些條件結(jié)構(gòu)更直接,更容易處理。移位和旋轉(zhuǎn)行為更直觀A32或T32ARMv7型和數(shù)量需要一定數(shù)量的操作碼位,這些操作碼位可以用在其他地方。因此,A64代碼生成在為常見的算術(shù)函數(shù)靜態(tài)和動態(tài)生成代碼時,A32和T32通常需要不同的指令或指令序列。這是為了應(yīng)對不同的數(shù)據(jù)類型。A64的簡單操作生成公共序列。例如,在T32中,相同的指令可以有不同的編碼,具體取決于使用的寄存器(存器)。A64指令集編碼更加規(guī)范和合理化。因此,A64的匯編器通常需要比T32行。固定長度指令與T32不同的是,所有A64指令的長度都相同,T32跟蹤生成的代碼序列更容易,特別是會影響動態(tài)代碼生成器。三操作數(shù)映射更好一般來說,A32為數(shù)據(jù)處理操作保留了真正的三操作數(shù)結(jié)構(gòu)。另一方面,T32包含了大量的雙操作數(shù)指令格式,這使得它在生成代碼時的靈活性稍差。A64這進一步促進了指令集的規(guī)則性和同質(zhì)性,有利于編譯器的使用。區(qū)分32位和64位A64A64指令集中的大多數(shù)整數(shù)指令有兩種形式,它們在64位通用寄存器文件中的32位或64在查看指令使用的寄存器名稱時:如果寄存器名稱以X開頭,則寄存器為64位。如果寄存器名稱以W開頭,則寄存器為32位。選擇32在31位而不是63位向右移位和旋轉(zhuǎn)注入。由指令設(shè)置的條件標(biāo)志是從較低的32位開始計算的。將X寄存器的W寄存器的Bit[63:32]設(shè)置為零。即使32位指令形式的結(jié)果與等效的64位指令形式計算的較低32位無法區(qū)分,這種區(qū)別也適用。例如,可以使用64位ORR執(zhí)行32位按位ORR,只需忽略結(jié)果的前32位。A64指令集包括單獨的32位和64ORR指令。C和C++的LP64和LLP64數(shù)據(jù)模型預(yù)計將是AArch64上最常用的。它們都將經(jīng)常使用的int、short和char類型定義為32費能量或周期來計算、轉(zhuǎn)發(fā)和存儲這種數(shù)據(jù)類型的未使用的前32何方式利用這種自由來節(jié)省能量。因此,新的A64指令集提供了不同的符號和零擴展指令。此外,A64ADD、SUB、CMN或CMP指令的最終源寄存器以及Load或Store實現(xiàn)涉及64位數(shù)組指針和32位數(shù)組索引的數(shù)組索引計算。當(dāng)處理器可以在單個寄存器中存儲64位的值時,在程序中訪問大量的內(nèi)存就變得簡單多了。一個在32內(nèi)核上執(zhí)行的單線程,只能訪問4GB的地址空間。該可尋址空間的大部分被保留給操作系統(tǒng)內(nèi)核、庫代碼、外圍設(shè)備等使用。因此,缺乏空間意味著程序在執(zhí)行時可能需要將一些數(shù)據(jù)映射進或映射出內(nèi)存。有一個更大的地址空間,有64位指針,就可以避免這個問題。這也使得諸如內(nèi)存映射文件的技術(shù)更有吸引力,使用起來也更方便。文件內(nèi)容被映射到線程的內(nèi)存映射中,即使物理RAM可能沒有大到足以容納整個文件。獨占訪問如循環(huán)列表的插入。所有的獨占訪問必須自然對齊,獨占對的訪問必須對齊到數(shù)據(jù)大小的兩倍,也就是說,一對64位的值要對齊到128PC相關(guān)的load指令偏移范圍為±1MB。與A32中PC相關(guān)的load并增加了函數(shù)之間字詞數(shù)據(jù)的共享。反過來,這也減少了Icache和TLB大多數(shù)條件性分支的范圍是±1MB無條件分支,包括分支和鏈接,其范圍為±128MB象的靜態(tài)代碼段,而不需要鏈接器插入的單板。為原始分支的一個中間目標(biāo),單板本身就是通用對同一函數(shù)的其他調(diào)用。偶爾,這種單板會能。將相關(guān)代碼放在一起的內(nèi)存中可以避免這種范圍為±4GB的PC相對load以及store偏移量。未對齊地址支持除獨占和有序訪問外,所有l(wèi)oad和store了向A64移植代碼的工作。批量傳輸A64中不存在LDM、STM、PUSH和POP指令。批量傳輸可以用LDP和STP連續(xù)的內(nèi)存位置加載和存儲一對獨立的寄存器。加載/存儲所有的加載/式處理char、short、int和longlong變得更加容易。浮點和NEON易。對齊檢查當(dāng)在AArch64這種方法比強制對齊PC或SP更可取,因為PC或SP壞。當(dāng)試圖執(zhí)行一條在AArch64中PC錯位的指令時,程序計數(shù)器對齊檢查會產(chǎn)生一個與指令獲取錯位的PC被定義為PC的位[1:0]不為00的情況。PC器中被識別。當(dāng)使用AArch64處理異常時,相關(guān)的異常鏈接寄存器持有整個PC寄存器FAR_ELn一樣。在該異常級別中,PC對齊檢查會在AArch64中執(zhí)行,在AArch32只要在AArch64中嘗試使用堆棧指針作為基址的加載或存儲,堆棧指針(SP)對齊檢查就會錯位的堆棧指針是指堆棧指針的第[3:0]位,作為計算的基址,不是0000作基址,它就必須是16字節(jié)對齊的。堆棧指針對齊檢查只在AArch64EL2在SCTLR_EL2中由位控制。A6464A64程序調(diào)用標(biāo)準(zhǔn)(PCS)在寄存器(X0-X7)中傳遞多達八個參數(shù)。相比之下,A32和T32中傳遞四個參數(shù),任何多余的參數(shù)都在堆棧中傳遞。PCS還定義了一個專用的幀指針(FP),更多信息,請參閱第9章ARM64位架構(gòu)的ABI。采用64模型,它們主要在為整數(shù)、長和指針定義的大小上有所不同,下圖是變量寬度表:long64位的Linux實現(xiàn)了使用LP64,這被A64程序調(diào)用標(biāo)準(zhǔn)所支持。其他PCS系統(tǒng)使用。零寄存器W0、W1、W2指令與使用零寄存器的MADDW0、W1、W2、WZR相同。并非所有指令都可以使用XZR/WZR某些參數(shù)數(shù)量以及非常有限的指令而言,WZR/XZR不可用,而是使用WSP/SP。A32movmovr0,#0strr0,[...]A64strstrwzr,不需要使用備用寄存器,或者使用以下方式寫入16stpstpxzr,xzr,[...]零寄存器的一個方便的副作用是,有許多具有大直接字段的NOP指令。例如,ADRXZR,僅即可在指令中為您提供21位數(shù)據(jù),沒有其他副作用。這對JIT大多數(shù)指令無法引用堆棧指針(SP)用于調(diào)整函數(shù)序言或結(jié)語中的堆棧指針。例如:ADDADDSP,SP,#256//SP=SP+當(dāng)前的程序計數(shù)器(PC)的源地址或目的地址,也不能作為加載和存儲指令的基地址、索引或轉(zhuǎn)移寄存器。唯一讀取PC的指令是那些計算PC相關(guān)地址的指令(ADR、ADRP、literalload和directbranches),以及在鏈接寄存器中存儲返回地址的分支和鏈接指令(BL和BLR)的唯一方法是使用分支、異常產(chǎn)生和異常返回指令。當(dāng)PC被一條計算PC相關(guān)地址的指令所讀取時,那么它的值就是該指令的地址。與A32和T32PC沒有隱含的4或8NEON寄存器最重要的更新是,NEON現(xiàn)在有32個16字節(jié)寄存器,而不是之前的16和NEON寄存器庫中不同寄存器大小之間的更簡單的映射方案使得這些寄存器更容易使用。對于編譯器和優(yōu)化器來說,這種映射更容易建模和分析。寄存器索引地址A64指令集在A32的基礎(chǔ)上提供了額外的尋址模式,允許64位的索引寄存器被添加到64存器中,并可以選擇按訪問大小對索引進行縮放。此外,它還提供了索引寄存器中32C++在本節(jié)中,我們簡要介紹了如何在C或C++asm關(guān)鍵字可以將內(nèi)聯(lián)GCC#include#includeintadd(inti,intj)intres=0;asm("ADD%w[result],%w[input_i],%w[input_j]"http://Use`%w[name]`tooperateon//registers(asinthis//Youcanuse`%x[name]`for//registerstoo,butthisis//:[result]"=r":[input_i]"r"(i),[input_j]"r"(j));returnres;intmain(void)inta=1;intb=2;intc=0;c=add(a,b)printf(“Resultof%d+%d=%d\n,a,b,Asmasmasm(code[:output_operand_list[:input_operand_list[:這里的代碼是程序集代碼。在我們的示例中,這是“add%[result],%[input_i],%[input_j]”O(jiān)utput_operand_list約束字符串和括號中的C表達式組成。在本例中,有一個輸出操作數(shù):[result]"=r"(res)。Input_operand_list語法。在本例中,有兩個輸入操作數(shù):[input_i]"r"(i)和[input_j]"r"(j)。Clobber_list是crobbered在C/C++和程序集代碼之間調(diào)用函數(shù)時,您必須遵循AAPCS64規(guī)則。\h不可能在單個應(yīng)用程序中使用來自兩個執(zhí)行狀態(tài)的代碼。ARMv8中A64和A32或T32作,因為A32和T32指令集之間有互操作。用A64編寫的ARMv8處理器代碼無法在ARMv7Cortex-A系列處理器上運行。然而,為ARMv7-A處理器編寫的代碼可以在AArch32執(zhí)行狀態(tài)下的ARMv8處理器上運行。下面的圖總結(jié)了這一點。 第六 A64指令 代碼可能是有用的。當(dāng)編寫編譯器時,或者需要使用C語言中不能直接使用的低級功能時,就是這種情況。在開發(fā)操作系統(tǒng)時,啟動代碼的一部分、設(shè)備驅(qū)動程序可能需要匯編代碼。最后,在調(diào)試C語言時,能夠閱讀匯編代碼是非常有用的,特別是了解匯編指令和CADDADDW0,W1,W2//add32-bitADDX0,X1,X2//add64-bitADDX0,X1,W2,////addsignextended32-bitregisterto64-bitADDX0,X1,#42//addimmediateto64-bitADDV0.8H,V1.8H,V2.8H//NEON16-bitadd,ineachof8作。6-4頁的乘法和除法指令可以看作是這些指令的特例。數(shù),如下所示。InstructionInstructionRd,Rn,第二個操作數(shù)可能是一個寄存器,一個修改后的寄存器,或者一個立即數(shù)。R的使用表明它可以是一個或一個W寄存器。算術(shù)和邏輯運算。移動和位移操作。符號和零擴展的指令。Bit和bitfield操作。有條件比較和數(shù)據(jù)處理。CMP,CMN,MOV,有些指令還有一個S的后綴,表示該指令設(shè)置了標(biāo)志。在表6-1的指令中,包括ADDS、SUBS、ADCSADC{S}:ADC{S}:Rd=Rn+Rm+CSBC{S}Rd=Rn-Rm-1+CADDW0ADDW0,W1,W2,LSL#3SUBSX0,X4,X3,ASR#2MOVX0,X1 //W0=W1+(W2<<CMPW3,W4//X0=X4-(X3>>2),setflags//CopyX1toX0ADDW0,W5,#27//SetflagsbasedonW3-W4Example6-1Arithmeticinstructions//W0=W5+BIC(位元位清除)指令執(zhí)行寄存器的AND值。例如,要清除寄存器X0的位[11],請使用:MOVMOVX1,#0x800BICX0,X0,ORN和EON分別與第二操作數(shù)的位數(shù)-NOT進行OR或EOR比較指令只修改標(biāo)志,沒有其他作用。這些指令的即時值的范圍是12位,這個值可以選擇向左移動位。乘法指令與ARMv7-A中的乘法指令大體相似,但能夠在單個指令中執(zhí)行64作如下圖所示:有一些乘法指令對32位或64位的數(shù)值進行操作,并返回與操作數(shù)相同大小的結(jié)果。例如,用MUL以將兩個64位的寄存器相乘,產(chǎn)生一個64位的結(jié)果。MULMULX0,X1,X2//X0=X1*還可以用MADD或MSUB例如,MNEG指令可以用來對結(jié)果進行取反:MNEGMNEGX0,X1,X2//X0=-(X1*此外,還有一系列的乘法指令可以產(chǎn)生一個長的結(jié)果,即把兩個32位的數(shù)字相乘,產(chǎn)生一個64位的結(jié)果。這些長線乘法有有符號和無符號的變體(UMULL,SMULL)數(shù)值累積起來(UMADDL,SMADDL)或進行取反(UMNEGL,SMNEGL)。包括32位和6432±(32×32)得到32位結(jié)果。64±(64×64)得到64位結(jié)果?!溃?2×32)得到32位結(jié)果。±(64×64)得到64位結(jié)果。加寬乘法,即有符號和無符號的乘法,通過累加得到一個6464±(32×32)得到64位結(jié)果?!溃?2×32)得到64位的結(jié)果。一個64×64到128位的乘法運算需要兩個指令序列來產(chǎn)生一對64±(64×64)得到結(jié)果[63:0]的較低64位。(64×64)得到結(jié)果的更高64位[127:64]。該列表不包含32×64選項。您不能直接將32位W寄存器乘以64位XARMv8-A架構(gòu)支持32位和64UDIVUDIVW0,W1,W2//W0=W1/W2(unsigned,32-bitdivide)SDIVX0,X1,X2//X0=X1/X2(signed,64-bitdivide)任何整數(shù)除以零都會返回零。溢出只能在SDIV中發(fā)生:INT_MIN/-1返回INT_MIN,其中INT_MIN是最小的負(fù)數(shù),可以在用于操作的寄存器中進行編邏輯向左移位(LSL)。LSL指令執(zhí)行2的乘法。算術(shù)向右移(ASR)。ASR指令執(zhí)行2的冪的除法,保留符號位。為移位指定的寄存器可以是32位或641,或者通過一個寄存器,其值只取自底部的5位(modulo-32)或6位(modulo-64)這些指令存在有符號(SXTB,SXTH,SXTW)和無符號(UXTB,UXTH)兩種變體,是相應(yīng)的Bitfield操作這些指令的有符號和無符號變體都是將一個字節(jié)、半字或字(盡管只有SXTW在字上操作)大小。源寄存器總是一個W寄存器。目的寄存器可以是X或W寄存器,除了SXTW必須是X寄存器。SXTBSXTBX0,W1//符號擴展了寄存器W1的最小有效字節(jié),通過重復(fù)最左邊的位,從8位到64Bitfield(位域)指令與ARMv7中的指令類似,包括位域插入(BFI)((S/U)BFX)。還有一些額外的位域指令,如BFXIL(位域提取和插入低)、UBFIZ(無符號位域插入零)和SBFIZ(有符號位域插入零)。還有BFM、UBFM和SBFM指令。這些是位域移動指令,是ARMv8用這些指令,因為為所有情況提供了別名。這些別名是已經(jīng)描述過的位域操作。[SU]XT[BHWX]、ASR/LSL/LSRimmediate、BFI、BFXIL、SBFIZ、SBFX、UBFIZ和UBFX。如果你熟悉ARMv7CLZ在寄存器中計數(shù)前導(dǎo)零位。REV反轉(zhuǎn)寄存器的字節(jié)順序。REV16反轉(zhuǎn)寄存器中每個半字的字節(jié)順序。REV32這些操作可以在word(32位)或雙字(64位)大小的寄存器上執(zhí)行,但REV32除外,它僅適用于64寄存器。A64間的大量使用。第4-6頁的處理器狀態(tài)描述了四個狀態(tài)標(biāo)志,零(Z)、負(fù)(N)、Carry(C)和溢出(V)表示這些位的值,用于標(biāo)志設(shè)置操作。如果一個無符號操作的結(jié)果溢出了結(jié)果寄存器,C標(biāo)志被設(shè)置。V標(biāo)志的操作方式與C簽名操作。條件標(biāo)志(NZCV)和條件代碼與A32和T32的相同。然而,A64增加了NV(0b1111),行為與它的補碼AL(0b1110)相同。這與A32不同,A32沒有給0b1111賦予任何意義。供這組指令是為了取代ARM代碼中條件執(zhí)行的常見用法。加/減例如,用于多精度算術(shù)和校驗和的傳統(tǒng)ARM帶有可選增量、否定或反轉(zhuǎn)的條件選擇這些是A32和T32絕對值。條件操作A64指令集只允許對程序流控制分支指令進行條件執(zhí)行。這與A32和T32可以用條件代碼來預(yù)測。這些可以總結(jié)為以有條件選擇(移動)CSEL根據(jù)一個條件在兩個寄存器之間進行選擇。無條件指令,然后是條件選擇,可以取CSINC根據(jù)一個條件在兩個寄存器之間進行選擇。返回第一個源寄存器或第二個源寄存CSINV根據(jù)條件在兩個寄存器之間進行選擇。返回第一個源寄存器或倒置的第二個源寄CSNEG根據(jù)條件在兩個寄存器之間進行選擇。返回第一個源寄存器或被否定的第二個源有條件設(shè)置有條件比較(CMP和CMN)將設(shè)置為指定的條件標(biāo)志狀態(tài)。條件比較指令對于表示嵌套或復(fù)合比較非常有用。CSINCCSINCX0,X1,X0,NE//SetthereturnregisterX0toX1ifZeroflagclear,elseincrementX0兩個源寄存器。CINCCINCX0,X0,LSCSETW0,EQ//elseW0=CSETMX0,//Iflessthanorsame(LS)thenX0=X0+//Ifthepreviouscomparisonwasequal(Z=1)thenW0=//IfnotequalthenX0=-1,elseX0=一種技術(shù),對if-then-else語句的兩個分支進行操作。然后在最后選擇正確的結(jié)果。例如,考慮簡單的Cifif(i==0)r=r+2;elser=r-CMPw0CMPw0,#0 //if(i==0)SUBw2,w1,#1 //r=r-1ADDw1,w1,#2 //r=r+2CSELw1,w1,w2,EQ//selectbetweenthetwo與之前的所有ARM處理器一樣,ARMv8架構(gòu)是一個加載/存儲架構(gòu)。這意味著沒有數(shù)據(jù)處理指令直接對提供了更多的選擇,如非時間性的加載/存儲,加載/存儲排他性,以及獲取/釋放。內(nèi)存指令可以以非對齊方式訪問普通內(nèi)存(見第13章內(nèi)存排序)釋放變體。如果不需要非對齊訪問,可以將其配置為故障。LoadLDRLDRRt,寸,在LDR指令中加入以下后綴之一:LDRB(8-bit,zeroextended).LDRSB(8-bit,signextended).LDRH(16-bit,zeroextended).LDRSH(16-bit,signextended).LDRSW(32-bit,signextended).還有一些非比例偏移的形式,如LDU(參見第6-14頁指定加載或存儲指令的地址)要明確使用LDUR形式,因為大多數(shù)匯編程序可以根據(jù)使用的偏移量選擇合適的版本。你不需要指定一個零擴展的負(fù)載到X寄存器,因為寫一個WSTRSTR還有一些非比例偏移的形式,如STU(參見第6-14頁的指定加載或存儲指令的地址)要明確使用STUR形式,因為大多數(shù)匯編程序可以根據(jù)使用的偏移量選擇合適的版本。要存儲的大小可能比寄存器小。你可以通過在STR中加入B或H是寄存器中最小的有效部分。加載和存儲指令也可以訪問浮點/NEON是B、H、S、D或Q寄存器中的任何一個。對于加載到FP/SIMD例如:LDRLDRD0,[X0,用X0加X1所指向的內(nèi)存地址的雙字加載寄存器D0浮點和標(biāo)量NEON在A64中,一個地址操作數(shù)的基寄存器必須總是一個X展,這樣就可以提供一個32位的偏移作為一個W寄存器。偏移尋址模式將一個立即數(shù)或一個可選擇修改的寄存器值添加到一個64址。通常,在指定移位或擴展選項時,移位量可以是以字節(jié)為單位的訪問大小的0(默認(rèn)值)或log2(Rn<<乘以訪問大?。?///ACexampleshowingaccessesthatacompilerislikelytogenerate.voidexample_dup(int32_ta[],int32_tlength){int32_tfirst=a[0]; //LDRW3,[X0]for(int32_ti=1;i<length;i++){a[i]= //STRW3,[X0,W2,SXTW,索引模式與偏移模式類似,但它們也更新基地址寄存器。這里的語法與A32和T32性更強。通常情況下,只能為索引模式提供即時偏移量。式。這些選項準(zhǔn)確地映射到一些常見的C////ACexampleshowingaccessesthatacompilerislikelytogenerate.voidexample_strcpy(char*dst,constchar*src)charc;do{c= //LDRBW2,[X1],*(dst++)= //STRBW2,[X0],}while(c!=A64執(zhí)行,但是它們的數(shù)據(jù)可以使用PC相對的內(nèi)存地址從周圍的代碼中訪問。文字池經(jīng)常被用來編碼常量值,這些常量值不適合用簡單的立即移動指令。在A32和T32中,PC可以像一個通用寄存器一樣被讀取,所以只需指定PC庫。在A64中,PC普遍不能被訪問,而是有一種特殊的尋址模式(僅用于加載指令)可以訪問與PC址。這種特殊的尋址模式也比A32和T32中的PC-relative加載所能達到的范圍要大得多。因此,文字池可以更稀疏地定位。A64不包括A32和T32代碼可以使用的LoadMultiple(LDM)或StoreMultiple(STM)在A64代碼中,有加載對(LDP)和存儲對(STP)指令。與A32的LDRD和STRD數(shù)寄存器都可以被讀取或?qū)懭?。?shù)據(jù)被讀入或?qū)懭胂噜彽膬?nèi)存位置。為這些指令所提供的尋址模式選項比其他內(nèi)存訪問指令的限制性更強。LDP和STP指令只能使用一個帶有7可選擇預(yù)增加或后增加。與32位的LDRD和STRD不同,LDP和STP可以進行無符號訪問。在EL0、EL2或EL3,它們表現(xiàn)為正常加載或存儲。當(dāng)在EL1執(zhí)行時,它們的行為就像是在EL0特權(quán)級別執(zhí)行的一樣。從內(nèi)存中預(yù)取(PRFM)用。這個提示的效果由實施者決定,但通常情況下,它導(dǎo)致數(shù)據(jù)或指令被加載到一個緩存中。PRFMPRFM<prfop>,<addr>|其中prfop PLDorPST(prefetchforloadorstore).TargetL1,L2,orL3(whichcachetotarget).PolicyKEEPorSTRM(keepincache,orstreaming這些指令與A32PLD和PLIARMv8中的一個新概念是非時間性的加載和存儲。這些是LDNP和STNP寫。它們還向內(nèi)存系統(tǒng)發(fā)出提示,說明緩存對該數(shù)據(jù)沒有用處。這個提示并不禁止內(nèi)存系統(tǒng)的活動,如地址的緩存、預(yù)加載或收集。然而,它表明緩存不太可能提高性能。一個典型的用例可能是流式數(shù)據(jù),但要注意,有效使用這些指令需要針對微架構(gòu)的方法。非時間性的加載和存儲放寬了內(nèi)存排序的要求。在上面的例子中,LDNP指令可能在前面的LDR被觀察到,這可能導(dǎo)致從X0的不確定地址讀取。LDRLDRX0,LDNPX2,X1,[X0]//XomaynotbeloadedwhentheinstructionLDRLDRX0,DMBLDNPX2,X1,個單獨的訪問。此外,浮點和SIMD內(nèi)存訪問不保證是原子的。ARMv7和ARMv8都提供了對不同屏障操作的支持。這些將在第13數(shù)據(jù)內(nèi)存屏障(DMB)。這迫使所有在程序中較早的內(nèi)存訪問在任何后續(xù)訪問之前成為全局可見。數(shù)據(jù)同步屏障(DSB)。所有懸而未決的加載和存儲、緩存維護指令以及所有的TLB維護指令,在程序繼續(xù)執(zhí)行之前都會完成。DSB的行為類似于DMB指令同步屏障(ISB)。這條指令刷新了CPU流水線和預(yù)取緩沖區(qū),導(dǎo)致ISB之后的指令被從緩存或ARMv8引入了單邊柵欄,它與釋放一致性模型有關(guān)。這些被稱為加載-獲?。↙DAR)和存儲-(STLR),是基于地址的同步原語。(參見第13-8頁的單向屏障。)柵欄。這些指令只支持基寄存器尋址,不提供偏移量或其他類型的索引尋址。ARMv7-A和ARMv8-A體系結(jié)構(gòu)都提供對獨占內(nèi)存訪問的支持。在A64中,這就是加載/LDXR得并保持鎖的情況下,Store-Exclusive指令才會向該位置寫入一個新的值。LDXR/STXR配對被用來構(gòu)建標(biāo)準(zhǔn)的同步原語,如自旋鎖。提供了一組成對的LDXRP和STXRP指令,以允許代碼原子地更新一個跨越兩個寄存器的位置。有字節(jié)、半字、字和雙字選項。與加載獲取/存儲釋放配對一樣,只支持基本寄存器尋址,沒有任何偏移。CLREX指令清除了監(jiān)視器,但與ARMv7不同的是,異常進入或返回也會清除監(jiān)視器。監(jiān)控器也可能被虛假地清除,例如,通過緩存驅(qū)逐或其他與應(yīng)用程序沒有直接關(guān)系的原因。軟件必須避免在成對的LDXRSTXR指令之間有任何顯式內(nèi)存訪問、系統(tǒng)控制寄存器更新或高速緩存維護指令。還有一對被稱為LDAXR和STLXR的負(fù)載獲取/存儲釋放指令的排他性。請看第14-6A64指令集提供了許多不同種類的分支指令(見表6-12)始的偏移量,使用B指令。無條件的簡單相對分支可以從當(dāng)前的程序計數(shù)器位置向后或向前分支,最多可達128MB。有條件的簡單相對分支,即在B指令上附加了一個條件代碼,其范圍較小,為±1MB。對子程序的調(diào)用,如果需要將返回地址保存在鏈接寄存器(X30)中,則使用BL指令。這條指令沒有條件版本。BL的行為和B指令一樣,有一個額外的效果,就是將返回地址,也就是BL在寄存器X30中。除了這些與PC有關(guān)的指令外,A64指令集還包括兩個絕對分支。BRXn指令執(zhí)行一個絕對分支到Xn中的地址,而BLRXn具有相同的效果,但也將返回地址存儲在X30中(鏈接寄存器)。RET指令的作用與Xn相似,但它提示分支預(yù)測邏輯它是一個函數(shù)返回。RET的默認(rèn)分支是指向X30中的地址,當(dāng)然也可以指定其他寄存器。A64比較。CBZRt,標(biāo)簽//如果為零,則進行比較和分支CBNZRt,標(biāo)簽//比較和分支,如果不是零這些指令將32位或64±1MB。這些指令不讀取或?qū)懭霔l件代碼標(biāo)志(NZCV)有兩種類似的測試和分支指令TBZRt,bit,label.//測試和分支,如果Rt為零TBNZRt,bit,label//如果Rt不是零,則測試和分支支。分支偏移的范圍是±32kB。與CBZ/CBNZ一樣,這些指令不讀取或?qū)懭霔l件代碼標(biāo)志(NZCV)。異常處理。系統(tǒng)注冊訪問。調(diào)試。提示指令,在許多系統(tǒng)中都有電源管理應(yīng)用程序。有三條異常處理指令,其目的是導(dǎo)致異常的發(fā)生。這些指令用于調(diào)用運行在操作系統(tǒng)(EL1)序(EL2)或安全監(jiān)控器(EL3)中更高的異常級別的代碼:SVC#imm16//主管調(diào)用,允許應(yīng)用程序調(diào)用內(nèi)核//(EL1)。#imm16 //虛擬機管理程序調(diào)用,允許操作系統(tǒng)代碼調(diào)用虛擬機管理程序(EL2)#imm16 //安全監(jiān)視器調(diào)用,允許操作系統(tǒng)或虛擬機管理程序調(diào)用安全//監(jiān)視器(EL3)異常綜合寄存器中的處理程序可以獲得立即數(shù)。這是對ARMv7的改變,在ARMv7取調(diào)用指令的操作碼來確定。更多信息請參見第10章AArch64異常處理。Xt,例如:MRSX4,ELR_EL1CopiesELR_EL1toX4MSR,Xt例如:MSRSPSR_EL1,X0//CopiesX0toMSRSPSel,#imm//Avalueof0or1inthisregisterisusedtoselect//betweenusingEL0stackpointerorthecurrent//levelstack這些指令有特殊形式可用于清除或設(shè)置單個異常掩碼位(見第4-5頁的保存進程狀態(tài)寄存器MSRDAIFClr,#imm4請參閱第4-7BRK#imm16//進入監(jiān)視器模式調(diào)試,其中有片上調(diào)試監(jiān)視器代碼HLT#imm16//進入停止模式調(diào)試,其中連接外部調(diào)試硬件有關(guān)調(diào)試的信息,請參閱第18NOP //Nooperation-notguaranteedtotaketimetoexecuteYIELD //Hintthatthecurrentthreadisperformingataskthat//canbeswappedoutWFE //WaitforEventWFI //WaitforinterruptSEV //SendEventSEVL //SendEvent這些概念也包含在第14章多核處理器和第15NEON指令集也有一些增強功能,其中一些是相當(dāng)重要的。第7章AArch64浮點和NEON這些。A64中NEON的變化包括支持雙精度浮點,使得用雙精度浮點的C代碼能夠向量化。對存儲在NEON寄存器中的標(biāo)量數(shù)據(jù)進行操作的新指令。插入和提取矢量元素的新指令。用于類型轉(zhuǎn)換和飽和整數(shù)運算的新指令。浮點值規(guī)范化的新指令。新的跨線指令用于向量減少、求和、取最小或最大值。執(zhí)行諸如比較、加法、查找絕對值和否定等操作的指令已被擴展到能夠?qū)?4位整數(shù)元素進行操作。A64提供了一套類似于ARMv7-AVFPv4擴展的浮點指令,它提供了對標(biāo)量浮點值的單精度和雙精度數(shù)學(xué)浮點比較直接設(shè)置條件標(biāo)志(NZCV)。在A64中,無需顯式地將比較結(jié)果從浮點傳輸?shù)秸麛?shù)標(biāo)已經(jīng)添加了有關(guān)IEEE754-2008標(biāo)準(zhǔn)的說明,例如計算一對數(shù)字的最小值和最大值。在從整數(shù)到浮點格式的轉(zhuǎn)換中,現(xiàn)在可以明確指定舍入模式。當(dāng)需要在特定的舍入模式下進行簡單轉(zhuǎn)換時,不再需要設(shè)置全局FPCR標(biāo)志。其中一些選項也適用于ARMv8A32和T32。添加了支持64位整數(shù)和浮點格式之間轉(zhuǎn)換的說明。在A64中,涉及整數(shù)類型的浮點操作直接在整數(shù)寄存器上工作。不需要手動在浮點和整數(shù)寄存器之ARMv8的可選擴展增加了加密指令,大大改善了AES加密以及SHA1和SHA256 第七 AArch64浮點數(shù)和 AArch32(相當(dāng)于ARMv7NEON指令)和AArch64均有NEON指令集。兩者均可用于處理大量數(shù)據(jù)中重AArch64的NEON架構(gòu)使用32×128位寄存器,是ARMv7的兩倍。這些寄存器與浮點指令使用的寄存所有標(biāo)準(zhǔn)ARMv8實現(xiàn)都需要浮點數(shù)和NEON。然而,針對特定市場,目前浮點數(shù),SMID和NEON有以下沒有NEON支持完整的異常捕獲浮點數(shù)和SIMD支持完整的浮點數(shù)和SIMDAArch64NEON在現(xiàn)有AArch32NEON的基礎(chǔ)上進行了以下改動>現(xiàn)在有32個128位寄存器,而在ARMv7中只具有16較小的寄存器不再被打包到較大的寄存器中,而是一對一地映射到128使用低32位,而雙精度浮點數(shù)使用128位寄存器的低64位。詳細內(nèi)容請參考本章第二小節(jié)的內(nèi)容.>ARMv7-ANEON指令中的前綴V>向向量寄存器寫入64>在AArch64中,無法采用通用寄存器上執(zhí)行SIMD或飽和算術(shù)指令,該類操作需要使用NEON>提供了用于生成或使用128位向量寄存器的高64令,他會生成一個以上的結(jié)果寄存器(擴大到256位向量),或消耗兩個源(縮小到一個128位向量),。>一組新的向量規(guī)約操作提供了跨通道和(across-lanesum)>一些現(xiàn)有的指令已經(jīng)擴展到支持64>AArch64NEON支持雙精度浮點和全精度浮點操作,包括舍入模式、非規(guī)范化數(shù)字和NaN通過以下更改,AArch64中的浮點功能得到了增強:>將ARMv7-A浮點指令中的前綴V替換為支持IEEE754浮點標(biāo)準(zhǔn)定義的單精度(32位)和雙精度(64位)浮點向量數(shù)據(jù)類型和算法,支持FPCR舍入模式字段(FPCRRoundingModefield)、默認(rèn)NaN控件、刷新到零控件(Flush-to-Zero)陷阱啟用位(在實現(xiàn)方案支持的情況下)>FP/NEON寄存器的加載/存儲尋址模式與整數(shù)加載/>支持浮點操作中的條件選擇和比較指令,其等效于整數(shù)操作中的條件選擇指令CSEL和比較指令CCMP>所有浮點乘加(Multiply-Add)和乘減(Multiply-Subtrac)融合乘法是在VFPv4中引入的,這意味著乘法的結(jié)果在用于加法之前不會四舍五入。在早期的ARM浮點精度的。提供了額外的轉(zhuǎn)換操作,例如,64將浮點轉(zhuǎn)換為整數(shù)的指令(FCVTxU、FCVTxS)將直接采有向舍入的方式進行編碼:—趨近于————>添加了具有把浮點數(shù)四舍五入到最近整數(shù)的指令一種新的雙精度到單精度的向下轉(zhuǎn)換指令,其不精確取整到奇數(shù),可以通過FCVTXN半精度。>添加了FMINNM和FMAXNM指令,這兩個指令用來實現(xiàn)IEEE754-2008中的操作minNum()maxNum()。如果其中一個操作數(shù)是靜態(tài)NaNNEON的數(shù)據(jù)值。NEON通常,每個NEON指令有n個并行操作,其中n溢出到另一個通道的。向量中元素的順序是從最低有效位開始的。這意味著元素0使用寄存器的低有效位。NEON>32位單精度和64注意:16位浮點數(shù)也是支持的,但它僅作為轉(zhuǎn)換自/>8位、16位、32位或64>8位和16多項式類型用于代碼,比如進行錯誤糾正,使用的是有限域的2的冪或者{0,1}上的簡單多項式,普通整數(shù)代碼通常使用查找表來進行有限域運算。AArch64NEON提供了使用大型查找表的指令。乘法運算合成其他更復(fù)雜的運算。NEON將寄存器看作32個128位的四字寄存器V0-V31,如下圖7-1所示圖1V32個64位D或雙字寄存器D0-D31,每個寄存器如圖7-2圖2D當(dāng)?shù)囊晥D。在AArch64中,浮點單元將NEON寄存器看作>32個64位寄存器D0-D31。D>32個32位寄存器S0-S31。S>32個16位寄存器H0-H31。H>上述3圖3標(biāo)量數(shù)據(jù)和標(biāo)量數(shù)據(jù)指的是單個值,而不是包含多個值的向量。有些NEON是通過向量的索引值來訪問。Vd.Ts[index1],Vn.Ts[index2]Vd如下面的例子INSV0.S[1],圖4插入一個元素到向量中INSV0.S[1],在指令MOVV0.B[3],W0中,將寄存器W0的最低字節(jié)復(fù)制到寄存器V0圖5移動一個標(biāo)量到通道中MOVV0.B[

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論