999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

龍芯指令系統(tǒng)架構(gòu)技術(shù)

2023-01-30 10:23:32胡偉武汪文祥吳瑞陽王煥東徐成華張福新
計算機研究與發(fā)展 2023年1期
關(guān)鍵詞:指令

胡偉武 汪文祥 吳瑞陽 王煥東 曾 露 徐成華 高 翔 張福新

1 (中國科學(xué)院計算技術(shù)研究所 北京 100190)

2 (中國科學(xué)院大學(xué) 北京 100049)

3 (龍芯中科技術(shù)股份有限公司 北京 100095)

4 (處理器芯片全國重點實驗室(中國科學(xué)院計算技術(shù)研究所) 北京 100190) (hww@loongson.cn)

我國的CPU研發(fā)應(yīng)采用兼容指令系統(tǒng)還是自主研發(fā)指令系統(tǒng)是學(xué)術(shù)界和產(chǎn)業(yè)界長期爭論的一個話題.兼容指令系統(tǒng)的優(yōu)點是可利用現(xiàn)有的成熟軟件生態(tài),缺點是長遠發(fā)展受制于人且不利于自主軟件產(chǎn)業(yè)的發(fā)展.自主研發(fā)指令系統(tǒng)則反之.本文介紹充分考慮兼容需求的龍芯自主研發(fā)指令系統(tǒng)架構(gòu)——龍架構(gòu)(Loongson instruction set architecture, LoongArch).龍架構(gòu)[1]包括基礎(chǔ)部分、向量擴展、虛擬化和二進制翻譯擴展3個擴展部分,共計近2 000條指令.

LoongArch具有自主設(shè)計、技術(shù)先進、兼容生態(tài)3方面特點.LoongArch從整個架構(gòu)的頂層規(guī)劃,到各部分的功能定義,再到細節(jié)上每條指令和每個寄存器的編碼、名稱、含義,全部自主重新設(shè)計,具有充分的自主性.龍架構(gòu)摒棄了傳統(tǒng)指令系統(tǒng)中部分不適應(yīng)當(dāng)前軟硬件設(shè)計技術(shù)發(fā)展趨勢的陳舊內(nèi)容,吸納了近年來指令系統(tǒng)設(shè)計領(lǐng)域諸多先進的技術(shù)發(fā)展成果,易于硬件的高性能低功耗設(shè)計和軟件的編譯優(yōu)化以及操作系統(tǒng)、虛擬機的開發(fā).龍架構(gòu)在設(shè)計時充分考慮兼容生態(tài)需求,融合了包括x86,ARM在內(nèi)國際主流指令系統(tǒng)的主要功能特性,同時依托龍芯團隊在二進制翻譯方面十余年的技術(shù)積累創(chuàng)新,不僅能夠?qū)崿F(xiàn)現(xiàn)有龍芯電腦上應(yīng)用二進制的無損遷移,而且能夠?qū)崿F(xiàn)多種國際主流指令系統(tǒng)的高效二進制翻譯.

軟件生態(tài)是龍芯指令系統(tǒng)架構(gòu)能否成功的基礎(chǔ)和關(guān)鍵.除了遷移BIOS和操作系統(tǒng)內(nèi)核到LoongArch,還需要3+3+3的主要編譯系統(tǒng).第1個“3”是指3個高級語言編譯器,包括GCC,LLVM和GoLang.第2個“3”是指 3個重要虛擬機,包括 Java,JavaScript和.NET.第3個“3”是指3個二進制翻譯系統(tǒng),包括從MIPS到LoongArch的二進制翻譯系統(tǒng)、從x86到LoongArch的二進制翻譯系統(tǒng)和從ARM到LoongArch的二進制翻譯系統(tǒng).在上述“3+3+3”主要編譯系統(tǒng)的基礎(chǔ)上,能夠突破指令系統(tǒng)的壁壘,構(gòu)建LoongArch的軟件生態(tài)體系.

支持LoongArch的龍芯3A5000處理器[2]芯片已經(jīng)成功量產(chǎn).在3A5000上成功運行了完整的Linux操作系統(tǒng),并通過二進制翻譯技術(shù)高效運行原有龍芯計算機上的MIPS應(yīng)用、x86計算機Linux和Windows系統(tǒng)上的各種應(yīng)用.實測結(jié)果表明,在相同微結(jié)構(gòu)的情況下,LoongArch的應(yīng)用性能普遍優(yōu)于MIPS,部分應(yīng)用的性能提高超過 40%.SPEC CPU2000 從 MIPS到LoongArch的二進制翻譯效率達90%以上,從x86到LoongArch的二進制翻譯定點和浮點效率分別為QEMU[3]的3.6倍和47.0倍.上述測試結(jié)果表明,同時實現(xiàn)兼顧自主和兼容的指令系統(tǒng)是可行的,為建立自主可控的信息技術(shù)體系和產(chǎn)業(yè)生態(tài)打下堅實的基礎(chǔ).

1 LoongArch介紹

LoongArch繼承了精簡指令集計算機(reduced instruction set computer ,RISC)的設(shè)計傳統(tǒng),其指令長度固定且編碼格式規(guī)整,大多數(shù)指令為三操作數(shù),僅有l(wèi)oad/store訪存指令可以訪問內(nèi)存.龍架構(gòu)按照地址空間大小可分為32位和64位2個版本,分別簡稱為LoongArch32和 LoongArch64,LoongArch64應(yīng)用級向下二進制兼容LoongArch32.下面從指令編碼、組成部分和對二進制翻譯的支持3個方面對龍架構(gòu)進行介紹.

1.1 指令編碼

LoongArch中的所有指令長度均為32位,且要求指令地址4字節(jié)邊界對齊,當(dāng)指令地址不對齊時將觸發(fā)地址錯例外.

LoongArch中指令編碼風(fēng)格規(guī)整.所有寄存器操作數(shù)域都從第0位開始從低到高依次擺放,操作碼都是從第31位開始從高到低依次擺放.如果指令中包含立即數(shù)操作數(shù),那么立即數(shù)域位于寄存器域和操作碼域之間,根據(jù)不同指令類型有不同的長度.具體來說, 包含9種典型的指令編碼格式,即3種不含立即數(shù)的編碼格式2R,3R,4R, 以及6種含立即數(shù)的編碼格式 2RI8,2RI12,2RI14,2RI16,1RI21,I26.圖1給出了這9種典型編碼格式的具體定義.

1.2 組成部分

LoongArch采用基礎(chǔ)部分加擴展部分的模塊化組織形式.一個兼容龍架構(gòu)的CPU,除實現(xiàn)必需的基礎(chǔ)部分(Loongson base, LBase)外,可根據(jù)實際需求選擇實現(xiàn)各擴展部分.目前龍架構(gòu)已定義的擴展部分包括:虛擬化(Loongson virtualization, LVZ)擴展、二進制翻譯(Loongson binary translation, LBT)擴 展、128位向量擴展(Loongson SIMD extension, LSX)和 256位高級向量擴展(Loongson advanced SIMD extension,LASX).

Fig.1 Instruction encoding format of LoongArch圖1 LoongArch指令編碼格式

LoongArch的基礎(chǔ)部分包含用戶態(tài)和核心態(tài)2方面內(nèi)容.用戶態(tài)部分定義了常用的整數(shù)和浮點數(shù)指令,能夠充分支持現(xiàn)有各主流編譯系統(tǒng)生成高效的目標代碼.核心態(tài)部分在處理器特權(quán)等級、例外和中斷處理、存儲管理以及配套的控制狀態(tài)寄存器等方面給出了明確規(guī)范,旨在支持目前主流的類Unix操作系統(tǒng).與龍芯CPU原來實現(xiàn)的MIPS架構(gòu)相比,龍芯基礎(chǔ)架構(gòu)充分利用后發(fā)優(yōu)勢,摒棄了傳統(tǒng)指令系統(tǒng)中部分不適應(yīng)當(dāng)前軟硬件設(shè)計技術(shù)發(fā)展趨勢的陳舊內(nèi)容,同時積極吸納了近年來指令系統(tǒng)設(shè)計領(lǐng)域諸多先進的技術(shù)發(fā)展成果,主要特點包括:

1)取消傳統(tǒng)RISC指令系統(tǒng)中一些過時指令.包括取消陷阱指令和進行溢出判斷的運算指令,整數(shù)乘除運算的結(jié)果將直接寫入通用寄存器而非單獨的HI/LO寄存器.這些過時指令或者不利于指令流水線的高效實現(xiàn),或者當(dāng)前主流編程語言已經(jīng)很少使用.

2)增加一些便于實現(xiàn)且有利于軟件提高性能的指令.引入基于PC的運算指令并為間接跳轉(zhuǎn)指令添加立即數(shù)偏移,同時增加相對PC跳轉(zhuǎn)指令的偏移范圍,這些調(diào)整有利于改善位置無關(guān)代碼中長跳轉(zhuǎn)和數(shù)據(jù)訪問的指令(序列)的執(zhí)行效率,并且能夠大幅度減小全局偏移表(global offset table,GOT)的規(guī)模,從而降低因GOT規(guī)模過大帶來的維護和訪問開銷.增加原子訪存修改指令,解決傳統(tǒng)LL/SC指令在大規(guī)模并發(fā)執(zhí)行情況下失效重試開銷急劇增加的問題.

3)取消轉(zhuǎn)移指令延遲槽.對于現(xiàn)代多發(fā)射的亂序動態(tài)流水線,延遲槽無法起到提升性能的作用,還容易成為實現(xiàn)負擔(dān).

4)由硬件負責(zé)處理所有流水線的沖突,允許普通訪存指令的地址非對齊訪問,由硬件維護指令和數(shù)據(jù)緩存之間的數(shù)據(jù)一致性.這些功能簡化了軟硬件的界面,降低了應(yīng)用遷移的成本.

5)優(yōu)化處理器特權(quán)態(tài)、例外系統(tǒng)和計時系統(tǒng).處理器特權(quán)等級從MIPS的用戶態(tài)、監(jiān)管態(tài)和核心態(tài)3個狀態(tài)調(diào)整為 PLV0,PLV1,PLV2,PLV3 四個狀態(tài).例外系統(tǒng)從多個例外公用入口調(diào)整為每個例外獨立入口.計時系統(tǒng)的計時頻率恒定,不再隨處理器核頻率變化而變動,消除處理器動態(tài)功耗管理帶來的問題.

6)取消地址空間的固定分段方式以及地址段與特權(quán)等級、映射方式間的固定綁定,代之以單一平整(flat)尋址空間且所有存儲管理配置信息軟件均可動態(tài)調(diào)整.

7)支持控制寄存器的原子修改、規(guī)范核外控制寄存器且使用獨立的尋址空間.增加控制寄存器的原子修改支持以簡化系統(tǒng)軟件實現(xiàn).大幅度拓展核內(nèi)控制寄存器尋址空間,為指令系統(tǒng)核心態(tài)部分的后續(xù)演進解除束縛.規(guī)范核外控制器并使用獨立的尋址空間,將各種多核多路系統(tǒng)的底層硬件信息封裝為固定統(tǒng)一格式呈現(xiàn)給軟件.

LoongArch的虛擬化擴展部分定義了一系列硬件支持特性,旨在提升系統(tǒng)虛擬化實現(xiàn)的性能,涉及處理器虛擬化、內(nèi)存虛擬化和I/O虛擬化3個方面.其具體內(nèi)容主要包括客戶機專用的運行模式和特權(quán)資源、例外分級處理、2級地址翻譯加速以及中斷虛擬化.

LoongArch的二進制翻譯擴展部分引入了一系列硬件特性,進而以軟硬件協(xié)同的方式大幅度提升跨指令系統(tǒng)二進制翻譯執(zhí)行效率.有關(guān)這部分的詳細介紹將在本文的2.2節(jié)展開.

LoongArch下的向量擴展部分定義了一系列單指令多數(shù)據(jù)(SIMD)指令,利用數(shù)據(jù)級并行性提升程序執(zhí)行性能.向量擴展部分可進一步分為向量擴展(LSX)和高級向量擴展(LASX),后者在前者基礎(chǔ)上將操作向量位寬從128位增至256位并進一步擴展.

上述基礎(chǔ)部分加擴展部分的組成形式對于Loong-Arch32和LoongArch64架構(gòu)均適用.從功能角度而言,各部分中屬于LoongArch32的內(nèi)容均包含在LoongArch64中.各部分中的用戶態(tài)相關(guān)內(nèi)容,LoongArch64向下二進制兼容LoongArch32.

1.3 LoongArch的ABI優(yōu)化

LoongArch的應(yīng)用程序二進制接口(application binary interface, ABI)與龍芯 CPU 原使用 MIPS 相比對寄存器使用約定進行了優(yōu)化.表1和表2分別是64位MIPS和LoongArch的通用寄存器使用約定.與MIPS相比,LoongArch有5方面差異:

1)取消了匯編暫存器(at).MIPS的一些匯編宏指令由多條硬件指令合成,匯編暫存器用于數(shù)據(jù)周轉(zhuǎn).LoongArch指令系統(tǒng)的宏指令可以不用周轉(zhuǎn)寄存器或者顯式指定周轉(zhuǎn)寄存器,匯編暫存器不再必要了,這可以增加編譯器可用寄存器的數(shù)量.

2)取消了預(yù)留給內(nèi)核的專用寄存器(k0/k1).MIPS預(yù)留2個寄存器的目的是支持高效異常處理,可以省去異常處理過程中保存上下文到內(nèi)存中的開銷.LoongArch提供了數(shù)據(jù)保存狀態(tài)控制寄存器來高效暫存數(shù)據(jù),可以在不預(yù)留通用寄存器的情況下保持高效實現(xiàn),給編譯器留下了更多的可用寄存器.

3)取消了gp寄存器.MIPS中用gp寄存器指向GOT以協(xié)助動態(tài)鏈接器計算可重定位的代碼模塊的相關(guān)符號位置.LoongArch指令集支持基于PC的運算指令,能夠用其他高效的方式實現(xiàn)動態(tài)鏈接,不再需要額外花費一個通用寄存器.

Table 1 MIPS N64 Integer Register Usage Convention表1 MIPS N64 定點寄存器使用約定

Table 2 LoongArch64 Integer Register Usage Convention表2 LoongArch64 定點寄存器使用約定

4)復(fù)用參數(shù)寄存器和返回值寄存器,參數(shù)寄存器a0/a1也被用作返回值寄存器.這也是現(xiàn)代指令系統(tǒng)比較常見的做法,它進一步增加了編譯器可用的通用寄存器的數(shù)量.

5)增加了線程指針寄存器tp,用于高效支持多線程實現(xiàn),它總是指向當(dāng)前線程私有存儲(thread local storage, TLS)區(qū)域.

1.4 LoongArch對二進制翻譯的支持

二進制翻譯技術(shù)是實現(xiàn)跨指令系統(tǒng)兼容的重要手段.二進制翻譯技術(shù)在宿主機(host)上用軟件模擬出一個目標機/客戶機(guest)指令系統(tǒng)兼容的CPU,從而在宿主機上執(zhí)行客戶機的二進制代碼.如在LoongArch計算機上模擬x86指令系統(tǒng),從而實現(xiàn)與x86兼容.二進制翻譯的最大問題是效率問題,用軟件模擬的CPU比硬件直接實現(xiàn)的CPU慢很多,一般有數(shù)量級的差異.

通過硬件支持和軟硬件協(xié)同可以有效提高二進制翻譯的效率.LoongArch在認真分析 x86,ARM,MIPS,RISC-V指令系統(tǒng)主要特點的基礎(chǔ)上,增加了為提高x86,ARM,MIPS,RISC-V二進制翻譯性能至關(guān)重要的指令功能.下面舉例說明LoongArch對x86二進制翻譯的具體支持.

1)增加生成運算標志的運算指令以及根據(jù)運算標志生成轉(zhuǎn)移條件的指令.x86定義了獨立的運算結(jié)果標志寄存器EFLAGS,由運算指令在產(chǎn)生結(jié)果數(shù)值的同時予以更新,轉(zhuǎn)移指令依據(jù)EFLAGS的值進行跳轉(zhuǎn)判斷.若采用純軟件方式模擬一條x86運算指令對于EFLAGS的更新需要幾十條指令.圖2(b)給出了模擬圖2(a)中x86指令“SUB ECX,EDX”運算結(jié)果及常用的四位標志(SF,ZF,OF,CF)的 LoongArch 基礎(chǔ)指令序列所需要的近30條指令.為了降低軟件模擬運算結(jié)果標志的二進制翻譯開銷,LoongArch定義了一組專門用于產(chǎn)生x86運算結(jié)果標志的指令,這類指令僅將運算結(jié)果標志寫入到通用寄存器中.同時,LoongArch還定義了根據(jù)通用寄存器中的運算結(jié)果標志值,生成x86轉(zhuǎn)移指令相對應(yīng)的轉(zhuǎn)移條件的指令.圖2(c)給出了采用二進制翻譯擴展的LoongArch翻譯圖2(a)中x86指令“SUB ECX,EDX”的指令序列,與僅采用基礎(chǔ)指令的翻譯結(jié)果相比指令數(shù)大幅度減少.

Fig.2 Example of x86 EFLAGS translation圖2 x86 EFLAGS 翻譯示例

2)增加x86浮點寄存器特殊尋址模式和數(shù)據(jù)格式的支持.x86架構(gòu)的x87浮點部件有8個浮點寄存器采用棧尋址模式,即x86浮點指令碼中只有所訪問寄存器相對于棧頂?shù)钠浦担浼由细↑c狀態(tài)字中的TOP域的值才是要訪問的寄存器編號.如果在二進制翻譯中動態(tài)計算上述浮點寄存器號,每條訪問浮點寄存器的浮點指令需額外花費多條指令.為解決這一問題,LoongArch定義了3位的TOP寄存器、浮點寄存器的TOP尋址模式以及用于操作TOP寄存器和切換TOP尋址模式的指令.當(dāng)處于TOP尋址模式時,普通浮點指令中浮點操作數(shù)的寄存器號都是這些域的值與TOP寄存器中的值相加后的結(jié)果, 從而省去了軟件計算實際寄存器號的翻譯開銷.此外,x87浮點部件支持40位的擴展單精度和80位的擴展雙精度浮點運算,與RISC處理器中32位單精度和64位雙精度不同,為此LoongArch定義了將x87的浮點數(shù)與LoongArch的浮點數(shù)進行格式轉(zhuǎn)換的指令.

3)擴展TLB MMU功能支持客戶機虛地址到宿主機實地址的硬件直接翻譯.系統(tǒng)級二進制翻譯過程中所有客戶機訪存指令都要2級虛實地址轉(zhuǎn)換,即先把客戶機的虛地址翻譯成客戶機的物理地址,再將客戶機的物理地址作為宿主機的虛地址翻譯成宿主機的物理地址.在QEMU[1]中,客戶機虛地址到客戶機物理地址的轉(zhuǎn)換是通過軟件模擬完成的.圖3(b)中給出模擬圖3(a)中x86訪存指令時,使用LoongArch基礎(chǔ)指令模擬將客戶機虛地址轉(zhuǎn)化為客戶機物理地址所需的指令序列,共有14條指令且其中包含2條訪存.為降低實現(xiàn)開銷,LoongArch的TLB可以同時存放“宿主機虛地址=>宿主機物理地址”和“客戶機虛地址=>宿主機物理地址”2種類型的頁表項,前一類型的頁表項由宿主機操作系統(tǒng)中的普通頁表提供,后一類型的頁表項由二進制翻譯虛擬機中維護的影子頁表提供.2類頁表項在填入TLB的過程中將被標記上不同的頁表類型標識.訪存指令在查找TLB的過程中,也將根據(jù)自身攜帶的是宿主機虛地址還是客戶機虛地址,僅查找頁表類型標識與之對應(yīng)的TLB表項.當(dāng)查找過程發(fā)生異常時,不同頁表類型標識所觸發(fā)的TLB例外類型及其入口也不同.訪存指令所攜帶虛地址的類型判定,可以采用預(yù)設(shè)地址空間或訪存指令前綴指定2種方式.圖3(c)中給出了采用前綴指令方式判定的翻譯指令序列,只需要2條指令.具體的芯片實現(xiàn)還可以選擇用未使用的某些虛擬地址位來表示地址空間,這樣可進一步省去前綴指令,只需要一條指令.

Fig.3 Example of x86 memory access instruction translation圖3 x86訪存指令翻譯示例

4)增加宿主機寄存器數(shù)量,避免用宿主機的內(nèi)存模擬客戶機的寄存器.對客戶機寄存器的高效模擬是提高二進制翻譯性能的關(guān)鍵.如果宿主機沒有足夠的寄存器,用內(nèi)存單元來模擬目標機器的寄存器,就會大幅度降低性能.x86有8個通用寄存器、8個浮點寄存器和16個256位的浮點/向量混用寄存器,少于RISC架構(gòu)下通用寄存器、浮點/向量寄存器的個數(shù),可以采用一一對應(yīng)的模擬方式.在MIPS等RISC架構(gòu)中,采用一一對應(yīng)的模擬方式極容易出現(xiàn)翻譯過程中無臨時寄存器可用的情況.為此LoongArch定義了若干便簽寄存器,用于二進制翻譯系統(tǒng)臨時存儲數(shù)據(jù).

2 龍芯3A5000及其軟件生態(tài)建設(shè)

2.1 龍芯3A5000處理器及其計算機系統(tǒng)

龍芯3A5000是實現(xiàn)LoongArch的第一款龍芯處理器.龍芯3A5000通過片上交叉開關(guān)集成4個64位的四發(fā)射超標量LA464處理器核、16 MB共享三級緩存、2個64位DDR4內(nèi)存接口、2個16位Hyper-Transport3.0接口.3A5000使用12 nm工藝實現(xiàn),主頻2.3~2.5 GHz,內(nèi)存控制器接口速率為 DDR4-3200,Hyper-Transport接口速率為6.4 Gbps.3A5000通過HyperTransport接口連接龍芯7A1000或7A2000橋片,并通過橋片連接硬盤、網(wǎng)絡(luò)、顯示器等組成計算機系統(tǒng).龍芯3A5000四核處理器結(jié)構(gòu)如圖4所示,其中左半邊為LA464處理器核結(jié)構(gòu),右半邊為3A5000處理器頂層結(jié)構(gòu).

LA464處理器核采用四發(fā)射亂序執(zhí)行結(jié)構(gòu).基本流水線包括PC、取指、預(yù)譯碼、譯碼I、譯碼II、寄存器重命名、調(diào)度、發(fā)射、讀寄存器、執(zhí)行、提交I和提交II共12級.具有4個定點運算部件、2個全功能浮點運算部件、2個訪存部件.重排序緩存為128項,定點、浮點、訪存3個發(fā)射隊列各為32項.定點和浮點物理寄存器堆各128項.一級指令緩存和一級數(shù)據(jù)緩存均為 4路組相聯(lián),各 64 KB,二級犧牲(Victim)緩存為 16 路組相聯(lián),共 256 KB,緩存行大小均為 64 B.支持非阻塞存儲訪問的訪存部件的Load隊列64項,Store隊列48項,每個處理器核具有16項失效隊列,用于處理核內(nèi)緩存失效訪問的訪存請求.LA464使用基于目錄(directory)的 MESI緩存一致性(cache coherency)協(xié)議.

Fig.4 Architecture of 3A5000 and LA464 processor core圖4 3A5000及LA464處理器核架構(gòu)

2.2 龍芯3A5000的軟件生態(tài)建設(shè)

軟件生態(tài)是龍LoongArch能否成功的基礎(chǔ)和關(guān)鍵.龍芯3A5000的軟件生態(tài)建設(shè)以Loongnix Linux社區(qū)發(fā)行版[4]構(gòu)建為抓手,以前述“3+3+3”的主要編譯系統(tǒng)為核心,經(jīng)過約3年的時間構(gòu)建了LoongArch架構(gòu)的基礎(chǔ)軟件生態(tài).

Loongnix是支持LoongArch架構(gòu)的開源社區(qū)版Linux操作系統(tǒng).基于開源的debian 10發(fā)行版[5]移植適配的Loongnix在構(gòu)建過程中共計完成24 300多個操作系統(tǒng)源碼包、58 100多個操作系統(tǒng)二進制包,與架構(gòu)相關(guān)的適配源碼量超過40萬行.

“3+3+3”的主要編譯系統(tǒng)是生態(tài)建設(shè)的核心.GCC,LLVM和GoLang三個編譯器,以及Java,JavaScript和.NET三個虛擬機能夠基本滿足典型Linux發(fā)行版中軟件包遷移以及新應(yīng)用開發(fā)的需求.而3個二進制翻譯系統(tǒng)則為復(fù)用已有主流架構(gòu)的軟件提供了有效渠道.

3A5000基礎(chǔ)生態(tài)構(gòu)建大致可分為4個階段:第1個階段是GCC交叉編譯工具鏈與模擬器研發(fā),達到可生成LoongArch架構(gòu)代碼并在模擬器上運行相關(guān)代碼的目標;第2個階段是構(gòu)建最小Linux系統(tǒng),完成BIOS、內(nèi)核開發(fā),遷移常見的Linux命令行工具,生成初始根文件系統(tǒng);第3個階段是更多軟件的移植,包括GCC之外的各編譯系統(tǒng)以及Chrome瀏覽器、KVM和Docker等關(guān)鍵基礎(chǔ)軟件;第4個階段是上游社區(qū)建設(shè)與第三方軟件適配.前3個階段分別耗時約6個月,初步形成了一個較為完整的基于開源軟件的生態(tài)體系.第4個階段在大約18個月的時間內(nèi),使得LoongArch生態(tài)基本達到了龍芯原有MIPS生態(tài)的成熟程度:進行了大量軟硬件磨合優(yōu)化工作,通過二進制翻譯系統(tǒng)實現(xiàn)了一批常見Windows應(yīng)用的高效兼容運行,完成了常用的國產(chǎn)操作系統(tǒng)、辦公軟件、云和安全軟件等重要商業(yè)軟件的適配,實現(xiàn)了基于LoongArch的產(chǎn)品批量銷售.

這4個階段總體上應(yīng)用了3個策略:先模擬后真機、先開源后商業(yè)、開源開放.在實現(xiàn)新指令系統(tǒng)的CPU產(chǎn)品化之前,只能通過模擬器進行基礎(chǔ)軟件棧的研發(fā)和技術(shù)驗證.前2個階段和第3個階段的一部分都是在模擬環(huán)境中進行的,我們設(shè)計了能夠精確模擬真實硬件的模擬環(huán)境,并采用二進制翻譯優(yōu)化技術(shù)提升其運行效率以滿足大規(guī)模軟件開發(fā)的需求.而蓬勃發(fā)展的開源軟件運動,則極大地降低了構(gòu)建基礎(chǔ)生態(tài)的門檻,使得LoongArch能夠在較短時間內(nèi)初步形成軟件基礎(chǔ)生態(tài).龍芯團隊采用開源開放的模式維護LoongArch的軟件基礎(chǔ)生態(tài),有效促進了第三方商業(yè)軟件的遷移適配.

龍芯3A5000的軟件生態(tài)構(gòu)建實踐表明,在深入掌握“3+3+3”的主要編譯系統(tǒng)技術(shù)的基礎(chǔ)上,充分利用開源軟件生態(tài),在較短的時間內(nèi)構(gòu)建一個新指令系統(tǒng)的生態(tài)是可行的.

3 龍芯體系結(jié)構(gòu)翻譯器

通過跨指令系統(tǒng)的二進制翻譯來豐富宿主機的生態(tài)是業(yè)界常用的手段.自20世紀90年代開始,伴隨著體系結(jié)構(gòu)的多樣化浪潮,多種宿主機指令系統(tǒng)均針對x86目標機提出了各自的二進制翻譯平臺,例如,Digital FX!32[5]用于 Alpha 宿主機系統(tǒng),IA-32 EL[6]用 于 安 騰(Itanium)宿 主 機 , Transmeta CMS[7]用 于Transmeta VLIW指令系統(tǒng).此外,IBM公司以 Power體系結(jié)構(gòu)為目標機,提出了DAISY[8]二進制翻譯系統(tǒng),以支持其IBM VLIW指令系統(tǒng)的推廣.上述二進制翻譯系統(tǒng)能夠?qū)崿F(xiàn)較高的執(zhí)行效率,例如,F(xiàn)X!32在 500 MHz Alpha 處理器上達到了 200 MHz x86 處理的性能,IA32 EL 在執(zhí)行部分 SPEC CPU2000 定點測試時能夠平均達到本地編譯執(zhí)行效率的60%.

移動計算和云計算使得計算平臺由傳統(tǒng)的單一指令系統(tǒng)向多指令系統(tǒng)發(fā)展,催生了計算機系統(tǒng)對多種目標機的適應(yīng)性的新需求.QEMU是一種廣泛應(yīng)用的可移植二進制翻譯系統(tǒng),能夠適用于多種目標機(如 x86, PowerPC, ARM, Sparc and MIPS)和宿主機.然而,QEMU的可移植性以大量犧牲模擬效率為代價,未經(jīng)優(yōu)化的QEMU模擬執(zhí)行速度經(jīng)常不到本地編譯執(zhí)行速度的10%.其根本原因是QEMU為實現(xiàn)對多目標機和多宿主機的兼容,使用體系結(jié)構(gòu)無關(guān)的中間代碼,從而無法利用宿主機體系結(jié)構(gòu)特征,難以對翻譯代碼進行深入優(yōu)化.為此,文獻[9-11]的研究工作針對特定目標機,利用宿主機特性來優(yōu)化二進制翻譯性能.在推出LoongArch之前,龍芯平臺曾通過 MIPS 指令系統(tǒng)的 UDI(user defined interface)接口擴展指令, 彌補x86和MIPS指令的語義差距, 加速x86目標機程序的翻譯執(zhí)行效率, 基于SPEC CPU2000測試實現(xiàn)了5~10倍的性能提升[12-14],其中部分技術(shù)被應(yīng)用于LoongArch中.

作為一種新型指令系統(tǒng),在其原生軟件生態(tài)成熟之前,LoongArch將借助二進制翻譯實現(xiàn)與x86,ARM,MIPS等指令系統(tǒng)的軟件二進制兼容來彌補其早期軟件生態(tài)的不足,構(gòu)建從MIPS到LoongArch的體系結(jié)構(gòu)翻譯器 LATM(Loongson architecture translator from MIPS)、從x86到LoongArch的體系結(jié)構(gòu)翻譯器LATX(Loongson architecture translator from x86)、 從ARM到LoongArch的體系結(jié)構(gòu)翻譯器LATA(Loongson architecture translator from ARM).這些翻譯器支持同一操作系統(tǒng)的用戶程序翻譯(如Linux/LoongArch上運行Linux/x86的應(yīng)用)、不同操作系統(tǒng)的應(yīng)用翻譯(Linux/LoongArch上運行Windows或者安卓應(yīng)用),以及操作系統(tǒng)本身(直接運行Windows或者安卓系統(tǒng)),以達到消除單一指令系統(tǒng)壁壘的效果.這不僅要考慮普通用戶程序指令的翻譯,還要考慮各種體系結(jié)構(gòu)資源的翻譯(如特權(quán)資源模擬、虛擬地址轉(zhuǎn)化等),因此我們稱之為體系結(jié)構(gòu)翻譯器.LoongArch體系結(jié)構(gòu)翻譯器和前人工作的區(qū)別在于LoongArch定義時就充分考慮多種指令系統(tǒng)二進制翻譯的需求,強調(diào)更加緊密的軟硬件協(xié)同,大幅提高了跨指令系統(tǒng)二進制翻譯的效率.圖5給出了支持應(yīng)用級二進制翻譯的LoongArch軟件生態(tài)結(jié)構(gòu).

Fig.5 LoongArch software eco-system圖5 LoongArch軟件生態(tài)結(jié)構(gòu)

3.1 從MIPS到LoongArch的翻譯

由于MIPS與LoongArch都是RISC指令集,絕大多數(shù)常見指令都可以實現(xiàn)一對一翻譯或者二對二翻譯(例如裝載32位立即數(shù),由于2者立即數(shù)域大小不同無法保證一對一翻譯,但可以把2條MIPS指令翻譯為等效的2條LoongArch指令),僅有少數(shù)指令由于架構(gòu)差異(如LoongArch取消了MIPS中轉(zhuǎn)移指令延遲槽)需要多條指令翻譯.LATM實現(xiàn)了MIPS到LoongArch的寄存器一一映射,并利用LBT擴展提供的便簽寄存器處理延遲槽中寄存器依賴以及管理運行時環(huán)境,避免不必要的寄存器保存恢復(fù).

對于直接跳轉(zhuǎn)的分支指令,通過運行時的翻譯塊鏈接可實現(xiàn)高效翻譯,采用熱點路徑探測、基本塊代碼重排等技術(shù)進一步消除額外的跳轉(zhuǎn)翻譯開銷.而間接跳轉(zhuǎn)的翻譯相對復(fù)雜,LATM對函數(shù)調(diào)用、函數(shù)返回以及switch語句中的跳轉(zhuǎn)指令進行分別優(yōu)化.采用跳轉(zhuǎn)目標地址內(nèi)聯(lián)技術(shù)、多級跳轉(zhuǎn)目標緩存等技術(shù)優(yōu)化函數(shù)調(diào)用;采用影子棧、返回塊預(yù)翻譯等基礎(chǔ)實現(xiàn)函數(shù)返回的跳轉(zhuǎn)指令翻譯;采用跳轉(zhuǎn)表預(yù)翻譯技術(shù)優(yōu)化switch語句中的跳轉(zhuǎn)指令.

在運行時環(huán)境方面,LATM實現(xiàn)了高效的系統(tǒng)調(diào)用支持,減少翻譯系統(tǒng)調(diào)用的上下文切換開銷,以及多架構(gòu)庫調(diào)用等優(yōu)化,進一步提高翻譯效率.

3.2 從x86到LoongArch的翻譯

LATX在LATM的基礎(chǔ)上,需要額外處理EFLAG、浮點棧等問題.LATX利用了LBT擴展的x86運算模擬指令、分支模擬指令以及浮點棧模式,大幅降低了對應(yīng)指令的翻譯開銷.此外,LATX通過指令流分析消除不必要的EFLAG計算,并針對指令序列中的特定組合按照語義進行二對一的翻譯,進一步提高翻譯效率.

3.3 不同操作系統(tǒng)應(yīng)用的翻譯

大多數(shù)商業(yè)二進制翻譯系統(tǒng)只支持相同操作系統(tǒng)不同指令集的應(yīng)用程序,這限制了它們的適用范圍.例如,目前產(chǎn)業(yè)界對在國產(chǎn)Linux操作系統(tǒng)上支持Windows應(yīng)用和驅(qū)動程序有強烈的需求,但這類技術(shù)無法滿足這些需求.支持不同操作系統(tǒng)的應(yīng)用翻譯需要同時支持2個層次的翻譯:指令集翻譯和操作系統(tǒng)API翻譯.開源軟件Wine[15]是一個操作系統(tǒng)API翻譯軟件,它可以在Linux上用Linux的系統(tǒng)調(diào)用來模擬實現(xiàn)Windows的系統(tǒng)調(diào)用,從而實現(xiàn)在Linux/x86上運行Windows/x86的應(yīng)用程序.我們通過結(jié)合二進制翻譯器和Wine來實現(xiàn)在Linux/LoongArch上運行Windows/x86的應(yīng)用程序.在此基礎(chǔ)上,我們還通過Wine的本地化提高API翻譯效率,通過擴充Wine實現(xiàn)了部分Windows驅(qū)動程序的支持,使得大批缺乏Linux驅(qū)動的打印機能夠被用于國產(chǎn)電腦.

3.4 體系結(jié)構(gòu)資源的翻譯

要實現(xiàn)不同指令系統(tǒng)的操作系統(tǒng)等系統(tǒng)軟件的兼容,就需要實現(xiàn)體系結(jié)構(gòu)資源的翻譯或者虛擬.隨著云計算技術(shù)的發(fā)展,現(xiàn)代指令系統(tǒng)大都已經(jīng)支持將一臺計算設(shè)備虛擬成多臺虛擬設(shè)備,而且能夠?qū)崿F(xiàn)很高的虛擬效率.但是高效的異構(gòu)虛擬化仍然是一個很大的挑戰(zhàn).例如,一個近年來比較活躍的異構(gòu)虛擬化研究系統(tǒng)Captive[16],其效率大約只有原生執(zhí)行的1/7.目前在LoongArch上,我們已經(jīng)實現(xiàn)了LATXSys的原型系統(tǒng),并在關(guān)鍵的內(nèi)存虛擬化等環(huán)節(jié)進行了一些研究[17],有效地提升了翻譯效率.同時,我們正在探索直接在裸機上構(gòu)建虛擬機管理器,通過消除不必要的宿主機系統(tǒng)軟件開銷來進一步提升體系結(jié)構(gòu)翻譯的效率.

4 性能測試與分析

4.1 基礎(chǔ)性能測試

我們用3個常見的基準程序來測試LoongArch架構(gòu)首款處理器龍芯3A5000的基礎(chǔ)性能表現(xiàn),包括廣泛用于衡量CPU計算性能的SPEC CPU2006[18]、用來測試內(nèi)存帶寬的Stream程序[19]、測試系統(tǒng)綜合性能的UnixBench[20].

為了方便比較,同時對比測試了采用MIPS架構(gòu)的3A4000.3A4000和3A5000的處理器核均采用相同的四發(fā)射 64 位微結(jié)構(gòu).3A4000 的主頻為 1.8 GHz,三級緩存容量為8 MB,內(nèi)存速率為DDR4-2133.3A5000的主頻為 2.5 GHz,三級緩存容量為 16 MB,內(nèi)存速率為DDR4-3200.2款機器的軟件版本保持基本一致,其中編譯器版本均為GCC 8.3.

表3給出了3A4000和3A5000的SPEC CPU2006 Speed模式(單核)和Throughput模式(四核)下的分值情況,2款機器的編譯器均為GCC 8.3,采用對所有程序一致的基礎(chǔ)優(yōu)化選項,無條件使能向量優(yōu)化(對部分程序產(chǎn)生負優(yōu)化),未使能自動并行化.3A4000的編譯選項為:-Ofast -mabi=64 -march=loongson3a -mtune=loongson3a -mloongson -sx -mloongson -asx -static -flto,3A5000 的選項為-Ofast -mabi=lp64 -march=loongarch64-mtune=loongarch64 -mlsx -mlasx -ftree -vectorize -static-flto.可以看到,3A5000的定點和浮點性能均大幅度高于3A4000,而且平均提升幅度大于頻率的提升幅度(后者約39%).

表4給出了3A4000和3A5000的Stream帶寬測試結(jié)果.從表4可以看到,3A5000測試機的Stream帶寬顯著高于3A4000,這主要得益于更高的內(nèi)存頻率和內(nèi)存控制器的一些優(yōu)化措施.

表5是3A4000和3A5000的UnixBench分值比較,3A5000單線程和四線程提升均超過100%.可以看出,在微結(jié)構(gòu)相似的情況下,3A5000比3A4000的UnixBench性能提升不僅遠超過主頻提升的幅度,也超過了SPEC CPU性能的提升幅度,一個重要原因是LoongArch提供了更多的軟硬件協(xié)同優(yōu)化空間,使得Linux操作系統(tǒng)能夠得到更好的優(yōu)化.

4.2 LoongArch和MIPS的直接性能比較

4.1節(jié)中3A4000和3A5000的性能比較結(jié)果受到指令系統(tǒng)以及其他差異因素(如主頻、內(nèi)存頻率等)的影響,無法直接反映指令系統(tǒng)的性能差異.為此,我們通過3A5000的FPGA平臺來實現(xiàn)指令系統(tǒng)的直接對比分析.3A5000的FPGA平臺在保持微結(jié)構(gòu)及主要接口速率不變的情況下分別實現(xiàn)了LoongArch和MIPS2 套指令系統(tǒng),主頻為 20 MHz.在 FPGA 平臺上運行SPEC CPU2006的train數(shù)據(jù)集,使用GCC-8.3版編譯器,編譯選項同4.1節(jié).表6列出了指令系統(tǒng)為LoongArch和MIPS時所花費的處理器流水線周期數(shù)和指令數(shù),以及MIPS相對LoongArch的周期數(shù)和指令數(shù)的比例.

Table 3 SPEC CPU2006 Performance Comparison of 3A4000 and 3A5000表3 3A4000和3A5000的SPEC CPU2006性能對比

Table 4 Stream Bandwidth Comparison of 3A4000 and 3A5000表4 3A4000和3A5000的Stream帶寬對比

Table 5 UnixBench Comparison of 3A4000 and 3A5000表5 3A4000和3A5000的UnixBench對比

從表6可以看出,MIPS比LoongArch的SPEC CPU2006定點程序平均動態(tài)指令數(shù)和周期數(shù)分別多12.35%和8.02%,浮點則分別多5.57%和7.53%.差距最大的定點程序483.xalancbmk MIPS比LoongArch的指令數(shù)和周期數(shù)分別多45.20%和45.16%,浮點程序481.wrf則分別是30.45%和23.40%.定點程序中,僅有一個程序456.hmmer的動態(tài)指令數(shù)LoongArch略多于MIPS,而且它的性能依然高于MIPS.浮點程序有5個LoongArch動態(tài)指令數(shù)多于MIPS,其中2個性能略低于MIPS.經(jīng)分析,這些程序表現(xiàn)不如MIPS的一個主要原因是LoongArch編譯器還沒有充分利用乘加指令,在一些能夠用乘加指令的地方生成了乘法和加法的組合指令.

在完全相同的微結(jié)構(gòu)情況下,LoongArch能夠有這樣的優(yōu)勢要歸功于其更合理的指令設(shè)計和更高效的ABI約定.目前,LoongArch的編譯器尚未得到充分的優(yōu)化,后續(xù)LoongArch相對MIPS的性能優(yōu)勢還可能進一步增加.

4.3 Loongnix操作系統(tǒng)性能優(yōu)化

Loongnix操作系統(tǒng)針對LoongArch架構(gòu)設(shè)計的特點進行了一些優(yōu)化.例如,避免上下文切換時不必要的保存和恢復(fù)操作以降低上下文切換的開銷;利用LoongArch向量指令優(yōu)化memcpy等函數(shù);利用LoongArch提供的更豐富的原子指令支持優(yōu)化鎖和各種同步原語,有助于降低上下文切換和系統(tǒng)調(diào)用等開銷;利用LoongArch進入內(nèi)核態(tài)自動關(guān)閉中斷的特點省略軟件關(guān)中斷的處理;等等.

表7給出了結(jié)合LoongArch特點優(yōu)化前后的Unix-Bench分值,優(yōu)化前3A5000平臺的UnixBench初始分值為單線程 1 438.8,四線程 3 698.4,經(jīng)過一輪優(yōu)化后分別提升到 1 743.9和 4 432.9,提升幅度均為 20% 左右.測試數(shù)據(jù)表明,LoongArch指令系統(tǒng)的設(shè)計能夠有效提升操作系統(tǒng)性能.

4.4 LoongArch體系結(jié)構(gòu)翻譯器性能

4.4.1 LATM 應(yīng)用翻譯性能

表8顯示了 20MHz FPGA 上 SPEC CINT2000的LATM應(yīng)用翻譯性能,其中第2列為采用MIPS指令系統(tǒng)原生運行的運行時間,第3列為采用LoongArch指令系統(tǒng)翻譯運行MIPS二進制的時間,第4列為采用LoongArch指令系統(tǒng)原生運行的時間.Perlbmk和eon運行時包括幾個不同的輸入子集,程序的每一次運行都被當(dāng)做一個單獨的測試.表8中數(shù)據(jù)為運行時間,與速度成反比,可以看出,在LoongArch上翻譯運行MIPS二進制的平均速度達到了原生LoongArch的91%,超過了原生MIPS.

LoongArch能夠比較高效地翻譯運行MIPS二進制,主要有2方面的原因:1)兩者均為RISC指令系統(tǒng),比較相似.SPEC CPU2000中,90%以上的MIPS指令都能一對一翻譯為一條LoongArch指令,還有部分指令可以成對翻譯為一對LoongArch指令.2)LoongArch為二進制翻譯提供的便簽寄存器等硬件支持能夠有效降低翻譯開銷.

4.4.2 LATX應(yīng)用翻譯性能

LATX的初步性能數(shù)據(jù)如表9所示,在3A5000上翻譯運行SPEC CPU2000定點和浮點效率分別是65.5%和70.3%,分別是QEMU-4.2.1的3.6倍和40.7倍.表9中輸入數(shù)據(jù)集為ref,編譯優(yōu)化采用對所有程序一致的基礎(chǔ)優(yōu)化(-O3 -static).

Table 6 Performance Comparison of LoongArch and MIPS SPEC CPU2006表6 LoongArch和MIPS的SPEC CPU2006性能比較

5 結(jié)論及未來工作

本文介紹了龍芯指令系統(tǒng)架構(gòu)LoongArch的設(shè)計及其生態(tài)建設(shè)實踐經(jīng)驗.測試結(jié)果表明,由于吸納了近年來指令系統(tǒng)設(shè)計領(lǐng)域諸多先進的技術(shù)發(fā)展成果,Loong-Arch比龍芯CPU原實現(xiàn)的MIPS指令系統(tǒng)性能更好;通過軟硬結(jié)合的二進制翻譯,可以大幅度提高二進制翻譯性能,高效兼容已有軟件生態(tài).實踐證明,在掌握三大 C編譯器(GCC,LLVM,GoLang)、三大虛擬機(Java,JavaScript,.NET)和三大指令系統(tǒng)(MIPS,x86,ARM)的二進制翻譯系統(tǒng)的基礎(chǔ)上,可以在較短時間內(nèi)構(gòu)建良好的軟件生態(tài).

CPU性能的改進和軟件生態(tài)的優(yōu)化都需要持續(xù)改進.本文后續(xù)的工作包括:對LoongArch指令系統(tǒng)進行更加細致的實驗分析,驗證相關(guān)指令擴展及設(shè)計優(yōu)化的量化效果;針對LoongArch指令系統(tǒng)的特點進一步優(yōu)化基礎(chǔ)軟件來提升性能;根據(jù)進一步測試和應(yīng)用的結(jié)果發(fā)現(xiàn)新的性能瓶頸,持續(xù)完善指令系統(tǒng);實現(xiàn)基于Android的從ARM到LoongArch的二進制翻譯系統(tǒng);爭取再經(jīng)過1~2輪的軟硬件磨合迭代,到2025年前后通過技術(shù)手段消除單一指令系統(tǒng)的壁壘,使得不同指令集的系統(tǒng)及應(yīng)用軟件能夠融合到統(tǒng)一的LoongArch平臺上,不加區(qū)別地運行;對外開放LoongArch,鼓勵更多學(xué)術(shù)界和產(chǎn)業(yè)界人士參與架構(gòu)的持續(xù)改進.

Table 7 Optimization of 3A5000 UnixBench表7 3A5000的UnixBench優(yōu)化

Table 8 Runtime Comparison of SPEC CINT2000 Train表8 SPEC CINT2000 Train的運行時間比較

作者貢獻聲明:胡偉武提出了主要思路,撰寫了論文整體框架;汪文祥撰寫了第1節(jié)部分內(nèi)容;吳瑞陽和王煥東撰寫了第2節(jié)部分內(nèi)容;曾露撰寫了第3節(jié)部分內(nèi)容;徐成華、曾露和高翔撰寫了第4節(jié)部分內(nèi)容;張福新負責(zé)論文組織和統(tǒng)稿.

Table 9 QEMU and LATX Performance of SPEC CPU2000表9 QEMU和LATX翻譯運行SPEC CPU2000的性能

猜你喜歡
指令
聽我指令:大催眠術(shù)
ARINC661顯控指令快速驗證方法
LED照明產(chǎn)品歐盟ErP指令要求解讀
電子測試(2018年18期)2018-11-14 02:30:34
殺毒軟件中指令虛擬機的脆弱性分析
巧用G10指令實現(xiàn)橢圓輪廓零件倒圓角
中斷與跳轉(zhuǎn)操作對指令串的影響
科技傳播(2015年20期)2015-03-25 08:20:30
基于匯編指令分布的惡意代碼檢測算法研究
一種基于滑窗的余度指令判別算法
歐盟修訂電氣及電子設(shè)備等產(chǎn)品安全規(guī)定
家電科技(2014年5期)2014-04-16 03:11:28
MAC指令推動制冷劑行業(yè)發(fā)展
汽車零部件(2014年2期)2014-03-11 17:46:27
主站蜘蛛池模板: 中文字幕久久亚洲一区| 欧美日韩综合网| 久久情精品国产品免费| 视频一区视频二区中文精品| 国产女人水多毛片18| 国产欧美日韩va另类在线播放 | 午夜国产大片免费观看| 亚洲天堂成人| 国产日产欧美精品| 日本午夜影院| 亚洲第一视频免费在线| 婷婷丁香在线观看| 天堂在线亚洲| 国产精品自在在线午夜| 亚洲狠狠婷婷综合久久久久| 国产麻豆另类AV| 青草视频在线观看国产| 黄色污网站在线观看| 国产精品亚欧美一区二区三区| 亚洲人成网站色7799在线播放| 久久久91人妻无码精品蜜桃HD| 国产乱人免费视频| 亚洲日产2021三区在线| 久久婷婷六月| 国产国产人成免费视频77777| 真实国产精品vr专区| 宅男噜噜噜66国产在线观看| 国产精品福利社| 亚洲无码高清免费视频亚洲| 中文无码精品A∨在线观看不卡| 99精品影院| 香蕉久久国产精品免| 欧美一级高清免费a| 国产免费精彩视频| 午夜精品影院| 漂亮人妻被中出中文字幕久久| 乱色熟女综合一区二区| 欧美成人综合在线| 青草视频久久| 国产又黄又硬又粗| 欧美日韩一区二区三区四区在线观看| 亚洲黄色片免费看| 国产69囗曝护士吞精在线视频| 久久五月天综合| 免费网站成人亚洲| av色爱 天堂网| 亚洲成人在线网| 国产女人18毛片水真多1| 久久久久亚洲精品成人网| 69国产精品视频免费| 91福利免费| 一区二区三区四区在线| 婷婷六月激情综合一区| 亚洲欧美激情小说另类| 日韩一区二区三免费高清| 亚洲电影天堂在线国语对白| 88av在线| 欧美亚洲日韩中文| 欧美精品不卡| 亚洲精品成人片在线观看| 欧美在线免费| 国产精品美女在线| 久久婷婷国产综合尤物精品| 欧美在线一级片| 亚洲动漫h| 女人18毛片一级毛片在线 | 亚洲综合片| 中文字幕在线看| 妇女自拍偷自拍亚洲精品| 全部免费特黄特色大片视频| 区国产精品搜索视频| 欧美亚洲综合免费精品高清在线观看| 亚洲中文字幕日产无码2021| 精品久久国产综合精麻豆| 国产青榴视频| 欧美亚洲日韩不卡在线在线观看| 国产精品视频系列专区| 亚洲精品视频免费看| 爽爽影院十八禁在线观看| 日韩无码真实干出血视频| 日本成人精品视频| 日韩精品一区二区深田咏美|