亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于LLVM的RISC-V自定義擴展指令支持方法①

        2022-01-06 08:04:44邢明杰
        計算機系統(tǒng)應用 2021年11期
        關鍵詞:指令

        王 鵬, 陳 影, 邢明杰

        1(中國科學院 軟件研究所, 北京 100190)

        2(中國科學院 深圳先進技術研究院, 深圳 518055)

        3(合肥工業(yè)大學 數(shù)學學院, 合肥 230601)

        由于RISC-V指令集架構(gòu)具有開源、模塊化、可擴展等特性, 近年來在許多領域迅速興起.國內(nèi)外也出現(xiàn)了一些基于RISC-V進行指令集擴展的研究和實現(xiàn).例如, 神經(jīng)網(wǎng)絡指令集擴展研究[1-4], 加密指令集擴展研究[5], 平頭哥公司發(fā)布的玄鐵C910處理器[6]等.對于標準指令集擴展, RISC-V社區(qū)會提供完整的工具鏈支持[7], 而對于非標準的自定義指令集擴展, 則意味著需要用戶自己實現(xiàn)工具鏈支持.

        LLVM編譯框架具有模塊化、可復用等特性[8-10],適合用于快速搭建原型系統(tǒng)和二次開發(fā).目前LLVM社區(qū)已經(jīng)對RISC-V體系結(jié)構(gòu)進行支持.本文通過對LLVM現(xiàn)有框架進行分析, 研究在RISC-V后端對自定義擴展指令集的支持方法, 為基于LLVM基礎架構(gòu)的RISC-V自定義指令集擴展研究與實現(xiàn)提供借鑒.文章組織如下: 第1節(jié)介紹RISC-V指令集擴展, 包括標準指令集擴展和非標準的自定義指令集擴展; 第2節(jié)對LLVM框架進行分析, 重點分析現(xiàn)有的RISC-V體系結(jié)構(gòu)相關部分; 第3節(jié)研究基于LLVM實現(xiàn)擴展指令支持的方法, 并以玄鐵C910為例進行實現(xiàn)和驗證;第4節(jié)給出結(jié)論與展望.

        1 RISC-V指令集擴展

        RISC-V指令集架構(gòu)被設計成由基礎整數(shù)指令集和各種擴展指令集組成.其中, 基礎整數(shù)指令集非常精簡(目前最新版本的RV32I僅包含40條指令), 同時功能又足以支持編譯器和操作系統(tǒng)[7-9].擴展指令集分為標準擴展指令集和非標準擴展指令集.擴展指令集不僅支持固定寬度指令, 還可以支持可變長指令和VLIW指令.為了能夠有效支持各種指令集擴展, RISC-V指令集架構(gòu)在編碼空間和命名約定等方面做了詳細的設計和規(guī)劃.

        1.1 標準指令集擴展

        標準指令集擴展涵蓋了常用的功能支持, 并且相互之間不能存在指令編碼沖突.非特權指令集使用單個字母或者以Z開頭的字母組合來命名, 特權指令集則使用S (Supervisor級別)、H (Hypervisor級別)或者Zxm (Machine級別)開頭的字母組合來命名.其中, 字母G用來表示通用指令集擴展組合IMAFDZicsr_Zifencei,依次表示整數(shù)、乘除法、單精度浮點、雙精度浮點、控制狀態(tài)寄存器訪問、取指柵欄指令集.指令集名稱不區(qū)分大小寫, 名稱之間可以使用下劃線來分割, 并且后面可以有版本號信息.

        RISC-V國際基金會下面設有專門的任務工作組來負責標準指令集擴展規(guī)范的制定.同時還設有工具鏈相關的任務工作組來負責推動開源社區(qū)工具鏈對標準指令集的支持, 從而對RISC-V的生態(tài)建設起到很好的支撐作用.

        1.2 自定義指令集擴展

        RISC-V指令集架構(gòu)允許并鼓勵用戶根據(jù)自己的需求來定制指令集擴展.自定義的非標準指令集可以與它不支持的標準擴展或者非標準擴展之間存在指令編碼沖突.不過為了減少沖突, RISC-V指令集規(guī)范也為自定義擴展指令集預留了4個主編碼字段: 0b0001011(custom-0), 0b0101011 (custom-1), 0b1011011 (custom-2)和0b1111011 (custom-3).自定義擴展指令集使用以X開頭的字母組合來命名.

        比較有代表性的自定義指令集擴展實現(xiàn)是平頭哥推出的玄鐵C910, 一款12級超標量流水線、3發(fā)射、亂序執(zhí)行的高性能64位嵌入式多集群多核RISC-V處理器.其標準指令集架構(gòu)為RV64GCV, 并在此基礎上增加了自定義擴展指令集和相應的控制狀態(tài)寄存器,用于增強計算、存儲和多核等方面的性能.擴展指令集的總體信息如表1所示.

        表1 玄鐵C910擴展指令集

        新增指令的位寬為32位固定長度, 其指令主編碼使用的是custom-0預留編碼.新增控制狀態(tài)寄存器的總體信息如表2所示.

        表2 玄鐵C910擴展寄存器

        此外, 擴展指令集需要在機器模式控制狀態(tài)寄存器MXSTATUS中開啟擴展指令集使能位THEADISAEE的時候才能正常運用, 否則會出現(xiàn)非法指令異常.

        2 LLVM框架分析

        最新的LLVM代碼已經(jīng)開始對RISC-V體系結(jié)構(gòu)進行支持.因此, 在LLVM中增加自定義擴展指令支持需要首先對LLVM框架[11], 特別是RISC-V相關部分有所熟悉[12].

        2.1 LLVM整體框架

        LLVM可以看作是一個編譯基礎設施, 由一系列的功能模塊以及基于這些模塊構(gòu)建的工具集組成[13-15].其整體框架如圖1所示.

        圖1 LLVM整體框架

        LLVM主要涉及到編譯器的中、后端, 其代碼以模塊的形式進行劃分和實現(xiàn), 包括中間表示、代碼分析、優(yōu)化和代碼生成等[16-18].基于這些模塊實現(xiàn)的工具集有優(yōu)化器(opt)、生成器(llc)、匯編器(llvmmc)等[19].Clang主要涉及到編譯器的前端, 也是采用類似的形式進行模塊化實現(xiàn), 包括抽象語法樹、詞法分析、語法分析、語義分析和LLVM中間代碼生成等.基于這些模塊實現(xiàn)的工具集有編譯器(clang)、靜態(tài)檢查工具(clang-tidy)等[20].

        2.2 RISC-V體系結(jié)構(gòu)相關部分

        為了能夠支持多種目標體系結(jié)構(gòu)(X86、ARM、RISC-V等), LLVM的代碼結(jié)構(gòu)被劃分成體系結(jié)構(gòu)無關部分和相關部分, 如圖2所示.

        圖2 多目標體系結(jié)構(gòu)支持框架

        體系結(jié)構(gòu)無關部分使用通用的算法來實現(xiàn)各種分析、優(yōu)化以及代碼生成(涉及指令選擇、指令調(diào)度、寄存器分配等), 并通過抽象接口來獲取體系結(jié)構(gòu)相關的信息, 執(zhí)行相應的處理.其中RISC-V體系結(jié)構(gòu)相關信息主要包括:

        1) 芯片特性.描述芯片所支持的特性、對應的命令行參數(shù)和說明信息等.

        2) 寄存器信息.描述寄存器的編號、大小、存放數(shù)據(jù)類型、名稱、類別、分配優(yōu)先級等.

        3) 指令信息.描述指令格式、編碼、操作數(shù)、指令選擇匹配模式、對應的匯編代碼等.

        4) 調(diào)用約定.描述需要被調(diào)用函數(shù)保存的寄存器列表等.

        5) 調(diào)度模型.描述調(diào)度資源、指令延遲周期、對調(diào)度資源的使用情況等.

        6) 處理器模型.描述處理器所支持的指令調(diào)度模型、芯片特性等.

        這些信息都是通過LLVM自帶的TableGen語言來編寫.TableGen是一個領域?qū)S谜Z言, 用來幫助LLVM開發(fā)者來處理大規(guī)模的信息描述, 簡化代碼編寫和維護工作.其語法形式借鑒了C++的類和模板, 并增加一些用于處理指令選擇、指令編碼的數(shù)據(jù)類型和操作.

        圖3給出了TableGen代碼的處理流程: 在構(gòu)建LLVM的時候, 用戶使用TableGen編寫的代碼(文件名通常以td為后綴), 會先通過工具llvm-tblgen進行解析, 然后在構(gòu)建目錄下生成C++數(shù)據(jù)結(jié)構(gòu)和代碼片段(文件名通常以inc為后綴), LLVM源文件通過#include方式將這些生成的文件包含進來.

        圖3 TableGen代碼處理流程

        TableGen本身只是描述信息記錄, 至于具體生成什么樣的C++代碼, 則需要LLVM開發(fā)者來實現(xiàn)相應的C++代碼生成后端.除此之外, 還有一些目標體系結(jié)構(gòu)抽象接口不適合使用TableGen來描述和自動生成,這部分則直接使用C++代碼來實現(xiàn), 主要包括:

        1) 棧幀布局.處理棧空間的增長方向、地址對齊方式、局部變量地址偏移以及在函數(shù)開頭和結(jié)尾處插入棧幀維護代碼等.

        2) 部分指令選擇處理.例如指令DAG圖構(gòu)建過程中的類型和操作合法化、函數(shù)調(diào)用和返回的處理、特殊DAG節(jié)點的處理等.

        3) 部分寄存器信息.例如獲取預留寄存器列表、消除幀指針等.

        4) 部分指令信息.例如判斷指令是否為對棧槽進行加載或存儲、對分支跳轉(zhuǎn)指令的分析和處理等.

        5) 匯編器和反匯編器的接口函數(shù)實現(xiàn).

        6) 機器代碼層(MC)的處理.例如ELF文件寫出、重定位信息、匯編指令打印等.

        2.3 LLVM測試框架

        LLVM源碼包中自帶的測試用例有兩種: 回歸測試與單元測試.其中單元測試使用Google C++測試框架編寫, 用來測試LLVM的功能單元.回歸測試使用LLVM測試框架編寫, 用來驗證特定功能點或者已經(jīng)修復的問題.這些測試用例需要在每次提交代碼之前運行通過, 從而避免新的改動出現(xiàn)回退現(xiàn)象.

        3 擴展指令支持方法

        我們可以將基于LLVM的擴展指令支持分為匯編層面支持和編譯層面支持.其中, 編譯層面支持是指可以將用戶編寫的高級語言程序轉(zhuǎn)換成含有擴展指令的匯編程序或者機器指令編碼.編譯層面支持有兩種常見的方式: 一是在高級語言中定義新的數(shù)據(jù)類型和編譯器內(nèi)建函數(shù), 使得用戶可以直接通過函數(shù)調(diào)用的形式來使用擴展指令; 二是通過編譯優(yōu)化技術將中間代碼自動轉(zhuǎn)換成機器特定的擴展指令.

        本文主要研究匯編層面的支持方法.匯編層面支持是指可以將用戶編寫的含有擴展指令的匯編程序轉(zhuǎn)換成機器指令編碼.根據(jù)前面對RISC-V指令擴展的介紹以及LLVM框架的分析, 可以看到匯編層面支持大體需要完成如下工作:

        1)定義新的芯片特性, 添加命令行選項;

        2) 針對新增加的寄存器, 實現(xiàn)相應的寄存器信息描述以及可能涉及到的抽象接口;

        3) 針對新增加的指令, 實現(xiàn)相應的指令信息描述以及可能涉及到的抽象接口;

        4) 根據(jù)指令集擴展情況, 可能需要對匯編器和反匯編器的接口函數(shù)進行更新實現(xiàn);

        5) 根據(jù)指令集擴展情況, 可能需要在機器代碼層增加相應的處理;

        6) 編寫測試用例, 對新增加的指令集擴展進行測試和驗證.

        接下來, 我們將以玄鐵C910的擴展指令支持為例, 對主要涉及到的工作內(nèi)容進行具體介紹.我們已經(jīng)將完整的代碼實現(xiàn)進行了開源, 項目地址為: https://github.com/isrc-cas/c910-llvm.

        3.1 定義芯片特性, 添加命令行選項

        我們在RISCV.td文件中, 通過TableGen語言來描述玄鐵C910所支持的指令擴展特性.參見代碼示例1,其中特性FeatureExtXuantie繼承自SubtargetFeature,并通過模板參數(shù)給出名字、屬性、屬性值、文字描述信息.同時, 定義一個斷言HasExtXuantie, 可以在指令描述中用來設置指令選擇和匯編指令匹配的判斷條件.

        代碼示例1.定義芯片特性def FeatureExtXuantie:SubtargetFeature<"xuantie", "HasExtXuantie","true", "'Xuantie' (Xuantie Custom Instructions)">;def HasExtXuantie:Predicate<"Subtarget->hasExtXuantie()">,AssemblerPredicate<"FeatureXcache">;

        除此之外, 還定義了一個命名為c910的處理器模型.從而, 用戶可以在匯編器llvm-mc的命令行中使用-mattr=+xuantie或者-mcpu=c910來開啟對玄鐵C910擴展指令的支持特性.

        3.2 描述寄存器信息

        由于玄鐵 C910只對控制狀態(tài)寄存器進行了擴展,并沒有增加新的通用寄存器或者其他用來存放數(shù)據(jù)、參與寄存器分配的寄存器, 因此, 基于現(xiàn)有的RISC-V代碼框架, 對這部分進行支持所需要做的工作比較簡單.我們在RISCVSystemOperands.td文件中, 使用TableGen語言對它進行描述.代碼示例2給出了部分擴展控制狀態(tài)寄存器的描述, 例如, MXSTATUS寄存器繼承自父類SysReg, 并通過模板參數(shù)給出它的名字和編碼.

        代碼示例2.描述狀態(tài)寄存器信息def MXSTATUS : SysReg<"mxstatus", 0x7C0>;def MHCR : SysReg<"mhcr", 0x7C1>;def MCOR : SysReg<"mcor", 0x7C2>;def MCCR2 : SysReg<"mccr2", 0x7C3>;

        現(xiàn)有的RISC-V代碼框架已經(jīng)實現(xiàn)了SysReg的定義, 以及相應的支持.所以, 用戶只需要添加一行TableGen描述即可.然后在匯編程序中, 便可以使用該寄存器的名字作為指令的符號操作數(shù).

        3.3 描述指令信息

        我們以玄鐵C910的位操作擴展指令EXT (寄存器連續(xù)位提取符號位擴展指令)和EXTU (寄存器連續(xù)位提取零擴展指令)為例介紹如何使用TableGen語言來描述指令信息.圖4給出了這兩條指令的編碼格式.

        圖4 位操作擴展指令EXT和EXTU

        其匯編語法形式如下:

        1) ext rd, rs1, imm1, imm2

        2) extu rd, rs1, imm1, imm2

        可以看到EXT和EXTU兩條指令具有相同的操作數(shù), 只不過是12-14位的編碼不同.因此, 可以將相同指令格式提取出來, 使用TableGen的class類型定義成一個模板類, 從而避免冗余的指令信息描述.圖5給出了兩個指令格式, 其中模板類RVInst是在RISCVInstrFormats.td文件中定義, 用來表示32位的RISC-V指令格式.目前LLVM中所有的RISC-V擴展指令都是繼承自該父類.

        圖5 指令格式

        我們參照LLVM現(xiàn)有的RISC-V代碼框架, 新增加一個RISCVInstrFormatsC910.td文件用來定義擴展指令格式.其中模板類RVInstC910BO_1用來表示EXT和EXTU這樣的位操作擴展指令格式, 它的主編碼為0b0001011 (指令集規(guī)范中預留的custom-0主編碼).然后新增加一個RISCVInstrInfoC910.td文件用來定義具體的擴展指令, 以及細化的指令格式模板子類.

        代碼示例3給出了RVInstC910BO_1的定義, 其模板參數(shù)分別為12-14位的編碼, 指令的輸出和輸入操作數(shù), 匯編指令字符串.然后, 在類的定義中根據(jù)這些參數(shù)來設置指令相應字段的值.具體的代碼含義可以參照TableGen語言文檔資料.通過TableGen提供的這種抽象和繼承機制, 我們可以很方便的實現(xiàn)對玄鐵C910擴展指令集的支持.

        代碼示例3.描述指令信息class RVInstC910BO_1<bits<3> funct3, dag outs, dag ins, string opcodestr, string argstr>: RVInst<outs, ins, opcodestr, argstr, [], InstFormatOther> {bits<6> imm1;bits<6> imm2;bits<5> rs1;bits<5> rd;let Inst{31-26} = imm1;let Inst{25-20} = imm2;let Inst{19-15} = rs1;let Inst{14-12} = funct3;let Inst{11-7} = rd;let Opcode = OPC_CUSTOM0.Value;}

        3.4 測試驗證

        最后, 我們通過編寫測試用例, 來驗證對玄鐵C910擴展指令的支持情況.參照現(xiàn)有測試框架, 在test/MC/RISCV目錄下新增一個c910-valid.s文件用來測試有效的匯編指令, 同時新增一個c910-invalid.s文件用來測試對無效指令的錯誤處理.代碼示例4中給出了測試用例的開頭部分.

        代碼示例4.測試用例# RUN: llvm-mc %s -triple=riscv64 -mcpu=c910 -riscv-no-aliases -show-encoding # RUN: | FileCheck -check-prefixes=CHECK-ASM,CHECK-ASMAND-OBJ %s# CHECK-ASM-AND-OBJ: ext a0, a1, 4, 1# CHECK-ASM: encoding: [0x0b,0xa5,0x15,0x10]ext a0, a1, 4, 1

        前兩行是要執(zhí)行的測試命令, 由RUN開頭并且嵌套在代碼注釋中.LLVM測試工具llvm-lit會根據(jù)這些命令來調(diào)用匯編器llvm-mc, 然后將輸出結(jié)果傳送給檢查工具FileCheck.FileCheck工具會根據(jù)注釋中CHECK關鍵字開頭的內(nèi)容來對比匯編生成結(jié)果.

        代碼示例5是匯編指令測試用例, 有效匯編指令c910-valid.s文件中包含了新增的99條自定義玄鐵C910指令集, 我們運行l(wèi)lvm-lit來單獨測試c910-valid.s匯編文件的正確性, 運行結(jié)果輸出 Expected Passes 1, 說明所有的新增自定義指令的匯編編碼都是正確的.

        代碼示例5.匯編指令測試用例$./bin/llvm-lit -v../test/MC/RISCV/c910-valid.s-- Testing: 1 tests, single process --PASS: LLVM :: MC/RISCV/c910-valid.s (1 of 1)Testing Time: 0.30s Expected Passes : 1

        代碼示例6是新增寄存器測試用例, 在控制與狀態(tài)寄存器文件user-csr-names.s中, 我們添加了玄鐵C910擴展寄存器fxcr, 它的功能是用于浮點擴展功能開關和浮點異常累積位, 我們對新增寄存器進行指令編碼,然后用llvm-mc求出fxcr的編碼, 同時將寄存器別名添加到user-csr-names.s匯編文件中.

        代碼示例6.新增寄存器測試用例User@dacent:~/tools/c910-project/c910-llvm/test/MC/RISCV$ vim user-csr-names.s# fxcr# name# CHECK-INST: csrrs t1, fxcr, zero# CHECK-ENC: encoding: [0x73,0x23,0x00,0x80]# CHECK-INST-ALIAS: csrr t1, fxcr# uimm12# CHECK-INST: csrrs t2, fxcr, zero# CHECK-ENC: encoding: [0xf3,0x23,0x00,0x80]# CHECK-INST-ALIAS: csrr t2, fxcr# name csrrs t1, fxcr, zero# uimm12 csrrs t2, 0x800, zero

        代碼示例7是99條新增玄鐵C910指令中ff0指令, ff0指令是快速找 0 指令, 我們用llvm-mc進行測試, 編譯選項選擇mcpu=c910 和mattr=+c910, 可以確定ff0指令對應的編碼形式.

        代碼示例7.ff0指令匯編測試用例User@dacent:~/tools/c910-project/c910-llvm/build/bin$ echo "ff0 a0,a1" |./llvm-mc --triple=riscv64 -mcpu=c910 -mattr=+c910 -showencoding -show-inst.text ff0a0, a1# encoding: [0x0b,0x95,0x05,0x84]# <MCInst #399 FF0# <MCOperand Reg:11># <MCOperand Reg:12>>

        代碼示例8是利用llvm-mc, 在選定了編譯選項是mcpu=c910 和mattr=+c910之后, 對匯編編碼進行反匯編測試, 查看執(zhí)行之后得出的是否是對應的ff0匯編指令.

        代碼示例8.ff0指令反匯編測試用例User@dacent:~/tools/c910-project/c910-llvm/build/bin$ echo"0x0b,0x95,0x05,0x84" |./llvm-mc -disassemble --triple=riscv64 -mcpu=c910 -mattr=+c910 -show-encoding -show-inst.text ff0a0, a1# encoding: [0x0b,0x95,0x05,0x84]# <MCInst #399 FF0# <MCOperand Reg:11># <MCOperand Reg:12>>

        表3中列出了我們目前支持的所有新增玄鐵C910指令的匯編測試, 反匯編測試, 編譯選項mcpu=c910測試和無效操作數(shù)測試, 說明了新增玄鐵C910自定義擴展指令集在LLVM中具有功能完備性支持.

        表3 功能完備性測試

        除此之外, 我們還在一個C文件test.c中, 使用內(nèi)聯(lián)匯編的方式編寫了一條上述已定義的玄鐵C910擴展指令, 使用clang編譯生成匯編文件, 然后用llvm-mc將匯編文件test.s, 編譯選項是mcpu=c910, 編譯成目標文件, 之后可以通過反匯編來驗證正確性.

        代碼示例9.玄鐵C910新增指令內(nèi)聯(lián)匯編測試用例$./bin/clang --target=riscv64-unknown-elf test.c -S -o test.s$ cat test.c int main(){int a,b,c;a = 1;b = 2;asm volatile("mula %[z], %[x], %[y] ": [z] "=r" (c): [x] "r" (a), [y] "r" (b));if ( c == 0 ){

        return -1;}return 0;}$./bin/llvm-mc test.s -triple=riscv64 -mcpu=c910 -show-encoding -show-inst --filetype=obj -o=test.o

        4 結(jié)論與展望

        本文通過對RISC-V指令集擴展和LLVM框架的分析, 給出了在LLVM中實現(xiàn)對RISC-V自定義指令集擴展的支持方法.結(jié)合玄鐵C910的例子可以看到,在現(xiàn)有LLVM框架下, 對于32位指令集擴展的匯編層面支持比較容易實現(xiàn).

        對于其他寬度的指令擴展支持, 包括可變長指令和VLIW指令擴展的支持, 還需要做進一步的分析研究.除此之外, 對擴展指令的編譯層面支持涉及到編譯器的前、中和后端多個方面.后續(xù)工作中, 將重點研究這部分內(nèi)容.

        猜你喜歡
        指令
        聽我指令:大催眠術
        ARINC661顯控指令快速驗證方法
        測控技術(2018年5期)2018-12-09 09:04:26
        LED照明產(chǎn)品歐盟ErP指令要求解讀
        電子測試(2018年18期)2018-11-14 02:30:34
        殺毒軟件中指令虛擬機的脆弱性分析
        電信科學(2016年10期)2016-11-23 05:11:56
        巧用G10指令實現(xiàn)橢圓輪廓零件倒圓角
        中斷與跳轉(zhuǎn)操作對指令串的影響
        科技傳播(2015年20期)2015-03-25 08:20:30
        基于匯編指令分布的惡意代碼檢測算法研究
        一種基于滑窗的余度指令判別算法
        歐盟修訂電氣及電子設備等產(chǎn)品安全規(guī)定
        家電科技(2014年5期)2014-04-16 03:11:28
        MAC指令推動制冷劑行業(yè)發(fā)展
        汽車零部件(2014年2期)2014-03-11 17:46:27
        9久久婷婷国产综合精品性色| 在线观看日本一区二区| 日本一区二区三区四区在线看| 一区二区三区av在线| 国产精品久久成人网站| 久久这里只精品国产免费10| 无码伊人66久久大杳蕉网站谷歌| 我想看久久久一级黄片| 少妇被又大又粗又爽毛片久久黑人 | 一本一本久久a久久精品综合| 在线a人片免费观看高清| 偷拍韩国美女洗澡一区二区三区 | 无套内射无矿码免费看黄| 亚洲乱码一区二区三区成人小说| 国产一级黄片久久免费看| 中文字幕无码乱人伦| 99香蕉国产精品偷在线观看 | 国产三级av在线播放| 日韩女同精品av在线观看| 中出人妻中文字幕无码| 亚洲精品美女久久久久久久| 色综合久久五十路人妻| 日日麻批免费40分钟无码| 色婷婷综合中文久久一本 | 少妇又紧又色又爽又刺| 精品无码国产一区二区三区麻豆| 久久精品99久久香蕉国产色戒| 精品亚洲女同一区二区| 亚洲av日韩综合一区尤物| 国产成人无码av| 欧美午夜刺激影院| 日韩av在线不卡一二三区| 亚洲成av人片女在线观看| 久久精品国产亚洲av蜜臀| 国产九九在线观看播放| 日本老熟妇五十路一区二区三区| 无码人妻丰满熟妇啪啪网站| 欧美日韩在线观看免费| 久久夜色精品亚洲天堂| 国产精品免费观看调教网| 成在人线av无码免费|