| Index: source/row_win.cc
|
| diff --git a/source/row_win.cc b/source/row_win.cc
|
| index 54e1d9d240fa4e2de037b1eef6ffdeed882e475f..aa94487c12fb7d3010010c96bae3b1be7ea427ef 100644
|
| --- a/source/row_win.cc
|
| +++ b/source/row_win.cc
|
| @@ -2440,9 +2440,14 @@ void I422ToRGBARow_AVX2(const uint8* y_buf,
|
| }
|
|
|
| // Read 2 UV from 411, upsample to 8 UV.
|
| -#define READYUV411 __asm { \
|
| - __asm pinsrw xmm0, [esi], 0 /* U */ \
|
| - __asm pinsrw xmm1, [esi + edi], 0 /* V */ \
|
| +// drmemory fails with memory fault if pinsrw used. libyuv bug: 525
|
| +// __asm pinsrw xmm0, [esi], 0 /* U */
|
| +// __asm pinsrw xmm1, [esi + edi], 0 /* V */
|
| +#define READYUV411_EBX __asm { \
|
| + __asm movzx ebx, word ptr [esi] /* U */ \
|
| + __asm movd xmm0, ebx \
|
| + __asm movzx ebx, word ptr [esi + edi] /* V */ \
|
| + __asm movd xmm1, ebx \
|
| __asm lea esi, [esi + 2] \
|
| __asm punpcklbw xmm0, xmm1 /* UV */ \
|
| __asm punpcklwd xmm0, xmm0 /* UVUV (upsample) */ \
|
| @@ -2816,23 +2821,25 @@ void I411ToARGBRow_SSSE3(const uint8* y_buf,
|
| push esi
|
| push edi
|
| push ebx
|
| - mov eax, [esp + 12 + 4] // Y
|
| - mov esi, [esp + 12 + 8] // U
|
| - mov edi, [esp + 12 + 12] // V
|
| - mov edx, [esp + 12 + 16] // abgr
|
| - mov ebx, [esp + 12 + 20] // yuvconstants
|
| - mov ecx, [esp + 12 + 24] // width
|
| + push ebp
|
| + mov eax, [esp + 16 + 4] // Y
|
| + mov esi, [esp + 16 + 8] // U
|
| + mov edi, [esp + 16 + 12] // V
|
| + mov edx, [esp + 16 + 16] // abgr
|
| + mov ebp, [esp + 16 + 20] // yuvconstants
|
| + mov ecx, [esp + 16 + 24] // width
|
| sub edi, esi
|
| pcmpeqb xmm5, xmm5 // generate 0xffffffff for alpha
|
|
|
| convertloop:
|
| - READYUV411
|
| - YUVTORGB(ebx)
|
| + READYUV411_EBX
|
| + YUVTORGB(ebp)
|
| STOREARGB
|
|
|
| sub ecx, 8
|
| jg convertloop
|
|
|
| + pop ebp
|
| pop ebx
|
| pop edi
|
| pop esi
|
|
|