[FFmpeg-devel] [PATCH] vp9: refactor 10/12bpp dc-only code in 4x4/8x8 and add to 16x16.
Ronald S. Bultje
rsbultje at gmail.com
Thu Oct 8 16:45:24 CEST 2015
---
libavcodec/x86/vp9itxfm_16bpp.asm | 135 ++++++++++++++++++++++----------------
1 file changed, 79 insertions(+), 56 deletions(-)
diff --git a/libavcodec/x86/vp9itxfm_16bpp.asm b/libavcodec/x86/vp9itxfm_16bpp.asm
index cb9df17..cad8021 100644
--- a/libavcodec/x86/vp9itxfm_16bpp.asm
+++ b/libavcodec/x86/vp9itxfm_16bpp.asm
@@ -183,6 +183,17 @@ IWHT4_FN 12, 4095
VP9_STORE_2X 2, 3, 6, 7, 4, 5
%endmacro
+%macro DC_ONLY 2 ; shift, zero
+ mov coefd, dword [blockq]
+ movd [blockq], %2
+ imul coefd, 11585
+ add coefd, 8192
+ sar coefd, 14
+ imul coefd, 11585
+ add coefd, ((1 << (%1 - 1)) << 14) + 8192
+ sar coefd, 14 + %1
+%endmacro
+
; 4x4 coefficients are 5+depth+sign bits, so for 10bpp, everything still fits
; in 15+1 words without additional effort, since the coefficients are 15bpp.
@@ -192,26 +203,20 @@ cglobal vp9_idct_idct_4x4_add_10, 4, 4, 8, dst, stride, block, eob
jg .idctfull
; dc-only
+ pxor m4, m4
%if cpuflag(ssse3)
movd m0, [blockq]
+ movd [blockq], m4
mova m5, [pw_11585x2]
pmulhrsw m0, m5
pmulhrsw m0, m5
%else
DEFINE_ARGS dst, stride, block, coef
- mov coefd, dword [blockq]
- imul coefd, 11585
- add coefd, 8192
- sar coefd, 14
- imul coefd, 11585
- add coefd, (8 << 14) + 8192
- sar coefd, 14 + 4
+ DC_ONLY 4, m4
movd m0, coefd
%endif
pshufw m0, m0, 0
- pxor m4, m4
mova m5, [pw_1023]
- movh [blockq], m4
%if cpuflag(ssse3)
pmulhrsw m0, [pw_2048] ; (x*2048 + (1<<14))>>15 <=> (x+8)>>4
%endif
@@ -373,19 +378,12 @@ cglobal vp9_idct_idct_4x4_add_12, 4, 4, 6, dst, stride, block, eob
; dword. After the final shift (4), the result is 13+sign bits, so we
; don't need any additional processing to fit it in a word
DEFINE_ARGS dst, stride, block, coef
- mov coefd, dword [blockq]
- imul coefd, 11585
- add coefd, 8192
- sar coefd, 14
- imul coefd, 11585
- add coefd, (8 << 14) + 8192
- sar coefd, 14 + 4
+ pxor m4, m4
+ DC_ONLY 4, m4
movd m0, coefd
punpcklwd m0, m0
pshufd m0, m0, q0000
- pxor m4, m4
mova m5, [pw_4095]
- movd [blockq], m4
DEFINE_ARGS dst, stride, stride3
lea stride3q, [strideq*3]
STORE_4x4 1, 3, 0, 0, m4, m5
@@ -565,17 +563,17 @@ IADST4_12BPP_FN iadst, IADST4, iadst, IADST4
SWAP 0, 5, 4, 6, 2, 7
%endmacro
-%macro STORE_2x8 5 ; tmp1-2, reg, min, max
- mova m%1, [dstq+strideq*0]
- mova m%2, [dstq+strideq*1]
+%macro STORE_2x8 5-7 dstq, strideq ; tmp1-2, reg, min, max
+ mova m%1, [%6+%7*0]
+ mova m%2, [%6+%7*1]
paddw m%1, m%3
paddw m%2, m%3
pmaxsw m%1, %4
pmaxsw m%2, %4
pminsw m%1, %5
pminsw m%2, %5
- mova [dstq+strideq*0], m%1
- mova [dstq+strideq*1], m%2
+ mova [%6+%7*0], m%1
+ mova [%6+%7*1], m%2
%endmacro
%macro PRELOAD 2-3
@@ -604,18 +602,11 @@ cglobal vp9_idct_idct_8x8_add_10, 4, 6 + ARCH_X86_64, 10, \
; coef values are 16+sign bit, and the coef is 14bit, so 30+sign easily
; fits in 32bit
DEFINE_ARGS dst, stride, block, coef
- mov coefd, dword [blockq]
- imul coefd, 11585
- add coefd, 8192
- sar coefd, 14
- imul coefd, 11585
- add coefd, (16 << 14) + 8192
- sar coefd, 14 + 5
+ pxor m2, m2
+ DC_ONLY 5, m2
movd m1, coefd
punpcklwd m1, m1
pshufd m1, m1, q0000
- pxor m2, m2
- movd [blockq], m2
DEFINE_ARGS dst, stride, cnt
mov cntd, 4
.loop_dc:
@@ -682,32 +673,19 @@ cglobal vp9_idct_idct_8x8_add_10, 4, 6 + ARCH_X86_64, 10, \
ZERO_BLOCK blockq-2*mmsize, 32, 8, m6
RET
-INIT_XMM sse2
-cglobal vp9_idct_idct_8x8_add_12, 4, 6 + ARCH_X86_64, 10, \
- 17 * mmsize + 2 * ARCH_X86_32 * mmsize, \
- dst, stride, block, eob
- mova m0, [pw_4095]
- cmp eobd, 1
- jg mangle(private_prefix %+ _ %+ vp9_idct_idct_8x8_add_10 %+ SUFFIX).idctfull
-
- ; dc-only - unfortunately, this one can overflow, since coefs are 18+sign
- ; bpp, and 18+14+sign does not fit in 32bit, so we do 2-stage multiplies
- DEFINE_ARGS dst, stride, block, coef, coefl
+%macro DC_ONLY_64BIT 2 ; shift, zero
%if ARCH_X86_64
- DEFINE_ARGS dst, stride, block, coef
movsxd coefq, dword [blockq]
- pxor m2, m2
- movd [blockq], m2
+ movd [blockq], %2
imul coefq, 11585
add coefq, 8192
sar coefq, 14
imul coefq, 11585
- add coefq, (16 << 14) + 8192
- sar coefq, 14 + 5
+ add coefq, ((1 << (%1 - 1)) << 14) + 8192
+ sar coefq, 14 + %1
%else
mov coefd, dword [blockq]
- pxor m2, m2
- movd [blockq], m2
+ movd [blockq], %2
DEFINE_ARGS dst, stride, cnt, coef, coefl
mov cntd, 2
.loop_dc_calc:
@@ -721,9 +699,24 @@ cglobal vp9_idct_idct_8x8_add_12, 4, 6 + ARCH_X86_64, 10, \
add coefd, coefld
dec cntd
jg .loop_dc_calc
- add coefd, 16
- sar coefd, 5
+ add coefd, 1 << (%1 - 1)
+ sar coefd, %1
%endif
+%endmacro
+
+INIT_XMM sse2
+cglobal vp9_idct_idct_8x8_add_12, 4, 6 + ARCH_X86_64, 10, \
+ 17 * mmsize + 2 * ARCH_X86_32 * mmsize, \
+ dst, stride, block, eob
+ mova m0, [pw_4095]
+ cmp eobd, 1
+ jg mangle(private_prefix %+ _ %+ vp9_idct_idct_8x8_add_10 %+ SUFFIX).idctfull
+
+ ; dc-only - unfortunately, this one can overflow, since coefs are 18+sign
+ ; bpp, and 18+14+sign does not fit in 32bit, so we do 2-stage multiplies
+ DEFINE_ARGS dst, stride, block, coef, coefl
+ pxor m2, m2
+ DC_ONLY_64BIT 5, m2
movd m1, coefd
punpcklwd m1, m1
pshufd m1, m1, q0000
@@ -1006,7 +999,24 @@ cglobal vp9_idct_idct_16x16_add_10, 4, 6 + ARCH_X86_64, 16, \
cmp eobd, 1
jg .idctfull
- ; dc-only
+ ; dc-only - the 10bit version can be done entirely in 32bit, since the max
+ ; coef values are 17+sign bit, and the coef is 14bit, so 31+sign easily
+ ; fits in 32bit
+ DEFINE_ARGS dst, stride, block, coef
+ pxor m2, m2
+ DC_ONLY 6, m2
+ movd m1, coefd
+ punpcklwd m1, m1
+ pshufd m1, m1, q0000
+ DEFINE_ARGS dst, stride, cnt
+ mov cntd, 8
+.loop_dc:
+ STORE_2x8 3, 4, 1, m2, m0, dstq, mmsize
+ STORE_2x8 3, 4, 1, m2, m0, dstq+strideq, mmsize
+ lea dstq, [dstq+strideq*2]
+ dec cntd
+ jg .loop_dc
+ RET
.idctfull:
mova [rsp+64*mmsize], m0
@@ -1019,7 +1029,6 @@ cglobal vp9_idct_idct_16x16_add_10, 4, 6 + ARCH_X86_64, 16, \
mov ptrq, rsp
.loop_1:
IDCT16_1D blockq
-; order: 2,1,0,11,3,7,9,10,6,8,4,5,12,13,r65,15
TRANSPOSE4x4D 0, 1, 2, 3, 7
mova [ptrq+ 1*mmsize], m0
@@ -1112,6 +1121,20 @@ cglobal vp9_idct_idct_16x16_add_12, 4, 6 + ARCH_X86_64, 16, \
cmp eobd, 1
jg mangle(private_prefix %+ _ %+ vp9_idct_idct_16x16_add_10 %+ SUFFIX).idctfull
- ; dc-only
- jmp mangle(private_prefix %+ _ %+ vp9_idct_idct_16x16_add_10 %+ SUFFIX).idctfull
+ ; dc-only - unfortunately, this one can overflow, since coefs are 19+sign
+ ; bpp, and 19+14+sign does not fit in 32bit, so we do 2-stage multiplies
+ DEFINE_ARGS dst, stride, block, coef, coefl
+ pxor m2, m2
+ DC_ONLY_64BIT 6, m2
+ movd m1, coefd
+ punpcklwd m1, m1
+ pshufd m1, m1, q0000
+ DEFINE_ARGS dst, stride, cnt
+ mov cntd, 8
+.loop_dc:
+ STORE_2x8 3, 4, 1, m2, m0, dstq, mmsize
+ STORE_2x8 3, 4, 1, m2, m0, dstq+strideq, mmsize
+ lea dstq, [dstq+strideq*2]
+ dec cntd
+ jg .loop_dc
RET
--
2.1.2
More information about the ffmpeg-devel
mailing list