8f9d94ec17
The function vp9_filter_block1d16_h8_ssse3 uses the PSHUFB instruction which has a 3 cycle latency and slows execution when done in blocks of 5 or more on Atom processors. By replacing the PSHUFB instructions with other more efficient single cycle instructions (PUNPCKLBW + PUNPCHBW + PALIGNR) performance can be improved. In the original code, the PSHUBF uses every byte and is consecutively copied. This is done more efficiently by PUNPCKLBW and PUNPCHBW, using PALIGNR to concatenate the intermediate result and then shift right the next consecutive 16 bytes for the final result. For example: filter = 0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8 Reg = 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 REG1 = PUNPCKLBW Reg, Reg = 0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7 REG2 = PUNPCHBW Reg, Reg = 8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15 PALIGNR REG2, REG1, 1 = 0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8 This optimization improved the function performance by 23% and produced a 3% user level gain on 1080p content on Atom processors. There was no observed performance impact on Core processors (expected). Change-Id: I3cec701158993d95ed23ff04516942b5a4a461c0 |
||
---|---|---|
.. | ||
vp9_asm_stubs.c | ||
vp9_copy_sse2.asm | ||
vp9_high_intrapred_sse2.asm | ||
vp9_high_loopfilter_intrin_sse2.c | ||
vp9_high_subpixel_8t_sse2.asm | ||
vp9_high_subpixel_bilinear_sse2.asm | ||
vp9_idct_intrin_sse2.c | ||
vp9_idct_intrin_sse2.h | ||
vp9_idct_intrin_ssse3.c | ||
vp9_idct_ssse3_x86_64.asm | ||
vp9_intrapred_sse2.asm | ||
vp9_intrapred_ssse3.asm | ||
vp9_loopfilter_intrin_avx2.c | ||
vp9_loopfilter_intrin_sse2.c | ||
vp9_loopfilter_mmx.asm | ||
vp9_postproc_sse2.asm | ||
vp9_subpixel_8t_intrin_avx2.c | ||
vp9_subpixel_8t_intrin_ssse3.c | ||
vp9_subpixel_8t_sse2.asm | ||
vp9_subpixel_8t_ssse3.asm | ||
vp9_subpixel_bilinear_sse2.asm | ||
vp9_subpixel_bilinear_ssse3.asm |