mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-08-15 08:53:07 +09:00
MoonchildProductions/UXP#2897: Import upstream libyuv fixes to fix Clang compilation on Loongarch64
This commit is contained in:
parent
59c74b71e2
commit
5dc90752dd
4 changed files with 1377 additions and 156 deletions
|
|
@ -57,6 +57,7 @@
|
|||
'source/rotate_argb.cc',
|
||||
'source/rotate_common.cc',
|
||||
'source/rotate_gcc.cc',
|
||||
'source/rotate_lsx.cc',
|
||||
'source/rotate_msa.cc',
|
||||
'source/rotate_neon.cc',
|
||||
'source/rotate_neon64.cc',
|
||||
|
|
@ -64,6 +65,8 @@
|
|||
'source/row_any.cc',
|
||||
'source/row_common.cc',
|
||||
'source/row_gcc.cc',
|
||||
'source/row_lasx.cc',
|
||||
'source/row_lsx.cc',
|
||||
'source/row_msa.cc',
|
||||
'source/row_neon.cc',
|
||||
'source/row_neon64.cc',
|
||||
|
|
@ -73,6 +76,7 @@
|
|||
'source/scale_argb.cc',
|
||||
'source/scale_common.cc',
|
||||
'source/scale_gcc.cc',
|
||||
'source/scale_lsx.cc',
|
||||
'source/scale_msa.cc',
|
||||
'source/scale_neon.cc',
|
||||
'source/scale_neon64.cc',
|
||||
|
|
|
|||
|
|
@ -35,6 +35,13 @@ if CONFIG['CPU_ARCH'] == 'aarch64':
|
|||
'source/row_neon64.cc',
|
||||
'source/scale_neon64.cc',
|
||||
]
|
||||
if CONFIG['CPU_ARCH'] == 'loongarch64':
|
||||
libyuv_non_unified_sources += [
|
||||
'source/rotate_lsx.cc',
|
||||
'source/row_lasx.cc',
|
||||
'source/row_lsx.cc',
|
||||
'source/scale_lsx.cc',
|
||||
]
|
||||
|
||||
GYP_DIRS['.'].input = 'libyuv.gyp'
|
||||
GYP_DIRS['.'].variables = gyp_vars
|
||||
|
|
|
|||
|
|
@ -193,18 +193,30 @@ extern "C" {
|
|||
|
||||
#define RGBTOUV(_tmpb, _tmpg, _tmpr, _nexb, _nexg, _nexr, _reg0, _reg1) \
|
||||
{ \
|
||||
__m256i _tmp0, _tmp1, _tmp2, _tmp3; \
|
||||
__m256i _tmp0, _tmp1, _tmp2, _tmp3, _tmp4, _tmp5; \
|
||||
_tmp0 = __lasx_xvaddwev_h_bu(_tmpb, _nexb); \
|
||||
_tmp1 = __lasx_xvaddwod_h_bu(_tmpb, _nexb); \
|
||||
_tmp2 = __lasx_xvaddwev_h_bu(_tmpg, _nexg); \
|
||||
_tmp3 = __lasx_xvaddwod_h_bu(_tmpg, _nexg); \
|
||||
_reg0 = __lasx_xvaddwev_h_bu(_tmpr, _nexr); \
|
||||
_reg1 = __lasx_xvaddwod_h_bu(_tmpr, _nexr); \
|
||||
_tmpb = __lasx_xvavgr_hu(_tmp0, _tmp1); \
|
||||
_tmpg = __lasx_xvavgr_hu(_tmp2, _tmp3); \
|
||||
_tmpr = __lasx_xvavgr_hu(_reg0, _reg1); \
|
||||
_reg0 = __lasx_xvmadd_h(const_8080, const_112, _tmpb); \
|
||||
_reg1 = __lasx_xvmadd_h(const_8080, const_112, _tmpr); \
|
||||
_tmp4 = __lasx_xvaddwev_w_hu(_tmp0, _tmp1); \
|
||||
_tmp5 = __lasx_xvaddwod_w_hu(_tmp0, _tmp1); \
|
||||
_tmp0 = __lasx_xvilvl_w(_tmp5, _tmp4); \
|
||||
_tmp1 = __lasx_xvilvh_w(_tmp5, _tmp4); \
|
||||
_tmpb = __lasx_xvssrarni_hu_w(_tmp1, _tmp0, 2); \
|
||||
_tmp4 = __lasx_xvaddwev_w_hu(_tmp2, _tmp3); \
|
||||
_tmp5 = __lasx_xvaddwod_w_hu(_tmp2, _tmp3); \
|
||||
_tmp2 = __lasx_xvilvl_w(_tmp5, _tmp4); \
|
||||
_tmp3 = __lasx_xvilvh_w(_tmp5, _tmp4); \
|
||||
_tmpg = __lasx_xvssrarni_hu_w(_tmp3, _tmp2, 2); \
|
||||
_tmp4 = __lasx_xvaddwev_w_hu(_reg0, _reg1); \
|
||||
_tmp5 = __lasx_xvaddwod_w_hu(_reg0, _reg1); \
|
||||
_tmp0 = __lasx_xvilvl_w(_tmp5, _tmp4); \
|
||||
_tmp1 = __lasx_xvilvh_w(_tmp5, _tmp4); \
|
||||
_tmpr = __lasx_xvssrarni_hu_w(_tmp1, _tmp0, 2); \
|
||||
_reg0 = __lasx_xvmadd_h(const_8000, const_112, _tmpb); \
|
||||
_reg1 = __lasx_xvmadd_h(const_8000, const_112, _tmpr); \
|
||||
_reg0 = __lasx_xvmsub_h(_reg0, const_74, _tmpg); \
|
||||
_reg1 = __lasx_xvmsub_h(_reg1, const_94, _tmpg); \
|
||||
_reg0 = __lasx_xvmsub_h(_reg0, const_38, _tmpr); \
|
||||
|
|
@ -543,8 +555,8 @@ void I422ToARGB4444Row_LASX(const uint8_t* src_y,
|
|||
__m256i vec_yb, vec_yg, vec_ub, vec_vr, vec_ug, vec_vg;
|
||||
__m256i vec_ubvr, vec_ugvg;
|
||||
__m256i const_0x80 = __lasx_xvldi(0x80);
|
||||
__m256i alpha = {0xF000F000F000F000, 0xF000F000F000F000, 0xF000F000F000F000,
|
||||
0xF000F000F000F000};
|
||||
__m256i alpha = (__m256i)v4u64{0xF000F000F000F000, 0xF000F000F000F000,
|
||||
0xF000F000F000F000, 0xF000F000F000F000};
|
||||
__m256i mask = {0x00F000F000F000F0, 0x00F000F000F000F0, 0x00F000F000F000F0,
|
||||
0x00F000F000F000F0};
|
||||
|
||||
|
|
@ -595,8 +607,8 @@ void I422ToARGB1555Row_LASX(const uint8_t* src_y,
|
|||
__m256i vec_yb, vec_yg, vec_ub, vec_vr, vec_ug, vec_vg;
|
||||
__m256i vec_ubvr, vec_ugvg;
|
||||
__m256i const_0x80 = __lasx_xvldi(0x80);
|
||||
__m256i alpha = {0x8000800080008000, 0x8000800080008000, 0x8000800080008000,
|
||||
0x8000800080008000};
|
||||
__m256i alpha = (__m256i)v4u64{0x8000800080008000, 0x8000800080008000,
|
||||
0x8000800080008000, 0x8000800080008000};
|
||||
|
||||
YUVTORGB_SETUP(yuvconstants, vec_ub, vec_vr, vec_ug, vec_vg, vec_yg, vec_yb);
|
||||
vec_ubvr = __lasx_xvilvl_h(vec_ub, vec_vr);
|
||||
|
|
@ -787,20 +799,16 @@ void ARGBToUVRow_LASX(const uint8_t* src_argb0,
|
|||
__m256i src0, src1, src2, src3, src4, src5, src6, src7;
|
||||
__m256i vec0, vec1, vec2, vec3;
|
||||
__m256i tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, dst0, dst1;
|
||||
__m256i const_0x70 = {0x0038003800380038, 0x0038003800380038,
|
||||
0x0038003800380038, 0x0038003800380038};
|
||||
__m256i const_0x4A = {0x0025002500250025, 0x0025002500250025,
|
||||
0x0025002500250025, 0x0025002500250025};
|
||||
__m256i const_0x26 = {0x0013001300130013, 0x0013001300130013,
|
||||
0x0013001300130013, 0x0013001300130013};
|
||||
__m256i const_0x5E = {0x002f002f002f002f, 0x002f002f002f002f,
|
||||
0x002f002f002f002f, 0x002f002f002f002f};
|
||||
__m256i const_0x12 = {0x0009000900090009, 0x0009000900090009,
|
||||
0x0009000900090009, 0x0009000900090009};
|
||||
__m256i const_0x70 = __lasx_xvldi(0x470);
|
||||
__m256i const_0x4A = __lasx_xvldi(0x44A);
|
||||
__m256i const_0x26 = __lasx_xvldi(0x426);
|
||||
__m256i const_0x5E = __lasx_xvldi(0x45E);
|
||||
__m256i const_0x12 = __lasx_xvldi(0x412);
|
||||
|
||||
__m256i control = {0x0000000400000000, 0x0000000500000001, 0x0000000600000002,
|
||||
0x0000000700000003};
|
||||
__m256i const_0x8080 = {0x8080808080808080, 0x8080808080808080,
|
||||
0x8080808080808080, 0x8080808080808080};
|
||||
__m256i const_0x8000 = (__m256i)v4u64{0x8000800080008000, 0x8000800080008000,
|
||||
0x8000800080008000, 0x8000800080008000};
|
||||
|
||||
for (x = 0; x < len; x++) {
|
||||
DUP4_ARG2(__lasx_xvld, src_argb0, 0, src_argb0, 32, src_argb0, 64,
|
||||
|
|
@ -823,17 +831,20 @@ void ARGBToUVRow_LASX(const uint8_t* src_argb0,
|
|||
tmp5 = __lasx_xvpickev_h(vec3, vec2);
|
||||
vec0 = __lasx_xvpickev_h(tmp1, tmp0);
|
||||
vec1 = __lasx_xvpickod_h(tmp1, tmp0);
|
||||
src0 = __lasx_xvavgr_h(vec0, vec1);
|
||||
src0 = __lasx_xvadd_h(vec0, vec1);
|
||||
src0 = __lasx_xvsrari_h(src0, 2);
|
||||
vec0 = __lasx_xvpickev_h(tmp3, tmp2);
|
||||
vec1 = __lasx_xvpickod_h(tmp3, tmp2);
|
||||
src1 = __lasx_xvavgr_h(vec0, vec1);
|
||||
src1 = __lasx_xvadd_h(vec0, vec1);
|
||||
src1 = __lasx_xvsrari_h(src1, 2);
|
||||
vec0 = __lasx_xvpickev_h(tmp5, tmp4);
|
||||
vec1 = __lasx_xvpickod_h(tmp5, tmp4);
|
||||
src2 = __lasx_xvavgr_h(vec0, vec1);
|
||||
dst0 = __lasx_xvmadd_h(const_0x8080, src0, const_0x70);
|
||||
src2 = __lasx_xvadd_h(vec0, vec1);
|
||||
src2 = __lasx_xvsrari_h(src2, 2);
|
||||
dst0 = __lasx_xvmadd_h(const_0x8000, src0, const_0x70);
|
||||
dst0 = __lasx_xvmsub_h(dst0, src2, const_0x4A);
|
||||
dst0 = __lasx_xvmsub_h(dst0, src1, const_0x26);
|
||||
dst1 = __lasx_xvmadd_h(const_0x8080, src1, const_0x70);
|
||||
dst1 = __lasx_xvmadd_h(const_0x8000, src1, const_0x70);
|
||||
dst1 = __lasx_xvmsub_h(dst1, src2, const_0x5E);
|
||||
dst1 = __lasx_xvmsub_h(dst1, src0, const_0x12);
|
||||
dst0 = __lasx_xvperm_w(dst0, control);
|
||||
|
|
@ -1037,8 +1048,8 @@ void ARGBToUV444Row_LASX(const uint8_t* src_argb,
|
|||
__m256i const_38 = __lasx_xvldi(38);
|
||||
__m256i const_94 = __lasx_xvldi(94);
|
||||
__m256i const_18 = __lasx_xvldi(18);
|
||||
__m256i const_0x8080 = {0x8080808080808080, 0x8080808080808080,
|
||||
0x8080808080808080, 0x8080808080808080};
|
||||
__m256i const_0x8000 = (__m256i)v4u64{0x8000800080008000, 0x8000800080008000,
|
||||
0x8000800080008000, 0x8000800080008000};
|
||||
__m256i control = {0x0000000400000000, 0x0000000500000001, 0x0000000600000002,
|
||||
0x0000000700000003};
|
||||
for (x = 0; x < len; x++) {
|
||||
|
|
@ -1048,8 +1059,8 @@ void ARGBToUV444Row_LASX(const uint8_t* src_argb,
|
|||
tmp1 = __lasx_xvpickod_h(src1, src0);
|
||||
tmp2 = __lasx_xvpickev_h(src3, src2);
|
||||
tmp3 = __lasx_xvpickod_h(src3, src2);
|
||||
reg0 = __lasx_xvmaddwev_h_bu(const_0x8080, tmp0, const_112);
|
||||
reg1 = __lasx_xvmaddwev_h_bu(const_0x8080, tmp2, const_112);
|
||||
reg0 = __lasx_xvmaddwev_h_bu(const_0x8000, tmp0, const_112);
|
||||
reg1 = __lasx_xvmaddwev_h_bu(const_0x8000, tmp2, const_112);
|
||||
reg2 = __lasx_xvmulwod_h_bu(tmp0, const_74);
|
||||
reg3 = __lasx_xvmulwod_h_bu(tmp2, const_74);
|
||||
reg2 = __lasx_xvmaddwev_h_bu(reg2, tmp1, const_38);
|
||||
|
|
@ -1058,8 +1069,8 @@ void ARGBToUV444Row_LASX(const uint8_t* src_argb,
|
|||
reg1 = __lasx_xvsub_h(reg1, reg3);
|
||||
dst0 = __lasx_xvssrani_b_h(reg1, reg0, 8);
|
||||
dst0 = __lasx_xvperm_w(dst0, control);
|
||||
reg0 = __lasx_xvmaddwev_h_bu(const_0x8080, tmp1, const_112);
|
||||
reg1 = __lasx_xvmaddwev_h_bu(const_0x8080, tmp3, const_112);
|
||||
reg0 = __lasx_xvmaddwev_h_bu(const_0x8000, tmp1, const_112);
|
||||
reg1 = __lasx_xvmaddwev_h_bu(const_0x8000, tmp3, const_112);
|
||||
reg2 = __lasx_xvmulwev_h_bu(tmp0, const_18);
|
||||
reg3 = __lasx_xvmulwev_h_bu(tmp2, const_18);
|
||||
reg2 = __lasx_xvmaddwod_h_bu(reg2, tmp0, const_94);
|
||||
|
|
@ -1148,24 +1159,26 @@ void ARGBAttenuateRow_LASX(const uint8_t* src_argb,
|
|||
__m256i b, g, r, a, dst0, dst1;
|
||||
__m256i control = {0x0005000100040000, 0x0007000300060002, 0x0005000100040000,
|
||||
0x0007000300060002};
|
||||
__m256i zero = __lasx_xvldi(0);
|
||||
__m256i const_add = __lasx_xvldi(0x8ff);
|
||||
|
||||
for (x = 0; x < len; x++) {
|
||||
DUP2_ARG2(__lasx_xvld, src_argb, 0, src_argb, 32, src0, src1);
|
||||
tmp0 = __lasx_xvpickev_b(src1, src0);
|
||||
tmp1 = __lasx_xvpickod_b(src1, src0);
|
||||
b = __lasx_xvpackev_b(tmp0, tmp0);
|
||||
r = __lasx_xvpackod_b(tmp0, tmp0);
|
||||
g = __lasx_xvpackev_b(tmp1, tmp1);
|
||||
a = __lasx_xvpackod_b(tmp1, tmp1);
|
||||
reg0 = __lasx_xvmulwev_w_hu(b, a);
|
||||
reg1 = __lasx_xvmulwod_w_hu(b, a);
|
||||
reg2 = __lasx_xvmulwev_w_hu(r, a);
|
||||
reg3 = __lasx_xvmulwod_w_hu(r, a);
|
||||
reg4 = __lasx_xvmulwev_w_hu(g, a);
|
||||
reg5 = __lasx_xvmulwod_w_hu(g, a);
|
||||
reg0 = __lasx_xvssrani_h_w(reg1, reg0, 24);
|
||||
reg2 = __lasx_xvssrani_h_w(reg3, reg2, 24);
|
||||
reg4 = __lasx_xvssrani_h_w(reg5, reg4, 24);
|
||||
b = __lasx_xvpackev_b(zero, tmp0);
|
||||
r = __lasx_xvpackod_b(zero, tmp0);
|
||||
g = __lasx_xvpackev_b(zero, tmp1);
|
||||
a = __lasx_xvpackod_b(zero, tmp1);
|
||||
reg0 = __lasx_xvmaddwev_w_hu(const_add, b, a);
|
||||
reg1 = __lasx_xvmaddwod_w_hu(const_add, b, a);
|
||||
reg2 = __lasx_xvmaddwev_w_hu(const_add, r, a);
|
||||
reg3 = __lasx_xvmaddwod_w_hu(const_add, r, a);
|
||||
reg4 = __lasx_xvmaddwev_w_hu(const_add, g, a);
|
||||
reg5 = __lasx_xvmaddwod_w_hu(const_add, g, a);
|
||||
reg0 = __lasx_xvssrani_h_w(reg1, reg0, 8);
|
||||
reg2 = __lasx_xvssrani_h_w(reg3, reg2, 8);
|
||||
reg4 = __lasx_xvssrani_h_w(reg5, reg4, 8);
|
||||
reg0 = __lasx_xvshuf_h(control, reg0, reg0);
|
||||
reg2 = __lasx_xvshuf_h(control, reg2, reg2);
|
||||
reg4 = __lasx_xvshuf_h(control, reg4, reg4);
|
||||
|
|
@ -1182,7 +1195,7 @@ void ARGBAttenuateRow_LASX(const uint8_t* src_argb,
|
|||
|
||||
void ARGBToRGB565DitherRow_LASX(const uint8_t* src_argb,
|
||||
uint8_t* dst_rgb,
|
||||
const uint32_t dither4,
|
||||
uint32_t dither4,
|
||||
int width) {
|
||||
int x;
|
||||
int len = width / 16;
|
||||
|
|
@ -1604,13 +1617,13 @@ void ARGB1555ToUVRow_LASX(const uint8_t* src_argb1555,
|
|||
__m256i tmp0, tmp1, tmp2, tmp3;
|
||||
__m256i tmpb, tmpg, tmpr, nexb, nexg, nexr;
|
||||
__m256i reg0, reg1, reg2, reg3, dst0;
|
||||
__m256i const_112 = __lasx_xvldi(0x438);
|
||||
__m256i const_74 = __lasx_xvldi(0x425);
|
||||
__m256i const_38 = __lasx_xvldi(0x413);
|
||||
__m256i const_94 = __lasx_xvldi(0x42F);
|
||||
__m256i const_18 = __lasx_xvldi(0x409);
|
||||
__m256i const_8080 = {0x8080808080808080, 0x8080808080808080,
|
||||
0x8080808080808080, 0x8080808080808080};
|
||||
__m256i const_112 = __lasx_xvldi(0x470);
|
||||
__m256i const_74 = __lasx_xvldi(0x44A);
|
||||
__m256i const_38 = __lasx_xvldi(0x426);
|
||||
__m256i const_94 = __lasx_xvldi(0x45E);
|
||||
__m256i const_18 = __lasx_xvldi(0x412);
|
||||
__m256i const_8000 = (__m256i)v4u64{0x8000800080008000, 0x8000800080008000,
|
||||
0x8000800080008000, 0x8000800080008000};
|
||||
|
||||
for (x = 0; x < len; x++) {
|
||||
DUP4_ARG2(__lasx_xvld, src_argb1555, 0, src_argb1555, 32, next_argb1555, 0,
|
||||
|
|
@ -1721,13 +1734,13 @@ void RGB565ToUVRow_LASX(const uint8_t* src_rgb565,
|
|||
__m256i tmp0, tmp1, tmp2, tmp3;
|
||||
__m256i tmpb, tmpg, tmpr, nexb, nexg, nexr;
|
||||
__m256i reg0, reg1, reg2, reg3, dst0;
|
||||
__m256i const_112 = __lasx_xvldi(0x438);
|
||||
__m256i const_74 = __lasx_xvldi(0x425);
|
||||
__m256i const_38 = __lasx_xvldi(0x413);
|
||||
__m256i const_94 = __lasx_xvldi(0x42F);
|
||||
__m256i const_18 = __lasx_xvldi(0x409);
|
||||
__m256i const_8080 = {0x8080808080808080, 0x8080808080808080,
|
||||
0x8080808080808080, 0x8080808080808080};
|
||||
__m256i const_112 = __lasx_xvldi(0x470);
|
||||
__m256i const_74 = __lasx_xvldi(0x44A);
|
||||
__m256i const_38 = __lasx_xvldi(0x426);
|
||||
__m256i const_94 = __lasx_xvldi(0x45E);
|
||||
__m256i const_18 = __lasx_xvldi(0x412);
|
||||
__m256i const_8000 = (__m256i)v4u64{0x8000800080008000, 0x8000800080008000,
|
||||
0x8000800080008000, 0x8000800080008000};
|
||||
|
||||
for (x = 0; x < len; x++) {
|
||||
DUP4_ARG2(__lasx_xvld, src_rgb565, 0, src_rgb565, 32, next_rgb565, 0,
|
||||
|
|
@ -1788,13 +1801,13 @@ void RGB24ToUVRow_LASX(const uint8_t* src_rgb24,
|
|||
__m256i src0, src1, src2, reg0, reg1, reg2;
|
||||
__m256i nex0, nex1, nex2, dst0, tmp0, tmp1, tmp2;
|
||||
__m256i tmpb, tmpg, tmpr, nexb, nexg, nexr;
|
||||
__m256i const_112 = __lasx_xvldi(0x438);
|
||||
__m256i const_74 = __lasx_xvldi(0x425);
|
||||
__m256i const_38 = __lasx_xvldi(0x413);
|
||||
__m256i const_94 = __lasx_xvldi(0x42F);
|
||||
__m256i const_18 = __lasx_xvldi(0x409);
|
||||
__m256i const_8080 = {0x8080808080808080, 0x8080808080808080,
|
||||
0x8080808080808080, 0x8080808080808080};
|
||||
__m256i const_112 = __lasx_xvldi(0x470);
|
||||
__m256i const_74 = __lasx_xvldi(0x44A);
|
||||
__m256i const_38 = __lasx_xvldi(0x426);
|
||||
__m256i const_94 = __lasx_xvldi(0x45E);
|
||||
__m256i const_18 = __lasx_xvldi(0x412);
|
||||
__m256i const_8000 = (__m256i)v4u64{0x8000800080008000, 0x8000800080008000,
|
||||
0x8000800080008000, 0x8000800080008000};
|
||||
__m256i shuff0_b = {0x15120F0C09060300, 0x00000000001E1B18,
|
||||
0x15120F0C09060300, 0x00000000001E1B18};
|
||||
__m256i shuff1_b = {0x0706050403020100, 0x1D1A1714110A0908,
|
||||
|
|
@ -1851,13 +1864,13 @@ void RAWToUVRow_LASX(const uint8_t* src_raw,
|
|||
__m256i src0, src1, src2, reg0, reg1, reg2;
|
||||
__m256i nex0, nex1, nex2, dst0, tmp0, tmp1, tmp2;
|
||||
__m256i tmpb, tmpg, tmpr, nexb, nexg, nexr;
|
||||
__m256i const_112 = __lasx_xvldi(0x438);
|
||||
__m256i const_74 = __lasx_xvldi(0x425);
|
||||
__m256i const_38 = __lasx_xvldi(0x413);
|
||||
__m256i const_94 = __lasx_xvldi(0x42F);
|
||||
__m256i const_18 = __lasx_xvldi(0x409);
|
||||
__m256i const_8080 = {0x8080808080808080, 0x8080808080808080,
|
||||
0x8080808080808080, 0x8080808080808080};
|
||||
__m256i const_112 = __lasx_xvldi(0x470);
|
||||
__m256i const_74 = __lasx_xvldi(0x44A);
|
||||
__m256i const_38 = __lasx_xvldi(0x426);
|
||||
__m256i const_94 = __lasx_xvldi(0x45E);
|
||||
__m256i const_18 = __lasx_xvldi(0x412);
|
||||
__m256i const_8000 = (__m256i)v4u64{0x8000800080008000, 0x8000800080008000,
|
||||
0x8000800080008000, 0x8000800080008000};
|
||||
__m256i shuff0_r = {0x15120F0C09060300, 0x00000000001E1B18,
|
||||
0x15120F0C09060300, 0x00000000001E1B18};
|
||||
__m256i shuff1_r = {0x0706050403020100, 0x1D1A1714110A0908,
|
||||
|
|
@ -2000,11 +2013,13 @@ void NV21ToARGBRow_LASX(const uint8_t* src_y,
|
|||
}
|
||||
}
|
||||
|
||||
#ifndef RgbConstants
|
||||
struct RgbConstants {
|
||||
uint8_t kRGBToY[4];
|
||||
uint16_t kAddY;
|
||||
uint16_t pad;
|
||||
};
|
||||
#define RgbConstants RgbConstants
|
||||
|
||||
// RGB to JPeg coefficients
|
||||
// B * 0.1140 coefficient = 29
|
||||
|
|
@ -2030,6 +2045,7 @@ static const struct RgbConstants kRgb24I601Constants = {{25, 129, 66, 0},
|
|||
static const struct RgbConstants kRawI601Constants = {{66, 129, 25, 0},
|
||||
0x1080,
|
||||
0};
|
||||
#endif // RgbConstants
|
||||
|
||||
// ARGB expects first 3 values to contain RGB and 4th value is ignored.
|
||||
static void ARGBToYMatrixRow_LASX(const uint8_t* src_argb,
|
||||
|
|
@ -2234,16 +2250,16 @@ void ARGBToUVJRow_LASX(const uint8_t* src_argb,
|
|||
int len = width / 32;
|
||||
__m256i src0, src1, src2, src3;
|
||||
__m256i nex0, nex1, nex2, nex3;
|
||||
__m256i tmp0, tmp1, tmp2, tmp3;
|
||||
__m256i tmp0, tmp1, tmp2, tmp3, tmp4, tmp5;
|
||||
__m256i reg0, reg1, dst0;
|
||||
__m256i tmpb, tmpg, tmpr, nexb, nexg, nexr;
|
||||
__m256i const_63 = __lasx_xvldi(0x43F);
|
||||
__m256i const_42 = __lasx_xvldi(0x42A);
|
||||
__m256i const_128 = __lasx_xvldi(0x480);
|
||||
__m256i const_85 = __lasx_xvldi(0x455);
|
||||
__m256i const_43 = __lasx_xvldi(0x42B);
|
||||
__m256i const_107 = __lasx_xvldi(0x46B);
|
||||
__m256i const_21 = __lasx_xvldi(0x415);
|
||||
__m256i const_53 = __lasx_xvldi(0x435);
|
||||
__m256i const_10 = __lasx_xvldi(0x40A);
|
||||
__m256i const_8080 = {0x8080808080808080, 0x8080808080808080,
|
||||
0x8080808080808080, 0x8080808080808080};
|
||||
__m256i const_8000 = (__m256i)v4u64{0x8000800080008000, 0x8000800080008000,
|
||||
0x8000800080008000, 0x8000800080008000};
|
||||
__m256i shuff = {0x1614060412100200, 0x1E1C0E0C1A180A08, 0x1715070513110301,
|
||||
0x1F1D0F0D1B190B09};
|
||||
|
||||
|
|
@ -2272,15 +2288,27 @@ void ARGBToUVJRow_LASX(const uint8_t* src_argb,
|
|||
tmp3 = __lasx_xvaddwod_h_bu(tmpg, nexg);
|
||||
reg0 = __lasx_xvaddwev_h_bu(tmpr, nexr);
|
||||
reg1 = __lasx_xvaddwod_h_bu(tmpr, nexr);
|
||||
tmpb = __lasx_xvavgr_hu(tmp0, tmp1);
|
||||
tmpg = __lasx_xvavgr_hu(tmp2, tmp3);
|
||||
tmpr = __lasx_xvavgr_hu(reg0, reg1);
|
||||
reg0 = __lasx_xvmadd_h(const_8080, const_63, tmpb);
|
||||
reg1 = __lasx_xvmadd_h(const_8080, const_63, tmpr);
|
||||
reg0 = __lasx_xvmsub_h(reg0, const_42, tmpg);
|
||||
reg1 = __lasx_xvmsub_h(reg1, const_53, tmpg);
|
||||
reg0 = __lasx_xvmsub_h(reg0, const_21, tmpr);
|
||||
reg1 = __lasx_xvmsub_h(reg1, const_10, tmpb);
|
||||
tmp4 = __lasx_xvaddwev_w_hu(tmp0, tmp1);
|
||||
tmp5 = __lasx_xvaddwod_w_hu(tmp0, tmp1);
|
||||
tmp0 = __lasx_xvilvl_w(tmp5, tmp4);
|
||||
tmp1 = __lasx_xvilvh_w(tmp5, tmp4);
|
||||
tmpb = __lasx_xvssrarni_hu_w(tmp1, tmp0, 2);
|
||||
tmp4 = __lasx_xvaddwev_w_hu(tmp2, tmp3);
|
||||
tmp5 = __lasx_xvaddwod_w_hu(tmp2, tmp3);
|
||||
tmp2 = __lasx_xvilvl_w(tmp5, tmp4);
|
||||
tmp3 = __lasx_xvilvh_w(tmp5, tmp4);
|
||||
tmpg = __lasx_xvssrarni_hu_w(tmp3, tmp2, 2);
|
||||
tmp4 = __lasx_xvaddwev_w_hu(reg0, reg1);
|
||||
tmp5 = __lasx_xvaddwod_w_hu(reg0, reg1);
|
||||
tmp0 = __lasx_xvilvl_w(tmp5, tmp4);
|
||||
tmp1 = __lasx_xvilvh_w(tmp5, tmp4);
|
||||
tmpr = __lasx_xvssrarni_hu_w(tmp1, tmp0, 2);
|
||||
reg0 = __lasx_xvmadd_h(const_8000, const_128, tmpb);
|
||||
reg1 = __lasx_xvmadd_h(const_8000, const_128, tmpr);
|
||||
reg0 = __lasx_xvmsub_h(reg0, const_85, tmpg);
|
||||
reg1 = __lasx_xvmsub_h(reg1, const_107, tmpg);
|
||||
reg0 = __lasx_xvmsub_h(reg0, const_43, tmpr);
|
||||
reg1 = __lasx_xvmsub_h(reg1, const_21, tmpb);
|
||||
dst0 = __lasx_xvpackod_b(reg1, reg0);
|
||||
tmp0 = __lasx_xvpermi_d(dst0, 0x44);
|
||||
tmp1 = __lasx_xvpermi_d(dst0, 0xEE);
|
||||
|
|
@ -2296,9 +2324,21 @@ void ARGBToUVJRow_LASX(const uint8_t* src_argb,
|
|||
}
|
||||
}
|
||||
|
||||
// undef for unified sources build
|
||||
#undef ALPHA_VAL
|
||||
#undef YUVTORGB_SETUP
|
||||
#undef READYUV422_D
|
||||
#undef READYUV422
|
||||
#undef YUVTORGB_D
|
||||
#undef YUVTORGB
|
||||
#undef STOREARGB_D
|
||||
#undef STOREARGB
|
||||
#undef RGBTOUV
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
} // namespace libyuv
|
||||
#endif
|
||||
|
||||
#endif // !defined(LIBYUV_DISABLE_LASX) && defined(__loongarch_asx)
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue