History

Add asm code for NoneZeroCount and refine related code

zhiliang wang committed 11 years ago

Commit 01b74ea1 parent 7d5e88f12 files · +56 −91Browse files

Unified · Split

12 files
  1. codec/common/arm/deblocking_neon.S +6 −11
  2. codec/common/arm64/deblocking_aarch64_neon.S +5 −9
  3. codec/common/inc/deblocking_common.h +5 −0
  4. codec/common/src/deblocking_common.cpp +7 −0
  5. codec/common/x86/deblock.asm +11 −0
  6. codec/decoder/core/arm/block_add_neon.S +0 −12
  7. codec/decoder/core/arm64/block_add_aarch64_neon.S +0 −14
  8. codec/decoder/core/inc/decode_slice.h +0 −4
  9. codec/decoder/core/src/decode_slice.cpp +6 −24
  10. codec/encoder/core/inc/deblocking.h +0 −3
  11. codec/encoder/core/src/deblocking.cpp +5 −7
  12. test/decoder/DecUT_IdctResAddPred.cpp +11 −7
codec/common/arm/deblocking_neon.S+6−11
@@ -834,17 +834,12 @@ WELS_ASM_FUNC_END · 833 unmodified lines
834834
835835
836836 WELS_ASM_FUNC_BEGIN WelsNonZeroCount_neon
837−
838− vld1.64 {d0-d2}, [r0]
839−
840− vceq.s8 q0, q0, #0
841− vceq.s8 d2, d2, #0
842− vmvn q0, q0
843− vmvn d2, d2
844− vabs.s8 q0, q0
845− vabs.s8 d2, d2
846−
847− vst1.64 {d0-d2}, [r0]
837+ mov r1, #1
838+ vdup.8 q2, r1
839+ vld1.64 {d0,d1,d2}, [r0]
840+ vmin.s8 q0, q0, q2
841+ vmin.s8 d2, d2, d4
842+ vst1.64 {d0,d1,d2}, [r0]
848843 WELS_ASM_FUNC_END
849844
850845 #ifdef __APPLE__
codec/common/arm64/deblocking_aarch64_neon.S+5−9
@@ -553,16 +553,12 @@ bs_mv_check_jump1: · 552 unmodified lines
553553 #endif
554554
555555 WELS_ASM_AARCH64_FUNC_BEGIN WelsNonZeroCount_AArch64_neon
556+ mov w1, #1
557+ dup v3.8b, w1
556558 ld1 {v0.8b, v1.8b, v2.8b}, [x0]
557− ins v0.d[1], v1.d[0]
558− uzp1 v0.2d, v0.2d, v1.2d
559− cmeq v0.16b, v0.16b, #0
560− cmeq v2.8b, v2.8b, #0
561− mvn v0.16b, v0.16b
562− mvn v2.8b, v2.8b
563− abs v0.16b, v0.16b
564− abs v2.8b, v2.8b
565− ins v1.d[0], v0.d[1]
559+ umin v0.8b, v0.8b, v3.8b
560+ umin v1.8b, v1.8b, v3.8b
561+ umin v2.8b, v2.8b, v3.8b
566562 st1 {v0.8b, v1.8b, v2.8b}, [x0]
567563 WELS_ASM_AARCH64_FUNC_END
568564
codec/common/inc/deblocking_common.h+5−0
@@ -15,6 +15,8 @@ void DeblockChromaLt4H_c (uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStride, int · 14 unmodified lines
1515 int8_t* pTc);
1616 void DeblockChromaEq4H_c (uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStride, int32_t iAlpha, int32_t iBeta);
1717
18+void WelsNonZeroCount_c (int8_t* pNonZeroCount);
19+
1820 #if defined(__cplusplus)
1921 extern "C" {
2022 #endif//__cplusplus
@@ -32,6 +34,7 @@ void DeblockChromaLt4V_ssse3 (uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStride, · 11 unmodified lines
3234 void DeblockChromaEq4H_ssse3 (uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStride, int32_t iAlpha, int32_t iBeta);
3335 void DeblockChromaLt4H_ssse3 (uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStride, int32_t iAlpha, int32_t iBeta,
3436 int8_t* pTC);
37+void WelsNonZeroCount_sse2 (int8_t* pNonZeroCount);
3538 #endif
3639
3740 #if defined(HAVE_NEON)
@@ -48,6 +51,7 @@ void DeblockChromaEq4V_neon (uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStride, · 10 unmodified lines
4851 void DeblockChromaLt4H_neon (uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStride, int32_t iAlpha, int32_t iBeta,
4952 int8_t* pTC);
5053 void DeblockChromaEq4H_neon (uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStride, int32_t iAlpha, int32_t iBeta);
54+void WelsNonZeroCount_neon (int8_t* pNonZeroCount);
5155 #endif
5256
5357 #if defined(HAVE_NEON_AARCH64)
@@ -61,6 +65,7 @@ void DeblockChromaEq4V_AArch64_neon (uint8_t* pPixCb, uint8_t* pPixCr, int32_t i · 7 unmodified lines
6165 void DeblockChromaLt4H_AArch64_neon (uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStride, int32_t iAlpha, int32_t iBeta,
6266 int8_t* pTC);
6367 void DeblockChromaEq4H_AArch64_neon (uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStride, int32_t iAlpha, int32_t iBeta);
68+void WelsNonZeroCount_AArch64_neon (int8_t* pNonZeroCount);
6469 #endif
6570 #if defined(__cplusplus)
6671 }
codec/common/src/deblocking_common.cpp+7−0
@@ -180,6 +180,13 @@ void DeblockChromaEq4H_c (uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStride, int · 179 unmodified lines
180180 DeblockChromaEq4_c (pPixCb, pPixCr, 1, iStride, iAlpha, iBeta);
181181 }
182182
183+void WelsNonZeroCount_c (int8_t* pNonZeroCount) {
184+ int32_t i;
185+ for (i = 0; i < 24; i++) {
186+ pNonZeroCount[i] = !!pNonZeroCount[i];
187+ }
188+}
189+
183190 #ifdef X86_ASM
184191 extern "C" {
185192 void DeblockLumaLt4H_ssse3 (uint8_t* pPixY, int32_t iStride, int32_t iAlpha, int32_t iBeta, int8_t* pTc) {
codec/common/x86/deblock.asm+11−0
@@ -5276,3 +5276,14 @@ WELS_EXTERN DeblockLumaTransposeV2H_sse2 · 5275 unmodified lines
52765276 pop r3
52775277 ret
52785278
5279+WELS_EXTERN WelsNonZeroCount_sse2
5280+ %assign push_num 0
5281+ LOAD_1_PARA
5282+ movdqu xmm0, [r0]
5283+ movq xmm1, [r0+16]
5284+ WELS_DB1 xmm2
5285+ pminub xmm0, xmm2
5286+ pminub xmm1, xmm2
5287+ movdqu [r0], xmm0
5288+ movq [r0+16], xmm1
5289+ ret
codec/decoder/core/arm/block_add_neon.S+0−12
@@ -99,18 +99,6 @@ · 98 unmodified lines
9999 // }
100100 .endm
101101 #endif
102−// r0 int8_t* non_zero_count,
103−WELS_ASM_FUNC_BEGIN SetNonZeroCount_neon
104− vld1.64 {d0-d2}, [r0]
105− vceq.s8 q0, q0, #0
106− vceq.s8 d2, d2, #0
107− vmvn q0, q0
108− vmvn d2, d2
109− vabs.s8 q0, q0
110− vabs.s8 d2, d2
111− vst1.64 {d0-d2}, [r0]
112−WELS_ASM_FUNC_END
113−
114102
115103 // uint8_t *pred, const int32_t stride, int16_t *rs
116104 WELS_ASM_FUNC_BEGIN IdctResAddPred_neon
codec/decoder/core/arm64/block_add_aarch64_neon.S+0−14
@@ -100,20 +100,6 @@ · 99 unmodified lines
100100 // }
101101 .endm
102102 #endif
103−// x0 int8_t* non_zero_count,
104−WELS_ASM_AARCH64_FUNC_BEGIN SetNonZeroCount_AArch64_neon
105− mov x1, x0
106− ld1 {v0.16b}, [x1], #16
107− ld1 {v1.8b}, [x1]
108− cmeq v0.16b, v0.16b, #0
109− cmeq v1.8b, v1.8b, #0
110− mvn v0.16b, v0.16b
111− mvn v1.8b, v1.8b
112− abs v0.16b, v0.16b
113− abs v1.8b, v1.8b
114− st1 {v0.16b}, [x0], #16
115− st1 {v1.8b}, [x0]
116−WELS_ASM_AARCH64_FUNC_END
117103
118104 // uint8_t *pred, const int32_t stride, int16_t *rs
119105 WELS_ASM_AARCH64_FUNC_BEGIN IdctResAddPred_AArch64_neon
codec/decoder/core/inc/decode_slice.h+0−4
@@ -73,13 +73,11 @@ void WelsBlockZero8x8_sse2(int16_t * block, int32_t stride); · 72 unmodified lines
7373 #endif
7474
7575 #if defined(HAVE_NEON)
76−void SetNonZeroCount_neon (int8_t* pNonZeroCount);
7776 void WelsBlockZero16x16_neon(int16_t * block, int32_t stride);
7877 void WelsBlockZero8x8_neon(int16_t * block, int32_t stride);
7978 #endif
8079
8180 #if defined(HAVE_NEON_AARCH64)
82−void SetNonZeroCount_AArch64_neon (int8_t* pNonZeroCount);
8381 void WelsBlockZero16x16_AArch64_neon(int16_t * block, int32_t stride);
8482 void WelsBlockZero8x8_AArch64_neon(int16_t * block, int32_t stride);
8583 #endif
@@ -87,8 +85,6 @@ void WelsBlockZero8x8_AArch64_neon(int16_t * block, int32_t stride); · 1 unmodified line
8785 }
8886 #endif//__cplusplus
8987
90−void SetNonZeroCount_c (int8_t* pNonZeroCount);
91−
9288 void WelsBlockFuncInit (SBlockFunc* pFunc, int32_t iCpu);
9389 void WelsBlockZero16x16_c(int16_t * block, int32_t stride);
9490 void WelsBlockZero8x8_c(int16_t * block, int32_t stride);
codec/decoder/core/src/decode_slice.cpp+6−24
@@ -1690,25 +1690,13 @@ int32_t WelsDecodeMbCavlcPSlice (PWelsDecoderContext pCtx, PNalUnit pNalCur, uin · 1689 unmodified lines
16901690 }
16911691
16921692 void WelsBlockFuncInit (SBlockFunc* pFunc, int32_t iCpu) {
1693− pFunc->pWelsSetNonZeroCountFunc = SetNonZeroCount_c;
1694−
1695−#ifdef HAVE_NEON
1696− if (iCpu & WELS_CPU_NEON) {
1697− pFunc->pWelsSetNonZeroCountFunc = SetNonZeroCount_neon;
1698− }
1699−#endif
1700−
1701−#ifdef HAVE_NEON_AARCH64
1702− if (iCpu & WELS_CPU_NEON) {
1703− pFunc->pWelsSetNonZeroCountFunc = SetNonZeroCount_AArch64_neon;
1704− }
1705−#endif
1706−
1693+ pFunc->pWelsSetNonZeroCountFunc = WelsNonZeroCount_c;
17071694 pFunc->pWelsBlockZero16x16Func = WelsBlockZero16x16_c;
1708− pFunc->pWelsBlockZero8x8Func = WelsBlockZero8x8_c;
1709− //TO DO add neon and X86
1695+ pFunc->pWelsBlockZero8x8Func = WelsBlockZero8x8_c;
1696+
17101697 #ifdef HAVE_NEON
17111698 if (iCpu & WELS_CPU_NEON) {
1699+ pFunc->pWelsSetNonZeroCountFunc = WelsNonZeroCount_neon;
17121700 pFunc->pWelsBlockZero16x16Func = WelsBlockZero16x16_neon;
17131701 pFunc->pWelsBlockZero8x8Func = WelsBlockZero8x8_neon;
17141702 }
@@ -1716,6 +1704,7 @@ void WelsBlockFuncInit (SBlockFunc* pFunc, int32_t iCpu) { · 1 unmodified line
17161704
17171705 #ifdef HAVE_NEON_AARCH64
17181706 if (iCpu & WELS_CPU_NEON) {
1707+ pFunc->pWelsSetNonZeroCountFunc = WelsNonZeroCount_AArch64_neon;
17191708 pFunc->pWelsBlockZero16x16Func = WelsBlockZero16x16_AArch64_neon;
17201709 pFunc->pWelsBlockZero8x8Func = WelsBlockZero8x8_AArch64_neon;
17211710 }
@@ -1723,6 +1712,7 @@ void WelsBlockFuncInit (SBlockFunc* pFunc, int32_t iCpu) { · 1 unmodified line
17231712
17241713 #if defined(X86_ASM)
17251714 if (iCpu & WELS_CPU_SSE2) {
1715+ pFunc->pWelsSetNonZeroCountFunc = WelsNonZeroCount_sse2;
17261716 pFunc->pWelsBlockZero16x16Func = WelsBlockZero16x16_sse2;
17271717 pFunc->pWelsBlockZero8x8Func = WelsBlockZero8x8_sse2;
17281718 }
@@ -1730,14 +1720,6 @@ void WelsBlockFuncInit (SBlockFunc* pFunc, int32_t iCpu) { · 1 unmodified line
17301720
17311721 }
17321722
1733−void SetNonZeroCount_c (int8_t* pNonZeroCount) {
1734− int32_t i;
1735−
1736− for (i = 0; i < 24; i++) {
1737− pNonZeroCount[i] = !!pNonZeroCount[i];
1738− }
1739−}
1740−
17411723 void WelsBlockInit (int16_t* pBlock, int iW, int iH, int iStride, uint8_t uiVal) {
17421724 int32_t i;
17431725 int16_t* pDst = pBlock;
codec/encoder/core/inc/deblocking.h+0−3
@@ -65,12 +65,10 @@ typedef struct TagDeblockingFilter { · 64 unmodified lines
6565 extern "C" {
6666 #endif//__cplusplus
6767 #if defined(HAVE_NEON)
68−void WelsNonZeroCount_neon (int8_t* pNonZeroCount);
6968 void DeblockingBSCalcEnc_neon (int8_t* pNzc, SMVUnitXY* pMv, int32_t iBoundryFlag, int32_t iMbStride,
7069 uint8_t (*pBS)[4][4]);
7170 #endif
7271 #if defined(HAVE_NEON_AARCH64)
73−void WelsNonZeroCount_AArch64_neon (int8_t* pNonZeroCount);
7472 void DeblockingBSCalcEnc_AArch64_neon (int8_t* pNzc, SMVUnitXY* pMv, int32_t iBoundryFlag, int32_t iMbStride,
7573 uint8_t (*pBS)[4][4]);
7674 #endif
@@ -79,7 +77,6 @@ void DeblockingBSCalcEnc_AArch64_neon (int8_t* pNzc, SMVUnitXY* pMv, int32_t iBo · 2 unmodified lines
7977 #endif//__cplusplus
8078 void DeblockingInit (DeblockingFunc* pFunc, int32_t iCpu);
8179
82−void WelsNonZeroCount_c (int8_t* pNonZeroCount);
8380 void WelsBlockFuncInit (PSetNoneZeroCountZeroFunc* pfSetNZCZero, int32_t iCpu);
8481
8582 void PerformDeblockingFilter (sWelsEncCtx* pEnc);
codec/encoder/core/src/deblocking.cpp+5−7
@@ -774,13 +774,6 @@ void PerformDeblockingFilter (sWelsEncCtx* pEnc) { · 773 unmodified lines
774774 }
775775 }
776776
777−void WelsNonZeroCount_c (int8_t* pNonZeroCount) {
778− int32_t i;
779−
780− for (i = 0; i < 24; i++) {
781− pNonZeroCount[i] = !!pNonZeroCount[i];
782− }
783−}
784777 void WelsBlockFuncInit (PSetNoneZeroCountZeroFunc* pfSetNZCZero, int32_t iCpu) {
785778 *pfSetNZCZero = WelsNonZeroCount_c;
786779 #ifdef HAVE_NEON
@@ -793,6 +786,11 @@ void WelsBlockFuncInit (PSetNoneZeroCountZeroFunc* pfSetNZCZero, int32_t iCpu) · 6 unmodified lines
793786 *pfSetNZCZero = WelsNonZeroCount_AArch64_neon;
794787 }
795788 #endif
789+#if defined(X86_ASM)
790+ if (iCpu & WELS_CPU_SSE2) {
791+ *pfSetNZCZero = WelsNonZeroCount_sse2;
792+ }
793+#endif
796794 }
797795
798796 void DeblockingInit (DeblockingFunc* pFunc, int32_t iCpu) {
test/decoder/DecUT_IdctResAddPred.cpp+11−7
@@ -1,7 +1,7 @@
11 #include <gtest/gtest.h>
22 #include "macros.h"
33 #include "decode_mb_aux.h"
4−#include "../../codec/decoder/core/src/decode_slice.cpp"
4+#include "deblocking.h"
55 using namespace WelsDec;
66 void IdctResAddPred_ref (uint8_t* pPred, const int32_t kiStride, int16_t* pRs) {
77 int16_t iSrc[16];
@@ -98,7 +98,7 @@ TEST(DecoderDecodeMbAux, method) \ · 90 unmodified lines
9898 {\
9999 int8_t iNonZeroCount[2][24];\
100100 for(int32_t i = 0; i < 24; i++) {\
101− iNonZeroCount[0][i] = iNonZeroCount[1][i] = (rand() % 256)-128;\
101+ iNonZeroCount[0][i] = iNonZeroCount[1][i] = (rand() % 25);\
102102 }\
103103 method(iNonZeroCount[0]);\
104104 SetNonZeroCount_ref(iNonZeroCount[1]);\
@@ -106,7 +106,7 @@ TEST(DecoderDecodeMbAux, method) \ · 1 unmodified line
106106 ASSERT_EQ (iNonZeroCount[0][i], iNonZeroCount[1][i]);\
107107 }\
108108 for(int32_t i =0; i<24; i++) {\
109− iNonZeroCount[0][i] = iNonZeroCount[1][i] = -128;\
109+ iNonZeroCount[0][i] = iNonZeroCount[1][i] = 0;\
110110 }\
111111 method(iNonZeroCount[0]);\
112112 SetNonZeroCount_ref(iNonZeroCount[1]);\
@@ -114,7 +114,7 @@ TEST(DecoderDecodeMbAux, method) \ · 1 unmodified line
114114 ASSERT_EQ (iNonZeroCount[0][i], iNonZeroCount[1][i]);\
115115 }\
116116 for(int32_t i =0; i<24; i++) {\
117− iNonZeroCount[0][i] = iNonZeroCount[1][i] = 127;\
117+ iNonZeroCount[0][i] = iNonZeroCount[1][i] = 16;\
118118 }\
119119 method(iNonZeroCount[0]);\
120120 SetNonZeroCount_ref(iNonZeroCount[1]);\
@@ -123,12 +123,16 @@ TEST(DecoderDecodeMbAux, method) \ · 2 unmodified lines
123123 }\
124124 }
125125
126−GENERATE_SETNONZEROCOUNT (SetNonZeroCount_c)
126+GENERATE_SETNONZEROCOUNT (WelsNonZeroCount_c)
127+
128+#if defined(X86_ASM)
129+GENERATE_SETNONZEROCOUNT (WelsNonZeroCount_sse2)
130+#endif
127131
128132 #if defined(HAVE_NEON)
129−GENERATE_SETNONZEROCOUNT (SetNonZeroCount_neon)
133+GENERATE_SETNONZEROCOUNT (WelsNonZeroCount_neon)
130134 #endif
131135
132136 #if defined(HAVE_NEON_AARCH64)
133−GENERATE_SETNONZEROCOUNT (SetNonZeroCount_AArch64_neon)
137+GENERATE_SETNONZEROCOUNT (WelsNonZeroCount_AArch64_neon)
134138 #endif

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