You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-11-23 21:54:53 +02:00
vp9: Add 8bpc intra prediction AVX2 asm
This commit is contained in:
committed by
Henrik Gramner
parent
9a34ddc345
commit
a66a260ae9
@@ -207,11 +207,8 @@ ipred_dir_tm_h_funcs(8, avx);
|
|||||||
ipred_dir_tm_h_funcs(16, avx);
|
ipred_dir_tm_h_funcs(16, avx);
|
||||||
ipred_dir_tm_h_funcs(32, avx);
|
ipred_dir_tm_h_funcs(32, avx);
|
||||||
|
|
||||||
ipred_func(32, v, avx);
|
ipred_all_funcs(32, avx2);
|
||||||
|
ipred_func(32, v, avx2);
|
||||||
ipred_dc_funcs(32, avx2);
|
|
||||||
ipred_func(32, h, avx2);
|
|
||||||
ipred_func(32, tm, avx2);
|
|
||||||
|
|
||||||
#undef ipred_func
|
#undef ipred_func
|
||||||
#undef ipred_dir_tm_h_funcs
|
#undef ipred_dir_tm_h_funcs
|
||||||
@@ -388,7 +385,6 @@ av_cold void ff_vp9dsp_init_x86(VP9DSPContext *dsp, int bpp, int bitexact)
|
|||||||
if (EXTERNAL_AVX_FAST(cpu_flags)) {
|
if (EXTERNAL_AVX_FAST(cpu_flags)) {
|
||||||
init_fpel_func(1, 0, 32, put, , avx);
|
init_fpel_func(1, 0, 32, put, , avx);
|
||||||
init_fpel_func(0, 0, 64, put, , avx);
|
init_fpel_func(0, 0, 64, put, , avx);
|
||||||
init_ipred(32, avx, v, VERT);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (EXTERNAL_AVX2_FAST(cpu_flags)) {
|
if (EXTERNAL_AVX2_FAST(cpu_flags)) {
|
||||||
@@ -408,9 +404,8 @@ av_cold void ff_vp9dsp_init_x86(VP9DSPContext *dsp, int bpp, int bitexact)
|
|||||||
init_subpel3_32_64(1, avg, 8, avx2);
|
init_subpel3_32_64(1, avg, 8, avx2);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
init_dc_ipred(32, avx2);
|
init_all_ipred(32, avx2);
|
||||||
init_ipred(32, avx2, h, HOR);
|
init_ipred(32, avx2, v, VERT);
|
||||||
init_ipred(32, avx2, tm, TM_VP8);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if ARCH_X86_64
|
#if ARCH_X86_64
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
;* VP9 Intra prediction SIMD optimizations
|
;* VP9 Intra prediction SIMD optimizations
|
||||||
;*
|
;*
|
||||||
;* Copyright (c) 2013 Ronald S. Bultje <rsbultje gmail com>
|
;* Copyright (c) 2013 Ronald S. Bultje <rsbultje gmail com>
|
||||||
|
;* Copyright (c) 2025 Two Orioles, LLC
|
||||||
;*
|
;*
|
||||||
;* Parts based on:
|
;* Parts based on:
|
||||||
;* H.264 intra prediction asm optimizations
|
;* H.264 intra prediction asm optimizations
|
||||||
@@ -230,40 +231,6 @@ DC_16to32_FUNCS
|
|||||||
INIT_XMM ssse3
|
INIT_XMM ssse3
|
||||||
DC_16to32_FUNCS
|
DC_16to32_FUNCS
|
||||||
|
|
||||||
%if HAVE_AVX2_EXTERNAL
|
|
||||||
INIT_YMM avx2
|
|
||||||
cglobal vp9_ipred_dc_32x32, 4, 4, 3, dst, stride, l, a
|
|
||||||
mova m0, [lq]
|
|
||||||
mova m1, [aq]
|
|
||||||
DEFINE_ARGS dst, stride, stride3, cnt
|
|
||||||
lea stride3q, [strideq*3]
|
|
||||||
pxor m2, m2
|
|
||||||
psadbw m0, m2
|
|
||||||
psadbw m1, m2
|
|
||||||
paddw m0, m1
|
|
||||||
vextracti128 xm1, m0, 1
|
|
||||||
paddw xm0, xm1
|
|
||||||
movhlps xm1, xm0
|
|
||||||
paddw xm0, xm1
|
|
||||||
pmulhrsw xm0, [pw_512]
|
|
||||||
vpbroadcastb m0, xm0
|
|
||||||
mov cntd, 4
|
|
||||||
.loop:
|
|
||||||
mova [dstq+strideq*0], m0
|
|
||||||
mova [dstq+strideq*1], m0
|
|
||||||
mova [dstq+strideq*2], m0
|
|
||||||
mova [dstq+stride3q ], m0
|
|
||||||
lea dstq, [dstq+strideq*4]
|
|
||||||
mova [dstq+strideq*0], m0
|
|
||||||
mova [dstq+strideq*1], m0
|
|
||||||
mova [dstq+strideq*2], m0
|
|
||||||
mova [dstq+stride3q ], m0
|
|
||||||
lea dstq, [dstq+strideq*4]
|
|
||||||
dec cntd
|
|
||||||
jg .loop
|
|
||||||
RET
|
|
||||||
%endif
|
|
||||||
|
|
||||||
; dc_top/left_NxN(uint8_t *dst, ptrdiff_t stride, const uint8_t *l, const uint8_t *a)
|
; dc_top/left_NxN(uint8_t *dst, ptrdiff_t stride, const uint8_t *l, const uint8_t *a)
|
||||||
|
|
||||||
%macro DC_1D_4to8_FUNCS 2 ; dir (top or left), arg (a or l)
|
%macro DC_1D_4to8_FUNCS 2 ; dir (top or left), arg (a or l)
|
||||||
@@ -395,44 +362,6 @@ INIT_XMM ssse3
|
|||||||
DC_1D_16to32_FUNCS top, a
|
DC_1D_16to32_FUNCS top, a
|
||||||
DC_1D_16to32_FUNCS left, l
|
DC_1D_16to32_FUNCS left, l
|
||||||
|
|
||||||
%macro DC_1D_AVX2_FUNCS 2 ; dir (top or left), arg (a or l)
|
|
||||||
%if HAVE_AVX2_EXTERNAL
|
|
||||||
cglobal vp9_ipred_dc_%1_32x32, 4, 4, 3, dst, stride, l, a
|
|
||||||
mova m0, [%2q]
|
|
||||||
DEFINE_ARGS dst, stride, stride3, cnt
|
|
||||||
lea stride3q, [strideq*3]
|
|
||||||
pxor m2, m2
|
|
||||||
psadbw m0, m2
|
|
||||||
vextracti128 xm1, m0, 1
|
|
||||||
paddw xm0, xm1
|
|
||||||
movhlps xm1, xm0
|
|
||||||
paddw xm0, xm1
|
|
||||||
pmulhrsw xm0, [pw_1024]
|
|
||||||
vpbroadcastb m0, xm0
|
|
||||||
mov cntd, 4
|
|
||||||
.loop:
|
|
||||||
mova [dstq+strideq*0], m0
|
|
||||||
mova [dstq+strideq*1], m0
|
|
||||||
mova [dstq+strideq*2], m0
|
|
||||||
mova [dstq+stride3q ], m0
|
|
||||||
lea dstq, [dstq+strideq*4]
|
|
||||||
mova [dstq+strideq*0], m0
|
|
||||||
mova [dstq+strideq*1], m0
|
|
||||||
mova [dstq+strideq*2], m0
|
|
||||||
mova [dstq+stride3q ], m0
|
|
||||||
lea dstq, [dstq+strideq*4]
|
|
||||||
dec cntd
|
|
||||||
jg .loop
|
|
||||||
RET
|
|
||||||
%endif
|
|
||||||
%endmacro
|
|
||||||
|
|
||||||
INIT_YMM avx2
|
|
||||||
DC_1D_AVX2_FUNCS top, a
|
|
||||||
DC_1D_AVX2_FUNCS left, l
|
|
||||||
|
|
||||||
; v
|
|
||||||
|
|
||||||
INIT_MMX mmx
|
INIT_MMX mmx
|
||||||
cglobal vp9_ipred_v_8x8, 4, 4, 0, dst, stride, l, a
|
cglobal vp9_ipred_v_8x8, 4, 4, 0, dst, stride, l, a
|
||||||
movq m0, [aq]
|
movq m0, [aq]
|
||||||
@@ -486,29 +415,6 @@ cglobal vp9_ipred_v_32x32, 4, 4, 2, dst, stride, l, a
|
|||||||
jg .loop
|
jg .loop
|
||||||
RET
|
RET
|
||||||
|
|
||||||
INIT_YMM avx
|
|
||||||
cglobal vp9_ipred_v_32x32, 4, 4, 1, dst, stride, l, a
|
|
||||||
mova m0, [aq]
|
|
||||||
DEFINE_ARGS dst, stride, stride3, cnt
|
|
||||||
lea stride3q, [strideq*3]
|
|
||||||
mov cntd, 4
|
|
||||||
.loop:
|
|
||||||
mova [dstq+strideq*0], m0
|
|
||||||
mova [dstq+strideq*1], m0
|
|
||||||
mova [dstq+strideq*2], m0
|
|
||||||
mova [dstq+stride3q ], m0
|
|
||||||
lea dstq, [dstq+strideq*4]
|
|
||||||
mova [dstq+strideq*0], m0
|
|
||||||
mova [dstq+strideq*1], m0
|
|
||||||
mova [dstq+strideq*2], m0
|
|
||||||
mova [dstq+stride3q ], m0
|
|
||||||
lea dstq, [dstq+strideq*4]
|
|
||||||
dec cntd
|
|
||||||
jg .loop
|
|
||||||
RET
|
|
||||||
|
|
||||||
; h
|
|
||||||
|
|
||||||
%macro H_XMM_FUNCS 2
|
%macro H_XMM_FUNCS 2
|
||||||
%if notcpuflag(avx)
|
%if notcpuflag(avx)
|
||||||
cglobal vp9_ipred_h_4x4, 3, 4, 1, dst, stride, l, stride3
|
cglobal vp9_ipred_h_4x4, 3, 4, 1, dst, stride, l, stride3
|
||||||
@@ -642,34 +548,6 @@ H_XMM_FUNCS 4, 8
|
|||||||
INIT_XMM avx
|
INIT_XMM avx
|
||||||
H_XMM_FUNCS 4, 8
|
H_XMM_FUNCS 4, 8
|
||||||
|
|
||||||
%if HAVE_AVX2_EXTERNAL
|
|
||||||
INIT_YMM avx2
|
|
||||||
cglobal vp9_ipred_h_32x32, 3, 5, 8, dst, stride, l, stride3, cnt
|
|
||||||
mova m5, [pb_1]
|
|
||||||
mova m6, [pb_2]
|
|
||||||
mova m7, [pb_3]
|
|
||||||
pxor m4, m4
|
|
||||||
lea stride3q, [strideq*3]
|
|
||||||
mov cntq, 7
|
|
||||||
.loop:
|
|
||||||
movd xm3, [lq+cntq*4]
|
|
||||||
vinserti128 m3, m3, xm3, 1
|
|
||||||
pshufb m0, m3, m7
|
|
||||||
pshufb m1, m3, m6
|
|
||||||
mova [dstq+strideq*0], m0
|
|
||||||
mova [dstq+strideq*1], m1
|
|
||||||
pshufb m2, m3, m5
|
|
||||||
pshufb m3, m4
|
|
||||||
mova [dstq+strideq*2], m2
|
|
||||||
mova [dstq+stride3q ], m3
|
|
||||||
lea dstq, [dstq+strideq*4]
|
|
||||||
dec cntq
|
|
||||||
jge .loop
|
|
||||||
RET
|
|
||||||
%endif
|
|
||||||
|
|
||||||
; tm
|
|
||||||
|
|
||||||
%macro TM_MMX_FUNCS 0
|
%macro TM_MMX_FUNCS 0
|
||||||
cglobal vp9_ipred_tm_4x4, 4, 4, 0, dst, stride, l, a
|
cglobal vp9_ipred_tm_4x4, 4, 4, 0, dst, stride, l, a
|
||||||
pxor m1, m1
|
pxor m1, m1
|
||||||
@@ -898,46 +776,9 @@ TM_XMM_FUNCS
|
|||||||
INIT_XMM avx
|
INIT_XMM avx
|
||||||
TM_XMM_FUNCS
|
TM_XMM_FUNCS
|
||||||
|
|
||||||
%if HAVE_AVX2_EXTERNAL
|
%macro LOWPASS 4-5 [pb_1] ; left [dst], center, right, tmp, pb_1
|
||||||
INIT_YMM avx2
|
|
||||||
cglobal vp9_ipred_tm_32x32, 4, 4, 8, dst, stride, l, a
|
|
||||||
pxor m3, m3
|
|
||||||
pinsrw xm2, [aq-1], 0
|
|
||||||
vinserti128 m2, m2, xm2, 1
|
|
||||||
mova m0, [aq]
|
|
||||||
DEFINE_ARGS dst, stride, l, cnt
|
|
||||||
mova m4, [pw_m256]
|
|
||||||
mova m5, [pw_m255]
|
|
||||||
pshufb m2, m4
|
|
||||||
punpckhbw m1, m0, m3
|
|
||||||
punpcklbw m0, m3
|
|
||||||
psubw m1, m2
|
|
||||||
psubw m0, m2
|
|
||||||
mov cntq, 15
|
|
||||||
.loop:
|
|
||||||
pinsrw xm7, [lq+cntq*2], 0
|
|
||||||
vinserti128 m7, m7, xm7, 1
|
|
||||||
pshufb m3, m7, m5
|
|
||||||
pshufb m7, m4
|
|
||||||
paddw m2, m3, m0
|
|
||||||
paddw m3, m1
|
|
||||||
paddw m6, m7, m0
|
|
||||||
paddw m7, m1
|
|
||||||
packuswb m2, m3
|
|
||||||
packuswb m6, m7
|
|
||||||
mova [dstq+strideq*0], m2
|
|
||||||
mova [dstq+strideq*1], m6
|
|
||||||
lea dstq, [dstq+strideq*2]
|
|
||||||
dec cntq
|
|
||||||
jge .loop
|
|
||||||
RET
|
|
||||||
%endif
|
|
||||||
|
|
||||||
; dl
|
|
||||||
|
|
||||||
%macro LOWPASS 4 ; left [dst], center, right, tmp
|
|
||||||
pxor m%4, m%1, m%3
|
pxor m%4, m%1, m%3
|
||||||
pand m%4, [pb_1]
|
pand m%4, %5
|
||||||
pavgb m%1, m%3
|
pavgb m%1, m%3
|
||||||
psubusb m%1, m%4
|
psubusb m%1, m%4
|
||||||
pavgb m%1, m%2
|
pavgb m%1, m%2
|
||||||
@@ -2041,4 +1882,306 @@ HU_XMM_FUNCS 7
|
|||||||
INIT_XMM avx
|
INIT_XMM avx
|
||||||
HU_XMM_FUNCS 7
|
HU_XMM_FUNCS 7
|
||||||
|
|
||||||
|
%if HAVE_AVX2_EXTERNAL
|
||||||
|
INIT_YMM avx2
|
||||||
|
cglobal vp9_ipred_dc_32x32, 4, 4, 3, dst, stride, l, a
|
||||||
|
pxor m1, m1
|
||||||
|
psadbw m0, m1, [lq]
|
||||||
|
psadbw m1, [aq]
|
||||||
|
movd xm2, [pw_512]
|
||||||
|
paddw m0, m1
|
||||||
|
vextracti128 xm1, m0, 1
|
||||||
|
.main:
|
||||||
|
paddw xm0, xm1
|
||||||
|
punpckhqdq xm1, xm0, xm0
|
||||||
|
paddw xm0, xm1
|
||||||
|
pmulhrsw xm0, xm2
|
||||||
|
vpbroadcastb m0, xm0
|
||||||
|
.main2:
|
||||||
|
lea r2, [strideq*3]
|
||||||
|
mov r3d, 8
|
||||||
|
.loop:
|
||||||
|
mova [dstq+strideq*0], m0
|
||||||
|
mova [dstq+strideq*1], m0
|
||||||
|
mova [dstq+strideq*2], m0
|
||||||
|
mova [dstq+r2 ], m0
|
||||||
|
lea dstq, [dstq+strideq*4]
|
||||||
|
dec r3d
|
||||||
|
jg .loop
|
||||||
|
RET
|
||||||
|
|
||||||
|
cglobal vp9_ipred_dc_top_32x32, 0, 4, 3, dst, stride, l, a
|
||||||
|
mov lq, amp
|
||||||
|
%if ARCH_X86_32
|
||||||
|
jmp mangle(private_prefix %+ _vp9_ipred_dc_left_32x32 %+ SUFFIX).main
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%assign function_align 1
|
||||||
|
cglobal vp9_ipred_dc_left_32x32, 0, 4, 3, dst, stride, l, a
|
||||||
|
movifnidn lq, lmp
|
||||||
|
.main:
|
||||||
|
movifnidn dstq, dstmp
|
||||||
|
movifnidn strideq, stridemp
|
||||||
|
pxor xm1, xm1
|
||||||
|
psadbw xm0, xm1, [lq]
|
||||||
|
psadbw xm1, [lq+16]
|
||||||
|
movd xm2, [pw_1024]
|
||||||
|
jmp mangle(private_prefix %+ _vp9_ipred_dc_32x32 %+ SUFFIX).main
|
||||||
|
|
||||||
|
cglobal vp9_ipred_v_32x32, 2, 4, 3, dst, stride, l, a
|
||||||
|
movifnidn aq, amp
|
||||||
|
mova m0, [aq]
|
||||||
|
jmp mangle(private_prefix %+ _vp9_ipred_dc_32x32 %+ SUFFIX).main2
|
||||||
|
|
||||||
|
%assign function_align 16
|
||||||
|
cglobal vp9_ipred_h_32x32, 3, 5, 6, dst, stride, l
|
||||||
|
vpbroadcastd m2, [pb_3]
|
||||||
|
mov r3d, 7
|
||||||
|
vpbroadcastd m3, [pb_2]
|
||||||
|
pxor m5, m5
|
||||||
|
vpbroadcastd m4, [pb_1]
|
||||||
|
lea r4, [strideq*3]
|
||||||
|
.loop:
|
||||||
|
vpbroadcastd m1, [lq+r3*4]
|
||||||
|
pshufb m0, m1, m2
|
||||||
|
mova [dstq+strideq*0], m0
|
||||||
|
pshufb m0, m1, m3
|
||||||
|
mova [dstq+strideq*1], m0
|
||||||
|
pshufb m0, m1, m4
|
||||||
|
mova [dstq+strideq*2], m0
|
||||||
|
pshufb m1, m5
|
||||||
|
mova [dstq+r4 ], m1
|
||||||
|
lea dstq, [dstq+strideq*4]
|
||||||
|
dec r3d
|
||||||
|
jge .loop
|
||||||
|
RET
|
||||||
|
|
||||||
|
cglobal vp9_ipred_tm_32x32, 4, 4, 8, dst, stride, l, a
|
||||||
|
vpbroadcastd m0, [aq-1]
|
||||||
|
mova m7, [aq]
|
||||||
|
pxor m1, m1
|
||||||
|
vpbroadcastd m4, [pw_m255]
|
||||||
|
mov r3d, 15
|
||||||
|
vpbroadcastd m5, [pw_m256]
|
||||||
|
pshufb m0, m5
|
||||||
|
punpcklbw m6, m7, m1
|
||||||
|
punpckhbw m7, m1
|
||||||
|
psubw m6, m0
|
||||||
|
psubw m7, m0
|
||||||
|
.loop:
|
||||||
|
vpbroadcastd m3, [lq+r3*2]
|
||||||
|
pshufb m2, m3, m4
|
||||||
|
pshufb m3, m5
|
||||||
|
paddw m0, m2, m6
|
||||||
|
paddw m2, m7
|
||||||
|
paddw m1, m3, m6
|
||||||
|
paddw m3, m7
|
||||||
|
packuswb m0, m2
|
||||||
|
packuswb m1, m3
|
||||||
|
mova [dstq+strideq*0], m0
|
||||||
|
mova [dstq+strideq*1], m1
|
||||||
|
lea dstq, [dstq+strideq*2]
|
||||||
|
dec r3d
|
||||||
|
jge .loop
|
||||||
|
RET
|
||||||
|
|
||||||
|
cglobal vp9_ipred_dl_32x32, 2, 5, 6, dst, stride, l, a
|
||||||
|
movifnidn aq, amp
|
||||||
|
vpbroadcastb m2, [aq+31]
|
||||||
|
vinserti128 m3, m2, [aq+16], 0
|
||||||
|
mova m0, [aq+ 0]
|
||||||
|
vpbroadcastd m5, [pb_1]
|
||||||
|
palignr m4, m3, m0, 2
|
||||||
|
lea r3, [strideq*2]
|
||||||
|
palignr m3, m0, 1
|
||||||
|
LOWPASS 0, 3, 4, 1, m5
|
||||||
|
lea r4, [strideq*3]
|
||||||
|
vperm2i128 m1, m0, m2, 0x31
|
||||||
|
mov r2d, 8
|
||||||
|
.loop:
|
||||||
|
shufpd m3, m0, m1, 0x05
|
||||||
|
mova [dstq+r3*0], m0
|
||||||
|
punpckhqdq m4, m1, m2
|
||||||
|
mova [dstq+r3*4], m3
|
||||||
|
palignr m0, m1, m0, 1
|
||||||
|
mova [dstq+r3*8], m1
|
||||||
|
palignr m1, m2, m1, 1
|
||||||
|
mova [dstq+r4*8], m4
|
||||||
|
add dstq, strideq
|
||||||
|
dec r2d
|
||||||
|
jg .loop
|
||||||
|
RET
|
||||||
|
|
||||||
|
cglobal vp9_ipred_dr_32x32, 4, 5, 7, dst, stride, l, a
|
||||||
|
mova m3, [lq+ 0]
|
||||||
|
movu m1, [aq- 1]
|
||||||
|
mova m0, [aq+ 0]
|
||||||
|
vpbroadcastd m6, [pb_1]
|
||||||
|
vperm2i128 m2, m3, m1, 0x21
|
||||||
|
lea r3, [strideq*2]
|
||||||
|
palignr m4, m1, m2, 15
|
||||||
|
LOWPASS 0, 1, 4, 5, m6
|
||||||
|
pslldq xm4, xm3, 1
|
||||||
|
palignr m2, m3, 1
|
||||||
|
vinserti128 m4, [lq+15], 1
|
||||||
|
LOWPASS 2, 3, 4, 5, m6
|
||||||
|
lea r4, [strideq*3]
|
||||||
|
vperm2i128 m1, m2, m0, 0x21
|
||||||
|
mov r2d, 8
|
||||||
|
.loop:
|
||||||
|
shufpd m3, m1, m0, 0x05
|
||||||
|
mova [dstq+r3*0], m0
|
||||||
|
shufpd m4, m2, m1, 0x05
|
||||||
|
mova [dstq+r3*4], m3
|
||||||
|
palignr m0, m1, 15
|
||||||
|
mova [dstq+r3*8], m1
|
||||||
|
palignr m1, m2, 15
|
||||||
|
mova [dstq+r4*8], m4
|
||||||
|
add dstq, strideq
|
||||||
|
pslldq m2, 1
|
||||||
|
dec r2d
|
||||||
|
jg .loop
|
||||||
|
RET
|
||||||
|
|
||||||
|
cglobal vp9_ipred_hd_32x32, 4, 6, 7, dst, stride, l, a
|
||||||
|
movu m1, [aq-1]
|
||||||
|
mova m0, [lq]
|
||||||
|
vpbroadcastd m6, [pb_1]
|
||||||
|
vperm2i128 m4, m0, m1, 0x21
|
||||||
|
palignr m3, m4, m0, 1
|
||||||
|
palignr m4, m0, 2
|
||||||
|
LOWPASS 4, 3, 0, 2, m6
|
||||||
|
pavgb m3, m0
|
||||||
|
movu xm0, [aq+15]
|
||||||
|
punpcklbw m2, m3, m4
|
||||||
|
punpckhbw m3, m4
|
||||||
|
palignr m4, m0, m1, 2
|
||||||
|
palignr m0, m1, 1
|
||||||
|
LOWPASS 4, 0, 1, 5, m6
|
||||||
|
lea r2, [strideq*8]
|
||||||
|
vinserti128 m0, m2, xm3, 1
|
||||||
|
lea r3, [dstq+r2*1]
|
||||||
|
vpblendd m1, m2, m3, 0x0f
|
||||||
|
lea r4, [dstq+r2*2]
|
||||||
|
vperm2i128 m2, m3, 0x31
|
||||||
|
lea r5, [r3 +r2*2]
|
||||||
|
vperm2i128 m3, m4, 0x21
|
||||||
|
.loop:
|
||||||
|
sub r2, strideq
|
||||||
|
mova [r5 +r2], m0
|
||||||
|
palignr m0, m1, m0, 2
|
||||||
|
mova [r4 +r2], m1
|
||||||
|
palignr m1, m2, m1, 2
|
||||||
|
mova [r3 +r2], m2
|
||||||
|
palignr m2, m3, m2, 2
|
||||||
|
mova [dstq+r2], m3
|
||||||
|
palignr m3, m4, m3, 2
|
||||||
|
psrldq m4, 2
|
||||||
|
jg .loop
|
||||||
|
RET
|
||||||
|
|
||||||
|
cglobal vp9_ipred_hu_32x32, 3, 5, 6, dst, stride, l, a
|
||||||
|
mova m0, [lq]
|
||||||
|
vpbroadcastb xm3, [lq+31]
|
||||||
|
vpbroadcastd m1, [pb_1]
|
||||||
|
vbroadcasti128 m4, [pb_2toE_3xF]
|
||||||
|
vperm2i128 m3, m0, 0x03
|
||||||
|
palignr m5, m3, m0, 2
|
||||||
|
palignr m3, m0, 1
|
||||||
|
LOWPASS 5, 3, 0, 2, m1
|
||||||
|
vpbroadcastd m1, [pb_15]
|
||||||
|
pavgb m3, m0
|
||||||
|
punpcklbw m2, m3, m5
|
||||||
|
punpckhbw m3, m5
|
||||||
|
vinserti128 m0, m2, xm3, 1
|
||||||
|
pshufb m5, m1
|
||||||
|
vperm2i128 m1, m2, m3, 0x12
|
||||||
|
lea r3, [strideq*2]
|
||||||
|
vperm2i128 m2, m3, 0x31
|
||||||
|
lea r4, [strideq*3]
|
||||||
|
vperm2i128 m3, m5, 0x31
|
||||||
|
mov r2d, 8
|
||||||
|
.loop:
|
||||||
|
mova [dstq+r3*0], m0
|
||||||
|
palignr m0, m1, m0, 2
|
||||||
|
mova [dstq+r3*4], m1
|
||||||
|
palignr m1, m2, m1, 2
|
||||||
|
mova [dstq+r3*8], m2
|
||||||
|
palignr m2, m3, m2, 2
|
||||||
|
mova [dstq+r4*8], m3
|
||||||
|
pshufb m3, m4
|
||||||
|
add dstq, strideq
|
||||||
|
dec r2d
|
||||||
|
jg .loop
|
||||||
|
RET
|
||||||
|
|
||||||
|
cglobal vp9_ipred_vl_32x32, 2, 5, 6, dst, stride, l, a
|
||||||
|
movifnidn aq, amp
|
||||||
|
vpbroadcastb m4, [aq+31]
|
||||||
|
vinserti128 m0, m4, [aq+16], 0
|
||||||
|
mova m1, [aq+ 0]
|
||||||
|
vpbroadcastd m5, [pb_1]
|
||||||
|
palignr m2, m0, m1, 2
|
||||||
|
palignr m0, m1, 1
|
||||||
|
LOWPASS 2, 0, 1, 3, m5
|
||||||
|
pavgb m0, m1
|
||||||
|
lea r3, [strideq*2]
|
||||||
|
vperm2i128 m1, m0, m4, 0x31
|
||||||
|
lea r4, [strideq+r3*8]
|
||||||
|
vperm2i128 m3, m2, m4, 0x31
|
||||||
|
mov r2d, 8
|
||||||
|
.loop:
|
||||||
|
shufpd m4, m0, m1, 0x05
|
||||||
|
mova [dstq+strideq*0], m0
|
||||||
|
shufpd m5, m2, m3, 0x05
|
||||||
|
mova [dstq+strideq*1], m2
|
||||||
|
palignr m0, m1, m0, 1
|
||||||
|
mova [dstq+r3*8 ], m4
|
||||||
|
psrldq m1, 1
|
||||||
|
mova [dstq+r4 ], m5
|
||||||
|
palignr m2, m3, m2, 1
|
||||||
|
add dstq, r3
|
||||||
|
psrldq m3, 1
|
||||||
|
dec r2d
|
||||||
|
jg .loop
|
||||||
|
RET
|
||||||
|
|
||||||
|
cglobal vp9_ipred_vr_32x32, 4, 5, 7, dst, stride, l, a
|
||||||
|
mova m4, [lq+ 0]
|
||||||
|
movu m0, [aq- 1]
|
||||||
|
vpbroadcastd m6, [pb_1]
|
||||||
|
vperm2i128 m2, m4, m0, 0x21
|
||||||
|
pslldq xm5, xm4, 1
|
||||||
|
palignr m3, m2, m4, 1
|
||||||
|
vinserti128 m5, [lq+15], 1
|
||||||
|
LOWPASS 3, 4, 5, 1, m6
|
||||||
|
mova m1, [aq+ 0]
|
||||||
|
vbroadcasti128 m4, [pb_02468ACE_13579BDF]
|
||||||
|
palignr m2, m0, m2, 15
|
||||||
|
LOWPASS 2, 0, 1, 5, m6
|
||||||
|
pshufb m3, m4
|
||||||
|
lea r3, [strideq*2]
|
||||||
|
vpermq m3, m3, q2031
|
||||||
|
pavgb m0, m1
|
||||||
|
vinserti128 m1, m3, xm0, 1
|
||||||
|
lea r4, [strideq+r3*8]
|
||||||
|
vperm2i128 m3, m2, 0x21
|
||||||
|
mov r2d, 8
|
||||||
|
.loop:
|
||||||
|
shufpd m4, m1, m0, 0x05
|
||||||
|
mova [dstq+strideq*0], m0
|
||||||
|
shufpd m5, m3, m2, 0x05
|
||||||
|
mova [dstq+strideq*1], m2
|
||||||
|
palignr m0, m1, 15
|
||||||
|
mova [dstq+r3*8 ], m4
|
||||||
|
pslldq m1, 1
|
||||||
|
mova [dstq+r4 ], m5
|
||||||
|
palignr m2, m3, 15
|
||||||
|
add dstq, r3
|
||||||
|
pslldq m3, 1
|
||||||
|
dec r2d
|
||||||
|
jg .loop
|
||||||
|
RET
|
||||||
|
%endif
|
||||||
|
|
||||||
; FIXME 127, 128, 129 ?
|
; FIXME 127, 128, 129 ?
|
||||||
|
|||||||
Reference in New Issue
Block a user