Commit 577b183d authored by Naohiro KORIYAMA's avatar Naohiro KORIYAMA Committed by Jean-Baptiste Kempf

Fixed a crash caused by yadif on Windows XP (again #5793)

Align stack variables manually in yadif x86 code.
This is fixed for the issue that yadif crashes VLC on Windows XP.
This issue happens win32 build on Windows 32bit.
This issue doesn't happen win32 build on Windows 64bit.
Signed-off-by: default avatarJean-Baptiste Kempf <jb@videolan.org>
parent 72f3e860
...@@ -110,10 +110,8 @@ VLC_TARGET static void RENAME(yadif_filter_line)(uint8_t *dst, ...@@ -110,10 +110,8 @@ VLC_TARGET static void RENAME(yadif_filter_line)(uint8_t *dst,
uint8_t *prev, uint8_t *cur, uint8_t *next, uint8_t *prev, uint8_t *cur, uint8_t *next,
int w, int prefs, int mrefs, int parity, int mode) int w, int prefs, int mrefs, int parity, int mode)
{ {
DECLARE_ALIGNED(16, uint8_t, tmp0[16]); uint8_t tmp[5*16];
DECLARE_ALIGNED(16, uint8_t, tmp1[16]); uint8_t *tmpA= (uint8_t*)(((uint64_t)(tmp+15)) & ~15);
DECLARE_ALIGNED(16, uint8_t, tmp2[16]);
DECLARE_ALIGNED(16, uint8_t, tmp3[16]);
int x; int x;
#define FILTER\ #define FILTER\
...@@ -127,9 +125,9 @@ VLC_TARGET static void RENAME(yadif_filter_line)(uint8_t *dst, ...@@ -127,9 +125,9 @@ VLC_TARGET static void RENAME(yadif_filter_line)(uint8_t *dst,
MOVQ" "MM"3, "MM"4 \n\t"\ MOVQ" "MM"3, "MM"4 \n\t"\
"paddw "MM"2, "MM"3 \n\t"\ "paddw "MM"2, "MM"3 \n\t"\
"psraw $1, "MM"3 \n\t" /* d = (prev2[x] + next2[x])>>1 */\ "psraw $1, "MM"3 \n\t" /* d = (prev2[x] + next2[x])>>1 */\
MOVQ" "MM"0, %[tmp0] \n\t" /* c */\ MOVQ" "MM"0, (%[tmpA]) \n\t" /* c */\
MOVQ" "MM"3, %[tmp1] \n\t" /* d */\ MOVQ" "MM"3, 16(%[tmpA]) \n\t" /* d */\
MOVQ" "MM"1, %[tmp2] \n\t" /* e */\ MOVQ" "MM"1, 32(%[tmpA]) \n\t" /* e */\
"psubw "MM"4, "MM"2 \n\t"\ "psubw "MM"4, "MM"2 \n\t"\
PABS( MM"4", MM"2") /* temporal_diff0 */\ PABS( MM"4", MM"2") /* temporal_diff0 */\
LOAD("(%[prev],%[mrefs])", MM"3") /* prev[x-refs] */\ LOAD("(%[prev],%[mrefs])", MM"3") /* prev[x-refs] */\
...@@ -151,7 +149,7 @@ VLC_TARGET static void RENAME(yadif_filter_line)(uint8_t *dst, ...@@ -151,7 +149,7 @@ VLC_TARGET static void RENAME(yadif_filter_line)(uint8_t *dst,
"paddw "MM"4, "MM"3 \n\t" /* temporal_diff2 */\ "paddw "MM"4, "MM"3 \n\t" /* temporal_diff2 */\
"psrlw $1, "MM"3 \n\t"\ "psrlw $1, "MM"3 \n\t"\
"pmaxsw "MM"3, "MM"2 \n\t"\ "pmaxsw "MM"3, "MM"2 \n\t"\
MOVQ" "MM"2, %[tmp3] \n\t" /* diff */\ MOVQ" "MM"2, 48(%[tmpA]) \n\t" /* diff */\
\ \
"paddw "MM"0, "MM"1 \n\t"\ "paddw "MM"0, "MM"1 \n\t"\
"paddw "MM"0, "MM"0 \n\t"\ "paddw "MM"0, "MM"0 \n\t"\
...@@ -182,7 +180,7 @@ VLC_TARGET static void RENAME(yadif_filter_line)(uint8_t *dst, ...@@ -182,7 +180,7 @@ VLC_TARGET static void RENAME(yadif_filter_line)(uint8_t *dst,
CHECK2\ CHECK2\
\ \
/* if(p->mode<2) ... */\ /* if(p->mode<2) ... */\
MOVQ" %[tmp3], "MM"6 \n\t" /* diff */\ MOVQ" 48(%[tmpA]), "MM"6 \n\t" /* diff */\
"cmpl $2, %[mode] \n\t"\ "cmpl $2, %[mode] \n\t"\
"jge 1f \n\t"\ "jge 1f \n\t"\
LOAD("(%["prev2"],%[mrefs],2)", MM"2") /* prev2[x-2*refs] */\ LOAD("(%["prev2"],%[mrefs],2)", MM"2") /* prev2[x-2*refs] */\
...@@ -193,9 +191,9 @@ VLC_TARGET static void RENAME(yadif_filter_line)(uint8_t *dst, ...@@ -193,9 +191,9 @@ VLC_TARGET static void RENAME(yadif_filter_line)(uint8_t *dst,
"paddw "MM"5, "MM"3 \n\t"\ "paddw "MM"5, "MM"3 \n\t"\
"psrlw $1, "MM"2 \n\t" /* b */\ "psrlw $1, "MM"2 \n\t" /* b */\
"psrlw $1, "MM"3 \n\t" /* f */\ "psrlw $1, "MM"3 \n\t" /* f */\
MOVQ" %[tmp0], "MM"4 \n\t" /* c */\ MOVQ" (%[tmpA]), "MM"4 \n\t" /* c */\
MOVQ" %[tmp1], "MM"5 \n\t" /* d */\ MOVQ" 16(%[tmpA]), "MM"5 \n\t" /* d */\
MOVQ" %[tmp2], "MM"7 \n\t" /* e */\ MOVQ" 32(%[tmpA]), "MM"7 \n\t" /* e */\
"psubw "MM"4, "MM"2 \n\t" /* b-c */\ "psubw "MM"4, "MM"2 \n\t" /* b-c */\
"psubw "MM"7, "MM"3 \n\t" /* f-e */\ "psubw "MM"7, "MM"3 \n\t" /* f-e */\
MOVQ" "MM"5, "MM"0 \n\t"\ MOVQ" "MM"5, "MM"0 \n\t"\
...@@ -214,7 +212,7 @@ VLC_TARGET static void RENAME(yadif_filter_line)(uint8_t *dst, ...@@ -214,7 +212,7 @@ VLC_TARGET static void RENAME(yadif_filter_line)(uint8_t *dst,
"pmaxsw "MM"4, "MM"6 \n\t" /* diff= MAX3(diff, min, -max); */\ "pmaxsw "MM"4, "MM"6 \n\t" /* diff= MAX3(diff, min, -max); */\
"1: \n\t"\ "1: \n\t"\
\ \
MOVQ" %[tmp1], "MM"2 \n\t" /* d */\ MOVQ" 16(%[tmpA]), "MM"2 \n\t" /* d */\
MOVQ" "MM"2, "MM"3 \n\t"\ MOVQ" "MM"2, "MM"3 \n\t"\
"psubw "MM"6, "MM"2 \n\t" /* d-diff */\ "psubw "MM"6, "MM"2 \n\t" /* d-diff */\
"paddw "MM"6, "MM"3 \n\t" /* d+diff */\ "paddw "MM"6, "MM"3 \n\t" /* d+diff */\
...@@ -222,11 +220,9 @@ VLC_TARGET static void RENAME(yadif_filter_line)(uint8_t *dst, ...@@ -222,11 +220,9 @@ VLC_TARGET static void RENAME(yadif_filter_line)(uint8_t *dst,
"pminsw "MM"3, "MM"1 \n\t" /* d = clip(spatial_pred, d-diff, d+diff); */\ "pminsw "MM"3, "MM"1 \n\t" /* d = clip(spatial_pred, d-diff, d+diff); */\
"packuswb "MM"1, "MM"1 \n\t"\ "packuswb "MM"1, "MM"1 \n\t"\
\ \
:[tmp0]"=m"(tmp0),\ :\
[tmp1]"=m"(tmp1),\ :[tmpA] "r"(tmpA),\
[tmp2]"=m"(tmp2),\ [prev] "r"(prev),\
[tmp3]"=m"(tmp3)\
:[prev] "r"(prev),\
[cur] "r"(cur),\ [cur] "r"(cur),\
[next] "r"(next),\ [next] "r"(next),\
[prefs]"r"((x86_reg)prefs),\ [prefs]"r"((x86_reg)prefs),\
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment