|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
%include "libavutil/x86/x86util.asm" |
|
|
|
|
|
|
|
SECTION_RODATA |
|
|
|
vp3_idct_data: times 8 dw 64277 |
|
times 8 dw 60547 |
|
times 8 dw 54491 |
|
times 8 dw 46341 |
|
times 8 dw 36410 |
|
times 8 dw 25080 |
|
times 8 dw 12785 |
|
|
|
pb_7: times 8 db 0x07 |
|
pb_1F: times 8 db 0x1f |
|
pb_81: times 8 db 0x81 |
|
|
|
cextern pb_1 |
|
cextern pb_3 |
|
cextern pb_80 |
|
cextern pb_FE |
|
|
|
cextern pw_8 |
|
|
|
SECTION .text |
|
|
|
|
|
|
|
|
|
%macro VP3_LOOP_FILTER 0 |
|
movq m7, m6 |
|
pand m6, [pb_7] |
|
psrlw m7, 3 |
|
pand m7, [pb_1F] |
|
movq m3, m2 |
|
pxor m2, m4 |
|
pand m2, [pb_1] |
|
movq m5, m2 |
|
paddb m2, m2 |
|
paddb m2, m5 |
|
paddb m2, m6 |
|
pcmpeqb m0, m0 |
|
pxor m1, m0 |
|
pavgb m1, m2 |
|
pxor m0, m4 |
|
pavgb m0, m3 |
|
paddb m1, [pb_3] |
|
pavgb m1, m0 |
|
pavgb m1, m0 |
|
paddusb m7, m1 |
|
movq m6, [pb_81] |
|
psubusb m6, m7 |
|
psubusb m7, [pb_81] |
|
|
|
movq m5, [r2+516] |
|
pminub m6, m5 |
|
pminub m7, m5 |
|
movq m0, m6 |
|
movq m1, m7 |
|
paddb m6, m6 |
|
paddb m7, m7 |
|
pminub m6, m5 |
|
pminub m7, m5 |
|
psubb m6, m0 |
|
psubb m7, m1 |
|
paddusb m4, m7 |
|
psubusb m4, m6 |
|
psubusb m3, m7 |
|
paddusb m3, m6 |
|
%endmacro |
|
|
|
%macro STORE_4_WORDS 1 |
|
movd r2d, %1 |
|
mov [r0 -1], r2w |
|
psrlq %1, 32 |
|
shr r2, 16 |
|
mov [r0+r1 -1], r2w |
|
movd r2d, %1 |
|
mov [r0+r1*2-1], r2w |
|
shr r2, 16 |
|
mov [r0+r3 -1], r2w |
|
%endmacro |
|
|
|
INIT_MMX mmxext |
|
cglobal vp3_v_loop_filter, 3, 4 |
|
mov r3, r1 |
|
neg r1 |
|
movq m6, [r0+r1*2] |
|
movq m4, [r0+r1 ] |
|
movq m2, [r0 ] |
|
movq m1, [r0+r3 ] |
|
|
|
VP3_LOOP_FILTER |
|
|
|
movq [r0+r1], m4 |
|
movq [r0 ], m3 |
|
RET |
|
|
|
cglobal vp3_h_loop_filter, 3, 4 |
|
lea r3, [r1*3] |
|
|
|
movd m6, [r0 -2] |
|
movd m4, [r0+r1 -2] |
|
movd m2, [r0+r1*2-2] |
|
movd m1, [r0+r3 -2] |
|
lea r0, [r0+r1*4 ] |
|
punpcklbw m6, [r0 -2] |
|
punpcklbw m4, [r0+r1 -2] |
|
punpcklbw m2, [r0+r1*2-2] |
|
punpcklbw m1, [r0+r3 -2] |
|
sub r0, r3 |
|
sub r0, r1 |
|
|
|
TRANSPOSE4x4B 6, 4, 2, 1, 0 |
|
VP3_LOOP_FILTER |
|
SBUTTERFLY bw, 4, 3, 5 |
|
|
|
STORE_4_WORDS m4 |
|
lea r0, [r0+r1*4 ] |
|
STORE_4_WORDS m3 |
|
RET |
|
|
|
%macro PAVGB_NO_RND 0 |
|
mova m4, m0 |
|
mova m5, m2 |
|
pand m4, m1 |
|
pand m5, m3 |
|
pxor m1, m0 |
|
pxor m3, m2 |
|
pand m1, m6 |
|
pand m3, m6 |
|
psrlq m1, 1 |
|
psrlq m3, 1 |
|
paddb m4, m1 |
|
paddb m5, m3 |
|
%endmacro |
|
|
|
INIT_MMX mmx |
|
cglobal put_vp_no_rnd_pixels8_l2, 5, 6, 0, dst, src1, src2, stride, h, stride3 |
|
mova m6, [pb_FE] |
|
lea stride3q,[strideq+strideq*2] |
|
.loop: |
|
mova m0, [src1q] |
|
mova m1, [src2q] |
|
mova m2, [src1q+strideq] |
|
mova m3, [src2q+strideq] |
|
PAVGB_NO_RND |
|
mova [dstq], m4 |
|
mova [dstq+strideq], m5 |
|
|
|
mova m0, [src1q+strideq*2] |
|
mova m1, [src2q+strideq*2] |
|
mova m2, [src1q+stride3q] |
|
mova m3, [src2q+stride3q] |
|
PAVGB_NO_RND |
|
mova [dstq+strideq*2], m4 |
|
mova [dstq+stride3q], m5 |
|
|
|
lea src1q, [src1q+strideq*4] |
|
lea src2q, [src2q+strideq*4] |
|
lea dstq, [dstq+strideq*4] |
|
sub hd, 4 |
|
jnz .loop |
|
RET |
|
|
|
|
|
%macro BeginIDCT 0 |
|
movq m2, I(3) |
|
movq m6, C(3) |
|
movq m4, m2 |
|
movq m7, J(5) |
|
pmulhw m4, m6 |
|
movq m1, C(5) |
|
pmulhw m6, m7 |
|
movq m5, m1 |
|
pmulhw m1, m2 |
|
movq m3, I(1) |
|
pmulhw m5, m7 |
|
movq m0, C(1) |
|
paddw m4, m2 |
|
paddw m6, m7 |
|
paddw m2, m1 |
|
movq m1, J(7) |
|
paddw m7, m5 |
|
movq m5, m0 |
|
pmulhw m0, m3 |
|
paddsw m4, m7 |
|
pmulhw m5, m1 |
|
movq m7, C(7) |
|
psubsw m6, m2 |
|
paddw m0, m3 |
|
pmulhw m3, m7 |
|
movq m2, I(2) |
|
pmulhw m7, m1 |
|
paddw m5, m1 |
|
movq m1, m2 |
|
pmulhw m2, C(2) |
|
psubsw m3, m5 |
|
movq m5, J(6) |
|
paddsw m0, m7 |
|
movq m7, m5 |
|
psubsw m0, m4 |
|
pmulhw m5, C(2) |
|
paddw m2, m1 |
|
pmulhw m1, C(6) |
|
paddsw m4, m4 |
|
paddsw m4, m0 |
|
psubsw m3, m6 |
|
paddw m5, m7 |
|
paddsw m6, m6 |
|
pmulhw m7, C(6) |
|
paddsw m6, m3 |
|
movq I(1), m4 |
|
psubsw m1, m5 |
|
movq m4, C(4) |
|
movq m5, m3 |
|
pmulhw m3, m4 |
|
paddsw m7, m2 |
|
movq I(2), m6 |
|
movq m2, m0 |
|
movq m6, I(0) |
|
pmulhw m0, m4 |
|
paddw m5, m3 |
|
movq m3, J(4) |
|
psubsw m5, m1 |
|
paddw m2, m0 |
|
psubsw m6, m3 |
|
movq m0, m6 |
|
pmulhw m6, m4 |
|
paddsw m3, m3 |
|
paddsw m1, m1 |
|
paddsw m3, m0 |
|
paddsw m1, m5 |
|
pmulhw m4, m3 |
|
paddsw m6, m0 |
|
psubsw m6, m2 |
|
paddsw m2, m2 |
|
movq m0, I(1) |
|
paddsw m2, m6 |
|
paddw m4, m3 |
|
psubsw m2, m1 |
|
%endmacro |
|
|
|
|
|
%macro RowIDCT 0 |
|
BeginIDCT |
|
movq m3, I(2) |
|
psubsw m4, m7 |
|
paddsw m1, m1 |
|
paddsw m7, m7 |
|
paddsw m1, m2 |
|
paddsw m7, m4 |
|
psubsw m4, m3 |
|
paddsw m3, m3 |
|
psubsw m6, m5 |
|
paddsw m5, m5 |
|
paddsw m3, m4 |
|
paddsw m5, m6 |
|
psubsw m7, m0 |
|
paddsw m0, m0 |
|
movq I(1), m1 |
|
paddsw m0, m7 |
|
%endmacro |
|
|
|
|
|
%macro ColumnIDCT 0 |
|
BeginIDCT |
|
paddsw m2, OC_8 |
|
paddsw m1, m1 |
|
paddsw m1, m2 |
|
psraw m2, 4 |
|
psubsw m4, m7 |
|
psraw m1, 4 |
|
movq m3, I(2) |
|
paddsw m7, m7 |
|
movq I(2), m2 |
|
paddsw m7, m4 |
|
movq I(1), m1 |
|
psubsw m4, m3 |
|
paddsw m4, OC_8 |
|
paddsw m3, m3 |
|
paddsw m3, m4 |
|
psraw m4, 4 |
|
psubsw m6, m5 |
|
psraw m3, 4 |
|
paddsw m6, OC_8 |
|
paddsw m5, m5 |
|
paddsw m5, m6 |
|
psraw m6, 4 |
|
movq J(4), m4 |
|
psraw m5, 4 |
|
movq I(3), m3 |
|
psubsw m7, m0 |
|
paddsw m7, OC_8 |
|
paddsw m0, m0 |
|
paddsw m0, m7 |
|
psraw m7, 4 |
|
movq J(6), m6 |
|
psraw m0, 4 |
|
movq J(5), m5 |
|
movq J(7), m7 |
|
movq I(0), m0 |
|
%endmacro |
|
|
|
|
|
; |
|
|
|
; |
|
|
|
|
|
|
|
|
|
; |
|
|
|
|
|
|
|
|
|
; |
|
|
|
; |
|
|
|
|
|
|
|
|
|
; |
|
|
|
|
|
|
|
|
|
; |
|
|
|
|
|
; |
|
|
|
%macro Transpose 0 |
|
movq m1, m4 |
|
punpcklwd m4, m5 |
|
movq I(0), m0 |
|
punpckhwd m1, m5 |
|
movq m0, m6 |
|
punpcklwd m6, m7 |
|
movq m5, m4 |
|
punpckldq m4, m6 |
|
punpckhdq m5, m6 |
|
movq m6, m1 |
|
movq J(4), m4 |
|
punpckhwd m0, m7 |
|
movq J(5), m5 |
|
punpckhdq m6, m0 |
|
movq m4, I(0) |
|
punpckldq m1, m0 |
|
movq m5, I(1) |
|
movq m0, m4 |
|
movq J(7), m6 |
|
punpcklwd m0, m5 |
|
movq J(6), m1 |
|
punpckhwd m4, m5 |
|
movq m5, m2 |
|
punpcklwd m2, m3 |
|
movq m1, m0 |
|
punpckldq m0, m2 |
|
punpckhdq m1, m2 |
|
movq m2, m4 |
|
movq I(0), m0 |
|
punpckhwd m5, m3 |
|
movq I(1), m1 |
|
punpckhdq m4, m5 |
|
punpckldq m2, m5 |
|
movq I(3), m4 |
|
movq I(2), m2 |
|
%endmacro |
|
|
|
%macro VP3_1D_IDCT_SSE2 0 |
|
movdqa m2, I(3) |
|
movdqa m6, C(3) |
|
movdqa m4, m2 |
|
movdqa m7, I(5) |
|
pmulhw m4, m6 |
|
movdqa m1, C(5) |
|
pmulhw m6, m7 |
|
movdqa m5, m1 |
|
pmulhw m1, m2 |
|
movdqa m3, I(1) |
|
pmulhw m5, m7 |
|
movdqa m0, C(1) |
|
paddw m4, m2 |
|
paddw m6, m7 |
|
paddw m2, m1 |
|
movdqa m1, I(7) |
|
paddw m7, m5 |
|
movdqa m5, m0 |
|
pmulhw m0, m3 |
|
paddsw m4, m7 |
|
pmulhw m5, m1 |
|
movdqa m7, C(7) |
|
psubsw m6, m2 |
|
paddw m0, m3 |
|
pmulhw m3, m7 |
|
movdqa m2, I(2) |
|
pmulhw m7, m1 |
|
paddw m5, m1 |
|
movdqa m1, m2 |
|
pmulhw m2, C(2) |
|
psubsw m3, m5 |
|
movdqa m5, I(6) |
|
paddsw m0, m7 |
|
movdqa m7, m5 |
|
psubsw m0, m4 |
|
pmulhw m5, C(2) |
|
paddw m2, m1 |
|
pmulhw m1, C(6) |
|
paddsw m4, m4 |
|
paddsw m4, m0 |
|
psubsw m3, m6 |
|
paddw m5, m7 |
|
paddsw m6, m6 |
|
pmulhw m7, C(6) |
|
paddsw m6, m3 |
|
movdqa I(1), m4 |
|
psubsw m1, m5 |
|
movdqa m4, C(4) |
|
movdqa m5, m3 |
|
pmulhw m3, m4 |
|
paddsw m7, m2 |
|
movdqa I(2), m6 |
|
movdqa m2, m0 |
|
movdqa m6, I(0) |
|
pmulhw m0, m4 |
|
paddw m5, m3 |
|
movdqa m3, I(4) |
|
psubsw m5, m1 |
|
paddw m2, m0 |
|
psubsw m6, m3 |
|
movdqa m0, m6 |
|
pmulhw m6, m4 |
|
paddsw m3, m3 |
|
paddsw m1, m1 |
|
paddsw m3, m0 |
|
paddsw m1, m5 |
|
pmulhw m4, m3 |
|
paddw m6, m0 |
|
psubsw m6, m2 |
|
paddsw m2, m2 |
|
movdqa m0, I(1) |
|
paddsw m2, m6 |
|
paddw m4, m3 |
|
psubsw m2, m1 |
|
ADD(m2) |
|
paddsw m1, m1 |
|
paddsw m1, m2 |
|
SHIFT(m2) |
|
psubsw m4, m7 |
|
SHIFT(m1) |
|
movdqa m3, I(2) |
|
paddsw m7, m7 |
|
paddsw m7, m4 |
|
psubsw m4, m3 |
|
ADD(m4) |
|
paddsw m3, m3 |
|
paddsw m3, m4 |
|
SHIFT(m4) |
|
psubsw m6, m5 |
|
SHIFT(m3) |
|
ADD(m6) |
|
paddsw m5, m5 |
|
paddsw m5, m6 |
|
SHIFT(m6) |
|
SHIFT(m5) |
|
psubsw m7, m0 |
|
ADD(m7) |
|
paddsw m0, m0 |
|
paddsw m0, m7 |
|
SHIFT(m7) |
|
SHIFT(m0) |
|
%endmacro |
|
|
|
%macro PUT_BLOCK 8 |
|
movdqa O(0), m%1 |
|
movdqa O(1), m%2 |
|
movdqa O(2), m%3 |
|
movdqa O(3), m%4 |
|
movdqa O(4), m%5 |
|
movdqa O(5), m%6 |
|
movdqa O(6), m%7 |
|
movdqa O(7), m%8 |
|
%endmacro |
|
|
|
%macro VP3_IDCT 1 |
|
%if mmsize == 16 |
|
%define I(x) [%1+16*x] |
|
%define O(x) [%1+16*x] |
|
%define C(x) [vp3_idct_data+16*(x-1)] |
|
%define SHIFT(x) |
|
%define ADD(x) |
|
VP3_1D_IDCT_SSE2 |
|
%if ARCH_X86_64 |
|
TRANSPOSE8x8W 0, 1, 2, 3, 4, 5, 6, 7, 8 |
|
%else |
|
TRANSPOSE8x8W 0, 1, 2, 3, 4, 5, 6, 7, [%1], [%1+16] |
|
%endif |
|
PUT_BLOCK 0, 1, 2, 3, 4, 5, 6, 7 |
|
|
|
%define SHIFT(x) psraw x, 4 |
|
%define ADD(x) paddsw x, [pw_8] |
|
VP3_1D_IDCT_SSE2 |
|
PUT_BLOCK 0, 1, 2, 3, 4, 5, 6, 7 |
|
%else |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
%define OC_8 [pw_8] |
|
%define C(x) [vp3_idct_data+16*(x-1)] |
|
|
|
|
|
|
|
%define I(x) [%1+16*x] |
|
%define J(x) [%1+16*x] |
|
RowIDCT |
|
Transpose |
|
|
|
%define I(x) [%1+16*x+8] |
|
%define J(x) [%1+16*x+8] |
|
RowIDCT |
|
Transpose |
|
|
|
%define I(x) [%1+16* x] |
|
%define J(x) [%1+16*(x-4)+8] |
|
ColumnIDCT |
|
|
|
%define I(x) [%1+16* x +64] |
|
%define J(x) [%1+16*(x-4)+72] |
|
ColumnIDCT |
|
%endif |
|
%endmacro |
|
|
|
%macro vp3_idct_funcs 0 |
|
cglobal vp3_idct_put, 3, 4, 9 |
|
VP3_IDCT r2 |
|
|
|
mova m4, [pb_80] |
|
lea r3, [r1*3] |
|
%assign %%i 0 |
|
%rep 16/mmsize |
|
mova m0, [r2+mmsize*0+%%i] |
|
mova m1, [r2+mmsize*2+%%i] |
|
mova m2, [r2+mmsize*4+%%i] |
|
mova m3, [r2+mmsize*6+%%i] |
|
packsswb m0, [r2+mmsize*1+%%i] |
|
packsswb m1, [r2+mmsize*3+%%i] |
|
packsswb m2, [r2+mmsize*5+%%i] |
|
packsswb m3, [r2+mmsize*7+%%i] |
|
paddb m0, m4 |
|
paddb m1, m4 |
|
paddb m2, m4 |
|
paddb m3, m4 |
|
movq [r0 ], m0 |
|
movhps [r0+r1 ], m0 |
|
movq [r0+r1*2], m1 |
|
movhps [r0+r3 ], m1 |
|
%if %%i == 0 |
|
lea r0, [r0+r1*4] |
|
%endif |
|
movq [r0 ], m2 |
|
movhps [r0+r1 ], m2 |
|
movq [r0+r1*2], m3 |
|
movhps [r0+r3 ], m3 |
|
%assign %%i %%i+8 |
|
%endrep |
|
|
|
pxor m0, m0 |
|
%assign %%offset 0 |
|
%rep 128/mmsize |
|
mova [r2+%%offset], m0 |
|
%assign %%offset %%offset+mmsize |
|
%endrep |
|
RET |
|
|
|
cglobal vp3_idct_add, 3, 4, 9 |
|
VP3_IDCT r2 |
|
|
|
lea r3, [r1*3] |
|
pxor m4, m4 |
|
%assign %%i 0 |
|
%rep 2 |
|
movq m0, [r0] |
|
movq m1, [r0+r1] |
|
movq m2, [r0+r1*2] |
|
movq m3, [r0+r3] |
|
punpcklbw m0, m4 |
|
punpcklbw m1, m4 |
|
punpcklbw m2, m4 |
|
punpcklbw m3, m4 |
|
paddsw m0, [r2+ 0+%%i] |
|
paddsw m1, [r2+16+%%i] |
|
paddsw m2, [r2+32+%%i] |
|
paddsw m3, [r2+48+%%i] |
|
packuswb m0, m1 |
|
packuswb m2, m3 |
|
movq [r0 ], m0 |
|
movhps [r0+r1 ], m0 |
|
movq [r0+r1*2], m2 |
|
movhps [r0+r3 ], m2 |
|
%if %%i == 0 |
|
lea r0, [r0+r1*4] |
|
%endif |
|
%assign %%i %%i+64 |
|
%endrep |
|
%assign %%i 0 |
|
%rep 128/mmsize |
|
mova [r2+%%i], m4 |
|
%assign %%i %%i+mmsize |
|
%endrep |
|
RET |
|
%endmacro |
|
|
|
INIT_XMM sse2 |
|
vp3_idct_funcs |
|
|
|
%macro DC_ADD 0 |
|
movq m2, [r0 ] |
|
movq m3, [r0+r1 ] |
|
paddusb m2, m0 |
|
movq m4, [r0+r1*2] |
|
paddusb m3, m0 |
|
movq m5, [r0+r2 ] |
|
paddusb m4, m0 |
|
paddusb m5, m0 |
|
psubusb m2, m1 |
|
psubusb m3, m1 |
|
movq [r0 ], m2 |
|
psubusb m4, m1 |
|
movq [r0+r1 ], m3 |
|
psubusb m5, m1 |
|
movq [r0+r1*2], m4 |
|
movq [r0+r2 ], m5 |
|
%endmacro |
|
|
|
INIT_MMX mmxext |
|
cglobal vp3_idct_dc_add, 3, 4 |
|
movsx r3, word [r2] |
|
mov word [r2], 0 |
|
lea r2, [r1*3] |
|
add r3, 15 |
|
sar r3, 5 |
|
movd m0, r3d |
|
pshufw m0, m0, 0x0 |
|
pxor m1, m1 |
|
psubw m1, m0 |
|
packuswb m0, m0 |
|
packuswb m1, m1 |
|
DC_ADD |
|
lea r0, [r0+r1*4] |
|
DC_ADD |
|
RET |
|
|