• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    針對(duì)gem5 指令集實(shí)現(xiàn)及其功能測試的自動(dòng)代碼生成

    2023-07-20 11:21:56趙紫微
    關(guān)鍵詞:指令集譯碼決策樹

    趙紫微 涂 航 劉 芹 李 莉 余 濤

    (武漢大學(xué)國家網(wǎng)絡(luò)安全學(xué)院 武漢 430072)

    計(jì)算機(jī)系統(tǒng)模擬器[1]是運(yùn)行于宿主機(jī)上的軟件,用于模擬目標(biāo)機(jī)器的硬件和軟件環(huán)境,便于使用者研究目標(biāo)機(jī)器的架構(gòu)與執(zhí)行過程,減少硬件成本.嵌入式領(lǐng)域?qū)τ谀M器的需求量較大,并且在可擴(kuò)展性和精確度方面有較多要求.因此,如何基于現(xiàn)有的模擬器快速開發(fā)原型并且在保證正確性的同時(shí)具有較好的執(zhí)行效率是一個(gè)值得研究的問題.

    目前的模擬器從精確度方面可以分為功能級(jí)、指令級(jí)、周期級(jí).功能級(jí)保證其執(zhí)行結(jié)果與目標(biāo)機(jī)器相同,不考慮執(zhí)行過程的精確性,在性能上表現(xiàn)最好,接近宿主機(jī)的執(zhí)行速度,大多使用二進(jìn)制翻譯等技術(shù)提升性能,例如QEMU[2].指令級(jí)保證每條指令按順序全部執(zhí)行,不考慮指令周期和流水線的問題,大多使用即時(shí)編譯(just-in-time compilation, JIT)等技術(shù)提升性能.周期級(jí)保證指令周期精確,可以仿真指令流水線,執(zhí)行速度最慢,但提供更多執(zhí)行細(xì)節(jié)信息,例如gem5[3].考慮到嵌入式開發(fā)中對(duì)周期精確的需求,本文選擇基于gem5 進(jìn)行研究.gem5 是一個(gè)開源的計(jì)算機(jī)架構(gòu)模擬器,由密歇根大學(xué)的m5 項(xiàng)目和威斯康星大學(xué)的GEMS 項(xiàng)目合并而來,在學(xué)術(shù)界和工業(yè)界應(yīng)用廣泛.gem5 是模塊化并以事件驅(qū)動(dòng)的周期精確模擬器,可擴(kuò)展性強(qiáng).gem5 的CPU 模塊采用解釋執(zhí)行技術(shù),其譯碼模塊和指令集實(shí)現(xiàn)獨(dú)立于CPU 模塊,可以與不同精確度的CPU 模型相結(jié)合.以不考慮訪存延遲和流水線的AtomicSimpleCPU 模型為例,主要有3 個(gè)步驟:取指、譯碼和執(zhí)行.其中,譯碼過程是由各個(gè)指令集架構(gòu)中的譯碼模塊負(fù)責(zé).

    gem5 中的指令集描述語言可以半自動(dòng)地生成指令集功能代碼,但需要開發(fā)者手動(dòng)處理指令編碼的判斷并為指令編寫模板替換函數(shù).對(duì)于復(fù)雜的指令編碼,手動(dòng)處理指令編碼的判斷過于繁瑣并且難以得到性能最優(yōu)的實(shí)現(xiàn).沒有統(tǒng)一的指令模板替換函數(shù)導(dǎo)致邏輯復(fù)雜且存在冗余,總體開發(fā)效率較低.gem5 在取指過程后會(huì)由譯碼模塊對(duì)指令編碼進(jìn)行預(yù)解析,之后再調(diào)用函數(shù)解析完整的指令編碼,這2 個(gè)解析過程存在部分重復(fù).此外,在實(shí)現(xiàn)指令集和譯碼模塊后還需要對(duì)模擬器進(jìn)行功能測試,但一些指令集沒有提供公開的標(biāo)準(zhǔn)測試集,這種情況下開發(fā)者需要根據(jù)指令集文檔自行編寫測試程序.其中,測試用例的編寫依賴于指令操作數(shù)的取值范圍描述和指令的功能描述.因此,可以依據(jù)gem5 中所使用的指令集描述語言來生成功能測試中的部分?jǐn)?shù)據(jù),提高開發(fā)效率.

    前人[4-5]提出了一些指令集描述方法和譯碼過程的優(yōu)化算法,但不易與現(xiàn)有模擬器相結(jié)合,也沒有針對(duì)gem5 進(jìn)行優(yōu)化.目前還沒有一套為現(xiàn)有模擬器提供的從指令集描述到生成具體實(shí)現(xiàn)和測試用例的完整方案.這對(duì)于有自定義的指令需求的用戶來說,在模擬器性能和項(xiàng)目開發(fā)效率方面有所欠缺.

    本文的工作難點(diǎn)在于根據(jù)統(tǒng)一的指令集描述語言提供一個(gè)完整的開發(fā)與測試方案,并針對(duì)gem5 優(yōu)化譯碼過程.用戶可以根據(jù)指令集文檔直觀地描述出所有指令的信息,得到自動(dòng)生成的指令集實(shí)現(xiàn)代碼、譯碼模塊代碼和功能測試用例.

    gem5 原本未支持Cortex-M3 指令集架構(gòu),本文實(shí)現(xiàn)了該指令集架構(gòu)并引入了優(yōu)化.主要工作包括指令集功能實(shí)現(xiàn)和內(nèi)存管理單元的修改,難點(diǎn)在于優(yōu)化譯碼決策樹和譯碼模塊,意義在于提供一種更高效的指令集實(shí)現(xiàn)方案以及增加gem5 對(duì)嵌入式芯片的仿真支持.

    本文方案與gem5 原方案的流程比較如圖1 所示.本文方案包括3 個(gè)階段,首先是用詞法和語法分析指令集描述文件,之后是根據(jù)指令的編碼描述生成譯碼決策樹,最后是使用統(tǒng)一的模板替換規(guī)則生成指令功能代碼和譯碼模塊代碼.與原方案相比,本文方案重新設(shè)計(jì)了指令集描述文件格式,修改了模板替換的邏輯,增加了譯碼決策樹生成功能并優(yōu)化譯碼模塊.此改進(jìn)的作用在于簡化指令定義,自動(dòng)化生成譯碼決策樹和譯碼模塊代碼,優(yōu)化譯碼執(zhí)行時(shí)間,提升開發(fā)效率.

    Fig.1 Comparison of our scheme and original gem5 scheme圖1 本文方案與gem5 原方案的比較

    本文的主要貢獻(xiàn)包括3 個(gè)方面:

    1)設(shè)計(jì)了一種指令集描述語言和一個(gè)基于gem5的指令集代碼生成方案.根據(jù)指令集的編碼描述和功能描述,自動(dòng)為模擬器生成指令集和譯碼模塊代碼,提升模擬器性能和開發(fā)效率.

    2)提出了一個(gè)針對(duì)gem5 優(yōu)化的譯碼決策樹構(gòu)建算法.該算法基于前人的算法進(jìn)行擴(kuò)展,并減少了gem5 中指令編碼預(yù)解析階段的重復(fù)判斷,提升模擬器運(yùn)行性能.

    3)實(shí)現(xiàn)了一個(gè)指令集功能測試框架.根據(jù)指令的測試描述,使用框架中的模板為每條指令生成功能測試用例,在gem5 上運(yùn)行測試程序并輸出測試報(bào)告.

    1 相關(guān)工作

    前人的研究[4-5]提到很多針對(duì)處理器或系統(tǒng)仿真的描述語言的研究可以用于生成指令集功能的描述,例如Pydgin[6], LISA[7], nML[8],但這些不是針對(duì)譯碼過程和指令功能的描述,也不易結(jié)合到現(xiàn)有的模擬器實(shí)現(xiàn)中.本文方案主要基于gem5 的指令集描述語言進(jìn)行擴(kuò)展,部分指令描述的設(shè)計(jì)參考了上述描述語言.

    目前一些研究提出了構(gòu)造決策樹來優(yōu)化譯碼分支的方法[9-11],但在處理復(fù)雜指令結(jié)構(gòu)時(shí)存在一些不能成功構(gòu)建決策樹的情況.Okuda 等人[12]基于前人工作提出了對(duì)于不規(guī)則指令編碼的譯碼分支優(yōu)化算法,解決了復(fù)雜指令結(jié)構(gòu)處理中的問題,可以生成平均高度低且內(nèi)存占用小的決策樹,并在ARM 和MIPS指令集上取得了較好的結(jié)果.此算法可以用于自動(dòng)化構(gòu)建處理器仿真[13],此外還有研究分析了譯碼決策樹的開銷問題[14].本文基于此算法構(gòu)造譯碼決策樹,并針對(duì)gem5 譯碼模塊做出優(yōu)化,構(gòu)建多個(gè)決策子樹來配合gem5 的處理流程,提升譯碼模塊性能.

    指令集功能測試用于檢測指令功能是否正確,例如檢查單條指令執(zhí)行前后的寄存器和內(nèi)存的讀寫情況或者多條指令的處理器流水線情況[15]等.RISCV 提供了一套標(biāo)準(zhǔn)測試集[16],通過模板構(gòu)建測試用例,能夠測試單條指令的功能.本文搭建的指令功能測試框架中測試用例的設(shè)計(jì)參考了此測試集.

    2 指令集描述

    gem5 中已經(jīng)實(shí)現(xiàn)了一個(gè)領(lǐng)域特定語言(domain specific language, DSL),用于描述指令集中各個(gè)指令的功能及其譯碼函數(shù),文件后綴為.isa.在編譯過程中,項(xiàng)目構(gòu)建工具SCons[17]會(huì)調(diào)用Python 腳本對(duì)所編譯的目標(biāo)架構(gòu)的*.isa 文件進(jìn)行詞法和語法分析,從而生成包含指令定義和譯碼函數(shù)的C++文件,最后SCons 將這些生成的文件添加到編譯任務(wù)中.

    在實(shí)際使用中,我們發(fā)現(xiàn)該指令集描述語言存在2 個(gè)問題:

    1)譯碼函數(shù)主要由開發(fā)者手動(dòng)編寫.當(dāng)指令數(shù)量較多且復(fù)雜時(shí)開發(fā)效率不高,并且手動(dòng)編寫的譯碼函數(shù)可能存在冗余,在執(zhí)行效率方面有待優(yōu)化.

    2)用于生成C++代碼的模板替換邏輯和待替換的數(shù)據(jù)沒有分離.Python 腳本會(huì)使用函數(shù)exec()來處理這些字符串.然而這些模板替換邏輯非常類似,這種實(shí)現(xiàn)方式不僅增加了不必要的復(fù)雜性,而且不易維護(hù).

    本文參考了該指令集描述語言的實(shí)現(xiàn),并提出了一種包含指令編碼和指令功能信息的指令集描述語言,可以自動(dòng)生成譯碼函數(shù)并自動(dòng)完成指令功能代碼與C++代碼模板的替換.此外,對(duì)于不公開提供功能測試套件的指令集或是添加了自定義指令的情況,考慮到自行編寫指令功能測試時(shí)很多所需的信息可以由指令集描述提供,本文方案允許標(biāo)注操作數(shù)限制等指令測試所需的信息,支持生成指令的功能測試用例.

    本文方案包括編碼描述、功能描述和測試描述3 部分.這里以ARM Cortex-M3 的AND 指令為例來說明,如圖2 所示.

    2.1 編碼描述

    編碼描述用于說明指令編碼的結(jié)構(gòu)與限制,用于構(gòu)造譯碼決策樹.本文方案將編碼抽象為由固定位段和可變位段組成的結(jié)構(gòu),其中可變位段的取值可能存在一些限制.下面結(jié)合實(shí)例來說明其具體實(shí)現(xiàn).

    指令編碼是一串由0、1 和小寫字母組成的字符串.其中,0 和1 表示指令編碼中取值確定的位,小寫字母表示指令編碼中取值可變的位.同一小寫字母必須相連,表示一個(gè)可變的位段.例如,指令t1_and_reg的編碼為0100000000mmmddd,說明第0 位和第2~9位為0,第1 位為1,第10~12 位為一個(gè)可變位段 {m},第13~15 位為另一個(gè)可變位段 j5i0abt0b.

    對(duì)于不符合要求的編碼情況,使用EXCLUSION語句列出可變位段的所有例外表示,將其作為該指令編碼的排除條件.例如,指令t1_and_imm 的編碼排除了 {n}為13 到15 和 j5i0abt0b為13 或15 的情況.

    2.2 功能描述

    功能描述用于說明指令功能的實(shí)現(xiàn)和標(biāo)注信息,用于生成指令功能代碼和提供仿真所需的控制信息和計(jì)數(shù)信息.本文方案將功能抽象為由特定功能代碼和模板組成的結(jié)構(gòu).下面結(jié)合實(shí)例來說明其具體實(shí)現(xiàn).

    代碼塊由{{和}}來表示,在代碼塊中可變位段可以作為數(shù)值來使用,REPLACE_MAP 中定義替換詞可以在前后加上@作為代碼片段來使用.

    指令構(gòu)造函數(shù)代碼以代碼塊形式定義在指令編碼描述結(jié)束后,用于為指令基類定義的操作數(shù)變量根據(jù)實(shí)際編碼來賦值.例如,指令t1_and_imm 的基類為DataImm,其中定義了操作數(shù)寄存器的序號(hào)、立即數(shù)、其他參數(shù)和功能函數(shù)等.

    指令功能函數(shù)代碼存放在一個(gè)字典結(jié)構(gòu)中,代碼塊所對(duì)應(yīng)的序號(hào)會(huì)作為參數(shù)傳入FORMAT 語句.FORMAT 語句用于處理C++模板替換過程,定義在構(gòu)造函數(shù)描述之后.例如,CODE { 0: {{ inta=0; }} }說明指令功能代碼為inta=0,其對(duì)應(yīng)序號(hào)為0.

    FORMAT 語句會(huì)根據(jù)指令類型的格式從FORMAT_MAP 中得到對(duì)應(yīng)的C++代碼模板和參數(shù)格式,之后通過字符串替換生成相應(yīng)的指令類.例如,指令類型AND 的格式為PredProcessOp,其C++代碼模板為BasicDeclare, BasicConstructor, PredProcessExecute,分別用于指令類的聲明、構(gòu)造函數(shù)和功能函數(shù)的生成,其參數(shù)格式為['process_code'].指令t1_and_imm 將[0, 3]傳入FORMAT 語句,即將序號(hào)為0 和3 的代碼拼接后的值作為process_code.

    2.3 測試描述

    測試描述用于說明指令功能測試的參數(shù)要求,用于輔助生成指令功能測試.本文方案將功能測試抽象為由測試參數(shù)和測試模板組成的結(jié)構(gòu).下面結(jié)合實(shí)例來說明其具體實(shí)現(xiàn).

    指令測試的所需的信息由TEST 語句負(fù)責(zé)處理,用于生成該指令的功能測試用例.TEST 語句的參數(shù)對(duì)應(yīng)于該指令的匯編表示,例如指令t1_and_imm 的匯編表示包括可選的標(biāo)記S和條件cond,以及2 個(gè)寄存器類型Rx 和1 個(gè)立即數(shù)類型Constant.類型Rx 和類型Constant 定義于TEST_MAP 中,設(shè)置了其取值范圍和函數(shù)名,在測試用例生成時(shí)會(huì)調(diào)用類型所對(duì)應(yīng)的函數(shù)來生成數(shù)值.

    3 譯碼決策樹生成

    本節(jié)說明了譯碼決策樹生成過程中涉及的基本概念,并給出了譯碼決策樹生成算法的具體描述.本文方案對(duì)前人所提出的算法[12]進(jìn)行了改進(jìn),并結(jié)合gem5的特性實(shí)現(xiàn)了針對(duì)性優(yōu)化.

    3.1 基本概念

    本節(jié)定義決策樹的輸入與輸出形式,以表1 中的譯碼項(xiàng)來說明基本概念.令指令集中的1 條指令編碼對(duì)應(yīng)1 個(gè)譯碼項(xiàng),算法的輸入為1 個(gè)譯碼項(xiàng)集合,算法的輸出為由該譯碼項(xiàng)集合生成的1 個(gè)譯碼決策樹.

    Table 1 An Example of Decoding Entries表1 譯碼項(xiàng)示例

    3.1.1 譯碼項(xiàng)

    譯碼項(xiàng)e包括名稱m、編碼d和排除條件集合C,記為e=(m,d,C).其中,譯碼項(xiàng)的名稱和編碼是唯一的,排除條件可以為0 或多個(gè),譯碼項(xiàng)集合記為E,E={e}.

    本文方案將編碼定義為d∈{0,1,X}n.其中,X表示該位可以與0 或1 相匹配,用于表示可變位段,編碼長度為n位.給定一個(gè)位串s∈{0,1}n,定義位串s與編碼d的匹配規(guī)則為?i∈{0,1,…,n-1},當(dāng)且僅當(dāng)s[i]=d[i]或d[i]=X時(shí),位串s與編碼d匹配,記為s∈d.若該編碼所對(duì)應(yīng)的譯碼項(xiàng)e無排除條件,則位串s與譯碼項(xiàng)e相匹配,記為s?e.例如,位串00001100匹配編碼00XXXX00.

    3.1.2 譯碼項(xiàng)中的排除條件

    為了能夠編碼更多指令,在設(shè)計(jì)指令集時(shí)某些編碼被添加了排除條件,即對(duì)編碼中的可變位段設(shè)置了取值限制.若位串的某些可變位段等于特定常數(shù)時(shí),則與該編碼不匹配.

    一個(gè)排除條件包括一個(gè)下標(biāo)集合Iex和 一個(gè)排除項(xiàng)pex,記為(Iex,pex).其中,下標(biāo)是從小到大排列,且與排除項(xiàng)的各位按序一一對(duì)應(yīng),即將應(yīng)排除的值的第i位記為pex[i′].本文方案定義位串s使得排除條件(Iex,pex)成立的判定規(guī)則為:?i∈Iex,當(dāng)且僅當(dāng)s[i]=pex[i′]時(shí),位串s使得排除條件(Iex,pex)成立,記為exclude(s,(Iex,pex)).例如,譯碼項(xiàng)的排除條件({6,7},00)表示應(yīng)排除第6 位和第7 位都為0的位串.

    因此,本文方案定義位串s與具有排除條件的譯碼項(xiàng)ec=(mc,dc,Cc)的匹配規(guī)則為:當(dāng)且僅當(dāng)s∈dc且?(Ic,pc)∈Cc,?exclude(s,(Ic,pc))時(shí),位串s與譯碼項(xiàng)ec相匹配,記為s?ec.例如,位串10100000雖然與名稱為I 的譯碼項(xiàng)和名稱為J 的譯碼項(xiàng)的編碼匹配,但由于名稱為I 的譯碼項(xiàng)的排除條件({6,7},00)成立,所以該位串是與名稱為J 的譯碼項(xiàng)匹配.

    3.1.3 譯碼決策樹

    譯碼過程是通過逐步查詢位串中特定位段的值來獲得該位串所匹配的譯碼項(xiàng).本文將這個(gè)過程用譯碼決策樹來表示,記為T=(VT,ET).其中,VT表示節(jié)點(diǎn)的集合,ET表示邊的集合.每個(gè)節(jié)點(diǎn)有唯一標(biāo)識(shí)符,記為nid.本文將節(jié)點(diǎn)分為內(nèi)部節(jié)點(diǎn)和葉節(jié)點(diǎn).內(nèi)部節(jié)點(diǎn)表示譯碼選擇分支,包含一個(gè)特定位的下標(biāo)集合I和一個(gè)元組集合,每個(gè)元組由標(biāo)簽和子節(jié)點(diǎn)組成,記為(p,vchild).其中,下標(biāo)集合中的元素從小到大排列,且與標(biāo)簽的各位按次序一一對(duì)應(yīng),l為下標(biāo)集合的長度,標(biāo)簽p∈{0,1}l為葉節(jié)點(diǎn),其表示譯碼查詢所匹配的最終結(jié)果,包含一個(gè)譯碼項(xiàng).

    譯碼決策樹示例如圖3 所示.內(nèi)部節(jié)點(diǎn)由包含其標(biāo)識(shí)符nid和下標(biāo)集合I的方框表示,邊框?yàn)榛【€表示該節(jié)點(diǎn)在優(yōu)化過程中被修改過.葉節(jié)點(diǎn)由包含其標(biāo)識(shí)符nid、譯碼項(xiàng)名稱m和譯碼項(xiàng)編碼d的方框表示.每條從內(nèi)部節(jié)點(diǎn)所出的邊的標(biāo)簽p和所指向的子節(jié)點(diǎn)vchild由該內(nèi)部節(jié)點(diǎn)中的各個(gè)元組(p,vchild)得出.

    Fig.3 An example of a decoding decision tree圖3 譯碼決策樹示例

    3.2 算法描述

    本節(jié)詳細(xì)說明了構(gòu)造譯碼決策樹的算法.首先,分析了前人的工作[12]并提出了本文方案的譯碼決策樹構(gòu)造算法,擴(kuò)展了前人對(duì)于內(nèi)部節(jié)點(diǎn)的構(gòu)造方法并增加了2 個(gè)優(yōu)化策略.此外,本文方案還針對(duì)gem5的譯碼過程對(duì)譯碼決策樹和生成的代碼做了優(yōu)化.最后,給出一個(gè)示例來說明每種優(yōu)化策略所針對(duì)的情況和優(yōu)化效果.

    3.2.1 基礎(chǔ)算法Okuda 等人[12]的算法主要包含3 個(gè)過程:1) 過程MakeTree根據(jù)給定的譯碼項(xiàng)集合E遞歸創(chuàng)建譯碼決策樹的節(jié)點(diǎn)及其子節(jié)點(diǎn).2) 過程MakeNode創(chuàng)建一個(gè)無排除條件的內(nèi)部節(jié)點(diǎn),并將譯碼項(xiàng)集合E劃分為多個(gè)子譯碼項(xiàng)集合,為每個(gè)子譯碼項(xiàng)集合創(chuàng)建子譯碼決策樹.3) 過程MakeConditionNode創(chuàng)建一個(gè)有排除條件的內(nèi)部節(jié)點(diǎn),并將譯碼項(xiàng)集合根據(jù)是否符合排除條件劃分為2 個(gè)子譯碼項(xiàng)集合,分別為這2 個(gè)子譯碼項(xiàng)集合創(chuàng)建子譯碼決策樹.此外,該算法是通過與指令長度相等的編碼格式來劃分子譯碼項(xiàng)集合.例如,使用以0 開頭和以1 開頭的4 位編碼格式來劃分包含編碼為0101 和1 101 的譯碼項(xiàng)集合.

    Okuda 等人[12]的算法存在2 個(gè)問題:

    1)過程MakeConditionNode在劃分子譯碼項(xiàng)集合時(shí)僅根據(jù)其是否符合排除條件分為2 類.對(duì)于不符合排除條件但也可被區(qū)分的子譯碼項(xiàng)來說,可能會(huì)再次處理該相同位段,導(dǎo)致譯碼決策樹的高度增加.

    2)算法根據(jù)與指令長度相等的編碼格式來劃分譯碼項(xiàng)集合,不便于添加額外的優(yōu)化策略,例如處理個(gè)別位的合并或移除操作.

    本文方案的算法基于Okuda 等人[12]的算法做了擴(kuò)展和優(yōu)化.在構(gòu)造內(nèi)部節(jié)點(diǎn)時(shí),本文方案使用下標(biāo)集合I所確定的多個(gè)標(biāo)簽來劃分譯碼項(xiàng)集合,每個(gè)譯碼項(xiàng)根據(jù)其編碼在該下標(biāo)集合I處的取值情況劃分到不同的標(biāo)簽p下.本文方案為每個(gè)標(biāo)簽的譯碼項(xiàng)集合構(gòu)造譯碼決策樹,并將其作為該內(nèi)部節(jié)點(diǎn)的子樹.此外,本文方案修改了過程MakeConditionNode的實(shí)現(xiàn),使其能夠根據(jù)排除條件的下標(biāo)集合Iex來區(qū)分多個(gè)子譯碼項(xiàng)集合.并且,本文方案以能夠區(qū)分出最多子譯碼項(xiàng)集合的下標(biāo)集合I來創(chuàng)建節(jié)點(diǎn),這樣可以避免重復(fù)判斷相同位段的值并減少譯碼決策樹的高度.

    3.2.2 擴(kuò)展算法

    本文方案的算法對(duì)過程MakeNode和過程Make-ConditionNode做了擴(kuò)展和優(yōu)化,見算法1.

    算法1.譯碼決策樹構(gòu)建算法.

    過程MakeNode用于創(chuàng)建一個(gè)不使用排除條件的內(nèi)部節(jié)點(diǎn).首先,過程GetS igni ficantBits根據(jù)譯碼項(xiàng)集合E找出一個(gè)下標(biāo)集合Isig,使得所有譯碼項(xiàng)可以用標(biāo)簽區(qū)分.過程S elOptBits根據(jù)下標(biāo)集合劃分各個(gè)標(biāo)簽對(duì)應(yīng)的子譯碼項(xiàng)集合,將結(jié)果記為子節(jié)點(diǎn)信息In fo.之后檢查是否可以通過擴(kuò)增下標(biāo)集合以減少譯碼決策樹高度,如果可以優(yōu)化,則更新下標(biāo)集合Isig和子節(jié)點(diǎn)信息In fo.過程MakeChild會(huì)調(diào)用過程Make-Tree并根據(jù)子節(jié)點(diǎn)信息和尚未處理的下標(biāo)集合來遞歸創(chuàng)建子節(jié)點(diǎn)譯碼決策樹,將結(jié)果記為Tchild.如果創(chuàng)建的子節(jié)點(diǎn)譯碼決策樹中存在已優(yōu)化的節(jié)點(diǎn),則需要通過過程ReselOptBits再次更新下標(biāo)集合Isig、子節(jié)點(diǎn)信息In fo和子節(jié)點(diǎn)譯碼決策樹Tchild.最后,過程CreateNode創(chuàng)建此內(nèi)部節(jié)點(diǎn),記錄其下標(biāo)集合Isig和子節(jié)點(diǎn)譯碼決策樹Tchild,并設(shè)置節(jié)點(diǎn)類型是否為已優(yōu)化節(jié)點(diǎn).圖4 展示了優(yōu)化后的效果,將下標(biāo)2 增加到根節(jié)點(diǎn)的判斷中,減少了名稱為G 的譯碼項(xiàng)和名稱為M 的譯碼項(xiàng)所在的層數(shù).

    Fig.4 The decoding decision tree optimized by process MakeNode圖4 使用過程MakeNode 優(yōu)化的譯碼決策樹

    過程MakeConditionNode用于創(chuàng)建使用排除條件的內(nèi)部節(jié)點(diǎn).首先,過程S elConditionBits根據(jù)譯碼項(xiàng)集合E從各個(gè)譯碼項(xiàng)的排除條件中找出一個(gè)排除條件(Iex,pex),使得根據(jù)此下標(biāo)集合Iex劃分得到的標(biāo)簽數(shù)量最多,將結(jié)果記為子節(jié)點(diǎn)信息In fo.這里沒有使用過程MakeNode中的優(yōu)化方法是因?yàn)槭褂门懦龡l件所得到的標(biāo)簽中一定包含default,之前的優(yōu)化不適用于這種情況.之后執(zhí)行過程MakeChild,將結(jié)果記為Tchild.最后,過程CreateConditionNode創(chuàng)建此內(nèi)部節(jié)點(diǎn),記錄其下標(biāo)集合Iex和子節(jié)點(diǎn)譯碼決策樹Tchild,并設(shè)置節(jié)點(diǎn)類型是否為使用排除條件的節(jié)點(diǎn).圖5 說明了Okuda 等人[12]的算法對(duì)于條件節(jié)點(diǎn)的處理,僅判斷是否滿足排除條件,未考慮相同下標(biāo)對(duì)應(yīng)多個(gè)可區(qū)分編碼的情況,導(dǎo)致冗余判斷.本文使用下標(biāo)集合來劃分子譯碼項(xiàng)集合,因此在確定下標(biāo)集合后,其劃分方式與常規(guī)內(nèi)部節(jié)點(diǎn)相同,如圖3 所示.

    Fig.5 The condition node of Okuda et al’s algorithm圖5 Okuda 等人所提算法的條件節(jié)點(diǎn)

    此外,本文方案新增了過程OptimizeTree、過程OptimizeNode、過程FixNode和過程FixTree對(duì)譯碼決策樹進(jìn)行整體優(yōu)化和調(diào)整,見算法2.

    算法2.譯碼決策樹優(yōu)化算法.

    過程OptimizeTree和過程OptimizeNode用 于前序遍歷譯碼決策樹中的節(jié)點(diǎn)并做優(yōu)化.首先,過程Get-OptimizableBits檢查節(jié)點(diǎn)N的內(nèi)部子節(jié)點(diǎn)的下標(biāo)集合Isig是否僅包含1 個(gè)元素,將滿足條件的下標(biāo)集合取并集作為待選下標(biāo)集合.遍歷待選下標(biāo)集合,檢查其他各個(gè)內(nèi)部子節(jié)點(diǎn)下的所有譯碼項(xiàng)是否在該下標(biāo)處取值相同.如果存在這樣的下標(biāo),則將其加入到Iopt中.之后,對(duì)于節(jié)點(diǎn)N的每個(gè)葉子子節(jié)點(diǎn)Nleaf,使用過程GetLeaf Pattern修改指向此Nleaf的標(biāo)簽,將結(jié)果更新到Tchild中.遍歷下標(biāo)集合Iopt,對(duì)節(jié)點(diǎn)N的每個(gè)內(nèi)部子節(jié)點(diǎn)Ninner用過程GetInnerPattern確認(rèn)是否需要移除此內(nèi)部節(jié)點(diǎn),并修改指向此Ninner或其子節(jié)點(diǎn)的標(biāo)簽,將結(jié)果更新到Tchild中.最后過程UpdateOptimizableNode修改節(jié)點(diǎn)N的下標(biāo)集合為Iopt,更新子節(jié)點(diǎn)譯碼決策樹Tchild,并設(shè)置節(jié)點(diǎn)類型是否為已優(yōu)化節(jié)點(diǎn).圖6 展示了優(yōu)化后的效果,將下標(biāo)4 增加到2 號(hào)節(jié)點(diǎn)的判斷中,減少了名稱為C 的譯碼項(xiàng)和名稱為D 的譯碼項(xiàng)所在的層數(shù).

    Fig.6 The decoding decision tree optimized by process OptimizeTree based on fig.4圖6 在圖4 的基礎(chǔ)上使用過程OptimizeTree優(yōu)化的譯碼決策樹

    過程FixTree和過程FixNode與前2 個(gè)過程類似,用于修正指向譯碼決策樹中葉子節(jié)點(diǎn)的邊,將重復(fù)分支的標(biāo)簽合并為default.圖7 展示了優(yōu)化后的效果,由于根節(jié)點(diǎn)下的分支數(shù)已達(dá)到最大且僅有名稱為A的譯碼項(xiàng)對(duì)應(yīng)多個(gè)標(biāo)簽,所以本文方案將這些標(biāo)簽合并為default.

    Fig.7 The decoding decision tree optimized by process FixTree based on fig.6圖7 在圖6 的基礎(chǔ)上使用過程FixTree優(yōu)化的譯碼決策樹

    3.2.3 gem5 中的譯碼過程

    在gem5 的實(shí)現(xiàn)中,CPU 在譯碼階段會(huì)先將取指階段得到的數(shù)據(jù)傳給譯碼模塊,然后調(diào)用譯碼模塊來解析指令并得到一個(gè)基類指針,在執(zhí)行階段會(huì)調(diào)用其所指向的具體指令對(duì)象的執(zhí)行函數(shù),具體處理流程如圖8 所示.

    Fig.8 The decode and execute processes in gem5圖8 gem5 中的譯碼和執(zhí)行流程

    譯碼模塊中的指令解析過程分為2 個(gè)階段:預(yù)解析階段(圖8 ①)和譯碼階段(圖8 ②).首先,預(yù)解析階段的函數(shù)moreBytes() 會(huì)根據(jù)大小端和指令長度對(duì)取指階段得到的數(shù)據(jù)塊進(jìn)行處理,得到符合譯碼要求的具體指令位串.之后,譯碼階段會(huì)調(diào)用譯碼函數(shù)對(duì)該指令位串進(jìn)行解析.其中,譯碼函數(shù)的源文件是根據(jù)指令集描述語言在編譯過程中生成的,其函數(shù)體為一個(gè)多層嵌套的switch-case 結(jié)構(gòu).

    指令長度是根據(jù)位串中特定位的值來判斷,這個(gè)過程與之后譯碼函數(shù)中的操作存在重復(fù),即預(yù)解析階段和譯碼階段都會(huì)對(duì)同一段指令編碼進(jìn)行判斷.以Cortex-M3 指令集為例,16 位Thumb 指令和32 位Arm 指令是由指令編碼的前5 位來區(qū)分的,因此預(yù)解析階段和譯碼階段都會(huì)判斷這前5 位.此外,條件指令I(lǐng)T 因?yàn)槠錀l件執(zhí)行功能涉及對(duì)譯碼模塊的操作,所以會(huì)在預(yù)解析階段中被完整解析,但在之后的譯碼階段仍會(huì)被再次解析以獲得一個(gè)指向該指令對(duì)象的指針.

    為了解決上述問題,本文方案將原方案的譯碼函數(shù)拆分為多個(gè)譯碼函數(shù),并使用函數(shù)指針優(yōu)化調(diào)用過程.具體來說,本文方案的算法會(huì)根據(jù)指令集描述文件中設(shè)置的指令長度下標(biāo)集合及其取值情況來構(gòu)造多個(gè)譯碼決策樹,從而生成多個(gè)譯碼函數(shù).此外,本文方案的算法會(huì)自動(dòng)生成預(yù)解析階段所需的指令長度判斷函數(shù),以便根據(jù)判斷結(jié)果選擇對(duì)應(yīng)的譯碼函數(shù).

    4 測試用例生成

    本文方案搭建了一個(gè)對(duì)指令進(jìn)行功能測試的框架,能夠根據(jù)指令集描述為每條指令生成功能測試用例,并在gem5 上運(yùn)行所生成的測試程序得到測試報(bào)告.該框架主要包括3 部分:操作數(shù)數(shù)據(jù)生成、期望值數(shù)據(jù)計(jì)算和測試程序模板.

    以ARM Cortex-M3 的AND 指令為例,其操作數(shù)生成和期望值計(jì)算見算法3.該指令的匯編表示有2 種,即AND{S}{cond}Rn,#constant和AND{S}{cond}Rn,Rm,shi ft.其中,S表示是否更新狀態(tài)位,cond表示執(zhí)行的條件,Rn表示寄存器,#constant表示滿足特定格式的立即數(shù),Rm和shi ft表示寄存器及其移位信息.

    算法3.功能測試用例生成算法.

    輸入:指令測試描述info、測試范圍range和測試用例數(shù)量num;

    輸出:測試用例列表G.

    過程GenData(info,range,num)

    過程GenData用于生成操作數(shù)數(shù)據(jù),根據(jù)指令測試描述info、測試范圍range和測試用例數(shù)量num來隨機(jī)生成操作數(shù),并在邊界附近多生成一些值,之后調(diào)用過程GenExpAND生成期望值expects,最后返回測試用例列表G.

    過程GenExpAND用于生成期望值數(shù)據(jù),根據(jù)指令測試描述info和操作數(shù)ops來計(jì)算期望值expects,最后返回結(jié)果.

    此外,本文方案準(zhǔn)備了一系列測試程序模板,以宏的方式組織匯編指令,能夠?yàn)槊織l指令生成相應(yīng)的匯編文件作為測試程序.每個(gè)用例以宏的方式呈現(xiàn),例如TEST_AND_R_OP2C(testnum,inst,expExec,expRes,expApsr,Apsr,Rn,Constant)是用于AND 指令的第1 種匯編表示的宏,參數(shù)包括用例編號(hào)、被測指令、期望值和操作數(shù).

    5 實(shí)驗(yàn)結(jié)果

    本文實(shí)驗(yàn)環(huán)境的CPU 為Intel Core i5-10400 @2.90 GHz,內(nèi)存為32 GB,系統(tǒng)為Linux Mint 20.1 Kernel 5.4.0-89-generic.本文的gem5 配置為系統(tǒng)調(diào)用仿真(system call emulation, SE)模式,CPU 模型為Atomic-SimpleCPU,編譯版本為fast.本文方案中的指令集描述語言使用SLY[18]作為詞法和語法分析工具①gem5 原詞法和語法分析工具為PLY(Python Lex-Yacc), SLY(Sly Lex-Yacc)是其新版本.,并且修改了gem5 的編譯腳本,將本文方案整合到項(xiàng)目的構(gòu)建過程中.

    實(shí)驗(yàn)選擇Cortex-M3 指令集作為待描述的指令集,該指令集在gem5 項(xiàng)目中未做實(shí)現(xiàn).實(shí)驗(yàn)分別使用gem5 原方案與本文方案實(shí)現(xiàn)該指令集,并比較這2 種方案的性能以及所生成的代碼的運(yùn)行性能.此外,在實(shí)驗(yàn)前使用第4 節(jié)的功能測試框架為其生成了指令功能測試用例并確保其能正確執(zhí)行,即保證所實(shí)現(xiàn)的Cortex-M3 指令集的譯碼和執(zhí)行過程是功能正確的.

    5.1 方案性能比較

    指令集中每條指令編碼的查找路徑的長度是在譯碼決策樹中根節(jié)點(diǎn)到其所對(duì)應(yīng)葉節(jié)點(diǎn)的邊數(shù),即葉節(jié)點(diǎn)v在譯碼決策樹T中的高度,記為HT(v).將各譯碼決策樹中葉節(jié)點(diǎn)高度的平均值記為,將譯碼決策樹集合中所有葉節(jié)點(diǎn)高度的平均值記為.

    比較gem5 原方案與本文方案所生成的譯碼決策樹高度,結(jié)果如表2 所示.Cortex-M3 指令集共有226 個(gè)指令編碼.原方案生成的譯碼決策樹中葉節(jié)點(diǎn)的最大高度為10,最小高度為3,總平均高度為5.52.本文方案共生成4 個(gè)譯碼決策樹和1 個(gè)IT 指令的譯碼函數(shù),總平均高度為2.87.其譯碼范圍是根據(jù)預(yù)解析階段所處理的指令前5 位取值以及是否為IT 指令來劃分的,表2 中標(biāo)明了各個(gè)譯碼決策樹負(fù)責(zé)處理的譯碼范圍.其中,16 位指令的譯碼決策樹包含指令編碼數(shù)量最多,32 位指令(以11101 開頭)的譯碼決策樹的平均高度最大.與依賴開發(fā)者手動(dòng)構(gòu)造譯碼函數(shù)的原方案相比,本文方案在譯碼決策樹高度方面的優(yōu)化效果較好,并且很大程度上提升了開發(fā)效率.

    Table 2 Comparison of the Height of the Generated Decoding Decision Tree Between Two Methods Under Cortex-M3表2 在Cortex-M3 指令集下2 種方案所生成的譯碼決策樹高度的比較

    此外,統(tǒng)計(jì)這2 種方案生成譯碼決策樹及其C++源文件的時(shí)間和編譯后的可執(zhí)行文件gem5.fast 的代碼大小,結(jié)果如表3 所示.原方案需要開發(fā)者手動(dòng)編寫譯碼決策樹,并且需要將模板替換邏輯與指令定義寫在同一指令集描述文件中,在解析的同時(shí)處理替換過程,耦合度較高.本文方案僅將指令定義寫在指令集描述文件中,之后根據(jù)編碼信息自動(dòng)生成譯碼決策樹和C++源文件,所用的總時(shí)間比原方案減少了約64%,代碼大小減少了約407 KB.

    5.2 在gem5 中的運(yùn)行情況

    在gem5 中運(yùn)行一些測試程序并比較2 種方案的運(yùn)行性能.實(shí)驗(yàn)使用的測試程序來自Embench[19],這是一個(gè)面向嵌入式設(shè)備的開源測試集,它包含22 個(gè)測試程序,支持對(duì)真實(shí)機(jī)器和模擬器的測試.該測試集原本是通過遠(yuǎn)程調(diào)試器來獲取測試函數(shù)前后的指令周期數(shù)來評(píng)估處理器速度,而本文所研究的譯碼模塊優(yōu)化不影響模擬器中的周期數(shù),所以我們改為獲取測試函數(shù)前后的實(shí)際時(shí)間來評(píng)估模擬器譯碼模塊的性能,即通過shell 命令獲取宿主機(jī)時(shí)間.為減少額外操作對(duì)時(shí)間的影響,我們將默認(rèn)的測試循環(huán)次數(shù)由1 改為10,

    每個(gè)用例用時(shí)大約在10 s 左右.此外,gem5 原本使用了一個(gè)譯碼表來緩存相同地址或相同指令編碼的譯碼結(jié)果.由于實(shí)驗(yàn)所用的測試程序都依賴于循環(huán),并且在開始計(jì)時(shí)前會(huì)先運(yùn)行幾輪來預(yù)熱緩存,導(dǎo)致gem5 實(shí)際運(yùn)行時(shí)2 種方案幾乎沒有區(qū)別.這與本文實(shí)驗(yàn)?zāi)康牟环虼宋覀冊(cè)跍y試時(shí)關(guān)閉了譯碼緩存功能.

    測試結(jié)果如圖9 所示,原方案平均用時(shí)10.24 s,本文方案平均用時(shí)8.91 s,比原方案減少了大約13%.

    Fig.9 Execution performance of two methods in gem5 Under Cortex-M3圖9 在Cortex-M3 指令集下2 種方案在gem5 中運(yùn)行性能

    5.3 方案效果分析

    本文方案的譯碼決策樹生成算法采用劃分編碼位段的方式,通過計(jì)算位段的匹配情況和使用多個(gè)優(yōu)化策略來構(gòu)建樹的節(jié)點(diǎn),從而減少譯碼過程的時(shí)間開銷.

    譯碼過程的搜索時(shí)間開銷與譯碼決策樹的高度呈正相關(guān).樹的每個(gè)內(nèi)部節(jié)點(diǎn)所處理的位數(shù)n決定了該節(jié)點(diǎn)的子節(jié)點(diǎn)數(shù)量上限 2n.對(duì)于相同的指令數(shù)量,樹中內(nèi)部節(jié)點(diǎn)指向新子節(jié)點(diǎn)的分支數(shù)量越多,樹的高度越低.因此在樹的構(gòu)造過程中需要充分考慮指令長度和編碼限制條件,處理節(jié)點(diǎn)之間的合并優(yōu)化.

    為進(jìn)一步說明改進(jìn)效果,我們使用本文方案為RV64GC 指令集生成了譯碼決策樹并與gem5 原方案已實(shí)現(xiàn)的譯碼函數(shù)做比較,結(jié)果如表4 所示.RV64GC指令集的編碼設(shè)計(jì)較為規(guī)整,較少使用編碼的排除條件,因此其譯碼決策樹的高度整體較為平均.RV64GC 實(shí)驗(yàn)結(jié)果與Cortex-M3 類似,本文方案有效降低了譯碼決策樹的最大高度并且優(yōu)化了平均高度.

    Table 4 Comparison of the Height of the Generated Decoding Decision Tree Between Two Methods Under RV64GC表4 在RV64GC 指令集下2 種方案對(duì)于所生成的譯碼決策樹高度的比較

    6 討 論

    本文方案支持使用gem5 中提供的接口函數(shù)和類型定義(如向量操作),可以用于實(shí)現(xiàn)其他指令集架構(gòu),例如MIPS 和Cortex-A 等.從RV64GC 的實(shí)驗(yàn)結(jié)果可以看出,自動(dòng)化生成和優(yōu)化的預(yù)解析階段的輔助函數(shù)和譯碼決策樹可以在一定程度上降低譯碼決策樹的平均高度,提升執(zhí)行效率.此外,本文方案的指令集描述文件更易被編寫與修改,開發(fā)效率較高.

    本文方案的編碼描述和譯碼決策樹生成算法具有通用性,能夠應(yīng)用于指令譯碼過程,而功能描述和代碼生成階段則與模擬器的具體實(shí)現(xiàn)關(guān)系緊密.若要將本文方案推廣到其他模擬器,則還需從實(shí)現(xiàn)角度考慮模擬器是否可以采用這種譯碼和執(zhí)行流程,以及這種模板替換策略能否與模擬器其他模塊適配.

    7 結(jié) 論

    本文方案解決了模擬器的指令集實(shí)現(xiàn)及其功能測試的開發(fā)效率問題并提升了gem5 譯碼模塊的性能,為添加新指令集或自定義擴(kuò)展指令的開發(fā)與測試提供了一套完整方案.本文方案設(shè)計(jì)的指令集描述中定義了指令集的編碼描述、功能描述和測試描述,用于生成模擬器的譯碼模塊代碼、指令集實(shí)現(xiàn)代碼和指令功能測試用例.本文提出了一個(gè)針對(duì)gem5優(yōu)化的譯碼決策樹構(gòu)造算法和一個(gè)指令功能測試框架.該算法使用指令的特定位和排除條件位來判斷指令編碼,并且允許根據(jù)gem5 指令預(yù)解析階段的條件劃分各個(gè)決策樹的范圍,從而降低譯碼決策樹的平均高度并且減少了原方案中的重復(fù)判斷,提升執(zhí)行性能.此外,該指令功能測試框架可以根據(jù)指令集描述生成指令功能測試用例,提升開發(fā)效率.

    作者貢獻(xiàn)聲明:趙紫微為論文工作的主要完成人,負(fù)責(zé)實(shí)驗(yàn)設(shè)計(jì)與實(shí)施、論文撰寫;涂航和劉芹審閱論文的內(nèi)容并提出意見;余濤協(xié)助論文功能測試的軟件實(shí)現(xiàn);李莉?qū)φ撐奶岢鲂薷囊庖姡晟普撐乃悸泛蛯?shí)驗(yàn)設(shè)計(jì),負(fù)責(zé)論文審校.

    猜你喜歡
    指令集譯碼決策樹
    基于校正搜索寬度的極化碼譯碼算法研究
    3DNow指令集被Linux淘汰
    一種針對(duì)不均衡數(shù)據(jù)集的SVM決策樹算法
    決策樹和隨機(jī)森林方法在管理決策中的應(yīng)用
    電子制作(2018年16期)2018-09-26 03:27:06
    從霍爾的編碼譯碼理論看彈幕的譯碼
    新聞傳播(2016年3期)2016-07-12 12:55:27
    基于決策樹的出租車乘客出行目的識(shí)別
    實(shí)時(shí)微測量系統(tǒng)指令集及解析算法
    LDPC 碼改進(jìn)高速譯碼算法
    遙測遙控(2015年2期)2015-04-23 08:15:19
    基于肺癌CT的決策樹模型在肺癌診斷中的應(yīng)用
    什么是AMD64
    亚洲精品av麻豆狂野| 久久人人97超碰香蕉20202| 女生性感内裤真人,穿戴方法视频| 午夜91福利影院| 免费av毛片视频| 亚洲精品成人av观看孕妇| 久久婷婷成人综合色麻豆| 日韩精品青青久久久久久| 成人国产一区最新在线观看| 国产亚洲精品久久久久久毛片| xxx96com| 女警被强在线播放| 90打野战视频偷拍视频| 亚洲av电影在线进入| 成年人免费黄色播放视频| 国产一区二区在线av高清观看| 电影成人av| 亚洲一区高清亚洲精品| 亚洲精品av麻豆狂野| 不卡一级毛片| 亚洲精品美女久久久久99蜜臀| 国产成人精品久久二区二区91| 女人被狂操c到高潮| 男男h啪啪无遮挡| 身体一侧抽搐| 亚洲精品粉嫩美女一区| 国产成人av教育| 成人18禁高潮啪啪吃奶动态图| 欧美不卡视频在线免费观看 | 757午夜福利合集在线观看| 久久人人97超碰香蕉20202| 亚洲精品美女久久av网站| 少妇裸体淫交视频免费看高清 | 亚洲人成网站在线播放欧美日韩| 一进一出好大好爽视频| 午夜免费激情av| 黑人猛操日本美女一级片| 在线十欧美十亚洲十日本专区| 亚洲精品在线观看二区| 国产av精品麻豆| 日韩有码中文字幕| 看片在线看免费视频| 超碰97精品在线观看| 久久天堂一区二区三区四区| 午夜免费激情av| 色尼玛亚洲综合影院| 激情在线观看视频在线高清| 在线永久观看黄色视频| 亚洲人成电影观看| 亚洲在线自拍视频| a级毛片黄视频| 激情视频va一区二区三区| 成人18禁高潮啪啪吃奶动态图| 国产xxxxx性猛交| 欧美午夜高清在线| 天堂动漫精品| 欧美在线一区亚洲| 免费在线观看亚洲国产| 国产精品 欧美亚洲| 一级毛片高清免费大全| 亚洲午夜精品一区,二区,三区| 好男人电影高清在线观看| 日韩成人在线观看一区二区三区| 亚洲成人精品中文字幕电影 | 久久狼人影院| 亚洲视频免费观看视频| 岛国视频午夜一区免费看| 成人免费观看视频高清| 亚洲欧美激情综合另类| 久久精品亚洲熟妇少妇任你| 国产主播在线观看一区二区| 男人的好看免费观看在线视频 | 五月开心婷婷网| 欧美日韩视频精品一区| 91麻豆av在线| 少妇被粗大的猛进出69影院| 曰老女人黄片| 欧美激情久久久久久爽电影 | 正在播放国产对白刺激| 可以免费在线观看a视频的电影网站| 大码成人一级视频| 国产在线精品亚洲第一网站| 男男h啪啪无遮挡| 午夜激情av网站| 热re99久久精品国产66热6| 亚洲,欧美精品.| 久久久久九九精品影院| 亚洲精品久久午夜乱码| 亚洲专区中文字幕在线| 国产成人精品在线电影| 国产精品秋霞免费鲁丝片| 美女福利国产在线| 亚洲中文字幕日韩| 亚洲精品久久成人aⅴ小说| 日本a在线网址| 老司机福利观看| 韩国av一区二区三区四区| 欧美日韩瑟瑟在线播放| 欧美午夜高清在线| 国产亚洲精品久久久久5区| 99在线视频只有这里精品首页| 高潮久久久久久久久久久不卡| 黄色 视频免费看| 亚洲精品粉嫩美女一区| www国产在线视频色| 超碰成人久久| 美女午夜性视频免费| 日本免费a在线| 少妇的丰满在线观看| 美女国产高潮福利片在线看| 精品人妻在线不人妻| 两个人免费观看高清视频| 一区二区三区激情视频| 中文字幕人妻丝袜一区二区| 亚洲欧美激情综合另类| 手机成人av网站| av在线播放免费不卡| 一级片免费观看大全| 黄色丝袜av网址大全| 国产亚洲精品久久久久久毛片| 99精品欧美一区二区三区四区| 一区在线观看完整版| 一级毛片高清免费大全| av在线播放免费不卡| 99riav亚洲国产免费| 久久午夜综合久久蜜桃| 成人国产一区最新在线观看| 满18在线观看网站| 两个人看的免费小视频| 老司机靠b影院| 欧美日韩中文字幕国产精品一区二区三区 | 日韩 欧美 亚洲 中文字幕| 露出奶头的视频| 亚洲成国产人片在线观看| 又黄又爽又免费观看的视频| 天堂动漫精品| 欧美中文日本在线观看视频| 中文亚洲av片在线观看爽| 男女床上黄色一级片免费看| e午夜精品久久久久久久| 免费高清在线观看日韩| 成人三级做爰电影| 国产精品99久久99久久久不卡| 精品国产美女av久久久久小说| 久久九九热精品免费| 国产精品电影一区二区三区| 最好的美女福利视频网| 午夜福利在线观看吧| 国产日韩一区二区三区精品不卡| 亚洲中文字幕日韩| 国产有黄有色有爽视频| 亚洲情色 制服丝袜| 每晚都被弄得嗷嗷叫到高潮| 久久精品国产亚洲av高清一级| 欧美中文综合在线视频| 一进一出抽搐gif免费好疼 | 国产精品99久久99久久久不卡| 在线免费观看的www视频| 欧美日韩福利视频一区二区| 又黄又粗又硬又大视频| 免费在线观看完整版高清| 操出白浆在线播放| 搡老熟女国产l中国老女人| 婷婷精品国产亚洲av在线| 欧美成人性av电影在线观看| 黄色a级毛片大全视频| 大型黄色视频在线免费观看| 国产亚洲精品久久久久5区| www.熟女人妻精品国产| 18禁观看日本| 免费人成视频x8x8入口观看| 18禁国产床啪视频网站| 久久久久国内视频| 精品高清国产在线一区| 80岁老熟妇乱子伦牲交| 国产麻豆69| 久久精品亚洲精品国产色婷小说| www.999成人在线观看| x7x7x7水蜜桃| 国产亚洲av高清不卡| 天堂动漫精品| 校园春色视频在线观看| 精品电影一区二区在线| 久久久久久久久久久久大奶| 亚洲国产欧美网| 一区二区日韩欧美中文字幕| 女警被强在线播放| 一边摸一边抽搐一进一出视频| 欧美黄色片欧美黄色片| 在线av久久热| 身体一侧抽搐| 中文字幕人妻丝袜制服| 亚洲 欧美一区二区三区| 涩涩av久久男人的天堂| tocl精华| 亚洲午夜精品一区,二区,三区| 深夜精品福利| 免费久久久久久久精品成人欧美视频| 一进一出抽搐gif免费好疼 | 精品电影一区二区在线| 一边摸一边抽搐一进一小说| 热re99久久国产66热| 国产不卡一卡二| 午夜精品在线福利| a级毛片黄视频| 国产欧美日韩精品亚洲av| 99久久精品国产亚洲精品| 精品福利观看| 日韩三级视频一区二区三区| 精品午夜福利视频在线观看一区| 国产99白浆流出| 大陆偷拍与自拍| 法律面前人人平等表现在哪些方面| 亚洲精品国产区一区二| 日韩av在线大香蕉| av国产精品久久久久影院| 在线视频色国产色| 中文欧美无线码| 咕卡用的链子| www.999成人在线观看| aaaaa片日本免费| 精品少妇一区二区三区视频日本电影| 久久人妻福利社区极品人妻图片| xxxhd国产人妻xxx| 久热这里只有精品99| 女警被强在线播放| 黑人巨大精品欧美一区二区mp4| 国产精品日韩av在线免费观看 | 免费日韩欧美在线观看| 天堂√8在线中文| 狂野欧美激情性xxxx| 久久精品91蜜桃| 欧美激情高清一区二区三区| 国产成人av激情在线播放| 日韩欧美国产一区二区入口| 欧美日韩视频精品一区| 精品少妇一区二区三区视频日本电影| 18禁美女被吸乳视频| 久久久久久久久免费视频了| 一区二区日韩欧美中文字幕| 久久这里只有精品19| 黑人巨大精品欧美一区二区mp4| 久久久精品欧美日韩精品| 国产人伦9x9x在线观看| 久久狼人影院| 精品一区二区三区四区五区乱码| 身体一侧抽搐| 99riav亚洲国产免费| 国产成人av激情在线播放| 不卡一级毛片| 久久狼人影院| 欧美激情极品国产一区二区三区| 露出奶头的视频| 母亲3免费完整高清在线观看| 精品电影一区二区在线| 免费高清视频大片| 久久久久九九精品影院| 亚洲在线自拍视频| 成人特级黄色片久久久久久久| 嫩草影视91久久| 韩国av一区二区三区四区| 欧美成人午夜精品| 在线观看一区二区三区| 亚洲精品粉嫩美女一区| 大型av网站在线播放| 亚洲男人的天堂狠狠| 黄色毛片三级朝国网站| 老司机福利观看| 老熟妇乱子伦视频在线观看| 日韩欧美三级三区| 69av精品久久久久久| 国产单亲对白刺激| 超碰成人久久| 99re在线观看精品视频| 日韩人妻精品一区2区三区| 亚洲人成伊人成综合网2020| 国产三级黄色录像| 国内毛片毛片毛片毛片毛片| 国产极品粉嫩免费观看在线| av国产精品久久久久影院| 国产亚洲欧美精品永久| 午夜日韩欧美国产| 国产精品久久久av美女十八| 日韩人妻精品一区2区三区| 成人18禁高潮啪啪吃奶动态图| 好男人电影高清在线观看| 母亲3免费完整高清在线观看| 欧美最黄视频在线播放免费 | 天堂动漫精品| 97超级碰碰碰精品色视频在线观看| 精品少妇一区二区三区视频日本电影| 一二三四社区在线视频社区8| 欧美日韩一级在线毛片| 欧美乱码精品一区二区三区| 国产av一区二区精品久久| 亚洲人成电影观看| 午夜免费鲁丝| 激情视频va一区二区三区| a级片在线免费高清观看视频| 久久久久久久久久久久大奶| 国产区一区二久久| 91九色精品人成在线观看| 男女做爰动态图高潮gif福利片 | 大型av网站在线播放| 免费在线观看日本一区| 日韩精品免费视频一区二区三区| 香蕉国产在线看| 在线国产一区二区在线| 一区福利在线观看| 久久香蕉激情| 热99国产精品久久久久久7| 国产精品免费一区二区三区在线| 国产精品成人在线| 日日夜夜操网爽| 亚洲专区中文字幕在线| 女性生殖器流出的白浆| 亚洲欧美激情综合另类| 美女国产高潮福利片在线看| 国产精品国产av在线观看| 一区二区三区精品91| 怎么达到女性高潮| 久久欧美精品欧美久久欧美| 国产免费现黄频在线看| 亚洲第一欧美日韩一区二区三区| 中文字幕精品免费在线观看视频| 村上凉子中文字幕在线| 一个人免费在线观看的高清视频| 国产野战对白在线观看| 免费在线观看完整版高清| 在线观看免费日韩欧美大片| √禁漫天堂资源中文www| 亚洲精品在线美女| 淫秽高清视频在线观看| aaaaa片日本免费| 欧美精品啪啪一区二区三区| 窝窝影院91人妻| 999精品在线视频| 精品免费久久久久久久清纯| 中文字幕最新亚洲高清| 自线自在国产av| 性色av乱码一区二区三区2| 久久午夜综合久久蜜桃| 亚洲国产精品sss在线观看 | 最新在线观看一区二区三区| 亚洲中文字幕日韩| 成在线人永久免费视频| 国产精品一区二区免费欧美| 新久久久久国产一级毛片| 69av精品久久久久久| 久久国产精品人妻蜜桃| 丰满饥渴人妻一区二区三| 亚洲精品一二三| e午夜精品久久久久久久| 午夜激情av网站| 亚洲精品一二三| 精品熟女少妇八av免费久了| 黄色a级毛片大全视频| 亚洲精品成人av观看孕妇| 成人免费观看视频高清| 免费在线观看亚洲国产| 免费一级毛片在线播放高清视频 | 亚洲欧美精品综合一区二区三区| 国产一区在线观看成人免费| 免费女性裸体啪啪无遮挡网站| 狂野欧美激情性xxxx| 国产精品国产高清国产av| av在线播放免费不卡| 69av精品久久久久久| 9色porny在线观看| 91字幕亚洲| 日本免费a在线| 黄色a级毛片大全视频| 大型黄色视频在线免费观看| 欧美成人午夜精品| 亚洲少妇的诱惑av| 欧美激情高清一区二区三区| 国产激情久久老熟女| 超碰97精品在线观看| 黄色视频,在线免费观看| 国产精品一区二区在线不卡| 亚洲中文字幕日韩| 男女之事视频高清在线观看| 我的亚洲天堂| 人人妻,人人澡人人爽秒播| av免费在线观看网站| 亚洲色图av天堂| 成在线人永久免费视频| 亚洲精品久久午夜乱码| 老司机靠b影院| 中文字幕人妻丝袜制服| 黑人欧美特级aaaaaa片| 日韩中文字幕欧美一区二区| 色综合站精品国产| 国产高清videossex| 在线观看一区二区三区激情| 黄色片一级片一级黄色片| 又紧又爽又黄一区二区| 最近最新中文字幕大全免费视频| 精品久久久精品久久久| 99在线人妻在线中文字幕| svipshipincom国产片| 乱人伦中国视频| 国产av又大| 欧美乱色亚洲激情| 女性生殖器流出的白浆| 国产精品一区二区在线不卡| 99re在线观看精品视频| 久久精品国产99精品国产亚洲性色 | 国产有黄有色有爽视频| 国产精品一区二区免费欧美| 亚洲第一av免费看| 国产国语露脸激情在线看| 久久婷婷成人综合色麻豆| 视频在线观看一区二区三区| 热99国产精品久久久久久7| 国产免费现黄频在线看| 国产伦一二天堂av在线观看| 99re在线观看精品视频| 日韩一卡2卡3卡4卡2021年| ponron亚洲| 真人一进一出gif抽搐免费| 久热爱精品视频在线9| 亚洲激情在线av| 国产国语露脸激情在线看| 一级黄色大片毛片| 久久久精品欧美日韩精品| 搡老乐熟女国产| 日韩 欧美 亚洲 中文字幕| 别揉我奶头~嗯~啊~动态视频| 欧美精品啪啪一区二区三区| 久久中文字幕人妻熟女| 黄色毛片三级朝国网站| 丰满的人妻完整版| 亚洲男人的天堂狠狠| 国产真人三级小视频在线观看| 色婷婷av一区二区三区视频| 伊人久久大香线蕉亚洲五| 亚洲色图 男人天堂 中文字幕| 一a级毛片在线观看| 久久亚洲真实| 丝袜美足系列| 国产午夜精品久久久久久| 黄色怎么调成土黄色| 日韩欧美一区二区三区在线观看| 人妻久久中文字幕网| 在线视频色国产色| 性欧美人与动物交配| 国产野战对白在线观看| 美女 人体艺术 gogo| 每晚都被弄得嗷嗷叫到高潮| 成人手机av| 一级黄色大片毛片| 51午夜福利影视在线观看| 亚洲 欧美一区二区三区| 亚洲第一青青草原| 中文字幕最新亚洲高清| 亚洲片人在线观看| 精品久久久久久成人av| 波多野结衣av一区二区av| 99热国产这里只有精品6| 久久久久久免费高清国产稀缺| 大香蕉久久成人网| 国产精品1区2区在线观看.| 亚洲七黄色美女视频| 亚洲色图综合在线观看| 亚洲第一青青草原| 国产片内射在线| 久久国产精品男人的天堂亚洲| 波多野结衣一区麻豆| 精品少妇一区二区三区视频日本电影| 一夜夜www| 在线国产一区二区在线| 人人妻人人爽人人添夜夜欢视频| 亚洲国产中文字幕在线视频| 丁香欧美五月| 最新在线观看一区二区三区| 嫩草影视91久久| 亚洲人成电影免费在线| 欧美日韩黄片免| 桃红色精品国产亚洲av| 久久国产精品影院| 日韩人妻精品一区2区三区| 在线十欧美十亚洲十日本专区| 香蕉丝袜av| 欧美乱码精品一区二区三区| 国产成人精品在线电影| 看片在线看免费视频| 免费高清视频大片| 亚洲欧美日韩高清在线视频| 欧美激情 高清一区二区三区| www.熟女人妻精品国产| 国产主播在线观看一区二区| 色综合欧美亚洲国产小说| 好男人电影高清在线观看| av福利片在线| 老司机靠b影院| tocl精华| 午夜免费成人在线视频| 亚洲男人的天堂狠狠| 亚洲熟妇中文字幕五十中出 | 亚洲人成77777在线视频| 色老头精品视频在线观看| 中文欧美无线码| av天堂在线播放| 久久久国产一区二区| 精品乱码久久久久久99久播| 韩国av一区二区三区四区| 国产精品 国内视频| 午夜视频精品福利| www国产在线视频色| 欧美老熟妇乱子伦牲交| 亚洲国产欧美网| 电影成人av| ponron亚洲| 自拍欧美九色日韩亚洲蝌蚪91| 欧美老熟妇乱子伦牲交| 久久精品国产综合久久久| 一个人观看的视频www高清免费观看 | 亚洲午夜理论影院| 精品福利永久在线观看| 欧美一区二区精品小视频在线| 精品欧美一区二区三区在线| 国产精品一区二区三区四区久久 | 桃色一区二区三区在线观看| 久久天堂一区二区三区四区| 9191精品国产免费久久| 亚洲精华国产精华精| 日本免费一区二区三区高清不卡 | 9热在线视频观看99| 久久香蕉激情| av在线播放免费不卡| 9色porny在线观看| 少妇裸体淫交视频免费看高清 | 亚洲精品中文字幕一二三四区| 精品一区二区三区视频在线观看免费 | 人人妻人人添人人爽欧美一区卜| 免费观看人在逋| 亚洲人成网站在线播放欧美日韩| 久久久精品国产亚洲av高清涩受| 国产免费av片在线观看野外av| 99国产精品99久久久久| 亚洲黑人精品在线| 少妇粗大呻吟视频| 亚洲男人的天堂狠狠| av有码第一页| 亚洲精品一卡2卡三卡4卡5卡| 女警被强在线播放| 国产av一区二区精品久久| 99国产精品99久久久久| 色精品久久人妻99蜜桃| 国产精品影院久久| 天堂影院成人在线观看| 黑丝袜美女国产一区| 国产精品免费视频内射| 日韩一卡2卡3卡4卡2021年| 午夜免费观看网址| 成人永久免费在线观看视频| 香蕉国产在线看| 日本欧美视频一区| 可以在线观看毛片的网站| 69av精品久久久久久| 日本免费一区二区三区高清不卡 | 九色亚洲精品在线播放| 女警被强在线播放| av视频免费观看在线观看| 男男h啪啪无遮挡| 久久精品成人免费网站| 新久久久久国产一级毛片| 9色porny在线观看| 亚洲av第一区精品v没综合| 色哟哟哟哟哟哟| av网站在线播放免费| av有码第一页| 精品少妇一区二区三区视频日本电影| 桃色一区二区三区在线观看| 国产成年人精品一区二区 | 久久性视频一级片| 美女大奶头视频| 国产激情欧美一区二区| 色精品久久人妻99蜜桃| 亚洲精品一区av在线观看| 两个人看的免费小视频| 黄频高清免费视频| 一进一出抽搐gif免费好疼 | 亚洲第一av免费看| 日日夜夜操网爽| a级毛片在线看网站| av中文乱码字幕在线| 久久影院123| 日韩欧美免费精品| 成人av一区二区三区在线看| 多毛熟女@视频| 黑丝袜美女国产一区| 999久久久精品免费观看国产| 99久久综合精品五月天人人| 五月开心婷婷网| 亚洲五月色婷婷综合| 桃色一区二区三区在线观看| 免费高清视频大片| 国产精品99久久99久久久不卡| 亚洲成a人片在线一区二区| 中文字幕人妻丝袜一区二区| 欧美日韩av久久| 性少妇av在线| 天堂动漫精品| 水蜜桃什么品种好| 极品人妻少妇av视频| 男女床上黄色一级片免费看| 老熟妇乱子伦视频在线观看| 日韩一卡2卡3卡4卡2021年| 99精品欧美一区二区三区四区| 老司机在亚洲福利影院| 极品人妻少妇av视频| 亚洲熟妇中文字幕五十中出 | 久99久视频精品免费|