青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

兔子的技術(shù)博客

兔子

   :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
  202 Posts :: 0 Stories :: 43 Comments :: 0 Trackbacks

留言簿(10)

最新評論

閱讀排行榜

評論排行榜

英文原文:http://www.codeproject.com/KB/recipes/mmxintro.aspx
翻譯原文:http://www.itepub.net/html/article/bianchengkaifa/cnetok/xitongbiancheng/2006/0428/2101.html

MMX技術(shù)簡介

Intel 公司的MMX™(多媒體增強(qiáng)指令集)技術(shù)可以大大提高應(yīng)用程序?qū)ΧS三維圖形和圖象的處理能力。Intel MMX技術(shù)可用于對大量數(shù)據(jù)和復(fù)雜數(shù)組進(jìn)行的復(fù)雜處理,使用MMX技術(shù)可處理的數(shù)據(jù)基本單位可以是字節(jié)(byte)、字(word),或者是雙字(double-word)。

Visual Studio .NET 2003提供了對MMX指令集特性的支持,從而可以不必編寫匯編代碼,直接使用C++代碼就可以實(shí)現(xiàn)MMX指令的功能。通過參考Intel軟件說明書(Intel Software manuals)[1]以及閱讀MSDN中有關(guān)MMX編程技術(shù)的主題會使你更好地把握MMX編程的要點(diǎn)。

MMX技術(shù)實(shí)現(xiàn)了單道指令多道數(shù)據(jù)流(SIMD,single-instruction, multiple-data)的執(zhí)行模式。考慮下面一個需要編程完成的任務(wù),在一個字節(jié)(BYTE)數(shù)組中使其中每一個元素加上一個數(shù),在傳統(tǒng)的程序中,實(shí)現(xiàn)這個功能的算法如下:

for each  b in array     //對數(shù)組中的每一個元素b
    b = b + n            //加上一個數(shù)n

下面看看它的實(shí)現(xiàn)細(xì)節(jié):

for each  b in array  //對數(shù)組中的每一個元素b
{
    把b加載到寄存器中
    把此寄存器中的數(shù)加上n
    把所得寄存器中的結(jié)果放回內(nèi)存
}


具有MMX指令集支持的處理器有八個64位的寄存器,每一個寄存器可以存放8個字節(jié)(byte)、4個字(word)或2個雙字(double-word)。MMX技術(shù)同時提供了一個MMX指令集,其中的指令可以可以把一個數(shù)值(其類型可以是字節(jié)、字或雙字)加載到這些MMX寄存器中,在寄存器中進(jìn)行算術(shù)或邏輯運(yùn)算,然后把寄存器中的結(jié)果放回內(nèi)存存儲單元。上面的例子采用MMX技術(shù)后的算法是這樣的:

for each  8 members in array  //把數(shù)組中的8個字節(jié)(其中一個字節(jié)為數(shù)組中的一個單位)作為一組取出
{
    把這8個字節(jié)加載到MMX寄存器中
    通過一個CPU指令執(zhí)行周期把這個寄存器中的8個字節(jié)都加上n
    把寄存器中計(jì)算的結(jié)果寫回內(nèi)存
}


C++編程人員不必直接使用MMX指令集中的指令訪問這些MMX寄存器。你可以使用64位的數(shù)據(jù)類型__m64和一系列C++函數(shù)來進(jìn)行相關(guān)的算術(shù)和邏輯運(yùn)算。而決定程序使用哪個MMX寄存器以及代碼優(yōu)化是C++編譯器的任務(wù)。

Visual C++ MMXSwarm [4]是MSDN中提供的一個很好的使用MMX技術(shù)進(jìn)行圖象處理的例子,它包含了一些封裝好了的類簡化了使用MMX技術(shù)的操作,并向你展示了對各種不同格式圖象進(jìn)行處理的操作(如單色24位象素RGB、32位象素RGB等)。本文只是對使用Visual C++實(shí)現(xiàn)MMX程序設(shè)計(jì)的簡單介紹。如果你感興趣的話,可以參看MSDN上MMXSwarm的例子。

MMX程序設(shè)計(jì)詳細(xì)介紹

包含的頭文件

所有的MMX指令集函數(shù)在emmintrin.h文件中定義:
#include <emmintrin.h>
因?yàn)槌绦蛑杏玫降腗MX處理器指令是由編譯器決定,所以它并沒有相關(guān)的.lib庫文件。

__m64 數(shù)據(jù)類型

這種類型的變量可用作MMX指令的操作數(shù),它不能被直接訪問。_m64類型的變量被自動分配為8個字節(jié)的字長。

CPU對MMX指令集的支持

如果你的CPU能夠具有了MMX指令集,你就可以使用Visual Studio .NET 2003提供的對MMX指令集支持的C++函數(shù)庫了,你可以查看MSDN中的一個Visual C++ CPUID[3]的例子,它可以幫你檢測你的CPU是否支持SSE、MMX指令集或其它的CPU功能。

飽和算法(Saturation Arithmetic)和封裝模式(Wraparound Mode)

MMX技術(shù)支持一種叫做saturating arithmetic(飽和算法)的計(jì)算模式。在飽和模式下,當(dāng)計(jì)算結(jié)果發(fā)生溢出(上溢或下溢)時,CPU會自動去掉溢出的部分,使計(jì)算結(jié)果取該數(shù)據(jù)類型表示數(shù)值的上限值(如果上溢)或下限值(如果下溢)。飽和模式的計(jì)算用于對圖象的處理。
下面的例子能夠讓你理解飽和模式和封裝模式的區(qū)別。如果一個字節(jié)(BYTE)類型變量的值為255,然后將其值加一。在封裝模式下,相加結(jié)果為0(去掉進(jìn)位);在飽和模式下,結(jié)果為255。飽和模式用類似的方法來處理下溢出,比如對于一個字節(jié)數(shù)據(jù)類型的數(shù)在飽和模式下,1減2的結(jié)果為0(而不是-1)。每一個MMX算術(shù)指令都有這兩種模式:飽和模式和封裝模式。本文所要討論的項(xiàng)目只使用飽和模式下的MMX指令。

編程實(shí)例

以下講解了MMX技術(shù)在Visual Studio .NET 2003下的應(yīng)用實(shí)例,你可以在http://www.codeproject.com/cpp/mmxintro/MMX_src.zip下載示例程序壓縮包。該壓縮包中含有兩個項(xiàng)目,這兩個項(xiàng)目是基于微軟基本類庫(MFC)建立的Visual C++.NET項(xiàng)目,你也可以按照下面的講解建立這兩個項(xiàng)目。

MMX8 演示項(xiàng)目

MMX8是一個單文檔界面(SDI)的應(yīng)用程序,用來對每象素8位的單色位圖進(jìn)行簡單處理。源圖象和處理后的圖象會在窗體中顯示出來。新建的ATL(活動模版庫)類 Cimage用來從資源中提取圖象并在窗體中顯示出來。程序要對圖象進(jìn)行兩種處理操作:圖象顏色反相和改變圖象的亮度。每一種處理操作可以用下面幾種方法之中其中的一種來實(shí)現(xiàn):

純C++代碼;
使用C++的MMX功能函數(shù)的代碼;
使用MMX匯編指令的代碼。

對圖象進(jìn)行處理計(jì)算的時間會顯示在狀態(tài)欄中。

用純C++實(shí)現(xiàn)的圖象顏色反相函數(shù):

void CImg8Operations::InvertImageCPlusPlus(
    BYTE* pSource,
    BYTE* pDest,
    int nNumberOfPixels)
{
    for ( int i = 0; i < nNumberOfPixels; i++ )
    {
        *pDest++ = 255 - *pSource++;
    }
}


為了查詢使用C++ MMX指令函數(shù)的方法,需要參考Intel軟件說明書(Intel Software manuals)中有關(guān)MMX匯編指令的說明,首先我是在第一卷的第八章找到了MMX相關(guān)指令的大體介紹,然后在第二卷找到了有關(guān)這些MMX指令的詳細(xì)說明,這些說明有一部分涉及了與其特性相關(guān)的C++函數(shù)。然后我通過這些MMX指令對應(yīng)的C++函數(shù)查找了MSDN中與其相關(guān)的說明。在MMX8示例程序中用到的MMX指令和相關(guān)的C++函數(shù)見下表:




實(shí)現(xiàn)的功能 對應(yīng)的MMX匯編指令 Visual C++.NET中的MMX函數(shù)
清除MMX寄存器中的內(nèi)容,即初始化(以避免和浮點(diǎn)數(shù)操作發(fā)生沖突)。 emms _mm_empty
將兩個64位數(shù)中對應(yīng)的(8個)無符號(8位)字節(jié)同時進(jìn)行減法操作。 psubusb _mm_subs_pu8
將兩個64位數(shù)中對應(yīng)的(8個)無符號(8位)字節(jié)同時進(jìn)行加法操作。 paddusb _mm_adds_pu8

用Visual C++.NET的MMX指令函數(shù)實(shí)現(xiàn)圖象顏色反相的函數(shù):

void CImg8Operations::InvertImageC_MMX(
    BYTE* pSource,
    BYTE* pDest,
    int nNumberOfPixels)
{
    __int64 i = 0;
    i = ~i;                                 // 0xffffffffffffffff    

    // 每次循環(huán)處理8個象素
    int nLoop = nNumberOfPixels/8;

    __m64* pIn = (__m64*) pSource;          // 輸入的字節(jié)數(shù)組指針
    __m64* pOut = (__m64*) pDest;           // 輸出的字節(jié)數(shù)組指針

    __m64 tmp;                              // 臨時工作變量

    _mm_empty();                            // 執(zhí)行MMX指令:emms,初始化MMX寄存器

    __m64 n1 = Get_m64(i);

    for ( int i = 0; i < nLoop; i++ )
    {
        tmp = _mm_subs_pu8 (n1 , *pIn);     // 飽和模式下的無符號減法
                                            //對每一個字節(jié)執(zhí)行操作:tmp = n1 - *pIn
        *pOut = tmp;

        pIn++;                              // 取下面的8個象素點(diǎn)
        pOut++;
    }

    _mm_empty();                            // 執(zhí)行MMX指令:emms,清除MMX寄存器中的內(nèi)容
}

__m64 CImg8Operations::Get_m64(__int64 n)
{
    union __m64__m64
    {
        __m64 m;
        __int64 i;
    } mi;

    mi.i = n;
    return mi.m;
}

雖然這個函數(shù)在非常短的時間就執(zhí)行完成了,但我記錄了這3種方法需要的時間,以下是在我的計(jì)算機(jī)上運(yùn)行的結(jié)果:

純C++代碼      43毫秒
使用C++的MMX指令函數(shù)的代碼 26毫秒
使用MMX匯編指令的代碼   26毫秒

上面的圖象處理時間必須在程序Release優(yōu)化編譯后執(zhí)行時才能體現(xiàn)出很好的效果。

而改變圖象的亮度我采用了最簡單的方法:對圖象中的每一個象素的顏色值進(jìn)行加減運(yùn)算。相對前面的處理函數(shù)而言,這樣的轉(zhuǎn)換函數(shù)有些復(fù)雜,因?yàn)槲覀冃枰烟幚磉^程分成兩種情況,一種是增加象素顏色值,另一種是減少象素顏色值。


用純C++函數(shù)實(shí)現(xiàn)的改變圖象亮度的函數(shù):

void CImg8Operations::ChangeBrightnessCPlusPlus(
    BYTE* pSource,
    BYTE* pDest,
    int nNumberOfPixels,
    int nChange)
{
    if ( nChange > 255 )
        nChange = 255;
    else if ( nChange < -255 )
        nChange = -255;

    BYTE b = (BYTE) abs(nChange);

    int i, n;

    if ( nChange > 0 ) //增加象素顏色值
    {
        for ( i = 0; i < nNumberOfPixels; i++ )
        {
            n = (int)(*pSource++ + b);

            if ( n > 255 )
                n = 255;

            *pDest++ = (BYTE) n;
        }
    }
    else    //減少象素顏色值
    {
        for ( i = 0; i < nNumberOfPixels; i++ )
        {
            n = (int)(*pSource++ - b);

            if ( n < 0 )
                n = 0;
            *pDest++ = (BYTE) n;
        }
    }
}


用Visual C++.NET的MMX指令函數(shù)實(shí)現(xiàn)的改變圖象亮度函數(shù):

void CImg8Operations::ChangeBrightnessC_MMX(
    BYTE* pSource,
    BYTE* pDest,
    int nNumberOfPixels,
    int nChange)
{
    if ( nChange > 255 )
        nChange = 255;
    else if ( nChange < -255 )
        nChange = -255;

    BYTE b = (BYTE) abs(nChange);

    __int64 c = b;

    for ( int i = 1; i <= 7; i++ )
    {
        c = c << 8;
        c |= b;
    }

    // 在一次循環(huán)中處理8個象素
    int nNumberOfLoops = nNumberOfPixels / 8;

    __m64* pIn = (__m64*) pSource;          // 輸入的字節(jié)數(shù)組
    __m64* pOut = (__m64*) pDest;           // 輸出的字節(jié)數(shù)組

    __m64 tmp;                              // 臨時工作變量


    _mm_empty();                            // 執(zhí)行MMX指令:emms

    __m64 nChange64 = Get_m64(c);

    if ( nChange > 0 )
    {
        for ( i = 0; i < nNumberOfLoops; i++ )
        {
            tmp = _mm_adds_pu8(*pIn, nChange64); //  飽和模式下的無符號加法
                                                 // 對每一個字節(jié)執(zhí)行操作:tmp = *pIn + nChange64

            *pOut = tmp;

            pIn++;                               // 取下面8個象素
            pOut++;
        }
    }
    else
    {
        for ( i = 0; i < nNumberOfLoops; i++ )
        {
            tmp = _mm_subs_pu8(*pIn, nChange64); //  飽和模式下的無符號減法
                                                 // 對每一個字節(jié)執(zhí)行操作:tmp = *pIn - nChange64

            *pOut = tmp;

            pIn++;                                      //取下面8個象素
            pOut++;
        }
    }

    _mm_empty();                            // 執(zhí)行MMX指令:emms
}


注意參數(shù)nChange的符號每次調(diào)用函數(shù)時在循環(huán)體外只檢查一次,而不是放在循環(huán)體內(nèi),那樣會被檢查成千上萬次。下面是在我的計(jì)算機(jī)上處理圖象花費(fèi)的時間:

純C++代碼      49毫秒
使用C++的MMX指令函數(shù)的代碼 26毫秒
使用MMX匯編指令的代碼   26毫秒


MMX32 演示項(xiàng)目

MMX32項(xiàng)目可對32位象素的RGB圖象進(jìn)行處理。進(jìn)行的圖象處理工作是圖象顏色反相操作和更改圖象顏色的平衡度(將象素點(diǎn)的每一種顏色乘以一定的值)操作。

MMX的乘法實(shí)現(xiàn)起來比加減法復(fù)雜得多,因?yàn)槌朔ㄟ\(yùn)算通常得出的結(jié)果的位數(shù)不再是以前位數(shù)的大小。比如,如果乘法的操作數(shù)有一個字節(jié)(8位的BYTE)大小,那么結(jié)果會達(dá)到一個字(16位的WORD)大小。這需要額外的轉(zhuǎn)換,并且使用MMX匯編指令和C++代碼進(jìn)行圖象轉(zhuǎn)換花費(fèi)時間的差別不是很大(時間差為5-10%)。

用Visual C++.NET的MMX指令函數(shù)實(shí)現(xiàn)的更改圖象顏色平衡度的函數(shù):

void CImg32Operations::ColorsC_MMX(
    BYTE* pSource,
    BYTE* pDest,
    int nNumberOfPixels,
    float fRedCoefficient,
    float fGreenCoefficient,
    float fBlueCoefficient)
{
    int nRed = (int)(fRedCoefficient * 256.0f);
    int nGreen = (int)(fGreenCoefficient * 256.0f);
    int nBlue = (int)(fBlueCoefficient * 256.0f);

    // 設(shè)置相乘系數(shù)
    __int64 c = 0;
    c = nRed;
    c = c << 16;
    c |= nGreen;
    c = c << 16;
    c |= nBlue;

    __m64 nNull = _m_from_int(0);           // null
    __m64 tmp = _m_from_int(0);             // 臨時工作臨時變量初始化

    _mm_empty();                            // 清空MMX寄存器。

    __m64 nCoeff = Get_m64(c);

    DWORD* pIn = (DWORD*) pSource;          // 輸入雙字?jǐn)?shù)組
    DWORD* pOut = (DWORD*) pDest;           // 輸出雙字?jǐn)?shù)組

    for ( int i = 0; i < nNumberOfPixels; i++ )
    {
        tmp = _m_from_int(*pIn);                // tmp = *pIn (在tmp的低32位寫入數(shù)據(jù))

        tmp = _mm_unpacklo_pi8(tmp, nNull );    //將tmp中低位的4個字節(jié)轉(zhuǎn)化為字
//字的高位用nNull中對應(yīng)位上的位值填充。

        tmp =  _mm_mullo_pi16 (tmp , nCoeff);   //將tmp中的每一個字相乘,將相乘結(jié)果的高位送到nCoeff,在tmp中只保留每個結(jié)果的低位。

        tmp = _mm_srli_pi16 (tmp , 8);          // 將tmp中的每一個字右移8位,相當(dāng)于除以256

        tmp = _mm_packs_pu16 (tmp, nNull);      // 使用飽和模式將tmp中的結(jié)果做如下處理:
                                                //將tmp中的4個字轉(zhuǎn)化為4個字節(jié),并將這4個字節(jié)寫到tmp中的低32位中
                                                // 同時,將nNull中的4個字轉(zhuǎn)化為4個字節(jié),并將這4個字節(jié)寫到tmp的高32位中。

        *pOut = _m_to_int(tmp);                 // *pOut = tmp (將tmp低32位的數(shù)據(jù)放入pOut數(shù)組中)
        
        pIn++;
        pOut++;

    }

    _mm_empty();                        
}

你可以參看示例項(xiàng)目的源代碼了解有關(guān)此項(xiàng)目的更多的細(xì)節(jié)。

SSE2 技術(shù)

SSE2技術(shù)包含有一個類似MMX中對整數(shù)操作的指令集,同時也包含128位的SSE寄存器組。比如,用SSE2技術(shù)實(shí)現(xiàn)更改圖象顏色平衡度能夠比用純C++代碼實(shí)現(xiàn)此功能在效率上有很大提升。SSE2同時是SSE技術(shù)的擴(kuò)展,比如它不僅可以單精度浮點(diǎn)數(shù)數(shù)組,而且能夠處理雙精度浮點(diǎn)數(shù)數(shù)據(jù)類型的數(shù)組。用C++實(shí)現(xiàn)的MMXSwarm 示例項(xiàng)目不僅使用了MMX指令函數(shù),而且使用了SSE2指令對整型數(shù)操作的函數(shù)。

posted on 2009-08-31 15:52 會飛的兔子 閱讀(372) 評論(0)  編輯 收藏 引用 所屬分類: 系統(tǒng)API,底層技術(shù)
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日韩日本视频| 美乳少妇欧美精品| 国产一区二区成人| 国产亚洲aⅴaaaaaa毛片| 欧美美女bb生活片| 欧美日韩国产在线播放| 国产精品家教| 韩国一区电影| 亚洲三级观看| 午夜精品国产更新| 久久久视频精品| 亚洲福利视频一区| 久久一日本道色综合久久| 欧美成人高清| 在线中文字幕不卡| 久久国产视频网站| 欧美精品一区三区| 国产精品欧美日韩久久| 激情久久影院| 亚洲免费影视| 欧美黄色一区二区| 亚洲欧美另类中文字幕| 免费不卡视频| 国产偷国产偷亚洲高清97cao| 91久久夜色精品国产网站| 亚洲免费网站| 亚洲福利免费| 久久精品国产精品亚洲综合| 欧美日韩ab片| 亚洲第一色在线| 亚洲欧美精品在线| 亚洲国产小视频在线观看| 香蕉成人伊视频在线观看 | 一区二区三区在线观看欧美| 日韩视频永久免费观看| 久久精品视频99| 日韩网站在线观看| 久久午夜激情| 国产日韩欧美| 亚洲综合色自拍一区| 亚洲高清不卡| 久久五月婷婷丁香社区| 国内外成人免费激情在线视频网站| 一区二区三区国产盗摄| 亚洲第一福利视频| 久久久一本精品99久久精品66| 国产精品久久久久天堂| 亚洲精品视频免费在线观看| 玖玖综合伊人| 久久激情久久| 国产日韩欧美精品在线| 亚洲欧美日本另类| 亚洲精品国产精品乱码不99按摩| 欧美一区二区女人| 亚洲午夜久久久久久尤物| 欧美激情女人20p| 亚洲精品国产视频| 亚洲电影中文字幕| 欧美成人精品高清在线播放| 亚洲国产精品久久久久婷婷884| 久久久久久亚洲精品中文字幕| 亚洲免费视频网站| 国产美女精品视频免费观看| 亚洲欧美日韩国产精品 | 欧美成人a∨高清免费观看| 红桃视频一区| 蜜臀久久久99精品久久久久久| 久久久成人精品| 国内一区二区在线视频观看| 另类欧美日韩国产在线| 久久夜色撩人精品| 亚洲精品视频一区二区三区| 亚洲欧洲一区二区天堂久久| 欧美日韩亚洲一区二区三区| 亚洲综合清纯丝袜自拍| 性欧美暴力猛交69hd| 一区一区视频| 亚洲精品1234| 国产精品久久国产三级国电话系列| 欧美亚洲三区| 久久精品视频导航| 亚洲精品免费看| 亚洲图片欧美日产| 黑人巨大精品欧美黑白配亚洲| 欧美不卡一区| 欧美视频手机在线| 久久久精品一区| 欧美精品久久99| 欧美专区第一页| 欧美国产精品人人做人人爱| 亚洲欧美国产高清va在线播| 久久久久久久999| 亚洲一区美女视频在线观看免费| 欧美一区二区在线观看| 亚洲国产美女久久久久| 一本色道久久综合亚洲精品按摩| 国产色综合天天综合网| 亚洲七七久久综合桃花剧情介绍| 国产精品伦一区| 欧美jizz19hd性欧美| 国产精品福利网站| 欧美成人精品福利| 国产精品嫩草99av在线| 你懂的国产精品| 国产精品天天摸av网| 亚洲高清二区| 国产综合久久| 亚洲一区二区视频在线观看| 亚洲国产女人aaa毛片在线| 亚洲综合导航| 99热在线精品观看| 久久久久一区二区三区| 亚洲欧美一区二区三区久久| 久久综合九九| 国产日韩在线不卡| 夜夜爽夜夜爽精品视频| 亚洲国产精品黑人久久久 | 亚洲欧美日本精品| 亚洲另类一区二区| 久久视频在线免费观看| 性做久久久久久| 欧美精品尤物在线| 欧美激情免费在线| 黑人极品videos精品欧美裸| 亚洲视频在线观看| 一本一本久久a久久精品牛牛影视| 久久精品免费播放| 久久国产一区| 国产美女一区二区| 亚洲午夜免费福利视频| 亚洲永久字幕| 欧美三级日韩三级国产三级| 亚洲人www| 日韩写真视频在线观看| 欧美激情精品久久久久久久变态| 欧美大片一区| 亚洲茄子视频| 欧美激情成人在线| 亚洲国产欧美日韩| 日韩一二三区视频| 欧美日韩在线播放| 亚洲一二三区在线观看| 亚洲一卡二卡三卡四卡五卡| 欧美性猛交xxxx乱大交蜜桃| av成人免费观看| 亚洲伊人伊色伊影伊综合网 | 国产精品美女诱惑| 午夜精品久久久久久99热| 久久国产婷婷国产香蕉| 黄色成人av网站| 美日韩精品免费观看视频| 亚洲国产一区二区三区a毛片| 99re热这里只有精品视频| 欧美精品一区在线观看| 亚洲午夜av在线| 久久裸体艺术| 最新中文字幕亚洲| 欧美日韩精品免费| 性视频1819p久久| 欧美高清视频一区二区| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 亚洲电影免费观看高清| 美女啪啪无遮挡免费久久网站| 欧美国产日韩视频| 一区二区三区回区在观看免费视频 | 9l国产精品久久久久麻豆| 西瓜成人精品人成网站| 亚洲第一网站| 欧美亚韩一区| 久久成人免费网| 亚洲六月丁香色婷婷综合久久| 先锋a资源在线看亚洲| 亚洲国产va精品久久久不卡综合| 欧美日韩一区二区三区在线观看免| 午夜精品视频在线观看一区二区| 欧美激情一区在线| 亚洲欧美视频在线观看| 欧美国产精品人人做人人爱| 亚洲一区视频| 亚洲经典视频在线观看| 久久久综合网| 亚洲欧美日韩一区在线| 亚洲大片在线| 国产欧美日韩一区| 欧美日韩第一区日日骚| 久久免费精品视频| 亚洲网站在线看| 亚洲精品资源| 欧美黄色一区| 免费成人网www| 久久久999| 性色一区二区三区| 亚洲尤物影院| 一区二区三区日韩精品| 亚洲区一区二区三区| 伊人伊人伊人久久| 国产一区二区三区直播精品电影| 国产精品v欧美精品v日韩精品| 欧美 日韩 国产在线| 久久久久国产精品人|