History

avcodec/mips: Reduced conditional cases in avc inter lpf msa functions

Kaustubh Raste committed 9 years ago

Commit bba9c1c1 parent b5da07d1 file · +110 −164Browse files

Unified · Split

libavcodec/mips/h264dsp_msa.c+110−164
@@ -1250,21 +1250,7 @@ static void avc_loopfilter_luma_inter_edge_ver_msa(uint8_t *data, · 1249 unmodified lines
12501250 uint8_t beta_in,
12511251 uint32_t img_width)
12521252 {
1253− uint8_t *src;
1254− v16u8 beta, tmp_vec, bs = { 0 };
1255− v16u8 tc = { 0 };
1256− v16u8 is_less_than, is_less_than_beta;
1257− v16u8 p1, p0, q0, q1;
1258− v8i16 p0_r, q0_r, p1_r = { 0 };
1259− v8i16 q1_r = { 0 };
1260− v8i16 p0_l, q0_l, p1_l = { 0 };
1261− v8i16 q1_l = { 0 };
1262− v16u8 p3_org, p2_org, p1_org, p0_org, q0_org, q1_org, q2_org, q3_org;
1263− v8i16 p2_org_r, p1_org_r, p0_org_r, q0_org_r, q1_org_r, q2_org_r;
1264− v8i16 p2_org_l, p1_org_l, p0_org_l, q0_org_l, q1_org_l, q2_org_l;
1265− v8i16 tc_r, tc_l;
1266− v16i8 zero = { 0 };
1267− v16u8 is_bs_greater_than0;
1253+ v16u8 tmp_vec, bs = { 0 };
12681254
12691255 tmp_vec = (v16u8) __msa_fill_b(bs0);
12701256 bs = (v16u8) __msa_insve_w((v4i32) bs, 0, (v4i32) tmp_vec);
@@ -1276,6 +1262,14 @@ static void avc_loopfilter_luma_inter_edge_ver_msa(uint8_t *data, · 5 unmodified lines
12761262 bs = (v16u8) __msa_insve_w((v4i32) bs, 3, (v4i32) tmp_vec);
12771263
12781264 if (!__msa_test_bz_v(bs)) {
1265+ uint8_t *src = data - 4;
1266+ v16u8 p3_org, p2_org, p1_org, p0_org, q0_org, q1_org, q2_org, q3_org;
1267+ v16u8 p0_asub_q0, p1_asub_p0, q1_asub_q0, alpha, beta;
1268+ v16u8 is_less_than, is_less_than_beta, is_less_than_alpha;
1269+ v16u8 is_bs_greater_than0;
1270+ v16u8 tc = { 0 };
1271+ v16i8 zero = { 0 };
1272+
12791273 tmp_vec = (v16u8) __msa_fill_b(tc0);
12801274 tc = (v16u8) __msa_insve_w((v4i32) tc, 0, (v4i32) tmp_vec);
12811275 tmp_vec = (v16u8) __msa_fill_b(tc1);
@@ -1291,9 +1285,6 @@ static void avc_loopfilter_luma_inter_edge_ver_msa(uint8_t *data, · 9 unmodified lines
12911285 v16u8 row0, row1, row2, row3, row4, row5, row6, row7;
12921286 v16u8 row8, row9, row10, row11, row12, row13, row14, row15;
12931287
1294− src = data;
1295− src -= 4;
1296−
12971288 LD_UB8(src, img_width,
12981289 row0, row1, row2, row3, row4, row5, row6, row7);
12991290 src += (8 * img_width);
@@ -1306,27 +1297,28 @@ static void avc_loopfilter_luma_inter_edge_ver_msa(uint8_t *data, · 6 unmodified lines
13061297 p3_org, p2_org, p1_org, p0_org,
13071298 q0_org, q1_org, q2_org, q3_org);
13081299 }
1309− {
1310− v16u8 p0_asub_q0, p1_asub_p0, q1_asub_q0, alpha;
1311− v16u8 is_less_than_alpha;
1312−
1313− p0_asub_q0 = __msa_asub_u_b(p0_org, q0_org);
1314− p1_asub_p0 = __msa_asub_u_b(p1_org, p0_org);
1315− q1_asub_q0 = __msa_asub_u_b(q1_org, q0_org);
1316−
1317− alpha = (v16u8) __msa_fill_b(alpha_in);
1318− beta = (v16u8) __msa_fill_b(beta_in);
1319−
1320− is_less_than_alpha = (p0_asub_q0 < alpha);
1321− is_less_than_beta = (p1_asub_p0 < beta);
1322− is_less_than = is_less_than_beta & is_less_than_alpha;
1323− is_less_than_beta = (q1_asub_q0 < beta);
1324− is_less_than = is_less_than_beta & is_less_than;
1325− is_less_than = is_less_than & is_bs_greater_than0;
1326− }
1300+
1301+ p0_asub_q0 = __msa_asub_u_b(p0_org, q0_org);
1302+ p1_asub_p0 = __msa_asub_u_b(p1_org, p0_org);
1303+ q1_asub_q0 = __msa_asub_u_b(q1_org, q0_org);
1304+
1305+ alpha = (v16u8) __msa_fill_b(alpha_in);
1306+ beta = (v16u8) __msa_fill_b(beta_in);
1307+
1308+ is_less_than_alpha = (p0_asub_q0 < alpha);
1309+ is_less_than_beta = (p1_asub_p0 < beta);
1310+ is_less_than = is_less_than_beta & is_less_than_alpha;
1311+ is_less_than_beta = (q1_asub_q0 < beta);
1312+ is_less_than = is_less_than_beta & is_less_than;
1313+ is_less_than = is_less_than & is_bs_greater_than0;
1314+
13271315 if (!__msa_test_bz_v(is_less_than)) {
13281316 v16i8 negate_tc, sign_negate_tc;
1329− v8i16 negate_tc_r, i16_negatetc_l;
1317+ v16u8 p0, q0, p2_asub_p0, q2_asub_q0;
1318+ v8i16 tc_r, tc_l, negate_tc_r, i16_negatetc_l;
1319+ v8i16 p1_org_r, p0_org_r, q0_org_r, q1_org_r;
1320+ v8i16 p1_org_l, p0_org_l, q0_org_l, q1_org_l;
1321+ v8i16 p0_r, q0_r, p0_l, q0_l;
13301322
13311323 negate_tc = zero - (v16i8) tc;
13321324 sign_negate_tc = __msa_clti_s_b(negate_tc, 0);
@@ -1338,34 +1330,22 @@ static void avc_loopfilter_luma_inter_edge_ver_msa(uint8_t *data, · 5 unmodified lines
13381330 UNPCK_UB_SH(p0_org, p0_org_r, p0_org_l);
13391331 UNPCK_UB_SH(q0_org, q0_org_r, q0_org_l);
13401332
1341− {
1342− v16u8 p2_asub_p0;
1343− v16u8 is_less_than_beta_r, is_less_than_beta_l;
1344−
1345− p2_asub_p0 = __msa_asub_u_b(p2_org, p0_org);
1346− is_less_than_beta = (p2_asub_p0 < beta);
1347− is_less_than_beta = is_less_than_beta & is_less_than;
1348−
1349− is_less_than_beta_r =
1350− (v16u8) __msa_sldi_b((v16i8) is_less_than_beta, zero, 8);
1351− if (!__msa_test_bz_v(is_less_than_beta_r)) {
1352− p2_org_r = (v8i16) __msa_ilvr_b(zero, (v16i8) p2_org);
1353−
1354− AVC_LPF_P1_OR_Q1(p0_org_r, q0_org_r, p1_org_r, p2_org_r,
1355− negate_tc_r, tc_r, p1_r);
1356− }
1357−
1358− is_less_than_beta_l =
1359− (v16u8) __msa_sldi_b(zero, (v16i8) is_less_than_beta, 8);
1360− if (!__msa_test_bz_v(is_less_than_beta_l)) {
1361− p2_org_l = (v8i16) __msa_ilvl_b(zero, (v16i8) p2_org);
1362−
1363− AVC_LPF_P1_OR_Q1(p0_org_l, q0_org_l, p1_org_l, p2_org_l,
1364− i16_negatetc_l, tc_l, p1_l);
1365− }
1366− }
1333+ p2_asub_p0 = __msa_asub_u_b(p2_org, p0_org);
1334+ is_less_than_beta = (p2_asub_p0 < beta);
1335+ is_less_than_beta = is_less_than_beta & is_less_than;
13671336
13681337 if (!__msa_test_bz_v(is_less_than_beta)) {
1338+ v16u8 p1;
1339+ v8i16 p1_r = { 0 };
1340+ v8i16 p1_l = { 0 };
1341+ v8i16 p2_org_r = (v8i16) __msa_ilvr_b(zero, (v16i8) p2_org);
1342+ v8i16 p2_org_l = (v8i16) __msa_ilvl_b(zero, (v16i8) p2_org);
1343+
1344+ AVC_LPF_P1_OR_Q1(p0_org_r, q0_org_r, p1_org_r, p2_org_r,
1345+ negate_tc_r, tc_r, p1_r);
1346+ AVC_LPF_P1_OR_Q1(p0_org_l, q0_org_l, p1_org_l, p2_org_l,
1347+ i16_negatetc_l, tc_l, p1_l);
1348+
13691349 p1 = (v16u8) __msa_pckev_b((v16i8) p1_l, (v16i8) p1_r);
13701350 p1_org = __msa_bmnz_v(p1_org, p1, is_less_than_beta);
13711351
@@ -1373,36 +1353,25 @@ static void avc_loopfilter_luma_inter_edge_ver_msa(uint8_t *data, · 1 unmodified line
13731353 tc = tc + is_less_than_beta;
13741354 }
13751355
1376− {
1377− v16u8 u8_q2asub_q0;
1378− v16u8 is_less_than_beta_l, is_less_than_beta_r;
1379−
1380− u8_q2asub_q0 = __msa_asub_u_b(q2_org, q0_org);
1381− is_less_than_beta = (u8_q2asub_q0 < beta);
1382− is_less_than_beta = is_less_than_beta & is_less_than;
1383−
1384− q1_org_r = (v8i16) __msa_ilvr_b(zero, (v16i8) q1_org);
1385−
1386− is_less_than_beta_r =
1387− (v16u8) __msa_sldi_b((v16i8) is_less_than_beta, zero, 8);
1388− if (!__msa_test_bz_v(is_less_than_beta_r)) {
1389− q2_org_r = (v8i16) __msa_ilvr_b(zero, (v16i8) q2_org);
1390− AVC_LPF_P1_OR_Q1(p0_org_r, q0_org_r, q1_org_r, q2_org_r,
1391− negate_tc_r, tc_r, q1_r);
1392− }
1393−
1394− q1_org_l = (v8i16) __msa_ilvl_b(zero, (v16i8) q1_org);
1395−
1396− is_less_than_beta_l =
1397− (v16u8) __msa_sldi_b(zero, (v16i8) is_less_than_beta, 8);
1398− if (!__msa_test_bz_v(is_less_than_beta_l)) {
1399− q2_org_l = (v8i16) __msa_ilvl_b(zero, (v16i8) q2_org);
1400− AVC_LPF_P1_OR_Q1(p0_org_l, q0_org_l, q1_org_l, q2_org_l,
1401− i16_negatetc_l, tc_l, q1_l);
1402− }
1403− }
1356+ q2_asub_q0 = __msa_asub_u_b(q2_org, q0_org);
1357+ is_less_than_beta = (q2_asub_q0 < beta);
1358+ is_less_than_beta = is_less_than_beta & is_less_than;
1359+
1360+ q1_org_r = (v8i16) __msa_ilvr_b(zero, (v16i8) q1_org);
1361+ q1_org_l = (v8i16) __msa_ilvl_b(zero, (v16i8) q1_org);
14041362
14051363 if (!__msa_test_bz_v(is_less_than_beta)) {
1364+ v16u8 q1;
1365+ v8i16 q1_r = { 0 };
1366+ v8i16 q1_l = { 0 };
1367+ v8i16 q2_org_r = (v8i16) __msa_ilvr_b(zero, (v16i8) q2_org);
1368+ v8i16 q2_org_l = (v8i16) __msa_ilvl_b(zero, (v16i8) q2_org);
1369+
1370+ AVC_LPF_P1_OR_Q1(p0_org_r, q0_org_r, q1_org_r, q2_org_r,
1371+ negate_tc_r, tc_r, q1_r);
1372+ AVC_LPF_P1_OR_Q1(p0_org_l, q0_org_l, q1_org_l, q2_org_l,
1373+ i16_negatetc_l, tc_l, q1_l);
1374+
14061375 q1 = (v16u8) __msa_pckev_b((v16i8) q1_l, (v16i8) q1_r);
14071376 q1_org = __msa_bmnz_v(q1_org, q1, is_less_than_beta);
14081377
@@ -1436,7 +1405,7 @@ static void avc_loopfilter_luma_inter_edge_ver_msa(uint8_t *data, · 27 unmodified lines
14361405
14371406 p0_org = __msa_bmnz_v(p0_org, p0, is_less_than);
14381407 q0_org = __msa_bmnz_v(q0_org, q0, is_less_than);
1439− }
1408+
14401409 {
14411410 v16i8 tp0, tp1, tp2, tp3;
14421411 v8i16 tmp2, tmp5;
@@ -1548,6 +1517,7 @@ static void avc_loopfilter_luma_inter_edge_ver_msa(uint8_t *data, · 105 unmodified lines
15481517 SW(out2, src);
15491518 SH(out3, (src + 4));
15501519 }
1520+ }
15511521 }
15521522 }
15531523
@@ -1560,20 +1530,8 @@ static void avc_loopfilter_luma_inter_edge_hor_msa(uint8_t *data, · 6 unmodified lines
15601530 uint8_t beta_in,
15611531 uint32_t image_width)
15621532 {
1563− v16u8 p2_asub_p0, u8_q2asub_q0;
1564− v16u8 alpha, beta, is_less_than, is_less_than_beta;
1565− v16u8 p1, p0, q0, q1;
1566− v8i16 p1_r = { 0 };
1567− v8i16 p0_r, q0_r, q1_r = { 0 };
1568− v8i16 p1_l = { 0 };
1569− v8i16 p0_l, q0_l, q1_l = { 0 };
1570− v16u8 p2_org, p1_org, p0_org, q0_org, q1_org, q2_org;
1571− v8i16 p2_org_r, p1_org_r, p0_org_r, q0_org_r, q1_org_r, q2_org_r;
1572− v8i16 p2_org_l, p1_org_l, p0_org_l, q0_org_l, q1_org_l, q2_org_l;
1573− v16i8 zero = { 0 };
15741533 v16u8 tmp_vec;
15751534 v16u8 bs = { 0 };
1576− v16i8 tc = { 0 };
15771535
15781536 tmp_vec = (v16u8) __msa_fill_b(bs0);
15791537 bs = (v16u8) __msa_insve_w((v4i32) bs, 0, (v4i32) tmp_vec);
@@ -1585,6 +1543,16 @@ static void avc_loopfilter_luma_inter_edge_hor_msa(uint8_t *data, · 5 unmodified lines
15851543 bs = (v16u8) __msa_insve_w((v4i32) bs, 3, (v4i32) tmp_vec);
15861544
15871545 if (!__msa_test_bz_v(bs)) {
1546+ v16u8 alpha, beta, is_less_than, is_less_than_beta;
1547+ v16u8 p0, q0, p2_org, p1_org, p0_org, q0_org, q1_org, q2_org;
1548+ v16u8 p0_asub_q0, p1_asub_p0, q1_asub_q0;
1549+ v16u8 is_less_than_alpha, is_bs_greater_than0;
1550+ v8i16 p0_r, q0_r, p0_l, q0_l;
1551+ v8i16 p1_org_r, p0_org_r, q0_org_r, q1_org_r;
1552+ v8i16 p1_org_l, p0_org_l, q0_org_l, q1_org_l;
1553+ v16i8 zero = { 0 };
1554+ v16i8 tc = { 0 };
1555+
15881556 tmp_vec = (v16u8) __msa_fill_b(tc0);
15891557 tc = (v16i8) __msa_insve_w((v4i32) tc, 0, (v4i32) tmp_vec);
15901558 tmp_vec = (v16u8) __msa_fill_b(tc1);
@@ -1600,26 +1568,22 @@ static void avc_loopfilter_luma_inter_edge_hor_msa(uint8_t *data, · 9 unmodified lines
16001568 LD_UB5(data - (3 * image_width), image_width,
16011569 p2_org, p1_org, p0_org, q0_org, q1_org);
16021570
1603− {
1604− v16u8 p0_asub_q0, p1_asub_p0, q1_asub_q0;
1605− v16u8 is_less_than_alpha, is_bs_greater_than0;
1606−
1607− is_bs_greater_than0 = ((v16u8) zero < bs);
1608− p0_asub_q0 = __msa_asub_u_b(p0_org, q0_org);
1609− p1_asub_p0 = __msa_asub_u_b(p1_org, p0_org);
1610− q1_asub_q0 = __msa_asub_u_b(q1_org, q0_org);
1611−
1612− is_less_than_alpha = (p0_asub_q0 < alpha);
1613− is_less_than_beta = (p1_asub_p0 < beta);
1614− is_less_than = is_less_than_beta & is_less_than_alpha;
1615− is_less_than_beta = (q1_asub_q0 < beta);
1616− is_less_than = is_less_than_beta & is_less_than;
1617− is_less_than = is_less_than & is_bs_greater_than0;
1618− }
1571+ is_bs_greater_than0 = ((v16u8) zero < bs);
1572+ p0_asub_q0 = __msa_asub_u_b(p0_org, q0_org);
1573+ p1_asub_p0 = __msa_asub_u_b(p1_org, p0_org);
1574+ q1_asub_q0 = __msa_asub_u_b(q1_org, q0_org);
1575+
1576+ is_less_than_alpha = (p0_asub_q0 < alpha);
1577+ is_less_than_beta = (p1_asub_p0 < beta);
1578+ is_less_than = is_less_than_beta & is_less_than_alpha;
1579+ is_less_than_beta = (q1_asub_q0 < beta);
1580+ is_less_than = is_less_than_beta & is_less_than;
1581+ is_less_than = is_less_than & is_bs_greater_than0;
16191582
16201583 if (!__msa_test_bz_v(is_less_than)) {
16211584 v16i8 sign_negate_tc, negate_tc;
16221585 v8i16 negate_tc_r, i16_negatetc_l, tc_l, tc_r;
1586+ v16u8 p2_asub_p0, q2_asub_q0;
16231587
16241588 q2_org = LD_UB(data + (2 * image_width));
16251589 negate_tc = zero - tc;
@@ -1635,28 +1599,19 @@ static void avc_loopfilter_luma_inter_edge_hor_msa(uint8_t *data, · 9 unmodified lines
16351599 p2_asub_p0 = __msa_asub_u_b(p2_org, p0_org);
16361600 is_less_than_beta = (p2_asub_p0 < beta);
16371601 is_less_than_beta = is_less_than_beta & is_less_than;
1638− {
1639− v8u16 is_less_than_beta_r, is_less_than_beta_l;
1640−
1641− is_less_than_beta_r =
1642− (v8u16) __msa_sldi_b((v16i8) is_less_than_beta, zero, 8);
1643− if (!__msa_test_bz_v((v16u8) is_less_than_beta_r)) {
1644− p2_org_r = (v8i16) __msa_ilvr_b(zero, (v16i8) p2_org);
16451602
1646− AVC_LPF_P1_OR_Q1(p0_org_r, q0_org_r, p1_org_r, p2_org_r,
1647− negate_tc_r, tc_r, p1_r);
1648− }
1603+ if (!__msa_test_bz_v(is_less_than_beta)) {
1604+ v16u8 p1;
1605+ v8i16 p1_r = { 0 };
1606+ v8i16 p1_l = { 0 };
1607+ v8i16 p2_org_r = (v8i16) __msa_ilvr_b(zero, (v16i8) p2_org);
1608+ v8i16 p2_org_l = (v8i16) __msa_ilvl_b(zero, (v16i8) p2_org);
16491609
1650− is_less_than_beta_l =
1651− (v8u16) __msa_sldi_b(zero, (v16i8) is_less_than_beta, 8);
1652− if (!__msa_test_bz_v((v16u8) is_less_than_beta_l)) {
1653− p2_org_l = (v8i16) __msa_ilvl_b(zero, (v16i8) p2_org);
1610+ AVC_LPF_P1_OR_Q1(p0_org_r, q0_org_r, p1_org_r, p2_org_r,
1611+ negate_tc_r, tc_r, p1_r);
1612+ AVC_LPF_P1_OR_Q1(p0_org_l, q0_org_l, p1_org_l, p2_org_l,
1613+ i16_negatetc_l, tc_l, p1_l);
16541614
1655− AVC_LPF_P1_OR_Q1(p0_org_l, q0_org_l, p1_org_l, p2_org_l,
1656− i16_negatetc_l, tc_l, p1_l);
1657− }
1658− }
1659− if (!__msa_test_bz_v(is_less_than_beta)) {
16601615 p1 = (v16u8) __msa_pckev_b((v16i8) p1_l, (v16i8) p1_r);
16611616 p1_org = __msa_bmnz_v(p1_org, p1, is_less_than_beta);
16621617 ST_UB(p1_org, data - (2 * image_width));
@@ -1665,34 +1620,25 @@ static void avc_loopfilter_luma_inter_edge_hor_msa(uint8_t *data, · 2 unmodified lines
16651620 tc = tc + (v16i8) is_less_than_beta;
16661621 }
16671622
1668− u8_q2asub_q0 = __msa_asub_u_b(q2_org, q0_org);
1669− is_less_than_beta = (u8_q2asub_q0 < beta);
1623+ q2_asub_q0 = __msa_asub_u_b(q2_org, q0_org);
1624+ is_less_than_beta = (q2_asub_q0 < beta);
16701625 is_less_than_beta = is_less_than_beta & is_less_than;
16711626
1672− {
1673− v8u16 is_less_than_beta_r, is_less_than_beta_l;
1674− is_less_than_beta_r =
1675− (v8u16) __msa_sldi_b((v16i8) is_less_than_beta, zero, 8);
1676−
1677− q1_org_r = (v8i16) __msa_ilvr_b(zero, (v16i8) q1_org);
1678− if (!__msa_test_bz_v((v16u8) is_less_than_beta_r)) {
1679− q2_org_r = (v8i16) __msa_ilvr_b(zero, (v16i8) q2_org);
1680−
1681− AVC_LPF_P1_OR_Q1(p0_org_r, q0_org_r, q1_org_r, q2_org_r,
1682− negate_tc_r, tc_r, q1_r);
1683− }
1684− is_less_than_beta_l =
1685− (v8u16) __msa_sldi_b(zero, (v16i8) is_less_than_beta, 8);
1686−
1687− q1_org_l = (v8i16) __msa_ilvl_b(zero, (v16i8) q1_org);
1688− if (!__msa_test_bz_v((v16u8) is_less_than_beta_l)) {
1689− q2_org_l = (v8i16) __msa_ilvl_b(zero, (v16i8) q2_org);
1690−
1691− AVC_LPF_P1_OR_Q1(p0_org_l, q0_org_l, q1_org_l, q2_org_l,
1692− i16_negatetc_l, tc_l, q1_l);
1693− }
1694− }
1627+ q1_org_r = (v8i16) __msa_ilvr_b(zero, (v16i8) q1_org);
1628+ q1_org_l = (v8i16) __msa_ilvl_b(zero, (v16i8) q1_org);
1629+
16951630 if (!__msa_test_bz_v(is_less_than_beta)) {
1631+ v16u8 q1;
1632+ v8i16 q1_r = { 0 };
1633+ v8i16 q1_l = { 0 };
1634+ v8i16 q2_org_r = (v8i16) __msa_ilvr_b(zero, (v16i8) q2_org);
1635+ v8i16 q2_org_l = (v8i16) __msa_ilvl_b(zero, (v16i8) q2_org);
1636+
1637+ AVC_LPF_P1_OR_Q1(p0_org_r, q0_org_r, q1_org_r, q2_org_r,
1638+ negate_tc_r, tc_r, q1_r);
1639+ AVC_LPF_P1_OR_Q1(p0_org_l, q0_org_l, q1_org_l, q2_org_l,
1640+ i16_negatetc_l, tc_l, q1_l);
1641+
16961642 q1 = (v16u8) __msa_pckev_b((v16i8) q1_l, (v16i8) q1_r);
16971643 q1_org = __msa_bmnz_v(q1_org, q1, is_less_than_beta);
16981644 ST_UB(q1_org, data + image_width);

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t