| Index: source/libvpx/third_party/libyuv/source/row_posix.cc
 | 
| diff --git a/source/libvpx/third_party/libyuv/source/row_posix.cc b/source/libvpx/third_party/libyuv/source/row_posix.cc
 | 
| index 106fda56891758db29b55cc88bdcccd4f5b1db04..1a6f7dc4dd006910125f33ad9bf1827fde92a704 100644
 | 
| --- a/source/libvpx/third_party/libyuv/source/row_posix.cc
 | 
| +++ b/source/libvpx/third_party/libyuv/source/row_posix.cc
 | 
| @@ -1,3 +1,4 @@
 | 
| +// VERSION 2
 | 
|  /*
 | 
|   *  Copyright 2011 The LibYuv Project Authors. All rights reserved.
 | 
|   *
 | 
| @@ -92,6 +93,7 @@ static uvec8 kAddY16 = {
 | 
|    16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u
 | 
|  };
 | 
|  
 | 
| +// 7 bit fixed point 0.5.
 | 
|  static vec16 kAddYJ64 = {
 | 
|    64, 64, 64, 64, 64, 64, 64, 64
 | 
|  };
 | 
| @@ -221,7 +223,7 @@ void TestRow_SSE2(const uint8* src_y, uint8* dst_argb, int pix) {
 | 
|    "1:                                          \n"
 | 
|      "movq      " MEMACCESS(0) ",%%xmm0         \n"
 | 
|      "lea       " MEMLEA(0x8,0) ",%0            \n"
 | 
| -    "movdqa    %%xmm0," MEMACCESS(1) "         \n"
 | 
| +    "movdqu    %%xmm0," MEMACCESS(1) "         \n"
 | 
|      "lea       " MEMLEA(0x20,1) ",%1           \n"
 | 
|      "sub       $0x8,%2                         \n"
 | 
|      "jg        1b                              \n"
 | 
| @@ -229,10 +231,7 @@ void TestRow_SSE2(const uint8* src_y, uint8* dst_argb, int pix) {
 | 
|      "+r"(dst_argb),  // %1
 | 
|      "+r"(pix)        // %2
 | 
|    :
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm5"
 | 
| -#endif
 | 
| +  : "memory", "cc", "xmm0", "xmm1", "xmm5"
 | 
|    );
 | 
|  }
 | 
|  #endif  // TESTING
 | 
| @@ -252,37 +251,6 @@ void I400ToARGBRow_SSE2(const uint8* src_y, uint8* dst_argb, int pix) {
 | 
|      "punpckhwd %%xmm1,%%xmm1                   \n"
 | 
|      "por       %%xmm5,%%xmm0                   \n"
 | 
|      "por       %%xmm5,%%xmm1                   \n"
 | 
| -    "movdqa    %%xmm0," MEMACCESS(1) "         \n"
 | 
| -    "movdqa    %%xmm1," MEMACCESS2(0x10,1) "   \n"
 | 
| -    "lea       " MEMLEA(0x20,1) ",%1           \n"
 | 
| -    "sub       $0x8,%2                         \n"
 | 
| -    "jg        1b                              \n"
 | 
| -  : "+r"(src_y),     // %0
 | 
| -    "+r"(dst_argb),  // %1
 | 
| -    "+r"(pix)        // %2
 | 
| -  :
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm5"
 | 
| -#endif
 | 
| -  );
 | 
| -}
 | 
| -
 | 
| -void I400ToARGBRow_Unaligned_SSE2(const uint8* src_y, uint8* dst_argb,
 | 
| -                                  int pix) {
 | 
| -  asm volatile (
 | 
| -    "pcmpeqb   %%xmm5,%%xmm5                   \n"
 | 
| -    "pslld     $0x18,%%xmm5                    \n"
 | 
| -    LABELALIGN
 | 
| -  "1:                                          \n"
 | 
| -    "movq      " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "lea       " MEMLEA(0x8,0) ",%0            \n"
 | 
| -    "punpcklbw %%xmm0,%%xmm0                   \n"
 | 
| -    "movdqa    %%xmm0,%%xmm1                   \n"
 | 
| -    "punpcklwd %%xmm0,%%xmm0                   \n"
 | 
| -    "punpckhwd %%xmm1,%%xmm1                   \n"
 | 
| -    "por       %%xmm5,%%xmm0                   \n"
 | 
| -    "por       %%xmm5,%%xmm1                   \n"
 | 
|      "movdqu    %%xmm0," MEMACCESS(1) "         \n"
 | 
|      "movdqu    %%xmm1," MEMACCESS2(0x10,1) "   \n"
 | 
|      "lea       " MEMLEA(0x20,1) ",%1           \n"
 | 
| @@ -291,11 +259,7 @@ void I400ToARGBRow_Unaligned_SSE2(const uint8* src_y, uint8* dst_argb,
 | 
|    : "+r"(src_y),     // %0
 | 
|      "+r"(dst_argb),  // %1
 | 
|      "+r"(pix)        // %2
 | 
| -  :
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm5"
 | 
| -#endif
 | 
| +  :: "memory", "cc", "xmm0", "xmm1", "xmm5"
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_I400TOARGBROW_SSE2
 | 
| @@ -318,27 +282,24 @@ void RGB24ToARGBRow_SSSE3(const uint8* src_rgb24, uint8* dst_argb, int pix) {
 | 
|      "por       %%xmm5,%%xmm2                   \n"
 | 
|      "palignr   $0xc,%%xmm0,%%xmm1              \n"
 | 
|      "pshufb    %%xmm4,%%xmm0                   \n"
 | 
| -    "movdqa    %%xmm2," MEMACCESS2(0x20,1) "   \n"
 | 
| +    "movdqu    %%xmm2," MEMACCESS2(0x20,1) "   \n"
 | 
|      "por       %%xmm5,%%xmm0                   \n"
 | 
|      "pshufb    %%xmm4,%%xmm1                   \n"
 | 
| -    "movdqa    %%xmm0," MEMACCESS(1) "         \n"
 | 
| +    "movdqu    %%xmm0," MEMACCESS(1) "         \n"
 | 
|      "por       %%xmm5,%%xmm1                   \n"
 | 
|      "palignr   $0x4,%%xmm3,%%xmm3              \n"
 | 
|      "pshufb    %%xmm4,%%xmm3                   \n"
 | 
| -    "movdqa    %%xmm1," MEMACCESS2(0x10,1) "   \n"
 | 
| +    "movdqu    %%xmm1," MEMACCESS2(0x10,1) "   \n"
 | 
|      "por       %%xmm5,%%xmm3                   \n"
 | 
| -    "sub       $0x10,%2                        \n"
 | 
| -    "movdqa    %%xmm3," MEMACCESS2(0x30,1) "   \n"
 | 
| +    "movdqu    %%xmm3," MEMACCESS2(0x30,1) "   \n"
 | 
|      "lea       " MEMLEA(0x40,1) ",%1           \n"
 | 
| +    "sub       $0x10,%2                        \n"
 | 
|      "jg        1b                              \n"
 | 
|    : "+r"(src_rgb24),  // %0
 | 
|      "+r"(dst_argb),  // %1
 | 
|      "+r"(pix)        // %2
 | 
|    : "m"(kShuffleMaskRGB24ToARGB)  // %3
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
| -#endif
 | 
| +  : "memory", "cc" , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
|    );
 | 
|  }
 | 
|  
 | 
| @@ -359,27 +320,24 @@ void RAWToARGBRow_SSSE3(const uint8* src_raw, uint8* dst_argb, int pix) {
 | 
|      "por       %%xmm5,%%xmm2                   \n"
 | 
|      "palignr   $0xc,%%xmm0,%%xmm1              \n"
 | 
|      "pshufb    %%xmm4,%%xmm0                   \n"
 | 
| -    "movdqa    %%xmm2," MEMACCESS2(0x20,1) "   \n"
 | 
| +    "movdqu    %%xmm2," MEMACCESS2(0x20,1) "   \n"
 | 
|      "por       %%xmm5,%%xmm0                   \n"
 | 
|      "pshufb    %%xmm4,%%xmm1                   \n"
 | 
| -    "movdqa    %%xmm0," MEMACCESS(1) "         \n"
 | 
| +    "movdqu    %%xmm0," MEMACCESS(1) "         \n"
 | 
|      "por       %%xmm5,%%xmm1                   \n"
 | 
|      "palignr   $0x4,%%xmm3,%%xmm3              \n"
 | 
|      "pshufb    %%xmm4,%%xmm3                   \n"
 | 
| -    "movdqa    %%xmm1," MEMACCESS2(0x10,1) "   \n"
 | 
| +    "movdqu    %%xmm1," MEMACCESS2(0x10,1) "   \n"
 | 
|      "por       %%xmm5,%%xmm3                   \n"
 | 
| -    "sub       $0x10,%2                        \n"
 | 
| -    "movdqa    %%xmm3," MEMACCESS2(0x30,1) "   \n"
 | 
| +    "movdqu    %%xmm3," MEMACCESS2(0x30,1) "   \n"
 | 
|      "lea       " MEMLEA(0x40,1) ",%1           \n"
 | 
| +    "sub       $0x10,%2                        \n"
 | 
|      "jg        1b                              \n"
 | 
|    : "+r"(src_raw),   // %0
 | 
|      "+r"(dst_argb),  // %1
 | 
|      "+r"(pix)        // %2
 | 
|    : "m"(kShuffleMaskRAWToARGB)  // %3
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
| -#endif
 | 
| +  : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
|    );
 | 
|  }
 | 
|  
 | 
| @@ -417,9 +375,8 @@ void RGB565ToARGBRow_SSE2(const uint8* src, uint8* dst, int pix) {
 | 
|      "movdqa    %%xmm1,%%xmm2                   \n"
 | 
|      "punpcklbw %%xmm0,%%xmm1                   \n"
 | 
|      "punpckhbw %%xmm0,%%xmm2                   \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPMEM(movdqa,xmm1,0x00,1,0,2)           //  movdqa  %%xmm1,(%1,%0,2)
 | 
| -    MEMOPMEM(movdqa,xmm2,0x10,1,0,2)           //  movdqa  %%xmm2,0x10(%1,%0,2)
 | 
| +    MEMOPMEM(movdqu,xmm1,0x00,1,0,2)           //  movdqu  %%xmm1,(%1,%0,2)
 | 
| +    MEMOPMEM(movdqu,xmm2,0x10,1,0,2)           //  movdqu  %%xmm2,0x10(%1,%0,2)
 | 
|      "lea       " MEMLEA(0x10,0) ",%0           \n"
 | 
|      "sub       $0x8,%2                         \n"
 | 
|      "jg        1b                              \n"
 | 
| @@ -427,13 +384,8 @@ void RGB565ToARGBRow_SSE2(const uint8* src, uint8* dst, int pix) {
 | 
|      "+r"(dst),  // %1
 | 
|      "+r"(pix)   // %2
 | 
|    :
 | 
| -  : "memory", "cc", "eax"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7"
 | 
| -#endif
 | 
| +  : "memory", "cc", "eax", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7"
 | 
|    );
 | 
|  }
 | 
|  
 | 
| @@ -474,9 +426,8 @@ void ARGB1555ToARGBRow_SSE2(const uint8* src, uint8* dst, int pix) {
 | 
|      "movdqa    %%xmm1,%%xmm2                   \n"
 | 
|      "punpcklbw %%xmm0,%%xmm1                   \n"
 | 
|      "punpckhbw %%xmm0,%%xmm2                   \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPMEM(movdqa,xmm1,0x00,1,0,2)           //  movdqa  %%xmm1,(%1,%0,2)
 | 
| -    MEMOPMEM(movdqa,xmm2,0x10,1,0,2)           //  movdqa  %%xmm2,0x10(%1,%0,2)
 | 
| +    MEMOPMEM(movdqu,xmm1,0x00,1,0,2)           //  movdqu  %%xmm1,(%1,%0,2)
 | 
| +    MEMOPMEM(movdqu,xmm2,0x10,1,0,2)           //  movdqu  %%xmm2,0x10(%1,%0,2)
 | 
|      "lea       " MEMLEA(0x10,0) ",%0           \n"
 | 
|      "sub       $0x8,%2                         \n"
 | 
|      "jg        1b                              \n"
 | 
| @@ -484,13 +435,8 @@ void ARGB1555ToARGBRow_SSE2(const uint8* src, uint8* dst, int pix) {
 | 
|      "+r"(dst),  // %1
 | 
|      "+r"(pix)   // %2
 | 
|    :
 | 
| -  : "memory", "cc", "eax"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7"
 | 
| -#endif
 | 
| +  : "memory", "cc", "eax", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7"
 | 
|    );
 | 
|  }
 | 
|  
 | 
| @@ -518,9 +464,8 @@ void ARGB4444ToARGBRow_SSE2(const uint8* src, uint8* dst, int pix) {
 | 
|      "movdqa    %%xmm0,%%xmm1                   \n"
 | 
|      "punpcklbw %%xmm2,%%xmm0                   \n"
 | 
|      "punpckhbw %%xmm2,%%xmm1                   \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPMEM(movdqa,xmm0,0x00,1,0,2)           //  movdqa  %%xmm0,(%1,%0,2)
 | 
| -    MEMOPMEM(movdqa,xmm1,0x10,1,0,2)           //  movdqa  %%xmm1,0x10(%1,%0,2)
 | 
| +    MEMOPMEM(movdqu,xmm0,0x00,1,0,2)           //  movdqu  %%xmm0,(%1,%0,2)
 | 
| +    MEMOPMEM(movdqu,xmm1,0x10,1,0,2)           //  movdqu  %%xmm1,0x10(%1,%0,2)
 | 
|      "lea       " MEMLEA(0x10,0) ",%0           \n"
 | 
|      "sub       $0x8,%2                         \n"
 | 
|      "jg        1b                              \n"
 | 
| @@ -528,13 +473,8 @@ void ARGB4444ToARGBRow_SSE2(const uint8* src, uint8* dst, int pix) {
 | 
|      "+r"(dst),  // %1
 | 
|      "+r"(pix)   // %2
 | 
|    :
 | 
| -  : "memory", "cc", "eax"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
| -#endif
 | 
| +  : "memory", "cc", "eax", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
|    );
 | 
|  }
 | 
|  
 | 
| @@ -572,10 +512,7 @@ void ARGBToRGB24Row_SSSE3(const uint8* src, uint8* dst, int pix) {
 | 
|      "+r"(dst),  // %1
 | 
|      "+r"(pix)   // %2
 | 
|    : "m"(kShuffleMaskARGBToRGB24)  // %3
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6"
 | 
| -#endif
 | 
| +  : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6"
 | 
|    );
 | 
|  }
 | 
|  
 | 
| @@ -613,10 +550,7 @@ void ARGBToRAWRow_SSSE3(const uint8* src, uint8* dst, int pix) {
 | 
|      "+r"(dst),  // %1
 | 
|      "+r"(pix)   // %2
 | 
|    : "m"(kShuffleMaskARGBToRAW)  // %3
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6"
 | 
| -#endif
 | 
| +  : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6"
 | 
|    );
 | 
|  }
 | 
|  
 | 
| @@ -631,7 +565,7 @@ void ARGBToRGB565Row_SSE2(const uint8* src, uint8* dst, int pix) {
 | 
|      "pslld     $0xb,%%xmm5                     \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
|      "movdqa    %%xmm0,%%xmm1                   \n"
 | 
|      "movdqa    %%xmm0,%%xmm2                   \n"
 | 
|      "pslld     $0x8,%%xmm0                     \n"
 | 
| @@ -652,11 +586,7 @@ void ARGBToRGB565Row_SSE2(const uint8* src, uint8* dst, int pix) {
 | 
|    : "+r"(src),  // %0
 | 
|      "+r"(dst),  // %1
 | 
|      "+r"(pix)   // %2
 | 
| -  :
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
| -#endif
 | 
| +  :: "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
|    );
 | 
|  }
 | 
|  
 | 
| @@ -672,7 +602,7 @@ void ARGBToARGB1555Row_SSE2(const uint8* src, uint8* dst, int pix) {
 | 
|      "pslld     $0xf,%%xmm7                     \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
|      "movdqa    %%xmm0,%%xmm1                   \n"
 | 
|      "movdqa    %%xmm0,%%xmm2                   \n"
 | 
|      "movdqa    %%xmm0,%%xmm3                   \n"
 | 
| @@ -690,17 +620,14 @@ void ARGBToARGB1555Row_SSE2(const uint8* src, uint8* dst, int pix) {
 | 
|      "packssdw  %%xmm0,%%xmm0                   \n"
 | 
|      "lea       " MEMLEA(0x10,0) ",%0           \n"
 | 
|      "movq      %%xmm0," MEMACCESS(1) "         \n"
 | 
| -    "lea       " MEMACCESS2(0x8,1) ",%1        \n"
 | 
| +    "lea       " MEMLEA(0x8,1) ",%1            \n"
 | 
|      "sub       $0x4,%2                         \n"
 | 
|      "jg        1b                              \n"
 | 
|    : "+r"(src),  // %0
 | 
|      "+r"(dst),  // %1
 | 
|      "+r"(pix)   // %2
 | 
| -  :
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7"
 | 
| -#endif
 | 
| +  :: "memory", "cc",
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7"
 | 
|    );
 | 
|  }
 | 
|  
 | 
| @@ -712,7 +639,7 @@ void ARGBToARGB4444Row_SSE2(const uint8* src, uint8* dst, int pix) {
 | 
|      "psrlw     $0x8,%%xmm3                     \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
|      "movdqa    %%xmm0,%%xmm1                   \n"
 | 
|      "pand      %%xmm3,%%xmm0                   \n"
 | 
|      "pand      %%xmm4,%%xmm1                   \n"
 | 
| @@ -728,26 +655,23 @@ void ARGBToARGB4444Row_SSE2(const uint8* src, uint8* dst, int pix) {
 | 
|    : "+r"(src),  // %0
 | 
|      "+r"(dst),  // %1
 | 
|      "+r"(pix)   // %2
 | 
| -  :
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4"
 | 
| -#endif
 | 
| +  :: "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4"
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_RGB24TOARGBROW_SSSE3
 | 
|  
 | 
|  #ifdef HAS_ARGBTOYROW_SSSE3
 | 
| +// Convert 16 ARGB pixels (64 bytes) to 16 Y values.
 | 
|  void ARGBToYRow_SSSE3(const uint8* src_argb, uint8* dst_y, int pix) {
 | 
|    asm volatile (
 | 
| -    "movdqa    %4,%%xmm5                       \n"
 | 
|      "movdqa    %3,%%xmm4                       \n"
 | 
| +    "movdqa    %4,%%xmm5                       \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "movdqa    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| -    "movdqa    " MEMACCESS2(0x20,0) ",%%xmm2   \n"
 | 
| -    "movdqa    " MEMACCESS2(0x30,0) ",%%xmm3   \n"
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| +    "movdqu    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| +    "movdqu    " MEMACCESS2(0x20,0) ",%%xmm2   \n"
 | 
| +    "movdqu    " MEMACCESS2(0x30,0) ",%%xmm3   \n"
 | 
|      "pmaddubsw %%xmm4,%%xmm0                   \n"
 | 
|      "pmaddubsw %%xmm4,%%xmm1                   \n"
 | 
|      "pmaddubsw %%xmm4,%%xmm2                   \n"
 | 
| @@ -759,26 +683,27 @@ void ARGBToYRow_SSSE3(const uint8* src_argb, uint8* dst_y, int pix) {
 | 
|      "psrlw     $0x7,%%xmm2                     \n"
 | 
|      "packuswb  %%xmm2,%%xmm0                   \n"
 | 
|      "paddb     %%xmm5,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%2                        \n"
 | 
| -    "movdqa    %%xmm0," MEMACCESS(1) "         \n"
 | 
| +    "movdqu    %%xmm0," MEMACCESS(1) "         \n"
 | 
|      "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| +    "sub       $0x10,%2                        \n"
 | 
|      "jg        1b                              \n"
 | 
|    : "+r"(src_argb),  // %0
 | 
|      "+r"(dst_y),     // %1
 | 
|      "+r"(pix)        // %2
 | 
|    : "m"(kARGBToY),   // %3
 | 
|      "m"(kAddY16)     // %4
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
| -#endif
 | 
| +  : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
|    );
 | 
|  }
 | 
| +#endif  // HAS_ARGBTOYROW_SSSE3
 | 
|  
 | 
| -void ARGBToYRow_Unaligned_SSSE3(const uint8* src_argb, uint8* dst_y, int pix) {
 | 
| +#ifdef HAS_ARGBTOYJROW_SSSE3
 | 
| +// Convert 16 ARGB pixels (64 bytes) to 16 YJ values.
 | 
| +// Same as ARGBToYRow but different coefficients, no add 16, but do rounding.
 | 
| +void ARGBToYJRow_SSSE3(const uint8* src_argb, uint8* dst_y, int pix) {
 | 
|    asm volatile (
 | 
| -    "movdqa    %4,%%xmm5                       \n"
 | 
|      "movdqa    %3,%%xmm4                       \n"
 | 
| +    "movdqa    %4,%%xmm5                       \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
|      "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| @@ -792,135 +717,136 @@ void ARGBToYRow_Unaligned_SSSE3(const uint8* src_argb, uint8* dst_y, int pix) {
 | 
|      "lea       " MEMLEA(0x40,0) ",%0           \n"
 | 
|      "phaddw    %%xmm1,%%xmm0                   \n"
 | 
|      "phaddw    %%xmm3,%%xmm2                   \n"
 | 
| +    "paddw     %%xmm5,%%xmm0                   \n"
 | 
| +    "paddw     %%xmm5,%%xmm2                   \n"
 | 
|      "psrlw     $0x7,%%xmm0                     \n"
 | 
|      "psrlw     $0x7,%%xmm2                     \n"
 | 
|      "packuswb  %%xmm2,%%xmm0                   \n"
 | 
| -    "paddb     %%xmm5,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%2                        \n"
 | 
|      "movdqu    %%xmm0," MEMACCESS(1) "         \n"
 | 
|      "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| +    "sub       $0x10,%2                        \n"
 | 
|      "jg        1b                              \n"
 | 
|    : "+r"(src_argb),  // %0
 | 
|      "+r"(dst_y),     // %1
 | 
|      "+r"(pix)        // %2
 | 
| -  : "m"(kARGBToY),   // %3
 | 
| -    "m"(kAddY16)     // %4
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
| -#endif
 | 
| +  : "m"(kARGBToYJ),  // %3
 | 
| +    "m"(kAddYJ64)    // %4
 | 
| +  : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
|    );
 | 
|  }
 | 
| -#endif  // HAS_ARGBTOYROW_SSSE3
 | 
| +#endif  // HAS_ARGBTOYJROW_SSSE3
 | 
|  
 | 
| -#ifdef HAS_ARGBTOYJROW_SSSE3
 | 
| -void ARGBToYJRow_SSSE3(const uint8* src_argb, uint8* dst_y, int pix) {
 | 
| +#ifdef HAS_ARGBTOYROW_AVX2
 | 
| +// vpermd for vphaddw + vpackuswb vpermd.
 | 
| +static const lvec32 kPermdARGBToY_AVX = {
 | 
| +  0, 4, 1, 5, 2, 6, 3, 7
 | 
| +};
 | 
| +
 | 
| +// Convert 32 ARGB pixels (128 bytes) to 32 Y values.
 | 
| +void ARGBToYRow_AVX2(const uint8* src_argb, uint8* dst_y, int pix) {
 | 
|    asm volatile (
 | 
| -    "movdqa    %3,%%xmm4                       \n"
 | 
| -    "movdqa    %4,%%xmm5                       \n"
 | 
| +    "vbroadcastf128 %3,%%ymm4                  \n"
 | 
| +    "vbroadcastf128 %4,%%ymm5                  \n"
 | 
| +    "vmovdqu    %5,%%ymm6                      \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "movdqa    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| -    "movdqa    " MEMACCESS2(0x20,0) ",%%xmm2   \n"
 | 
| -    "movdqa    " MEMACCESS2(0x30,0) ",%%xmm3   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm0                   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm1                   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm2                   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm3                   \n"
 | 
| -    "lea       " MEMLEA(0x40,0) ",%0           \n"
 | 
| -    "phaddw    %%xmm1,%%xmm0                   \n"
 | 
| -    "phaddw    %%xmm3,%%xmm2                   \n"
 | 
| -    "paddw     %%xmm5,%%xmm0                   \n"
 | 
| -    "paddw     %%xmm5,%%xmm2                   \n"
 | 
| -    "psrlw     $0x7,%%xmm0                     \n"
 | 
| -    "psrlw     $0x7,%%xmm2                     \n"
 | 
| -    "packuswb  %%xmm2,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%2                        \n"
 | 
| -    "movdqa    %%xmm0," MEMACCESS(1) "         \n"
 | 
| -    "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| +    "vmovdqu    " MEMACCESS(0) ",%%ymm0        \n"
 | 
| +    "vmovdqu    " MEMACCESS2(0x20,0) ",%%ymm1  \n"
 | 
| +    "vmovdqu    " MEMACCESS2(0x40,0) ",%%ymm2  \n"
 | 
| +    "vmovdqu    " MEMACCESS2(0x60,0) ",%%ymm3  \n"
 | 
| +    "vpmaddubsw %%ymm4,%%ymm0,%%ymm0           \n"
 | 
| +    "vpmaddubsw %%ymm4,%%ymm1,%%ymm1           \n"
 | 
| +    "vpmaddubsw %%ymm4,%%ymm2,%%ymm2           \n"
 | 
| +    "vpmaddubsw %%ymm4,%%ymm3,%%ymm3           \n"
 | 
| +    "lea       " MEMLEA(0x80,0) ",%0           \n"
 | 
| +    "vphaddw    %%ymm1,%%ymm0,%%ymm0           \n"  // mutates.
 | 
| +    "vphaddw    %%ymm3,%%ymm2,%%ymm2           \n"
 | 
| +    "vpsrlw     $0x7,%%ymm0,%%ymm0             \n"
 | 
| +    "vpsrlw     $0x7,%%ymm2,%%ymm2             \n"
 | 
| +    "vpackuswb  %%ymm2,%%ymm0,%%ymm0           \n"  // mutates.
 | 
| +    "vpermd     %%ymm0,%%ymm6,%%ymm0           \n"  // unmutate.
 | 
| +    "vpaddb     %%ymm5,%%ymm0,%%ymm0           \n"  // add 16 for Y
 | 
| +    "vmovdqu    %%ymm0," MEMACCESS(1) "        \n"
 | 
| +    "lea       " MEMLEA(0x20,1) ",%1           \n"
 | 
| +    "sub       $0x20,%2                        \n"
 | 
|      "jg        1b                              \n"
 | 
| +    "vzeroupper                                \n"
 | 
|    : "+r"(src_argb),  // %0
 | 
|      "+r"(dst_y),     // %1
 | 
|      "+r"(pix)        // %2
 | 
| -  : "m"(kARGBToYJ),  // %3
 | 
| -    "m"(kAddYJ64)    // %4
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
| -#endif
 | 
| +  : "m"(kARGBToY),   // %3
 | 
| +    "m"(kAddY16),    // %4
 | 
| +    "m"(kPermdARGBToY_AVX)  // %5
 | 
| +  : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6"
 | 
|    );
 | 
|  }
 | 
| +#endif  // HAS_ARGBTOYROW_AVX2
 | 
|  
 | 
| -void ARGBToYJRow_Unaligned_SSSE3(const uint8* src_argb, uint8* dst_y, int pix) {
 | 
| +#ifdef HAS_ARGBTOYJROW_AVX2
 | 
| +// Convert 32 ARGB pixels (128 bytes) to 32 Y values.
 | 
| +void ARGBToYJRow_AVX2(const uint8* src_argb, uint8* dst_y, int pix) {
 | 
|    asm volatile (
 | 
| -    "movdqa    %3,%%xmm4                       \n"
 | 
| -    "movdqa    %4,%%xmm5                       \n"
 | 
| +    "vbroadcastf128 %3,%%ymm4                  \n"
 | 
| +    "vbroadcastf128 %4,%%ymm5                  \n"
 | 
| +    "vmovdqu    %5,%%ymm6                      \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "movdqu    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| -    "movdqu    " MEMACCESS2(0x20,0) ",%%xmm2   \n"
 | 
| -    "movdqu    " MEMACCESS2(0x30,0) ",%%xmm3   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm0                   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm1                   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm2                   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm3                   \n"
 | 
| -    "lea       " MEMLEA(0x40,0) ",%0           \n"
 | 
| -    "phaddw    %%xmm1,%%xmm0                   \n"
 | 
| -    "phaddw    %%xmm3,%%xmm2                   \n"
 | 
| -    "paddw     %%xmm5,%%xmm0                   \n"
 | 
| -    "paddw     %%xmm5,%%xmm2                   \n"
 | 
| -    "psrlw     $0x7,%%xmm0                     \n"
 | 
| -    "psrlw     $0x7,%%xmm2                     \n"
 | 
| -    "packuswb  %%xmm2,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%2                        \n"
 | 
| -    "movdqu    %%xmm0," MEMACCESS(1) "         \n"
 | 
| -    "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| +    "vmovdqu    " MEMACCESS(0) ",%%ymm0        \n"
 | 
| +    "vmovdqu    " MEMACCESS2(0x20,0) ",%%ymm1  \n"
 | 
| +    "vmovdqu    " MEMACCESS2(0x40,0) ",%%ymm2  \n"
 | 
| +    "vmovdqu    " MEMACCESS2(0x60,0) ",%%ymm3  \n"
 | 
| +    "vpmaddubsw %%ymm4,%%ymm0,%%ymm0           \n"
 | 
| +    "vpmaddubsw %%ymm4,%%ymm1,%%ymm1           \n"
 | 
| +    "vpmaddubsw %%ymm4,%%ymm2,%%ymm2           \n"
 | 
| +    "vpmaddubsw %%ymm4,%%ymm3,%%ymm3           \n"
 | 
| +    "lea       " MEMLEA(0x80,0) ",%0           \n"
 | 
| +    "vphaddw    %%ymm1,%%ymm0,%%ymm0           \n"  // mutates.
 | 
| +    "vphaddw    %%ymm3,%%ymm2,%%ymm2           \n"
 | 
| +    "vpaddw     %%ymm5,%%ymm0,%%ymm0           \n"  // Add .5 for rounding.
 | 
| +    "vpaddw     %%ymm5,%%ymm2,%%ymm2           \n"
 | 
| +    "vpsrlw     $0x7,%%ymm0,%%ymm0             \n"
 | 
| +    "vpsrlw     $0x7,%%ymm2,%%ymm2             \n"
 | 
| +    "vpackuswb  %%ymm2,%%ymm0,%%ymm0           \n"  // mutates.
 | 
| +    "vpermd     %%ymm0,%%ymm6,%%ymm0           \n"  // unmutate.
 | 
| +    "vmovdqu    %%ymm0," MEMACCESS(1) "        \n"
 | 
| +    "lea       " MEMLEA(0x20,1) ",%1           \n"
 | 
| +    "sub       $0x20,%2                        \n"
 | 
|      "jg        1b                              \n"
 | 
| +    "vzeroupper                                \n"
 | 
|    : "+r"(src_argb),  // %0
 | 
|      "+r"(dst_y),     // %1
 | 
|      "+r"(pix)        // %2
 | 
| -  : "m"(kARGBToYJ),  // %3
 | 
| -    "m"(kAddYJ64)    // %4
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
| -#endif
 | 
| +  : "m"(kARGBToYJ),   // %3
 | 
| +    "m"(kAddYJ64),    // %4
 | 
| +    "m"(kPermdARGBToY_AVX)  // %5
 | 
| +  : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6"
 | 
|    );
 | 
|  }
 | 
| -#endif  // HAS_ARGBTOYJROW_SSSE3
 | 
| +#endif  // HAS_ARGBTOYJROW_AVX2
 | 
|  
 | 
|  #ifdef HAS_ARGBTOUVROW_SSSE3
 | 
| -// TODO(fbarchard): pass xmm constants to single block of assembly.
 | 
| -// fpic on GCC 4.2 for OSX runs out of GPR registers. "m" effectively takes
 | 
| -// 3 registers - ebx, ebp and eax. "m" can be passed with 3 normal registers,
 | 
| -// or 4 if stack frame is disabled. Doing 2 assembly blocks is a work around
 | 
| -// and considered unsafe.
 | 
|  void ARGBToUVRow_SSSE3(const uint8* src_argb0, int src_stride_argb,
 | 
|                         uint8* dst_u, uint8* dst_v, int width) {
 | 
|    asm volatile (
 | 
| -    "movdqa    %0,%%xmm4                       \n"
 | 
| -    "movdqa    %1,%%xmm3                       \n"
 | 
| -    "movdqa    %2,%%xmm5                       \n"
 | 
| -  :
 | 
| -  : "m"(kARGBToU),  // %0
 | 
| -    "m"(kARGBToV),  // %1
 | 
| -    "m"(kAddUV128)  // %2
 | 
| -  );
 | 
| -  asm volatile (
 | 
| +    "movdqa    %5,%%xmm3                       \n"
 | 
| +    "movdqa    %6,%%xmm4                       \n"
 | 
| +    "movdqa    %7,%%xmm5                       \n"
 | 
|      "sub       %1,%2                           \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "movdqa    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| -    "movdqa    " MEMACCESS2(0x20,0) ",%%xmm2   \n"
 | 
| -    "movdqa    " MEMACCESS2(0x30,0) ",%%xmm6   \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPREG(pavgb,0x00,0,4,1,xmm0)            //  pavgb   (%0,%4,1),%%xmm0
 | 
| -    MEMOPREG(pavgb,0x10,0,4,1,xmm1)            //  pavgb   0x10(%0,%4,1),%%xmm1
 | 
| -    MEMOPREG(pavgb,0x20,0,4,1,xmm2)            //  pavgb   0x20(%0,%4,1),%%xmm2
 | 
| -    MEMOPREG(pavgb,0x30,0,4,1,xmm6)            //  pavgb   0x30(%0,%4,1),%%xmm6
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| +    MEMOPREG(movdqu,0x00,0,4,1,xmm7)            //  movdqu (%0,%4,1),%%xmm7
 | 
| +    "pavgb     %%xmm7,%%xmm0                   \n"
 | 
| +    "movdqu    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| +    MEMOPREG(movdqu,0x10,0,4,1,xmm7)            //  movdqu 0x10(%0,%4,1),%%xmm7
 | 
| +    "pavgb     %%xmm7,%%xmm1                   \n"
 | 
| +    "movdqu    " MEMACCESS2(0x20,0) ",%%xmm2   \n"
 | 
| +    MEMOPREG(movdqu,0x20,0,4,1,xmm7)            //  movdqu 0x20(%0,%4,1),%%xmm7
 | 
| +    "pavgb     %%xmm7,%%xmm2                   \n"
 | 
| +    "movdqu    " MEMACCESS2(0x30,0) ",%%xmm6   \n"
 | 
| +    MEMOPREG(movdqu,0x30,0,4,1,xmm7)            //  movdqu 0x30(%0,%4,1),%%xmm7
 | 
| +    "pavgb     %%xmm7,%%xmm6                   \n"
 | 
| +
 | 
|      "lea       " MEMLEA(0x40,0) ",%0           \n"
 | 
|      "movdqa    %%xmm0,%%xmm7                   \n"
 | 
|      "shufps    $0x88,%%xmm1,%%xmm0             \n"
 | 
| @@ -942,123 +868,114 @@ void ARGBToUVRow_SSSE3(const uint8* src_argb0, int src_stride_argb,
 | 
|      "psraw     $0x8,%%xmm1                     \n"
 | 
|      "packsswb  %%xmm1,%%xmm0                   \n"
 | 
|      "paddb     %%xmm5,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%3                        \n"
 | 
|      "movlps    %%xmm0," MEMACCESS(1) "         \n"
 | 
| -    BUNDLEALIGN
 | 
|      MEMOPMEM(movhps,xmm0,0x00,1,2,1)           //  movhps    %%xmm0,(%1,%2,1)
 | 
|      "lea       " MEMLEA(0x8,1) ",%1            \n"
 | 
| +    "sub       $0x10,%3                        \n"
 | 
|      "jg        1b                              \n"
 | 
|    : "+r"(src_argb0),       // %0
 | 
|      "+r"(dst_u),           // %1
 | 
|      "+r"(dst_v),           // %2
 | 
|      "+rm"(width)           // %3
 | 
| -  : "r"((intptr_t)(src_stride_argb)) // %4
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm6", "xmm7"
 | 
| -#endif
 | 
| +  : "r"((intptr_t)(src_stride_argb)), // %4
 | 
| +    "m"(kARGBToV),  // %5
 | 
| +    "m"(kARGBToU),  // %6
 | 
| +    "m"(kAddUV128)  // %7
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm6", "xmm7"
 | 
|    );
 | 
|  }
 | 
| +#endif  // HAS_ARGBTOUVROW_SSSE3
 | 
|  
 | 
| -// TODO(fbarchard): Share code with ARGBToUVRow_SSSE3.
 | 
| -void ARGBToUVJRow_SSSE3(const uint8* src_argb0, int src_stride_argb,
 | 
| -                        uint8* dst_u, uint8* dst_v, int width) {
 | 
| -  asm volatile (
 | 
| -    "movdqa    %0,%%xmm4                       \n"
 | 
| -    "movdqa    %1,%%xmm3                       \n"
 | 
| -    "movdqa    %2,%%xmm5                       \n"
 | 
| -  :
 | 
| -  : "m"(kARGBToUJ),  // %0
 | 
| -    "m"(kARGBToVJ),  // %1
 | 
| -    "m"(kAddUVJ128)  // %2
 | 
| -  );
 | 
| +#ifdef HAS_ARGBTOUVROW_AVX2
 | 
| +// vpshufb for vphaddw + vpackuswb packed to shorts.
 | 
| +static const lvec8 kShufARGBToUV_AVX = {
 | 
| +  0, 1, 8, 9, 2, 3, 10, 11, 4, 5, 12, 13, 6, 7, 14, 15,
 | 
| +  0, 1, 8, 9, 2, 3, 10, 11, 4, 5, 12, 13, 6, 7, 14, 15
 | 
| +};
 | 
| +void ARGBToUVRow_AVX2(const uint8* src_argb0, int src_stride_argb,
 | 
| +                      uint8* dst_u, uint8* dst_v, int width) {
 | 
|    asm volatile (
 | 
| +    "vbroadcastf128 %5,%%ymm5                  \n"
 | 
| +    "vbroadcastf128 %6,%%ymm6                  \n"
 | 
| +    "vbroadcastf128 %7,%%ymm7                  \n"
 | 
|      "sub       %1,%2                           \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "movdqa    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| -    "movdqa    " MEMACCESS2(0x20,0) ",%%xmm2   \n"
 | 
| -    "movdqa    " MEMACCESS2(0x30,0) ",%%xmm6   \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPREG(pavgb,0x00,0,4,1,xmm0)            //  pavgb   (%0,%4,1),%%xmm0
 | 
| -    MEMOPREG(pavgb,0x10,0,4,1,xmm1)            //  pavgb   0x10(%0,%4,1),%%xmm1
 | 
| -    MEMOPREG(pavgb,0x20,0,4,1,xmm2)            //  pavgb   0x20(%0,%4,1),%%xmm2
 | 
| -    MEMOPREG(pavgb,0x30,0,4,1,xmm6)            //  pavgb   0x30(%0,%4,1),%%xmm6
 | 
| -    "lea       " MEMLEA(0x40,0) ",%0           \n"
 | 
| -    "movdqa    %%xmm0,%%xmm7                   \n"
 | 
| -    "shufps    $0x88,%%xmm1,%%xmm0             \n"
 | 
| -    "shufps    $0xdd,%%xmm1,%%xmm7             \n"
 | 
| -    "pavgb     %%xmm7,%%xmm0                   \n"
 | 
| -    "movdqa    %%xmm2,%%xmm7                   \n"
 | 
| -    "shufps    $0x88,%%xmm6,%%xmm2             \n"
 | 
| -    "shufps    $0xdd,%%xmm6,%%xmm7             \n"
 | 
| -    "pavgb     %%xmm7,%%xmm2                   \n"
 | 
| -    "movdqa    %%xmm0,%%xmm1                   \n"
 | 
| -    "movdqa    %%xmm2,%%xmm6                   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm0                   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm2                   \n"
 | 
| -    "pmaddubsw %%xmm3,%%xmm1                   \n"
 | 
| -    "pmaddubsw %%xmm3,%%xmm6                   \n"
 | 
| -    "phaddw    %%xmm2,%%xmm0                   \n"
 | 
| -    "phaddw    %%xmm6,%%xmm1                   \n"
 | 
| -    "paddw     %%xmm5,%%xmm0                   \n"
 | 
| -    "paddw     %%xmm5,%%xmm1                   \n"
 | 
| -    "psraw     $0x8,%%xmm0                     \n"
 | 
| -    "psraw     $0x8,%%xmm1                     \n"
 | 
| -    "packsswb  %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%3                        \n"
 | 
| -    "movlps    %%xmm0," MEMACCESS(1) "         \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPMEM(movhps,xmm0,0x00,1,2,1)           //  movhps  %%xmm0,(%1,%2,1)
 | 
| -    "lea       " MEMLEA(0x8,1) ",%1            \n"
 | 
| +    "vmovdqu    " MEMACCESS(0) ",%%ymm0        \n"
 | 
| +    "vmovdqu    " MEMACCESS2(0x20,0) ",%%ymm1  \n"
 | 
| +    "vmovdqu    " MEMACCESS2(0x40,0) ",%%ymm2  \n"
 | 
| +    "vmovdqu    " MEMACCESS2(0x60,0) ",%%ymm3  \n"
 | 
| +    VMEMOPREG(vpavgb,0x00,0,4,1,ymm0,ymm0)     // vpavgb (%0,%4,1),%%ymm0,%%ymm0
 | 
| +    VMEMOPREG(vpavgb,0x20,0,4,1,ymm1,ymm1)
 | 
| +    VMEMOPREG(vpavgb,0x40,0,4,1,ymm2,ymm2)
 | 
| +    VMEMOPREG(vpavgb,0x60,0,4,1,ymm3,ymm3)
 | 
| +    "lea       " MEMLEA(0x80,0) ",%0           \n"
 | 
| +    "vshufps    $0x88,%%ymm1,%%ymm0,%%ymm4     \n"
 | 
| +    "vshufps    $0xdd,%%ymm1,%%ymm0,%%ymm0     \n"
 | 
| +    "vpavgb     %%ymm4,%%ymm0,%%ymm0           \n"
 | 
| +    "vshufps    $0x88,%%ymm3,%%ymm2,%%ymm4     \n"
 | 
| +    "vshufps    $0xdd,%%ymm3,%%ymm2,%%ymm2     \n"
 | 
| +    "vpavgb     %%ymm4,%%ymm2,%%ymm2           \n"
 | 
| +
 | 
| +    "vpmaddubsw %%ymm7,%%ymm0,%%ymm1           \n"
 | 
| +    "vpmaddubsw %%ymm7,%%ymm2,%%ymm3           \n"
 | 
| +    "vpmaddubsw %%ymm6,%%ymm0,%%ymm0           \n"
 | 
| +    "vpmaddubsw %%ymm6,%%ymm2,%%ymm2           \n"
 | 
| +    "vphaddw    %%ymm3,%%ymm1,%%ymm1           \n"
 | 
| +    "vphaddw    %%ymm2,%%ymm0,%%ymm0           \n"
 | 
| +    "vpsraw     $0x8,%%ymm1,%%ymm1             \n"
 | 
| +    "vpsraw     $0x8,%%ymm0,%%ymm0             \n"
 | 
| +    "vpacksswb  %%ymm0,%%ymm1,%%ymm0           \n"
 | 
| +    "vpermq     $0xd8,%%ymm0,%%ymm0            \n"
 | 
| +    "vpshufb    %8,%%ymm0,%%ymm0               \n"
 | 
| +    "vpaddb     %%ymm5,%%ymm0,%%ymm0           \n"
 | 
| +
 | 
| +    "vextractf128 $0x0,%%ymm0," MEMACCESS(1) " \n"
 | 
| +    VEXTOPMEM(vextractf128,1,ymm0,0x0,1,2,1) // vextractf128 $1,%%ymm0,(%1,%2,1)
 | 
| +    "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| +    "sub       $0x20,%3                        \n"
 | 
|      "jg        1b                              \n"
 | 
| +    "vzeroupper                                \n"
 | 
|    : "+r"(src_argb0),       // %0
 | 
|      "+r"(dst_u),           // %1
 | 
|      "+r"(dst_v),           // %2
 | 
|      "+rm"(width)           // %3
 | 
| -  : "r"((intptr_t)(src_stride_argb)) // %4
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm6", "xmm7"
 | 
| -#endif
 | 
| +  : "r"((intptr_t)(src_stride_argb)), // %4
 | 
| +    "m"(kAddUV128),  // %5
 | 
| +    "m"(kARGBToV),   // %6
 | 
| +    "m"(kARGBToU),   // %7
 | 
| +    "m"(kShufARGBToUV_AVX)  // %8
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7"
 | 
|    );
 | 
|  }
 | 
| +#endif  // HAS_ARGBTOUVROW_AVX2
 | 
|  
 | 
| -void ARGBToUVRow_Unaligned_SSSE3(const uint8* src_argb0, int src_stride_argb,
 | 
| -                                 uint8* dst_u, uint8* dst_v, int width) {
 | 
| -  asm volatile (
 | 
| -    "movdqa    %0,%%xmm4                       \n"
 | 
| -    "movdqa    %1,%%xmm3                       \n"
 | 
| -    "movdqa    %2,%%xmm5                       \n"
 | 
| -  :
 | 
| -  : "m"(kARGBToU),         // %0
 | 
| -    "m"(kARGBToV),         // %1
 | 
| -    "m"(kAddUV128)         // %2
 | 
| -  );
 | 
| +#ifdef HAS_ARGBTOUVJROW_SSSE3
 | 
| +// TODO(fbarchard): Share code with ARGBToUVRow_SSSE3.
 | 
| +void ARGBToUVJRow_SSSE3(const uint8* src_argb0, int src_stride_argb,
 | 
| +                        uint8* dst_u, uint8* dst_v, int width) {
 | 
|    asm volatile (
 | 
| +    "movdqa    %5,%%xmm3                       \n"
 | 
| +    "movdqa    %6,%%xmm4                       \n"
 | 
| +    "movdqa    %7,%%xmm5                       \n"
 | 
|      "sub       %1,%2                           \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
|      "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "movdqu    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| -    "movdqu    " MEMACCESS2(0x20,0) ",%%xmm2   \n"
 | 
| -    "movdqu    " MEMACCESS2(0x30,0) ",%%xmm6   \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPREG(movdqu,0x00,0,4,1,xmm7)           //  movdqu  (%0,%4,1),%%xmm7
 | 
| +    MEMOPREG(movdqu,0x00,0,4,1,xmm7)            //  movdqu (%0,%4,1),%%xmm7
 | 
|      "pavgb     %%xmm7,%%xmm0                   \n"
 | 
| -    MEMOPREG(movdqu,0x10,0,4,1,xmm7)           //  movdqu  0x10(%0,%4,1),%%xmm7
 | 
| +    "movdqu    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| +    MEMOPREG(movdqu,0x10,0,4,1,xmm7)            //  movdqu 0x10(%0,%4,1),%%xmm7
 | 
|      "pavgb     %%xmm7,%%xmm1                   \n"
 | 
| -    MEMOPREG(movdqu,0x20,0,4,1,xmm7)           //  movdqu  0x20(%0,%4,1),%%xmm7
 | 
| +    "movdqu    " MEMACCESS2(0x20,0) ",%%xmm2   \n"
 | 
| +    MEMOPREG(movdqu,0x20,0,4,1,xmm7)            //  movdqu 0x20(%0,%4,1),%%xmm7
 | 
|      "pavgb     %%xmm7,%%xmm2                   \n"
 | 
| -    MEMOPREG(movdqu,0x30,0,4,1,xmm7)           //  movdqu  0x30(%0,%4,1),%%xmm7
 | 
| +    "movdqu    " MEMACCESS2(0x30,0) ",%%xmm6   \n"
 | 
| +    MEMOPREG(movdqu,0x30,0,4,1,xmm7)            //  movdqu 0x30(%0,%4,1),%%xmm7
 | 
|      "pavgb     %%xmm7,%%xmm6                   \n"
 | 
| +
 | 
|      "lea       " MEMLEA(0x40,0) ",%0           \n"
 | 
|      "movdqa    %%xmm0,%%xmm7                   \n"
 | 
|      "shufps    $0x88,%%xmm1,%%xmm0             \n"
 | 
| @@ -1076,179 +993,37 @@ void ARGBToUVRow_Unaligned_SSSE3(const uint8* src_argb0, int src_stride_argb,
 | 
|      "pmaddubsw %%xmm3,%%xmm6                   \n"
 | 
|      "phaddw    %%xmm2,%%xmm0                   \n"
 | 
|      "phaddw    %%xmm6,%%xmm1                   \n"
 | 
| +    "paddw     %%xmm5,%%xmm0                   \n"
 | 
| +    "paddw     %%xmm5,%%xmm1                   \n"
 | 
|      "psraw     $0x8,%%xmm0                     \n"
 | 
|      "psraw     $0x8,%%xmm1                     \n"
 | 
|      "packsswb  %%xmm1,%%xmm0                   \n"
 | 
| -    "paddb     %%xmm5,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%3                        \n"
 | 
|      "movlps    %%xmm0," MEMACCESS(1) "         \n"
 | 
| -    BUNDLEALIGN
 | 
|      MEMOPMEM(movhps,xmm0,0x00,1,2,1)           //  movhps  %%xmm0,(%1,%2,1)
 | 
|      "lea       " MEMLEA(0x8,1) ",%1            \n"
 | 
| +    "sub       $0x10,%3                        \n"
 | 
|      "jg        1b                              \n"
 | 
|    : "+r"(src_argb0),       // %0
 | 
|      "+r"(dst_u),           // %1
 | 
|      "+r"(dst_v),           // %2
 | 
|      "+rm"(width)           // %3
 | 
| -  : "r"((intptr_t)(src_stride_argb)) // %4
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm6", "xmm7"
 | 
| -#endif
 | 
| +  : "r"((intptr_t)(src_stride_argb)), // %4
 | 
| +    "m"(kARGBToVJ),  // %5
 | 
| +    "m"(kARGBToUJ),  // %6
 | 
| +    "m"(kAddUVJ128)  // %7
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm6", "xmm7"
 | 
|    );
 | 
|  }
 | 
| +#endif  // HAS_ARGBTOUVJROW_SSSE3
 | 
|  
 | 
| -void ARGBToUVJRow_Unaligned_SSSE3(const uint8* src_argb0, int src_stride_argb,
 | 
| -                                  uint8* dst_u, uint8* dst_v, int width) {
 | 
| -  asm volatile (
 | 
| -    "movdqa    %0,%%xmm4                       \n"
 | 
| -    "movdqa    %1,%%xmm3                       \n"
 | 
| -    "movdqa    %2,%%xmm5                       \n"
 | 
| -  :
 | 
| -  : "m"(kARGBToUJ),         // %0
 | 
| -    "m"(kARGBToVJ),         // %1
 | 
| -    "m"(kAddUVJ128)         // %2
 | 
| -  );
 | 
| -  asm volatile (
 | 
| -    "sub       %1,%2                           \n"
 | 
| -    LABELALIGN
 | 
| -  "1:                                          \n"
 | 
| -    "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "movdqu    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| -    "movdqu    " MEMACCESS2(0x20,0) ",%%xmm2   \n"
 | 
| -    "movdqu    " MEMACCESS2(0x30,0) ",%%xmm6   \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPREG(movdqu,0x00,0,4,1,xmm7)           //  movdqu  (%0,%4,1),%%xmm7
 | 
| -    "pavgb     %%xmm7,%%xmm0                   \n"
 | 
| -    MEMOPREG(movdqu,0x10,0,4,1,xmm7)           //  movdqu  0x10(%0,%4,1),%%xmm7
 | 
| -    "pavgb     %%xmm7,%%xmm1                   \n"
 | 
| -    MEMOPREG(movdqu,0x20,0,4,1,xmm7)           //  movdqu  0x20(%0,%4,1),%%xmm7
 | 
| -    "pavgb     %%xmm7,%%xmm2                   \n"
 | 
| -    MEMOPREG(movdqu,0x30,0,4,1,xmm7)           //  movdqu  0x30(%0,%4,1),%%xmm7
 | 
| -    "pavgb     %%xmm7,%%xmm6                   \n"
 | 
| -    "lea       " MEMLEA(0x40,0) ",%0           \n"
 | 
| -    "movdqa    %%xmm0,%%xmm7                   \n"
 | 
| -    "shufps    $0x88,%%xmm1,%%xmm0             \n"
 | 
| -    "shufps    $0xdd,%%xmm1,%%xmm7             \n"
 | 
| -    "pavgb     %%xmm7,%%xmm0                   \n"
 | 
| -    "movdqa    %%xmm2,%%xmm7                   \n"
 | 
| -    "shufps    $0x88,%%xmm6,%%xmm2             \n"
 | 
| -    "shufps    $0xdd,%%xmm6,%%xmm7             \n"
 | 
| -    "pavgb     %%xmm7,%%xmm2                   \n"
 | 
| -    "movdqa    %%xmm0,%%xmm1                   \n"
 | 
| -    "movdqa    %%xmm2,%%xmm6                   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm0                   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm2                   \n"
 | 
| -    "pmaddubsw %%xmm3,%%xmm1                   \n"
 | 
| -    "pmaddubsw %%xmm3,%%xmm6                   \n"
 | 
| -    "phaddw    %%xmm2,%%xmm0                   \n"
 | 
| -    "phaddw    %%xmm6,%%xmm1                   \n"
 | 
| -    "paddw     %%xmm5,%%xmm0                   \n"
 | 
| -    "paddw     %%xmm5,%%xmm1                   \n"
 | 
| -    "psraw     $0x8,%%xmm0                     \n"
 | 
| -    "psraw     $0x8,%%xmm1                     \n"
 | 
| -    "packsswb  %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%3                        \n"
 | 
| -    "movlps    %%xmm0," MEMACCESS(1) "         \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPMEM(movhps,xmm0,0x00,1,2,1)           //  movhps  %%xmm0,(%1,%2,1)
 | 
| -    "lea       " MEMLEA(0x8,1) ",%1            \n"
 | 
| -    "jg        1b                              \n"
 | 
| -  : "+r"(src_argb0),       // %0
 | 
| -    "+r"(dst_u),           // %1
 | 
| -    "+r"(dst_v),           // %2
 | 
| -    "+rm"(width)           // %3
 | 
| -  : "r"((intptr_t)(src_stride_argb))
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm6", "xmm7"
 | 
| -#endif
 | 
| -  );
 | 
| -}
 | 
| -
 | 
| -void ARGBToUV444Row_SSSE3(const uint8* src_argb, uint8* dst_u, uint8* dst_v,
 | 
| -                          int width) {
 | 
| -  asm volatile (
 | 
| -    "movdqa    %0,%%xmm4                       \n"
 | 
| -    "movdqa    %1,%%xmm3                       \n"
 | 
| -    "movdqa    %2,%%xmm5                       \n"
 | 
| -  :
 | 
| -  : "m"(kARGBToU),  // %0
 | 
| -    "m"(kARGBToV),  // %1
 | 
| -    "m"(kAddUV128)  // %2
 | 
| -  );
 | 
| -  asm volatile (
 | 
| -    "sub       %1,%2                           \n"
 | 
| -    LABELALIGN
 | 
| -  "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "movdqa    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| -    "movdqa    " MEMACCESS2(0x20,0) ",%%xmm2   \n"
 | 
| -    "movdqa    " MEMACCESS2(0x30,0) ",%%xmm6   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm0                   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm1                   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm2                   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm6                   \n"
 | 
| -    "phaddw    %%xmm1,%%xmm0                   \n"
 | 
| -    "phaddw    %%xmm6,%%xmm2                   \n"
 | 
| -    "psraw     $0x8,%%xmm0                     \n"
 | 
| -    "psraw     $0x8,%%xmm2                     \n"
 | 
| -    "packsswb  %%xmm2,%%xmm0                   \n"
 | 
| -    "paddb     %%xmm5,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%3                        \n"
 | 
| -    "movdqa    %%xmm0," MEMACCESS(1) "         \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "movdqa    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| -    "movdqa    " MEMACCESS2(0x20,0) ",%%xmm2   \n"
 | 
| -    "movdqa    " MEMACCESS2(0x30,0) ",%%xmm6   \n"
 | 
| -    "pmaddubsw %%xmm3,%%xmm0                   \n"
 | 
| -    "pmaddubsw %%xmm3,%%xmm1                   \n"
 | 
| -    "pmaddubsw %%xmm3,%%xmm2                   \n"
 | 
| -    "pmaddubsw %%xmm3,%%xmm6                   \n"
 | 
| -    "phaddw    %%xmm1,%%xmm0                   \n"
 | 
| -    "phaddw    %%xmm6,%%xmm2                   \n"
 | 
| -    "psraw     $0x8,%%xmm0                     \n"
 | 
| -    "psraw     $0x8,%%xmm2                     \n"
 | 
| -    "packsswb  %%xmm2,%%xmm0                   \n"
 | 
| -    "paddb     %%xmm5,%%xmm0                   \n"
 | 
| -    "lea       " MEMLEA(0x40,0) ",%0           \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPMEM(movdqa,xmm0,0x00,1,2,1)           //  movdqa  %%xmm0,(%1,%2,1)
 | 
| -    "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| -    "jg        1b                              \n"
 | 
| -  : "+r"(src_argb),        // %0
 | 
| -    "+r"(dst_u),           // %1
 | 
| -    "+r"(dst_v),           // %2
 | 
| -    "+rm"(width)           // %3
 | 
| -  :
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm6"
 | 
| -#endif
 | 
| -  );
 | 
| -}
 | 
| -
 | 
| -void ARGBToUV444Row_Unaligned_SSSE3(const uint8* src_argb, uint8* dst_u,
 | 
| -                                    uint8* dst_v, int width) {
 | 
| -  asm volatile (
 | 
| -    "movdqa    %0,%%xmm4                       \n"
 | 
| -    "movdqa    %1,%%xmm3                       \n"
 | 
| -    "movdqa    %2,%%xmm5                       \n"
 | 
| -  :
 | 
| -  : "m"(kARGBToU),  // %0
 | 
| -    "m"(kARGBToV),  // %1
 | 
| -    "m"(kAddUV128)  // %2
 | 
| -  );
 | 
| +#ifdef HAS_ARGBTOUV444ROW_SSSE3
 | 
| +void ARGBToUV444Row_SSSE3(const uint8* src_argb, uint8* dst_u, uint8* dst_v,
 | 
| +                          int width) {
 | 
|    asm volatile (
 | 
| +    "movdqa    %4,%%xmm3                       \n"
 | 
| +    "movdqa    %5,%%xmm4                       \n"
 | 
| +    "movdqa    %6,%%xmm5                       \n"
 | 
|      "sub       %1,%2                           \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| @@ -1266,7 +1041,6 @@ void ARGBToUV444Row_Unaligned_SSSE3(const uint8* src_argb, uint8* dst_u,
 | 
|      "psraw     $0x8,%%xmm2                     \n"
 | 
|      "packsswb  %%xmm2,%%xmm0                   \n"
 | 
|      "paddb     %%xmm5,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%3                        \n"
 | 
|      "movdqu    %%xmm0," MEMACCESS(1) "         \n"
 | 
|      "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
|      "movdqu    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| @@ -1283,44 +1057,37 @@ void ARGBToUV444Row_Unaligned_SSSE3(const uint8* src_argb, uint8* dst_u,
 | 
|      "packsswb  %%xmm2,%%xmm0                   \n"
 | 
|      "paddb     %%xmm5,%%xmm0                   \n"
 | 
|      "lea       " MEMLEA(0x40,0) ",%0           \n"
 | 
| -    BUNDLEALIGN
 | 
|      MEMOPMEM(movdqu,xmm0,0x00,1,2,1)           //  movdqu  %%xmm0,(%1,%2,1)
 | 
|      "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| +    "sub       $0x10,%3                        \n"
 | 
|      "jg        1b                              \n"
 | 
|    : "+r"(src_argb),        // %0
 | 
|      "+r"(dst_u),           // %1
 | 
|      "+r"(dst_v),           // %2
 | 
|      "+rm"(width)           // %3
 | 
| -  :
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm6"
 | 
| -#endif
 | 
| +  : "m"(kARGBToV),  // %4
 | 
| +    "m"(kARGBToU),  // %5
 | 
| +    "m"(kAddUV128)  // %6
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm6"
 | 
|    );
 | 
|  }
 | 
| +#endif  // HAS_ARGBTOUV444ROW_SSSE3
 | 
|  
 | 
| +#ifdef HAS_ARGBTOUV422ROW_SSSE3
 | 
|  void ARGBToUV422Row_SSSE3(const uint8* src_argb0,
 | 
|                            uint8* dst_u, uint8* dst_v, int width) {
 | 
|    asm volatile (
 | 
| -    "movdqa    %0,%%xmm4                       \n"
 | 
| -    "movdqa    %1,%%xmm3                       \n"
 | 
| -    "movdqa    %2,%%xmm5                       \n"
 | 
| -  :
 | 
| -  : "m"(kARGBToU),  // %0
 | 
| -    "m"(kARGBToV),  // %1
 | 
| -    "m"(kAddUV128)  // %2
 | 
| -  );
 | 
| -  asm volatile (
 | 
| +    "movdqa    %4,%%xmm3                       \n"
 | 
| +    "movdqa    %5,%%xmm4                       \n"
 | 
| +    "movdqa    %6,%%xmm5                       \n"
 | 
|      "sub       %1,%2                           \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "movdqa    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| -    "movdqa    " MEMACCESS2(0x20,0) ",%%xmm2   \n"
 | 
| -    "movdqa    " MEMACCESS2(0x30,0) ",%%xmm6   \n"
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| +    "movdqu    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| +    "movdqu    " MEMACCESS2(0x20,0) ",%%xmm2   \n"
 | 
| +    "movdqu    " MEMACCESS2(0x30,0) ",%%xmm6   \n"
 | 
|      "lea       " MEMLEA(0x40,0) ",%0           \n"
 | 
|      "movdqa    %%xmm0,%%xmm7                   \n"
 | 
|      "shufps    $0x88,%%xmm1,%%xmm0             \n"
 | 
| @@ -1342,46 +1109,80 @@ void ARGBToUV422Row_SSSE3(const uint8* src_argb0,
 | 
|      "psraw     $0x8,%%xmm1                     \n"
 | 
|      "packsswb  %%xmm1,%%xmm0                   \n"
 | 
|      "paddb     %%xmm5,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%3                        \n"
 | 
|      "movlps    %%xmm0," MEMACCESS(1) "         \n"
 | 
| -    BUNDLEALIGN
 | 
|      MEMOPMEM(movhps,xmm0,0x00,1,2,1)           //  movhps  %%xmm0,(%1,%2,1)
 | 
|      "lea       " MEMLEA(0x8,1) ",%1            \n"
 | 
| +    "sub       $0x10,%3                        \n"
 | 
|      "jg        1b                              \n"
 | 
|    : "+r"(src_argb0),       // %0
 | 
|      "+r"(dst_u),           // %1
 | 
|      "+r"(dst_v),           // %2
 | 
|      "+rm"(width)           // %3
 | 
| -  :
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm6", "xmm7"
 | 
| -#endif
 | 
| +  : "m"(kARGBToV),  // %4
 | 
| +    "m"(kARGBToU),  // %5
 | 
| +    "m"(kAddUV128)  // %6
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm6", "xmm7"
 | 
|    );
 | 
|  }
 | 
| +#endif  // HAS_ARGBTOUV422ROW_SSSE3
 | 
|  
 | 
| -void ARGBToUV422Row_Unaligned_SSSE3(const uint8* src_argb0,
 | 
| -                                    uint8* dst_u, uint8* dst_v, int width) {
 | 
| +void BGRAToYRow_SSSE3(const uint8* src_bgra, uint8* dst_y, int pix) {
 | 
|    asm volatile (
 | 
| -    "movdqa    %0,%%xmm4                       \n"
 | 
| -    "movdqa    %1,%%xmm3                       \n"
 | 
| -    "movdqa    %2,%%xmm5                       \n"
 | 
| -  :
 | 
| -  : "m"(kARGBToU),  // %0
 | 
| -    "m"(kARGBToV),  // %1
 | 
| -    "m"(kAddUV128)  // %2
 | 
| +    "movdqa    %4,%%xmm5                       \n"
 | 
| +    "movdqa    %3,%%xmm4                       \n"
 | 
| +    LABELALIGN
 | 
| +  "1:                                          \n"
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| +    "movdqu    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| +    "movdqu    " MEMACCESS2(0x20,0) ",%%xmm2   \n"
 | 
| +    "movdqu    " MEMACCESS2(0x30,0) ",%%xmm3   \n"
 | 
| +    "pmaddubsw %%xmm4,%%xmm0                   \n"
 | 
| +    "pmaddubsw %%xmm4,%%xmm1                   \n"
 | 
| +    "pmaddubsw %%xmm4,%%xmm2                   \n"
 | 
| +    "pmaddubsw %%xmm4,%%xmm3                   \n"
 | 
| +    "lea       " MEMLEA(0x40,0) ",%0           \n"
 | 
| +    "phaddw    %%xmm1,%%xmm0                   \n"
 | 
| +    "phaddw    %%xmm3,%%xmm2                   \n"
 | 
| +    "psrlw     $0x7,%%xmm0                     \n"
 | 
| +    "psrlw     $0x7,%%xmm2                     \n"
 | 
| +    "packuswb  %%xmm2,%%xmm0                   \n"
 | 
| +    "paddb     %%xmm5,%%xmm0                   \n"
 | 
| +    "movdqu    %%xmm0," MEMACCESS(1) "         \n"
 | 
| +    "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| +    "sub       $0x10,%2                        \n"
 | 
| +    "jg        1b                              \n"
 | 
| +  : "+r"(src_bgra),  // %0
 | 
| +    "+r"(dst_y),     // %1
 | 
| +    "+r"(pix)        // %2
 | 
| +  : "m"(kBGRAToY),   // %3
 | 
| +    "m"(kAddY16)     // %4
 | 
| +  : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
|    );
 | 
| +}
 | 
| +
 | 
| +void BGRAToUVRow_SSSE3(const uint8* src_bgra0, int src_stride_bgra,
 | 
| +                       uint8* dst_u, uint8* dst_v, int width) {
 | 
|    asm volatile (
 | 
| +    "movdqa    %5,%%xmm3                       \n"
 | 
| +    "movdqa    %6,%%xmm4                       \n"
 | 
| +    "movdqa    %7,%%xmm5                       \n"
 | 
|      "sub       %1,%2                           \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
|      "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| +    MEMOPREG(movdqu,0x00,0,4,1,xmm7)            //  movdqu (%0,%4,1),%%xmm7
 | 
| +    "pavgb     %%xmm7,%%xmm0                   \n"
 | 
|      "movdqu    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| +    MEMOPREG(movdqu,0x10,0,4,1,xmm7)            //  movdqu 0x10(%0,%4,1),%%xmm7
 | 
| +    "pavgb     %%xmm7,%%xmm1                   \n"
 | 
|      "movdqu    " MEMACCESS2(0x20,0) ",%%xmm2   \n"
 | 
| +    MEMOPREG(movdqu,0x20,0,4,1,xmm7)            //  movdqu 0x20(%0,%4,1),%%xmm7
 | 
| +    "pavgb     %%xmm7,%%xmm2                   \n"
 | 
|      "movdqu    " MEMACCESS2(0x30,0) ",%%xmm6   \n"
 | 
| +    MEMOPREG(movdqu,0x30,0,4,1,xmm7)            //  movdqu 0x30(%0,%4,1),%%xmm7
 | 
| +    "pavgb     %%xmm7,%%xmm6                   \n"
 | 
| +
 | 
|      "lea       " MEMLEA(0x40,0) ",%0           \n"
 | 
|      "movdqa    %%xmm0,%%xmm7                   \n"
 | 
|      "shufps    $0x88,%%xmm1,%%xmm0             \n"
 | 
| @@ -1403,37 +1204,34 @@ void ARGBToUV422Row_Unaligned_SSSE3(const uint8* src_argb0,
 | 
|      "psraw     $0x8,%%xmm1                     \n"
 | 
|      "packsswb  %%xmm1,%%xmm0                   \n"
 | 
|      "paddb     %%xmm5,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%3                        \n"
 | 
|      "movlps    %%xmm0," MEMACCESS(1) "         \n"
 | 
| -    BUNDLEALIGN
 | 
|      MEMOPMEM(movhps,xmm0,0x00,1,2,1)           //  movhps  %%xmm0,(%1,%2,1)
 | 
|      "lea       " MEMLEA(0x8,1) ",%1            \n"
 | 
| +    "sub       $0x10,%3                        \n"
 | 
|      "jg        1b                              \n"
 | 
| -  : "+r"(src_argb0),       // %0
 | 
| +  : "+r"(src_bgra0),       // %0
 | 
|      "+r"(dst_u),           // %1
 | 
|      "+r"(dst_v),           // %2
 | 
|      "+rm"(width)           // %3
 | 
| -  :
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm6", "xmm7"
 | 
| -#endif
 | 
| +  : "r"((intptr_t)(src_stride_bgra)), // %4
 | 
| +    "m"(kBGRAToV),  // %5
 | 
| +    "m"(kBGRAToU),  // %6
 | 
| +    "m"(kAddUV128)  // %7
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm6", "xmm7"
 | 
|    );
 | 
|  }
 | 
|  
 | 
| -void BGRAToYRow_SSSE3(const uint8* src_bgra, uint8* dst_y, int pix) {
 | 
| +void ABGRToYRow_SSSE3(const uint8* src_abgr, uint8* dst_y, int pix) {
 | 
|    asm volatile (
 | 
|      "movdqa    %4,%%xmm5                       \n"
 | 
|      "movdqa    %3,%%xmm4                       \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "movdqa    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| -    "movdqa    " MEMACCESS2(0x20,0) ",%%xmm2   \n"
 | 
| -    "movdqa    " MEMACCESS2(0x30,0) ",%%xmm3   \n"
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| +    "movdqu    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| +    "movdqu    " MEMACCESS2(0x20,0) ",%%xmm2   \n"
 | 
| +    "movdqu    " MEMACCESS2(0x30,0) ",%%xmm3   \n"
 | 
|      "pmaddubsw %%xmm4,%%xmm0                   \n"
 | 
|      "pmaddubsw %%xmm4,%%xmm1                   \n"
 | 
|      "pmaddubsw %%xmm4,%%xmm2                   \n"
 | 
| @@ -1445,23 +1243,20 @@ void BGRAToYRow_SSSE3(const uint8* src_bgra, uint8* dst_y, int pix) {
 | 
|      "psrlw     $0x7,%%xmm2                     \n"
 | 
|      "packuswb  %%xmm2,%%xmm0                   \n"
 | 
|      "paddb     %%xmm5,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%2                        \n"
 | 
| -    "movdqa    %%xmm0," MEMACCESS(1) "         \n"
 | 
| +    "movdqu    %%xmm0," MEMACCESS(1) "         \n"
 | 
|      "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| +    "sub       $0x10,%2                        \n"
 | 
|      "jg        1b                              \n"
 | 
| -  : "+r"(src_bgra),  // %0
 | 
| +  : "+r"(src_abgr),  // %0
 | 
|      "+r"(dst_y),     // %1
 | 
|      "+r"(pix)        // %2
 | 
| -  : "m"(kBGRAToY),   // %3
 | 
| +  : "m"(kABGRToY),   // %3
 | 
|      "m"(kAddY16)     // %4
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
| -#endif
 | 
| +  : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
|    );
 | 
|  }
 | 
|  
 | 
| -void BGRAToYRow_Unaligned_SSSE3(const uint8* src_bgra, uint8* dst_y, int pix) {
 | 
| +void RGBAToYRow_SSSE3(const uint8* src_rgba, uint8* dst_y, int pix) {
 | 
|    asm volatile (
 | 
|      "movdqa    %4,%%xmm5                       \n"
 | 
|      "movdqa    %3,%%xmm4                       \n"
 | 
| @@ -1482,46 +1277,41 @@ void BGRAToYRow_Unaligned_SSSE3(const uint8* src_bgra, uint8* dst_y, int pix) {
 | 
|      "psrlw     $0x7,%%xmm2                     \n"
 | 
|      "packuswb  %%xmm2,%%xmm0                   \n"
 | 
|      "paddb     %%xmm5,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%2                        \n"
 | 
|      "movdqu    %%xmm0," MEMACCESS(1) "         \n"
 | 
|      "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| +    "sub       $0x10,%2                        \n"
 | 
|      "jg        1b                              \n"
 | 
| -  : "+r"(src_bgra),  // %0
 | 
| +  : "+r"(src_rgba),  // %0
 | 
|      "+r"(dst_y),     // %1
 | 
|      "+r"(pix)        // %2
 | 
| -  : "m"(kBGRAToY),   // %3
 | 
| +  : "m"(kRGBAToY),   // %3
 | 
|      "m"(kAddY16)     // %4
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
| -#endif
 | 
| +  : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
|    );
 | 
|  }
 | 
|  
 | 
| -void BGRAToUVRow_SSSE3(const uint8* src_bgra0, int src_stride_bgra,
 | 
| +void ABGRToUVRow_SSSE3(const uint8* src_abgr0, int src_stride_abgr,
 | 
|                         uint8* dst_u, uint8* dst_v, int width) {
 | 
|    asm volatile (
 | 
| -    "movdqa    %0,%%xmm4                       \n"
 | 
| -    "movdqa    %1,%%xmm3                       \n"
 | 
| -    "movdqa    %2,%%xmm5                       \n"
 | 
| -  :
 | 
| -  : "m"(kBGRAToU),         // %0
 | 
| -    "m"(kBGRAToV),         // %1
 | 
| -    "m"(kAddUV128)         // %2
 | 
| -  );
 | 
| -  asm volatile (
 | 
| +    "movdqa    %5,%%xmm3                       \n"
 | 
| +    "movdqa    %6,%%xmm4                       \n"
 | 
| +    "movdqa    %7,%%xmm5                       \n"
 | 
|      "sub       %1,%2                           \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "movdqa    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| -    "movdqa    " MEMACCESS2(0x20,0) ",%%xmm2   \n"
 | 
| -    "movdqa    " MEMACCESS2(0x30,0) ",%%xmm6   \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPREG(pavgb,0x00,0,4,1,xmm0)            //  pavgb   (%0,%4,1),%%xmm0
 | 
| -    MEMOPREG(pavgb,0x10,0,4,1,xmm1)            //  pavgb   0x10(%0,%4,1),%%xmm1
 | 
| -    MEMOPREG(pavgb,0x20,0,4,1,xmm2)            //  pavgb   0x20(%0,%4,1),%%xmm2
 | 
| -    MEMOPREG(pavgb,0x30,0,4,1,xmm6)            //  pavgb   0x30(%0,%4,1),%%xmm6
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| +    MEMOPREG(movdqu,0x00,0,4,1,xmm7)            //  movdqu (%0,%4,1),%%xmm7
 | 
| +    "pavgb     %%xmm7,%%xmm0                   \n"
 | 
| +    "movdqu    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| +    MEMOPREG(movdqu,0x10,0,4,1,xmm7)            //  movdqu 0x10(%0,%4,1),%%xmm7
 | 
| +    "pavgb     %%xmm7,%%xmm1                   \n"
 | 
| +    "movdqu    " MEMACCESS2(0x20,0) ",%%xmm2   \n"
 | 
| +    MEMOPREG(movdqu,0x20,0,4,1,xmm7)            //  movdqu 0x20(%0,%4,1),%%xmm7
 | 
| +    "pavgb     %%xmm7,%%xmm2                   \n"
 | 
| +    "movdqu    " MEMACCESS2(0x30,0) ",%%xmm6   \n"
 | 
| +    MEMOPREG(movdqu,0x30,0,4,1,xmm7)            //  movdqu 0x30(%0,%4,1),%%xmm7
 | 
| +    "pavgb     %%xmm7,%%xmm6                   \n"
 | 
| +
 | 
|      "lea       " MEMLEA(0x40,0) ",%0           \n"
 | 
|      "movdqa    %%xmm0,%%xmm7                   \n"
 | 
|      "shufps    $0x88,%%xmm1,%%xmm0             \n"
 | 
| @@ -1543,55 +1333,46 @@ void BGRAToUVRow_SSSE3(const uint8* src_bgra0, int src_stride_bgra,
 | 
|      "psraw     $0x8,%%xmm1                     \n"
 | 
|      "packsswb  %%xmm1,%%xmm0                   \n"
 | 
|      "paddb     %%xmm5,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%3                        \n"
 | 
|      "movlps    %%xmm0," MEMACCESS(1) "         \n"
 | 
| -    BUNDLEALIGN
 | 
|      MEMOPMEM(movhps,xmm0,0x00,1,2,1)           //  movhps  %%xmm0,(%1,%2,1)
 | 
|      "lea       " MEMLEA(0x8,1) ",%1            \n"
 | 
| +    "sub       $0x10,%3                        \n"
 | 
|      "jg        1b                              \n"
 | 
| -  : "+r"(src_bgra0),       // %0
 | 
| +  : "+r"(src_abgr0),       // %0
 | 
|      "+r"(dst_u),           // %1
 | 
|      "+r"(dst_v),           // %2
 | 
|      "+rm"(width)           // %3
 | 
| -  : "r"((intptr_t)(src_stride_bgra)) // %4
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm6", "xmm7"
 | 
| -#endif
 | 
| +  : "r"((intptr_t)(src_stride_abgr)), // %4
 | 
| +    "m"(kABGRToV),  // %5
 | 
| +    "m"(kABGRToU),  // %6
 | 
| +    "m"(kAddUV128)  // %7
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm6", "xmm7"
 | 
|    );
 | 
|  }
 | 
|  
 | 
| -void BGRAToUVRow_Unaligned_SSSE3(const uint8* src_bgra0, int src_stride_bgra,
 | 
| -                                 uint8* dst_u, uint8* dst_v, int width) {
 | 
| -  asm volatile (
 | 
| -    "movdqa    %0,%%xmm4                       \n"
 | 
| -    "movdqa    %1,%%xmm3                       \n"
 | 
| -    "movdqa    %2,%%xmm5                       \n"
 | 
| -  :
 | 
| -  : "m"(kBGRAToU),         // %0
 | 
| -    "m"(kBGRAToV),         // %1
 | 
| -    "m"(kAddUV128)         // %2
 | 
| -  );
 | 
| +void RGBAToUVRow_SSSE3(const uint8* src_rgba0, int src_stride_rgba,
 | 
| +                       uint8* dst_u, uint8* dst_v, int width) {
 | 
|    asm volatile (
 | 
| +    "movdqa    %5,%%xmm3                       \n"
 | 
| +    "movdqa    %6,%%xmm4                       \n"
 | 
| +    "movdqa    %7,%%xmm5                       \n"
 | 
|      "sub       %1,%2                           \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
|      "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "movdqu    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| -    "movdqu    " MEMACCESS2(0x20,0) ",%%xmm2   \n"
 | 
| -    "movdqu    " MEMACCESS2(0x30,0) ",%%xmm6   \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPREG(movdqu,0x00,0,4,1,xmm7)           //  movdqu  (%0,%4,1),%%xmm7
 | 
| +    MEMOPREG(movdqu,0x00,0,4,1,xmm7)            //  movdqu (%0,%4,1),%%xmm7
 | 
|      "pavgb     %%xmm7,%%xmm0                   \n"
 | 
| -    MEMOPREG(movdqu,0x10,0,4,1,xmm7)           //  movdqu  0x10(%0,%4,1),%%xmm7
 | 
| +    "movdqu    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| +    MEMOPREG(movdqu,0x10,0,4,1,xmm7)            //  movdqu 0x10(%0,%4,1),%%xmm7
 | 
|      "pavgb     %%xmm7,%%xmm1                   \n"
 | 
| -    MEMOPREG(movdqu,0x20,0,4,1,xmm7)           //  movdqu  0x20(%0,%4,1),%%xmm7
 | 
| +    "movdqu    " MEMACCESS2(0x20,0) ",%%xmm2   \n"
 | 
| +    MEMOPREG(movdqu,0x20,0,4,1,xmm7)            //  movdqu 0x20(%0,%4,1),%%xmm7
 | 
|      "pavgb     %%xmm7,%%xmm2                   \n"
 | 
| -    MEMOPREG(movdqu,0x30,0,4,1,xmm7)           //  movdqu  0x30(%0,%4,1),%%xmm7
 | 
| +    "movdqu    " MEMACCESS2(0x30,0) ",%%xmm6   \n"
 | 
| +    MEMOPREG(movdqu,0x30,0,4,1,xmm7)            //  movdqu 0x30(%0,%4,1),%%xmm7
 | 
|      "pavgb     %%xmm7,%%xmm6                   \n"
 | 
| +
 | 
|      "lea       " MEMLEA(0x40,0) ",%0           \n"
 | 
|      "movdqa    %%xmm0,%%xmm7                   \n"
 | 
|      "shufps    $0x88,%%xmm1,%%xmm0             \n"
 | 
| @@ -1613,495 +1394,83 @@ void BGRAToUVRow_Unaligned_SSSE3(const uint8* src_bgra0, int src_stride_bgra,
 | 
|      "psraw     $0x8,%%xmm1                     \n"
 | 
|      "packsswb  %%xmm1,%%xmm0                   \n"
 | 
|      "paddb     %%xmm5,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%3                        \n"
 | 
|      "movlps    %%xmm0," MEMACCESS(1) "         \n"
 | 
| -    BUNDLEALIGN
 | 
|      MEMOPMEM(movhps,xmm0,0x00,1,2,1)           //  movhps  %%xmm0,(%1,%2,1)
 | 
|      "lea       " MEMLEA(0x8,1) ",%1            \n"
 | 
| +    "sub       $0x10,%3                        \n"
 | 
|      "jg        1b                              \n"
 | 
| -  : "+r"(src_bgra0),       // %0
 | 
| +  : "+r"(src_rgba0),       // %0
 | 
|      "+r"(dst_u),           // %1
 | 
|      "+r"(dst_v),           // %2
 | 
|      "+rm"(width)           // %3
 | 
| -  : "r"((intptr_t)(src_stride_bgra)) // %4
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm6", "xmm7"
 | 
| -#endif
 | 
| +  : "r"((intptr_t)(src_stride_rgba)), // %4
 | 
| +    "m"(kRGBAToV),  // %5
 | 
| +    "m"(kRGBAToU),  // %6
 | 
| +    "m"(kAddUV128)  // %7
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm6", "xmm7"
 | 
|    );
 | 
|  }
 | 
|  
 | 
| -void ABGRToYRow_SSSE3(const uint8* src_abgr, uint8* dst_y, int pix) {
 | 
| -  asm volatile (
 | 
| -    "movdqa    %4,%%xmm5                       \n"
 | 
| -    "movdqa    %3,%%xmm4                       \n"
 | 
| -    LABELALIGN
 | 
| -  "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "movdqa    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| -    "movdqa    " MEMACCESS2(0x20,0) ",%%xmm2   \n"
 | 
| -    "movdqa    " MEMACCESS2(0x30,0) ",%%xmm3   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm0                   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm1                   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm2                   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm3                   \n"
 | 
| -    "lea       " MEMLEA(0x40,0) ",%0           \n"
 | 
| -    "phaddw    %%xmm1,%%xmm0                   \n"
 | 
| -    "phaddw    %%xmm3,%%xmm2                   \n"
 | 
| -    "psrlw     $0x7,%%xmm0                     \n"
 | 
| -    "psrlw     $0x7,%%xmm2                     \n"
 | 
| -    "packuswb  %%xmm2,%%xmm0                   \n"
 | 
| -    "paddb     %%xmm5,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%2                        \n"
 | 
| -    "movdqa    %%xmm0," MEMACCESS(1) "         \n"
 | 
| -    "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| -    "jg        1b                              \n"
 | 
| -  : "+r"(src_abgr),  // %0
 | 
| -    "+r"(dst_y),     // %1
 | 
| -    "+r"(pix)        // %2
 | 
| -  : "m"(kABGRToY),   // %3
 | 
| -    "m"(kAddY16)     // %4
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
| -#endif
 | 
| -  );
 | 
| -}
 | 
| -
 | 
| -void ABGRToYRow_Unaligned_SSSE3(const uint8* src_abgr, uint8* dst_y, int pix) {
 | 
| -  asm volatile (
 | 
| -    "movdqa    %4,%%xmm5                       \n"
 | 
| -    "movdqa    %3,%%xmm4                       \n"
 | 
| -    LABELALIGN
 | 
| -  "1:                                          \n"
 | 
| -    "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "movdqu    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| -    "movdqu    " MEMACCESS2(0x20,0) ",%%xmm2   \n"
 | 
| -    "movdqu    " MEMACCESS2(0x30,0) ",%%xmm3   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm0                   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm1                   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm2                   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm3                   \n"
 | 
| -    "lea       " MEMLEA(0x40,0) ",%0           \n"
 | 
| -    "phaddw    %%xmm1,%%xmm0                   \n"
 | 
| -    "phaddw    %%xmm3,%%xmm2                   \n"
 | 
| -    "psrlw     $0x7,%%xmm0                     \n"
 | 
| -    "psrlw     $0x7,%%xmm2                     \n"
 | 
| -    "packuswb  %%xmm2,%%xmm0                   \n"
 | 
| -    "paddb     %%xmm5,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%2                        \n"
 | 
| -    "movdqu    %%xmm0," MEMACCESS(1) "         \n"
 | 
| -    "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| -    "jg        1b                              \n"
 | 
| -  : "+r"(src_abgr),  // %0
 | 
| -    "+r"(dst_y),     // %1
 | 
| -    "+r"(pix)        // %2
 | 
| -  : "m"(kABGRToY),   // %3
 | 
| -    "m"(kAddY16)     // %4
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
| -#endif
 | 
| -  );
 | 
| -}
 | 
| -
 | 
| -void RGBAToYRow_SSSE3(const uint8* src_rgba, uint8* dst_y, int pix) {
 | 
| -  asm volatile (
 | 
| -    "movdqa    %4,%%xmm5                       \n"
 | 
| -    "movdqa    %3,%%xmm4                       \n"
 | 
| -    LABELALIGN
 | 
| -  "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "movdqa    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| -    "movdqa    " MEMACCESS2(0x20,0) ",%%xmm2   \n"
 | 
| -    "movdqa    " MEMACCESS2(0x30,0) ",%%xmm3   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm0                   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm1                   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm2                   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm3                   \n"
 | 
| -    "lea       " MEMLEA(0x40,0) ",%0           \n"
 | 
| -    "phaddw    %%xmm1,%%xmm0                   \n"
 | 
| -    "phaddw    %%xmm3,%%xmm2                   \n"
 | 
| -    "psrlw     $0x7,%%xmm0                     \n"
 | 
| -    "psrlw     $0x7,%%xmm2                     \n"
 | 
| -    "packuswb  %%xmm2,%%xmm0                   \n"
 | 
| -    "paddb     %%xmm5,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%2                        \n"
 | 
| -    "movdqa    %%xmm0," MEMACCESS(1) "         \n"
 | 
| -    "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| -    "jg        1b                              \n"
 | 
| -  : "+r"(src_rgba),  // %0
 | 
| -    "+r"(dst_y),     // %1
 | 
| -    "+r"(pix)        // %2
 | 
| -  : "m"(kRGBAToY),   // %3
 | 
| -    "m"(kAddY16)     // %4
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
| -#endif
 | 
| -  );
 | 
| -}
 | 
| -
 | 
| -void RGBAToYRow_Unaligned_SSSE3(const uint8* src_rgba, uint8* dst_y, int pix) {
 | 
| -  asm volatile (
 | 
| -    "movdqa    %4,%%xmm5                       \n"
 | 
| -    "movdqa    %3,%%xmm4                       \n"
 | 
| -    LABELALIGN
 | 
| -  "1:                                          \n"
 | 
| -    "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "movdqu    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| -    "movdqu    " MEMACCESS2(0x20,0) ",%%xmm2   \n"
 | 
| -    "movdqu    " MEMACCESS2(0x30,0) ",%%xmm3   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm0                   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm1                   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm2                   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm3                   \n"
 | 
| -    "lea       " MEMLEA(0x40,0) ",%0           \n"
 | 
| -    "phaddw    %%xmm1,%%xmm0                   \n"
 | 
| -    "phaddw    %%xmm3,%%xmm2                   \n"
 | 
| -    "psrlw     $0x7,%%xmm0                     \n"
 | 
| -    "psrlw     $0x7,%%xmm2                     \n"
 | 
| -    "packuswb  %%xmm2,%%xmm0                   \n"
 | 
| -    "paddb     %%xmm5,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%2                        \n"
 | 
| -    "movdqu    %%xmm0," MEMACCESS(1) "         \n"
 | 
| -    "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| -    "jg        1b                              \n"
 | 
| -  : "+r"(src_rgba),  // %0
 | 
| -    "+r"(dst_y),     // %1
 | 
| -    "+r"(pix)        // %2
 | 
| -  : "m"(kRGBAToY),   // %3
 | 
| -    "m"(kAddY16)     // %4
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
| -#endif
 | 
| -  );
 | 
| -}
 | 
| -
 | 
| -void ABGRToUVRow_SSSE3(const uint8* src_abgr0, int src_stride_abgr,
 | 
| -                       uint8* dst_u, uint8* dst_v, int width) {
 | 
| -  asm volatile (
 | 
| -    "movdqa    %0,%%xmm4                       \n"
 | 
| -    "movdqa    %1,%%xmm3                       \n"
 | 
| -    "movdqa    %2,%%xmm5                       \n"
 | 
| -  :
 | 
| -  : "m"(kABGRToU),         // %0
 | 
| -    "m"(kABGRToV),         // %1
 | 
| -    "m"(kAddUV128)         // %2
 | 
| -  );
 | 
| -  asm volatile (
 | 
| -    "sub       %1,%2                           \n"
 | 
| -    LABELALIGN
 | 
| -  "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "movdqa    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| -    "movdqa    " MEMACCESS2(0x20,0) ",%%xmm2   \n"
 | 
| -    "movdqa    " MEMACCESS2(0x30,0) ",%%xmm6   \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPREG(pavgb,0x00,0,4,1,xmm0)            //  pavgb   (%0,%4,1),%%xmm0
 | 
| -    MEMOPREG(pavgb,0x10,0,4,1,xmm1)            //  pavgb   0x10(%0,%4,1),%%xmm1
 | 
| -    MEMOPREG(pavgb,0x20,0,4,1,xmm2)            //  pavgb   0x20(%0,%4,1),%%xmm2
 | 
| -    MEMOPREG(pavgb,0x30,0,4,1,xmm6)            //  pavgb   0x30(%0,%4,1),%%xmm6
 | 
| -    "lea       " MEMLEA(0x40,0) ",%0           \n"
 | 
| -    "movdqa    %%xmm0,%%xmm7                   \n"
 | 
| -    "shufps    $0x88,%%xmm1,%%xmm0             \n"
 | 
| -    "shufps    $0xdd,%%xmm1,%%xmm7             \n"
 | 
| -    "pavgb     %%xmm7,%%xmm0                   \n"
 | 
| -    "movdqa    %%xmm2,%%xmm7                   \n"
 | 
| -    "shufps    $0x88,%%xmm6,%%xmm2             \n"
 | 
| -    "shufps    $0xdd,%%xmm6,%%xmm7             \n"
 | 
| -    "pavgb     %%xmm7,%%xmm2                   \n"
 | 
| -    "movdqa    %%xmm0,%%xmm1                   \n"
 | 
| -    "movdqa    %%xmm2,%%xmm6                   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm0                   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm2                   \n"
 | 
| -    "pmaddubsw %%xmm3,%%xmm1                   \n"
 | 
| -    "pmaddubsw %%xmm3,%%xmm6                   \n"
 | 
| -    "phaddw    %%xmm2,%%xmm0                   \n"
 | 
| -    "phaddw    %%xmm6,%%xmm1                   \n"
 | 
| -    "psraw     $0x8,%%xmm0                     \n"
 | 
| -    "psraw     $0x8,%%xmm1                     \n"
 | 
| -    "packsswb  %%xmm1,%%xmm0                   \n"
 | 
| -    "paddb     %%xmm5,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%3                        \n"
 | 
| -    "movlps    %%xmm0," MEMACCESS(1) "         \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPMEM(movhps,xmm0,0x00,1,2,1)           //  movhps  %%xmm0,(%1,%2,1)
 | 
| -    "lea       " MEMLEA(0x8,1) ",%1            \n"
 | 
| -    "jg        1b                              \n"
 | 
| -  : "+r"(src_abgr0),       // %0
 | 
| -    "+r"(dst_u),           // %1
 | 
| -    "+r"(dst_v),           // %2
 | 
| -    "+rm"(width)           // %3
 | 
| -  : "r"((intptr_t)(src_stride_abgr)) // %4
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm6", "xmm7"
 | 
| -#endif
 | 
| -  );
 | 
| -}
 | 
| -
 | 
| -void ABGRToUVRow_Unaligned_SSSE3(const uint8* src_abgr0, int src_stride_abgr,
 | 
| -                                 uint8* dst_u, uint8* dst_v, int width) {
 | 
| -  asm volatile (
 | 
| -    "movdqa    %0,%%xmm4                       \n"
 | 
| -    "movdqa    %1,%%xmm3                       \n"
 | 
| -    "movdqa    %2,%%xmm5                       \n"
 | 
| -  :
 | 
| -  : "m"(kABGRToU),         // %0
 | 
| -    "m"(kABGRToV),         // %1
 | 
| -    "m"(kAddUV128)         // %2
 | 
| -  );
 | 
| -  asm volatile (
 | 
| -    "sub       %1,%2                           \n"
 | 
| -    LABELALIGN
 | 
| -  "1:                                          \n"
 | 
| -    "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "movdqu    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| -    "movdqu    " MEMACCESS2(0x20,0) ",%%xmm2   \n"
 | 
| -    "movdqu    " MEMACCESS2(0x30,0) ",%%xmm6   \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPREG(movdqu,0x00,0,4,1,xmm7)           //  movdqu  (%0,%4,1),%%xmm7
 | 
| -    "pavgb     %%xmm7,%%xmm0                   \n"
 | 
| -    MEMOPREG(movdqu,0x10,0,4,1,xmm7)           //  movdqu  0x10(%0,%4,1),%%xmm7
 | 
| -    "pavgb     %%xmm7,%%xmm1                   \n"
 | 
| -    MEMOPREG(movdqu,0x20,0,4,1,xmm7)           //  movdqu  0x20(%0,%4,1),%%xmm7
 | 
| -    "pavgb     %%xmm7,%%xmm2                   \n"
 | 
| -    MEMOPREG(movdqu,0x30,0,4,1,xmm7)           //  movdqu  0x30(%0,%4,1),%%xmm7
 | 
| -    "pavgb     %%xmm7,%%xmm6                   \n"
 | 
| -    "lea       " MEMLEA(0x40,0) ",%0           \n"
 | 
| -    "movdqa    %%xmm0,%%xmm7                   \n"
 | 
| -    "shufps    $0x88,%%xmm1,%%xmm0             \n"
 | 
| -    "shufps    $0xdd,%%xmm1,%%xmm7             \n"
 | 
| -    "pavgb     %%xmm7,%%xmm0                   \n"
 | 
| -    "movdqa    %%xmm2,%%xmm7                   \n"
 | 
| -    "shufps    $0x88,%%xmm6,%%xmm2             \n"
 | 
| -    "shufps    $0xdd,%%xmm6,%%xmm7             \n"
 | 
| -    "pavgb     %%xmm7,%%xmm2                   \n"
 | 
| -    "movdqa    %%xmm0,%%xmm1                   \n"
 | 
| -    "movdqa    %%xmm2,%%xmm6                   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm0                   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm2                   \n"
 | 
| -    "pmaddubsw %%xmm3,%%xmm1                   \n"
 | 
| -    "pmaddubsw %%xmm3,%%xmm6                   \n"
 | 
| -    "phaddw    %%xmm2,%%xmm0                   \n"
 | 
| -    "phaddw    %%xmm6,%%xmm1                   \n"
 | 
| -    "psraw     $0x8,%%xmm0                     \n"
 | 
| -    "psraw     $0x8,%%xmm1                     \n"
 | 
| -    "packsswb  %%xmm1,%%xmm0                   \n"
 | 
| -    "paddb     %%xmm5,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%3                        \n"
 | 
| -    "movlps    %%xmm0," MEMACCESS(1) "         \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPMEM(movhps,xmm0,0x00,1,2,1)           //  movhps  %%xmm0,(%1,%2,1)
 | 
| -    "lea       " MEMLEA(0x8,1) ",%1            \n"
 | 
| -    "jg        1b                              \n"
 | 
| -  : "+r"(src_abgr0),       // %0
 | 
| -    "+r"(dst_u),           // %1
 | 
| -    "+r"(dst_v),           // %2
 | 
| -    "+rm"(width)           // %3
 | 
| -  : "r"((intptr_t)(src_stride_abgr)) // %4
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm6", "xmm7"
 | 
| -#endif
 | 
| -  );
 | 
| -}
 | 
| -
 | 
| -void RGBAToUVRow_SSSE3(const uint8* src_rgba0, int src_stride_rgba,
 | 
| -                       uint8* dst_u, uint8* dst_v, int width) {
 | 
| -  asm volatile (
 | 
| -    "movdqa    %0,%%xmm4                       \n"
 | 
| -    "movdqa    %1,%%xmm3                       \n"
 | 
| -    "movdqa    %2,%%xmm5                       \n"
 | 
| -  :
 | 
| -  : "m"(kRGBAToU),         // %0
 | 
| -    "m"(kRGBAToV),         // %1
 | 
| -    "m"(kAddUV128)         // %2
 | 
| -  );
 | 
| -  asm volatile (
 | 
| -    "sub       %1,%2                           \n"
 | 
| -    LABELALIGN
 | 
| -  "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "movdqa    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| -    "movdqa    " MEMACCESS2(0x20,0) ",%%xmm2   \n"
 | 
| -    "movdqa    " MEMACCESS2(0x30,0) ",%%xmm6   \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPREG(pavgb,0x00,0,4,1,xmm0)            //  pavgb   (%0,%4,1),%%xmm0
 | 
| -    MEMOPREG(pavgb,0x10,0,4,1,xmm1)            //  pavgb   0x10(%0,%4,1),%%xmm1
 | 
| -    MEMOPREG(pavgb,0x20,0,4,1,xmm2)            //  pavgb   0x20(%0,%4,1),%%xmm2
 | 
| -    MEMOPREG(pavgb,0x30,0,4,1,xmm6)            //  pavgb   0x30(%0,%4,1),%%xmm6
 | 
| -    "lea       " MEMLEA(0x40,0) ",%0           \n"
 | 
| -    "movdqa    %%xmm0,%%xmm7                   \n"
 | 
| -    "shufps    $0x88,%%xmm1,%%xmm0             \n"
 | 
| -    "shufps    $0xdd,%%xmm1,%%xmm7             \n"
 | 
| -    "pavgb     %%xmm7,%%xmm0                   \n"
 | 
| -    "movdqa    %%xmm2,%%xmm7                   \n"
 | 
| -    "shufps    $0x88,%%xmm6,%%xmm2             \n"
 | 
| -    "shufps    $0xdd,%%xmm6,%%xmm7             \n"
 | 
| -    "pavgb     %%xmm7,%%xmm2                   \n"
 | 
| -    "movdqa    %%xmm0,%%xmm1                   \n"
 | 
| -    "movdqa    %%xmm2,%%xmm6                   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm0                   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm2                   \n"
 | 
| -    "pmaddubsw %%xmm3,%%xmm1                   \n"
 | 
| -    "pmaddubsw %%xmm3,%%xmm6                   \n"
 | 
| -    "phaddw    %%xmm2,%%xmm0                   \n"
 | 
| -    "phaddw    %%xmm6,%%xmm1                   \n"
 | 
| -    "psraw     $0x8,%%xmm0                     \n"
 | 
| -    "psraw     $0x8,%%xmm1                     \n"
 | 
| -    "packsswb  %%xmm1,%%xmm0                   \n"
 | 
| -    "paddb     %%xmm5,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%3                        \n"
 | 
| -    "movlps    %%xmm0," MEMACCESS(1) "         \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPMEM(movhps,xmm0,0x00,1,2,1)           //  movhps  %%xmm0,(%1,%2,1)
 | 
| -    "lea       " MEMLEA(0x8,1) ",%1            \n"
 | 
| -    "jg        1b                              \n"
 | 
| -  : "+r"(src_rgba0),       // %0
 | 
| -    "+r"(dst_u),           // %1
 | 
| -    "+r"(dst_v),           // %2
 | 
| -    "+rm"(width)           // %3
 | 
| -  : "r"((intptr_t)(src_stride_rgba))
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm6", "xmm7"
 | 
| -#endif
 | 
| -  );
 | 
| -}
 | 
| -
 | 
| -void RGBAToUVRow_Unaligned_SSSE3(const uint8* src_rgba0, int src_stride_rgba,
 | 
| -                                 uint8* dst_u, uint8* dst_v, int width) {
 | 
| -  asm volatile (
 | 
| -    "movdqa    %0,%%xmm4                       \n"
 | 
| -    "movdqa    %1,%%xmm3                       \n"
 | 
| -    "movdqa    %2,%%xmm5                       \n"
 | 
| -  :
 | 
| -  : "m"(kRGBAToU),         // %0
 | 
| -    "m"(kRGBAToV),         // %1
 | 
| -    "m"(kAddUV128)         // %2
 | 
| -  );
 | 
| -  asm volatile (
 | 
| -    "sub       %1,%2                           \n"
 | 
| -    LABELALIGN
 | 
| -  "1:                                          \n"
 | 
| -    "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "movdqu    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| -    "movdqu    " MEMACCESS2(0x20,0) ",%%xmm2   \n"
 | 
| -    "movdqu    " MEMACCESS2(0x30,0) ",%%xmm6   \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPREG(movdqu,0x00,0,4,1,xmm7)           //  movdqu  (%0,%4,1),%%xmm7
 | 
| -    "pavgb     %%xmm7,%%xmm0                   \n"
 | 
| -    MEMOPREG(movdqu,0x10,0,4,1,xmm7)           //  movdqu  0x10(%0,%4,1),%%xmm7
 | 
| -    "pavgb     %%xmm7,%%xmm1                   \n"
 | 
| -    MEMOPREG(movdqu,0x20,0,4,1,xmm7)           //  movdqu  0x20(%0,%4,1),%%xmm7
 | 
| -    "pavgb     %%xmm7,%%xmm2                   \n"
 | 
| -    MEMOPREG(movdqu,0x30,0,4,1,xmm7)           //  movdqu  0x30(%0,%4,1),%%xmm7
 | 
| -    "pavgb     %%xmm7,%%xmm6                   \n"
 | 
| -    "lea       " MEMLEA(0x40,0) ",%0           \n"
 | 
| -    "movdqa    %%xmm0,%%xmm7                   \n"
 | 
| -    "shufps    $0x88,%%xmm1,%%xmm0             \n"
 | 
| -    "shufps    $0xdd,%%xmm1,%%xmm7             \n"
 | 
| -    "pavgb     %%xmm7,%%xmm0                   \n"
 | 
| -    "movdqa    %%xmm2,%%xmm7                   \n"
 | 
| -    "shufps    $0x88,%%xmm6,%%xmm2             \n"
 | 
| -    "shufps    $0xdd,%%xmm6,%%xmm7             \n"
 | 
| -    "pavgb     %%xmm7,%%xmm2                   \n"
 | 
| -    "movdqa    %%xmm0,%%xmm1                   \n"
 | 
| -    "movdqa    %%xmm2,%%xmm6                   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm0                   \n"
 | 
| -    "pmaddubsw %%xmm4,%%xmm2                   \n"
 | 
| -    "pmaddubsw %%xmm3,%%xmm1                   \n"
 | 
| -    "pmaddubsw %%xmm3,%%xmm6                   \n"
 | 
| -    "phaddw    %%xmm2,%%xmm0                   \n"
 | 
| -    "phaddw    %%xmm6,%%xmm1                   \n"
 | 
| -    "psraw     $0x8,%%xmm0                     \n"
 | 
| -    "psraw     $0x8,%%xmm1                     \n"
 | 
| -    "packsswb  %%xmm1,%%xmm0                   \n"
 | 
| -    "paddb     %%xmm5,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%3                        \n"
 | 
| -    "movlps    %%xmm0," MEMACCESS(1) "         \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPMEM(movhps,xmm0,0x00,1,2,1)           //  movhps  %%xmm0,(%1,%2,1)
 | 
| -    "lea       " MEMLEA(0x8,1) ",%1            \n"
 | 
| -    "jg        1b                              \n"
 | 
| -  : "+r"(src_rgba0),       // %0
 | 
| -    "+r"(dst_u),           // %1
 | 
| -    "+r"(dst_v),           // %2
 | 
| -    "+rm"(width)           // %3
 | 
| -  : "r"((intptr_t)(src_stride_rgba)) // %4
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm6", "xmm7"
 | 
| -#endif
 | 
| -  );
 | 
| -}
 | 
| -#endif  // HAS_ARGBTOUVROW_SSSE3
 | 
| +#if defined(HAS_I422TOARGBROW_SSSE3) || defined(HAS_I422TOARGBROW_AVX2)
 | 
| +
 | 
| +// YUV to RGB conversion constants.
 | 
| +// Y contribution to R,G,B.  Scale and bias.
 | 
| +#define YG 18997 /* round(1.164 * 64 * 256 * 256 / 257) */
 | 
| +#define YGB 1160 /* 1.164 * 64 * 16 - adjusted for even error distribution */
 | 
| +
 | 
| +// U and V contributions to R,G,B.
 | 
| +#define UB -128 /* -min(128, round(2.018 * 64)) */
 | 
| +#define UG 25 /* -round(-0.391 * 64) */
 | 
| +#define VG 52 /* -round(-0.813 * 64) */
 | 
| +#define VR -102 /* -round(1.596 * 64) */
 | 
| +
 | 
| +// Bias values to subtract 16 from Y and 128 from U and V.
 | 
| +#define BB (UB * 128            - YGB)
 | 
| +#define BG (UG * 128 + VG * 128 - YGB)
 | 
| +#define BR            (VR * 128 - YGB)
 | 
| +
 | 
| +struct YuvConstants {
 | 
| +  lvec8 kUVToB;     // 0
 | 
| +  lvec8 kUVToG;     // 32
 | 
| +  lvec8 kUVToR;     // 64
 | 
| +  lvec16 kUVBiasB;  // 96
 | 
| +  lvec16 kUVBiasG;  // 128
 | 
| +  lvec16 kUVBiasR;  // 160
 | 
| +  lvec16 kYToRgb;   // 192
 | 
| +};
 | 
|  
 | 
| -#ifdef HAS_I422TOARGBROW_SSSE3
 | 
| -#define UB 127 /* min(63,(int8)(2.018 * 64)) */
 | 
| -#define UG -25 /* (int8)(-0.391 * 64 - 0.5) */
 | 
| -#define UR 0
 | 
| -
 | 
| -#define VB 0
 | 
| -#define VG -52 /* (int8)(-0.813 * 64 - 0.5) */
 | 
| -#define VR 102 /* (int8)(1.596 * 64 + 0.5) */
 | 
| -
 | 
| -// Bias
 | 
| -#define BB UB * 128 + VB * 128
 | 
| -#define BG UG * 128 + VG * 128
 | 
| -#define BR UR * 128 + VR * 128
 | 
| -
 | 
| -#define YG 74 /* (int8)(1.164 * 64 + 0.5) */
 | 
| -
 | 
| -struct {
 | 
| -  vec8 kUVToB;  // 0
 | 
| -  vec8 kUVToG;  // 16
 | 
| -  vec8 kUVToR;  // 32
 | 
| -  vec16 kUVBiasB;  // 48
 | 
| -  vec16 kUVBiasG;  // 64
 | 
| -  vec16 kUVBiasR;  // 80
 | 
| -  vec16 kYSub16;  // 96
 | 
| -  vec16 kYToRgb;  // 112
 | 
| -  vec8 kVUToB;  // 128
 | 
| -  vec8 kVUToG;  // 144
 | 
| -  vec8 kVUToR;  // 160
 | 
| -} static SIMD_ALIGNED(kYuvConstants) = {
 | 
| -  { UB, VB, UB, VB, UB, VB, UB, VB, UB, VB, UB, VB, UB, VB, UB, VB },
 | 
| -  { UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG },
 | 
| -  { UR, VR, UR, VR, UR, VR, UR, VR, UR, VR, UR, VR, UR, VR, UR, VR },
 | 
| -  { BB, BB, BB, BB, BB, BB, BB, BB },
 | 
| -  { BG, BG, BG, BG, BG, BG, BG, BG },
 | 
| -  { BR, BR, BR, BR, BR, BR, BR, BR },
 | 
| -  { 16, 16, 16, 16, 16, 16, 16, 16 },
 | 
| -  { YG, YG, YG, YG, YG, YG, YG, YG },
 | 
| -  { VB, UB, VB, UB, VB, UB, VB, UB, VB, UB, VB, UB, VB, UB, VB, UB },
 | 
| -  { VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG },
 | 
| -  { VR, UR, VR, UR, VR, UR, VR, UR, VR, UR, VR, UR, VR, UR, VR, UR }
 | 
| +// BT601 constants for YUV to RGB.
 | 
| +static YuvConstants SIMD_ALIGNED(kYuvConstants) = {
 | 
| +  { UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0,
 | 
| +    UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0 },
 | 
| +  { UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG,
 | 
| +    UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG },
 | 
| +  { 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR,
 | 
| +    0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR },
 | 
| +  { BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB },
 | 
| +  { BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG },
 | 
| +  { BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR },
 | 
| +  { YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG }
 | 
|  };
 | 
|  
 | 
| +// BT601 constants for NV21 where chroma plane is VU instead of UV.
 | 
| +static YuvConstants SIMD_ALIGNED(kYvuConstants) = {
 | 
| +  { 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB,
 | 
| +    0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB },
 | 
| +  { VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG,
 | 
| +    VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG },
 | 
| +  { VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0,
 | 
| +    VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0 },
 | 
| +  { BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB },
 | 
| +  { BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG },
 | 
| +  { BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR },
 | 
| +  { YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG }
 | 
| +};
 | 
|  
 | 
|  // Read 8 UV from 411
 | 
|  #define READYUV444                                                             \
 | 
|      "movq       " MEMACCESS([u_buf]) ",%%xmm0                   \n"            \
 | 
| -    BUNDLEALIGN                                                                \
 | 
|      MEMOPREG(movq, 0x00, [u_buf], [v_buf], 1, xmm1)                            \
 | 
|      "lea        " MEMLEA(0x8, [u_buf]) ",%[u_buf]               \n"            \
 | 
|      "punpcklbw  %%xmm1,%%xmm0                                   \n"
 | 
| @@ -2109,7 +1478,6 @@ struct {
 | 
|  // Read 4 UV from 422, upsample to 8 UV
 | 
|  #define READYUV422                                                             \
 | 
|      "movd       " MEMACCESS([u_buf]) ",%%xmm0                   \n"            \
 | 
| -    BUNDLEALIGN                                                                \
 | 
|      MEMOPREG(movd, 0x00, [u_buf], [v_buf], 1, xmm1)                            \
 | 
|      "lea        " MEMLEA(0x4, [u_buf]) ",%[u_buf]               \n"            \
 | 
|      "punpcklbw  %%xmm1,%%xmm0                                   \n"            \
 | 
| @@ -2118,7 +1486,6 @@ struct {
 | 
|  // Read 2 UV from 411, upsample to 8 UV
 | 
|  #define READYUV411                                                             \
 | 
|      "movd       " MEMACCESS([u_buf]) ",%%xmm0                   \n"            \
 | 
| -    BUNDLEALIGN                                                                \
 | 
|      MEMOPREG(movd, 0x00, [u_buf], [v_buf], 1, xmm1)                            \
 | 
|      "lea        " MEMLEA(0x2, [u_buf]) ",%[u_buf]               \n"            \
 | 
|      "punpcklbw  %%xmm1,%%xmm0                                   \n"            \
 | 
| @@ -2132,20 +1499,23 @@ struct {
 | 
|      "punpcklwd  %%xmm0,%%xmm0                                   \n"
 | 
|  
 | 
|  // Convert 8 pixels: 8 UV and 8 Y
 | 
| -#define YUVTORGB                                                               \
 | 
| +#define YUVTORGB(YuvConstants)                                                 \
 | 
|      "movdqa     %%xmm0,%%xmm1                                   \n"            \
 | 
|      "movdqa     %%xmm0,%%xmm2                                   \n"            \
 | 
| -    "pmaddubsw  " MEMACCESS([kYuvConstants]) ",%%xmm0           \n"            \
 | 
| -    "pmaddubsw  " MEMACCESS2(16, [kYuvConstants]) ",%%xmm1      \n"            \
 | 
| -    "pmaddubsw  " MEMACCESS2(32, [kYuvConstants]) ",%%xmm2      \n"            \
 | 
| -    "psubw      " MEMACCESS2(48, [kYuvConstants]) ",%%xmm0      \n"            \
 | 
| -    "psubw      " MEMACCESS2(64, [kYuvConstants]) ",%%xmm1      \n"            \
 | 
| -    "psubw      " MEMACCESS2(80, [kYuvConstants]) ",%%xmm2      \n"            \
 | 
| +    "movdqa     %%xmm0,%%xmm3                                   \n"            \
 | 
| +    "movdqa     " MEMACCESS2(96, [YuvConstants]) ",%%xmm0       \n"            \
 | 
| +    "pmaddubsw  " MEMACCESS([YuvConstants]) ",%%xmm1            \n"            \
 | 
| +    "psubw      %%xmm1,%%xmm0                                   \n"            \
 | 
| +    "movdqa     " MEMACCESS2(128, [YuvConstants]) ",%%xmm1      \n"            \
 | 
| +    "pmaddubsw  " MEMACCESS2(32, [YuvConstants]) ",%%xmm2       \n"            \
 | 
| +    "psubw      %%xmm2,%%xmm1                                   \n"            \
 | 
| +    "movdqa     " MEMACCESS2(160, [YuvConstants]) ",%%xmm2      \n"            \
 | 
| +    "pmaddubsw  " MEMACCESS2(64, [YuvConstants]) ",%%xmm3       \n"            \
 | 
| +    "psubw      %%xmm3,%%xmm2                                   \n"            \
 | 
|      "movq       " MEMACCESS([y_buf]) ",%%xmm3                   \n"            \
 | 
|      "lea        " MEMLEA(0x8, [y_buf]) ",%[y_buf]               \n"            \
 | 
| -    "punpcklbw  %%xmm4,%%xmm3                                   \n"            \
 | 
| -    "psubsw     " MEMACCESS2(96, [kYuvConstants]) ",%%xmm3      \n"            \
 | 
| -    "pmullw     " MEMACCESS2(112, [kYuvConstants]) ",%%xmm3     \n"            \
 | 
| +    "punpcklbw  %%xmm3,%%xmm3                                   \n"            \
 | 
| +    "pmulhuw    " MEMACCESS2(192, [YuvConstants]) ",%%xmm3      \n"            \
 | 
|      "paddsw     %%xmm3,%%xmm0                                   \n"            \
 | 
|      "paddsw     %%xmm3,%%xmm1                                   \n"            \
 | 
|      "paddsw     %%xmm3,%%xmm2                                   \n"            \
 | 
| @@ -2154,394 +1524,182 @@ struct {
 | 
|      "psraw      $0x6,%%xmm2                                     \n"            \
 | 
|      "packuswb   %%xmm0,%%xmm0                                   \n"            \
 | 
|      "packuswb   %%xmm1,%%xmm1                                   \n"            \
 | 
| -    "packuswb   %%xmm2,%%xmm2                                   \n"
 | 
| -
 | 
| -// Convert 8 pixels: 8 VU and 8 Y
 | 
| -#define YVUTORGB                                                               \
 | 
| -    "movdqa     %%xmm0,%%xmm1                                   \n"            \
 | 
| -    "movdqa     %%xmm0,%%xmm2                                   \n"            \
 | 
| -    "pmaddubsw  " MEMACCESS2(128, [kYuvConstants]) ",%%xmm0     \n"            \
 | 
| -    "pmaddubsw  " MEMACCESS2(144, [kYuvConstants]) ",%%xmm1     \n"            \
 | 
| -    "pmaddubsw  " MEMACCESS2(160, [kYuvConstants]) ",%%xmm2     \n"            \
 | 
| -    "psubw      " MEMACCESS2(48, [kYuvConstants]) ",%%xmm0      \n"            \
 | 
| -    "psubw      " MEMACCESS2(64, [kYuvConstants]) ",%%xmm1      \n"            \
 | 
| -    "psubw      " MEMACCESS2(80, [kYuvConstants]) ",%%xmm2      \n"            \
 | 
| -    "movq       " MEMACCESS([y_buf]) ",%%xmm3                   \n"            \
 | 
| -    "lea        " MEMLEA(0x8, [y_buf]) ",%[y_buf]               \n"            \
 | 
| -    "punpcklbw  %%xmm4,%%xmm3                                   \n"            \
 | 
| -    "psubsw     " MEMACCESS2(96, [kYuvConstants]) ",%%xmm3      \n"            \
 | 
| -    "pmullw     " MEMACCESS2(112, [kYuvConstants]) ",%%xmm3     \n"            \
 | 
| -    "paddsw     %%xmm3,%%xmm0                                   \n"            \
 | 
| -    "paddsw     %%xmm3,%%xmm1                                   \n"            \
 | 
| -    "paddsw     %%xmm3,%%xmm2                                   \n"            \
 | 
| -    "psraw      $0x6,%%xmm0                                     \n"            \
 | 
| -    "psraw      $0x6,%%xmm1                                     \n"            \
 | 
| -    "psraw      $0x6,%%xmm2                                     \n"            \
 | 
| -    "packuswb   %%xmm0,%%xmm0                                   \n"            \
 | 
| -    "packuswb   %%xmm1,%%xmm1                                   \n"            \
 | 
| -    "packuswb   %%xmm2,%%xmm2                                   \n"
 | 
| -
 | 
| -void OMITFP I444ToARGBRow_SSSE3(const uint8* y_buf,
 | 
| -                                const uint8* u_buf,
 | 
| -                                const uint8* v_buf,
 | 
| -                                uint8* dst_argb,
 | 
| -                                int width) {
 | 
| -  asm volatile (
 | 
| -    "sub       %[u_buf],%[v_buf]               \n"
 | 
| -    "pcmpeqb   %%xmm5,%%xmm5                   \n"
 | 
| -    "pxor      %%xmm4,%%xmm4                   \n"
 | 
| -    LABELALIGN
 | 
| -  "1:                                          \n"
 | 
| -    READYUV444
 | 
| -    YUVTORGB
 | 
| -    "punpcklbw %%xmm1,%%xmm0                   \n"
 | 
| -    "punpcklbw %%xmm5,%%xmm2                   \n"
 | 
| -    "movdqa    %%xmm0,%%xmm1                   \n"
 | 
| -    "punpcklwd %%xmm2,%%xmm0                   \n"
 | 
| -    "punpckhwd %%xmm2,%%xmm1                   \n"
 | 
| -    "movdqa    %%xmm0," MEMACCESS([dst_argb]) "         \n"
 | 
| -    "movdqa    %%xmm1," MEMACCESS2(0x10,[dst_argb]) "   \n"
 | 
| -    "lea       " MEMLEA(0x20,[dst_argb]) ",%[dst_argb]  \n"
 | 
| -    "sub       $0x8,%[width]                   \n"
 | 
| -    "jg        1b                              \n"
 | 
| -  : [y_buf]"+r"(y_buf),    // %[y_buf]
 | 
| -    [u_buf]"+r"(u_buf),    // %[u_buf]
 | 
| -    [v_buf]"+r"(v_buf),    // %[v_buf]
 | 
| -    [dst_argb]"+r"(dst_argb),  // %[dst_argb]
 | 
| -    [width]"+rm"(width)    // %[width]
 | 
| -  : [kYuvConstants]"r"(&kYuvConstants.kUVToB) // %[kYuvConstants]
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
| -#endif
 | 
| -  );
 | 
| -}
 | 
| -
 | 
| -void OMITFP I422ToRGB24Row_SSSE3(const uint8* y_buf,
 | 
| -                                 const uint8* u_buf,
 | 
| -                                 const uint8* v_buf,
 | 
| -                                 uint8* dst_rgb24,
 | 
| -                                 int width) {
 | 
| -// fpic 32 bit gcc 4.2 on OSX runs out of GPR regs.
 | 
| -#if defined(__i386__)
 | 
| -  asm volatile (
 | 
| -    "movdqa    %[kShuffleMaskARGBToRGB24_0],%%xmm5 \n"
 | 
| -    "movdqa    %[kShuffleMaskARGBToRGB24],%%xmm6   \n"
 | 
| -  :: [kShuffleMaskARGBToRGB24_0]"m"(kShuffleMaskARGBToRGB24_0),
 | 
| -    [kShuffleMaskARGBToRGB24]"m"(kShuffleMaskARGBToRGB24));
 | 
| -#endif
 | 
| -
 | 
| -  asm volatile (
 | 
| -#if !defined(__i386__)
 | 
| -    "movdqa    %[kShuffleMaskARGBToRGB24_0],%%xmm5 \n"
 | 
| -    "movdqa    %[kShuffleMaskARGBToRGB24],%%xmm6   \n"
 | 
| -#endif
 | 
| -    "sub       %[u_buf],%[v_buf]               \n"
 | 
| -    "pxor      %%xmm4,%%xmm4                   \n"
 | 
| -    LABELALIGN
 | 
| -  "1:                                          \n"
 | 
| -    READYUV422
 | 
| -    YUVTORGB
 | 
| -    "punpcklbw %%xmm1,%%xmm0                   \n"
 | 
| -    "punpcklbw %%xmm2,%%xmm2                   \n"
 | 
| -    "movdqa    %%xmm0,%%xmm1                   \n"
 | 
| -    "punpcklwd %%xmm2,%%xmm0                   \n"
 | 
| -    "punpckhwd %%xmm2,%%xmm1                   \n"
 | 
| -    "pshufb    %%xmm5,%%xmm0                   \n"
 | 
| -    "pshufb    %%xmm6,%%xmm1                   \n"
 | 
| -    "palignr   $0xc,%%xmm0,%%xmm1              \n"
 | 
| -    "movq      %%xmm0," MEMACCESS([dst_rgb24]) "\n"
 | 
| -    "movdqu    %%xmm1," MEMACCESS2(0x8,[dst_rgb24]) "\n"
 | 
| -    "lea       " MEMLEA(0x18,[dst_rgb24]) ",%[dst_rgb24] \n"
 | 
| -    "sub       $0x8,%[width]                   \n"
 | 
| -    "jg        1b                              \n"
 | 
| -  : [y_buf]"+r"(y_buf),    // %[y_buf]
 | 
| -    [u_buf]"+r"(u_buf),    // %[u_buf]
 | 
| -    [v_buf]"+r"(v_buf),    // %[v_buf]
 | 
| -    [dst_rgb24]"+r"(dst_rgb24),  // %[dst_rgb24]
 | 
| -    [width]"+rm"(width)    // %[width]
 | 
| -  : [kYuvConstants]"r"(&kYuvConstants.kUVToB)
 | 
| -#if !defined(__i386__)
 | 
| -    , [kShuffleMaskARGBToRGB24_0]"m"(kShuffleMaskARGBToRGB24_0),
 | 
| -    [kShuffleMaskARGBToRGB24]"m"(kShuffleMaskARGBToRGB24)
 | 
| -#endif
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6"
 | 
| -#endif
 | 
| -  );
 | 
| -}
 | 
| -
 | 
| -void OMITFP I422ToRAWRow_SSSE3(const uint8* y_buf,
 | 
| -                               const uint8* u_buf,
 | 
| -                               const uint8* v_buf,
 | 
| -                               uint8* dst_raw,
 | 
| -                               int width) {
 | 
| -// fpic 32 bit gcc 4.2 on OSX runs out of GPR regs.
 | 
| -#if defined(__i386__)
 | 
| -  asm volatile (
 | 
| -    "movdqa    %[kShuffleMaskARGBToRAW_0],%%xmm5 \n"
 | 
| -    "movdqa    %[kShuffleMaskARGBToRAW],%%xmm6   \n"
 | 
| -  :: [kShuffleMaskARGBToRAW_0]"m"(kShuffleMaskARGBToRAW_0),
 | 
| -    [kShuffleMaskARGBToRAW]"m"(kShuffleMaskARGBToRAW));
 | 
| -#endif
 | 
| -
 | 
| -  asm volatile (
 | 
| -#if !defined(__i386__)
 | 
| -    "movdqa    %[kShuffleMaskARGBToRAW_0],%%xmm5 \n"
 | 
| -    "movdqa    %[kShuffleMaskARGBToRAW],%%xmm6   \n"
 | 
| -#endif
 | 
| -    "sub       %[u_buf],%[v_buf]               \n"
 | 
| -    "pxor      %%xmm4,%%xmm4                   \n"
 | 
| -    LABELALIGN
 | 
| -  "1:                                          \n"
 | 
| -    READYUV422
 | 
| -    YUVTORGB
 | 
| -    "punpcklbw %%xmm1,%%xmm0                   \n"
 | 
| -    "punpcklbw %%xmm2,%%xmm2                   \n"
 | 
| -    "movdqa    %%xmm0,%%xmm1                   \n"
 | 
| -    "punpcklwd %%xmm2,%%xmm0                   \n"
 | 
| -    "punpckhwd %%xmm2,%%xmm1                   \n"
 | 
| -    "pshufb    %%xmm5,%%xmm0                   \n"
 | 
| -    "pshufb    %%xmm6,%%xmm1                   \n"
 | 
| -    "palignr   $0xc,%%xmm0,%%xmm1              \n"
 | 
| -    "movq      %%xmm0," MEMACCESS([dst_raw]) " \n"
 | 
| -    "movdqu    %%xmm1," MEMACCESS2(0x8,[dst_raw]) "\n"
 | 
| -    "lea       " MEMLEA(0x18,[dst_raw]) ",%[dst_raw] \n"
 | 
| -    "sub       $0x8,%[width]                   \n"
 | 
| -    "jg        1b                              \n"
 | 
| -  : [y_buf]"+r"(y_buf),    // %[y_buf]
 | 
| -    [u_buf]"+r"(u_buf),    // %[u_buf]
 | 
| -    [v_buf]"+r"(v_buf),    // %[v_buf]
 | 
| -    [dst_raw]"+r"(dst_raw),  // %[dst_raw]
 | 
| -    [width]"+rm"(width)    // %[width]
 | 
| -  : [kYuvConstants]"r"(&kYuvConstants.kUVToB)
 | 
| -#if !defined(__i386__)
 | 
| -    , [kShuffleMaskARGBToRAW_0]"m"(kShuffleMaskARGBToRAW_0),
 | 
| -    [kShuffleMaskARGBToRAW]"m"(kShuffleMaskARGBToRAW)
 | 
| -#endif
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6"
 | 
| -#endif
 | 
| -  );
 | 
| -}
 | 
| -
 | 
| -void OMITFP I422ToARGBRow_SSSE3(const uint8* y_buf,
 | 
| -                                const uint8* u_buf,
 | 
| -                                const uint8* v_buf,
 | 
| -                                uint8* dst_argb,
 | 
| -                                int width) {
 | 
| -  asm volatile (
 | 
| -    "sub       %[u_buf],%[v_buf]               \n"
 | 
| -    "pcmpeqb   %%xmm5,%%xmm5                   \n"
 | 
| -    "pxor      %%xmm4,%%xmm4                   \n"
 | 
| -    LABELALIGN
 | 
| -  "1:                                          \n"
 | 
| -    READYUV422
 | 
| -    YUVTORGB
 | 
| -    "punpcklbw %%xmm1,%%xmm0                   \n"
 | 
| -    "punpcklbw %%xmm5,%%xmm2                   \n"
 | 
| -    "movdqa    %%xmm0,%%xmm1                   \n"
 | 
| -    "punpcklwd %%xmm2,%%xmm0                   \n"
 | 
| -    "punpckhwd %%xmm2,%%xmm1                   \n"
 | 
| -    "movdqa    %%xmm0," MEMACCESS([dst_argb]) "\n"
 | 
| -    "movdqa    %%xmm1," MEMACCESS2(0x10,[dst_argb]) "\n"
 | 
| -    "lea       " MEMLEA(0x20,[dst_argb]) ",%[dst_argb] \n"
 | 
| -    "sub       $0x8,%[width]                   \n"
 | 
| -    "jg        1b                              \n"
 | 
| -  : [y_buf]"+r"(y_buf),    // %[y_buf]
 | 
| -    [u_buf]"+r"(u_buf),    // %[u_buf]
 | 
| -    [v_buf]"+r"(v_buf),    // %[v_buf]
 | 
| -    [dst_argb]"+r"(dst_argb),  // %[dst_argb]
 | 
| -    [width]"+rm"(width)    // %[width]
 | 
| -  : [kYuvConstants]"r"(&kYuvConstants.kUVToB) // %[kYuvConstants]
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
| -#endif
 | 
| -  );
 | 
| -}
 | 
| -
 | 
| -void OMITFP I411ToARGBRow_SSSE3(const uint8* y_buf,
 | 
| -                                const uint8* u_buf,
 | 
| -                                const uint8* v_buf,
 | 
| -                                uint8* dst_argb,
 | 
| -                                int width) {
 | 
| -  asm volatile (
 | 
| -    "sub       %[u_buf],%[v_buf]               \n"
 | 
| -    "pcmpeqb   %%xmm5,%%xmm5                   \n"
 | 
| -    "pxor      %%xmm4,%%xmm4                   \n"
 | 
| -    LABELALIGN
 | 
| -  "1:                                          \n"
 | 
| -    READYUV411
 | 
| -    YUVTORGB
 | 
| -    "punpcklbw %%xmm1,%%xmm0                   \n"
 | 
| -    "punpcklbw %%xmm5,%%xmm2                   \n"
 | 
| -    "movdqa    %%xmm0,%%xmm1                   \n"
 | 
| -    "punpcklwd %%xmm2,%%xmm0                   \n"
 | 
| -    "punpckhwd %%xmm2,%%xmm1                   \n"
 | 
| -    "movdqa    %%xmm0," MEMACCESS([dst_argb]) "\n"
 | 
| -    "movdqa    %%xmm1," MEMACCESS2(0x10,[dst_argb]) "\n"
 | 
| -    "lea       " MEMLEA(0x20,[dst_argb]) ",%[dst_argb] \n"
 | 
| -    "sub       $0x8,%[width]                   \n"
 | 
| -    "jg        1b                              \n"
 | 
| -  : [y_buf]"+r"(y_buf),    // %[y_buf]
 | 
| -    [u_buf]"+r"(u_buf),    // %[u_buf]
 | 
| -    [v_buf]"+r"(v_buf),    // %[v_buf]
 | 
| -    [dst_argb]"+r"(dst_argb),  // %[dst_argb]
 | 
| -    [width]"+rm"(width)    // %[width]
 | 
| -  : [kYuvConstants]"r"(&kYuvConstants.kUVToB) // %[kYuvConstants]
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
| -#endif
 | 
| -  );
 | 
| -}
 | 
| +    "packuswb   %%xmm2,%%xmm2                                   \n"
 | 
|  
 | 
| -void OMITFP NV12ToARGBRow_SSSE3(const uint8* y_buf,
 | 
| -                                const uint8* uv_buf,
 | 
| +// Store 8 ARGB values. Assumes XMM5 is zero.
 | 
| +#define STOREARGB                                                              \
 | 
| +    "punpcklbw  %%xmm1,%%xmm0                                    \n"           \
 | 
| +    "punpcklbw  %%xmm5,%%xmm2                                    \n"           \
 | 
| +    "movdqa     %%xmm0,%%xmm1                                    \n"           \
 | 
| +    "punpcklwd  %%xmm2,%%xmm0                                    \n"           \
 | 
| +    "punpckhwd  %%xmm2,%%xmm1                                    \n"           \
 | 
| +    "movdqu     %%xmm0," MEMACCESS([dst_argb]) "                 \n"           \
 | 
| +    "movdqu     %%xmm1," MEMACCESS2(0x10,[dst_argb]) "           \n"           \
 | 
| +    "lea        " MEMLEA(0x20,[dst_argb]) ",%[dst_argb]          \n"
 | 
| +
 | 
| +// Store 8 BGRA values. Assumes XMM5 is zero.
 | 
| +#define STOREBGRA                                                              \
 | 
| +    "pcmpeqb   %%xmm5,%%xmm5                                     \n"           \
 | 
| +    "punpcklbw %%xmm0,%%xmm1                                     \n"           \
 | 
| +    "punpcklbw %%xmm2,%%xmm5                                     \n"           \
 | 
| +    "movdqa    %%xmm5,%%xmm0                                     \n"           \
 | 
| +    "punpcklwd %%xmm1,%%xmm5                                     \n"           \
 | 
| +    "punpckhwd %%xmm1,%%xmm0                                     \n"           \
 | 
| +    "movdqu    %%xmm5," MEMACCESS([dst_bgra]) "                  \n"           \
 | 
| +    "movdqu    %%xmm0," MEMACCESS2(0x10,[dst_bgra]) "            \n"           \
 | 
| +    "lea       " MEMLEA(0x20,[dst_bgra]) ",%[dst_bgra]           \n"
 | 
| +
 | 
| +// Store 8 ABGR values. Assumes XMM5 is zero.
 | 
| +#define STOREABGR                                                              \
 | 
| +    "punpcklbw %%xmm1,%%xmm2                                     \n"           \
 | 
| +    "punpcklbw %%xmm5,%%xmm0                                     \n"           \
 | 
| +    "movdqa    %%xmm2,%%xmm1                                     \n"           \
 | 
| +    "punpcklwd %%xmm0,%%xmm2                                     \n"           \
 | 
| +    "punpckhwd %%xmm0,%%xmm1                                     \n"           \
 | 
| +    "movdqu    %%xmm2," MEMACCESS([dst_abgr]) "                  \n"           \
 | 
| +    "movdqu    %%xmm1," MEMACCESS2(0x10,[dst_abgr]) "            \n"           \
 | 
| +    "lea       " MEMLEA(0x20,[dst_abgr]) ",%[dst_abgr]           \n"
 | 
| +
 | 
| +// Store 8 RGBA values. Assumes XMM5 is zero.
 | 
| +#define STORERGBA                                                              \
 | 
| +    "pcmpeqb   %%xmm5,%%xmm5                                     \n"           \
 | 
| +    "punpcklbw %%xmm2,%%xmm1                                     \n"           \
 | 
| +    "punpcklbw %%xmm0,%%xmm5                                     \n"           \
 | 
| +    "movdqa    %%xmm5,%%xmm0                                     \n"           \
 | 
| +    "punpcklwd %%xmm1,%%xmm5                                     \n"           \
 | 
| +    "punpckhwd %%xmm1,%%xmm0                                     \n"           \
 | 
| +    "movdqu    %%xmm5," MEMACCESS([dst_rgba]) "                  \n"           \
 | 
| +    "movdqu    %%xmm0," MEMACCESS2(0x10,[dst_rgba]) "            \n"           \
 | 
| +    "lea       " MEMLEA(0x20,[dst_rgba]) ",%[dst_rgba]           \n"
 | 
| +
 | 
| +void OMITFP I444ToARGBRow_SSSE3(const uint8* y_buf,
 | 
| +                                const uint8* u_buf,
 | 
| +                                const uint8* v_buf,
 | 
|                                  uint8* dst_argb,
 | 
|                                  int width) {
 | 
|    asm volatile (
 | 
| +    "sub       %[u_buf],%[v_buf]               \n"
 | 
|      "pcmpeqb   %%xmm5,%%xmm5                   \n"
 | 
| -    "pxor      %%xmm4,%%xmm4                   \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    READNV12
 | 
| -    YUVTORGB
 | 
| -    "punpcklbw %%xmm1,%%xmm0                   \n"
 | 
| -    "punpcklbw %%xmm5,%%xmm2                   \n"
 | 
| -    "movdqa    %%xmm0,%%xmm1                   \n"
 | 
| -    "punpcklwd %%xmm2,%%xmm0                   \n"
 | 
| -    "punpckhwd %%xmm2,%%xmm1                   \n"
 | 
| -    "movdqa    %%xmm0," MEMACCESS([dst_argb]) "\n"
 | 
| -    "movdqa    %%xmm1," MEMACCESS2(0x10,[dst_argb]) "\n"
 | 
| -    "lea       " MEMLEA(0x20,[dst_argb]) ",%[dst_argb] \n"
 | 
| +    READYUV444
 | 
| +    YUVTORGB(kYuvConstants)
 | 
| +    STOREARGB
 | 
|      "sub       $0x8,%[width]                   \n"
 | 
|      "jg        1b                              \n"
 | 
|    : [y_buf]"+r"(y_buf),    // %[y_buf]
 | 
| -    [uv_buf]"+r"(uv_buf),    // %[uv_buf]
 | 
| +    [u_buf]"+r"(u_buf),    // %[u_buf]
 | 
| +    [v_buf]"+r"(v_buf),    // %[v_buf]
 | 
|      [dst_argb]"+r"(dst_argb),  // %[dst_argb]
 | 
|      [width]"+rm"(width)    // %[width]
 | 
|    : [kYuvConstants]"r"(&kYuvConstants.kUVToB) // %[kYuvConstants]
 | 
| -  : "memory", "cc"
 | 
| -  // Does not use r14.
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
| -#endif
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm3", "xmm5"
 | 
|    );
 | 
|  }
 | 
|  
 | 
| -void OMITFP NV21ToARGBRow_SSSE3(const uint8* y_buf,
 | 
| -                                const uint8* uv_buf,
 | 
| -                                uint8* dst_argb,
 | 
| -                                int width) {
 | 
| +// TODO(fbarchard): Consider putting masks into constants.
 | 
| +void OMITFP I422ToRGB24Row_SSSE3(const uint8* y_buf,
 | 
| +                                 const uint8* u_buf,
 | 
| +                                 const uint8* v_buf,
 | 
| +                                 uint8* dst_rgb24,
 | 
| +                                 int width) {
 | 
|    asm volatile (
 | 
| -    "pcmpeqb   %%xmm5,%%xmm5                   \n"
 | 
| -    "pxor      %%xmm4,%%xmm4                   \n"
 | 
| +    "movdqa    %[kShuffleMaskARGBToRGB24_0],%%xmm5 \n"
 | 
| +    "movdqa    %[kShuffleMaskARGBToRGB24],%%xmm6   \n"
 | 
| +    "sub       %[u_buf],%[v_buf]               \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    READNV12
 | 
| -    YVUTORGB
 | 
| +    READYUV422
 | 
| +    YUVTORGB(kYuvConstants)
 | 
|      "punpcklbw %%xmm1,%%xmm0                   \n"
 | 
| -    "punpcklbw %%xmm5,%%xmm2                   \n"
 | 
| +    "punpcklbw %%xmm2,%%xmm2                   \n"
 | 
|      "movdqa    %%xmm0,%%xmm1                   \n"
 | 
|      "punpcklwd %%xmm2,%%xmm0                   \n"
 | 
|      "punpckhwd %%xmm2,%%xmm1                   \n"
 | 
| -    "movdqa    %%xmm0," MEMACCESS([dst_argb]) "\n"
 | 
| -    "movdqa    %%xmm1," MEMACCESS2(0x10,[dst_argb]) "\n"
 | 
| -    "lea       " MEMLEA(0x20,[dst_argb]) ",%[dst_argb] \n"
 | 
| -    "sub       $0x8,%[width]                   \n"
 | 
| +    "pshufb    %%xmm5,%%xmm0                   \n"
 | 
| +    "pshufb    %%xmm6,%%xmm1                   \n"
 | 
| +    "palignr   $0xc,%%xmm0,%%xmm1              \n"
 | 
| +    "movq      %%xmm0," MEMACCESS([dst_rgb24]) "\n"
 | 
| +    "movdqu    %%xmm1," MEMACCESS2(0x8,[dst_rgb24]) "\n"
 | 
| +    "lea       " MEMLEA(0x18,[dst_rgb24]) ",%[dst_rgb24] \n"
 | 
| +    "subl      $0x8,%[width]                   \n"
 | 
|      "jg        1b                              \n"
 | 
|    : [y_buf]"+r"(y_buf),    // %[y_buf]
 | 
| -    [uv_buf]"+r"(uv_buf),    // %[uv_buf]
 | 
| -    [dst_argb]"+r"(dst_argb),  // %[dst_argb]
 | 
| +    [u_buf]"+r"(u_buf),    // %[u_buf]
 | 
| +    [v_buf]"+r"(v_buf),    // %[v_buf]
 | 
| +    [dst_rgb24]"+r"(dst_rgb24),  // %[dst_rgb24]
 | 
| +// TODO(fbarchard): Make width a register for 32 bit.
 | 
| +#if defined(__i386__) && defined(__pic__)
 | 
| +    [width]"+m"(width)     // %[width]
 | 
| +#else
 | 
|      [width]"+rm"(width)    // %[width]
 | 
| -  : [kYuvConstants]"r"(&kYuvConstants.kUVToB) // %[kYuvConstants]
 | 
| -  : "memory", "cc"
 | 
| -  // Does not use r14.
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
|  #endif
 | 
| +  : [kYuvConstants]"r"(&kYuvConstants.kUVToB),
 | 
| +    [kShuffleMaskARGBToRGB24_0]"m"(kShuffleMaskARGBToRGB24_0),
 | 
| +    [kShuffleMaskARGBToRGB24]"m"(kShuffleMaskARGBToRGB24)
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm3", "xmm5", "xmm6"
 | 
|    );
 | 
|  }
 | 
|  
 | 
| -void OMITFP I444ToARGBRow_Unaligned_SSSE3(const uint8* y_buf,
 | 
| -                                          const uint8* u_buf,
 | 
| -                                          const uint8* v_buf,
 | 
| -                                          uint8* dst_argb,
 | 
| -                                          int width) {
 | 
| +void OMITFP I422ToRAWRow_SSSE3(const uint8* y_buf,
 | 
| +                               const uint8* u_buf,
 | 
| +                               const uint8* v_buf,
 | 
| +                               uint8* dst_raw,
 | 
| +                               int width) {
 | 
|    asm volatile (
 | 
| +    "movdqa    %[kShuffleMaskARGBToRAW_0],%%xmm5 \n"
 | 
| +    "movdqa    %[kShuffleMaskARGBToRAW],%%xmm6   \n"
 | 
|      "sub       %[u_buf],%[v_buf]               \n"
 | 
| -    "pcmpeqb   %%xmm5,%%xmm5                   \n"
 | 
| -    "pxor      %%xmm4,%%xmm4                   \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    READYUV444
 | 
| -    YUVTORGB
 | 
| +    READYUV422
 | 
| +    YUVTORGB(kYuvConstants)
 | 
|      "punpcklbw %%xmm1,%%xmm0                   \n"
 | 
| -    "punpcklbw %%xmm5,%%xmm2                   \n"
 | 
| +    "punpcklbw %%xmm2,%%xmm2                   \n"
 | 
|      "movdqa    %%xmm0,%%xmm1                   \n"
 | 
|      "punpcklwd %%xmm2,%%xmm0                   \n"
 | 
|      "punpckhwd %%xmm2,%%xmm1                   \n"
 | 
| -    "movdqu    %%xmm0," MEMACCESS([dst_argb]) "\n"
 | 
| -    "movdqu    %%xmm1," MEMACCESS2(0x10,[dst_argb]) "\n"
 | 
| -    "lea       " MEMLEA(0x20,[dst_argb]) ",%[dst_argb] \n"
 | 
| -    "sub       $0x8,%[width]                   \n"
 | 
| +    "pshufb    %%xmm5,%%xmm0                   \n"
 | 
| +    "pshufb    %%xmm6,%%xmm1                   \n"
 | 
| +    "palignr   $0xc,%%xmm0,%%xmm1              \n"
 | 
| +    "movq      %%xmm0," MEMACCESS([dst_raw]) " \n"
 | 
| +    "movdqu    %%xmm1," MEMACCESS2(0x8,[dst_raw]) "\n"
 | 
| +    "lea       " MEMLEA(0x18,[dst_raw]) ",%[dst_raw] \n"
 | 
| +    "subl      $0x8,%[width]                   \n"
 | 
|      "jg        1b                              \n"
 | 
|    : [y_buf]"+r"(y_buf),    // %[y_buf]
 | 
|      [u_buf]"+r"(u_buf),    // %[u_buf]
 | 
|      [v_buf]"+r"(v_buf),    // %[v_buf]
 | 
| -    [dst_argb]"+r"(dst_argb),  // %[dst_argb]
 | 
| +    [dst_raw]"+r"(dst_raw),  // %[dst_raw]
 | 
| +// TODO(fbarchard): Make width a register for 32 bit.
 | 
| +#if defined(__i386__) && defined(__pic__)
 | 
| +    [width]"+m"(width)    // %[width]
 | 
| +#else
 | 
|      [width]"+rm"(width)    // %[width]
 | 
| -  : [kYuvConstants]"r"(&kYuvConstants.kUVToB) // %[kYuvConstants]
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
|  #endif
 | 
| +  : [kYuvConstants]"r"(&kYuvConstants.kUVToB),
 | 
| +    [kShuffleMaskARGBToRAW_0]"m"(kShuffleMaskARGBToRAW_0),
 | 
| +    [kShuffleMaskARGBToRAW]"m"(kShuffleMaskARGBToRAW)
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm3", "xmm5", "xmm6"
 | 
|    );
 | 
|  }
 | 
|  
 | 
| -void OMITFP I422ToARGBRow_Unaligned_SSSE3(const uint8* y_buf,
 | 
| -                                          const uint8* u_buf,
 | 
| -                                          const uint8* v_buf,
 | 
| -                                          uint8* dst_argb,
 | 
| -                                          int width) {
 | 
| +void OMITFP I422ToARGBRow_SSSE3(const uint8* y_buf,
 | 
| +                                const uint8* u_buf,
 | 
| +                                const uint8* v_buf,
 | 
| +                                uint8* dst_argb,
 | 
| +                                int width) {
 | 
|    asm volatile (
 | 
|      "sub       %[u_buf],%[v_buf]               \n"
 | 
|      "pcmpeqb   %%xmm5,%%xmm5                   \n"
 | 
| -    "pxor      %%xmm4,%%xmm4                   \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
|      READYUV422
 | 
| -    YUVTORGB
 | 
| -    "punpcklbw %%xmm1,%%xmm0                   \n"
 | 
| -    "punpcklbw %%xmm5,%%xmm2                   \n"
 | 
| -    "movdqa    %%xmm0,%%xmm1                   \n"
 | 
| -    "punpcklwd %%xmm2,%%xmm0                   \n"
 | 
| -    "punpckhwd %%xmm2,%%xmm1                   \n"
 | 
| -    "movdqu    %%xmm0," MEMACCESS([dst_argb]) "\n"
 | 
| -    "movdqu    %%xmm1," MEMACCESS2(0x10,[dst_argb]) "\n"
 | 
| -    "lea       " MEMLEA(0x20,[dst_argb]) ",%[dst_argb] \n"
 | 
| +    YUVTORGB(kYuvConstants)
 | 
| +    STOREARGB
 | 
|      "sub       $0x8,%[width]                   \n"
 | 
|      "jg        1b                              \n"
 | 
|    : [y_buf]"+r"(y_buf),    // %[y_buf]
 | 
| @@ -2550,37 +1708,24 @@ void OMITFP I422ToARGBRow_Unaligned_SSSE3(const uint8* y_buf,
 | 
|      [dst_argb]"+r"(dst_argb),  // %[dst_argb]
 | 
|      [width]"+rm"(width)    // %[width]
 | 
|    : [kYuvConstants]"r"(&kYuvConstants.kUVToB) // %[kYuvConstants]
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
| -#endif
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm3", "xmm5"
 | 
|    );
 | 
|  }
 | 
|  
 | 
| -void OMITFP I411ToARGBRow_Unaligned_SSSE3(const uint8* y_buf,
 | 
| -                                          const uint8* u_buf,
 | 
| -                                          const uint8* v_buf,
 | 
| -                                          uint8* dst_argb,
 | 
| -                                          int width) {
 | 
| +void OMITFP I411ToARGBRow_SSSE3(const uint8* y_buf,
 | 
| +                                const uint8* u_buf,
 | 
| +                                const uint8* v_buf,
 | 
| +                                uint8* dst_argb,
 | 
| +                                int width) {
 | 
|    asm volatile (
 | 
|      "sub       %[u_buf],%[v_buf]               \n"
 | 
|      "pcmpeqb   %%xmm5,%%xmm5                   \n"
 | 
| -    "pxor      %%xmm4,%%xmm4                   \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
|      READYUV411
 | 
| -    YUVTORGB
 | 
| -    "punpcklbw %%xmm1,%%xmm0                   \n"
 | 
| -    "punpcklbw %%xmm5,%%xmm2                   \n"
 | 
| -    "movdqa    %%xmm0,%%xmm1                   \n"
 | 
| -    "punpcklwd %%xmm2,%%xmm0                   \n"
 | 
| -    "punpckhwd %%xmm2,%%xmm1                   \n"
 | 
| -    "movdqu    %%xmm0," MEMACCESS([dst_argb]) "\n"
 | 
| -    "movdqu    %%xmm1," MEMACCESS2(0x10,[dst_argb]) "\n"
 | 
| -    "lea       " MEMLEA(0x20,[dst_argb]) ",%[dst_argb] \n"
 | 
| +    YUVTORGB(kYuvConstants)
 | 
| +    STOREARGB
 | 
|      "sub       $0x8,%[width]                   \n"
 | 
|      "jg        1b                              \n"
 | 
|    : [y_buf]"+r"(y_buf),    // %[y_buf]
 | 
| @@ -2589,35 +1734,22 @@ void OMITFP I411ToARGBRow_Unaligned_SSSE3(const uint8* y_buf,
 | 
|      [dst_argb]"+r"(dst_argb),  // %[dst_argb]
 | 
|      [width]"+rm"(width)    // %[width]
 | 
|    : [kYuvConstants]"r"(&kYuvConstants.kUVToB) // %[kYuvConstants]
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
| -#endif
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm3", "xmm5"
 | 
|    );
 | 
|  }
 | 
|  
 | 
| -void OMITFP NV12ToARGBRow_Unaligned_SSSE3(const uint8* y_buf,
 | 
| -                                          const uint8* uv_buf,
 | 
| -                                          uint8* dst_argb,
 | 
| -                                          int width) {
 | 
| +void OMITFP NV12ToARGBRow_SSSE3(const uint8* y_buf,
 | 
| +                                const uint8* uv_buf,
 | 
| +                                uint8* dst_argb,
 | 
| +                                int width) {
 | 
|    asm volatile (
 | 
|      "pcmpeqb   %%xmm5,%%xmm5                   \n"
 | 
| -    "pxor      %%xmm4,%%xmm4                   \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
|      READNV12
 | 
| -    YUVTORGB
 | 
| -    "punpcklbw %%xmm1,%%xmm0                   \n"
 | 
| -    "punpcklbw %%xmm5,%%xmm2                   \n"
 | 
| -    "movdqa    %%xmm0,%%xmm1                   \n"
 | 
| -    "punpcklwd %%xmm2,%%xmm0                   \n"
 | 
| -    "punpckhwd %%xmm2,%%xmm1                   \n"
 | 
| -    "movdqu    %%xmm0," MEMACCESS([dst_argb]) "\n"
 | 
| -    "movdqu    %%xmm1," MEMACCESS2(0x10,[dst_argb]) "\n"
 | 
| -    "lea       " MEMLEA(0x20,[dst_argb]) ",%[dst_argb] \n"
 | 
| +    YUVTORGB(kYuvConstants)
 | 
| +    STOREARGB
 | 
|      "sub       $0x8,%[width]                   \n"
 | 
|      "jg        1b                              \n"
 | 
|    : [y_buf]"+r"(y_buf),    // %[y_buf]
 | 
| @@ -2625,45 +1757,31 @@ void OMITFP NV12ToARGBRow_Unaligned_SSSE3(const uint8* y_buf,
 | 
|      [dst_argb]"+r"(dst_argb),  // %[dst_argb]
 | 
|      [width]"+rm"(width)    // %[width]
 | 
|    : [kYuvConstants]"r"(&kYuvConstants.kUVToB) // %[kYuvConstants]
 | 
| -  : "memory", "cc"
 | 
|    // Does not use r14.
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
| -#endif
 | 
| +  : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm5"
 | 
|    );
 | 
|  }
 | 
|  
 | 
| -void OMITFP NV21ToARGBRow_Unaligned_SSSE3(const uint8* y_buf,
 | 
| -                                          const uint8* uv_buf,
 | 
| -                                          uint8* dst_argb,
 | 
| -                                          int width) {
 | 
| +void OMITFP NV21ToARGBRow_SSSE3(const uint8* y_buf,
 | 
| +                                const uint8* uv_buf,
 | 
| +                                uint8* dst_argb,
 | 
| +                                int width) {
 | 
|    asm volatile (
 | 
|      "pcmpeqb   %%xmm5,%%xmm5                   \n"
 | 
| -    "pxor      %%xmm4,%%xmm4                   \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
|      READNV12
 | 
| -    YVUTORGB
 | 
| -    "punpcklbw %%xmm1,%%xmm0                   \n"
 | 
| -    "punpcklbw %%xmm5,%%xmm2                   \n"
 | 
| -    "movdqa    %%xmm0,%%xmm1                   \n"
 | 
| -    "punpcklwd %%xmm2,%%xmm0                   \n"
 | 
| -    "punpckhwd %%xmm2,%%xmm1                   \n"
 | 
| -    "movdqu    %%xmm0," MEMACCESS([dst_argb]) "\n"
 | 
| -    "movdqu    %%xmm1," MEMACCESS2(0x10,[dst_argb]) "\n"
 | 
| -    "lea       " MEMLEA(0x20,[dst_argb]) ",%[dst_argb] \n"
 | 
| +    YUVTORGB(kYuvConstants)
 | 
| +    STOREARGB
 | 
|      "sub       $0x8,%[width]                   \n"
 | 
|      "jg        1b                              \n"
 | 
|    : [y_buf]"+r"(y_buf),    // %[y_buf]
 | 
|      [uv_buf]"+r"(uv_buf),    // %[uv_buf]
 | 
|      [dst_argb]"+r"(dst_argb),  // %[dst_argb]
 | 
|      [width]"+rm"(width)    // %[width]
 | 
| -  : [kYuvConstants]"r"(&kYuvConstants.kUVToB) // %[kYuvConstants]
 | 
| -  : "memory", "cc"
 | 
| +  : [kYuvConstants]"r"(&kYvuConstants.kUVToB) // %[kYuvConstants]
 | 
|    // Does not use r14.
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
| -#endif
 | 
| +  : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm5"
 | 
|    );
 | 
|  }
 | 
|  
 | 
| @@ -2675,20 +1793,11 @@ void OMITFP I422ToBGRARow_SSSE3(const uint8* y_buf,
 | 
|    asm volatile (
 | 
|      "sub       %[u_buf],%[v_buf]               \n"
 | 
|      "pcmpeqb   %%xmm5,%%xmm5                   \n"
 | 
| -    "pxor      %%xmm4,%%xmm4                   \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
|      READYUV422
 | 
| -    YUVTORGB
 | 
| -    "pcmpeqb   %%xmm5,%%xmm5                   \n"
 | 
| -    "punpcklbw %%xmm0,%%xmm1                   \n"
 | 
| -    "punpcklbw %%xmm2,%%xmm5                   \n"
 | 
| -    "movdqa    %%xmm5,%%xmm0                   \n"
 | 
| -    "punpcklwd %%xmm1,%%xmm5                   \n"
 | 
| -    "punpckhwd %%xmm1,%%xmm0                   \n"
 | 
| -    "movdqa    %%xmm5," MEMACCESS([dst_bgra]) "\n"
 | 
| -    "movdqa    %%xmm0," MEMACCESS2(0x10,[dst_bgra]) "\n"
 | 
| -    "lea       " MEMLEA(0x20,[dst_bgra]) ",%[dst_bgra] \n"
 | 
| +    YUVTORGB(kYuvConstants)
 | 
| +    STOREBGRA
 | 
|      "sub       $0x8,%[width]                   \n"
 | 
|      "jg        1b                              \n"
 | 
|    : [y_buf]"+r"(y_buf),    // %[y_buf]
 | 
| @@ -2697,13 +1806,8 @@ void OMITFP I422ToBGRARow_SSSE3(const uint8* y_buf,
 | 
|      [dst_bgra]"+r"(dst_bgra),  // %[dst_bgra]
 | 
|      [width]"+rm"(width)    // %[width]
 | 
|    : [kYuvConstants]"r"(&kYuvConstants.kUVToB) // %[kYuvConstants]
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
| -#endif
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm3", "xmm5"
 | 
|    );
 | 
|  }
 | 
|  
 | 
| @@ -2715,19 +1819,11 @@ void OMITFP I422ToABGRRow_SSSE3(const uint8* y_buf,
 | 
|    asm volatile (
 | 
|      "sub       %[u_buf],%[v_buf]               \n"
 | 
|      "pcmpeqb   %%xmm5,%%xmm5                   \n"
 | 
| -    "pxor      %%xmm4,%%xmm4                   \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
|      READYUV422
 | 
| -    YUVTORGB
 | 
| -    "punpcklbw %%xmm1,%%xmm2                   \n"
 | 
| -    "punpcklbw %%xmm5,%%xmm0                   \n"
 | 
| -    "movdqa    %%xmm2,%%xmm1                   \n"
 | 
| -    "punpcklwd %%xmm0,%%xmm2                   \n"
 | 
| -    "punpckhwd %%xmm0,%%xmm1                   \n"
 | 
| -    "movdqa    %%xmm2," MEMACCESS([dst_abgr]) "\n"
 | 
| -    "movdqa    %%xmm1," MEMACCESS2(0x10,[dst_abgr]) "\n"
 | 
| -    "lea       " MEMLEA(0x20,[dst_abgr]) ",%[dst_abgr] \n"
 | 
| +    YUVTORGB(kYuvConstants)
 | 
| +    STOREABGR
 | 
|      "sub       $0x8,%[width]                   \n"
 | 
|      "jg        1b                              \n"
 | 
|    : [y_buf]"+r"(y_buf),    // %[y_buf]
 | 
| @@ -2736,13 +1832,8 @@ void OMITFP I422ToABGRRow_SSSE3(const uint8* y_buf,
 | 
|      [dst_abgr]"+r"(dst_abgr),  // %[dst_abgr]
 | 
|      [width]"+rm"(width)    // %[width]
 | 
|    : [kYuvConstants]"r"(&kYuvConstants.kUVToB) // %[kYuvConstants]
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
| -#endif
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm3", "xmm5"
 | 
|    );
 | 
|  }
 | 
|  
 | 
| @@ -2754,20 +1845,11 @@ void OMITFP I422ToRGBARow_SSSE3(const uint8* y_buf,
 | 
|    asm volatile (
 | 
|      "sub       %[u_buf],%[v_buf]               \n"
 | 
|      "pcmpeqb   %%xmm5,%%xmm5                   \n"
 | 
| -    "pxor      %%xmm4,%%xmm4                   \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
|      READYUV422
 | 
| -    YUVTORGB
 | 
| -    "pcmpeqb   %%xmm5,%%xmm5                   \n"
 | 
| -    "punpcklbw %%xmm2,%%xmm1                   \n"
 | 
| -    "punpcklbw %%xmm0,%%xmm5                   \n"
 | 
| -    "movdqa    %%xmm5,%%xmm0                   \n"
 | 
| -    "punpcklwd %%xmm1,%%xmm5                   \n"
 | 
| -    "punpckhwd %%xmm1,%%xmm0                   \n"
 | 
| -    "movdqa    %%xmm5," MEMACCESS([dst_rgba]) "\n"
 | 
| -    "movdqa    %%xmm0," MEMACCESS2(0x10,[dst_rgba]) "\n"
 | 
| -    "lea       " MEMLEA(0x20,[dst_rgba]) ",%[dst_rgba] \n"
 | 
| +    YUVTORGB(kYuvConstants)
 | 
| +    STORERGBA
 | 
|      "sub       $0x8,%[width]                   \n"
 | 
|      "jg        1b                              \n"
 | 
|    : [y_buf]"+r"(y_buf),    // %[y_buf]
 | 
| @@ -2776,159 +1858,233 @@ void OMITFP I422ToRGBARow_SSSE3(const uint8* y_buf,
 | 
|      [dst_rgba]"+r"(dst_rgba),  // %[dst_rgba]
 | 
|      [width]"+rm"(width)    // %[width]
 | 
|    : [kYuvConstants]"r"(&kYuvConstants.kUVToB) // %[kYuvConstants]
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
| -#endif
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm3", "xmm5"
 | 
|    );
 | 
|  }
 | 
|  
 | 
| -void OMITFP I422ToBGRARow_Unaligned_SSSE3(const uint8* y_buf,
 | 
| -                                          const uint8* u_buf,
 | 
| -                                          const uint8* v_buf,
 | 
| -                                          uint8* dst_bgra,
 | 
| -                                          int width) {
 | 
| +#endif  // HAS_I422TOARGBROW_SSSE3
 | 
| +
 | 
| +// Read 8 UV from 422, upsample to 16 UV.
 | 
| +#define READYUV422_AVX2                                                        \
 | 
| +    "vmovq       " MEMACCESS([u_buf]) ",%%xmm0                      \n"        \
 | 
| +    MEMOPREG(vmovq, 0x00, [u_buf], [v_buf], 1, xmm1)                           \
 | 
| +    "lea        " MEMLEA(0x8, [u_buf]) ",%[u_buf]                   \n"        \
 | 
| +    "vpunpcklbw %%ymm1,%%ymm0,%%ymm0                                \n"        \
 | 
| +    "vpermq     $0xd8,%%ymm0,%%ymm0                                 \n"        \
 | 
| +    "vpunpcklwd %%ymm0,%%ymm0,%%ymm0                                \n"
 | 
| +
 | 
| +// Convert 16 pixels: 16 UV and 16 Y.
 | 
| +#define YUVTORGB_AVX2(YuvConstants)                                            \
 | 
| +    "vpmaddubsw  " MEMACCESS2(64, [YuvConstants]) ",%%ymm0,%%ymm2   \n"        \
 | 
| +    "vpmaddubsw  " MEMACCESS2(32, [YuvConstants]) ",%%ymm0,%%ymm1   \n"        \
 | 
| +    "vpmaddubsw  " MEMACCESS([YuvConstants]) ",%%ymm0,%%ymm0        \n"        \
 | 
| +    "vmovdqu     " MEMACCESS2(160, [YuvConstants]) ",%%ymm3         \n"        \
 | 
| +    "vpsubw      %%ymm2,%%ymm3,%%ymm2                               \n"        \
 | 
| +    "vmovdqu     " MEMACCESS2(128, [YuvConstants]) ",%%ymm2         \n"        \
 | 
| +    "vpsubw      %%ymm1,%%ymm2,%%ymm1                               \n"        \
 | 
| +    "vmovdqu     " MEMACCESS2(96, [YuvConstants]) ",%%ymm1          \n"        \
 | 
| +    "vpsubw      %%ymm0,%%ymm1,%%ymm0                               \n"        \
 | 
| +    "vmovdqu     " MEMACCESS([y_buf]) ",%%xmm3                      \n"        \
 | 
| +    "lea         " MEMLEA(0x10, [y_buf]) ",%[y_buf]                 \n"        \
 | 
| +    "vpermq      $0xd8,%%ymm3,%%ymm3                                \n"        \
 | 
| +    "vpunpcklbw  %%ymm3,%%ymm3,%%ymm3                               \n"        \
 | 
| +    "vpmulhuw    " MEMACCESS2(192, [YuvConstants]) ",%%ymm3,%%ymm3  \n"        \
 | 
| +    "vpaddsw     %%ymm3,%%ymm0,%%ymm0           \n"                            \
 | 
| +    "vpaddsw     %%ymm3,%%ymm1,%%ymm1           \n"                            \
 | 
| +    "vpaddsw     %%ymm3,%%ymm2,%%ymm2           \n"                            \
 | 
| +    "vpsraw      $0x6,%%ymm0,%%ymm0             \n"                            \
 | 
| +    "vpsraw      $0x6,%%ymm1,%%ymm1             \n"                            \
 | 
| +    "vpsraw      $0x6,%%ymm2,%%ymm2             \n"                            \
 | 
| +    "vpackuswb   %%ymm0,%%ymm0,%%ymm0           \n"                            \
 | 
| +    "vpackuswb   %%ymm1,%%ymm1,%%ymm1           \n"                            \
 | 
| +    "vpackuswb   %%ymm2,%%ymm2,%%ymm2           \n"
 | 
| +
 | 
| +#if defined(HAS_I422TOBGRAROW_AVX2)
 | 
| +// 16 pixels
 | 
| +// 8 UV values upsampled to 16 UV, mixed with 16 Y producing 16 BGRA (64 bytes).
 | 
| +void OMITFP I422ToBGRARow_AVX2(const uint8* y_buf,
 | 
| +                               const uint8* u_buf,
 | 
| +                               const uint8* v_buf,
 | 
| +                               uint8* dst_bgra,
 | 
| +                               int width) {
 | 
|    asm volatile (
 | 
|      "sub       %[u_buf],%[v_buf]               \n"
 | 
| -    "pcmpeqb   %%xmm5,%%xmm5                   \n"
 | 
| -    "pxor      %%xmm4,%%xmm4                   \n"
 | 
| +    "vpcmpeqb   %%ymm5,%%ymm5,%%ymm5           \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    READYUV422
 | 
| -    YUVTORGB
 | 
| -    "pcmpeqb   %%xmm5,%%xmm5                   \n"
 | 
| -    "punpcklbw %%xmm0,%%xmm1                   \n"
 | 
| -    "punpcklbw %%xmm2,%%xmm5                   \n"
 | 
| -    "movdqa    %%xmm5,%%xmm0                   \n"
 | 
| -    "punpcklwd %%xmm1,%%xmm5                   \n"
 | 
| -    "punpckhwd %%xmm1,%%xmm0                   \n"
 | 
| -    "movdqu    %%xmm5," MEMACCESS([dst_bgra]) "\n"
 | 
| -    "movdqu    %%xmm0," MEMACCESS2(0x10,[dst_bgra]) "\n"
 | 
| -    "lea       " MEMLEA(0x20,[dst_bgra]) ",%[dst_bgra] \n"
 | 
| -    "sub       $0x8,%[width]                   \n"
 | 
| +    READYUV422_AVX2
 | 
| +    YUVTORGB_AVX2(kYuvConstants)
 | 
| +
 | 
| +    // Step 3: Weave into BGRA
 | 
| +    "vpunpcklbw %%ymm0,%%ymm1,%%ymm1           \n"  // GB
 | 
| +    "vpermq     $0xd8,%%ymm1,%%ymm1            \n"
 | 
| +    "vpunpcklbw %%ymm2,%%ymm5,%%ymm2           \n"  // AR
 | 
| +    "vpermq     $0xd8,%%ymm2,%%ymm2            \n"
 | 
| +    "vpunpcklwd %%ymm1,%%ymm2,%%ymm0           \n"  // ARGB first 8 pixels
 | 
| +    "vpunpckhwd %%ymm1,%%ymm2,%%ymm2           \n"  // ARGB next 8 pixels
 | 
| +
 | 
| +    "vmovdqu    %%ymm0," MEMACCESS([dst_bgra]) "\n"
 | 
| +    "vmovdqu    %%ymm2," MEMACCESS2(0x20,[dst_bgra]) "\n"
 | 
| +    "lea       " MEMLEA(0x40,[dst_bgra]) ",%[dst_bgra] \n"
 | 
| +    "sub       $0x10,%[width]                  \n"
 | 
|      "jg        1b                              \n"
 | 
| +    "vzeroupper                                \n"
 | 
|    : [y_buf]"+r"(y_buf),    // %[y_buf]
 | 
|      [u_buf]"+r"(u_buf),    // %[u_buf]
 | 
|      [v_buf]"+r"(v_buf),    // %[v_buf]
 | 
|      [dst_bgra]"+r"(dst_bgra),  // %[dst_bgra]
 | 
|      [width]"+rm"(width)    // %[width]
 | 
| -  : [kYuvConstants]"r"(&kYuvConstants.kUVToB) // %[kYuvConstants]
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
| -#endif
 | 
| +  : [kYuvConstants]"r"(&kYuvConstants.kUVToB)  // %[kYuvConstants]
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm3", "xmm5"
 | 
|    );
 | 
|  }
 | 
| +#endif  // HAS_I422TOBGRAROW_AVX2
 | 
|  
 | 
| -void OMITFP I422ToABGRRow_Unaligned_SSSE3(const uint8* y_buf,
 | 
| -                                          const uint8* u_buf,
 | 
| -                                          const uint8* v_buf,
 | 
| -                                          uint8* dst_abgr,
 | 
| -                                          int width) {
 | 
| +#if defined(HAS_I422TOARGBROW_AVX2)
 | 
| +// 16 pixels
 | 
| +// 8 UV values upsampled to 16 UV, mixed with 16 Y producing 16 ARGB (64 bytes).
 | 
| +void OMITFP I422ToARGBRow_AVX2(const uint8* y_buf,
 | 
| +                               const uint8* u_buf,
 | 
| +                               const uint8* v_buf,
 | 
| +                               uint8* dst_argb,
 | 
| +                               int width) {
 | 
|    asm volatile (
 | 
|      "sub       %[u_buf],%[v_buf]               \n"
 | 
| -    "pcmpeqb   %%xmm5,%%xmm5                   \n"
 | 
| -    "pxor      %%xmm4,%%xmm4                   \n"
 | 
| +    "vpcmpeqb   %%ymm5,%%ymm5,%%ymm5           \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    READYUV422
 | 
| -    YUVTORGB
 | 
| -    "punpcklbw %%xmm1,%%xmm2                   \n"
 | 
| -    "punpcklbw %%xmm5,%%xmm0                   \n"
 | 
| -    "movdqa    %%xmm2,%%xmm1                   \n"
 | 
| -    "punpcklwd %%xmm0,%%xmm2                   \n"
 | 
| -    "punpckhwd %%xmm0,%%xmm1                   \n"
 | 
| -    "movdqu    %%xmm2," MEMACCESS([dst_abgr]) "\n"
 | 
| -    "movdqu    %%xmm1," MEMACCESS2(0x10,[dst_abgr]) "\n"
 | 
| -    "lea       " MEMLEA(0x20,[dst_abgr]) ",%[dst_abgr] \n"
 | 
| -    "sub       $0x8,%[width]                   \n"
 | 
| +    READYUV422_AVX2
 | 
| +    YUVTORGB_AVX2(kYuvConstants)
 | 
| +
 | 
| +    // Step 3: Weave into ARGB
 | 
| +    "vpunpcklbw %%ymm1,%%ymm0,%%ymm0           \n"  // BG
 | 
| +    "vpermq     $0xd8,%%ymm0,%%ymm0            \n"
 | 
| +    "vpunpcklbw %%ymm5,%%ymm2,%%ymm2           \n"  // RA
 | 
| +    "vpermq     $0xd8,%%ymm2,%%ymm2            \n"
 | 
| +    "vpunpcklwd %%ymm2,%%ymm0,%%ymm1           \n"  // BGRA first 8 pixels
 | 
| +    "vpunpckhwd %%ymm2,%%ymm0,%%ymm0           \n"  // BGRA next 8 pixels
 | 
| +
 | 
| +    "vmovdqu    %%ymm1," MEMACCESS([dst_argb]) "\n"
 | 
| +    "vmovdqu    %%ymm0," MEMACCESS2(0x20,[dst_argb]) "\n"
 | 
| +    "lea       " MEMLEA(0x40,[dst_argb]) ",%[dst_argb] \n"
 | 
| +    "sub       $0x10,%[width]                  \n"
 | 
|      "jg        1b                              \n"
 | 
| +    "vzeroupper                                \n"
 | 
|    : [y_buf]"+r"(y_buf),    // %[y_buf]
 | 
|      [u_buf]"+r"(u_buf),    // %[u_buf]
 | 
|      [v_buf]"+r"(v_buf),    // %[v_buf]
 | 
| -    [dst_abgr]"+r"(dst_abgr),  // %[dst_abgr]
 | 
| +    [dst_argb]"+r"(dst_argb),  // %[dst_argb]
 | 
|      [width]"+rm"(width)    // %[width]
 | 
| -  : [kYuvConstants]"r"(&kYuvConstants.kUVToB) // %[kYuvConstants]
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
| -#endif
 | 
| +  : [kYuvConstants]"r"(&kYuvConstants.kUVToB)  // %[kYuvConstants]
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm3", "xmm5"
 | 
|    );
 | 
|  }
 | 
| +#endif  // HAS_I422TOARGBROW_AVX2
 | 
|  
 | 
| -void OMITFP I422ToRGBARow_Unaligned_SSSE3(const uint8* y_buf,
 | 
| -                                          const uint8* u_buf,
 | 
| -                                          const uint8* v_buf,
 | 
| -                                          uint8* dst_rgba,
 | 
| -                                          int width) {
 | 
| +#if defined(HAS_I422TOABGRROW_AVX2)
 | 
| +// 16 pixels
 | 
| +// 8 UV values upsampled to 16 UV, mixed with 16 Y producing 16 ABGR (64 bytes).
 | 
| +void OMITFP I422ToABGRRow_AVX2(const uint8* y_buf,
 | 
| +                               const uint8* u_buf,
 | 
| +                               const uint8* v_buf,
 | 
| +                               uint8* dst_argb,
 | 
| +                               int width) {
 | 
|    asm volatile (
 | 
|      "sub       %[u_buf],%[v_buf]               \n"
 | 
| -    "pcmpeqb   %%xmm5,%%xmm5                   \n"
 | 
| -    "pxor      %%xmm4,%%xmm4                   \n"
 | 
| +    "vpcmpeqb   %%ymm5,%%ymm5,%%ymm5           \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    READYUV422
 | 
| -    YUVTORGB
 | 
| -    "pcmpeqb   %%xmm5,%%xmm5                   \n"
 | 
| -    "punpcklbw %%xmm2,%%xmm1                   \n"
 | 
| -    "punpcklbw %%xmm0,%%xmm5                   \n"
 | 
| -    "movdqa    %%xmm5,%%xmm0                   \n"
 | 
| -    "punpcklwd %%xmm1,%%xmm5                   \n"
 | 
| -    "punpckhwd %%xmm1,%%xmm0                   \n"
 | 
| -    "movdqu    %%xmm5," MEMACCESS([dst_rgba]) "\n"
 | 
| -    "movdqu    %%xmm0," MEMACCESS2(0x10,[dst_rgba]) "\n"
 | 
| -    "lea       " MEMLEA(0x20,[dst_rgba]) ",%[dst_rgba] \n"
 | 
| -    "sub       $0x8,%[width]                   \n"
 | 
| +    READYUV422_AVX2
 | 
| +    YUVTORGB_AVX2(kYuvConstants)
 | 
| +
 | 
| +    // Step 3: Weave into ABGR
 | 
| +    "vpunpcklbw %%ymm1,%%ymm2,%%ymm1           \n"  // RG
 | 
| +    "vpermq     $0xd8,%%ymm1,%%ymm1            \n"
 | 
| +    "vpunpcklbw %%ymm5,%%ymm0,%%ymm2           \n"  // BA
 | 
| +    "vpermq     $0xd8,%%ymm2,%%ymm2            \n"
 | 
| +    "vpunpcklwd %%ymm2,%%ymm1,%%ymm0           \n"  // RGBA first 8 pixels
 | 
| +    "vpunpckhwd %%ymm2,%%ymm1,%%ymm1           \n"  // RGBA next 8 pixels
 | 
| +    "vmovdqu    %%ymm0," MEMACCESS([dst_argb]) "\n"
 | 
| +    "vmovdqu    %%ymm1," MEMACCESS2(0x20,[dst_argb]) "\n"
 | 
| +    "lea       " MEMLEA(0x40,[dst_argb]) ",%[dst_argb] \n"
 | 
| +    "sub       $0x10,%[width]                  \n"
 | 
|      "jg        1b                              \n"
 | 
| +    "vzeroupper                                \n"
 | 
|    : [y_buf]"+r"(y_buf),    // %[y_buf]
 | 
|      [u_buf]"+r"(u_buf),    // %[u_buf]
 | 
|      [v_buf]"+r"(v_buf),    // %[v_buf]
 | 
| -    [dst_rgba]"+r"(dst_rgba),  // %[dst_rgba]
 | 
| +    [dst_argb]"+r"(dst_argb),  // %[dst_argb]
 | 
|      [width]"+rm"(width)    // %[width]
 | 
| -  : [kYuvConstants]"r"(&kYuvConstants.kUVToB) // %[kYuvConstants]
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
| -#endif
 | 
| +  : [kYuvConstants]"r"(&kYuvConstants.kUVToB)  // %[kYuvConstants]
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm3", "xmm5"
 | 
|    );
 | 
|  }
 | 
| +#endif  // HAS_I422TOABGRROW_AVX2
 | 
|  
 | 
| -#endif  // HAS_I422TOARGBROW_SSSE3
 | 
| +#if defined(HAS_I422TORGBAROW_AVX2)
 | 
| +// 16 pixels
 | 
| +// 8 UV values upsampled to 16 UV, mixed with 16 Y producing 16 RGBA (64 bytes).
 | 
| +void OMITFP I422ToRGBARow_AVX2(const uint8* y_buf,
 | 
| +                               const uint8* u_buf,
 | 
| +                               const uint8* v_buf,
 | 
| +                               uint8* dst_argb,
 | 
| +                               int width) {
 | 
| +  asm volatile (
 | 
| +    "sub       %[u_buf],%[v_buf]               \n"
 | 
| +    "vpcmpeqb   %%ymm5,%%ymm5,%%ymm5           \n"
 | 
| +    LABELALIGN
 | 
| +  "1:                                          \n"
 | 
| +    READYUV422_AVX2
 | 
| +    YUVTORGB_AVX2(kYuvConstants)
 | 
| +
 | 
| +    // Step 3: Weave into RGBA
 | 
| +    "vpunpcklbw %%ymm2,%%ymm1,%%ymm1           \n"
 | 
| +    "vpermq     $0xd8,%%ymm1,%%ymm1            \n"
 | 
| +    "vpunpcklbw %%ymm0,%%ymm5,%%ymm2           \n"
 | 
| +    "vpermq     $0xd8,%%ymm2,%%ymm2            \n"
 | 
| +    "vpunpcklwd %%ymm1,%%ymm2,%%ymm0           \n"
 | 
| +    "vpunpckhwd %%ymm1,%%ymm2,%%ymm1           \n"
 | 
| +    "vmovdqu    %%ymm0," MEMACCESS([dst_argb]) "\n"
 | 
| +    "vmovdqu    %%ymm1," MEMACCESS2(0x20,[dst_argb]) "\n"
 | 
| +    "lea       " MEMLEA(0x40,[dst_argb]) ",%[dst_argb] \n"
 | 
| +    "sub       $0x10,%[width]                  \n"
 | 
| +    "jg        1b                              \n"
 | 
| +    "vzeroupper                                \n"
 | 
| +  : [y_buf]"+r"(y_buf),    // %[y_buf]
 | 
| +    [u_buf]"+r"(u_buf),    // %[u_buf]
 | 
| +    [v_buf]"+r"(v_buf),    // %[v_buf]
 | 
| +    [dst_argb]"+r"(dst_argb),  // %[dst_argb]
 | 
| +    [width]"+rm"(width)    // %[width]
 | 
| +  : [kYuvConstants]"r"(&kYuvConstants.kUVToB)  // %[kYuvConstants]
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm3", "xmm5"
 | 
| +  );
 | 
| +}
 | 
| +#endif  // HAS_I422TORGBAROW_AVX2
 | 
|  
 | 
|  #ifdef HAS_YTOARGBROW_SSE2
 | 
| -void YToARGBRow_SSE2(const uint8* y_buf,
 | 
| -                     uint8* dst_argb,
 | 
| -                     int width) {
 | 
| +void YToARGBRow_SSE2(const uint8* y_buf, uint8* dst_argb, int width) {
 | 
|    asm volatile (
 | 
| -    "pxor      %%xmm5,%%xmm5                   \n"
 | 
| -    "pcmpeqb   %%xmm4,%%xmm4                   \n"
 | 
| -    "pslld     $0x18,%%xmm4                    \n"
 | 
| -    "mov       $0x00100010,%%eax               \n"
 | 
| -    "movd      %%eax,%%xmm3                    \n"
 | 
| -    "pshufd    $0x0,%%xmm3,%%xmm3              \n"
 | 
| -    "mov       $0x004a004a,%%eax               \n"
 | 
| +    "mov       $0x4a354a35,%%eax               \n"  // 4a35 = 18997 = 1.164
 | 
|      "movd      %%eax,%%xmm2                    \n"
 | 
|      "pshufd    $0x0,%%xmm2,%%xmm2              \n"
 | 
| +    "mov       $0x04880488,%%eax               \n"  // 0488 = 1160 = 1.164 * 16
 | 
| +    "movd      %%eax,%%xmm3                    \n"
 | 
| +    "pshufd    $0x0,%%xmm3,%%xmm3              \n"
 | 
| +    "pcmpeqb   %%xmm4,%%xmm4                   \n"
 | 
| +    "pslld     $0x18,%%xmm4                    \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
|      // Step 1: Scale Y contribution to 8 G values. G = (y - 16) * 1.164
 | 
|      "movq      " MEMACCESS(0) ",%%xmm0         \n"
 | 
|      "lea       " MEMLEA(0x8,0) ",%0            \n"
 | 
| -    "punpcklbw %%xmm5,%%xmm0                   \n"
 | 
| +    "punpcklbw %%xmm0,%%xmm0                   \n"
 | 
| +    "pmulhuw   %%xmm2,%%xmm0                   \n"
 | 
|      "psubusw   %%xmm3,%%xmm0                   \n"
 | 
| -    "pmullw    %%xmm2,%%xmm0                   \n"
 | 
|      "psrlw     $6, %%xmm0                      \n"
 | 
|      "packuswb  %%xmm0,%%xmm0                   \n"
 | 
|  
 | 
| @@ -2939,23 +2095,68 @@ void YToARGBRow_SSE2(const uint8* y_buf,
 | 
|      "punpckhwd %%xmm1,%%xmm1                   \n"
 | 
|      "por       %%xmm4,%%xmm0                   \n"
 | 
|      "por       %%xmm4,%%xmm1                   \n"
 | 
| -    "movdqa    %%xmm0," MEMACCESS(1) "         \n"
 | 
| -    "movdqa    %%xmm1," MEMACCESS2(0x10,1) "   \n"
 | 
| +    "movdqu    %%xmm0," MEMACCESS(1) "         \n"
 | 
| +    "movdqu    %%xmm1," MEMACCESS2(0x10,1) "   \n"
 | 
|      "lea       " MEMLEA(0x20,1) ",%1           \n"
 | 
|  
 | 
| -    "sub       $0x8,%2                         \n"
 | 
| +    "sub       $0x8,%2                         \n"
 | 
| +    "jg        1b                              \n"
 | 
| +  : "+r"(y_buf),     // %0
 | 
| +    "+r"(dst_argb),  // %1
 | 
| +    "+rm"(width)     // %2
 | 
| +  :
 | 
| +  : "memory", "cc", "eax"
 | 
| +    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4"
 | 
| +  );
 | 
| +}
 | 
| +#endif  // HAS_YTOARGBROW_SSE2
 | 
| +
 | 
| +#ifdef HAS_YTOARGBROW_AVX2
 | 
| +// 16 pixels of Y converted to 16 pixels of ARGB (64 bytes).
 | 
| +// note: vpunpcklbw mutates and vpackuswb unmutates.
 | 
| +void YToARGBRow_AVX2(const uint8* y_buf, uint8* dst_argb, int width) {
 | 
| +  asm volatile (
 | 
| +    "mov        $0x4a354a35,%%eax              \n" // 0488 = 1160 = 1.164 * 16
 | 
| +    "vmovd      %%eax,%%xmm2                   \n"
 | 
| +    "vbroadcastss %%xmm2,%%ymm2                \n"
 | 
| +    "mov        $0x4880488,%%eax               \n" // 4a35 = 18997 = 1.164
 | 
| +    "vmovd      %%eax,%%xmm3                   \n"
 | 
| +    "vbroadcastss %%xmm3,%%ymm3                \n"
 | 
| +    "vpcmpeqb   %%ymm4,%%ymm4,%%ymm4           \n"
 | 
| +    "vpslld     $0x18,%%ymm4,%%ymm4            \n"
 | 
| +
 | 
| +    LABELALIGN
 | 
| +  "1:                                          \n"
 | 
| +    // Step 1: Scale Y contribution to 16 G values. G = (y - 16) * 1.164
 | 
| +    "vmovdqu    " MEMACCESS(0) ",%%xmm0        \n"
 | 
| +    "lea        " MEMLEA(0x10,0) ",%0          \n"
 | 
| +    "vpermq     $0xd8,%%ymm0,%%ymm0            \n"
 | 
| +    "vpunpcklbw %%ymm0,%%ymm0,%%ymm0           \n"
 | 
| +    "vpmulhuw   %%ymm2,%%ymm0,%%ymm0           \n"
 | 
| +    "vpsubusw   %%ymm3,%%ymm0,%%ymm0           \n"
 | 
| +    "vpsrlw     $0x6,%%ymm0,%%ymm0             \n"
 | 
| +    "vpackuswb  %%ymm0,%%ymm0,%%ymm0           \n"
 | 
| +    "vpunpcklbw %%ymm0,%%ymm0,%%ymm1           \n"
 | 
| +    "vpermq     $0xd8,%%ymm1,%%ymm1            \n"
 | 
| +    "vpunpcklwd %%ymm1,%%ymm1,%%ymm0           \n"
 | 
| +    "vpunpckhwd %%ymm1,%%ymm1,%%ymm1           \n"
 | 
| +    "vpor       %%ymm4,%%ymm0,%%ymm0           \n"
 | 
| +    "vpor       %%ymm4,%%ymm1,%%ymm1           \n"
 | 
| +    "vmovdqu    %%ymm0," MEMACCESS(1) "        \n"
 | 
| +    "vmovdqu    %%ymm1," MEMACCESS2(0x20,1) "  \n"
 | 
| +    "lea       " MEMLEA(0x40,1) ",%1           \n"
 | 
| +    "sub        $0x10,%2                       \n"
 | 
|      "jg        1b                              \n"
 | 
| +    "vzeroupper                                \n"
 | 
|    : "+r"(y_buf),     // %0
 | 
|      "+r"(dst_argb),  // %1
 | 
|      "+rm"(width)     // %2
 | 
|    :
 | 
|    : "memory", "cc", "eax"
 | 
| -#if defined(__SSE2__)
 | 
|      , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4"
 | 
| -#endif
 | 
|    );
 | 
|  }
 | 
| -#endif  // HAS_YTOARGBROW_SSE2
 | 
| +#endif  // HAS_YTOARGBROW_AVX2
 | 
|  
 | 
|  #ifdef HAS_MIRRORROW_SSSE3
 | 
|  // Shuffle table for reversing the bytes.
 | 
| @@ -2967,38 +2168,56 @@ void MirrorRow_SSSE3(const uint8* src, uint8* dst, int width) {
 | 
|    intptr_t temp_width = (intptr_t)(width);
 | 
|    asm volatile (
 | 
|      "movdqa    %3,%%xmm5                       \n"
 | 
| -    "lea       " MEMLEA(-0x10,0) ",%0          \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    MEMOPREG(movdqa,0x00,0,2,1,xmm0)           //  movdqa  (%0,%2),%%xmm0
 | 
| +    MEMOPREG(movdqu,-0x10,0,2,1,xmm0)          //  movdqu -0x10(%0,%2),%%xmm0
 | 
|      "pshufb    %%xmm5,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%2                        \n"
 | 
| -    "movdqa    %%xmm0," MEMACCESS(1) "         \n"
 | 
| +    "movdqu    %%xmm0," MEMACCESS(1) "         \n"
 | 
|      "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| +    "sub       $0x10,%2                        \n"
 | 
|      "jg        1b                              \n"
 | 
|    : "+r"(src),  // %0
 | 
|      "+r"(dst),  // %1
 | 
|      "+r"(temp_width)  // %2
 | 
|    : "m"(kShuffleMirror) // %3
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm5"
 | 
| -#endif
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm5"
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_MIRRORROW_SSSE3
 | 
|  
 | 
| +#ifdef HAS_MIRRORROW_AVX2
 | 
| +void MirrorRow_AVX2(const uint8* src, uint8* dst, int width) {
 | 
| +  intptr_t temp_width = (intptr_t)(width);
 | 
| +  asm volatile (
 | 
| +    "vbroadcastf128 %3,%%ymm5                  \n"
 | 
| +    LABELALIGN
 | 
| +  "1:                                          \n"
 | 
| +    MEMOPREG(vmovdqu,-0x20,0,2,1,ymm0)         //  vmovdqu -0x20(%0,%2),%%ymm0
 | 
| +    "vpshufb    %%ymm5,%%ymm0,%%ymm0           \n"
 | 
| +    "vpermq     $0x4e,%%ymm0,%%ymm0            \n"
 | 
| +    "vmovdqu    %%ymm0," MEMACCESS(1) "        \n"
 | 
| +    "lea       " MEMLEA(0x20,1) ",%1           \n"
 | 
| +    "sub       $0x20,%2                        \n"
 | 
| +    "jg        1b                              \n"
 | 
| +    "vzeroupper                                \n"
 | 
| +  : "+r"(src),  // %0
 | 
| +    "+r"(dst),  // %1
 | 
| +    "+r"(temp_width)  // %2
 | 
| +  : "m"(kShuffleMirror) // %3
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm5"
 | 
| +  );
 | 
| +}
 | 
| +#endif  // HAS_MIRRORROW_AVX2
 | 
| +
 | 
|  #ifdef HAS_MIRRORROW_SSE2
 | 
|  void MirrorRow_SSE2(const uint8* src, uint8* dst, int width) {
 | 
|    intptr_t temp_width = (intptr_t)(width);
 | 
|    asm volatile (
 | 
| -    "lea       " MEMLEA(-0x10,0) ",%0          \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    MEMOPREG(movdqu,0x00,0,2,1,xmm0)           //  movdqu  (%0,%2),%%xmm0
 | 
| +    MEMOPREG(movdqu,-0x10,0,2,1,xmm0)          //  movdqu -0x10(%0,%2),%%xmm0
 | 
|      "movdqa    %%xmm0,%%xmm1                   \n"
 | 
|      "psllw     $0x8,%%xmm0                     \n"
 | 
|      "psrlw     $0x8,%%xmm1                     \n"
 | 
| @@ -3006,21 +2225,16 @@ void MirrorRow_SSE2(const uint8* src, uint8* dst, int width) {
 | 
|      "pshuflw   $0x1b,%%xmm0,%%xmm0             \n"
 | 
|      "pshufhw   $0x1b,%%xmm0,%%xmm0             \n"
 | 
|      "pshufd    $0x4e,%%xmm0,%%xmm0             \n"
 | 
| -    "sub       $0x10,%2                        \n"
 | 
|      "movdqu    %%xmm0," MEMACCESS(1) "         \n"
 | 
|      "lea       " MEMLEA(0x10,1)",%1            \n"
 | 
| +    "sub       $0x10,%2                        \n"
 | 
|      "jg        1b                              \n"
 | 
|    : "+r"(src),  // %0
 | 
|      "+r"(dst),  // %1
 | 
|      "+r"(temp_width)  // %2
 | 
|    :
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1"
 | 
| -#endif
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1"
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_MIRRORROW_SSE2
 | 
| @@ -3035,108 +2249,119 @@ void MirrorUVRow_SSSE3(const uint8* src, uint8* dst_u, uint8* dst_v,
 | 
|    intptr_t temp_width = (intptr_t)(width);
 | 
|    asm volatile (
 | 
|      "movdqa    %4,%%xmm1                       \n"
 | 
| -    "lea       " MEMLEA4(-0x10,0,3,2) ",%0       \n"
 | 
| +    "lea       " MEMLEA4(-0x10,0,3,2) ",%0     \n"
 | 
|      "sub       %1,%2                           \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "lea       " MEMLEA(-0x10,0) ",%0            \n"
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| +    "lea       " MEMLEA(-0x10,0) ",%0          \n"
 | 
|      "pshufb    %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $8,%3                           \n"
 | 
|      "movlpd    %%xmm0," MEMACCESS(1) "         \n"
 | 
| -    BUNDLEALIGN
 | 
|      MEMOPMEM(movhpd,xmm0,0x00,1,2,1)           //  movhpd    %%xmm0,(%1,%2)
 | 
|      "lea       " MEMLEA(0x8,1) ",%1            \n"
 | 
| +    "sub       $8,%3                           \n"
 | 
|      "jg        1b                              \n"
 | 
|    : "+r"(src),      // %0
 | 
|      "+r"(dst_u),    // %1
 | 
|      "+r"(dst_v),    // %2
 | 
|      "+r"(temp_width)  // %3
 | 
|    : "m"(kShuffleMirrorUV)  // %4
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1"
 | 
| -#endif
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1"
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_MIRRORROW_UV_SSSE3
 | 
|  
 | 
| -#ifdef HAS_ARGBMIRRORROW_SSSE3
 | 
| -// Shuffle table for reversing the bytes.
 | 
| -static uvec8 kARGBShuffleMirror = {
 | 
| -  12u, 13u, 14u, 15u, 8u, 9u, 10u, 11u, 4u, 5u, 6u, 7u, 0u, 1u, 2u, 3u
 | 
| -};
 | 
| +#ifdef HAS_ARGBMIRRORROW_SSE2
 | 
|  
 | 
| -void ARGBMirrorRow_SSSE3(const uint8* src, uint8* dst, int width) {
 | 
| +void ARGBMirrorRow_SSE2(const uint8* src, uint8* dst, int width) {
 | 
|    intptr_t temp_width = (intptr_t)(width);
 | 
|    asm volatile (
 | 
|      "lea       " MEMLEA4(-0x10,0,2,4) ",%0     \n"
 | 
| -    "movdqa    %3,%%xmm5                       \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "pshufb    %%xmm5,%%xmm0                   \n"
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| +    "pshufd    $0x1b,%%xmm0,%%xmm0             \n"
 | 
|      "lea       " MEMLEA(-0x10,0) ",%0          \n"
 | 
| -    "sub       $0x4,%2                         \n"
 | 
| -    "movdqa    %%xmm0," MEMACCESS(1) "         \n"
 | 
| +    "movdqu    %%xmm0," MEMACCESS(1) "         \n"
 | 
|      "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| +    "sub       $0x4,%2                         \n"
 | 
|      "jg        1b                              \n"
 | 
|    : "+r"(src),  // %0
 | 
|      "+r"(dst),  // %1
 | 
|      "+r"(temp_width)  // %2
 | 
| -  : "m"(kARGBShuffleMirror)  // %3
 | 
| +  :
 | 
|    : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm5"
 | 
| -#endif
 | 
| +    , "xmm0"
 | 
|    );
 | 
|  }
 | 
| -#endif  // HAS_ARGBMIRRORROW_SSSE3
 | 
| +#endif  // HAS_ARGBMIRRORROW_SSE2
 | 
|  
 | 
| -#ifdef HAS_SPLITUVROW_SSE2
 | 
| -void SplitUVRow_SSE2(const uint8* src_uv, uint8* dst_u, uint8* dst_v, int pix) {
 | 
| +#ifdef HAS_ARGBMIRRORROW_AVX2
 | 
| +// Shuffle table for reversing the bytes.
 | 
| +static const ulvec32 kARGBShuffleMirror_AVX2 = {
 | 
| +  7u, 6u, 5u, 4u, 3u, 2u, 1u, 0u
 | 
| +};
 | 
| +void ARGBMirrorRow_AVX2(const uint8* src, uint8* dst, int width) {
 | 
| +  intptr_t temp_width = (intptr_t)(width);
 | 
|    asm volatile (
 | 
| -    "pcmpeqb    %%xmm5,%%xmm5                    \n"
 | 
| -    "psrlw      $0x8,%%xmm5                      \n"
 | 
| +    "vmovdqu    %3,%%ymm5                      \n"
 | 
| +    LABELALIGN
 | 
| +  "1:                                          \n"
 | 
| +    VMEMOPREG(vpermd,-0x20,0,2,4,ymm5,ymm0) // vpermd -0x20(%0,%2,4),ymm5,ymm0
 | 
| +    "vmovdqu    %%ymm0," MEMACCESS(1) "        \n"
 | 
| +    "lea        " MEMLEA(0x20,1) ",%1          \n"
 | 
| +    "sub        $0x8,%2                        \n"
 | 
| +    "jg         1b                             \n"
 | 
| +    "vzeroupper                                \n"
 | 
| +  : "+r"(src),  // %0
 | 
| +    "+r"(dst),  // %1
 | 
| +    "+r"(temp_width)  // %2
 | 
| +  : "m"(kARGBShuffleMirror_AVX2) // %3
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm5"
 | 
| +  );
 | 
| +}
 | 
| +#endif  // HAS_ARGBMIRRORROW_AVX2
 | 
| +
 | 
| +#ifdef HAS_SPLITUVROW_AVX2
 | 
| +void SplitUVRow_AVX2(const uint8* src_uv, uint8* dst_u, uint8* dst_v, int pix) {
 | 
| +  asm volatile (
 | 
| +    "vpcmpeqb   %%ymm5,%%ymm5,%%ymm5             \n"
 | 
| +    "vpsrlw     $0x8,%%ymm5,%%ymm5               \n"
 | 
|      "sub        %1,%2                            \n"
 | 
|      LABELALIGN
 | 
|    "1:                                            \n"
 | 
| -    "movdqa     " MEMACCESS(0) ",%%xmm0          \n"
 | 
| -    "movdqa     " MEMACCESS2(0x10,0) ",%%xmm1    \n"
 | 
| -    "lea        " MEMLEA(0x20,0) ",%0            \n"
 | 
| -    "movdqa     %%xmm0,%%xmm2                    \n"
 | 
| -    "movdqa     %%xmm1,%%xmm3                    \n"
 | 
| -    "pand       %%xmm5,%%xmm0                    \n"
 | 
| -    "pand       %%xmm5,%%xmm1                    \n"
 | 
| -    "packuswb   %%xmm1,%%xmm0                    \n"
 | 
| -    "psrlw      $0x8,%%xmm2                      \n"
 | 
| -    "psrlw      $0x8,%%xmm3                      \n"
 | 
| -    "packuswb   %%xmm3,%%xmm2                    \n"
 | 
| -    "movdqa     %%xmm0," MEMACCESS(1) "          \n"
 | 
| -    MEMOPMEM(movdqa,xmm2,0x00,1,2,1)             // movdqa     %%xmm2,(%1,%2)
 | 
| -    "lea        " MEMLEA(0x10,1) ",%1            \n"
 | 
| -    "sub        $0x10,%3                         \n"
 | 
| +    "vmovdqu    " MEMACCESS(0) ",%%ymm0          \n"
 | 
| +    "vmovdqu    " MEMACCESS2(0x20,0) ",%%ymm1    \n"
 | 
| +    "lea        " MEMLEA(0x40,0) ",%0            \n"
 | 
| +    "vpsrlw     $0x8,%%ymm0,%%ymm2               \n"
 | 
| +    "vpsrlw     $0x8,%%ymm1,%%ymm3               \n"
 | 
| +    "vpand      %%ymm5,%%ymm0,%%ymm0             \n"
 | 
| +    "vpand      %%ymm5,%%ymm1,%%ymm1             \n"
 | 
| +    "vpackuswb  %%ymm1,%%ymm0,%%ymm0             \n"
 | 
| +    "vpackuswb  %%ymm3,%%ymm2,%%ymm2             \n"
 | 
| +    "vpermq     $0xd8,%%ymm0,%%ymm0              \n"
 | 
| +    "vpermq     $0xd8,%%ymm2,%%ymm2              \n"
 | 
| +    "vmovdqu    %%ymm0," MEMACCESS(1) "          \n"
 | 
| +    MEMOPMEM(vmovdqu,ymm2,0x00,1,2,1)             //  vmovdqu %%ymm2,(%1,%2)
 | 
| +    "lea        " MEMLEA(0x20,1) ",%1            \n"
 | 
| +    "sub        $0x20,%3                         \n"
 | 
|      "jg         1b                               \n"
 | 
| +    "vzeroupper                                  \n"
 | 
|    : "+r"(src_uv),     // %0
 | 
|      "+r"(dst_u),      // %1
 | 
|      "+r"(dst_v),      // %2
 | 
|      "+r"(pix)         // %3
 | 
|    :
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm5"
 | 
| -#endif
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm3", "xmm5"
 | 
|    );
 | 
|  }
 | 
| +#endif  // HAS_SPLITUVROW_AVX2
 | 
|  
 | 
| -void SplitUVRow_Unaligned_SSE2(const uint8* src_uv, uint8* dst_u, uint8* dst_v,
 | 
| -                               int pix) {
 | 
| +#ifdef HAS_SPLITUVROW_SSE2
 | 
| +void SplitUVRow_SSE2(const uint8* src_uv, uint8* dst_u, uint8* dst_v, int pix) {
 | 
|    asm volatile (
 | 
|      "pcmpeqb    %%xmm5,%%xmm5                    \n"
 | 
|      "psrlw      $0x8,%%xmm5                      \n"
 | 
| @@ -3164,52 +2389,46 @@ void SplitUVRow_Unaligned_SSE2(const uint8* src_uv, uint8* dst_u, uint8* dst_v,
 | 
|      "+r"(dst_v),      // %2
 | 
|      "+r"(pix)         // %3
 | 
|    :
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm5"
 | 
| -#endif
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm3", "xmm5"
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_SPLITUVROW_SSE2
 | 
|  
 | 
| -#ifdef HAS_MERGEUVROW_SSE2
 | 
| -void MergeUVRow_SSE2(const uint8* src_u, const uint8* src_v, uint8* dst_uv,
 | 
| +#ifdef HAS_MERGEUVROW_AVX2
 | 
| +void MergeUVRow_AVX2(const uint8* src_u, const uint8* src_v, uint8* dst_uv,
 | 
|                       int width) {
 | 
|    asm volatile (
 | 
|      "sub       %0,%1                             \n"
 | 
|      LABELALIGN
 | 
|    "1:                                            \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0           \n"
 | 
| -    MEMOPREG(movdqa,0x00,0,1,1,xmm1)             //  movdqa    (%0,%1,1),%%xmm1
 | 
| -    "lea       " MEMLEA(0x10,0) ",%0             \n"
 | 
| -    "movdqa    %%xmm0,%%xmm2                     \n"
 | 
| -    "punpcklbw %%xmm1,%%xmm0                     \n"
 | 
| -    "punpckhbw %%xmm1,%%xmm2                     \n"
 | 
| -    "movdqa    %%xmm0," MEMACCESS(2) "           \n"
 | 
| -    "movdqa    %%xmm2," MEMACCESS2(0x10,2) "     \n"
 | 
| -    "lea       " MEMLEA(0x20,2) ",%2             \n"
 | 
| -    "sub       $0x10,%3                          \n"
 | 
| +    "vmovdqu   " MEMACCESS(0) ",%%ymm0           \n"
 | 
| +    MEMOPREG(vmovdqu,0x00,0,1,1,ymm1)             //  vmovdqu (%0,%1,1),%%ymm1
 | 
| +    "lea       " MEMLEA(0x20,0) ",%0             \n"
 | 
| +    "vpunpcklbw %%ymm1,%%ymm0,%%ymm2             \n"
 | 
| +    "vpunpckhbw %%ymm1,%%ymm0,%%ymm0             \n"
 | 
| +    "vextractf128 $0x0,%%ymm2," MEMACCESS(2) "   \n"
 | 
| +    "vextractf128 $0x0,%%ymm0," MEMACCESS2(0x10,2) "\n"
 | 
| +    "vextractf128 $0x1,%%ymm2," MEMACCESS2(0x20,2) "\n"
 | 
| +    "vextractf128 $0x1,%%ymm0," MEMACCESS2(0x30,2) "\n"
 | 
| +    "lea       " MEMLEA(0x40,2) ",%2             \n"
 | 
| +    "sub       $0x20,%3                          \n"
 | 
|      "jg        1b                                \n"
 | 
| +    "vzeroupper                                  \n"
 | 
|    : "+r"(src_u),     // %0
 | 
|      "+r"(src_v),     // %1
 | 
|      "+r"(dst_uv),    // %2
 | 
|      "+r"(width)      // %3
 | 
|    :
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2"
 | 
| -#endif
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2"
 | 
|    );
 | 
|  }
 | 
| +#endif  // HAS_MERGEUVROW_AVX2
 | 
|  
 | 
| -void MergeUVRow_Unaligned_SSE2(const uint8* src_u, const uint8* src_v,
 | 
| -                               uint8* dst_uv, int width) {
 | 
| +#ifdef HAS_MERGEUVROW_SSE2
 | 
| +void MergeUVRow_SSE2(const uint8* src_u, const uint8* src_v, uint8* dst_uv,
 | 
| +                     int width) {
 | 
|    asm volatile (
 | 
|      "sub       %0,%1                             \n"
 | 
|      LABELALIGN
 | 
| @@ -3230,13 +2449,8 @@ void MergeUVRow_Unaligned_SSE2(const uint8* src_u, const uint8* src_v,
 | 
|      "+r"(dst_uv),    // %2
 | 
|      "+r"(width)      // %3
 | 
|    :
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2"
 | 
| -#endif
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2"
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_MERGEUVROW_SSE2
 | 
| @@ -3246,11 +2460,11 @@ void CopyRow_SSE2(const uint8* src, uint8* dst, int count) {
 | 
|    asm volatile (
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "movdqa    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| +    "movdqu    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
|      "lea       " MEMLEA(0x20,0) ",%0           \n"
 | 
| -    "movdqa    %%xmm0," MEMACCESS(1) "         \n"
 | 
| -    "movdqa    %%xmm1," MEMACCESS2(0x10,1) "   \n"
 | 
| +    "movdqu    %%xmm0," MEMACCESS(1) "         \n"
 | 
| +    "movdqu    %%xmm1," MEMACCESS2(0x10,1) "   \n"
 | 
|      "lea       " MEMLEA(0x20,1) ",%1           \n"
 | 
|      "sub       $0x20,%2                        \n"
 | 
|      "jg        1b                              \n"
 | 
| @@ -3259,30 +2473,36 @@ void CopyRow_SSE2(const uint8* src, uint8* dst, int count) {
 | 
|      "+r"(count)  // %2
 | 
|    :
 | 
|    : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
|      , "xmm0", "xmm1"
 | 
| -#endif
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_COPYROW_SSE2
 | 
|  
 | 
| -#ifdef HAS_COPYROW_X86
 | 
| -void CopyRow_X86(const uint8* src, uint8* dst, int width) {
 | 
| -  size_t width_tmp = (size_t)(width);
 | 
| +#ifdef HAS_COPYROW_AVX
 | 
| +void CopyRow_AVX(const uint8* src, uint8* dst, int count) {
 | 
|    asm volatile (
 | 
| -    "shr       $0x2,%2                         \n"
 | 
| -    "rep movsl " MEMMOVESTRING(0,1) "          \n"
 | 
| -  : "+S"(src),  // %0
 | 
| -    "+D"(dst),  // %1
 | 
| -    "+c"(width_tmp) // %2
 | 
| +    LABELALIGN
 | 
| +  "1:                                          \n"
 | 
| +    "vmovdqu   " MEMACCESS(0) ",%%ymm0         \n"
 | 
| +    "vmovdqu   " MEMACCESS2(0x20,0) ",%%ymm1   \n"
 | 
| +    "lea       " MEMLEA(0x40,0) ",%0           \n"
 | 
| +    "vmovdqu   %%ymm0," MEMACCESS(1) "         \n"
 | 
| +    "vmovdqu   %%ymm1," MEMACCESS2(0x20,1) "   \n"
 | 
| +    "lea       " MEMLEA(0x40,1) ",%1           \n"
 | 
| +    "sub       $0x40,%2                        \n"
 | 
| +    "jg        1b                              \n"
 | 
| +  : "+r"(src),   // %0
 | 
| +    "+r"(dst),   // %1
 | 
| +    "+r"(count)  // %2
 | 
|    :
 | 
|    : "memory", "cc"
 | 
| +    , "xmm0", "xmm1"
 | 
|    );
 | 
|  }
 | 
| -#endif  // HAS_COPYROW_X86
 | 
| +#endif  // HAS_COPYROW_AVX
 | 
|  
 | 
|  #ifdef HAS_COPYROW_ERMS
 | 
| -// Unaligned Multiple of 1.
 | 
| +// Multiple of 1.
 | 
|  void CopyRow_ERMS(const uint8* src, uint8* dst, int width) {
 | 
|    size_t width_tmp = (size_t)(width);
 | 
|    asm volatile (
 | 
| @@ -3306,19 +2526,19 @@ void ARGBCopyAlphaRow_SSE2(const uint8* src, uint8* dst, int width) {
 | 
|      "psrld     $0x8,%%xmm1                     \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm2         \n"
 | 
| -    "movdqa    " MEMACCESS2(0x10,0) ",%%xmm3   \n"
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm2         \n"
 | 
| +    "movdqu    " MEMACCESS2(0x10,0) ",%%xmm3   \n"
 | 
|      "lea       " MEMLEA(0x20,0) ",%0           \n"
 | 
| -    "movdqa    " MEMACCESS(1) ",%%xmm4         \n"
 | 
| -    "movdqa    " MEMACCESS2(0x10,1) ",%%xmm5   \n"
 | 
| +    "movdqu    " MEMACCESS(1) ",%%xmm4         \n"
 | 
| +    "movdqu    " MEMACCESS2(0x10,1) ",%%xmm5   \n"
 | 
|      "pand      %%xmm0,%%xmm2                   \n"
 | 
|      "pand      %%xmm0,%%xmm3                   \n"
 | 
|      "pand      %%xmm1,%%xmm4                   \n"
 | 
|      "pand      %%xmm1,%%xmm5                   \n"
 | 
|      "por       %%xmm4,%%xmm2                   \n"
 | 
|      "por       %%xmm5,%%xmm3                   \n"
 | 
| -    "movdqa    %%xmm2," MEMACCESS(1) "         \n"
 | 
| -    "movdqa    %%xmm3," MEMACCESS2(0x10,1) "   \n"
 | 
| +    "movdqu    %%xmm2," MEMACCESS(1) "         \n"
 | 
| +    "movdqu    %%xmm3," MEMACCESS2(0x10,1) "   \n"
 | 
|      "lea       " MEMLEA(0x20,1) ",%1           \n"
 | 
|      "sub       $0x8,%2                         \n"
 | 
|      "jg        1b                              \n"
 | 
| @@ -3327,9 +2547,7 @@ void ARGBCopyAlphaRow_SSE2(const uint8* src, uint8* dst, int width) {
 | 
|      "+r"(width)  // %2
 | 
|    :
 | 
|    : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
|      , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
| -#endif
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_ARGBCOPYALPHAROW_SSE2
 | 
| @@ -3358,9 +2576,7 @@ void ARGBCopyAlphaRow_AVX2(const uint8* src, uint8* dst, int width) {
 | 
|      "+r"(width)  // %2
 | 
|    :
 | 
|    : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
|      , "xmm0", "xmm1", "xmm2"
 | 
| -#endif
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_ARGBCOPYALPHAROW_AVX2
 | 
| @@ -3380,16 +2596,16 @@ void ARGBCopyYToAlphaRow_SSE2(const uint8* src, uint8* dst, int width) {
 | 
|      "punpcklbw %%xmm2,%%xmm2                   \n"
 | 
|      "punpckhwd %%xmm2,%%xmm3                   \n"
 | 
|      "punpcklwd %%xmm2,%%xmm2                   \n"
 | 
| -    "movdqa    " MEMACCESS(1) ",%%xmm4         \n"
 | 
| -    "movdqa    " MEMACCESS2(0x10,1) ",%%xmm5   \n"
 | 
| +    "movdqu    " MEMACCESS(1) ",%%xmm4         \n"
 | 
| +    "movdqu    " MEMACCESS2(0x10,1) ",%%xmm5   \n"
 | 
|      "pand      %%xmm0,%%xmm2                   \n"
 | 
|      "pand      %%xmm0,%%xmm3                   \n"
 | 
|      "pand      %%xmm1,%%xmm4                   \n"
 | 
|      "pand      %%xmm1,%%xmm5                   \n"
 | 
|      "por       %%xmm4,%%xmm2                   \n"
 | 
|      "por       %%xmm5,%%xmm3                   \n"
 | 
| -    "movdqa    %%xmm2," MEMACCESS(1) "         \n"
 | 
| -    "movdqa    %%xmm3," MEMACCESS2(0x10,1) "   \n"
 | 
| +    "movdqu    %%xmm2," MEMACCESS(1) "         \n"
 | 
| +    "movdqu    %%xmm3," MEMACCESS2(0x10,1) "   \n"
 | 
|      "lea       " MEMLEA(0x20,1) ",%1           \n"
 | 
|      "sub       $0x8,%2                         \n"
 | 
|      "jg        1b                              \n"
 | 
| @@ -3398,9 +2614,7 @@ void ARGBCopyYToAlphaRow_SSE2(const uint8* src, uint8* dst, int width) {
 | 
|      "+r"(width)  // %2
 | 
|    :
 | 
|    : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
|      , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
| -#endif
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_ARGBCOPYYTOALPHAROW_SSE2
 | 
| @@ -3431,18 +2645,16 @@ void ARGBCopyYToAlphaRow_AVX2(const uint8* src, uint8* dst, int width) {
 | 
|      "+r"(width)  // %2
 | 
|    :
 | 
|    : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
|      , "xmm0", "xmm1", "xmm2"
 | 
| -#endif
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_ARGBCOPYYTOALPHAROW_AVX2
 | 
|  
 | 
|  #ifdef HAS_SETROW_X86
 | 
| -void SetRow_X86(uint8* dst, uint32 v32, int width) {
 | 
| -  size_t width_tmp = (size_t)(width);
 | 
| +void SetRow_X86(uint8* dst, uint8 v8, int width) {
 | 
| +  size_t width_tmp = (size_t)(width >> 2);
 | 
| +  const uint32 v32 = v8 * 0x01010101;  // Duplicate byte to all bytes.
 | 
|    asm volatile (
 | 
| -    "shr       $0x2,%1                         \n"
 | 
|      "rep stosl " MEMSTORESTRING(eax,0) "       \n"
 | 
|      : "+D"(dst),       // %0
 | 
|        "+c"(width_tmp)  // %1
 | 
| @@ -3450,137 +2662,29 @@ void SetRow_X86(uint8* dst, uint32 v32, int width) {
 | 
|      : "memory", "cc");
 | 
|  }
 | 
|  
 | 
| -void ARGBSetRows_X86(uint8* dst, uint32 v32, int width,
 | 
| -                   int dst_stride, int height) {
 | 
| -  for (int y = 0; y < height; ++y) {
 | 
| -    size_t width_tmp = (size_t)(width);
 | 
| -    uint32* d = (uint32*)(dst);
 | 
| -    asm volatile (
 | 
| -      "rep stosl " MEMSTORESTRING(eax,0) "     \n"
 | 
| -      : "+D"(d),         // %0
 | 
| -        "+c"(width_tmp)  // %1
 | 
| -      : "a"(v32)         // %2
 | 
| -      : "memory", "cc");
 | 
| -    dst += dst_stride;
 | 
| -  }
 | 
| -}
 | 
| -#endif  // HAS_SETROW_X86
 | 
| -
 | 
| -#ifdef HAS_YUY2TOYROW_SSE2
 | 
| -void YUY2ToYRow_SSE2(const uint8* src_yuy2, uint8* dst_y, int pix) {
 | 
| -  asm volatile (
 | 
| -    "pcmpeqb   %%xmm5,%%xmm5                   \n"
 | 
| -    "psrlw     $0x8,%%xmm5                     \n"
 | 
| -    LABELALIGN
 | 
| -  "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "movdqa    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| -    "lea       " MEMLEA(0x20,0) ",%0           \n"
 | 
| -    "pand      %%xmm5,%%xmm0                   \n"
 | 
| -    "pand      %%xmm5,%%xmm1                   \n"
 | 
| -    "packuswb  %%xmm1,%%xmm0                   \n"
 | 
| -    "movdqa    %%xmm0," MEMACCESS(1) "         \n"
 | 
| -    "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| -    "sub       $0x10,%2                        \n"
 | 
| -    "jg        1b                              \n"
 | 
| -  : "+r"(src_yuy2),  // %0
 | 
| -    "+r"(dst_y),     // %1
 | 
| -    "+r"(pix)        // %2
 | 
| -  :
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm5"
 | 
| -#endif
 | 
| -  );
 | 
| -}
 | 
| -
 | 
| -void YUY2ToUVRow_SSE2(const uint8* src_yuy2, int stride_yuy2,
 | 
| -                      uint8* dst_u, uint8* dst_v, int pix) {
 | 
| +void SetRow_ERMS(uint8* dst, uint8 v8, int width) {
 | 
| +  size_t width_tmp = (size_t)(width);
 | 
|    asm volatile (
 | 
| -    "pcmpeqb   %%xmm5,%%xmm5                   \n"
 | 
| -    "psrlw     $0x8,%%xmm5                     \n"
 | 
| -    "sub       %1,%2                           \n"
 | 
| -    LABELALIGN
 | 
| -  "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "movdqa    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPREG(movdqa,0x00,0,4,1,xmm2)           //  movdqa  (%0,%4,1),%%xmm2
 | 
| -    MEMOPREG(movdqa,0x10,0,4,1,xmm3)           //  movdqa  0x10(%0,%4,1),%%xmm3
 | 
| -    "lea       " MEMLEA(0x20,0) ",%0           \n"
 | 
| -    "pavgb     %%xmm2,%%xmm0                   \n"
 | 
| -    "pavgb     %%xmm3,%%xmm1                   \n"
 | 
| -    "psrlw     $0x8,%%xmm0                     \n"
 | 
| -    "psrlw     $0x8,%%xmm1                     \n"
 | 
| -    "packuswb  %%xmm1,%%xmm0                   \n"
 | 
| -    "movdqa    %%xmm0,%%xmm1                   \n"
 | 
| -    "pand      %%xmm5,%%xmm0                   \n"
 | 
| -    "packuswb  %%xmm0,%%xmm0                   \n"
 | 
| -    "psrlw     $0x8,%%xmm1                     \n"
 | 
| -    "packuswb  %%xmm1,%%xmm1                   \n"
 | 
| -    "movq      %%xmm0," MEMACCESS(1) "         \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPMEM(movq,xmm1,0x00,1,2,1)             //  movq    %%xmm1,(%1,%2)
 | 
| -    "lea       " MEMLEA(0x8,1) ",%1            \n"
 | 
| -    "sub       $0x10,%3                        \n"
 | 
| -    "jg        1b                              \n"
 | 
| -  : "+r"(src_yuy2),    // %0
 | 
| -    "+r"(dst_u),       // %1
 | 
| -    "+r"(dst_v),       // %2
 | 
| -    "+r"(pix)          // %3
 | 
| -  : "r"((intptr_t)(stride_yuy2))  // %4
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm5"
 | 
| -#endif
 | 
| -  );
 | 
| +    "rep stosb " MEMSTORESTRING(al,0) "        \n"
 | 
| +    : "+D"(dst),       // %0
 | 
| +      "+c"(width_tmp)  // %1
 | 
| +    : "a"(v8)          // %2
 | 
| +    : "memory", "cc");
 | 
|  }
 | 
|  
 | 
| -void YUY2ToUV422Row_SSE2(const uint8* src_yuy2,
 | 
| -                         uint8* dst_u, uint8* dst_v, int pix) {
 | 
| +void ARGBSetRow_X86(uint8* dst_argb, uint32 v32, int width) {
 | 
| +  size_t width_tmp = (size_t)(width);
 | 
|    asm volatile (
 | 
| -    "pcmpeqb   %%xmm5,%%xmm5                   \n"
 | 
| -    "psrlw     $0x8,%%xmm5                     \n"
 | 
| -    "sub       %1,%2                           \n"
 | 
| -    LABELALIGN
 | 
| -  "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "movdqa    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| -    "lea       " MEMLEA(0x20,0) ",%0           \n"
 | 
| -    "psrlw     $0x8,%%xmm0                     \n"
 | 
| -    "psrlw     $0x8,%%xmm1                     \n"
 | 
| -    "packuswb  %%xmm1,%%xmm0                   \n"
 | 
| -    "movdqa    %%xmm0,%%xmm1                   \n"
 | 
| -    "pand      %%xmm5,%%xmm0                   \n"
 | 
| -    "packuswb  %%xmm0,%%xmm0                   \n"
 | 
| -    "psrlw     $0x8,%%xmm1                     \n"
 | 
| -    "packuswb  %%xmm1,%%xmm1                   \n"
 | 
| -    "movq      %%xmm0," MEMACCESS(1) "         \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPMEM(movq,xmm1,0x00,1,2,1)             //  movq    %%xmm1,(%1,%2)
 | 
| -    "lea       " MEMLEA(0x8,1) ",%1            \n"
 | 
| -    "sub       $0x10,%3                        \n"
 | 
| -    "jg        1b                              \n"
 | 
| -  : "+r"(src_yuy2),    // %0
 | 
| -    "+r"(dst_u),       // %1
 | 
| -    "+r"(dst_v),       // %2
 | 
| -    "+r"(pix)          // %3
 | 
| -  :
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm5"
 | 
| -#endif
 | 
| -  );
 | 
| +    "rep stosl " MEMSTORESTRING(eax,0) "       \n"
 | 
| +    : "+D"(dst_argb),  // %0
 | 
| +      "+c"(width_tmp)  // %1
 | 
| +    : "a"(v32)         // %2
 | 
| +    : "memory", "cc");
 | 
|  }
 | 
| +#endif  // HAS_SETROW_X86
 | 
|  
 | 
| -void YUY2ToYRow_Unaligned_SSE2(const uint8* src_yuy2,
 | 
| -                               uint8* dst_y, int pix) {
 | 
| +#ifdef HAS_YUY2TOYROW_SSE2
 | 
| +void YUY2ToYRow_SSE2(const uint8* src_yuy2, uint8* dst_y, int pix) {
 | 
|    asm volatile (
 | 
|      "pcmpeqb   %%xmm5,%%xmm5                   \n"
 | 
|      "psrlw     $0x8,%%xmm5                     \n"
 | 
| @@ -3592,24 +2696,21 @@ void YUY2ToYRow_Unaligned_SSE2(const uint8* src_yuy2,
 | 
|      "pand      %%xmm5,%%xmm0                   \n"
 | 
|      "pand      %%xmm5,%%xmm1                   \n"
 | 
|      "packuswb  %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%2                        \n"
 | 
|      "movdqu    %%xmm0," MEMACCESS(1) "         \n"
 | 
|      "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| +    "sub       $0x10,%2                        \n"
 | 
|      "jg        1b                              \n"
 | 
|    : "+r"(src_yuy2),  // %0
 | 
|      "+r"(dst_y),     // %1
 | 
|      "+r"(pix)        // %2
 | 
|    :
 | 
|    : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
|      , "xmm0", "xmm1", "xmm5"
 | 
| -#endif
 | 
|    );
 | 
|  }
 | 
|  
 | 
| -void YUY2ToUVRow_Unaligned_SSE2(const uint8* src_yuy2,
 | 
| -                                int stride_yuy2,
 | 
| -                                uint8* dst_u, uint8* dst_v, int pix) {
 | 
| +void YUY2ToUVRow_SSE2(const uint8* src_yuy2, int stride_yuy2,
 | 
| +                      uint8* dst_u, uint8* dst_v, int pix) {
 | 
|    asm volatile (
 | 
|      "pcmpeqb   %%xmm5,%%xmm5                   \n"
 | 
|      "psrlw     $0x8,%%xmm5                     \n"
 | 
| @@ -3618,7 +2719,6 @@ void YUY2ToUVRow_Unaligned_SSE2(const uint8* src_yuy2,
 | 
|    "1:                                          \n"
 | 
|      "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
|      "movdqu    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| -    BUNDLEALIGN
 | 
|      MEMOPREG(movdqu,0x00,0,4,1,xmm2)           //  movdqu  (%0,%4,1),%%xmm2
 | 
|      MEMOPREG(movdqu,0x10,0,4,1,xmm3)           //  movdqu  0x10(%0,%4,1),%%xmm3
 | 
|      "lea       " MEMLEA(0x20,0) ",%0           \n"
 | 
| @@ -3633,7 +2733,6 @@ void YUY2ToUVRow_Unaligned_SSE2(const uint8* src_yuy2,
 | 
|      "psrlw     $0x8,%%xmm1                     \n"
 | 
|      "packuswb  %%xmm1,%%xmm1                   \n"
 | 
|      "movq      %%xmm0," MEMACCESS(1) "         \n"
 | 
| -    BUNDLEALIGN
 | 
|      MEMOPMEM(movq,xmm1,0x00,1,2,1)             //  movq    %%xmm1,(%1,%2)
 | 
|      "lea       " MEMLEA(0x8,1) ",%1            \n"
 | 
|      "sub       $0x10,%3                        \n"
 | 
| @@ -3643,18 +2742,13 @@ void YUY2ToUVRow_Unaligned_SSE2(const uint8* src_yuy2,
 | 
|      "+r"(dst_v),       // %2
 | 
|      "+r"(pix)          // %3
 | 
|    : "r"((intptr_t)(stride_yuy2))  // %4
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm5"
 | 
| -#endif
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm3", "xmm5"
 | 
|    );
 | 
|  }
 | 
|  
 | 
| -void YUY2ToUV422Row_Unaligned_SSE2(const uint8* src_yuy2,
 | 
| -                                   uint8* dst_u, uint8* dst_v, int pix) {
 | 
| +void YUY2ToUV422Row_SSE2(const uint8* src_yuy2,
 | 
| +                         uint8* dst_u, uint8* dst_v, int pix) {
 | 
|    asm volatile (
 | 
|      "pcmpeqb   %%xmm5,%%xmm5                   \n"
 | 
|      "psrlw     $0x8,%%xmm5                     \n"
 | 
| @@ -3673,7 +2767,6 @@ void YUY2ToUV422Row_Unaligned_SSE2(const uint8* src_yuy2,
 | 
|      "psrlw     $0x8,%%xmm1                     \n"
 | 
|      "packuswb  %%xmm1,%%xmm1                   \n"
 | 
|      "movq      %%xmm0," MEMACCESS(1) "         \n"
 | 
| -    BUNDLEALIGN
 | 
|      MEMOPMEM(movq,xmm1,0x00,1,2,1)             //  movq    %%xmm1,(%1,%2)
 | 
|      "lea       " MEMLEA(0x8,1) ",%1            \n"
 | 
|      "sub       $0x10,%3                        \n"
 | 
| @@ -3683,13 +2776,8 @@ void YUY2ToUV422Row_Unaligned_SSE2(const uint8* src_yuy2,
 | 
|      "+r"(dst_v),       // %2
 | 
|      "+r"(pix)          // %3
 | 
|    :
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm5"
 | 
| -#endif
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm5"
 | 
|    );
 | 
|  }
 | 
|  
 | 
| @@ -3697,24 +2785,22 @@ void UYVYToYRow_SSE2(const uint8* src_uyvy, uint8* dst_y, int pix) {
 | 
|    asm volatile (
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "movdqa    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| +    "movdqu    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
|      "lea       " MEMLEA(0x20,0) ",%0           \n"
 | 
|      "psrlw     $0x8,%%xmm0                     \n"
 | 
|      "psrlw     $0x8,%%xmm1                     \n"
 | 
|      "packuswb  %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%2                        \n"
 | 
| -    "movdqa    %%xmm0," MEMACCESS(1) "         \n"
 | 
| +    "movdqu    %%xmm0," MEMACCESS(1) "         \n"
 | 
|      "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| +    "sub       $0x10,%2                        \n"
 | 
|      "jg        1b                              \n"
 | 
|    : "+r"(src_uyvy),  // %0
 | 
|      "+r"(dst_y),     // %1
 | 
|      "+r"(pix)        // %2
 | 
|    :
 | 
|    : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
|      , "xmm0", "xmm1"
 | 
| -#endif
 | 
|    );
 | 
|  }
 | 
|  
 | 
| @@ -3726,11 +2812,10 @@ void UYVYToUVRow_SSE2(const uint8* src_uyvy, int stride_uyvy,
 | 
|      "sub       %1,%2                           \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "movdqa    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPREG(movdqa,0x00,0,4,1,xmm2)           //  movdqa  (%0,%4,1),%%xmm2
 | 
| -    MEMOPREG(movdqa,0x10,0,4,1,xmm3)           //  movdqa  0x10(%0,%4,1),%%xmm3
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| +    "movdqu    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| +    MEMOPREG(movdqu,0x00,0,4,1,xmm2)           //  movdqu  (%0,%4,1),%%xmm2
 | 
| +    MEMOPREG(movdqu,0x10,0,4,1,xmm3)           //  movdqu  0x10(%0,%4,1),%%xmm3
 | 
|      "lea       " MEMLEA(0x20,0) ",%0           \n"
 | 
|      "pavgb     %%xmm2,%%xmm0                   \n"
 | 
|      "pavgb     %%xmm3,%%xmm1                   \n"
 | 
| @@ -3743,7 +2828,6 @@ void UYVYToUVRow_SSE2(const uint8* src_uyvy, int stride_uyvy,
 | 
|      "psrlw     $0x8,%%xmm1                     \n"
 | 
|      "packuswb  %%xmm1,%%xmm1                   \n"
 | 
|      "movq      %%xmm0," MEMACCESS(1) "         \n"
 | 
| -    BUNDLEALIGN
 | 
|      MEMOPMEM(movq,xmm1,0x00,1,2,1)             //  movq    %%xmm1,(%1,%2)
 | 
|      "lea       " MEMLEA(0x8,1) ",%1            \n"
 | 
|      "sub       $0x10,%3                        \n"
 | 
| @@ -3753,13 +2837,8 @@ void UYVYToUVRow_SSE2(const uint8* src_uyvy, int stride_uyvy,
 | 
|      "+r"(dst_v),       // %2
 | 
|      "+r"(pix)          // %3
 | 
|    : "r"((intptr_t)(stride_uyvy))  // %4
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm5"
 | 
| -#endif
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm3", "xmm5"
 | 
|    );
 | 
|  }
 | 
|  
 | 
| @@ -3771,8 +2850,8 @@ void UYVYToUV422Row_SSE2(const uint8* src_uyvy,
 | 
|      "sub       %1,%2                           \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "movdqa    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| +    "movdqu    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
|      "lea       " MEMLEA(0x20,0) ",%0           \n"
 | 
|      "pand      %%xmm5,%%xmm0                   \n"
 | 
|      "pand      %%xmm5,%%xmm1                   \n"
 | 
| @@ -3783,7 +2862,6 @@ void UYVYToUV422Row_SSE2(const uint8* src_uyvy,
 | 
|      "psrlw     $0x8,%%xmm1                     \n"
 | 
|      "packuswb  %%xmm1,%%xmm1                   \n"
 | 
|      "movq      %%xmm0," MEMACCESS(1) "         \n"
 | 
| -    BUNDLEALIGN
 | 
|      MEMOPMEM(movq,xmm1,0x00,1,2,1)             //  movq    %%xmm1,(%1,%2)
 | 
|      "lea       " MEMLEA(0x8,1) ",%1            \n"
 | 
|      "sub       $0x10,%3                        \n"
 | 
| @@ -3793,127 +2871,217 @@ void UYVYToUV422Row_SSE2(const uint8* src_uyvy,
 | 
|      "+r"(dst_v),       // %2
 | 
|      "+r"(pix)          // %3
 | 
|    :
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm5"
 | 
| +  );
 | 
| +}
 | 
| +#endif  // HAS_YUY2TOYROW_SSE2
 | 
| +
 | 
| +#ifdef HAS_YUY2TOYROW_AVX2
 | 
| +void YUY2ToYRow_AVX2(const uint8* src_yuy2, uint8* dst_y, int pix) {
 | 
| +  asm volatile (
 | 
| +    "vpcmpeqb  %%ymm5,%%ymm5,%%ymm5            \n"
 | 
| +    "vpsrlw    $0x8,%%ymm5,%%ymm5              \n"
 | 
| +    LABELALIGN
 | 
| +  "1:                                          \n"
 | 
| +    "vmovdqu   " MEMACCESS(0) ",%%ymm0         \n"
 | 
| +    "vmovdqu   " MEMACCESS2(0x20,0) ",%%ymm1   \n"
 | 
| +    "lea       " MEMLEA(0x40,0) ",%0           \n"
 | 
| +    "vpand     %%ymm5,%%ymm0,%%ymm0            \n"
 | 
| +    "vpand     %%ymm5,%%ymm1,%%ymm1            \n"
 | 
| +    "vpackuswb %%ymm1,%%ymm0,%%ymm0            \n"
 | 
| +    "vpermq    $0xd8,%%ymm0,%%ymm0             \n"
 | 
| +    "vmovdqu   %%ymm0," MEMACCESS(1) "         \n"
 | 
| +    "lea      " MEMLEA(0x20,1) ",%1            \n"
 | 
| +    "sub       $0x20,%2                        \n"
 | 
| +    "jg        1b                              \n"
 | 
| +    "vzeroupper                                \n"
 | 
| +  : "+r"(src_yuy2),  // %0
 | 
| +    "+r"(dst_y),     // %1
 | 
| +    "+r"(pix)        // %2
 | 
| +  :
 | 
|    : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
|      , "xmm0", "xmm1", "xmm5"
 | 
| -#endif
 | 
|    );
 | 
|  }
 | 
|  
 | 
| -void UYVYToYRow_Unaligned_SSE2(const uint8* src_uyvy,
 | 
| -                               uint8* dst_y, int pix) {
 | 
| +void YUY2ToUVRow_AVX2(const uint8* src_yuy2, int stride_yuy2,
 | 
| +                      uint8* dst_u, uint8* dst_v, int pix) {
 | 
|    asm volatile (
 | 
| +    "vpcmpeqb  %%ymm5,%%ymm5,%%ymm5            \n"
 | 
| +    "vpsrlw    $0x8,%%ymm5,%%ymm5              \n"
 | 
| +    "sub       %1,%2                           \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "movdqu    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| -    "lea       " MEMLEA(0x20,0) ",%0           \n"
 | 
| -    "psrlw     $0x8,%%xmm0                     \n"
 | 
| -    "psrlw     $0x8,%%xmm1                     \n"
 | 
| -    "packuswb  %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%2                        \n"
 | 
| -    "movdqu    %%xmm0," MEMACCESS(1) "         \n"
 | 
| -    "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| +    "vmovdqu   " MEMACCESS(0) ",%%ymm0         \n"
 | 
| +    "vmovdqu   " MEMACCESS2(0x20,0) ",%%ymm1   \n"
 | 
| +    VMEMOPREG(vpavgb,0x00,0,4,1,ymm0,ymm0)     // vpavgb (%0,%4,1),%%ymm0,%%ymm0
 | 
| +    VMEMOPREG(vpavgb,0x20,0,4,1,ymm1,ymm1)
 | 
| +    "lea       " MEMLEA(0x40,0) ",%0           \n"
 | 
| +    "vpsrlw    $0x8,%%ymm0,%%ymm0              \n"
 | 
| +    "vpsrlw    $0x8,%%ymm1,%%ymm1              \n"
 | 
| +    "vpackuswb %%ymm1,%%ymm0,%%ymm0            \n"
 | 
| +    "vpermq    $0xd8,%%ymm0,%%ymm0             \n"
 | 
| +    "vpand     %%ymm5,%%ymm0,%%ymm1            \n"
 | 
| +    "vpsrlw    $0x8,%%ymm0,%%ymm0              \n"
 | 
| +    "vpackuswb %%ymm1,%%ymm1,%%ymm1            \n"
 | 
| +    "vpackuswb %%ymm0,%%ymm0,%%ymm0            \n"
 | 
| +    "vpermq    $0xd8,%%ymm1,%%ymm1             \n"
 | 
| +    "vpermq    $0xd8,%%ymm0,%%ymm0             \n"
 | 
| +    "vextractf128 $0x0,%%ymm1," MEMACCESS(1) " \n"
 | 
| +    VEXTOPMEM(vextractf128,0,ymm0,0x00,1,2,1) // vextractf128 $0x0,%%ymm0,(%1,%2,1)
 | 
| +    "lea      " MEMLEA(0x10,1) ",%1            \n"
 | 
| +    "sub       $0x20,%3                        \n"
 | 
| +    "jg        1b                              \n"
 | 
| +    "vzeroupper                                \n"
 | 
| +  : "+r"(src_yuy2),    // %0
 | 
| +    "+r"(dst_u),       // %1
 | 
| +    "+r"(dst_v),       // %2
 | 
| +    "+r"(pix)          // %3
 | 
| +  : "r"((intptr_t)(stride_yuy2))  // %4
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm5"
 | 
| +  );
 | 
| +}
 | 
| +
 | 
| +void YUY2ToUV422Row_AVX2(const uint8* src_yuy2,
 | 
| +                         uint8* dst_u, uint8* dst_v, int pix) {
 | 
| +  asm volatile (
 | 
| +    "vpcmpeqb  %%ymm5,%%ymm5,%%ymm5            \n"
 | 
| +    "vpsrlw    $0x8,%%ymm5,%%ymm5              \n"
 | 
| +    "sub       %1,%2                           \n"
 | 
| +    LABELALIGN
 | 
| +  "1:                                          \n"
 | 
| +    "vmovdqu   " MEMACCESS(0) ",%%ymm0         \n"
 | 
| +    "vmovdqu   " MEMACCESS2(0x20,0) ",%%ymm1   \n"
 | 
| +    "lea       " MEMLEA(0x40,0) ",%0           \n"
 | 
| +    "vpsrlw    $0x8,%%ymm0,%%ymm0              \n"
 | 
| +    "vpsrlw    $0x8,%%ymm1,%%ymm1              \n"
 | 
| +    "vpackuswb %%ymm1,%%ymm0,%%ymm0            \n"
 | 
| +    "vpermq    $0xd8,%%ymm0,%%ymm0             \n"
 | 
| +    "vpand     %%ymm5,%%ymm0,%%ymm1            \n"
 | 
| +    "vpsrlw    $0x8,%%ymm0,%%ymm0              \n"
 | 
| +    "vpackuswb %%ymm1,%%ymm1,%%ymm1            \n"
 | 
| +    "vpackuswb %%ymm0,%%ymm0,%%ymm0            \n"
 | 
| +    "vpermq    $0xd8,%%ymm1,%%ymm1             \n"
 | 
| +    "vpermq    $0xd8,%%ymm0,%%ymm0             \n"
 | 
| +    "vextractf128 $0x0,%%ymm1," MEMACCESS(1) " \n"
 | 
| +    VEXTOPMEM(vextractf128,0,ymm0,0x00,1,2,1) // vextractf128 $0x0,%%ymm0,(%1,%2,1)
 | 
| +    "lea      " MEMLEA(0x10,1) ",%1            \n"
 | 
| +    "sub       $0x20,%3                        \n"
 | 
| +    "jg        1b                              \n"
 | 
| +    "vzeroupper                                \n"
 | 
| +  : "+r"(src_yuy2),    // %0
 | 
| +    "+r"(dst_u),       // %1
 | 
| +    "+r"(dst_v),       // %2
 | 
| +    "+r"(pix)          // %3
 | 
| +  :
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm5"
 | 
| +  );
 | 
| +}
 | 
| +
 | 
| +void UYVYToYRow_AVX2(const uint8* src_uyvy, uint8* dst_y, int pix) {
 | 
| +  asm volatile (
 | 
| +    LABELALIGN
 | 
| +  "1:                                          \n"
 | 
| +    "vmovdqu   " MEMACCESS(0) ",%%ymm0         \n"
 | 
| +    "vmovdqu   " MEMACCESS2(0x20,0) ",%%ymm1   \n"
 | 
| +    "lea       " MEMLEA(0x40,0) ",%0           \n"
 | 
| +    "vpsrlw    $0x8,%%ymm0,%%ymm0              \n"
 | 
| +    "vpsrlw    $0x8,%%ymm1,%%ymm1              \n"
 | 
| +    "vpackuswb %%ymm1,%%ymm0,%%ymm0            \n"
 | 
| +    "vpermq    $0xd8,%%ymm0,%%ymm0             \n"
 | 
| +    "vmovdqu   %%ymm0," MEMACCESS(1) "         \n"
 | 
| +    "lea      " MEMLEA(0x20,1) ",%1            \n"
 | 
| +    "sub       $0x20,%2                        \n"
 | 
|      "jg        1b                              \n"
 | 
| +    "vzeroupper                                \n"
 | 
|    : "+r"(src_uyvy),  // %0
 | 
|      "+r"(dst_y),     // %1
 | 
|      "+r"(pix)        // %2
 | 
|    :
 | 
|    : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1"
 | 
| -#endif
 | 
| +    , "xmm0", "xmm1", "xmm5"
 | 
|    );
 | 
|  }
 | 
| -
 | 
| -void UYVYToUVRow_Unaligned_SSE2(const uint8* src_uyvy, int stride_uyvy,
 | 
| -                                uint8* dst_u, uint8* dst_v, int pix) {
 | 
| +void UYVYToUVRow_AVX2(const uint8* src_uyvy, int stride_uyvy,
 | 
| +                      uint8* dst_u, uint8* dst_v, int pix) {
 | 
|    asm volatile (
 | 
| -    "pcmpeqb   %%xmm5,%%xmm5                   \n"
 | 
| -    "psrlw     $0x8,%%xmm5                     \n"
 | 
| +    "vpcmpeqb  %%ymm5,%%ymm5,%%ymm5            \n"
 | 
| +    "vpsrlw    $0x8,%%ymm5,%%ymm5              \n"
 | 
|      "sub       %1,%2                           \n"
 | 
| +
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "movdqu    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPREG(movdqu,0x00,0,4,1,xmm2)           //  movdqu  (%0,%4,1),%%xmm2
 | 
| -    MEMOPREG(movdqu,0x10,0,4,1,xmm3)           //  movdqu  0x10(%0,%4,1),%%xmm3
 | 
| -    "lea       " MEMLEA(0x20,0) ",%0           \n"
 | 
| -    "pavgb     %%xmm2,%%xmm0                   \n"
 | 
| -    "pavgb     %%xmm3,%%xmm1                   \n"
 | 
| -    "pand      %%xmm5,%%xmm0                   \n"
 | 
| -    "pand      %%xmm5,%%xmm1                   \n"
 | 
| -    "packuswb  %%xmm1,%%xmm0                   \n"
 | 
| -    "movdqa    %%xmm0,%%xmm1                   \n"
 | 
| -    "pand      %%xmm5,%%xmm0                   \n"
 | 
| -    "packuswb  %%xmm0,%%xmm0                   \n"
 | 
| -    "psrlw     $0x8,%%xmm1                     \n"
 | 
| -    "packuswb  %%xmm1,%%xmm1                   \n"
 | 
| -    "movq      %%xmm0," MEMACCESS(1) "         \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPMEM(movq,xmm1,0x00,1,2,1)             //  movq    %%xmm1,(%1,%2)
 | 
| -    "lea       " MEMLEA(0x8,1) ",%1            \n"
 | 
| -    "sub       $0x10,%3                        \n"
 | 
| +    "vmovdqu   " MEMACCESS(0) ",%%ymm0         \n"
 | 
| +    "vmovdqu   " MEMACCESS2(0x20,0) ",%%ymm1   \n"
 | 
| +    VMEMOPREG(vpavgb,0x00,0,4,1,ymm0,ymm0)     // vpavgb (%0,%4,1),%%ymm0,%%ymm0
 | 
| +    VMEMOPREG(vpavgb,0x20,0,4,1,ymm1,ymm1)
 | 
| +    "lea       " MEMLEA(0x40,0) ",%0           \n"
 | 
| +    "vpand     %%ymm5,%%ymm0,%%ymm0            \n"
 | 
| +    "vpand     %%ymm5,%%ymm1,%%ymm1            \n"
 | 
| +    "vpackuswb %%ymm1,%%ymm0,%%ymm0            \n"
 | 
| +    "vpermq    $0xd8,%%ymm0,%%ymm0             \n"
 | 
| +    "vpand     %%ymm5,%%ymm0,%%ymm1            \n"
 | 
| +    "vpsrlw    $0x8,%%ymm0,%%ymm0              \n"
 | 
| +    "vpackuswb %%ymm1,%%ymm1,%%ymm1            \n"
 | 
| +    "vpackuswb %%ymm0,%%ymm0,%%ymm0            \n"
 | 
| +    "vpermq    $0xd8,%%ymm1,%%ymm1             \n"
 | 
| +    "vpermq    $0xd8,%%ymm0,%%ymm0             \n"
 | 
| +    "vextractf128 $0x0,%%ymm1," MEMACCESS(1) " \n"
 | 
| +    VEXTOPMEM(vextractf128,0,ymm0,0x00,1,2,1) // vextractf128 $0x0,%%ymm0,(%1,%2,1)
 | 
| +    "lea      " MEMLEA(0x10,1) ",%1            \n"
 | 
| +    "sub       $0x20,%3                        \n"
 | 
|      "jg        1b                              \n"
 | 
| +    "vzeroupper                                \n"
 | 
|    : "+r"(src_uyvy),    // %0
 | 
|      "+r"(dst_u),       // %1
 | 
|      "+r"(dst_v),       // %2
 | 
|      "+r"(pix)          // %3
 | 
|    : "r"((intptr_t)(stride_uyvy))  // %4
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm5"
 | 
| -#endif
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm5"
 | 
|    );
 | 
|  }
 | 
|  
 | 
| -void UYVYToUV422Row_Unaligned_SSE2(const uint8* src_uyvy,
 | 
| -                                   uint8* dst_u, uint8* dst_v, int pix) {
 | 
| +void UYVYToUV422Row_AVX2(const uint8* src_uyvy,
 | 
| +                         uint8* dst_u, uint8* dst_v, int pix) {
 | 
|    asm volatile (
 | 
| -    "pcmpeqb   %%xmm5,%%xmm5                   \n"
 | 
| -    "psrlw     $0x8,%%xmm5                     \n"
 | 
| +    "vpcmpeqb   %%ymm5,%%ymm5,%%ymm5           \n"
 | 
| +    "vpsrlw     $0x8,%%ymm5,%%ymm5             \n"
 | 
|      "sub       %1,%2                           \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "movdqu    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| -    "lea       " MEMLEA(0x20,0) ",%0           \n"
 | 
| -    "pand      %%xmm5,%%xmm0                   \n"
 | 
| -    "pand      %%xmm5,%%xmm1                   \n"
 | 
| -    "packuswb  %%xmm1,%%xmm0                   \n"
 | 
| -    "movdqa    %%xmm0,%%xmm1                   \n"
 | 
| -    "pand      %%xmm5,%%xmm0                   \n"
 | 
| -    "packuswb  %%xmm0,%%xmm0                   \n"
 | 
| -    "psrlw     $0x8,%%xmm1                     \n"
 | 
| -    "packuswb  %%xmm1,%%xmm1                   \n"
 | 
| -    "movq      %%xmm0," MEMACCESS(1) "         \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPMEM(movq,xmm1,0x00,1,2,1)             //  movq    %%xmm1,(%1,%2)
 | 
| -    "lea       " MEMLEA(0x8,1) ",%1            \n"
 | 
| -    "sub       $0x10,%3                        \n"
 | 
| +    "vmovdqu   " MEMACCESS(0) ",%%ymm0         \n"
 | 
| +    "vmovdqu   " MEMACCESS2(0x20,0) ",%%ymm1   \n"
 | 
| +    "lea       " MEMLEA(0x40,0) ",%0           \n"
 | 
| +    "vpand     %%ymm5,%%ymm0,%%ymm0            \n"
 | 
| +    "vpand     %%ymm5,%%ymm1,%%ymm1            \n"
 | 
| +    "vpackuswb %%ymm1,%%ymm0,%%ymm0            \n"
 | 
| +    "vpermq    $0xd8,%%ymm0,%%ymm0             \n"
 | 
| +    "vpand     %%ymm5,%%ymm0,%%ymm1            \n"
 | 
| +    "vpsrlw    $0x8,%%ymm0,%%ymm0              \n"
 | 
| +    "vpackuswb %%ymm1,%%ymm1,%%ymm1            \n"
 | 
| +    "vpackuswb %%ymm0,%%ymm0,%%ymm0            \n"
 | 
| +    "vpermq    $0xd8,%%ymm1,%%ymm1             \n"
 | 
| +    "vpermq    $0xd8,%%ymm0,%%ymm0             \n"
 | 
| +    "vextractf128 $0x0,%%ymm1," MEMACCESS(1) " \n"
 | 
| +    VEXTOPMEM(vextractf128,0,ymm0,0x00,1,2,1) // vextractf128 $0x0,%%ymm0,(%1,%2,1)
 | 
| +    "lea      " MEMLEA(0x10,1) ",%1            \n"
 | 
| +    "sub       $0x20,%3                        \n"
 | 
|      "jg        1b                              \n"
 | 
| +    "vzeroupper                                \n"
 | 
|    : "+r"(src_uyvy),    // %0
 | 
|      "+r"(dst_u),       // %1
 | 
|      "+r"(dst_v),       // %2
 | 
|      "+r"(pix)          // %3
 | 
|    :
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm5"
 | 
| -#endif
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm5"
 | 
|    );
 | 
|  }
 | 
| -#endif  // HAS_YUY2TOYROW_SSE2
 | 
| +#endif  // HAS_YUY2TOYROW_AVX2
 | 
|  
 | 
|  #ifdef HAS_ARGBBLENDROW_SSE2
 | 
|  // Blend 8 pixels at a time.
 | 
| @@ -3956,9 +3124,9 @@ void ARGBBlendRow_SSE2(const uint8* src_argb0, const uint8* src_argb1,
 | 
|      "paddusb   %%xmm2,%%xmm0                   \n"
 | 
|      "pand      %%xmm5,%%xmm1                   \n"
 | 
|      "paddusb   %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x1,%3                         \n"
 | 
|      "movd      %%xmm0," MEMACCESS(2) "         \n"
 | 
|      "lea       " MEMLEA(0x4,2) ",%2            \n"
 | 
| +    "sub       $0x1,%3                         \n"
 | 
|      "jge       10b                             \n"
 | 
|  
 | 
|    "19:                                         \n"
 | 
| @@ -3988,9 +3156,9 @@ void ARGBBlendRow_SSE2(const uint8* src_argb0, const uint8* src_argb1,
 | 
|      "paddusb   %%xmm2,%%xmm0                   \n"
 | 
|      "pand      %%xmm5,%%xmm1                   \n"
 | 
|      "paddusb   %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x4,%3                         \n"
 | 
| -    "movdqa    %%xmm0," MEMACCESS(2) "         \n"
 | 
| +    "movdqu    %%xmm0," MEMACCESS(2) "         \n"
 | 
|      "lea       " MEMLEA(0x10,2) ",%2           \n"
 | 
| +    "sub       $0x4,%3                         \n"
 | 
|      "jge       41b                             \n"
 | 
|  
 | 
|    "49:                                         \n"
 | 
| @@ -4019,9 +3187,9 @@ void ARGBBlendRow_SSE2(const uint8* src_argb0, const uint8* src_argb1,
 | 
|      "paddusb   %%xmm2,%%xmm0                   \n"
 | 
|      "pand      %%xmm5,%%xmm1                   \n"
 | 
|      "paddusb   %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x1,%3                         \n"
 | 
|      "movd      %%xmm0," MEMACCESS(2) "         \n"
 | 
|      "lea       " MEMLEA(0x4,2) ",%2            \n"
 | 
| +    "sub       $0x1,%3                         \n"
 | 
|      "jge       91b                             \n"
 | 
|    "99:                                         \n"
 | 
|    : "+r"(src_argb0),    // %0
 | 
| @@ -4030,9 +3198,7 @@ void ARGBBlendRow_SSE2(const uint8* src_argb0, const uint8* src_argb1,
 | 
|      "+r"(width)         // %3
 | 
|    :
 | 
|    : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
|      , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7"
 | 
| -#endif
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_ARGBBLENDROW_SSE2
 | 
| @@ -4091,49 +3257,18 @@ void ARGBBlendRow_SSSE3(const uint8* src_argb0, const uint8* src_argb1,
 | 
|      "paddusb   %%xmm2,%%xmm0                   \n"
 | 
|      "pand      %%xmm5,%%xmm1                   \n"
 | 
|      "paddusb   %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x1,%3                         \n"
 | 
|      "movd      %%xmm0," MEMACCESS(2) "         \n"
 | 
|      "lea       " MEMLEA(0x4,2) ",%2            \n"
 | 
| +    "sub       $0x1,%3                         \n"
 | 
|      "jge       10b                             \n"
 | 
|  
 | 
|    "19:                                         \n"
 | 
|      "add       $1-4,%3                         \n"
 | 
|      "jl        49f                             \n"
 | 
| -    "test      $0xf,%0                         \n"
 | 
| -    "jne       41f                             \n"
 | 
| -    "test      $0xf,%1                         \n"
 | 
| -    "jne       41f                             \n"
 | 
|  
 | 
|      // 4 pixel loop.
 | 
|      LABELALIGN
 | 
|    "40:                                         \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm3         \n"
 | 
| -    "lea       " MEMLEA(0x10,0) ",%0           \n"
 | 
| -    "movdqa    %%xmm3,%%xmm0                   \n"
 | 
| -    "pxor      %%xmm4,%%xmm3                   \n"
 | 
| -    "movdqa    " MEMACCESS(1) ",%%xmm2         \n"
 | 
| -    "pshufb    %4,%%xmm3                       \n"
 | 
| -    "pand      %%xmm6,%%xmm2                   \n"
 | 
| -    "paddw     %%xmm7,%%xmm3                   \n"
 | 
| -    "pmullw    %%xmm3,%%xmm2                   \n"
 | 
| -    "movdqa    " MEMACCESS(1) ",%%xmm1         \n"
 | 
| -    "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| -    "psrlw     $0x8,%%xmm1                     \n"
 | 
| -    "por       %%xmm4,%%xmm0                   \n"
 | 
| -    "pmullw    %%xmm3,%%xmm1                   \n"
 | 
| -    "psrlw     $0x8,%%xmm2                     \n"
 | 
| -    "paddusb   %%xmm2,%%xmm0                   \n"
 | 
| -    "pand      %%xmm5,%%xmm1                   \n"
 | 
| -    "paddusb   %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x4,%3                         \n"
 | 
| -    "movdqa    %%xmm0," MEMACCESS(2) "         \n"
 | 
| -    "lea       " MEMLEA(0x10,2) ",%2           \n"
 | 
| -    "jge       40b                             \n"
 | 
| -    "jmp       49f                             \n"
 | 
| -
 | 
| -    // 4 pixel unaligned loop.
 | 
| -    LABELALIGN
 | 
| -  "41:                                         \n"
 | 
|      "movdqu    " MEMACCESS(0) ",%%xmm3         \n"
 | 
|      "lea       " MEMLEA(0x10,0) ",%0           \n"
 | 
|      "movdqa    %%xmm3,%%xmm0                   \n"
 | 
| @@ -4152,10 +3287,10 @@ void ARGBBlendRow_SSSE3(const uint8* src_argb0, const uint8* src_argb1,
 | 
|      "paddusb   %%xmm2,%%xmm0                   \n"
 | 
|      "pand      %%xmm5,%%xmm1                   \n"
 | 
|      "paddusb   %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x4,%3                         \n"
 | 
| -    "movdqa    %%xmm0," MEMACCESS(2) "         \n"
 | 
| +    "movdqu    %%xmm0," MEMACCESS(2) "         \n"
 | 
|      "lea       " MEMLEA(0x10,2) ",%2           \n"
 | 
| -    "jge       41b                             \n"
 | 
| +    "sub       $0x4,%3                         \n"
 | 
| +    "jge       40b                             \n"
 | 
|  
 | 
|    "49:                                         \n"
 | 
|      "add       $0x3,%3                         \n"
 | 
| @@ -4181,9 +3316,9 @@ void ARGBBlendRow_SSSE3(const uint8* src_argb0, const uint8* src_argb1,
 | 
|      "paddusb   %%xmm2,%%xmm0                   \n"
 | 
|      "pand      %%xmm5,%%xmm1                   \n"
 | 
|      "paddusb   %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x1,%3                         \n"
 | 
|      "movd      %%xmm0," MEMACCESS(2) "         \n"
 | 
|      "lea       " MEMLEA(0x4,2) ",%2            \n"
 | 
| +    "sub       $0x1,%3                         \n"
 | 
|      "jge       91b                             \n"
 | 
|    "99:                                         \n"
 | 
|    : "+r"(src_argb0),    // %0
 | 
| @@ -4192,16 +3327,13 @@ void ARGBBlendRow_SSSE3(const uint8* src_argb0, const uint8* src_argb1,
 | 
|      "+r"(width)         // %3
 | 
|    : "m"(kShuffleAlpha)  // %4
 | 
|    : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
|      , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7"
 | 
| -#endif
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_ARGBBLENDROW_SSSE3
 | 
|  
 | 
|  #ifdef HAS_ARGBATTENUATEROW_SSE2
 | 
|  // Attenuate 4 pixels at a time.
 | 
| -// aligned to 16 bytes
 | 
|  void ARGBAttenuateRow_SSE2(const uint8* src_argb, uint8* dst_argb, int width) {
 | 
|    asm volatile (
 | 
|      "pcmpeqb   %%xmm4,%%xmm4                   \n"
 | 
| @@ -4212,17 +3344,17 @@ void ARGBAttenuateRow_SSE2(const uint8* src_argb, uint8* dst_argb, int width) {
 | 
|      // 4 pixel loop.
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
|      "punpcklbw %%xmm0,%%xmm0                   \n"
 | 
|      "pshufhw   $0xff,%%xmm0,%%xmm2             \n"
 | 
|      "pshuflw   $0xff,%%xmm2,%%xmm2             \n"
 | 
|      "pmulhuw   %%xmm2,%%xmm0                   \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm1         \n"
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm1         \n"
 | 
|      "punpckhbw %%xmm1,%%xmm1                   \n"
 | 
|      "pshufhw   $0xff,%%xmm1,%%xmm2             \n"
 | 
|      "pshuflw   $0xff,%%xmm2,%%xmm2             \n"
 | 
|      "pmulhuw   %%xmm2,%%xmm1                   \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm2         \n"
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm2         \n"
 | 
|      "lea       " MEMLEA(0x10,0) ",%0           \n"
 | 
|      "psrlw     $0x8,%%xmm0                     \n"
 | 
|      "pand      %%xmm4,%%xmm2                   \n"
 | 
| @@ -4230,18 +3362,16 @@ void ARGBAttenuateRow_SSE2(const uint8* src_argb, uint8* dst_argb, int width) {
 | 
|      "packuswb  %%xmm1,%%xmm0                   \n"
 | 
|      "pand      %%xmm5,%%xmm0                   \n"
 | 
|      "por       %%xmm2,%%xmm0                   \n"
 | 
| -    "sub       $0x4,%2                         \n"
 | 
| -    "movdqa    %%xmm0," MEMACCESS(1) "         \n"
 | 
| +    "movdqu    %%xmm0," MEMACCESS(1) "         \n"
 | 
|      "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| +    "sub       $0x4,%2                         \n"
 | 
|      "jg        1b                              \n"
 | 
|    : "+r"(src_argb),    // %0
 | 
|      "+r"(dst_argb),    // %1
 | 
|      "+r"(width)        // %2
 | 
|    :
 | 
|    : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
|      , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
| -#endif
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_ARGBATTENUATEROW_SSE2
 | 
| @@ -4249,14 +3379,13 @@ void ARGBAttenuateRow_SSE2(const uint8* src_argb, uint8* dst_argb, int width) {
 | 
|  #ifdef HAS_ARGBATTENUATEROW_SSSE3
 | 
|  // Shuffle table duplicating alpha
 | 
|  static uvec8 kShuffleAlpha0 = {
 | 
| -  3u, 3u, 3u, 3u, 3u, 3u, 128u, 128u, 7u, 7u, 7u, 7u, 7u, 7u, 128u, 128u,
 | 
| +  3u, 3u, 3u, 3u, 3u, 3u, 128u, 128u, 7u, 7u, 7u, 7u, 7u, 7u, 128u, 128u
 | 
|  };
 | 
|  static uvec8 kShuffleAlpha1 = {
 | 
|    11u, 11u, 11u, 11u, 11u, 11u, 128u, 128u,
 | 
| -  15u, 15u, 15u, 15u, 15u, 15u, 128u, 128u,
 | 
| +  15u, 15u, 15u, 15u, 15u, 15u, 128u, 128u
 | 
|  };
 | 
|  // Attenuate 4 pixels at a time.
 | 
| -// aligned to 16 bytes
 | 
|  void ARGBAttenuateRow_SSSE3(const uint8* src_argb, uint8* dst_argb, int width) {
 | 
|    asm volatile (
 | 
|      "pcmpeqb   %%xmm3,%%xmm3                   \n"
 | 
| @@ -4284,9 +3413,9 @@ void ARGBAttenuateRow_SSSE3(const uint8* src_argb, uint8* dst_argb, int width) {
 | 
|      "psrlw     $0x8,%%xmm1                     \n"
 | 
|      "packuswb  %%xmm1,%%xmm0                   \n"
 | 
|      "por       %%xmm2,%%xmm0                   \n"
 | 
| -    "sub       $0x4,%2                         \n"
 | 
|      "movdqu    %%xmm0," MEMACCESS(1) "         \n"
 | 
|      "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| +    "sub       $0x4,%2                         \n"
 | 
|      "jg        1b                              \n"
 | 
|    : "+r"(src_argb),    // %0
 | 
|      "+r"(dst_argb),    // %1
 | 
| @@ -4294,16 +3423,56 @@ void ARGBAttenuateRow_SSSE3(const uint8* src_argb, uint8* dst_argb, int width) {
 | 
|    : "m"(kShuffleAlpha0),  // %3
 | 
|      "m"(kShuffleAlpha1)  // %4
 | 
|    : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
|      , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
| -#endif
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_ARGBATTENUATEROW_SSSE3
 | 
|  
 | 
| +#ifdef HAS_ARGBATTENUATEROW_AVX2
 | 
| +// Shuffle table duplicating alpha.
 | 
| +static const uvec8 kShuffleAlpha_AVX2 = {
 | 
| +  6u, 7u, 6u, 7u, 6u, 7u, 128u, 128u, 14u, 15u, 14u, 15u, 14u, 15u, 128u, 128u
 | 
| +};
 | 
| +// Attenuate 8 pixels at a time.
 | 
| +void ARGBAttenuateRow_AVX2(const uint8* src_argb, uint8* dst_argb, int width) {
 | 
| +  asm volatile (
 | 
| +    "vbroadcastf128 %3,%%ymm4                  \n"
 | 
| +    "vpcmpeqb   %%ymm5,%%ymm5,%%ymm5           \n"
 | 
| +    "vpslld     $0x18,%%ymm5,%%ymm5            \n"
 | 
| +    "sub        %0,%1                          \n"
 | 
| +
 | 
| +    // 8 pixel loop.
 | 
| +    LABELALIGN
 | 
| +  "1:                                          \n"
 | 
| +    "vmovdqu    " MEMACCESS(0) ",%%ymm6        \n"
 | 
| +    "vpunpcklbw %%ymm6,%%ymm6,%%ymm0           \n"
 | 
| +    "vpunpckhbw %%ymm6,%%ymm6,%%ymm1           \n"
 | 
| +    "vpshufb    %%ymm4,%%ymm0,%%ymm2           \n"
 | 
| +    "vpshufb    %%ymm4,%%ymm1,%%ymm3           \n"
 | 
| +    "vpmulhuw   %%ymm2,%%ymm0,%%ymm0           \n"
 | 
| +    "vpmulhuw   %%ymm3,%%ymm1,%%ymm1           \n"
 | 
| +    "vpand      %%ymm5,%%ymm6,%%ymm6           \n"
 | 
| +    "vpsrlw     $0x8,%%ymm0,%%ymm0             \n"
 | 
| +    "vpsrlw     $0x8,%%ymm1,%%ymm1             \n"
 | 
| +    "vpackuswb  %%ymm1,%%ymm0,%%ymm0           \n"
 | 
| +    "vpor       %%ymm6,%%ymm0,%%ymm0           \n"
 | 
| +    MEMOPMEM(vmovdqu,ymm0,0x00,0,1,1)          //  vmovdqu %%ymm0,(%0,%1)
 | 
| +    "lea       " MEMLEA(0x20,0) ",%0           \n"
 | 
| +    "sub        $0x8,%2                        \n"
 | 
| +    "jg        1b                              \n"
 | 
| +    "vzeroupper                                \n"
 | 
| +  : "+r"(src_argb),    // %0
 | 
| +    "+r"(dst_argb),    // %1
 | 
| +    "+r"(width)        // %2
 | 
| +  : "m"(kShuffleAlpha_AVX2)  // %3
 | 
| +  : "memory", "cc"
 | 
| +    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6"
 | 
| +  );
 | 
| +}
 | 
| +#endif  // HAS_ARGBATTENUATEROW_AVX2
 | 
| +
 | 
|  #ifdef HAS_ARGBUNATTENUATEROW_SSE2
 | 
|  // Unattenuate 4 pixels at a time.
 | 
| -// aligned to 16 bytes
 | 
|  void ARGBUnattenuateRow_SSE2(const uint8* src_argb, uint8* dst_argb,
 | 
|                               int width) {
 | 
|    uintptr_t alpha = 0;
 | 
| @@ -4324,7 +3493,6 @@ void ARGBUnattenuateRow_SSE2(const uint8* src_argb, uint8* dst_argb,
 | 
|      "movdqu    " MEMACCESS(0) ",%%xmm1         \n"
 | 
|      "movzb     " MEMACCESS2(0x0b,0) ",%3       \n"
 | 
|      "punpckhbw %%xmm1,%%xmm1                   \n"
 | 
| -    BUNDLEALIGN
 | 
|      MEMOPREG(movd,0x00,4,3,4,xmm2)             //  movd      0x0(%4,%3,4),%%xmm2
 | 
|      "movzb     " MEMACCESS2(0x0f,0) ",%3       \n"
 | 
|      MEMOPREG(movd,0x00,4,3,4,xmm3)             //  movd      0x0(%4,%3,4),%%xmm3
 | 
| @@ -4334,26 +3502,90 @@ void ARGBUnattenuateRow_SSE2(const uint8* src_argb, uint8* dst_argb,
 | 
|      "pmulhuw   %%xmm2,%%xmm1                   \n"
 | 
|      "lea       " MEMLEA(0x10,0) ",%0           \n"
 | 
|      "packuswb  %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x4,%2                         \n"
 | 
|      "movdqu    %%xmm0," MEMACCESS(1) "         \n"
 | 
|      "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| +    "sub       $0x4,%2                         \n"
 | 
|      "jg        1b                              \n"
 | 
|    : "+r"(src_argb),    // %0
 | 
|      "+r"(dst_argb),    // %1
 | 
|      "+r"(width),       // %2
 | 
|      "+r"(alpha)        // %3
 | 
|    : "r"(fixed_invtbl8)  // %4
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
| -#endif
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_ARGBUNATTENUATEROW_SSE2
 | 
|  
 | 
| +#ifdef HAS_ARGBUNATTENUATEROW_AVX2
 | 
| +// Shuffle table duplicating alpha.
 | 
| +static const uvec8 kUnattenShuffleAlpha_AVX2 = {
 | 
| +  0u, 1u, 0u, 1u, 0u, 1u, 6u, 7u, 8u, 9u, 8u, 9u, 8u, 9u, 14u, 15u
 | 
| +};
 | 
| +// Unattenuate 8 pixels at a time.
 | 
| +void ARGBUnattenuateRow_AVX2(const uint8* src_argb, uint8* dst_argb,
 | 
| +                             int width) {
 | 
| +  uintptr_t alpha = 0;
 | 
| +  asm volatile (
 | 
| +    "sub        %0,%1                          \n"
 | 
| +    "vbroadcastf128 %5,%%ymm5                  \n"
 | 
| +
 | 
| +    // 8 pixel loop.
 | 
| +    LABELALIGN
 | 
| +  "1:                                          \n"
 | 
| +    // replace VPGATHER
 | 
| +    "movzb     " MEMACCESS2(0x03,0) ",%3       \n"
 | 
| +    MEMOPREG(vmovd,0x00,4,3,4,xmm0)             //  vmovd 0x0(%4,%3,4),%%xmm0
 | 
| +    "movzb     " MEMACCESS2(0x07,0) ",%3       \n"
 | 
| +    MEMOPREG(vmovd,0x00,4,3,4,xmm1)             //  vmovd 0x0(%4,%3,4),%%xmm1
 | 
| +    "movzb     " MEMACCESS2(0x0b,0) ",%3       \n"
 | 
| +    "vpunpckldq %%xmm1,%%xmm0,%%xmm6           \n"
 | 
| +    MEMOPREG(vmovd,0x00,4,3,4,xmm2)             //  vmovd 0x0(%4,%3,4),%%xmm2
 | 
| +    "movzb     " MEMACCESS2(0x0f,0) ",%3       \n"
 | 
| +    MEMOPREG(vmovd,0x00,4,3,4,xmm3)             //  vmovd 0x0(%4,%3,4),%%xmm3
 | 
| +    "movzb     " MEMACCESS2(0x13,0) ",%3       \n"
 | 
| +    "vpunpckldq %%xmm3,%%xmm2,%%xmm7           \n"
 | 
| +    MEMOPREG(vmovd,0x00,4,3,4,xmm0)             //  vmovd 0x0(%4,%3,4),%%xmm0
 | 
| +    "movzb     " MEMACCESS2(0x17,0) ",%3       \n"
 | 
| +    MEMOPREG(vmovd,0x00,4,3,4,xmm1)             //  vmovd 0x0(%4,%3,4),%%xmm1
 | 
| +    "movzb     " MEMACCESS2(0x1b,0) ",%3       \n"
 | 
| +    "vpunpckldq %%xmm1,%%xmm0,%%xmm0           \n"
 | 
| +    MEMOPREG(vmovd,0x00,4,3,4,xmm2)             //  vmovd 0x0(%4,%3,4),%%xmm2
 | 
| +    "movzb     " MEMACCESS2(0x1f,0) ",%3       \n"
 | 
| +    MEMOPREG(vmovd,0x00,4,3,4,xmm3)             //  vmovd 0x0(%4,%3,4),%%xmm3
 | 
| +    "vpunpckldq %%xmm3,%%xmm2,%%xmm2           \n"
 | 
| +    "vpunpcklqdq %%xmm7,%%xmm6,%%xmm3          \n"
 | 
| +    "vpunpcklqdq %%xmm2,%%xmm0,%%xmm0          \n"
 | 
| +    "vinserti128 $0x1,%%xmm0,%%ymm3,%%ymm3     \n"
 | 
| +    // end of VPGATHER
 | 
| +
 | 
| +    "vmovdqu    " MEMACCESS(0) ",%%ymm6        \n"
 | 
| +    "vpunpcklbw %%ymm6,%%ymm6,%%ymm0           \n"
 | 
| +    "vpunpckhbw %%ymm6,%%ymm6,%%ymm1           \n"
 | 
| +    "vpunpcklwd %%ymm3,%%ymm3,%%ymm2           \n"
 | 
| +    "vpunpckhwd %%ymm3,%%ymm3,%%ymm3           \n"
 | 
| +    "vpshufb    %%ymm5,%%ymm2,%%ymm2           \n"
 | 
| +    "vpshufb    %%ymm5,%%ymm3,%%ymm3           \n"
 | 
| +    "vpmulhuw   %%ymm2,%%ymm0,%%ymm0           \n"
 | 
| +    "vpmulhuw   %%ymm3,%%ymm1,%%ymm1           \n"
 | 
| +    "vpackuswb  %%ymm1,%%ymm0,%%ymm0           \n"
 | 
| +    MEMOPMEM(vmovdqu,ymm0,0x00,0,1,1)          //  vmovdqu %%ymm0,(%0,%1)
 | 
| +    "lea       " MEMLEA(0x20,0) ",%0           \n"
 | 
| +    "sub        $0x8,%2                        \n"
 | 
| +    "jg        1b                              \n"
 | 
| +    "vzeroupper                                \n"
 | 
| +  : "+r"(src_argb),    // %0
 | 
| +    "+r"(dst_argb),    // %1
 | 
| +    "+r"(width),       // %2
 | 
| +    "+r"(alpha)        // %3
 | 
| +  : "r"(fixed_invtbl8),  // %4
 | 
| +    "m"(kUnattenShuffleAlpha_AVX2)  // %5
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7"
 | 
| +  );
 | 
| +}
 | 
| +#endif  // HAS_ARGBUNATTENUATEROW_AVX2
 | 
| +
 | 
|  #ifdef HAS_ARGBGRAYROW_SSSE3
 | 
|  // Convert 8 ARGB pixels (64 bytes) to 8 Gray ARGB pixels
 | 
|  void ARGBGrayRow_SSSE3(const uint8* src_argb, uint8* dst_argb, int width) {
 | 
| @@ -4364,16 +3596,16 @@ void ARGBGrayRow_SSSE3(const uint8* src_argb, uint8* dst_argb, int width) {
 | 
|      // 8 pixel loop.
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "movdqa    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| +    "movdqu    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
|      "pmaddubsw %%xmm4,%%xmm0                   \n"
 | 
|      "pmaddubsw %%xmm4,%%xmm1                   \n"
 | 
|      "phaddw    %%xmm1,%%xmm0                   \n"
 | 
|      "paddw     %%xmm5,%%xmm0                   \n"
 | 
|      "psrlw     $0x7,%%xmm0                     \n"
 | 
|      "packuswb  %%xmm0,%%xmm0                   \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm2         \n"
 | 
| -    "movdqa    " MEMACCESS2(0x10,0) ",%%xmm3   \n"
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm2         \n"
 | 
| +    "movdqu    " MEMACCESS2(0x10,0) ",%%xmm3   \n"
 | 
|      "lea       " MEMLEA(0x20,0) ",%0           \n"
 | 
|      "psrld     $0x18,%%xmm2                    \n"
 | 
|      "psrld     $0x18,%%xmm3                    \n"
 | 
| @@ -4385,10 +3617,10 @@ void ARGBGrayRow_SSSE3(const uint8* src_argb, uint8* dst_argb, int width) {
 | 
|      "movdqa    %%xmm0,%%xmm1                   \n"
 | 
|      "punpcklwd %%xmm3,%%xmm0                   \n"
 | 
|      "punpckhwd %%xmm3,%%xmm1                   \n"
 | 
| -    "sub       $0x8,%2                         \n"
 | 
| -    "movdqa    %%xmm0," MEMACCESS(1) "         \n"
 | 
| -    "movdqa    %%xmm1," MEMACCESS2(0x10,1) "   \n"
 | 
| +    "movdqu    %%xmm0," MEMACCESS(1) "         \n"
 | 
| +    "movdqu    %%xmm1," MEMACCESS2(0x10,1) "   \n"
 | 
|      "lea       " MEMLEA(0x20,1) ",%1           \n"
 | 
| +    "sub       $0x8,%2                         \n"
 | 
|      "jg        1b                              \n"
 | 
|    : "+r"(src_argb),   // %0
 | 
|      "+r"(dst_argb),   // %1
 | 
| @@ -4396,9 +3628,7 @@ void ARGBGrayRow_SSSE3(const uint8* src_argb, uint8* dst_argb, int width) {
 | 
|    : "m"(kARGBToYJ),   // %3
 | 
|      "m"(kAddYJ64)     // %4
 | 
|    : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
|      , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
| -#endif
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_ARGBGRAYROW_SSSE3
 | 
| @@ -4430,30 +3660,30 @@ void ARGBSepiaRow_SSSE3(uint8* dst_argb, int width) {
 | 
|      // 8 pixel loop.
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "movdqa    " MEMACCESS2(0x10,0) ",%%xmm6   \n"
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| +    "movdqu    " MEMACCESS2(0x10,0) ",%%xmm6   \n"
 | 
|      "pmaddubsw %%xmm2,%%xmm0                   \n"
 | 
|      "pmaddubsw %%xmm2,%%xmm6                   \n"
 | 
|      "phaddw    %%xmm6,%%xmm0                   \n"
 | 
|      "psrlw     $0x7,%%xmm0                     \n"
 | 
|      "packuswb  %%xmm0,%%xmm0                   \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm5         \n"
 | 
| -    "movdqa    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm5         \n"
 | 
| +    "movdqu    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
|      "pmaddubsw %%xmm3,%%xmm5                   \n"
 | 
|      "pmaddubsw %%xmm3,%%xmm1                   \n"
 | 
|      "phaddw    %%xmm1,%%xmm5                   \n"
 | 
|      "psrlw     $0x7,%%xmm5                     \n"
 | 
|      "packuswb  %%xmm5,%%xmm5                   \n"
 | 
|      "punpcklbw %%xmm5,%%xmm0                   \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm5         \n"
 | 
| -    "movdqa    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm5         \n"
 | 
| +    "movdqu    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
|      "pmaddubsw %%xmm4,%%xmm5                   \n"
 | 
|      "pmaddubsw %%xmm4,%%xmm1                   \n"
 | 
|      "phaddw    %%xmm1,%%xmm5                   \n"
 | 
|      "psrlw     $0x7,%%xmm5                     \n"
 | 
|      "packuswb  %%xmm5,%%xmm5                   \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm6         \n"
 | 
| -    "movdqa    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm6         \n"
 | 
| +    "movdqu    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
|      "psrld     $0x18,%%xmm6                    \n"
 | 
|      "psrld     $0x18,%%xmm1                    \n"
 | 
|      "packuswb  %%xmm1,%%xmm6                   \n"
 | 
| @@ -4462,10 +3692,10 @@ void ARGBSepiaRow_SSSE3(uint8* dst_argb, int width) {
 | 
|      "movdqa    %%xmm0,%%xmm1                   \n"
 | 
|      "punpcklwd %%xmm5,%%xmm0                   \n"
 | 
|      "punpckhwd %%xmm5,%%xmm1                   \n"
 | 
| -    "sub       $0x8,%1                         \n"
 | 
| -    "movdqa    %%xmm0," MEMACCESS(0) "         \n"
 | 
| -    "movdqa    %%xmm1," MEMACCESS2(0x10,0) "   \n"
 | 
| +    "movdqu    %%xmm0," MEMACCESS(0) "         \n"
 | 
| +    "movdqu    %%xmm1," MEMACCESS2(0x10,0) "   \n"
 | 
|      "lea       " MEMLEA(0x20,0) ",%0           \n"
 | 
| +    "sub       $0x8,%1                         \n"
 | 
|      "jg        1b                              \n"
 | 
|    : "+r"(dst_argb),      // %0
 | 
|      "+r"(width)          // %1
 | 
| @@ -4473,9 +3703,7 @@ void ARGBSepiaRow_SSSE3(uint8* dst_argb, int width) {
 | 
|      "m"(kARGBToSepiaG),  // %3
 | 
|      "m"(kARGBToSepiaR)   // %4
 | 
|    : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
|      , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6"
 | 
| -#endif
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_ARGBSEPIAROW_SSSE3
 | 
| @@ -4495,12 +3723,12 @@ void ARGBColorMatrixRow_SSSE3(const uint8* src_argb, uint8* dst_argb,
 | 
|      // 8 pixel loop.
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "movdqa    " MEMACCESS2(0x10,0) ",%%xmm7   \n"
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| +    "movdqu    " MEMACCESS2(0x10,0) ",%%xmm7   \n"
 | 
|      "pmaddubsw %%xmm2,%%xmm0                   \n"
 | 
|      "pmaddubsw %%xmm2,%%xmm7                   \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm6         \n"
 | 
| -    "movdqa    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm6         \n"
 | 
| +    "movdqu    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
|      "pmaddubsw %%xmm3,%%xmm6                   \n"
 | 
|      "pmaddubsw %%xmm3,%%xmm1                   \n"
 | 
|      "phaddsw   %%xmm7,%%xmm0                   \n"
 | 
| @@ -4510,13 +3738,13 @@ void ARGBColorMatrixRow_SSSE3(const uint8* src_argb, uint8* dst_argb,
 | 
|      "packuswb  %%xmm0,%%xmm0                   \n"
 | 
|      "packuswb  %%xmm6,%%xmm6                   \n"
 | 
|      "punpcklbw %%xmm6,%%xmm0                   \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm1         \n"
 | 
| -    "movdqa    " MEMACCESS2(0x10,0) ",%%xmm7   \n"
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm1         \n"
 | 
| +    "movdqu    " MEMACCESS2(0x10,0) ",%%xmm7   \n"
 | 
|      "pmaddubsw %%xmm4,%%xmm1                   \n"
 | 
|      "pmaddubsw %%xmm4,%%xmm7                   \n"
 | 
|      "phaddsw   %%xmm7,%%xmm1                   \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm6         \n"
 | 
| -    "movdqa    " MEMACCESS2(0x10,0) ",%%xmm7   \n"
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm6         \n"
 | 
| +    "movdqu    " MEMACCESS2(0x10,0) ",%%xmm7   \n"
 | 
|      "pmaddubsw %%xmm5,%%xmm6                   \n"
 | 
|      "pmaddubsw %%xmm5,%%xmm7                   \n"
 | 
|      "phaddsw   %%xmm7,%%xmm6                   \n"
 | 
| @@ -4528,27 +3756,24 @@ void ARGBColorMatrixRow_SSSE3(const uint8* src_argb, uint8* dst_argb,
 | 
|      "movdqa    %%xmm0,%%xmm6                   \n"
 | 
|      "punpcklwd %%xmm1,%%xmm0                   \n"
 | 
|      "punpckhwd %%xmm1,%%xmm6                   \n"
 | 
| -    "sub       $0x8,%2                         \n"
 | 
| -    "movdqa    %%xmm0," MEMACCESS(1) "         \n"
 | 
| -    "movdqa    %%xmm6," MEMACCESS2(0x10,1) "   \n"
 | 
| +    "movdqu    %%xmm0," MEMACCESS(1) "         \n"
 | 
| +    "movdqu    %%xmm6," MEMACCESS2(0x10,1) "   \n"
 | 
|      "lea       " MEMLEA(0x20,0) ",%0           \n"
 | 
|      "lea       " MEMLEA(0x20,1) ",%1           \n"
 | 
| +    "sub       $0x8,%2                         \n"
 | 
|      "jg        1b                              \n"
 | 
|    : "+r"(src_argb),      // %0
 | 
|      "+r"(dst_argb),      // %1
 | 
|      "+r"(width)          // %2
 | 
|    : "r"(matrix_argb)     // %3
 | 
|    : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
|      , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7"
 | 
| -#endif
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_ARGBCOLORMATRIXROW_SSSE3
 | 
|  
 | 
|  #ifdef HAS_ARGBQUANTIZEROW_SSE2
 | 
|  // Quantize 4 ARGB pixels (16 bytes).
 | 
| -// aligned to 16 bytes
 | 
|  void ARGBQuantizeRow_SSE2(uint8* dst_argb, int scale, int interval_size,
 | 
|                            int interval_offset, int width) {
 | 
|    asm volatile (
 | 
| @@ -4568,23 +3793,23 @@ void ARGBQuantizeRow_SSE2(uint8* dst_argb, int scale, int interval_size,
 | 
|      // 4 pixel loop.
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
|      "punpcklbw %%xmm5,%%xmm0                   \n"
 | 
|      "pmulhuw   %%xmm2,%%xmm0                   \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm1         \n"
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm1         \n"
 | 
|      "punpckhbw %%xmm5,%%xmm1                   \n"
 | 
|      "pmulhuw   %%xmm2,%%xmm1                   \n"
 | 
|      "pmullw    %%xmm3,%%xmm0                   \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm7         \n"
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm7         \n"
 | 
|      "pmullw    %%xmm3,%%xmm1                   \n"
 | 
|      "pand      %%xmm6,%%xmm7                   \n"
 | 
|      "paddw     %%xmm4,%%xmm0                   \n"
 | 
|      "paddw     %%xmm4,%%xmm1                   \n"
 | 
|      "packuswb  %%xmm1,%%xmm0                   \n"
 | 
|      "por       %%xmm7,%%xmm0                   \n"
 | 
| -    "sub       $0x4,%1                         \n"
 | 
| -    "movdqa    %%xmm0," MEMACCESS(0) "         \n"
 | 
| +    "movdqu    %%xmm0," MEMACCESS(0) "         \n"
 | 
|      "lea       " MEMLEA(0x10,0) ",%0           \n"
 | 
| +    "sub       $0x4,%1                         \n"
 | 
|      "jg        1b                              \n"
 | 
|    : "+r"(dst_argb),       // %0
 | 
|      "+r"(width)           // %1
 | 
| @@ -4592,16 +3817,13 @@ void ARGBQuantizeRow_SSE2(uint8* dst_argb, int scale, int interval_size,
 | 
|      "r"(interval_size),   // %3
 | 
|      "r"(interval_offset)  // %4
 | 
|    : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
|      , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7"
 | 
| -#endif
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_ARGBQUANTIZEROW_SSE2
 | 
|  
 | 
|  #ifdef HAS_ARGBSHADEROW_SSE2
 | 
|  // Shade 4 pixels at a time by specified value.
 | 
| -// Aligned to 16 bytes.
 | 
|  void ARGBShadeRow_SSE2(const uint8* src_argb, uint8* dst_argb, int width,
 | 
|                         uint32 value) {
 | 
|    asm volatile (
 | 
| @@ -4612,7 +3834,7 @@ void ARGBShadeRow_SSE2(const uint8* src_argb, uint8* dst_argb, int width,
 | 
|      // 4 pixel loop.
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
|      "lea       " MEMLEA(0x10,0) ",%0           \n"
 | 
|      "movdqa    %%xmm0,%%xmm1                   \n"
 | 
|      "punpcklbw %%xmm0,%%xmm0                   \n"
 | 
| @@ -4622,18 +3844,16 @@ void ARGBShadeRow_SSE2(const uint8* src_argb, uint8* dst_argb, int width,
 | 
|      "psrlw     $0x8,%%xmm0                     \n"
 | 
|      "psrlw     $0x8,%%xmm1                     \n"
 | 
|      "packuswb  %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x4,%2                         \n"
 | 
| -    "movdqa    %%xmm0," MEMACCESS(1) "         \n"
 | 
| +    "movdqu    %%xmm0," MEMACCESS(1) "         \n"
 | 
|      "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| +    "sub       $0x4,%2                         \n"
 | 
|      "jg        1b                              \n"
 | 
|    : "+r"(src_argb),  // %0
 | 
|      "+r"(dst_argb),  // %1
 | 
|      "+r"(width)      // %2
 | 
|    : "r"(value)       // %3
 | 
|    : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
|      , "xmm0", "xmm1", "xmm2"
 | 
| -#endif
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_ARGBSHADEROW_SSE2
 | 
| @@ -4643,7 +3863,7 @@ void ARGBShadeRow_SSE2(const uint8* src_argb, uint8* dst_argb, int width,
 | 
|  void ARGBMultiplyRow_SSE2(const uint8* src_argb0, const uint8* src_argb1,
 | 
|                            uint8* dst_argb, int width) {
 | 
|    asm volatile (
 | 
| -    "pxor      %%xmm5,%%xmm5                   \n"
 | 
| +    "pxor      %%xmm5,%%xmm5                  \n"
 | 
|  
 | 
|      // 4 pixel loop.
 | 
|      LABELALIGN
 | 
| @@ -4661,9 +3881,9 @@ void ARGBMultiplyRow_SSE2(const uint8* src_argb0, const uint8* src_argb1,
 | 
|      "pmulhuw   %%xmm2,%%xmm0                   \n"
 | 
|      "pmulhuw   %%xmm3,%%xmm1                   \n"
 | 
|      "packuswb  %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x4,%3                         \n"
 | 
|      "movdqu    %%xmm0," MEMACCESS(2) "         \n"
 | 
|      "lea       " MEMLEA(0x10,2) ",%2           \n"
 | 
| +    "sub       $0x4,%3                         \n"
 | 
|      "jg        1b                              \n"
 | 
|    : "+r"(src_argb0),  // %0
 | 
|      "+r"(src_argb1),  // %1
 | 
| @@ -4671,13 +3891,50 @@ void ARGBMultiplyRow_SSE2(const uint8* src_argb0, const uint8* src_argb1,
 | 
|      "+r"(width)       // %3
 | 
|    :
 | 
|    : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
|      , "xmm0", "xmm1", "xmm2", "xmm3", "xmm5"
 | 
| -#endif
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_ARGBMULTIPLYROW_SSE2
 | 
|  
 | 
| +#ifdef HAS_ARGBMULTIPLYROW_AVX2
 | 
| +// Multiply 2 rows of ARGB pixels together, 8 pixels at a time.
 | 
| +void ARGBMultiplyRow_AVX2(const uint8* src_argb0, const uint8* src_argb1,
 | 
| +                          uint8* dst_argb, int width) {
 | 
| +  asm volatile (
 | 
| +    "vpxor      %%ymm5,%%ymm5,%%ymm5           \n"
 | 
| +
 | 
| +    // 4 pixel loop.
 | 
| +    LABELALIGN
 | 
| +  "1:                                          \n"
 | 
| +    "vmovdqu    " MEMACCESS(0) ",%%ymm1        \n"
 | 
| +    "lea        " MEMLEA(0x20,0) ",%0          \n"
 | 
| +    "vmovdqu    " MEMACCESS(1) ",%%ymm3        \n"
 | 
| +    "lea        " MEMLEA(0x20,1) ",%1          \n"
 | 
| +    "vpunpcklbw %%ymm1,%%ymm1,%%ymm0           \n"
 | 
| +    "vpunpckhbw %%ymm1,%%ymm1,%%ymm1           \n"
 | 
| +    "vpunpcklbw %%ymm5,%%ymm3,%%ymm2           \n"
 | 
| +    "vpunpckhbw %%ymm5,%%ymm3,%%ymm3           \n"
 | 
| +    "vpmulhuw   %%ymm2,%%ymm0,%%ymm0           \n"
 | 
| +    "vpmulhuw   %%ymm3,%%ymm1,%%ymm1           \n"
 | 
| +    "vpackuswb  %%ymm1,%%ymm0,%%ymm0           \n"
 | 
| +    "vmovdqu    %%ymm0," MEMACCESS(2) "        \n"
 | 
| +    "lea       " MEMLEA(0x20,2) ",%2           \n"
 | 
| +    "sub        $0x8,%3                        \n"
 | 
| +    "jg        1b                              \n"
 | 
| +    "vzeroupper                                \n"
 | 
| +  : "+r"(src_argb0),  // %0
 | 
| +    "+r"(src_argb1),  // %1
 | 
| +    "+r"(dst_argb),   // %2
 | 
| +    "+r"(width)       // %3
 | 
| +  :
 | 
| +  : "memory", "cc"
 | 
| +#if defined(__AVX2__)
 | 
| +    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm5"
 | 
| +#endif
 | 
| +  );
 | 
| +}
 | 
| +#endif  // HAS_ARGBMULTIPLYROW_AVX2
 | 
| +
 | 
|  #ifdef HAS_ARGBADDROW_SSE2
 | 
|  // Add 2 rows of ARGB pixels together, 4 pixels at a time.
 | 
|  void ARGBAddRow_SSE2(const uint8* src_argb0, const uint8* src_argb1,
 | 
| @@ -4691,9 +3948,9 @@ void ARGBAddRow_SSE2(const uint8* src_argb0, const uint8* src_argb1,
 | 
|      "movdqu    " MEMACCESS(1) ",%%xmm1         \n"
 | 
|      "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
|      "paddusb   %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x4,%3                         \n"
 | 
|      "movdqu    %%xmm0," MEMACCESS(2) "         \n"
 | 
|      "lea       " MEMLEA(0x10,2) ",%2           \n"
 | 
| +    "sub       $0x4,%3                         \n"
 | 
|      "jg        1b                              \n"
 | 
|    : "+r"(src_argb0),  // %0
 | 
|      "+r"(src_argb1),  // %1
 | 
| @@ -4701,13 +3958,39 @@ void ARGBAddRow_SSE2(const uint8* src_argb0, const uint8* src_argb1,
 | 
|      "+r"(width)       // %3
 | 
|    :
 | 
|    : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
|      , "xmm0", "xmm1"
 | 
| -#endif
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_ARGBADDROW_SSE2
 | 
|  
 | 
| +#ifdef HAS_ARGBADDROW_AVX2
 | 
| +// Add 2 rows of ARGB pixels together, 4 pixels at a time.
 | 
| +void ARGBAddRow_AVX2(const uint8* src_argb0, const uint8* src_argb1,
 | 
| +                     uint8* dst_argb, int width) {
 | 
| +  asm volatile (
 | 
| +    // 4 pixel loop.
 | 
| +    LABELALIGN
 | 
| +  "1:                                          \n"
 | 
| +    "vmovdqu    " MEMACCESS(0) ",%%ymm0        \n"
 | 
| +    "lea        " MEMLEA(0x20,0) ",%0          \n"
 | 
| +    "vpaddusb   " MEMACCESS(1) ",%%ymm0,%%ymm0 \n"
 | 
| +    "lea        " MEMLEA(0x20,1) ",%1          \n"
 | 
| +    "vmovdqu    %%ymm0," MEMACCESS(2) "        \n"
 | 
| +    "lea        " MEMLEA(0x20,2) ",%2          \n"
 | 
| +    "sub        $0x8,%3                        \n"
 | 
| +    "jg        1b                              \n"
 | 
| +    "vzeroupper                                \n"
 | 
| +  : "+r"(src_argb0),  // %0
 | 
| +    "+r"(src_argb1),  // %1
 | 
| +    "+r"(dst_argb),   // %2
 | 
| +    "+r"(width)       // %3
 | 
| +  :
 | 
| +  : "memory", "cc"
 | 
| +    , "xmm0"
 | 
| +  );
 | 
| +}
 | 
| +#endif  // HAS_ARGBADDROW_AVX2
 | 
| +
 | 
|  #ifdef HAS_ARGBSUBTRACTROW_SSE2
 | 
|  // Subtract 2 rows of ARGB pixels, 4 pixels at a time.
 | 
|  void ARGBSubtractRow_SSE2(const uint8* src_argb0, const uint8* src_argb1,
 | 
| @@ -4721,9 +4004,9 @@ void ARGBSubtractRow_SSE2(const uint8* src_argb0, const uint8* src_argb1,
 | 
|      "movdqu    " MEMACCESS(1) ",%%xmm1         \n"
 | 
|      "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
|      "psubusb   %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x4,%3                         \n"
 | 
|      "movdqu    %%xmm0," MEMACCESS(2) "         \n"
 | 
|      "lea       " MEMLEA(0x10,2) ",%2           \n"
 | 
| +    "sub       $0x4,%3                         \n"
 | 
|      "jg        1b                              \n"
 | 
|    : "+r"(src_argb0),  // %0
 | 
|      "+r"(src_argb1),  // %1
 | 
| @@ -4731,13 +4014,39 @@ void ARGBSubtractRow_SSE2(const uint8* src_argb0, const uint8* src_argb1,
 | 
|      "+r"(width)       // %3
 | 
|    :
 | 
|    : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
|      , "xmm0", "xmm1"
 | 
| -#endif
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_ARGBSUBTRACTROW_SSE2
 | 
|  
 | 
| +#ifdef HAS_ARGBSUBTRACTROW_AVX2
 | 
| +// Subtract 2 rows of ARGB pixels, 8 pixels at a time.
 | 
| +void ARGBSubtractRow_AVX2(const uint8* src_argb0, const uint8* src_argb1,
 | 
| +                          uint8* dst_argb, int width) {
 | 
| +  asm volatile (
 | 
| +    // 4 pixel loop.
 | 
| +    LABELALIGN
 | 
| +  "1:                                          \n"
 | 
| +    "vmovdqu    " MEMACCESS(0) ",%%ymm0        \n"
 | 
| +    "lea        " MEMLEA(0x20,0) ",%0          \n"
 | 
| +    "vpsubusb   " MEMACCESS(1) ",%%ymm0,%%ymm0 \n"
 | 
| +    "lea        " MEMLEA(0x20,1) ",%1          \n"
 | 
| +    "vmovdqu    %%ymm0," MEMACCESS(2) "        \n"
 | 
| +    "lea        " MEMLEA(0x20,2) ",%2          \n"
 | 
| +    "sub        $0x8,%3                        \n"
 | 
| +    "jg        1b                              \n"
 | 
| +    "vzeroupper                                \n"
 | 
| +  : "+r"(src_argb0),  // %0
 | 
| +    "+r"(src_argb1),  // %1
 | 
| +    "+r"(dst_argb),   // %2
 | 
| +    "+r"(width)       // %3
 | 
| +  :
 | 
| +  : "memory", "cc"
 | 
| +    , "xmm0"
 | 
| +  );
 | 
| +}
 | 
| +#endif  // HAS_ARGBSUBTRACTROW_AVX2
 | 
| +
 | 
|  #ifdef HAS_SOBELXROW_SSE2
 | 
|  // SobelX as a matrix is
 | 
|  // -1  0  1
 | 
| @@ -4759,13 +4068,11 @@ void SobelXRow_SSE2(const uint8* src_y0, const uint8* src_y1,
 | 
|      "punpcklbw %%xmm5,%%xmm0                   \n"
 | 
|      "punpcklbw %%xmm5,%%xmm1                   \n"
 | 
|      "psubw     %%xmm1,%%xmm0                   \n"
 | 
| -    BUNDLEALIGN
 | 
|      MEMOPREG(movq,0x00,0,1,1,xmm1)             //  movq      (%0,%1,1),%%xmm1
 | 
|      MEMOPREG(movq,0x02,0,1,1,xmm2)             //  movq      0x2(%0,%1,1),%%xmm2
 | 
|      "punpcklbw %%xmm5,%%xmm1                   \n"
 | 
|      "punpcklbw %%xmm5,%%xmm2                   \n"
 | 
|      "psubw     %%xmm2,%%xmm1                   \n"
 | 
| -    BUNDLEALIGN
 | 
|      MEMOPREG(movq,0x00,0,2,1,xmm2)             //  movq      (%0,%2,1),%%xmm2
 | 
|      MEMOPREG(movq,0x02,0,2,1,xmm3)             //  movq      0x2(%0,%2,1),%%xmm3
 | 
|      "punpcklbw %%xmm5,%%xmm2                   \n"
 | 
| @@ -4778,10 +4085,9 @@ void SobelXRow_SSE2(const uint8* src_y0, const uint8* src_y1,
 | 
|      "psubw     %%xmm0,%%xmm1                   \n"
 | 
|      "pmaxsw    %%xmm1,%%xmm0                   \n"
 | 
|      "packuswb  %%xmm0,%%xmm0                   \n"
 | 
| -    "sub       $0x8,%4                         \n"
 | 
| -    BUNDLEALIGN
 | 
|      MEMOPMEM(movq,xmm0,0x00,0,3,1)             //  movq      %%xmm0,(%0,%3,1)
 | 
|      "lea       " MEMLEA(0x8,0) ",%0            \n"
 | 
| +    "sub       $0x8,%4                         \n"
 | 
|      "jg        1b                              \n"
 | 
|    : "+r"(src_y0),      // %0
 | 
|      "+r"(src_y1),      // %1
 | 
| @@ -4789,13 +4095,8 @@ void SobelXRow_SSE2(const uint8* src_y0, const uint8* src_y1,
 | 
|      "+r"(dst_sobelx),  // %3
 | 
|      "+r"(width)        // %4
 | 
|    :
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm5"
 | 
| -#endif
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm3", "xmm5"
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_SOBELXROW_SSE2
 | 
| @@ -4820,13 +4121,11 @@ void SobelYRow_SSE2(const uint8* src_y0, const uint8* src_y1,
 | 
|      "punpcklbw %%xmm5,%%xmm0                   \n"
 | 
|      "punpcklbw %%xmm5,%%xmm1                   \n"
 | 
|      "psubw     %%xmm1,%%xmm0                   \n"
 | 
| -    BUNDLEALIGN
 | 
|      "movq      " MEMACCESS2(0x1,0) ",%%xmm1    \n"
 | 
|      MEMOPREG(movq,0x01,0,1,1,xmm2)             //  movq      0x1(%0,%1,1),%%xmm2
 | 
|      "punpcklbw %%xmm5,%%xmm1                   \n"
 | 
|      "punpcklbw %%xmm5,%%xmm2                   \n"
 | 
|      "psubw     %%xmm2,%%xmm1                   \n"
 | 
| -    BUNDLEALIGN
 | 
|      "movq      " MEMACCESS2(0x2,0) ",%%xmm2    \n"
 | 
|      MEMOPREG(movq,0x02,0,1,1,xmm3)             //  movq      0x2(%0,%1,1),%%xmm3
 | 
|      "punpcklbw %%xmm5,%%xmm2                   \n"
 | 
| @@ -4839,23 +4138,17 @@ void SobelYRow_SSE2(const uint8* src_y0, const uint8* src_y1,
 | 
|      "psubw     %%xmm0,%%xmm1                   \n"
 | 
|      "pmaxsw    %%xmm1,%%xmm0                   \n"
 | 
|      "packuswb  %%xmm0,%%xmm0                   \n"
 | 
| -    "sub       $0x8,%3                         \n"
 | 
| -    BUNDLEALIGN
 | 
|      MEMOPMEM(movq,xmm0,0x00,0,2,1)             //  movq      %%xmm0,(%0,%2,1)
 | 
|      "lea       " MEMLEA(0x8,0) ",%0            \n"
 | 
| +    "sub       $0x8,%3                         \n"
 | 
|      "jg        1b                              \n"
 | 
|    : "+r"(src_y0),      // %0
 | 
|      "+r"(src_y1),      // %1
 | 
|      "+r"(dst_sobely),  // %2
 | 
|      "+r"(width)        // %3
 | 
|    :
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm5"
 | 
| -#endif
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm3", "xmm5"
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_SOBELYROW_SSE2
 | 
| @@ -4876,8 +4169,8 @@ void SobelRow_SSE2(const uint8* src_sobelx, const uint8* src_sobely,
 | 
|      // 8 pixel loop.
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    MEMOPREG(movdqa,0x00,0,1,1,xmm1)           //  movdqa    (%0,%1,1),%%xmm1
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| +    MEMOPREG(movdqu,0x00,0,1,1,xmm1)           //  movdqu    (%0,%1,1),%%xmm1
 | 
|      "lea       " MEMLEA(0x10,0) ",%0           \n"
 | 
|      "paddusb   %%xmm1,%%xmm0                   \n"
 | 
|      "movdqa    %%xmm0,%%xmm2                   \n"
 | 
| @@ -4893,25 +4186,20 @@ void SobelRow_SSE2(const uint8* src_sobelx, const uint8* src_sobely,
 | 
|      "punpckhwd %%xmm0,%%xmm0                   \n"
 | 
|      "por       %%xmm5,%%xmm3                   \n"
 | 
|      "por       %%xmm5,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%3                        \n"
 | 
| -    "movdqa    %%xmm1," MEMACCESS(2) "         \n"
 | 
| -    "movdqa    %%xmm2," MEMACCESS2(0x10,2) "   \n"
 | 
| -    "movdqa    %%xmm3," MEMACCESS2(0x20,2) "   \n"
 | 
| -    "movdqa    %%xmm0," MEMACCESS2(0x30,2) "   \n"
 | 
| +    "movdqu    %%xmm1," MEMACCESS(2) "         \n"
 | 
| +    "movdqu    %%xmm2," MEMACCESS2(0x10,2) "   \n"
 | 
| +    "movdqu    %%xmm3," MEMACCESS2(0x20,2) "   \n"
 | 
| +    "movdqu    %%xmm0," MEMACCESS2(0x30,2) "   \n"
 | 
|      "lea       " MEMLEA(0x40,2) ",%2           \n"
 | 
| +    "sub       $0x10,%3                        \n"
 | 
|      "jg        1b                              \n"
 | 
|    : "+r"(src_sobelx),  // %0
 | 
|      "+r"(src_sobely),  // %1
 | 
|      "+r"(dst_argb),    // %2
 | 
|      "+r"(width)        // %3
 | 
|    :
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm5"
 | 
| -#endif
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm3", "xmm5"
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_SOBELROW_SSE2
 | 
| @@ -4928,26 +4216,21 @@ void SobelToPlaneRow_SSE2(const uint8* src_sobelx, const uint8* src_sobely,
 | 
|      // 8 pixel loop.
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    MEMOPREG(movdqa,0x00,0,1,1,xmm1)           //  movdqa    (%0,%1,1),%%xmm1
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| +    MEMOPREG(movdqu,0x00,0,1,1,xmm1)           //  movdqu    (%0,%1,1),%%xmm1
 | 
|      "lea       " MEMLEA(0x10,0) ",%0           \n"
 | 
|      "paddusb   %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%3                        \n"
 | 
| -    "movdqa    %%xmm0," MEMACCESS(2) "         \n"
 | 
| +    "movdqu    %%xmm0," MEMACCESS(2) "         \n"
 | 
|      "lea       " MEMLEA(0x10,2) ",%2           \n"
 | 
| +    "sub       $0x10,%3                        \n"
 | 
|      "jg        1b                              \n"
 | 
|    : "+r"(src_sobelx),  // %0
 | 
|      "+r"(src_sobely),  // %1
 | 
|      "+r"(dst_y),       // %2
 | 
|      "+r"(width)        // %3
 | 
|    :
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1"
 | 
| -#endif
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1"
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_SOBELTOPLANEROW_SSE2
 | 
| @@ -4967,8 +4250,8 @@ void SobelXYRow_SSE2(const uint8* src_sobelx, const uint8* src_sobely,
 | 
|      // 8 pixel loop.
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    MEMOPREG(movdqa,0x00,0,1,1,xmm1)           //  movdqa    (%0,%1,1),%%xmm1
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| +    MEMOPREG(movdqu,0x00,0,1,1,xmm1)           //  movdqu    (%0,%1,1),%%xmm1
 | 
|      "lea       " MEMLEA(0x10,0) ",%0           \n"
 | 
|      "movdqa    %%xmm0,%%xmm2                   \n"
 | 
|      "paddusb   %%xmm1,%%xmm2                   \n"
 | 
| @@ -4984,25 +4267,20 @@ void SobelXYRow_SSE2(const uint8* src_sobelx, const uint8* src_sobely,
 | 
|      "movdqa    %%xmm1,%%xmm7                   \n"
 | 
|      "punpcklwd %%xmm0,%%xmm7                   \n"
 | 
|      "punpckhwd %%xmm0,%%xmm1                   \n"
 | 
| -    "sub       $0x10,%3                        \n"
 | 
| -    "movdqa    %%xmm6," MEMACCESS(2) "         \n"
 | 
| -    "movdqa    %%xmm4," MEMACCESS2(0x10,2) "   \n"
 | 
| -    "movdqa    %%xmm7," MEMACCESS2(0x20,2) "   \n"
 | 
| -    "movdqa    %%xmm1," MEMACCESS2(0x30,2) "   \n"
 | 
| +    "movdqu    %%xmm6," MEMACCESS(2) "         \n"
 | 
| +    "movdqu    %%xmm4," MEMACCESS2(0x10,2) "   \n"
 | 
| +    "movdqu    %%xmm7," MEMACCESS2(0x20,2) "   \n"
 | 
| +    "movdqu    %%xmm1," MEMACCESS2(0x30,2) "   \n"
 | 
|      "lea       " MEMLEA(0x40,2) ",%2           \n"
 | 
| +    "sub       $0x10,%3                        \n"
 | 
|      "jg        1b                              \n"
 | 
|    : "+r"(src_sobelx),  // %0
 | 
|      "+r"(src_sobely),  // %1
 | 
|      "+r"(dst_argb),    // %2
 | 
|      "+r"(width)        // %3
 | 
|    :
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7"
 | 
| -#endif
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7"
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_SOBELXYROW_SSE2
 | 
| @@ -5035,22 +4313,22 @@ void ComputeCumulativeSumRow_SSE2(const uint8* row, int32* cumsum,
 | 
|      "punpcklwd %%xmm1,%%xmm4                   \n"
 | 
|      "punpckhwd %%xmm1,%%xmm5                   \n"
 | 
|      "paddd     %%xmm2,%%xmm0                   \n"
 | 
| -    "movdqa    " MEMACCESS(2) ",%%xmm2         \n"
 | 
| +    "movdqu    " MEMACCESS(2) ",%%xmm2         \n"
 | 
|      "paddd     %%xmm0,%%xmm2                   \n"
 | 
|      "paddd     %%xmm3,%%xmm0                   \n"
 | 
| -    "movdqa    " MEMACCESS2(0x10,2) ",%%xmm3   \n"
 | 
| +    "movdqu    " MEMACCESS2(0x10,2) ",%%xmm3   \n"
 | 
|      "paddd     %%xmm0,%%xmm3                   \n"
 | 
|      "paddd     %%xmm4,%%xmm0                   \n"
 | 
| -    "movdqa    " MEMACCESS2(0x20,2) ",%%xmm4   \n"
 | 
| +    "movdqu    " MEMACCESS2(0x20,2) ",%%xmm4   \n"
 | 
|      "paddd     %%xmm0,%%xmm4                   \n"
 | 
|      "paddd     %%xmm5,%%xmm0                   \n"
 | 
| -    "movdqa    " MEMACCESS2(0x30,2) ",%%xmm5   \n"
 | 
| +    "movdqu    " MEMACCESS2(0x30,2) ",%%xmm5   \n"
 | 
|      "lea       " MEMLEA(0x40,2) ",%2           \n"
 | 
|      "paddd     %%xmm0,%%xmm5                   \n"
 | 
| -    "movdqa    %%xmm2," MEMACCESS(1) "         \n"
 | 
| -    "movdqa    %%xmm3," MEMACCESS2(0x10,1) "   \n"
 | 
| -    "movdqa    %%xmm4," MEMACCESS2(0x20,1) "   \n"
 | 
| -    "movdqa    %%xmm5," MEMACCESS2(0x30,1) "   \n"
 | 
| +    "movdqu    %%xmm2," MEMACCESS(1) "         \n"
 | 
| +    "movdqu    %%xmm3," MEMACCESS2(0x10,1) "   \n"
 | 
| +    "movdqu    %%xmm4," MEMACCESS2(0x20,1) "   \n"
 | 
| +    "movdqu    %%xmm5," MEMACCESS2(0x30,1) "   \n"
 | 
|      "lea       " MEMLEA(0x40,1) ",%1           \n"
 | 
|      "sub       $0x4,%3                         \n"
 | 
|      "jge       40b                             \n"
 | 
| @@ -5082,9 +4360,7 @@ void ComputeCumulativeSumRow_SSE2(const uint8* row, int32* cumsum,
 | 
|      "+r"(width)  // %3
 | 
|    :
 | 
|    : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
|      , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
| -#endif
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_COMPUTECUMULATIVESUMROW_SSE2
 | 
| @@ -5115,11 +4391,10 @@ void CumulativeSumToAverageRow_SSE2(const int32* topleft, const int32* botleft,
 | 
|    // 4 pixel small loop                        \n"
 | 
|      LABELALIGN
 | 
|    "4:                                         \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "movdqa    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| -    "movdqa    " MEMACCESS2(0x20,0) ",%%xmm2   \n"
 | 
| -    "movdqa    " MEMACCESS2(0x30,0) ",%%xmm3   \n"
 | 
| -    BUNDLEALIGN
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| +    "movdqu    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| +    "movdqu    " MEMACCESS2(0x20,0) ",%%xmm2   \n"
 | 
| +    "movdqu    " MEMACCESS2(0x30,0) ",%%xmm3   \n"
 | 
|      MEMOPREG(psubd,0x00,0,4,4,xmm0)            // psubd    0x00(%0,%4,4),%%xmm0
 | 
|      MEMOPREG(psubd,0x10,0,4,4,xmm1)            // psubd    0x10(%0,%4,4),%%xmm1
 | 
|      MEMOPREG(psubd,0x20,0,4,4,xmm2)            // psubd    0x20(%0,%4,4),%%xmm2
 | 
| @@ -5129,7 +4404,6 @@ void CumulativeSumToAverageRow_SSE2(const int32* topleft, const int32* botleft,
 | 
|      "psubd     " MEMACCESS2(0x10,1) ",%%xmm1   \n"
 | 
|      "psubd     " MEMACCESS2(0x20,1) ",%%xmm2   \n"
 | 
|      "psubd     " MEMACCESS2(0x30,1) ",%%xmm3   \n"
 | 
| -    BUNDLEALIGN
 | 
|      MEMOPREG(paddd,0x00,1,4,4,xmm0)            // paddd    0x00(%1,%4,4),%%xmm0
 | 
|      MEMOPREG(paddd,0x10,1,4,4,xmm1)            // paddd    0x10(%1,%4,4),%%xmm1
 | 
|      MEMOPREG(paddd,0x20,1,4,4,xmm2)            // paddd    0x20(%1,%4,4),%%xmm2
 | 
| @@ -5149,11 +4423,10 @@ void CumulativeSumToAverageRow_SSE2(const int32* topleft, const int32* botleft,
 | 
|    // 4 pixel loop                              \n"
 | 
|      LABELALIGN
 | 
|    "40:                                         \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "movdqa    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| -    "movdqa    " MEMACCESS2(0x20,0) ",%%xmm2   \n"
 | 
| -    "movdqa    " MEMACCESS2(0x30,0) ",%%xmm3   \n"
 | 
| -    BUNDLEALIGN
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| +    "movdqu    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| +    "movdqu    " MEMACCESS2(0x20,0) ",%%xmm2   \n"
 | 
| +    "movdqu    " MEMACCESS2(0x30,0) ",%%xmm3   \n"
 | 
|      MEMOPREG(psubd,0x00,0,4,4,xmm0)            // psubd    0x00(%0,%4,4),%%xmm0
 | 
|      MEMOPREG(psubd,0x10,0,4,4,xmm1)            // psubd    0x10(%0,%4,4),%%xmm1
 | 
|      MEMOPREG(psubd,0x20,0,4,4,xmm2)            // psubd    0x20(%0,%4,4),%%xmm2
 | 
| @@ -5163,7 +4436,6 @@ void CumulativeSumToAverageRow_SSE2(const int32* topleft, const int32* botleft,
 | 
|      "psubd     " MEMACCESS2(0x10,1) ",%%xmm1   \n"
 | 
|      "psubd     " MEMACCESS2(0x20,1) ",%%xmm2   \n"
 | 
|      "psubd     " MEMACCESS2(0x30,1) ",%%xmm3   \n"
 | 
| -    BUNDLEALIGN
 | 
|      MEMOPREG(paddd,0x00,1,4,4,xmm0)            // paddd    0x00(%1,%4,4),%%xmm0
 | 
|      MEMOPREG(paddd,0x10,1,4,4,xmm1)            // paddd    0x10(%1,%4,4),%%xmm1
 | 
|      MEMOPREG(paddd,0x20,1,4,4,xmm2)            // paddd    0x20(%1,%4,4),%%xmm2
 | 
| @@ -5196,11 +4468,10 @@ void CumulativeSumToAverageRow_SSE2(const int32* topleft, const int32* botleft,
 | 
|    // 1 pixel loop                              \n"
 | 
|      LABELALIGN
 | 
|    "10:                                         \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
|      MEMOPREG(psubd,0x00,0,4,4,xmm0)            // psubd    0x00(%0,%4,4),%%xmm0
 | 
|      "lea       " MEMLEA(0x10,0) ",%0           \n"
 | 
|      "psubd     " MEMACCESS(1) ",%%xmm0         \n"
 | 
| -    BUNDLEALIGN
 | 
|      MEMOPREG(paddd,0x00,1,4,4,xmm0)            // paddd    0x00(%1,%4,4),%%xmm0
 | 
|      "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
|      "cvtdq2ps  %%xmm0,%%xmm0                   \n"
 | 
| @@ -5219,13 +4490,8 @@ void CumulativeSumToAverageRow_SSE2(const int32* topleft, const int32* botleft,
 | 
|      "+rm"(count)    // %3
 | 
|    : "r"((intptr_t)(width)),  // %4
 | 
|      "rm"(area)     // %5
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6"
 | 
| -#endif
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6"
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_CUMULATIVESUMTOAVERAGEROW_SSE2
 | 
| @@ -5268,7 +4534,6 @@ void ARGBAffineRow_SSE2(const uint8* src_argb, int src_argb_stride,
 | 
|      "pshufd    $0x39,%%xmm0,%%xmm0             \n"
 | 
|      "movd      %%xmm0,%k5                      \n"
 | 
|      "pshufd    $0x39,%%xmm0,%%xmm0             \n"
 | 
| -    BUNDLEALIGN
 | 
|      MEMOPREG(movd,0x00,0,1,1,xmm1)             //  movd      (%0,%1,1),%%xmm1
 | 
|      MEMOPREG(movd,0x00,0,5,1,xmm6)             //  movd      (%0,%5,1),%%xmm6
 | 
|      "punpckldq %%xmm6,%%xmm1                   \n"
 | 
| @@ -5277,14 +4542,13 @@ void ARGBAffineRow_SSE2(const uint8* src_argb, int src_argb_stride,
 | 
|      "movd      %%xmm0,%k1                      \n"
 | 
|      "pshufd    $0x39,%%xmm0,%%xmm0             \n"
 | 
|      "movd      %%xmm0,%k5                      \n"
 | 
| -    BUNDLEALIGN
 | 
|      MEMOPREG(movd,0x00,0,1,1,xmm0)             //  movd      (%0,%1,1),%%xmm0
 | 
|      MEMOPREG(movd,0x00,0,5,1,xmm6)             //  movd      (%0,%5,1),%%xmm6
 | 
|      "punpckldq %%xmm6,%%xmm0                   \n"
 | 
|      "addps     %%xmm4,%%xmm3                   \n"
 | 
| -    "sub       $0x4,%4                         \n"
 | 
|      "movq      %%xmm0," MEMACCESS2(0x08,2) "   \n"
 | 
|      "lea       " MEMLEA(0x10,2) ",%2           \n"
 | 
| +    "sub       $0x4,%4                         \n"
 | 
|      "jge       40b                             \n"
 | 
|  
 | 
|    "49:                                         \n"
 | 
| @@ -5296,151 +4560,33 @@ void ARGBAffineRow_SSE2(const uint8* src_argb, int src_argb_stride,
 | 
|    "10:                                         \n"
 | 
|      "cvttps2dq %%xmm2,%%xmm0                   \n"
 | 
|      "packssdw  %%xmm0,%%xmm0                   \n"
 | 
| -    "pmaddwd   %%xmm5,%%xmm0                   \n"
 | 
| -    "addps     %%xmm7,%%xmm2                   \n"
 | 
| -    "movd      %%xmm0,%k1                      \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPREG(movd,0x00,0,1,1,xmm0)             //  movd      (%0,%1,1),%%xmm0
 | 
| -    "sub       $0x1,%4                         \n"
 | 
| -    "movd      %%xmm0," MEMACCESS(2) "         \n"
 | 
| -    "lea       " MEMLEA(0x04,2) ",%2           \n"
 | 
| -    "jge       10b                             \n"
 | 
| -  "19:                                         \n"
 | 
| -  : "+r"(src_argb),  // %0
 | 
| -    "+r"(src_argb_stride_temp),  // %1
 | 
| -    "+r"(dst_argb),  // %2
 | 
| -    "+r"(src_dudv),  // %3
 | 
| -    "+rm"(width),    // %4
 | 
| -    "+r"(temp)   // %5
 | 
| -  :
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7"
 | 
| -#endif
 | 
| -  );
 | 
| -}
 | 
| -#endif  // HAS_ARGBAFFINEROW_SSE2
 | 
| -
 | 
| -#ifdef HAS_INTERPOLATEROW_SSSE3
 | 
| -// Bilinear filter 16x2 -> 16x1
 | 
| -void InterpolateRow_SSSE3(uint8* dst_ptr, const uint8* src_ptr,
 | 
| -                          ptrdiff_t src_stride, int dst_width,
 | 
| -                          int source_y_fraction) {
 | 
| -  asm volatile (
 | 
| -    "sub       %1,%0                           \n"
 | 
| -    "shr       %3                              \n"
 | 
| -    "cmp       $0x0,%3                         \n"
 | 
| -    "je        100f                            \n"
 | 
| -    "cmp       $0x20,%3                        \n"
 | 
| -    "je        75f                             \n"
 | 
| -    "cmp       $0x40,%3                        \n"
 | 
| -    "je        50f                             \n"
 | 
| -    "cmp       $0x60,%3                        \n"
 | 
| -    "je        25f                             \n"
 | 
| -
 | 
| -    "movd      %3,%%xmm0                       \n"
 | 
| -    "neg       %3                              \n"
 | 
| -    "add       $0x80,%3                        \n"
 | 
| -    "movd      %3,%%xmm5                       \n"
 | 
| -    "punpcklbw %%xmm0,%%xmm5                   \n"
 | 
| -    "punpcklwd %%xmm5,%%xmm5                   \n"
 | 
| -    "pshufd    $0x0,%%xmm5,%%xmm5              \n"
 | 
| -
 | 
| -    // General purpose row blend.
 | 
| -    LABELALIGN
 | 
| -  "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(1) ",%%xmm0         \n"
 | 
| -    MEMOPREG(movdqa,0x00,1,4,1,xmm2)
 | 
| -    "movdqa    %%xmm0,%%xmm1                   \n"
 | 
| -    "punpcklbw %%xmm2,%%xmm0                   \n"
 | 
| -    "punpckhbw %%xmm2,%%xmm1                   \n"
 | 
| -    "pmaddubsw %%xmm5,%%xmm0                   \n"
 | 
| -    "pmaddubsw %%xmm5,%%xmm1                   \n"
 | 
| -    "psrlw     $0x7,%%xmm0                     \n"
 | 
| -    "psrlw     $0x7,%%xmm1                     \n"
 | 
| -    "packuswb  %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%2                        \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPMEM(movdqa,xmm0,0x00,1,0,1)
 | 
| -    "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| -    "jg        1b                              \n"
 | 
| -    "jmp       99f                             \n"
 | 
| -
 | 
| -    // Blend 25 / 75.
 | 
| -    LABELALIGN
 | 
| -  "25:                                         \n"
 | 
| -    "movdqa    " MEMACCESS(1) ",%%xmm0         \n"
 | 
| -    MEMOPREG(movdqa,0x00,1,4,1,xmm1)
 | 
| -    "pavgb     %%xmm1,%%xmm0                   \n"
 | 
| -    "pavgb     %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%2                        \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPMEM(movdqa,xmm0,0x00,1,0,1)
 | 
| -    "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| -    "jg        25b                             \n"
 | 
| -    "jmp       99f                             \n"
 | 
| -
 | 
| -    // Blend 50 / 50.
 | 
| -    LABELALIGN
 | 
| -  "50:                                         \n"
 | 
| -    "movdqa    " MEMACCESS(1) ",%%xmm0         \n"
 | 
| -    MEMOPREG(movdqa,0x00,1,4,1,xmm1)
 | 
| -    "pavgb     %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%2                        \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPMEM(movdqa,xmm0,0x00,1,0,1)
 | 
| -    "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| -    "jg        50b                             \n"
 | 
| -    "jmp       99f                             \n"
 | 
| -
 | 
| -    // Blend 75 / 25.
 | 
| -    LABELALIGN
 | 
| -  "75:                                         \n"
 | 
| -    "movdqa    " MEMACCESS(1) ",%%xmm1         \n"
 | 
| -    MEMOPREG(movdqa,0x00,1,4,1,xmm0)
 | 
| -    "pavgb     %%xmm1,%%xmm0                   \n"
 | 
| -    "pavgb     %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%2                        \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPMEM(movdqa,xmm0,0x00,1,0,1)
 | 
| -    "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| -    "jg        75b                             \n"
 | 
| -    "jmp       99f                             \n"
 | 
| -
 | 
| -    // Blend 100 / 0 - Copy row unchanged.
 | 
| -    LABELALIGN
 | 
| -  "100:                                        \n"
 | 
| -    "movdqa    " MEMACCESS(1) ",%%xmm0         \n"
 | 
| -    "sub       $0x10,%2                        \n"
 | 
| -    MEMOPMEM(movdqa,xmm0,0x00,1,0,1)
 | 
| -    "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| -    "jg        100b                            \n"
 | 
| -
 | 
| -  "99:                                         \n"
 | 
| -  : "+r"(dst_ptr),    // %0
 | 
| -    "+r"(src_ptr),    // %1
 | 
| -    "+r"(dst_width),  // %2
 | 
| -    "+r"(source_y_fraction)  // %3
 | 
| -  : "r"((intptr_t)(src_stride))  // %4
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm5"
 | 
| -#endif
 | 
| +    "pmaddwd   %%xmm5,%%xmm0                   \n"
 | 
| +    "addps     %%xmm7,%%xmm2                   \n"
 | 
| +    "movd      %%xmm0,%k1                      \n"
 | 
| +    MEMOPREG(movd,0x00,0,1,1,xmm0)             //  movd      (%0,%1,1),%%xmm0
 | 
| +    "movd      %%xmm0," MEMACCESS(2) "         \n"
 | 
| +    "lea       " MEMLEA(0x04,2) ",%2           \n"
 | 
| +    "sub       $0x1,%4                         \n"
 | 
| +    "jge       10b                             \n"
 | 
| +  "19:                                         \n"
 | 
| +  : "+r"(src_argb),  // %0
 | 
| +    "+r"(src_argb_stride_temp),  // %1
 | 
| +    "+r"(dst_argb),  // %2
 | 
| +    "+r"(src_dudv),  // %3
 | 
| +    "+rm"(width),    // %4
 | 
| +    "+r"(temp)   // %5
 | 
| +  :
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7"
 | 
|    );
 | 
|  }
 | 
| -#endif  // HAS_INTERPOLATEROW_SSSE3
 | 
| +#endif  // HAS_ARGBAFFINEROW_SSE2
 | 
|  
 | 
| -#ifdef HAS_INTERPOLATEROW_SSE2
 | 
| +#ifdef HAS_INTERPOLATEROW_SSSE3
 | 
|  // Bilinear filter 16x2 -> 16x1
 | 
| -void InterpolateRow_SSE2(uint8* dst_ptr, const uint8* src_ptr,
 | 
| -                         ptrdiff_t src_stride, int dst_width,
 | 
| -                         int source_y_fraction) {
 | 
| +void InterpolateRow_SSSE3(uint8* dst_ptr, const uint8* src_ptr,
 | 
| +                          ptrdiff_t src_stride, int dst_width,
 | 
| +                          int source_y_fraction) {
 | 
|    asm volatile (
 | 
|      "sub       %1,%0                           \n"
 | 
|      "shr       %3                              \n"
 | 
| @@ -5460,83 +4606,71 @@ void InterpolateRow_SSE2(uint8* dst_ptr, const uint8* src_ptr,
 | 
|      "punpcklbw %%xmm0,%%xmm5                   \n"
 | 
|      "punpcklwd %%xmm5,%%xmm5                   \n"
 | 
|      "pshufd    $0x0,%%xmm5,%%xmm5              \n"
 | 
| -    "pxor      %%xmm4,%%xmm4                   \n"
 | 
|  
 | 
|      // General purpose row blend.
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(1) ",%%xmm0         \n"
 | 
| -    MEMOPREG(movdqa,0x00,1,4,1,xmm2)           //  movdqa    (%1,%4,1),%%xmm2
 | 
| +    "movdqu    " MEMACCESS(1) ",%%xmm0         \n"
 | 
| +    MEMOPREG(movdqu,0x00,1,4,1,xmm2)
 | 
|      "movdqa    %%xmm0,%%xmm1                   \n"
 | 
| -    "movdqa    %%xmm2,%%xmm3                   \n"
 | 
| -    "punpcklbw %%xmm4,%%xmm2                   \n"
 | 
| -    "punpckhbw %%xmm4,%%xmm3                   \n"
 | 
| -    "punpcklbw %%xmm4,%%xmm0                   \n"
 | 
| -    "punpckhbw %%xmm4,%%xmm1                   \n"
 | 
| -    "psubw     %%xmm0,%%xmm2                   \n"
 | 
| -    "psubw     %%xmm1,%%xmm3                   \n"
 | 
| -    "paddw     %%xmm2,%%xmm2                   \n"
 | 
| -    "paddw     %%xmm3,%%xmm3                   \n"
 | 
| -    "pmulhw    %%xmm5,%%xmm2                   \n"
 | 
| -    "pmulhw    %%xmm5,%%xmm3                   \n"
 | 
| -    "paddw     %%xmm2,%%xmm0                   \n"
 | 
| -    "paddw     %%xmm3,%%xmm1                   \n"
 | 
| +    "punpcklbw %%xmm2,%%xmm0                   \n"
 | 
| +    "punpckhbw %%xmm2,%%xmm1                   \n"
 | 
| +    "pmaddubsw %%xmm5,%%xmm0                   \n"
 | 
| +    "pmaddubsw %%xmm5,%%xmm1                   \n"
 | 
| +    "psrlw     $0x7,%%xmm0                     \n"
 | 
| +    "psrlw     $0x7,%%xmm1                     \n"
 | 
|      "packuswb  %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%2                        \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPMEM(movdqa,xmm0,0x00,1,0,1)           //  movdqa    %%xmm0,(%1,%0,1)
 | 
| +    MEMOPMEM(movdqu,xmm0,0x00,1,0,1)
 | 
|      "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| +    "sub       $0x10,%2                        \n"
 | 
|      "jg        1b                              \n"
 | 
|      "jmp       99f                             \n"
 | 
|  
 | 
|      // Blend 25 / 75.
 | 
|      LABELALIGN
 | 
|    "25:                                         \n"
 | 
| -    "movdqa    " MEMACCESS(1) ",%%xmm0         \n"
 | 
| -    MEMOPREG(movdqa,0x00,1,4,1,xmm1)           //  movdqa    (%1,%4,1),%%xmm1
 | 
| +    "movdqu    " MEMACCESS(1) ",%%xmm0         \n"
 | 
| +    MEMOPREG(movdqu,0x00,1,4,1,xmm1)
 | 
|      "pavgb     %%xmm1,%%xmm0                   \n"
 | 
|      "pavgb     %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%2                        \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPMEM(movdqa,xmm0,0x00,1,0,1)           //  movdqa    %%xmm0,(%1,%0,1)
 | 
| +    MEMOPMEM(movdqu,xmm0,0x00,1,0,1)
 | 
|      "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| +    "sub       $0x10,%2                        \n"
 | 
|      "jg        25b                             \n"
 | 
|      "jmp       99f                             \n"
 | 
|  
 | 
|      // Blend 50 / 50.
 | 
|      LABELALIGN
 | 
|    "50:                                         \n"
 | 
| -    "movdqa    " MEMACCESS(1) ",%%xmm0         \n"
 | 
| -    MEMOPREG(movdqa,0x00,1,4,1,xmm1)           //  movdqa    (%1,%4,1),%%xmm1
 | 
| +    "movdqu    " MEMACCESS(1) ",%%xmm0         \n"
 | 
| +    MEMOPREG(movdqu,0x00,1,4,1,xmm1)
 | 
|      "pavgb     %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%2                        \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPMEM(movdqa,xmm0,0x00,1,0,1)           //  movdqa    %%xmm0,(%1,%0,1)
 | 
| +    MEMOPMEM(movdqu,xmm0,0x00,1,0,1)
 | 
|      "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| +    "sub       $0x10,%2                        \n"
 | 
|      "jg        50b                             \n"
 | 
|      "jmp       99f                             \n"
 | 
|  
 | 
|      // Blend 75 / 25.
 | 
|      LABELALIGN
 | 
|    "75:                                         \n"
 | 
| -    "movdqa    " MEMACCESS(1) ",%%xmm1         \n"
 | 
| -    MEMOPREG(movdqa,0x00,1,4,1,xmm0)           //  movdqa    (%1,%4,1),%%xmm0
 | 
| +    "movdqu    " MEMACCESS(1) ",%%xmm1         \n"
 | 
| +    MEMOPREG(movdqu,0x00,1,4,1,xmm0)
 | 
|      "pavgb     %%xmm1,%%xmm0                   \n"
 | 
|      "pavgb     %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%2                        \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPMEM(movdqa,xmm0,0x00,1,0,1)           //  movdqa    %%xmm0,(%1,%0,1)
 | 
| +    MEMOPMEM(movdqu,xmm0,0x00,1,0,1)
 | 
|      "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| +    "sub       $0x10,%2                        \n"
 | 
|      "jg        75b                             \n"
 | 
|      "jmp       99f                             \n"
 | 
|  
 | 
|      // Blend 100 / 0 - Copy row unchanged.
 | 
|      LABELALIGN
 | 
|    "100:                                        \n"
 | 
| -    "movdqa    " MEMACCESS(1) ",%%xmm0         \n"
 | 
| -    "sub       $0x10,%2                        \n"
 | 
| -    MEMOPMEM(movdqa,xmm0,0x00,1,0,1)           //  movdqa    %%xmm0,(%1,%0,1)
 | 
| +    "movdqu    " MEMACCESS(1) ",%%xmm0         \n"
 | 
| +    MEMOPMEM(movdqu,xmm0,0x00,1,0,1)
 | 
|      "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| +    "sub       $0x10,%2                        \n"
 | 
|      "jg        100b                            \n"
 | 
|  
 | 
|    "99:                                         \n"
 | 
| @@ -5545,27 +4679,22 @@ void InterpolateRow_SSE2(uint8* dst_ptr, const uint8* src_ptr,
 | 
|      "+r"(dst_width),  // %2
 | 
|      "+r"(source_y_fraction)  // %3
 | 
|    : "r"((intptr_t)(src_stride))  // %4
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
| -#endif
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm5"
 | 
|    );
 | 
|  }
 | 
| -#endif  // HAS_INTERPOLATEROW_SSE2
 | 
| +#endif  // HAS_INTERPOLATEROW_SSSE3
 | 
|  
 | 
| -#ifdef HAS_INTERPOLATEROW_SSSE3
 | 
| -// Bilinear filter 16x2 -> 16x1
 | 
| -void InterpolateRow_Unaligned_SSSE3(uint8* dst_ptr, const uint8* src_ptr,
 | 
| -                                    ptrdiff_t src_stride, int dst_width,
 | 
| -                                    int source_y_fraction) {
 | 
| +#ifdef HAS_INTERPOLATEROW_AVX2
 | 
| +// Bilinear filter 32x2 -> 32x1
 | 
| +void InterpolateRow_AVX2(uint8* dst_ptr, const uint8* src_ptr,
 | 
| +                         ptrdiff_t src_stride, int dst_width,
 | 
| +                         int source_y_fraction) {
 | 
|    asm volatile (
 | 
| -    "sub       %1,%0                           \n"
 | 
|      "shr       %3                              \n"
 | 
|      "cmp       $0x0,%3                         \n"
 | 
|      "je        100f                            \n"
 | 
| +    "sub       %1,%0                           \n"
 | 
|      "cmp       $0x20,%3                        \n"
 | 
|      "je        75f                             \n"
 | 
|      "cmp       $0x40,%3                        \n"
 | 
| @@ -5573,106 +4702,95 @@ void InterpolateRow_Unaligned_SSSE3(uint8* dst_ptr, const uint8* src_ptr,
 | 
|      "cmp       $0x60,%3                        \n"
 | 
|      "je        25f                             \n"
 | 
|  
 | 
| -    "movd      %3,%%xmm0                       \n"
 | 
| -    "neg       %3                              \n"
 | 
| -    "add       $0x80,%3                        \n"
 | 
| -    "movd      %3,%%xmm5                       \n"
 | 
| -    "punpcklbw %%xmm0,%%xmm5                   \n"
 | 
| -    "punpcklwd %%xmm5,%%xmm5                   \n"
 | 
| -    "pshufd    $0x0,%%xmm5,%%xmm5              \n"
 | 
| +    "vmovd      %3,%%xmm0                      \n"
 | 
| +    "neg        %3                             \n"
 | 
| +    "add        $0x80,%3                       \n"
 | 
| +    "vmovd      %3,%%xmm5                      \n"
 | 
| +    "vpunpcklbw %%xmm0,%%xmm5,%%xmm5           \n"
 | 
| +    "vpunpcklwd %%xmm5,%%xmm5,%%xmm5           \n"
 | 
| +    "vpxor      %%ymm0,%%ymm0,%%ymm0           \n"
 | 
| +    "vpermd     %%ymm5,%%ymm0,%%ymm5           \n"
 | 
|  
 | 
|      // General purpose row blend.
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    "movdqu    " MEMACCESS(1) ",%%xmm0         \n"
 | 
| -    MEMOPREG(movdqu,0x00,1,4,1,xmm2)
 | 
| -    "movdqu    %%xmm0,%%xmm1                   \n"
 | 
| -    "punpcklbw %%xmm2,%%xmm0                   \n"
 | 
| -    "punpckhbw %%xmm2,%%xmm1                   \n"
 | 
| -    "pmaddubsw %%xmm5,%%xmm0                   \n"
 | 
| -    "pmaddubsw %%xmm5,%%xmm1                   \n"
 | 
| -    "psrlw     $0x7,%%xmm0                     \n"
 | 
| -    "psrlw     $0x7,%%xmm1                     \n"
 | 
| -    "packuswb  %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%2                        \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPMEM(movdqu,xmm0,0x00,1,0,1)
 | 
| -    "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| +    "vmovdqu    " MEMACCESS(1) ",%%ymm0        \n"
 | 
| +    MEMOPREG(vmovdqu,0x00,1,4,1,ymm2)
 | 
| +    "vpunpckhbw %%ymm2,%%ymm0,%%ymm1           \n"
 | 
| +    "vpunpcklbw %%ymm2,%%ymm0,%%ymm0           \n"
 | 
| +    "vpmaddubsw %%ymm5,%%ymm0,%%ymm0           \n"
 | 
| +    "vpmaddubsw %%ymm5,%%ymm1,%%ymm1           \n"
 | 
| +    "vpsrlw     $0x7,%%ymm0,%%ymm0             \n"
 | 
| +    "vpsrlw     $0x7,%%ymm1,%%ymm1             \n"
 | 
| +    "vpackuswb  %%ymm1,%%ymm0,%%ymm0           \n"
 | 
| +    MEMOPMEM(vmovdqu,ymm0,0x00,1,0,1)
 | 
| +    "lea       " MEMLEA(0x20,1) ",%1           \n"
 | 
| +    "sub       $0x20,%2                        \n"
 | 
|      "jg        1b                              \n"
 | 
|      "jmp       99f                             \n"
 | 
|  
 | 
|      // Blend 25 / 75.
 | 
|      LABELALIGN
 | 
|    "25:                                         \n"
 | 
| -    "movdqu    " MEMACCESS(1) ",%%xmm0         \n"
 | 
| -    MEMOPREG(movdqu,0x00,1,4,1,xmm1)
 | 
| -    "pavgb     %%xmm1,%%xmm0                   \n"
 | 
| -    "pavgb     %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%2                        \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPMEM(movdqu,xmm0,0x00,1,0,1)
 | 
| -    "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| +    "vmovdqu    " MEMACCESS(1) ",%%ymm0        \n"
 | 
| +    MEMOPREG(vmovdqu,0x00,1,4,1,ymm1)
 | 
| +    "vpavgb     %%ymm1,%%ymm0,%%ymm0           \n"
 | 
| +    "vpavgb     %%ymm1,%%ymm0,%%ymm0           \n"
 | 
| +    MEMOPMEM(vmovdqu,ymm0,0x00,1,0,1)
 | 
| +    "lea       " MEMLEA(0x20,1) ",%1           \n"
 | 
| +    "sub       $0x20,%2                        \n"
 | 
|      "jg        25b                             \n"
 | 
|      "jmp       99f                             \n"
 | 
|  
 | 
|      // Blend 50 / 50.
 | 
|      LABELALIGN
 | 
|    "50:                                         \n"
 | 
| -    "movdqu    " MEMACCESS(1) ",%%xmm0         \n"
 | 
| -    MEMOPREG(movdqu,0x00,1,4,1,xmm1)
 | 
| -    "pavgb     %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%2                        \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPMEM(movdqu,xmm0,0x00,1,0,1)
 | 
| -    "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| +    "vmovdqu    " MEMACCESS(1) ",%%ymm0        \n"
 | 
| +    VMEMOPREG(vpavgb,0x00,1,4,1,ymm0,ymm0)     // vpavgb (%1,%4,1),%%ymm0,%%ymm0
 | 
| +    MEMOPMEM(vmovdqu,ymm0,0x00,1,0,1)
 | 
| +    "lea       " MEMLEA(0x20,1) ",%1           \n"
 | 
| +    "sub       $0x20,%2                        \n"
 | 
|      "jg        50b                             \n"
 | 
|      "jmp       99f                             \n"
 | 
|  
 | 
|      // Blend 75 / 25.
 | 
|      LABELALIGN
 | 
|    "75:                                         \n"
 | 
| -    "movdqu    " MEMACCESS(1) ",%%xmm1         \n"
 | 
| -    MEMOPREG(movdqu,0x00,1,4,1,xmm0)
 | 
| -    "pavgb     %%xmm1,%%xmm0                   \n"
 | 
| -    "pavgb     %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%2                        \n"
 | 
| -    BUNDLEALIGN
 | 
| -    MEMOPMEM(movdqu,xmm0,0x00,1,0,1)
 | 
| -    "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| +    "vmovdqu    " MEMACCESS(1) ",%%ymm1        \n"
 | 
| +    MEMOPREG(vmovdqu,0x00,1,4,1,ymm0)
 | 
| +    "vpavgb     %%ymm1,%%ymm0,%%ymm0           \n"
 | 
| +    "vpavgb     %%ymm1,%%ymm0,%%ymm0           \n"
 | 
| +    MEMOPMEM(vmovdqu,ymm0,0x00,1,0,1)
 | 
| +    "lea       " MEMLEA(0x20,1) ",%1           \n"
 | 
| +    "sub       $0x20,%2                        \n"
 | 
|      "jg        75b                             \n"
 | 
|      "jmp       99f                             \n"
 | 
|  
 | 
|      // Blend 100 / 0 - Copy row unchanged.
 | 
|      LABELALIGN
 | 
|    "100:                                        \n"
 | 
| -    "movdqu    " MEMACCESS(1) ",%%xmm0         \n"
 | 
| -    "sub       $0x10,%2                        \n"
 | 
| -    MEMOPMEM(movdqu,xmm0,0x00,1,0,1)
 | 
| -    "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| -    "jg        100b                            \n"
 | 
| +    "rep movsb " MEMMOVESTRING(1,0) "          \n"
 | 
| +    "jmp       999f                            \n"
 | 
|  
 | 
|    "99:                                         \n"
 | 
| -  : "+r"(dst_ptr),    // %0
 | 
| -    "+r"(src_ptr),    // %1
 | 
| -    "+r"(dst_width),  // %2
 | 
| +    "vzeroupper                                \n"
 | 
| +  "999:                                        \n"
 | 
| +  : "+D"(dst_ptr),    // %0
 | 
| +    "+S"(src_ptr),    // %1
 | 
| +    "+c"(dst_width),  // %2
 | 
|      "+r"(source_y_fraction)  // %3
 | 
|    : "r"((intptr_t)(src_stride))  // %4
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm5"
 | 
| -#endif
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm5"
 | 
|    );
 | 
|  }
 | 
| -#endif   // HAS_INTERPOLATEROW_SSSE3
 | 
| +#endif  // HAS_INTERPOLATEROW_AVX2
 | 
|  
 | 
|  #ifdef HAS_INTERPOLATEROW_SSE2
 | 
|  // Bilinear filter 16x2 -> 16x1
 | 
| -void InterpolateRow_Unaligned_SSE2(uint8* dst_ptr, const uint8* src_ptr,
 | 
| -                                   ptrdiff_t src_stride, int dst_width,
 | 
| -                                   int source_y_fraction) {
 | 
| +void InterpolateRow_SSE2(uint8* dst_ptr, const uint8* src_ptr,
 | 
| +                         ptrdiff_t src_stride, int dst_width,
 | 
| +                         int source_y_fraction) {
 | 
|    asm volatile (
 | 
|      "sub       %1,%0                           \n"
 | 
|      "shr       %3                              \n"
 | 
| @@ -5699,8 +4817,8 @@ void InterpolateRow_Unaligned_SSE2(uint8* dst_ptr, const uint8* src_ptr,
 | 
|    "1:                                          \n"
 | 
|      "movdqu    " MEMACCESS(1) ",%%xmm0         \n"
 | 
|      MEMOPREG(movdqu,0x00,1,4,1,xmm2)           //  movdqu    (%1,%4,1),%%xmm2
 | 
| -    "movdqu    %%xmm0,%%xmm1                   \n"
 | 
| -    "movdqu    %%xmm2,%%xmm3                   \n"
 | 
| +    "movdqa    %%xmm0,%%xmm1                   \n"
 | 
| +    "movdqa    %%xmm2,%%xmm3                   \n"
 | 
|      "punpcklbw %%xmm4,%%xmm2                   \n"
 | 
|      "punpckhbw %%xmm4,%%xmm3                   \n"
 | 
|      "punpcklbw %%xmm4,%%xmm0                   \n"
 | 
| @@ -5714,10 +4832,9 @@ void InterpolateRow_Unaligned_SSE2(uint8* dst_ptr, const uint8* src_ptr,
 | 
|      "paddw     %%xmm2,%%xmm0                   \n"
 | 
|      "paddw     %%xmm3,%%xmm1                   \n"
 | 
|      "packuswb  %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%2                        \n"
 | 
| -    BUNDLEALIGN
 | 
|      MEMOPMEM(movdqu,xmm0,0x00,1,0,1)           //  movdqu    %%xmm0,(%1,%0,1)
 | 
|      "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| +    "sub       $0x10,%2                        \n"
 | 
|      "jg        1b                              \n"
 | 
|      "jmp       99f                             \n"
 | 
|  
 | 
| @@ -5728,10 +4845,9 @@ void InterpolateRow_Unaligned_SSE2(uint8* dst_ptr, const uint8* src_ptr,
 | 
|      MEMOPREG(movdqu,0x00,1,4,1,xmm1)           //  movdqu    (%1,%4,1),%%xmm1
 | 
|      "pavgb     %%xmm1,%%xmm0                   \n"
 | 
|      "pavgb     %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%2                        \n"
 | 
| -    BUNDLEALIGN
 | 
|      MEMOPMEM(movdqu,xmm0,0x00,1,0,1)           //  movdqu    %%xmm0,(%1,%0,1)
 | 
|      "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| +    "sub       $0x10,%2                        \n"
 | 
|      "jg        25b                             \n"
 | 
|      "jmp       99f                             \n"
 | 
|  
 | 
| @@ -5741,10 +4857,9 @@ void InterpolateRow_Unaligned_SSE2(uint8* dst_ptr, const uint8* src_ptr,
 | 
|      "movdqu    " MEMACCESS(1) ",%%xmm0         \n"
 | 
|      MEMOPREG(movdqu,0x00,1,4,1,xmm1)           //  movdqu    (%1,%4,1),%%xmm1
 | 
|      "pavgb     %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%2                        \n"
 | 
| -    BUNDLEALIGN
 | 
|      MEMOPMEM(movdqu,xmm0,0x00,1,0,1)           //  movdqu    %%xmm0,(%1,%0,1)
 | 
|      "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| +    "sub       $0x10,%2                        \n"
 | 
|      "jg        50b                             \n"
 | 
|      "jmp       99f                             \n"
 | 
|  
 | 
| @@ -5755,10 +4870,9 @@ void InterpolateRow_Unaligned_SSE2(uint8* dst_ptr, const uint8* src_ptr,
 | 
|      MEMOPREG(movdqu,0x00,1,4,1,xmm0)           //  movdqu    (%1,%4,1),%%xmm0
 | 
|      "pavgb     %%xmm1,%%xmm0                   \n"
 | 
|      "pavgb     %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x10,%2                        \n"
 | 
| -    BUNDLEALIGN
 | 
|      MEMOPMEM(movdqu,xmm0,0x00,1,0,1)           //  movdqu    %%xmm0,(%1,%0,1)
 | 
|      "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| +    "sub       $0x10,%2                        \n"
 | 
|      "jg        75b                             \n"
 | 
|      "jmp       99f                             \n"
 | 
|  
 | 
| @@ -5766,9 +4880,9 @@ void InterpolateRow_Unaligned_SSE2(uint8* dst_ptr, const uint8* src_ptr,
 | 
|      LABELALIGN
 | 
|    "100:                                        \n"
 | 
|      "movdqu    " MEMACCESS(1) ",%%xmm0         \n"
 | 
| -    "sub       $0x10,%2                        \n"
 | 
|      MEMOPMEM(movdqu,xmm0,0x00,1,0,1)           //  movdqu    %%xmm0,(%1,%0,1)
 | 
|      "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| +    "sub       $0x10,%2                        \n"
 | 
|      "jg        100b                            \n"
 | 
|  
 | 
|    "99:                                         \n"
 | 
| @@ -5777,73 +4891,12 @@ void InterpolateRow_Unaligned_SSE2(uint8* dst_ptr, const uint8* src_ptr,
 | 
|      "+r"(dst_width),  // %2
 | 
|      "+r"(source_y_fraction)  // %3
 | 
|    : "r"((intptr_t)(src_stride))  // %4
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
| -#endif
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_INTERPOLATEROW_SSE2
 | 
|  
 | 
| -#ifdef HAS_HALFROW_SSE2
 | 
| -void HalfRow_SSE2(const uint8* src_uv, int src_uv_stride,
 | 
| -                  uint8* dst_uv, int pix) {
 | 
| -  asm volatile (
 | 
| -    "sub       %0,%1                           \n"
 | 
| -    LABELALIGN
 | 
| -  "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    MEMOPREG(pavgb,0x00,0,3,1,xmm0)            //  pavgb     (%0,%3),%%xmm0
 | 
| -    "sub       $0x10,%2                        \n"
 | 
| -    MEMOPMEM(movdqa,xmm0,0x00,0,1,1)           //  movdqa    %%xmm0,(%0,%1)
 | 
| -    "lea       " MEMLEA(0x10,0) ",%0           \n"
 | 
| -    "jg        1b                              \n"
 | 
| -  : "+r"(src_uv),  // %0
 | 
| -    "+r"(dst_uv),  // %1
 | 
| -    "+r"(pix)      // %2
 | 
| -  : "r"((intptr_t)(src_uv_stride))  // %3
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
| -      , "xmm0"
 | 
| -#endif
 | 
| -  );
 | 
| -}
 | 
| -#endif  // HAS_HALFROW_SSE2
 | 
| -
 | 
| -#ifdef HAS_ARGBTOBAYERROW_SSSE3
 | 
| -void ARGBToBayerRow_SSSE3(const uint8* src_argb, uint8* dst_bayer,
 | 
| -                          uint32 selector, int pix) {
 | 
| -  asm volatile (
 | 
| -    // NaCL caveat - assumes movd is from GPR
 | 
| -    "movd      %3,%%xmm5                       \n"
 | 
| -    "pshufd    $0x0,%%xmm5,%%xmm5              \n"
 | 
| -    LABELALIGN
 | 
| -  "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "movdqa    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| -    "lea       " MEMLEA(0x20,0) ",%0           \n"
 | 
| -    "pshufb    %%xmm5,%%xmm0                   \n"
 | 
| -    "pshufb    %%xmm5,%%xmm1                   \n"
 | 
| -    "punpckldq %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x8,%2                         \n"
 | 
| -    "movq      %%xmm0," MEMACCESS(1) "         \n"
 | 
| -    "lea       " MEMLEA(0x8,1) ",%1            \n"
 | 
| -    "jg        1b                              \n"
 | 
| -  : "+r"(src_argb),  // %0
 | 
| -    "+r"(dst_bayer), // %1
 | 
| -    "+r"(pix)        // %2
 | 
| -  : "g"(selector)    // %3
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm5"
 | 
| -#endif
 | 
| -  );
 | 
| -}
 | 
| -#endif  // HAS_ARGBTOBAYERROW_SSSE3
 | 
| -
 | 
|  #ifdef HAS_ARGBTOBAYERGGROW_SSE2
 | 
|  void ARGBToBayerGGRow_SSE2(const uint8* src_argb, uint8* dst_bayer,
 | 
|                             uint32 selector, int pix) {
 | 
| @@ -5852,8 +4905,8 @@ void ARGBToBayerGGRow_SSE2(const uint8* src_argb, uint8* dst_bayer,
 | 
|      "psrld     $0x18,%%xmm5                    \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "movdqa    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| +    "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| +    "movdqu    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
|      "lea       " MEMLEA(0x20,0) ",%0           \n"
 | 
|      "psrld     $0x8,%%xmm0                     \n"
 | 
|      "psrld     $0x8,%%xmm1                     \n"
 | 
| @@ -5861,18 +4914,16 @@ void ARGBToBayerGGRow_SSE2(const uint8* src_argb, uint8* dst_bayer,
 | 
|      "pand      %%xmm5,%%xmm1                   \n"
 | 
|      "packssdw  %%xmm1,%%xmm0                   \n"
 | 
|      "packuswb  %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x8,%2                         \n"
 | 
|      "movq      %%xmm0," MEMACCESS(1) "         \n"
 | 
|      "lea       " MEMLEA(0x8,1) ",%1            \n"
 | 
| +    "sub       $0x8,%2                         \n"
 | 
|      "jg        1b                              \n"
 | 
|    : "+r"(src_argb),  // %0
 | 
|      "+r"(dst_bayer), // %1
 | 
|      "+r"(pix)        // %2
 | 
|    :
 | 
|    : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
|      , "xmm0", "xmm1", "xmm5"
 | 
| -#endif
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_ARGBTOBAYERGGROW_SSE2
 | 
| @@ -5882,34 +4933,7 @@ void ARGBToBayerGGRow_SSE2(const uint8* src_argb, uint8* dst_bayer,
 | 
|  void ARGBShuffleRow_SSSE3(const uint8* src_argb, uint8* dst_argb,
 | 
|                            const uint8* shuffler, int pix) {
 | 
|    asm volatile (
 | 
| -    "movdqa    " MEMACCESS(3) ",%%xmm5         \n"
 | 
| -    LABELALIGN
 | 
| -  "1:                                          \n"
 | 
| -    "movdqa    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| -    "movdqa    " MEMACCESS2(0x10,0) ",%%xmm1   \n"
 | 
| -    "lea       " MEMLEA(0x20,0) ",%0           \n"
 | 
| -    "pshufb    %%xmm5,%%xmm0                   \n"
 | 
| -    "pshufb    %%xmm5,%%xmm1                   \n"
 | 
| -    "sub       $0x8,%2                         \n"
 | 
| -    "movdqa    %%xmm0," MEMACCESS(1) "         \n"
 | 
| -    "movdqa    %%xmm1," MEMACCESS2(0x10,1) "   \n"
 | 
| -    "lea       " MEMLEA(0x20,1) ",%1           \n"
 | 
| -    "jg        1b                              \n"
 | 
| -  : "+r"(src_argb),  // %0
 | 
| -    "+r"(dst_argb),  // %1
 | 
| -    "+r"(pix)        // %2
 | 
| -  : "r"(shuffler)    // %3
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm5"
 | 
| -#endif
 | 
| -  );
 | 
| -}
 | 
| -
 | 
| -void ARGBShuffleRow_Unaligned_SSSE3(const uint8* src_argb, uint8* dst_argb,
 | 
| -                                    const uint8* shuffler, int pix) {
 | 
| -  asm volatile (
 | 
| -    "movdqa    " MEMACCESS(3) ",%%xmm5         \n"
 | 
| +    "movdqu    " MEMACCESS(3) ",%%xmm5         \n"
 | 
|      LABELALIGN
 | 
|    "1:                                          \n"
 | 
|      "movdqu    " MEMACCESS(0) ",%%xmm0         \n"
 | 
| @@ -5917,19 +4941,17 @@ void ARGBShuffleRow_Unaligned_SSSE3(const uint8* src_argb, uint8* dst_argb,
 | 
|      "lea       " MEMLEA(0x20,0) ",%0           \n"
 | 
|      "pshufb    %%xmm5,%%xmm0                   \n"
 | 
|      "pshufb    %%xmm5,%%xmm1                   \n"
 | 
| -    "sub       $0x8,%2                         \n"
 | 
|      "movdqu    %%xmm0," MEMACCESS(1) "         \n"
 | 
|      "movdqu    %%xmm1," MEMACCESS2(0x10,1) "   \n"
 | 
|      "lea       " MEMLEA(0x20,1) ",%1           \n"
 | 
| +    "sub       $0x8,%2                         \n"
 | 
|      "jg        1b                              \n"
 | 
|    : "+r"(src_argb),  // %0
 | 
|      "+r"(dst_argb),  // %1
 | 
|      "+r"(pix)        // %2
 | 
|    : "r"(shuffler)    // %3
 | 
|    : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
|      , "xmm0", "xmm1", "xmm5"
 | 
| -#endif
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_ARGBSHUFFLEROW_SSSE3
 | 
| @@ -5947,19 +4969,18 @@ void ARGBShuffleRow_AVX2(const uint8* src_argb, uint8* dst_argb,
 | 
|      "lea       " MEMLEA(0x40,0) ",%0           \n"
 | 
|      "vpshufb   %%ymm5,%%ymm0,%%ymm0            \n"
 | 
|      "vpshufb   %%ymm5,%%ymm1,%%ymm1            \n"
 | 
| -    "sub       $0x10,%2                        \n"
 | 
|      "vmovdqu   %%ymm0," MEMACCESS(1) "         \n"
 | 
|      "vmovdqu   %%ymm1," MEMACCESS2(0x20,1) "   \n"
 | 
|      "lea       " MEMLEA(0x40,1) ",%1           \n"
 | 
| +    "sub       $0x10,%2                        \n"
 | 
|      "jg        1b                              \n"
 | 
| +    "vzeroupper                                \n"
 | 
|    : "+r"(src_argb),  // %0
 | 
|      "+r"(dst_argb),  // %1
 | 
|      "+r"(pix)        // %2
 | 
|    : "r"(shuffler)    // %3
 | 
|    : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
|      , "xmm0", "xmm1", "xmm5"
 | 
| -#endif
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_ARGBSHUFFLEROW_AVX2
 | 
| @@ -5989,7 +5010,6 @@ void ARGBShuffleRow_SSE2(const uint8* src_argb, uint8* dst_argb,
 | 
|      "movzb     " MEMACCESS2(0x1,4) ",%2        \n"
 | 
|      MEMOPARG(movzb,0x00,0,2,1,2) "             \n"  //  movzb     (%0,%2,1),%2
 | 
|      "mov       %b2," MEMACCESS2(0x1,1) "       \n"
 | 
| -    BUNDLEALIGN
 | 
|      "movzb     " MEMACCESS2(0x2,4) ",%2        \n"
 | 
|      MEMOPARG(movzb,0x00,0,2,1,2) "             \n"  //  movzb     (%0,%2,1),%2
 | 
|      "mov       %b2," MEMACCESS2(0x2,1) "       \n"
 | 
| @@ -6014,9 +5034,9 @@ void ARGBShuffleRow_SSE2(const uint8* src_argb, uint8* dst_argb,
 | 
|      "pshufhw   $0x1b,%%xmm1,%%xmm1             \n"
 | 
|      "pshuflw   $0x1b,%%xmm1,%%xmm1             \n"
 | 
|      "packuswb  %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x4,%3                         \n"
 | 
|      "movdqu    %%xmm0," MEMACCESS(1) "         \n"
 | 
|      "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| +    "sub       $0x4,%3                         \n"
 | 
|      "jg        123b                            \n"
 | 
|      "jmp       99f                             \n"
 | 
|  
 | 
| @@ -6032,9 +5052,9 @@ void ARGBShuffleRow_SSE2(const uint8* src_argb, uint8* dst_argb,
 | 
|      "pshufhw   $0x39,%%xmm1,%%xmm1             \n"
 | 
|      "pshuflw   $0x39,%%xmm1,%%xmm1             \n"
 | 
|      "packuswb  %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x4,%3                         \n"
 | 
|      "movdqu    %%xmm0," MEMACCESS(1) "         \n"
 | 
|      "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| +    "sub       $0x4,%3                         \n"
 | 
|      "jg        321b                            \n"
 | 
|      "jmp       99f                             \n"
 | 
|  
 | 
| @@ -6050,9 +5070,9 @@ void ARGBShuffleRow_SSE2(const uint8* src_argb, uint8* dst_argb,
 | 
|      "pshufhw   $0x93,%%xmm1,%%xmm1             \n"
 | 
|      "pshuflw   $0x93,%%xmm1,%%xmm1             \n"
 | 
|      "packuswb  %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x4,%3                         \n"
 | 
|      "movdqu    %%xmm0," MEMACCESS(1) "         \n"
 | 
|      "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| +    "sub       $0x4,%3                         \n"
 | 
|      "jg        2103b                           \n"
 | 
|      "jmp       99f                             \n"
 | 
|  
 | 
| @@ -6068,9 +5088,9 @@ void ARGBShuffleRow_SSE2(const uint8* src_argb, uint8* dst_argb,
 | 
|      "pshufhw   $0xc6,%%xmm1,%%xmm1             \n"
 | 
|      "pshuflw   $0xc6,%%xmm1,%%xmm1             \n"
 | 
|      "packuswb  %%xmm1,%%xmm0                   \n"
 | 
| -    "sub       $0x4,%3                         \n"
 | 
|      "movdqu    %%xmm0," MEMACCESS(1) "         \n"
 | 
|      "lea       " MEMLEA(0x10,1) ",%1           \n"
 | 
| +    "sub       $0x4,%3                         \n"
 | 
|      "jg        3012b                           \n"
 | 
|  
 | 
|    "99:                                         \n"
 | 
| @@ -6079,13 +5099,8 @@ void ARGBShuffleRow_SSE2(const uint8* src_argb, uint8* dst_argb,
 | 
|      "+d"(pixel_temp),  // %2
 | 
|      "+r"(pix)         // %3
 | 
|    : "r"(shuffler)      // %4
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm5"
 | 
| -#endif
 | 
| +  : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm5"
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_ARGBSHUFFLEROW_SSE2
 | 
| @@ -6119,13 +5134,8 @@ void I422ToYUY2Row_SSE2(const uint8* src_y,
 | 
|        "+r"(dst_frame),  // %3
 | 
|        "+rm"(width)  // %4
 | 
|      :
 | 
| -    : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3"
 | 
| -#endif
 | 
| +    : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm3"
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_I422TOYUY2ROW_SSE2
 | 
| @@ -6159,13 +5169,8 @@ void I422ToUYVYRow_SSE2(const uint8* src_y,
 | 
|        "+r"(dst_frame),  // %3
 | 
|        "+rm"(width)  // %4
 | 
|      :
 | 
| -    : "memory", "cc"
 | 
| -#if defined(__native_client__) && defined(__x86_64__)
 | 
| -    , "r14"
 | 
| -#endif
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3"
 | 
| -#endif
 | 
| +    : "memory", "cc", NACL_R14
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm3"
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_I422TOUYVYROW_SSE2
 | 
| @@ -6212,18 +5217,16 @@ void ARGBPolynomialRow_SSE2(const uint8* src_argb,
 | 
|      "cvttps2dq %%xmm4,%%xmm4                   \n"
 | 
|      "packuswb  %%xmm4,%%xmm0                   \n"
 | 
|      "packuswb  %%xmm0,%%xmm0                   \n"
 | 
| -    "sub       $0x2,%2                         \n"
 | 
|      "movq      %%xmm0," MEMACCESS(1) "         \n"
 | 
|      "lea       " MEMLEA(0x8,1) ",%1            \n"
 | 
| +    "sub       $0x2,%2                         \n"
 | 
|      "jg        1b                              \n"
 | 
|    : "+r"(src_argb),  // %0
 | 
|      "+r"(dst_argb),  // %1
 | 
|      "+r"(width)      // %2
 | 
|    : "r"(poly)        // %3
 | 
|    : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
|      , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6"
 | 
| -#endif
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_ARGBPOLYNOMIALROW_SSE2
 | 
| @@ -6253,20 +5256,17 @@ void ARGBPolynomialRow_AVX2(const uint8* src_argb,
 | 
|      "vpackusdw   %%ymm0,%%ymm0,%%ymm0          \n"
 | 
|      "vpermq      $0xd8,%%ymm0,%%ymm0           \n"
 | 
|      "vpackuswb   %%xmm0,%%xmm0,%%xmm0          \n"
 | 
| -    "sub         $0x2,%2                       \n"
 | 
|      "vmovq       %%xmm0," MEMACCESS(1) "       \n"
 | 
|      "lea         " MEMLEA(0x8,1) ",%1          \n"
 | 
| +    "sub         $0x2,%2                       \n"
 | 
|      "jg          1b                            \n"
 | 
|      "vzeroupper                                \n"
 | 
|    : "+r"(src_argb),  // %0
 | 
|      "+r"(dst_argb),  // %1
 | 
|      "+r"(width)      // %2
 | 
|    : "r"(poly)        // %3
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
| -// TODO(fbarchard): declare ymm usage when applicable.
 | 
| -    , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7"
 | 
| -#endif
 | 
| +  : "memory", "cc",
 | 
| +    "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7"
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_ARGBPOLYNOMIALROW_AVX2
 | 
| @@ -6376,7 +5376,6 @@ void ARGBLumaColorTableRow_SSSE3(const uint8* src_argb, uint8* dst_argb,
 | 
|      "movzb     " MEMACCESS2(0x4,2) ",%0        \n"
 | 
|      MEMOPARG(movzb,0x00,1,0,1,0) "             \n"  // movzb     (%1,%0,1),%0
 | 
|      "mov       %b0," MEMACCESS2(0x4,3) "       \n"
 | 
| -    BUNDLEALIGN
 | 
|      "movzb     " MEMACCESS2(0x5,2) ",%0        \n"
 | 
|      MEMOPARG(movzb,0x00,1,0,1,0) "             \n"  // movzb     (%1,%0,1),%0
 | 
|      "mov       %b0," MEMACCESS2(0x5,3) "       \n"
 | 
| @@ -6416,9 +5415,9 @@ void ARGBLumaColorTableRow_SSSE3(const uint8* src_argb, uint8* dst_argb,
 | 
|      "mov       %b0," MEMACCESS2(0xe,3) "       \n"
 | 
|      "movzb     " MEMACCESS2(0xf,2) ",%0        \n"
 | 
|      "mov       %b0," MEMACCESS2(0xf,3) "       \n"
 | 
| -    "sub       $0x4,%4                         \n"
 | 
|      "lea       " MEMLEA(0x10,2) ",%2           \n"
 | 
|      "lea       " MEMLEA(0x10,3) ",%3           \n"
 | 
| +    "sub       $0x4,%4                         \n"
 | 
|      "jg        1b                              \n"
 | 
|    : "+d"(pixel_temp),  // %0
 | 
|      "+a"(table_temp),  // %1
 | 
| @@ -6427,10 +5426,7 @@ void ARGBLumaColorTableRow_SSSE3(const uint8* src_argb, uint8* dst_argb,
 | 
|      "+rm"(width)       // %4
 | 
|    : "r"(luma),         // %5
 | 
|      "rm"(lumacoeff)    // %6
 | 
| -  : "memory", "cc"
 | 
| -#if defined(__SSE2__)
 | 
| -    , "xmm0", "xmm3", "xmm4", "xmm5"
 | 
| -#endif
 | 
| +  : "memory", "cc", "xmm0", "xmm3", "xmm4", "xmm5"
 | 
|    );
 | 
|  }
 | 
|  #endif  // HAS_ARGBLUMACOLORTABLEROW_SSSE3
 | 
| 
 |