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

牽著老婆滿街逛

嚴(yán)以律己,寬以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

基于SSE指令集的程序設(shè)計(jì)簡(jiǎn)介

基于SSE指令集的程序設(shè)計(jì)簡(jiǎn)介

作者:Alex Farber
出處:http://www.codeproject.com/cpp/sseintro.asp

SSE技術(shù)簡(jiǎn)介


Intel公司的單指令多數(shù)據(jù)流式擴(kuò)展(SSE,Streaming SIMD Extensions)技術(shù)能夠有效增強(qiáng)CPU浮點(diǎn)運(yùn)算的能力。Visual Studio .NET 2003提供了對(duì)SSE指令集的編程支持,從而允許用戶在C++代碼中不用編寫匯編代碼就可直接使用SSE指令的功能。MSDN中有關(guān)SSE技術(shù)的主題[1]有可能會(huì)使不熟悉使用SSE匯編指令編程的初學(xué)者感到困惑,但是在閱讀MSDN有關(guān)文檔的同時(shí),參考一下Intel軟件說(shuō)明書(shū)(Intel Software manuals)[2]會(huì)使你更清楚地理解使用SSE指令編程的要點(diǎn)。

SIMD(single-instruction, multiple-data)是一種使用單道指令處理多道數(shù)據(jù)流的CPU執(zhí)行模式,即在一個(gè)CPU指令執(zhí)行周期內(nèi)用一道指令完成處理多個(gè)數(shù)據(jù)的操作。考慮一下下面這個(gè)任務(wù):計(jì)算一個(gè)很長(zhǎng)的浮點(diǎn)型數(shù)組中每一個(gè)元素的平方根。實(shí)現(xiàn)這個(gè)任務(wù)的算法可以這樣寫:

for each  f in array        //對(duì)數(shù)組中的每一個(gè)元素
    f = sqrt(f)             //計(jì)算它的平方根

為了了解實(shí)現(xiàn)的細(xì)節(jié),我們把上面的代碼這樣寫:

for each  f in array
{
    把f從內(nèi)存加載到浮點(diǎn)寄存器
    計(jì)算平方根
    再把計(jì)算結(jié)果從寄存器中取出放入內(nèi)存
}

具有Intel SSE指令集支持的處理器有8個(gè)128位的寄存器,每一個(gè)寄存器可以存放4個(gè)(32位)單精度的浮點(diǎn)數(shù)。SSE同時(shí)提供了一個(gè)指令集,其中的指令可以允許把浮點(diǎn)數(shù)加載到這些128位的寄存器之中,這些數(shù)就可以在這些寄存器中進(jìn)行算術(shù)邏輯運(yùn)算,然后把結(jié)果放回內(nèi)存。采用SSE技術(shù)后,算法可以寫成下面的樣子:

for each  4 members in array  //對(duì)數(shù)組中的每4個(gè)元素
{
    把數(shù)組中的這4個(gè)數(shù)加載到一個(gè)128位的SSE寄存器中
    在一個(gè)CPU指令執(zhí)行周期中完成計(jì)算這4個(gè)數(shù)的平方根的操作
    把所得的4個(gè)結(jié)果取出寫入內(nèi)存
}
 
C++編程人員在使用SSE指令函數(shù)編程時(shí)不必關(guān)心這些128位的寄存器,你可以使用128位的數(shù)據(jù)類型“__m128”和一系列C++函數(shù)來(lái)實(shí)現(xiàn)這些算術(shù)和邏輯操作,而決定程序使用哪個(gè)SSE寄存器以及代碼優(yōu)化是C++編譯器的任務(wù)。當(dāng)需要對(duì)很長(zhǎng)的浮點(diǎn)數(shù)數(shù)組中的元素進(jìn)行處理的時(shí)候,SSE技術(shù)確實(shí)是一種很高效的方法。


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

包含的頭文件:

所有的SSE指令函數(shù)和__m128數(shù)據(jù)類型都在xmmintrin.h文件中定義:
#include <xmmintrin.h>
因?yàn)槌绦蛑杏玫降腟SE處理器指令是由編譯器決定,所以它并沒(méi)有相關(guān)的.lib庫(kù)文件。

數(shù)據(jù)分組(Data Alignment)

由SSE指令處理的每一個(gè)浮點(diǎn)數(shù)數(shù)組必須把其中需要處理的數(shù)每16個(gè)字節(jié)(128位二進(jìn)制)分為一組。一個(gè)靜態(tài)數(shù)組(static array)可由__declspec(align(16))關(guān)鍵字聲明:

__declspec(align(16)) float m_fArray[ARRAY_SIZE];

動(dòng)態(tài)數(shù)組(dynamic array)可由_aligned_malloc函數(shù)為其分配空間:
m_fArray = (float*) _aligned_malloc(ARRAY_SIZE * sizeof(float), 16);

由_aligned_malloc函數(shù)分配空間的動(dòng)態(tài)數(shù)組可以由_aligned_free函數(shù)釋放其占用的空間:
_aligned_free(m_fArray);

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

該數(shù)據(jù)類型的變量可用做SSE指令的操作數(shù),它們不能被用戶指令直接存取。_m128類型的變量被自動(dòng)分配為16個(gè)字節(jié)的字長(zhǎng)。

CPU對(duì)SSE指令集的支持

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


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

SSETest 示例項(xiàng)目

SSETest項(xiàng)目是一個(gè)基于對(duì)話框的應(yīng)用程序,它用到了三個(gè)浮點(diǎn)數(shù)組參與運(yùn)算:

fResult[i] = sqrt( fSource1[i]*fSource1[i] + fSource2[i]*fSource2[i] ) + 0.5

其中i = 0, 1, 2 ... ARRAY_SIZE-1

其中ARRAY_SIZE被定義為30000。數(shù)據(jù)源數(shù)組(Source數(shù)組)通過(guò)使用sin和cos函數(shù)給它賦值,我們用Kris Jearakul開(kāi)發(fā)的瀑布狀圖表控件(Waterfall chart control)[3] 來(lái)顯示參與計(jì)算的源數(shù)組和結(jié)果數(shù)組。計(jì)算所需的時(shí)間(以毫秒ms為單位)在對(duì)話框中顯示出來(lái)。我們使用三種不同的途徑來(lái)完成計(jì)算:

純C++代碼;
使用SSE指令函數(shù)的C++代碼;
包含SSE匯編指令的代碼。


純C++代碼:

 

void CSSETestDlg::ComputeArrayCPlusPlus(
          
float* pArray1,                   // [輸入] 源數(shù)組1
          float* pArray2,                   // [輸入] 源數(shù)組2
          float* pResult,                   // [輸出] 用來(lái)存放結(jié)果的數(shù)組
          int nSize)                            // [輸入] 數(shù)組的大小
{

    
int i;

    
float* pSource1 = pArray1;
    
float* pSource2 = pArray2;
    
float* pDest = pResult;

    
for ( i = 0; i < nSize; i++ )
    
{
        
*pDest = (float)sqrt((*pSource1) * (*pSource1) + (*pSource2)
                 
* (*pSource2)) + 0.5f;

        pSource1
++;
        pSource2
++;
        pDest
++;
    }

}

 


下面我們用具有SSE特性的C++代碼重寫上面這個(gè)函數(shù)。為了查詢使用SSE指令C++函數(shù)的方法,我參考了Intel軟件說(shuō)明書(shū)(Intel Software manuals)中有關(guān)SSE匯編指令的說(shuō)明,首先我是在第一卷的第九章找到的相關(guān)SSE指令,然后在第二卷找到了這些SSE指令的詳細(xì)說(shuō)明,這些說(shuō)明有一部分涉及了與其特性相關(guān)的C++函數(shù)。然后我通過(guò)這些SSE指令對(duì)應(yīng)的C++函數(shù)查找了MSDN中與其相關(guān)的說(shuō)明。搜索的結(jié)果見(jiàn)下表:

實(shí)現(xiàn)的功能 對(duì)應(yīng)的SSE匯編指令 Visual C++.NET中的SSE函數(shù)
將4個(gè)32位浮點(diǎn)數(shù)放進(jìn)一個(gè)128位的存儲(chǔ)單元。 movss 和 shufps _mm_set_ps1
將4對(duì)32位浮點(diǎn)數(shù)同時(shí)進(jìn)行相乘操作。這4對(duì)32位浮點(diǎn)數(shù)來(lái)自兩個(gè)128位的存儲(chǔ)單元,再把計(jì)算結(jié)果(乘積)賦給一個(gè)128位的存儲(chǔ)單元。 mulps _mm_mul_ps
將4對(duì)32位浮點(diǎn)數(shù)同時(shí)進(jìn)行相加操作。這4對(duì)32位浮點(diǎn)數(shù)來(lái)自兩個(gè)128位的存儲(chǔ)單元,再把計(jì)算結(jié)果(相加之和)賦給一個(gè)128位的存儲(chǔ)單元。 addps _mm_add_ps
對(duì)一個(gè)128位存儲(chǔ)單元中的4個(gè)32位浮點(diǎn)數(shù)同時(shí)進(jìn)行求平方根操作。 sqrtps

_mm_sqrt_ps

 

使用Visual C++.NET的 SSE指令函數(shù)的代碼:

 

void CSSETestDlg::ComputeArrayCPlusPlusSSE(
          
float* pArray1,                   // [輸入] 源數(shù)組1
          float* pArray2,                   // [輸入] 源數(shù)組2
          float* pResult,                   // [輸出] 用來(lái)存放結(jié)果的數(shù)組
          int nSize)                        // [輸入] 數(shù)組的大小
{
    
int nLoop = nSize/ 4;

    __m128 m1, m2, m3, m4;

    __m128
* pSrc1 = (__m128*) pArray1;
    __m128
* pSrc2 = (__m128*) pArray2;
    __m128
* pDest = (__m128*) pResult;


    __m128 m0_5 
= _mm_set_ps1(0.5f);        // m0_5[0, 1, 2, 3] = 0.5

    
for ( int i = 0; i < nLoop; i++ )
    
{
        m1 
= _mm_mul_ps(*pSrc1, *pSrc1);        // m1 = *pSrc1 * *pSrc1
        m2 = _mm_mul_ps(*pSrc2, *pSrc2);        // m2 = *pSrc2 * *pSrc2
        m3 = _mm_add_ps(m1, m2);                // m3 = m1 + m2
        m4 = _mm_sqrt_ps(m3);                   // m4 = sqrt(m3)
        *pDest = _mm_add_ps(m4, m0_5);          // *pDest = m4 + 0.5
        
        pSrc1
++;
        pSrc2
++;
        pDest
++;
    }

}

 

使用SSE匯編指令實(shí)現(xiàn)的C++函數(shù)代碼:

 

void CSSETestDlg::ComputeArrayAssemblySSE(
          
float* pArray1,                   // [輸入] 源數(shù)組1
          float* pArray2,                   // [輸入] 源數(shù)組2
          float* pResult,                   // [輸出] 用來(lái)存放結(jié)果的數(shù)組
          int nSize)                        // [輸入] 數(shù)組的大小
{
    
int nLoop = nSize/4;
    
float f = 0.5f;

    _asm
    
{
        movss   xmm2, f                         
// xmm2[0] = 0.5
        shufps  xmm2, xmm2, 0                   // xmm2[1, 2, 3] = xmm2[0]

        mov         esi, pArray1                
// 輸入的源數(shù)組1的地址送往esi
        mov         edx, pArray2                // 輸入的源數(shù)組2的地址送往edx

        mov         edi, pResult                
// 輸出結(jié)果數(shù)組的地址保存在edi
        mov         ecx, nLoop                  //循環(huán)次數(shù)送往ecx

start_loop:
        movaps      xmm0, [esi]                 
// xmm0 = [esi]
        mulps       xmm0, xmm0                  // xmm0 = xmm0 * xmm0

        movaps      xmm1, [edx]                 
// xmm1 = [edx]
        mulps       xmm1, xmm1                  // xmm1 = xmm1 * xmm1

        addps       xmm0, xmm1                  
// xmm0 = xmm0 + xmm1
        sqrtps      xmm0, xmm0                  // xmm0 = sqrt(xmm0)

        addps       xmm0, xmm2                  
// xmm0 = xmm1 + xmm2

        movaps      [edi], xmm0                 
// [edi] = xmm0

        add         esi, 
16                     // esi += 16
        add         edx, 16                     // edx += 16
        add         edi, 16                     // edi += 16

        dec         ecx                         
// ecx--
        jnz         start_loop                //如果不為0則轉(zhuǎn)向start_loop
    }

}

 

最后,在我的計(jì)算機(jī)上運(yùn)行計(jì)算測(cè)試的結(jié)果:

純C++代碼計(jì)算所用的時(shí)間是26 毫秒
使用SSE的C++ 函數(shù)計(jì)算所用的時(shí)間是 9 毫秒
包含SSE匯編指令的C++代碼計(jì)算所用的時(shí)間是 9 毫秒

以上的時(shí)間結(jié)果是在Release優(yōu)化編譯后執(zhí)行程序得出的。

 

SSESample 示例項(xiàng)目


SSESample項(xiàng)目是一個(gè)基于對(duì)話框的應(yīng)用程序,其中它用下面的浮點(diǎn)數(shù)數(shù)組進(jìn)行計(jì)算:

fResult[i] = sqrt(fSource[i]*2.8)

其中i = 0, 1, 2 ... ARRAY_SIZE-1

這個(gè)程序同時(shí)計(jì)算了數(shù)組中的最大值和最小值。ARRAY_SIZE被定義為100000,數(shù)組中的計(jì)算結(jié)果在列表框中顯示出來(lái)。其中在我的機(jī)子上用下面三種方法計(jì)算所需的時(shí)間是:
純C++代碼計(jì)算                   6 毫秒
使用SSE的C++ 函數(shù)計(jì)算     3 毫秒
使用SSE匯編指令計(jì)算         2 毫秒

大家看到,使用SSE匯編指令計(jì)算的結(jié)果會(huì)好一些,因?yàn)槭褂昧诵试鰪?qiáng)了的SSX寄存器組。但是在通常情況下,使用SSE的C++ 函數(shù)計(jì)算會(huì)比匯編代碼計(jì)算的效率更高一些,因?yàn)镃++編譯器的優(yōu)化后的代碼有很高的運(yùn)算效率,若要使匯編代碼比優(yōu)化后的代碼運(yùn)算效率更高,這通常是很難做到的。

純C++代碼:

 

// 輸入: m_fInitialArray
// 輸出: m_fResultArray, m_fMin, m_fMax
void CSSESampleDlg::OnBnClickedButtonCplusplus()
{
    m_fMin 
= FLT_MAX;
    m_fMax 
= FLT_MIN;

    
int i;

    
for ( i = 0; i < ARRAY_SIZE; i++ )
    
{
        m_fResultArray[i] 
= sqrt(m_fInitialArray[i]  * 2.8f);

        
if ( m_fResultArray[i] < m_fMin )
            m_fMin 
= m_fResultArray[i];

        
if ( m_fResultArray[i] > m_fMax )
            m_fMax 
= m_fResultArray[i];
    }

}

 

 

使用Visual C++.NET的 SSE指令函數(shù)的代碼:

 

// 輸入: m_fInitialArray
// 輸出: m_fResultArray, m_fMin, m_fMax
void CSSESampleDlg::OnBnClickedButtonSseC()
{
    __m128 coeff 
= _mm_set_ps1(2.8f);      // coeff[0, 1, 2, 3] = 2.8
    __m128 tmp;

    __m128 min128 
= _mm_set_ps1(FLT_MAX);  // min128[0, 1, 2, 3] = FLT_MAX
    __m128 max128 = _mm_set_ps1(FLT_MIN);  // max128[0, 1, 2, 3] = FLT_MIN

    __m128
* pSource = (__m128*) m_fInitialArray;
    __m128
* pDest = (__m128*) m_fResultArray;

    
for ( int i = 0; i < ARRAY_SIZE/4; i++ )
    
{
        tmp 
= _mm_mul_ps(*pSource, coeff);      // tmp = *pSource * coeff
        *pDest = _mm_sqrt_ps(tmp);              // *pDest = sqrt(tmp)

        min128 
=  _mm_min_ps(*pDest, min128);
        max128 
=  _mm_max_ps(*pDest, max128);

        pSource
++;
        pDest
++;
    }


    
// 計(jì)算max128的最大值和min128的最小值
    union u
    
{
        __m128 m;
        
float f[4];
    }
 x;

    x.m 
= min128;
    m_fMin 
= min(x.f[0], min(x.f[1], min(x.f[2], x.f[3])));

    x.m 
= max128;
    m_fMax 
= max(x.f[0], max(x.f[1], max(x.f[2], x.f[3])));
}


 

 

使用SSE匯編指令的C++函數(shù)代碼:

// 輸入: m_fInitialArray
// 輸出: m_fResultArray, m_fMin, m_fMax
void CSSESampleDlg::OnBnClickedButtonSseAssembly()
{
   
    
float* pIn = m_fInitialArray;
    
float* pOut = m_fResultArray;

    
float f = 2.8f;
    
float flt_min = FLT_MIN;
    
float flt_max = FLT_MAX;

    __m128 min128;
    __m128 max128;

    
// 使用以下的附加寄存器:xmm2、xmm3、xmm4:
    
// xmm2 – 相乘系數(shù)
    
// xmm3 – 最小值
    
// xmm4 – 最大值

    _asm
    
{
        movss   xmm2, f                         
// xmm2[0] = 2.8
        shufps  xmm2, xmm2, 0                   // xmm2[1, 2, 3] = xmm2[0]

        movss   xmm3, flt_max                   
// xmm3 = FLT_MAX
        shufps  xmm3, xmm3, 0                   // xmm3[1, 2, 3] = xmm3[0]

        movss   xmm4, flt_min                   
// xmm4 = FLT_MIN
        shufps  xmm4, xmm4, 0                   // xmm3[1, 2, 3] = xmm3[0]

        mov         esi, pIn                    
// 輸入數(shù)組的地址送往esi
        mov         edi, pOut                   // 輸出數(shù)組的地址送往edi
        mov         ecx, ARRAY_SIZE/4           // 循環(huán)計(jì)數(shù)器初始化

start_loop:
        movaps      xmm1, [esi]                 
// xmm1 = [esi]
        mulps       xmm1, xmm2                  // xmm1 = xmm1 * xmm2
        sqrtps      xmm1, xmm1                  // xmm1 = sqrt(xmm1)
        movaps      [edi], xmm1                 // [edi] = xmm1

        minps       xmm3, xmm1
        maxps       xmm4, xmm1

        add         esi, 
16
        add         edi, 
16

        dec         ecx
        jnz         start_loop


        movaps      min128, xmm3
        movaps      max128, xmm4
    }


    union u
    
{
        __m128 m;
        
float f[4];
    }
 x;

    x.m 
= min128;
    m_fMin 
= min(x.f[0], min(x.f[1], min(x.f[2], x.f[3])));

    x.m 
= max128;
    m_fMax 
= max(x.f[0], max(x.f[1], max(x.f[2], x.f[3])));

}


 


參考文檔:

[1]MSDN, SSE技術(shù)主題:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/vcrefstreamingsimdextensions.asp

[2]Intel軟件說(shuō)明書(shū)(Intel Software manuals):
http://developer.intel.com/design/archives/processors/mmx/index.htm

[3] Kris Jearakul的瀑布狀圖表控件:http://www.codeguru.com/controls/Waterfall.shtml

[4] Microsoft Visual C++ CPUID示例:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcsample/html/vcsamcpuiddeterminecpucapabilities.asp

[5] Matt Pietrek在Microsoft Systems Journal 1998年2月刊上的評(píng)論文章:
http://www.microsoft.com/msj/0298/hood0298.aspx

posted on 2008-05-07 12:08 楊粼波 閱讀(917) 評(píng)論(0)  編輯 收藏 引用


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国内精品久久久久久久97牛牛| 久久综合九色综合久99| 亚洲承认在线| 欧美亚洲日本国产| 国产精品久久久久久户外露出 | 久久久久久9999| 国产精品毛片大码女人| 一区二区三区国产在线观看| 蜜臀va亚洲va欧美va天堂| 午夜在线a亚洲v天堂网2018| 欧美特黄一级| 一本大道久久a久久精二百| 欧美国产精品久久| 久久久久国产一区二区| 国产一区二区三区久久久| 欧美亚洲综合另类| 国产精品99久久99久久久二8| 欧美精品入口| 亚洲精选成人| 亚洲国产成人在线| 欧美3dxxxxhd| 亚洲黑丝一区二区| 欧美激情中文字幕在线| 久久久久高清| 尤物九九久久国产精品的分类| 久久久久久久久久久一区 | 亚洲每日在线| 欧美精品网站| av成人手机在线| 亚洲精品日韩在线观看| 欧美久久视频| 亚洲手机视频| 在线亚洲国产精品网站| 国产精品久久久久久久久久久久| 亚洲一区免费看| 亚洲视频精品| 国产女主播一区二区| 欧美综合二区| 久久av在线看| 一区福利视频| 欧美黑人一区二区三区| 欧美aⅴ一区二区三区视频| 亚洲精品国产无天堂网2021| 欧美激情中文字幕乱码免费| 欧美激情亚洲| 一区二区三区欧美亚洲| 中文有码久久| 国产欧美日韩免费看aⅴ视频| 久久精品国产99精品国产亚洲性色 | 亚洲欧美日韩中文播放| 亚洲永久在线观看| 国产视频综合在线| 男人的天堂亚洲在线| 奶水喷射视频一区| 一区二区欧美日韩| 亚洲一二三区精品| 国产一区二区在线观看免费播放| 美女主播视频一区| 欧美福利视频一区| 亚洲欧美日韩系列| 久久成人亚洲| 亚洲精品免费看| 一区二区三区国产精华| 国产一区二区三区黄视频| 免播放器亚洲| 欧美日韩和欧美的一区二区| 午夜日韩电影| 久久免费视频一区| 一本色道久久综合精品竹菊 | 亚洲免费av观看| 亚洲视频1区| 一区二区三区在线视频播放| 91久久精品www人人做人人爽| 国产精品成人免费精品自在线观看| 久久国产福利国产秒拍| 免费成人av在线看| 亚洲一区二区三区四区五区午夜| 欧美一级一区| 99re6这里只有精品视频在线观看| 亚洲丝袜av一区| 亚洲第一天堂无码专区| 亚洲少妇一区| 亚洲国产精品成人| 亚洲一区二区成人| 亚洲第一网站| 亚洲亚洲精品三区日韩精品在线视频| 极品少妇一区二区三区| 亚洲美女毛片| 一区二区三区在线看| 99视频超级精品| 1000部精品久久久久久久久| 一本大道久久精品懂色aⅴ| 一区在线观看| 亚洲视频一区二区免费在线观看| 亚洲第一区在线| 亚洲午夜久久久久久尤物 | 国产色综合久久| 亚洲人成在线影院| 黄色av成人| 宅男噜噜噜66国产日韩在线观看| 亚洲二区免费| 性欧美videos另类喷潮| 亚洲最新视频在线| 久久亚洲私人国产精品va| 亚洲欧美日韩视频一区| 欧美电影免费网站| 久久久久久久久久久久久女国产乱| 欧美精品在线观看91| 你懂的国产精品| 国产伦精品免费视频| 亚洲精品一区二区网址| ●精品国产综合乱码久久久久| 亚洲欧美日韩精品一区二区| 9色porny自拍视频一区二区| 久久综合九色九九| 久久九九热re6这里有精品| 欧美三区视频| 亚洲啪啪91| 亚洲黄色小视频| 久久精品视频在线看| 欧美影院午夜播放| 国产精品福利在线| 日韩亚洲精品视频| 亚洲精品视频啊美女在线直播| 久久精品国产第一区二区三区| 午夜精品久久久久久久99水蜜桃| 欧美精品一区二| 亚洲第一中文字幕在线观看| 黄色亚洲网站| 久久精品国产欧美亚洲人人爽| 小嫩嫩精品导航| 国产精品白丝jk黑袜喷水| 亚洲精品在线免费| 日韩午夜av在线| 欧美成人资源| 欧美激情在线有限公司| 亚洲国产mv| 久久亚洲一区二区三区四区| 久久免费高清| 国内外成人免费激情在线视频网站 | 欧美日韩一级黄| 亚洲精品一区二区三区福利| 亚洲精品中文字幕在线| 欧美国产一区二区在线观看 | 欧美mv日韩mv国产网站| 欧美二区在线看| 亚洲国内高清视频| 欧美+日本+国产+在线a∨观看| 欧美+亚洲+精品+三区| 在线观看国产成人av片| 久久免费99精品久久久久久| 麻豆av一区二区三区久久| 一区一区视频| 免费成人黄色片| 欧美黄色aa电影| 亚洲精品网站在线播放gif| 欧美激情国产日韩精品一区18| 亚洲国产日韩欧美综合久久| 日韩视频中文字幕| 欧美日本亚洲| 亚洲视频精选| 欧美在线亚洲在线| 黑人一区二区| 美女视频黄 久久| 亚洲人成在线观看一区二区| 亚洲视频 欧洲视频| 国产精品日韩精品欧美精品| 性欧美xxxx视频在线观看| 另类成人小视频在线| 亚洲国产精品悠悠久久琪琪 | 欧美专区日韩专区| 精品成人在线| 欧美成人免费小视频| 99国产成+人+综合+亚洲欧美| 亚洲男女自偷自拍| 国产亚洲午夜| 老巨人导航500精品| 亚洲精品偷拍| 欧美一区二区视频在线观看| 韩国三级电影久久久久久| 免费看精品久久片| 99综合电影在线视频| 久久本道综合色狠狠五月| 一区视频在线播放| 欧美精品色综合| 亚洲欧美日韩国产一区| 免费久久99精品国产自在现线| 日韩视频专区| 国产欧美va欧美va香蕉在| 久久躁狠狠躁夜夜爽| 亚洲美女诱惑| 久久久蜜桃精品| 亚洲美女视频| 国产欧美日韩亚州综合| 男人的天堂亚洲在线| 亚洲午夜激情免费视频| 鲁鲁狠狠狠7777一区二区| 亚洲视频欧美在线| 一色屋精品亚洲香蕉网站| 欧美日韩国产成人|