MoonchildProductions/UXP#2897: Import upstream libyuv fixes to fix Clang compilation on Loongarch64

This commit is contained in:
Basilisk-Dev 2026-01-08 13:01:25 -05:00 committed by ownedbywuigi
commit 5dc90752dd
4 changed files with 1377 additions and 156 deletions

View file

@ -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',

View file

@ -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

View file

@ -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