avcodec/mips: Improve hevc uni horiz mc msa functions

Update macros to remove adds.

Signed-off-by: Kaustubh Raste <kaustubh.raste@imgtec.com>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
Kaustubh Raste 2017-10-11 14:20:28 +05:30 committed by Michael Niedermayer
parent e63758468c
commit 6ca821a3e7
1 changed files with 324 additions and 290 deletions

View File

@ -22,6 +22,85 @@
#include "libavcodec/mips/hevcdsp_mips.h"
#include "libavcodec/mips/hevc_macros_msa.h"
static const uint8_t ff_hevc_mask_arr[16 * 3] __attribute__((aligned(0x40))) = {
/* 8 width cases */
0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8,
/* 4 width cases */
0, 1, 1, 2, 2, 3, 3, 4, 16, 17, 17, 18, 18, 19, 19, 20,
/* 4 width cases */
8, 9, 9, 10, 10, 11, 11, 12, 24, 25, 25, 26, 26, 27, 27, 28
};
#define HORIZ_8TAP_4WID_4VECS_FILT(src0, src1, src2, src3, \
mask0, mask1, mask2, mask3, \
filt0, filt1, filt2, filt3, \
out0, out1) \
{ \
v16i8 vec0_m, vec1_m, vec2_m, vec3_m, vec4_m, vec5_m, vec6_m, vec7_m; \
\
VSHF_B2_SB(src0, src1, src2, src3, mask0, mask0, vec0_m, vec1_m); \
DOTP_SB2_SH(vec0_m, vec1_m, filt0, filt0, out0, out1); \
VSHF_B2_SB(src0, src1, src2, src3, mask1, mask1, vec2_m, vec3_m); \
DPADD_SB2_SH(vec2_m, vec3_m, filt1, filt1, out0, out1); \
VSHF_B2_SB(src0, src1, src2, src3, mask2, mask2, vec4_m, vec5_m); \
DPADD_SB2_SH(vec4_m, vec5_m, filt2, filt2, out0, out1); \
VSHF_B2_SB(src0, src1, src2, src3, mask3, mask3, vec6_m, vec7_m); \
DPADD_SB2_SH(vec6_m, vec7_m, filt3, filt3, out0, out1); \
}
#define HORIZ_8TAP_8WID_4VECS_FILT(src0, src1, src2, src3, \
mask0, mask1, mask2, mask3, \
filt0, filt1, filt2, filt3, \
out0, out1, out2, out3) \
{ \
v16i8 vec0_m, vec1_m, vec2_m, vec3_m, vec4_m, vec5_m, vec6_m, vec7_m; \
\
VSHF_B2_SB(src0, src0, src1, src1, mask0, mask0, vec0_m, vec1_m); \
VSHF_B2_SB(src2, src2, src3, src3, mask0, mask0, vec2_m, vec3_m); \
DOTP_SB4_SH(vec0_m, vec1_m, vec2_m, vec3_m, filt0, filt0, filt0, filt0, \
out0, out1, out2, out3); \
VSHF_B2_SB(src0, src0, src1, src1, mask2, mask2, vec0_m, vec1_m); \
VSHF_B2_SB(src2, src2, src3, src3, mask2, mask2, vec2_m, vec3_m); \
DPADD_SB4_SH(vec0_m, vec1_m, vec2_m, vec3_m, filt2, filt2, filt2, filt2, \
out0, out1, out2, out3); \
VSHF_B2_SB(src0, src0, src1, src1, mask1, mask1, vec4_m, vec5_m); \
VSHF_B2_SB(src2, src2, src3, src3, mask1, mask1, vec6_m, vec7_m); \
DPADD_SB4_SH(vec4_m, vec5_m, vec6_m, vec7_m, filt1, filt1, filt1, filt1, \
out0, out1, out2, out3); \
VSHF_B2_SB(src0, src0, src1, src1, mask3, mask3, vec4_m, vec5_m); \
VSHF_B2_SB(src2, src2, src3, src3, mask3, mask3, vec6_m, vec7_m); \
DPADD_SB4_SH(vec4_m, vec5_m, vec6_m, vec7_m, filt3, filt3, filt3, filt3, \
out0, out1, out2, out3); \
}
#define HORIZ_4TAP_4WID_4VECS_FILT(src0, src1, src2, src3, \
mask0, mask1, filt0, filt1, \
out0, out1) \
{ \
v16i8 vec0_m, vec1_m, vec2_m, vec3_m; \
\
VSHF_B2_SB(src0, src1, src2, src3, mask0, mask0, vec0_m, vec1_m); \
DOTP_SB2_SH(vec0_m, vec1_m, filt0, filt0, out0, out1); \
VSHF_B2_SB(src0, src1, src2, src3, mask1, mask1, vec2_m, vec3_m); \
DPADD_SB2_SH(vec2_m, vec3_m, filt1, filt1, out0, out1); \
}
#define HORIZ_4TAP_8WID_4VECS_FILT(src0, src1, src2, src3, \
mask0, mask1, filt0, filt1, \
out0, out1, out2, out3) \
{ \
v16i8 vec0_m, vec1_m, vec2_m, vec3_m; \
\
VSHF_B2_SB(src0, src0, src1, src1, mask0, mask0, vec0_m, vec1_m); \
VSHF_B2_SB(src2, src2, src3, src3, mask0, mask0, vec2_m, vec3_m); \
DOTP_SB4_SH(vec0_m, vec1_m, vec2_m, vec3_m, filt0, filt0, filt0, filt0, \
out0, out1, out2, out3); \
VSHF_B2_SB(src0, src0, src1, src1, mask1, mask1, vec0_m, vec1_m); \
VSHF_B2_SB(src2, src2, src3, src3, mask1, mask1, vec2_m, vec3_m); \
DPADD_SB4_SH(vec0_m, vec1_m, vec2_m, vec3_m, filt1, filt1, filt1, filt1, \
out0, out1, out2, out3); \
}
static void copy_width8_msa(uint8_t *src, int32_t src_stride,
uint8_t *dst, int32_t dst_stride,
int32_t height)
@ -227,53 +306,6 @@ static const uint8_t mc_filt_mask_arr[16 * 3] = {
tmp0; \
} )
#define HORIZ_8TAP_4WID_4VECS_FILT(src0, src1, src2, src3, \
mask0, mask1, mask2, mask3, \
filt0, filt1, filt2, filt3, \
out0, out1) \
{ \
v16i8 vec0_m, vec1_m, vec2_m, vec3_m, vec4_m, vec5_m, vec6_m, vec7_m; \
v8i16 res0_m, res1_m, res2_m, res3_m; \
\
VSHF_B2_SB(src0, src1, src2, src3, mask0, mask0, vec0_m, vec1_m); \
DOTP_SB2_SH(vec0_m, vec1_m, filt0, filt0, res0_m, res1_m); \
VSHF_B2_SB(src0, src1, src2, src3, mask1, mask1, vec2_m, vec3_m); \
DPADD_SB2_SH(vec2_m, vec3_m, filt1, filt1, res0_m, res1_m); \
VSHF_B2_SB(src0, src1, src2, src3, mask2, mask2, vec4_m, vec5_m); \
DOTP_SB2_SH(vec4_m, vec5_m, filt2, filt2, res2_m, res3_m); \
VSHF_B2_SB(src0, src1, src2, src3, mask3, mask3, vec6_m, vec7_m); \
DPADD_SB2_SH(vec6_m, vec7_m, filt3, filt3, res2_m, res3_m); \
ADDS_SH2_SH(res0_m, res2_m, res1_m, res3_m, out0, out1); \
}
#define HORIZ_8TAP_8WID_4VECS_FILT(src0, src1, src2, src3, \
mask0, mask1, mask2, mask3, \
filt0, filt1, filt2, filt3, \
out0, out1, out2, out3) \
{ \
v16i8 vec0_m, vec1_m, vec2_m, vec3_m, vec4_m, vec5_m, vec6_m, vec7_m; \
v8i16 res0_m, res1_m, res2_m, res3_m, res4_m, res5_m, res6_m, res7_m; \
\
VSHF_B2_SB(src0, src0, src1, src1, mask0, mask0, vec0_m, vec1_m); \
VSHF_B2_SB(src2, src2, src3, src3, mask0, mask0, vec2_m, vec3_m); \
DOTP_SB4_SH(vec0_m, vec1_m, vec2_m, vec3_m, filt0, filt0, filt0, filt0, \
res0_m, res1_m, res2_m, res3_m); \
VSHF_B2_SB(src0, src0, src1, src1, mask2, mask2, vec0_m, vec1_m); \
VSHF_B2_SB(src2, src2, src3, src3, mask2, mask2, vec2_m, vec3_m); \
DOTP_SB4_SH(vec0_m, vec1_m, vec2_m, vec3_m, filt2, filt2, filt2, filt2, \
res4_m, res5_m, res6_m, res7_m); \
VSHF_B2_SB(src0, src0, src1, src1, mask1, mask1, vec4_m, vec5_m); \
VSHF_B2_SB(src2, src2, src3, src3, mask1, mask1, vec6_m, vec7_m); \
DPADD_SB4_SH(vec4_m, vec5_m, vec6_m, vec7_m, filt1, filt1, filt1, filt1, \
res0_m, res1_m, res2_m, res3_m); \
VSHF_B2_SB(src0, src0, src1, src1, mask3, mask3, vec4_m, vec5_m); \
VSHF_B2_SB(src2, src2, src3, src3, mask3, mask3, vec6_m, vec7_m); \
DPADD_SB4_SH(vec4_m, vec5_m, vec6_m, vec7_m, filt3, filt3, filt3, filt3, \
res4_m, res5_m, res6_m, res7_m); \
ADDS_SH4_SH(res0_m, res4_m, res1_m, res5_m, res2_m, res6_m, res3_m, \
res7_m, out0, out1, out2, out3); \
}
#define FILT_4TAP_DPADD_S_H(vec0, vec1, filt0, filt1) \
( { \
v8i16 tmp0; \
@ -284,34 +316,6 @@ static const uint8_t mc_filt_mask_arr[16 * 3] = {
tmp0; \
} )
#define HORIZ_4TAP_4WID_4VECS_FILT(src0, src1, src2, src3, \
mask0, mask1, filt0, filt1, \
out0, out1) \
{ \
v16i8 vec0_m, vec1_m, vec2_m, vec3_m; \
\
VSHF_B2_SB(src0, src1, src2, src3, mask0, mask0, vec0_m, vec1_m); \
DOTP_SB2_SH(vec0_m, vec1_m, filt0, filt0, out0, out1); \
VSHF_B2_SB(src0, src1, src2, src3, mask1, mask1, vec2_m, vec3_m); \
DPADD_SB2_SH(vec2_m, vec3_m, filt1, filt1, out0, out1); \
}
#define HORIZ_4TAP_8WID_4VECS_FILT(src0, src1, src2, src3, \
mask0, mask1, filt0, filt1, \
out0, out1, out2, out3) \
{ \
v16i8 vec0_m, vec1_m, vec2_m, vec3_m; \
\
VSHF_B2_SB(src0, src0, src1, src1, mask0, mask0, vec0_m, vec1_m); \
VSHF_B2_SB(src2, src2, src3, src3, mask0, mask0, vec2_m, vec3_m); \
DOTP_SB4_SH(vec0_m, vec1_m, vec2_m, vec3_m, filt0, filt0, filt0, filt0, \
out0, out1, out2, out3); \
VSHF_B2_SB(src0, src0, src1, src1, mask1, mask1, vec0_m, vec1_m); \
VSHF_B2_SB(src2, src2, src3, src3, mask1, mask1, vec2_m, vec3_m); \
DPADD_SB4_SH(vec0_m, vec1_m, vec2_m, vec3_m, filt1, filt1, filt1, filt1, \
out0, out1, out2, out3); \
}
static void common_hz_8t_4x4_msa(uint8_t *src, int32_t src_stride,
uint8_t *dst, int32_t dst_stride,
const int8_t *filter)
@ -320,7 +324,7 @@ static void common_hz_8t_4x4_msa(uint8_t *src, int32_t src_stride,
v16i8 src0, src1, src2, src3, filt0, filt1, filt2, filt3;
v8i16 filt, out0, out1;
mask0 = LD_UB(&mc_filt_mask_arr[16]);
mask0 = LD_UB(&ff_hevc_mask_arr[16]);
src -= 3;
/* rearranging filter */
@ -350,7 +354,7 @@ static void common_hz_8t_4x8_msa(uint8_t *src, int32_t src_stride,
v16u8 mask0, mask1, mask2, mask3, out;
v8i16 filt, out0, out1, out2, out3;
mask0 = LD_UB(&mc_filt_mask_arr[16]);
mask0 = LD_UB(&ff_hevc_mask_arr[16]);
src -= 3;
/* rearranging filter */
@ -387,7 +391,7 @@ static void common_hz_8t_4x16_msa(uint8_t *src, int32_t src_stride,
v16i8 src0, src1, src2, src3, filt0, filt1, filt2, filt3;
v8i16 filt, out0, out1, out2, out3;
mask0 = LD_UB(&mc_filt_mask_arr[16]);
mask0 = LD_UB(&ff_hevc_mask_arr[16]);
src -= 3;
/* rearranging filter */
@ -450,47 +454,17 @@ static void common_hz_8t_4w_msa(uint8_t *src, int32_t src_stride,
}
}
static void common_hz_8t_8x4_msa(uint8_t *src, int32_t src_stride,
uint8_t *dst, int32_t dst_stride,
const int8_t *filter)
{
v16i8 src0, src1, src2, src3, filt0, filt1, filt2, filt3;
v16u8 mask0, mask1, mask2, mask3, tmp0, tmp1;
v8i16 filt, out0, out1, out2, out3;
mask0 = LD_UB(&mc_filt_mask_arr[0]);
src -= 3;
/* rearranging filter */
filt = LD_SH(filter);
SPLATI_H4_SB(filt, 0, 1, 2, 3, filt0, filt1, filt2, filt3);
mask1 = mask0 + 2;
mask2 = mask0 + 4;
mask3 = mask0 + 6;
LD_SB4(src, src_stride, src0, src1, src2, src3);
XORI_B4_128_SB(src0, src1, src2, src3);
HORIZ_8TAP_8WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
mask3, filt0, filt1, filt2, filt3, out0, out1,
out2, out3);
SRARI_H4_SH(out0, out1, out2, out3, 6);
SAT_SH4_SH(out0, out1, out2, out3, 7);
tmp0 = PCKEV_XORI128_UB(out0, out1);
tmp1 = PCKEV_XORI128_UB(out2, out3);
ST8x4_UB(tmp0, tmp1, dst, dst_stride);
}
static void common_hz_8t_8x8mult_msa(uint8_t *src, int32_t src_stride,
uint8_t *dst, int32_t dst_stride,
const int8_t *filter, int32_t height)
static void common_hz_8t_8w_msa(uint8_t *src, int32_t src_stride,
uint8_t *dst, int32_t dst_stride,
const int8_t *filter, int32_t height)
{
uint32_t loop_cnt;
v16i8 src0, src1, src2, src3, filt0, filt1, filt2, filt3;
v16u8 mask0, mask1, mask2, mask3, tmp0, tmp1;
v16i8 vec0_m, vec1_m, vec2_m, vec3_m, vec4_m, vec5_m, vec6_m, vec7_m;
v8i16 filt, out0, out1, out2, out3;
mask0 = LD_UB(&mc_filt_mask_arr[0]);
mask0 = LD_UB(&ff_hevc_mask_arr[0]);
src -= 3;
/* rearranging filter */
@ -505,9 +479,24 @@ static void common_hz_8t_8x8mult_msa(uint8_t *src, int32_t src_stride,
LD_SB4(src, src_stride, src0, src1, src2, src3);
XORI_B4_128_SB(src0, src1, src2, src3);
src += (4 * src_stride);
HORIZ_8TAP_8WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
mask3, filt0, filt1, filt2, filt3, out0,
out1, out2, out3);
VSHF_B2_SB(src0, src0, src1, src1, mask0, mask0, vec0_m, vec1_m);
VSHF_B2_SB(src2, src2, src3, src3, mask0, mask0, vec2_m, vec3_m);
DOTP_SB4_SH(vec0_m, vec1_m, vec2_m, vec3_m, filt0, filt0, filt0, filt0,
out0, out1, out2, out3);
VSHF_B2_SB(src0, src0, src1, src1, mask2, mask2, vec0_m, vec1_m);
VSHF_B2_SB(src2, src2, src3, src3, mask2, mask2, vec2_m, vec3_m);
DPADD_SB4_SH(vec0_m, vec1_m, vec2_m, vec3_m, filt2, filt2, filt2, filt2,
out0, out1, out2, out3);
VSHF_B2_SB(src0, src0, src1, src1, mask1, mask1, vec4_m, vec5_m);
VSHF_B2_SB(src2, src2, src3, src3, mask1, mask1, vec6_m, vec7_m);
DPADD_SB4_SH(vec4_m, vec5_m, vec6_m, vec7_m, filt1, filt1, filt1, filt1,
out0, out1, out2, out3);
VSHF_B2_SB(src0, src0, src1, src1, mask3, mask3, vec4_m, vec5_m);
VSHF_B2_SB(src2, src2, src3, src3, mask3, mask3, vec6_m, vec7_m);
DPADD_SB4_SH(vec4_m, vec5_m, vec6_m, vec7_m, filt3, filt3, filt3, filt3,
out0, out1, out2, out3);
SRARI_H4_SH(out0, out1, out2, out3, 6);
SAT_SH4_SH(out0, out1, out2, out3, 7);
tmp0 = PCKEV_XORI128_UB(out0, out1);
@ -517,36 +506,22 @@ static void common_hz_8t_8x8mult_msa(uint8_t *src, int32_t src_stride,
}
}
static void common_hz_8t_8w_msa(uint8_t *src, int32_t src_stride,
uint8_t *dst, int32_t dst_stride,
const int8_t *filter, int32_t height)
{
if (4 == height) {
common_hz_8t_8x4_msa(src, src_stride, dst, dst_stride, filter);
} else {
common_hz_8t_8x8mult_msa(src, src_stride, dst, dst_stride, filter,
height);
}
}
static void common_hz_8t_12w_msa(uint8_t *src, int32_t src_stride,
uint8_t *dst, int32_t dst_stride,
const int8_t *filter, int32_t height)
{
uint8_t *src1_ptr, *dst1;
uint32_t loop_cnt;
v16i8 src0, src1, src2, src3, filt0, filt1, filt2, filt3;
v8i16 filt, out0, out1, out2, out3;
v16u8 mask0, mask1, mask2, mask3, mask4, mask5, mask6, mask00, tmp0, tmp1;
v16u8 mask0, mask1, mask2, mask3, mask4, mask5, mask6, mask00;
v16u8 tmp0, tmp1, tmp2;
v16i8 src0, src1, src2, src3, src4, src5, src6, src7;
v16i8 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7;
v16i8 filt0, filt1, filt2, filt3;
v8i16 filt, out0, out1, out2, out3, out4, out5;
mask00 = LD_UB(&mc_filt_mask_arr[0]);
mask0 = LD_UB(&mc_filt_mask_arr[16]);
mask00 = LD_UB(&ff_hevc_mask_arr[0]);
mask0 = LD_UB(&ff_hevc_mask_arr[16]);
src1_ptr = src - 3;
dst1 = dst;
dst = dst1 + 8;
src = src1_ptr + 8;
src = src - 3;
/* rearranging filter */
filt = LD_SH(filter);
@ -559,32 +534,53 @@ static void common_hz_8t_12w_msa(uint8_t *src, int32_t src_stride,
mask5 = mask0 + 4;
mask6 = mask0 + 6;
for (loop_cnt = (height >> 2); loop_cnt--;) {
for (loop_cnt = 4; loop_cnt--;) {
/* 8 width */
LD_SB4(src1_ptr, src_stride, src0, src1, src2, src3);
LD_SB4(src, src_stride, src0, src1, src2, src3);
/* 4 width */
LD_SB4(src + 8, src_stride, src4, src5, src6, src7);
XORI_B4_128_SB(src0, src1, src2, src3);
src1_ptr += (4 * src_stride);
HORIZ_8TAP_8WID_4VECS_FILT(src0, src1, src2, src3, mask00, mask1, mask2,
mask3, filt0, filt1, filt2, filt3, out0,
out1, out2, out3);
SRARI_H4_SH(out0, out1, out2, out3, 6);
SAT_SH4_SH(out0, out1, out2, out3, 7);
tmp0 = PCKEV_XORI128_UB(out0, out1);
tmp1 = PCKEV_XORI128_UB(out2, out3);
ST8x4_UB(tmp0, tmp1, dst1, dst_stride);
dst1 += (4 * dst_stride);
XORI_B4_128_SB(src4, src5, src6, src7);
src += (4 * src_stride);
VSHF_B2_SB(src0, src0, src1, src1, mask00, mask00, vec0, vec1);
VSHF_B2_SB(src2, src2, src3, src3, mask00, mask00, vec2, vec3);
DOTP_SB4_SH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0, out0,
out1, out2, out3);
VSHF_B2_SB(src0, src0, src1, src1, mask2, mask2, vec0, vec1);
VSHF_B2_SB(src2, src2, src3, src3, mask2, mask2, vec2, vec3);
DPADD_SB4_SH(vec0, vec1, vec2, vec3, filt2, filt2, filt2, filt2, out0,
out1, out2, out3);
VSHF_B2_SB(src0, src0, src1, src1, mask1, mask1, vec4, vec5);
VSHF_B2_SB(src2, src2, src3, src3, mask1, mask1, vec6, vec7);
DPADD_SB4_SH(vec4, vec5, vec6, vec7, filt1, filt1, filt1, filt1, out0,
out1, out2, out3);
VSHF_B2_SB(src0, src0, src1, src1, mask3, mask3, vec4, vec5);
VSHF_B2_SB(src2, src2, src3, src3, mask3, mask3, vec6, vec7);
DPADD_SB4_SH(vec4, vec5, vec6, vec7, filt3, filt3, filt3, filt3, out0,
out1, out2, out3);
/* 4 width */
LD_SB4(src, src_stride, src0, src1, src2, src3);
XORI_B4_128_SB(src0, src1, src2, src3);
src += (4 * src_stride);
HORIZ_8TAP_4WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask4, mask5,
mask6, filt0, filt1, filt2, filt3, out0,
out1);
SRARI_H2_SH(out0, out1, 6);
SAT_SH2_SH(out0, out1, 7);
VSHF_B2_SB(src4, src5, src6, src7, mask0, mask0, vec0, vec1);
DOTP_SB2_SH(vec0, vec1, filt0, filt0, out4, out5);
VSHF_B2_SB(src4, src5, src6, src7, mask4, mask4, vec2, vec3);
DPADD_SB2_SH(vec2, vec3, filt1, filt1, out4, out5);
VSHF_B2_SB(src4, src5, src6, src7, mask5, mask5, vec4, vec5);
DPADD_SB2_SH(vec4, vec5, filt2, filt2, out4, out5);
VSHF_B2_SB(src4, src5, src6, src7, mask6, mask6, vec6, vec7);
DPADD_SB2_SH(vec6, vec7, filt3, filt3, out4, out5);
SRARI_H4_SH(out0, out1, out2, out3, 6);
SRARI_H2_SH(out4, out5, 6);
SAT_SH4_SH(out0, out1, out2, out3, 7);
SAT_SH2_SH(out4, out5, 7);
tmp0 = PCKEV_XORI128_UB(out0, out1);
ST4x4_UB(tmp0, tmp0, 0, 1, 2, 3, dst, dst_stride);
tmp1 = PCKEV_XORI128_UB(out2, out3);
tmp2 = PCKEV_XORI128_UB(out4, out5);
ST8x4_UB(tmp0, tmp1, dst, dst_stride);
ST4x4_UB(tmp2, tmp2, 0, 1, 2, 3, dst + 8, dst_stride);
dst += (4 * dst_stride);
}
}
@ -594,11 +590,12 @@ static void common_hz_8t_16w_msa(uint8_t *src, int32_t src_stride,
const int8_t *filter, int32_t height)
{
uint32_t loop_cnt;
v16i8 src0, src1, src2, src3, filt0, filt1, filt2, filt3;
v16u8 mask0, mask1, mask2, mask3, out;
v16i8 src0, src1, src2, src3, src4, src5, src6, src7;
v16i8 filt0, filt1, filt2, filt3;
v8i16 filt, out0, out1, out2, out3;
mask0 = LD_UB(&mc_filt_mask_arr[0]);
mask0 = LD_UB(&ff_hevc_mask_arr[0]);
src -= 3;
/* rearranging filter */
@ -609,11 +606,17 @@ static void common_hz_8t_16w_msa(uint8_t *src, int32_t src_stride,
mask2 = mask0 + 4;
mask3 = mask0 + 6;
for (loop_cnt = (height >> 1); loop_cnt--;) {
for (loop_cnt = (height >> 2); loop_cnt--;) {
LD_SB2(src, src_stride, src0, src2);
LD_SB2(src + 8, src_stride, src1, src3);
XORI_B4_128_SB(src0, src1, src2, src3);
src += (2 * src_stride);
LD_SB2(src, src_stride, src4, src6);
LD_SB2(src + 8, src_stride, src5, src7);
src += (2 * src_stride);
XORI_B4_128_SB(src0, src1, src2, src3);
XORI_B4_128_SB(src4, src5, src6, src7);
HORIZ_8TAP_8WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
mask3, filt0, filt1, filt2, filt3, out0,
out1, out2, out3);
@ -625,6 +628,18 @@ static void common_hz_8t_16w_msa(uint8_t *src, int32_t src_stride,
out = PCKEV_XORI128_UB(out2, out3);
ST_UB(out, dst);
dst += dst_stride;
HORIZ_8TAP_8WID_4VECS_FILT(src4, src5, src6, src7, mask0, mask1, mask2,
mask3, filt0, filt1, filt2, filt3, out0,
out1, out2, out3);
SRARI_H4_SH(out0, out1, out2, out3, 6);
SAT_SH4_SH(out0, out1, out2, out3, 7);
out = PCKEV_XORI128_UB(out0, out1);
ST_UB(out, dst);
dst += dst_stride;
out = PCKEV_XORI128_UB(out2, out3);
ST_UB(out, dst);
dst += dst_stride;
}
}
@ -637,10 +652,9 @@ static void common_hz_8t_24w_msa(uint8_t *src, int32_t src_stride,
v16u8 mask0, mask1, mask2, mask3, mask4, mask5, mask6, mask7, out;
v16i8 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7, vec8, vec9, vec10;
v16i8 vec11;
v8i16 out0, out1, out2, out3, out4, out5, out6, out7, out8, out9, out10;
v8i16 out11, filt;
v8i16 out0, out1, out2, out3, out8, out9, filt;
mask0 = LD_UB(&mc_filt_mask_arr[0]);
mask0 = LD_UB(&ff_hevc_mask_arr[0]);
src -= 3;
/* rearranging filter */
@ -655,7 +669,7 @@ static void common_hz_8t_24w_msa(uint8_t *src, int32_t src_stride,
mask6 = mask0 + 12;
mask7 = mask0 + 14;
for (loop_cnt = (height >> 1); loop_cnt--;) {
for (loop_cnt = 16; loop_cnt--;) {
LD_SB2(src, src_stride, src0, src2);
LD_SB2(src + 16, src_stride, src1, src3);
XORI_B4_128_SB(src0, src1, src2, src3);
@ -669,9 +683,9 @@ static void common_hz_8t_24w_msa(uint8_t *src, int32_t src_stride,
VSHF_B2_SB(src0, src0, src1, src1, mask2, mask2, vec0, vec8);
VSHF_B2_SB(src2, src2, src3, src3, mask2, mask2, vec2, vec9);
VSHF_B2_SB(src0, src1, src2, src3, mask6, mask6, vec1, vec3);
DOTP_SB4_SH(vec0, vec8, vec2, vec9, filt2, filt2, filt2, filt2, out4,
out10, out6, out11);
DOTP_SB2_SH(vec1, vec3, filt2, filt2, out5, out7);
DPADD_SB4_SH(vec0, vec8, vec2, vec9, filt2, filt2, filt2, filt2,
out0, out8, out2, out9);
DPADD_SB2_SH(vec1, vec3, filt2, filt2, out1, out3);
VSHF_B2_SB(src0, src0, src1, src1, mask1, mask1, vec4, vec10);
VSHF_B2_SB(src2, src2, src3, src3, mask1, mask1, vec6, vec11);
VSHF_B2_SB(src0, src1, src2, src3, mask5, mask5, vec5, vec7);
@ -682,11 +696,8 @@ static void common_hz_8t_24w_msa(uint8_t *src, int32_t src_stride,
VSHF_B2_SB(src2, src2, src3, src3, mask3, mask3, vec6, vec11);
VSHF_B2_SB(src0, src1, src2, src3, mask7, mask7, vec5, vec7);
DPADD_SB4_SH(vec4, vec10, vec6, vec11, filt3, filt3, filt3, filt3,
out4, out10, out6, out11);
DPADD_SB2_SH(vec5, vec7, filt3, filt3, out5, out7);
ADDS_SH4_SH(out0, out4, out8, out10, out2, out6, out9, out11, out0,
out8, out2, out9);
ADDS_SH2_SH(out1, out5, out3, out7, out1, out3);
out0, out8, out2, out9);
DPADD_SB2_SH(vec5, vec7, filt3, filt3, out1, out3);
SRARI_H4_SH(out0, out8, out2, out9, 6);
SRARI_H2_SH(out1, out3, 6);
SAT_SH4_SH(out0, out8, out2, out9, 7);
@ -707,11 +718,12 @@ static void common_hz_8t_32w_msa(uint8_t *src, int32_t src_stride,
const int8_t *filter, int32_t height)
{
uint32_t loop_cnt;
v16i8 src0, src1, src2, src3, filt0, filt1, filt2, filt3;
v16u8 mask0, mask1, mask2, mask3, out;
v16i8 src0, src1, src2, src3, src4, src5, src6, src7;
v16i8 filt0, filt1, filt2, filt3;
v8i16 filt, out0, out1, out2, out3;
mask0 = LD_UB(&mc_filt_mask_arr[0]);
mask0 = LD_UB(&ff_hevc_mask_arr[0]);
src -= 3;
/* rearranging filter */
@ -724,31 +736,32 @@ static void common_hz_8t_32w_msa(uint8_t *src, int32_t src_stride,
for (loop_cnt = (height >> 1); loop_cnt--;) {
src0 = LD_SB(src);
src1 = LD_SB(src + 8);
src2 = LD_SB(src + 16);
src3 = LD_SB(src + 24);
src1 = __msa_sldi_b(src2, src0, 8);
src += src_stride;
XORI_B4_128_SB(src0, src1, src2, src3);
src4 = LD_SB(src);
src5 = LD_SB(src + 8);
src6 = LD_SB(src + 16);
src7 = LD_SB(src + 24);
src += src_stride;
XORI_B4_128_SB(src4, src5, src6, src7);
HORIZ_8TAP_8WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
mask3, filt0, filt1, filt2, filt3, out0,
out1, out2, out3);
SRARI_H4_SH(out0, out1, out2, out3, 6);
SAT_SH4_SH(out0, out1, out2, out3, 7);
src0 = LD_SB(src);
src2 = LD_SB(src + 16);
src3 = LD_SB(src + 24);
src1 = __msa_sldi_b(src2, src0, 8);
src += src_stride;
out = PCKEV_XORI128_UB(out0, out1);
ST_UB(out, dst);
out = PCKEV_XORI128_UB(out2, out3);
ST_UB(out, dst + 16);
dst += dst_stride;
XORI_B4_128_SB(src0, src1, src2, src3);
HORIZ_8TAP_8WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
HORIZ_8TAP_8WID_4VECS_FILT(src4, src5, src6, src7, mask0, mask1, mask2,
mask3, filt0, filt1, filt2, filt3, out0,
out1, out2, out3);
SRARI_H4_SH(out0, out1, out2, out3, 6);
@ -767,10 +780,11 @@ static void common_hz_8t_48w_msa(uint8_t *src, int32_t src_stride,
{
uint32_t loop_cnt;
v16i8 src0, src1, src2, src3, filt0, filt1, filt2, filt3, vec0, vec1, vec2;
v16i8 src4;
v16u8 mask0, mask1, mask2, mask3, mask4, mask5, mask6, mask7, out;
v8i16 filt, out0, out1, out2, out3, out4, out5, out6;
v8i16 filt, out0, out1, out2, out3;
mask0 = LD_UB(&mc_filt_mask_arr[0]);
mask0 = LD_UB(&ff_hevc_mask_arr[0]);
src -= 3;
/* rearranging filter */
@ -785,11 +799,17 @@ static void common_hz_8t_48w_msa(uint8_t *src, int32_t src_stride,
mask6 = mask0 + 12;
mask7 = mask0 + 14;
for (loop_cnt = height; loop_cnt--;) {
LD_SB3(src, 16, src0, src2, src3);
src1 = __msa_sldi_b(src2, src0, 8);
for (loop_cnt = 64; loop_cnt--;) {
src0 = LD_SB(src);
src1 = LD_SB(src + 8);
src2 = LD_SB(src + 16);
src3 = LD_SB(src + 32);
src4 = LD_SB(src + 40);
src += src_stride;
XORI_B4_128_SB(src0, src1, src2, src3);
src4 = (v16i8) __msa_xori_b((v16u8) src4, 128);
VSHF_B3_SB(src0, src0, src1, src1, src2, src2, mask0, mask0, mask0,
vec0, vec1, vec2);
DOTP_SB3_SH(vec0, vec1, vec2, filt0, filt0, filt0, out0, out1, out2);
@ -799,45 +819,42 @@ static void common_hz_8t_48w_msa(uint8_t *src, int32_t src_stride,
out2 = __msa_dpadd_s_h(out2, vec2, filt1);
VSHF_B3_SB(src0, src0, src1, src1, src2, src2, mask2, mask2, mask2,
vec0, vec1, vec2);
DOTP_SB3_SH(vec0, vec1, vec2, filt2, filt2, filt2, out3, out4, out5);
DPADD_SB2_SH(vec0, vec1, filt2, filt2, out0, out1);
out2 = __msa_dpadd_s_h(out2, vec2, filt2);
VSHF_B3_SB(src0, src0, src1, src1, src2, src2, mask3, mask3, mask3,
vec0, vec1, vec2);
DPADD_SB2_SH(vec0, vec1, filt3, filt3, out3, out4);
out5 = __msa_dpadd_s_h(out5, vec2, filt3);
ADDS_SH2_SH(out0, out3, out1, out4, out0, out1);
out2 = __msa_adds_s_h(out2, out5);
DPADD_SB2_SH(vec0, vec1, filt3, filt3, out0, out1);
out2 = __msa_dpadd_s_h(out2, vec2, filt3);
SRARI_H2_SH(out0, out1, 6);
out6 = __msa_srari_h(out2, 6);
SAT_SH3_SH(out0, out1, out6, 7);
out3 = __msa_srari_h(out2, 6);
SAT_SH3_SH(out0, out1, out3, 7);
out = PCKEV_XORI128_UB(out0, out1);
ST_UB(out, dst);
src1 = LD_SB(src + 40);
src += src_stride;
src1 = (v16i8) __msa_xori_b((v16u8) src1, 128);
VSHF_B3_SB(src2, src3, src3, src3, src1, src1, mask4, mask0, mask0,
VSHF_B3_SB(src2, src3, src3, src3, src4, src4, mask4, mask0, mask0,
vec0, vec1, vec2);
DOTP_SB3_SH(vec0, vec1, vec2, filt0, filt0, filt0, out0, out1, out2);
VSHF_B3_SB(src2, src3, src3, src3, src1, src1, mask5, mask1, mask1,
VSHF_B3_SB(src2, src3, src3, src3, src4, src4, mask5, mask1, mask1,
vec0, vec1, vec2);
DPADD_SB2_SH(vec0, vec1, filt1, filt1, out0, out1);
out2 = __msa_dpadd_s_h(out2, vec2, filt1);
VSHF_B3_SB(src2, src3, src3, src3, src1, src1, mask6, mask2, mask2,
VSHF_B3_SB(src2, src3, src3, src3, src4, src4, mask6, mask2, mask2,
vec0, vec1, vec2);
DOTP_SB3_SH(vec0, vec1, vec2, filt2, filt2, filt2, out3, out4, out5);
VSHF_B3_SB(src2, src3, src3, src3, src1, src1, mask7, mask3, mask3,
DPADD_SB2_SH(vec0, vec1, filt2, filt2, out0, out1);
out2 = __msa_dpadd_s_h(out2, vec2, filt2);
VSHF_B3_SB(src2, src3, src3, src3, src4, src4, mask7, mask3, mask3,
vec0, vec1, vec2);
DPADD_SB2_SH(vec0, vec1, filt3, filt3, out3, out4);
out5 = __msa_dpadd_s_h(out5, vec2, filt3);
ADDS_SH2_SH(out0, out3, out1, out4, out3, out4);
out5 = __msa_adds_s_h(out2, out5);
SRARI_H2_SH(out3, out4, 6);
out5 = __msa_srari_h(out5, 6);
SAT_SH3_SH(out3, out4, out5, 7);
out = PCKEV_XORI128_UB(out6, out3);
DPADD_SB2_SH(vec0, vec1, filt3, filt3, out0, out1);
out2 = __msa_dpadd_s_h(out2, vec2, filt3);
SRARI_H2_SH(out0, out1, 6);
out2 = __msa_srari_h(out2, 6);
SAT_SH3_SH(out0, out1, out2, 7);
out = PCKEV_XORI128_UB(out3, out0);
ST_UB(out, dst + 16);
out = PCKEV_XORI128_UB(out4, out5);
out = PCKEV_XORI128_UB(out1, out2);
ST_UB(out, dst + 32);
dst += dst_stride;
}
@ -848,11 +865,13 @@ static void common_hz_8t_64w_msa(uint8_t *src, int32_t src_stride,
const int8_t *filter, int32_t height)
{
int32_t loop_cnt;
v16i8 src0, src1, src2, src3, filt0, filt1, filt2, filt3;
v16u8 mask0, mask1, mask2, mask3, out;
v8i16 filt, out0, out1, out2, out3;
v16i8 src0, src1, src2, src3, src4, src5, src6, src7;
v16i8 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7;
v16i8 filt0, filt1, filt2, filt3;
v8i16 res0, res1, res2, res3, filt;
mask0 = LD_UB(&mc_filt_mask_arr[0]);
mask0 = LD_UB(&ff_hevc_mask_arr[0]);
src -= 3;
/* rearranging filter */
@ -864,37 +883,57 @@ static void common_hz_8t_64w_msa(uint8_t *src, int32_t src_stride,
mask3 = mask0 + 6;
for (loop_cnt = height; loop_cnt--;) {
src0 = LD_SB(src);
src2 = LD_SB(src + 16);
src3 = LD_SB(src + 24);
src1 = __msa_sldi_b(src2, src0, 8);
XORI_B4_128_SB(src0, src1, src2, src3);
HORIZ_8TAP_8WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1,
mask2, mask3, filt0, filt1, filt2, filt3,
out0, out1, out2, out3);
SRARI_H4_SH(out0, out1, out2, out3, 6);
SAT_SH4_SH(out0, out1, out2, out3, 7);
out = PCKEV_XORI128_UB(out0, out1);
ST_UB(out, dst);
out = PCKEV_XORI128_UB(out2, out3);
ST_UB(out, dst + 16);
src0 = LD_SB(src + 32);
src2 = LD_SB(src + 48);
src3 = LD_SB(src + 56);
src1 = __msa_sldi_b(src2, src0, 8);
LD_SB8(src, 8, src0, src1, src2, src3, src4, src5, src6, src7);
src += src_stride;
XORI_B4_128_SB(src0, src1, src2, src3);
HORIZ_8TAP_8WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1,
mask2, mask3, filt0, filt1, filt2, filt3,
out0, out1, out2, out3);
SRARI_H4_SH(out0, out1, out2, out3, 6);
SAT_SH4_SH(out0, out1, out2, out3, 7);
out = PCKEV_XORI128_UB(out0, out1);
XORI_B8_128_SB(src0, src1, src2, src3, src4, src5, src6, src7);
VSHF_B2_SB(src0, src0, src1, src1, mask0, mask0, vec0, vec1);
VSHF_B2_SB(src2, src2, src3, src3, mask0, mask0, vec2, vec3);
DOTP_SB4_SH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0, res0,
res1, res2, res3);
VSHF_B2_SB(src0, src0, src1, src1, mask2, mask2, vec0, vec1);
VSHF_B2_SB(src2, src2, src3, src3, mask2, mask2, vec2, vec3);
DPADD_SB4_SH(vec0, vec1, vec2, vec3, filt2, filt2, filt2, filt2, res0,
res1, res2, res3);
VSHF_B2_SB(src0, src0, src1, src1, mask1, mask1, vec4, vec5);
VSHF_B2_SB(src2, src2, src3, src3, mask1, mask1, vec6, vec7);
DPADD_SB4_SH(vec4, vec5, vec6, vec7, filt1, filt1, filt1, filt1, res0,
res1, res2, res3);
VSHF_B2_SB(src0, src0, src1, src1, mask3, mask3, vec4, vec5);
VSHF_B2_SB(src2, src2, src3, src3, mask3, mask3, vec6, vec7);
DPADD_SB4_SH(vec4, vec5, vec6, vec7, filt3, filt3, filt3, filt3, res0,
res1, res2, res3);
SRARI_H4_SH(res0, res1, res2, res3, 6);
SAT_SH4_SH(res0, res1, res2, res3, 7);
out = PCKEV_XORI128_UB(res0, res1);
ST_UB(out, dst);
out = PCKEV_XORI128_UB(res2, res3);
ST_UB(out, dst + 16);
VSHF_B2_SB(src4, src4, src5, src5, mask0, mask0, vec0, vec1);
VSHF_B2_SB(src6, src6, src7, src7, mask0, mask0, vec2, vec3);
DOTP_SB4_SH(vec0, vec1, vec2, vec3, filt0, filt0, filt0, filt0, res0,
res1, res2, res3);
VSHF_B2_SB(src4, src4, src5, src5, mask2, mask2, vec0, vec1);
VSHF_B2_SB(src6, src6, src7, src7, mask2, mask2, vec2, vec3);
DPADD_SB4_SH(vec0, vec1, vec2, vec3, filt2, filt2, filt2, filt2, res0,
res1, res2, res3);
VSHF_B2_SB(src4, src4, src5, src5, mask1, mask1, vec4, vec5);
VSHF_B2_SB(src6, src6, src7, src7, mask1, mask1, vec6, vec7);
DPADD_SB4_SH(vec4, vec5, vec6, vec7, filt1, filt1, filt1, filt1, res0,
res1, res2, res3);
VSHF_B2_SB(src4, src4, src5, src5, mask3, mask3, vec4, vec5);
VSHF_B2_SB(src6, src6, src7, src7, mask3, mask3, vec6, vec7);
DPADD_SB4_SH(vec4, vec5, vec6, vec7, filt3, filt3, filt3, filt3, res0,
res1, res2, res3);
SRARI_H4_SH(res0, res1, res2, res3, 6);
SAT_SH4_SH(res0, res1, res2, res3, 7);
out = PCKEV_XORI128_UB(res0, res1);
ST_UB(out, dst + 32);
out = PCKEV_XORI128_UB(out2, out3);
out = PCKEV_XORI128_UB(res2, res3);
ST_UB(out, dst + 48);
dst += dst_stride;
}
@ -3721,15 +3760,13 @@ UNI_MC_COPY(64);
#define UNI_MC(PEL, DIR, WIDTH, TAP, DIR1, FILT_DIR) \
void ff_hevc_put_hevc_uni_##PEL##_##DIR##WIDTH##_8_msa(uint8_t *dst, \
ptrdiff_t \
dst_stride, \
uint8_t *src, \
ptrdiff_t \
src_stride, \
int height, \
intptr_t mx, \
intptr_t my, \
int width) \
ptrdiff_t dst_stride, \
uint8_t *src, \
ptrdiff_t src_stride, \
int height, \
intptr_t mx, \
intptr_t my, \
int width) \
{ \
const int8_t *filter = ff_hevc_##PEL##_filters[FILT_DIR - 1]; \
\
@ -3773,41 +3810,38 @@ UNI_MC(epel, v, 32, 4, vt, my);
#undef UNI_MC
#define UNI_MC_HV(PEL, DIR, WIDTH, TAP, DIR1) \
void ff_hevc_put_hevc_uni_##PEL##_##DIR##WIDTH##_8_msa(uint8_t *dst, \
ptrdiff_t \
dst_stride, \
uint8_t *src, \
ptrdiff_t \
src_stride, \
int height, \
intptr_t mx, \
intptr_t my, \
int width) \
{ \
const int8_t *filter_x = ff_hevc_##PEL##_filters[mx - 1]; \
const int8_t *filter_y = ff_hevc_##PEL##_filters[my - 1]; \
\
hevc_##DIR1##_uni_##TAP##t_##WIDTH##w_msa(src, src_stride, dst, \
dst_stride, filter_x, \
filter_y, height); \
#define UNI_MC_HV(PEL, WIDTH, TAP) \
void ff_hevc_put_hevc_uni_##PEL##_hv##WIDTH##_8_msa(uint8_t *dst, \
ptrdiff_t dst_stride, \
uint8_t *src, \
ptrdiff_t src_stride, \
int height, \
intptr_t mx, \
intptr_t my, \
int width) \
{ \
const int8_t *filter_x = ff_hevc_##PEL##_filters[mx - 1]; \
const int8_t *filter_y = ff_hevc_##PEL##_filters[my - 1]; \
\
hevc_hv_uni_##TAP##t_##WIDTH##w_msa(src, src_stride, dst, dst_stride, \
filter_x, filter_y, height); \
}
UNI_MC_HV(qpel, hv, 4, 8, hv);
UNI_MC_HV(qpel, hv, 8, 8, hv);
UNI_MC_HV(qpel, hv, 12, 8, hv);
UNI_MC_HV(qpel, hv, 16, 8, hv);
UNI_MC_HV(qpel, hv, 24, 8, hv);
UNI_MC_HV(qpel, hv, 32, 8, hv);
UNI_MC_HV(qpel, hv, 48, 8, hv);
UNI_MC_HV(qpel, hv, 64, 8, hv);
UNI_MC_HV(qpel, 4, 8);
UNI_MC_HV(qpel, 8, 8);
UNI_MC_HV(qpel, 12, 8);
UNI_MC_HV(qpel, 16, 8);
UNI_MC_HV(qpel, 24, 8);
UNI_MC_HV(qpel, 32, 8);
UNI_MC_HV(qpel, 48, 8);
UNI_MC_HV(qpel, 64, 8);
UNI_MC_HV(epel, hv, 4, 4, hv);
UNI_MC_HV(epel, hv, 6, 4, hv);
UNI_MC_HV(epel, hv, 8, 4, hv);
UNI_MC_HV(epel, hv, 12, 4, hv);
UNI_MC_HV(epel, hv, 16, 4, hv);
UNI_MC_HV(epel, hv, 24, 4, hv);
UNI_MC_HV(epel, hv, 32, 4, hv);
UNI_MC_HV(epel, 4, 4);
UNI_MC_HV(epel, 6, 4);
UNI_MC_HV(epel, 8, 4);
UNI_MC_HV(epel, 12, 4);
UNI_MC_HV(epel, 16, 4);
UNI_MC_HV(epel, 24, 4);
UNI_MC_HV(epel, 32, 4);
#undef UNI_MC_HV