From 1893122e34a0c96afb75daa5517d04a081bf8e27 Mon Sep 17 00:00:00 2001 From: Yunqing Wang Date: Mon, 21 Apr 2014 16:49:22 -0700 Subject: [PATCH] Fix dr memory VP8 encode/decode errors This patch fixed errors reported in Issue 746: "dr memory VP8 encode errors" and Issue 745: "dr memory VP8 decode errors". The "UNINITIALIZED READ" errors were fixed in x86 assembly code. The list of files fixed is vp8_intra_pred_uv_tm_sse2 vp8_intra_pred_uv_tm_ssse3 vp8_intra_pred_uv_ho_mmx2 vp8_intra_pred_uv_ho_ssse3 vp8_intra_pred_y_tm_sse2 vp8_intra_pred_y_tm_ssse3 vp8_intra_pred_y_ho_sse2 Change-Id: Ib6df7bf1d442077fe534edfd90e50ad16fadacdd --- vp8/common/x86/recon_sse2.asm | 79 ++++++++++++++++++++++++++++++------------- 1 file changed, 56 insertions(+), 23 deletions(-) diff --git a/vp8/common/x86/recon_sse2.asm b/vp8/common/x86/recon_sse2.asm index 1434bcd..7141f83 100644 --- a/vp8/common/x86/recon_sse2.asm +++ b/vp8/common/x86/recon_sse2.asm @@ -365,6 +365,7 @@ sym(vp8_intra_pred_uv_tm_%1): GET_GOT rbx push rsi push rdi + push rbx ; end prolog ; read top row @@ -395,8 +396,11 @@ sym(vp8_intra_pred_uv_tm_%1): movsxd rcx, dword ptr arg(1) ;dst_stride .vp8_intra_pred_uv_tm_%1_loop: - movd xmm3, [rsi] - movd xmm5, [rsi+rax] + mov bl, [rsi] + movd xmm3, ebx + + mov bl, [rsi+rax] + movd xmm5, ebx %ifidn %1, sse2 punpcklbw xmm3, xmm0 punpcklbw xmm5, xmm0 @@ -419,6 +423,7 @@ sym(vp8_intra_pred_uv_tm_%1): jnz .vp8_intra_pred_uv_tm_%1_loop ; begin epilog + pop rbx pop rdi pop rsi RESTORE_GOT @@ -486,10 +491,8 @@ sym(vp8_intra_pred_uv_ho_%1): SHADOW_ARGS_TO_STACK 5 push rsi push rdi -%ifidn %1, ssse3 -%ifndef GET_GOT_SAVE_ARG push rbx -%endif +%ifidn %1, ssse3 GET_GOT rbx %endif ; end prolog @@ -507,13 +510,16 @@ sym(vp8_intra_pred_uv_ho_%1): %ifidn %1, ssse3 lea rdx, [rcx*3] movdqa xmm2, [GLOBAL(dc_00001111)] - lea rbx, [rax*3] %endif %ifidn %1, mmx2 .vp8_intra_pred_uv_ho_%1_loop: - movd mm0, [rsi] - movd mm1, [rsi+rax] + mov bl, [rsi] + movd mm0, ebx + + mov bl, [rsi+rax] + movd mm1, ebx + punpcklbw mm0, mm0 punpcklbw mm1, mm1 pshufw mm0, mm0, 0x0 @@ -525,10 +531,19 @@ sym(vp8_intra_pred_uv_ho_%1): dec edx jnz .vp8_intra_pred_uv_ho_%1_loop %else - movd xmm0, [rsi] - movd xmm3, [rsi+rax] - movd xmm1, [rsi+rax*2] - movd xmm4, [rsi+rbx] + mov bl, [rsi] + movd xmm0, ebx + + mov bl, [rsi+rax] + movd xmm3, ebx + + mov bl, [rsi+rax*2] + movd xmm1, ebx + + lea rbx, [rax*3] + mov bl, [rsi+rbx] + movd xmm4, ebx + punpcklbw xmm0, xmm3 punpcklbw xmm1, xmm4 pshufb xmm0, xmm2 @@ -539,10 +554,20 @@ sym(vp8_intra_pred_uv_ho_%1): movhps [rdi+rdx], xmm1 lea rsi, [rsi+rax*4] lea rdi, [rdi+rcx*4] - movd xmm0, [rsi] - movd xmm3, [rsi+rax] - movd xmm1, [rsi+rax*2] - movd xmm4, [rsi+rbx] + + mov bl, [rsi] + movd xmm0, ebx + + mov bl, [rsi+rax] + movd xmm3, ebx + + mov bl, [rsi+rax*2] + movd xmm1, ebx + + lea rbx, [rax*3] + mov bl, [rsi+rbx] + movd xmm4, ebx + punpcklbw xmm0, xmm3 punpcklbw xmm1, xmm4 pshufb xmm0, xmm2 @@ -556,10 +581,8 @@ sym(vp8_intra_pred_uv_ho_%1): ; begin epilog %ifidn %1, ssse3 RESTORE_GOT -%ifndef GET_GOT_SAVE_ARG - pop rbx -%endif %endif + pop rbx pop rdi pop rsi UNSHADOW_ARGS @@ -893,6 +916,7 @@ sym(vp8_intra_pred_y_tm_%1): SAVE_XMM 7 push rsi push rdi + push rbx GET_GOT rbx ; end prolog @@ -926,8 +950,11 @@ sym(vp8_intra_pred_y_tm_%1): mov rdi, arg(0) ;dst; movsxd rcx, dword ptr arg(1) ;dst_stride vp8_intra_pred_y_tm_%1_loop: - movd xmm4, [rsi] - movd xmm5, [rsi+rax] + mov bl, [rsi] + movd xmm4, ebx + + mov bl, [rsi+rax] + movd xmm5, ebx %ifidn %1, sse2 punpcklbw xmm4, xmm0 punpcklbw xmm5, xmm0 @@ -956,6 +983,7 @@ vp8_intra_pred_y_tm_%1_loop: ; begin epilog RESTORE_GOT + pop rbx pop rdi pop rsi RESTORE_XMM @@ -1029,6 +1057,7 @@ sym(vp8_intra_pred_y_ho_sse2): SHADOW_ARGS_TO_STACK 5 push rsi push rdi + push rbx ; end prolog ;arg(2) not used @@ -1041,8 +1070,11 @@ sym(vp8_intra_pred_y_ho_sse2): movsxd rcx, dword ptr arg(1) ;dst_stride vp8_intra_pred_y_ho_sse2_loop: - movd xmm0, [rsi] - movd xmm1, [rsi+rax] + mov bl, [rsi] + movd xmm0, ebx + mov bl, [rsi+rax] + movd xmm1, ebx + ; FIXME use pshufb for ssse3 version punpcklbw xmm0, xmm0 punpcklbw xmm1, xmm1 @@ -1058,6 +1090,7 @@ vp8_intra_pred_y_ho_sse2_loop: jnz vp8_intra_pred_y_ho_sse2_loop ; begin epilog + pop rbx pop rdi pop rsi UNSHADOW_ARGS -- 2.7.4