History

fix win64 float issue, enable AQ assembly

volvet committed 12 years ago

Commit 5c9f4471 parent ae027b815 files · +2088 −1642Browse files

Showing the changes to codec/processing/src (6 of 15 files). Show all

Unified · Split

6 files
  1. codec/processing/src/adaptivequantization/AdaptiveQuantization.cpp +7 −1
  2. codec/processing/src/adaptivequantization/AdaptiveQuantization.h +2 −0
  3. codec/processing/src/asm/vaa.asm +1907 −1264
  4. codec/processing/src/common/cpu.cpp +0 −196
  5. codec/processing/src/common/cpu.h +0 −102
  6. codec/processing/src/vaacalc/vaacalculation.cpp +5 −5
codec/processing/src/adaptivequantization/AdaptiveQuantization.cpp+7−1
@@ -50,9 +50,11 @@ CAdaptiveQuantization::CAdaptiveQuantization (int32_t iCpuFlag) { · 49 unmodified lines
5050 m_pfVar = NULL;
5151 WelsMemset (&m_sAdaptiveQuantParam, 0, sizeof (m_sAdaptiveQuantParam));
5252 WelsInitVarFunc (m_pfVar, m_CPUFlag);
53+ XMMREG_PROTECT_INIT(AdaptiveQuantization);
5354 }
5455
5556 CAdaptiveQuantization::~CAdaptiveQuantization() {
57+ XMMREG_PROTECT_UNINIT(AdaptiveQuantization);
5658 }
5759
5860 EResult CAdaptiveQuantization::Process (int32_t iType, SPixMap* pSrcPixMap, SPixMap* pRefPixMap) {
@@ -101,6 +103,7 @@ EResult CAdaptiveQuantization::Process (int32_t iType, SPixMap* pSrcPixMap, SPix · 42 unmodified lines
101103 pRefFrameTmp = pRefFrameY;
102104 pCurFrameTmp = pCurFrameY;
103105 for (i = 0; i < iMbWidth; i++) {
106+ XMMREG_PROTECT_STORE(AdaptiveQuantization);
104107 iSumDiff = pVaaCalcResults->pSad8x8[iMbIndex][0];
105108 iSumDiff += pVaaCalcResults->pSad8x8[iMbIndex][1];
106109 iSumDiff += pVaaCalcResults->pSad8x8[iMbIndex][2];
@@ -109,6 +112,7 @@ EResult CAdaptiveQuantization::Process (int32_t iType, SPixMap* pSrcPixMap, SPix · 2 unmodified lines
109112 iSQDiff = pVaaCalcResults->pSsd16x16[iMbIndex];
110113 uiSum = pVaaCalcResults->pSum16x16[iMbIndex];
111114 iSQSum = pVaaCalcResults->pSumOfSquare16x16[iMbIndex];
115+ XMMREG_PROTECT_LOAD(AdaptiveQuantization);
112116
113117 iSumDiff = iSumDiff >> 8;
114118 pMotionTexture->uiMotionIndex = (iSQDiff >> 8) - (iSumDiff * iSumDiff);
@@ -131,7 +135,9 @@ EResult CAdaptiveQuantization::Process (int32_t iType, SPixMap* pSrcPixMap, SPix · 16 unmodified lines
131135 pRefFrameTmp = pRefFrameY;
132136 pCurFrameTmp = pCurFrameY;
133137 for (i = 0; i < iMbWidth; i++) {
138+ XMMREG_PROTECT_STORE(AdaptiveQuantization);
134139 m_pfVar (pRefFrameTmp, iRefStride, pCurFrameTmp, iCurStride, pMotionTexture);
140+ XMMREG_PROTECT_LOAD(AdaptiveQuantization);
135141 dAverageMotionIndex += pMotionTexture->uiMotionIndex;
136142 dAverageTextureIndex += pMotionTexture->uiTextureIndex;
137143 pMotionTexture++;
@@ -223,7 +229,7 @@ void CAdaptiveQuantization::WelsInitVarFunc (PVarFunc& pfVar, int32_t iCpuFlag) · 85 unmodified lines
223229
224230 #ifdef X86_ASM
225231 if (iCpuFlag & WELS_CPU_SSE2) {
226− // pfVar = SampleVariance16x16_sse2;
232+ pfVar = SampleVariance16x16_sse2;
227233 }
228234 #endif
229235 }
codec/processing/src/adaptivequantization/AdaptiveQuantization.h+2−0
@@ -45,6 +45,7 @@ · 44 unmodified lines
4545 #include "../common/memory.h"
4646 #include "../common/WelsFrameWork.h"
4747 #include "../../interface/IWelsVP.h"
48+#include "cpu.h"
4849
4950 WELSVP_NAMESPACE_BEGIN
5051
@@ -78,6 +79,7 @@ class CAdaptiveQuantization : public IStrategy { · 27 unmodified lines
7879 PVarFunc m_pfVar;
7980 int32_t m_CPUFlag;
8081 SAdaptiveQuantizationParam m_sAdaptiveQuantParam;
82+ XMMREG_PROTECT_DECLARE(AdaptiveQuantization);
8183 };
8284
8385 WELSVP_NAMESPACE_END
codec/processing/src/asm/vaa.asm+1907−1264
@@ -29,291 +29,211 @@ · 28 unmodified lines
2929 ;* POSSIBILITY OF SUCH DAMAGE.
3030 ;*
3131 ;*
32−;* vaa.asm
32+;* vaa.asm
3333 ;*
34−;* Abstract
34+;* Abstract
3535 ;* sse2 for pVaa routines
3636 ;*
3737 ;* History
38−;* 04/14/2010 Created
38+;* 04/14/2010 Created
39+;* 06/07/2010 Added AnalysisVaaInfoIntra_sse2(ssse3)
40+;* 06/10/2010 Tune rc_sad_frame_sse2 and got about 40% improvement
41+;* 08/11/2010 Added abs_difference_mbrow_sse2 & sum_sqrsum_mbrow_sse2
3942 ;*
4043 ;*************************************************************************/
4144 %include "asm_inc.asm"
42−%ifdef X86_32
45+
46+
4347 ;***********************************************************************
4448 ; Macros and other preprocessor constants
4549 ;***********************************************************************
46−
47−;%macro SUM_SSE2 4 ; dst, pSrc, zero, pack1_8x2
48−; movdqa %1, %2
49−; punpcklbw %1, %3
50−; punpckhbw %2, %3
51−; paddw %1, %2
52−; pmaddwd %1, %4
53−; pshufd %2, %1, 04Eh ; 01001110 B
54−; paddd %1, %2
55−; pshufd %2, %1, 0B1h ; 10110001 B
56−; paddd %1, %2
57−;%endmacro ; END OF SUM_SSE2
58−
59−; by comparing it outperforms than phaddw(SSSE3) sets
60−%macro SUM_WORD_8x2_SSE2 2 ; dst(pSrc), tmp
61− ; @sum_8x2 begin
62− pshufd %2, %1, 04Eh ; 01001110 B
63− paddw %1, %2
64− pshuflw %2, %1, 04Eh ; 01001110 B
65− paddw %1, %2
66− pshuflw %2, %1, 0B1h ; 10110001 B
67− paddw %1, %2
68− ; end of @sum_8x2
69−%endmacro ; END of SUM_WORD_8x2_SSE2
70−
71−%macro SUM_SQR_SSE2 3 ; dst, pSrc, zero
72− movdqa %1, %2
73− punpcklbw %1, %3
74− punpckhbw %2, %3
75− pmaddwd %1, %1
76− pmaddwd %2, %2
77− paddd %1, %2
78− pshufd %2, %1, 04Eh ; 01001110 B
79− paddd %1, %2
80− pshufd %2, %1, 0B1h ; 10110001 B
81− paddd %1, %2
82−%endmacro ; END OF SUM_SQR_SSE2
83−
84−%macro VAA_AVG_BLOCK_SSE2 6 ; dst, t0, t1, t2, t3, t4
85− movdqa %1, [esi ] ; line 0
86− movdqa %2, [esi+ecx] ; line 1
87− movdqa %3, %1
88− punpcklbw %1, xmm7
89− punpckhbw %3, xmm7
90− movdqa %4, %2
91− punpcklbw %4, xmm7
92− punpckhbw %2, xmm7
93− paddw %1, %4
94− paddw %2, %3
95− movdqa %3, [esi+ebx] ; line 2
96− movdqa %4, [esi+edx] ; line 3
97− movdqa %5, %3
98− punpcklbw %3, xmm7
99− punpckhbw %5, xmm7
100− movdqa %6, %4
101− punpcklbw %6, xmm7
102− punpckhbw %4, xmm7
103− paddw %3, %6
104− paddw %4, %5
105− paddw %1, %3 ; block 0, 1
106− paddw %2, %4 ; block 2, 3
107− pshufd %3, %1, 0B1h
108− pshufd %4, %2, 0B1h
109− paddw %1, %3
110− paddw %2, %4
111− movdqa %3, %1
112− movdqa %4, %2
113− pshuflw %5, %1, 0B1h
114− pshufhw %6, %3, 0B1h
115− paddw %1, %5
116− paddw %3, %6
117− pshuflw %5, %2, 0B1h
118− pshufhw %6, %4, 0B1h
119− paddw %2, %5
120− paddw %4, %6
121− punpcklwd %1, %2
122− punpckhwd %3, %4
123− punpcklwd %1, %3
124− psraw %1, $04
50+%macro SUM_SQR_SSE2 3 ; dst, pSrc, zero
51+ movdqa %1, %2
52+ punpcklbw %1, %3
53+ punpckhbw %2, %3
54+ pmaddwd %1, %1
55+ pmaddwd %2, %2
56+ paddd %1, %2
57+ pshufd %2, %1, 04Eh ; 01001110 B
58+ paddd %1, %2
59+ pshufd %2, %1, 0B1h ; 10110001 B
60+ paddd %1, %2
61+%endmacro ; END OF SUM_SQR_SSE2
62+
63+%macro WELS_SAD_16x2_SSE2 3 ;esi :%1 edi:%2 ebx:%3
64+ movdqa xmm1, [%1]
65+ movdqa xmm2, [%2]
66+ movdqa xmm3, [%1+%3]
67+ movdqa xmm4, [%2+%3]
68+ psadbw xmm1, xmm2
69+ psadbw xmm3, xmm4
70+ paddd xmm6, xmm1
71+ paddd xmm6, xmm3
72+ lea %1, [%1+%3*2]
73+ lea %2, [%2+%3*2]
12574 %endmacro
12675
127−%macro VAA_AVG_BLOCK_SSSE3 6 ; dst, t0, t1, t2, t3, t4
128− movdqa %1, [esi ] ; line 0
129− movdqa %2, [esi+ecx] ; line 1
130− movdqa %3, %1
131− punpcklbw %1, xmm7
132− punpckhbw %3, xmm7
133− movdqa %4, %2
134− punpcklbw %4, xmm7
135− punpckhbw %2, xmm7
136− paddw %1, %4
137− paddw %2, %3
138− movdqa %3, [esi+ebx] ; line 2
139− movdqa %4, [esi+edx] ; line 3
140− movdqa %5, %3
141− punpcklbw %3, xmm7
142− punpckhbw %5, xmm7
143− movdqa %6, %4
144− punpcklbw %6, xmm7
145− punpckhbw %4, xmm7
146− paddw %3, %6
147− paddw %4, %5
148− paddw %1, %3 ; block 0, 1
149− paddw %2, %4 ; block 2, 3
150− phaddw %1, %2 ; block[0]: 0-15, 16-31; block[1]: 32-47, 48-63; ..
151− phaddw %1, xmm7 ; block[0]: 0-15; block[1]: 16-31; block[2]: 32-47; block[3]: 48-63; ....
152− psraw %1, $04
153−%endmacro
154−
155−%macro WELS_SAD_16x2_SSE2 0
156− movdqa xmm1, [esi]
157− movdqa xmm2, [edi]
158− movdqa xmm3, [esi+ebx]
159− movdqa xmm4, [edi+ebx]
160− psadbw xmm1, xmm2
161− psadbw xmm3, xmm4
162− paddd xmm6, xmm1
163− paddd xmm6, xmm3
164− lea esi, [esi+ebx*2]
165− lea edi, [edi+ebx*2]
166−%endmacro
167−
168−%macro WELS_SAD_SUM_SQSUM_16x1_SSE2 0
169− movdqa xmm1, [esi]
170− movdqa xmm2, [edi]
171− movdqa xmm3, xmm1
172− psadbw xmm3, xmm2
173− paddd xmm6, xmm3
174−
175− movdqa xmm3, xmm1
176− psadbw xmm3, xmm0
177− paddd xmm5, xmm3
178−
179− movdqa xmm2, xmm1
180− punpcklbw xmm1, xmm0
181− punpckhbw xmm2, xmm0
182− pmaddwd xmm1, xmm1
183− pmaddwd xmm2, xmm2
184− paddd xmm4, xmm1
185− paddd xmm4, xmm2
186−
187− add esi, ebx
188− add edi, ebx
76+; by comparing it outperforms than phaddw(SSSE3) sets
77+%macro SUM_WORD_8x2_SSE2 2 ; dst(pSrc), tmp
78+ ; @sum_8x2 begin
79+ pshufd %2, %1, 04Eh ; 01001110 B
80+ paddw %1, %2
81+ pshuflw %2, %1, 04Eh ; 01001110 B
82+ paddw %1, %2
83+ pshuflw %2, %1, 0B1h ; 10110001 B
84+ paddw %1, %2
85+ ; end of @sum_8x2
86+%endmacro ; END of SUM_WORD_8x2_SSE2
87+
88+%macro WELS_SAD_SUM_SQSUM_16x1_SSE2 3 ;esi:%1,edi:%2,ebx:%3
89+ movdqa xmm1, [%1]
90+ movdqa xmm2, [%2]
91+ movdqa xmm3, xmm1
92+ psadbw xmm3, xmm2
93+ paddd xmm6, xmm3
94+
95+ movdqa xmm3, xmm1
96+ psadbw xmm3, xmm0
97+ paddd xmm5, xmm3
98+
99+ movdqa xmm2, xmm1
100+ punpcklbw xmm1, xmm0
101+ punpckhbw xmm2, xmm0
102+ pmaddwd xmm1, xmm1
103+ pmaddwd xmm2, xmm2
104+ paddd xmm4, xmm1
105+ paddd xmm4, xmm2
106+
107+ add %1, %3
108+ add %2, %3
189109 %endmacro
190110
191−%macro WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 0
192− movdqa xmm1, [esi]
193− movdqa xmm2, [edi]
194− movdqa xmm3, xmm1
195− psadbw xmm3, xmm2
196− paddd xmm7, xmm3 ; sad
197−
198− movdqa xmm3, xmm1
199− pmaxub xmm3, xmm2
200− pminub xmm2, xmm1
201− psubb xmm3, xmm2 ; diff
202−
203− movdqa xmm2, xmm1
204− psadbw xmm2, xmm0
205− paddd xmm6, xmm2 ; sum
206−
207− movdqa xmm2, xmm1
208− punpcklbw xmm1, xmm0
209− punpckhbw xmm2, xmm0
210− pmaddwd xmm1, xmm1
211− pmaddwd xmm2, xmm2
212− paddd xmm5, xmm1
213− paddd xmm5, xmm2 ; sqsum
214−
215− movdqa xmm1, xmm3
216− punpcklbw xmm1, xmm0
217− punpckhbw xmm3, xmm0
218− pmaddwd xmm1, xmm1
219− pmaddwd xmm3, xmm3
220− paddd xmm4, xmm1
221− paddd xmm4, xmm3 ; sqdiff
222−
223− add esi, ebx
224− add edi, ebx
111+%macro WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 3 ;esi:%1 edi:%2 ebx:%3
112+ movdqa xmm1, [%1]
113+ movdqa xmm2, [%2]
114+ movdqa xmm3, xmm1
115+ psadbw xmm3, xmm2
116+ paddd xmm7, xmm3 ; sad
117+
118+ movdqa xmm3, xmm1
119+ pmaxub xmm3, xmm2
120+ pminub xmm2, xmm1
121+ psubb xmm3, xmm2 ; diff
122+
123+ movdqa xmm2, xmm1
124+ psadbw xmm2, xmm0
125+ paddd xmm6, xmm2 ; sum
126+
127+ movdqa xmm2, xmm1
128+ punpcklbw xmm1, xmm0
129+ punpckhbw xmm2, xmm0
130+ pmaddwd xmm1, xmm1
131+ pmaddwd xmm2, xmm2
132+ paddd xmm5, xmm1
133+ paddd xmm5, xmm2 ; sqsum
134+
135+ movdqa xmm1, xmm3
136+ punpcklbw xmm1, xmm0
137+ punpckhbw xmm3, xmm0
138+ pmaddwd xmm1, xmm1
139+ pmaddwd xmm3, xmm3
140+ paddd xmm4, xmm1
141+ paddd xmm4, xmm3 ; sqdiff
142+
143+ add %1, %3
144+ add %2, %3
225145 %endmacro
226146
227−%macro WELS_SAD_SD_MAD_16x1_SSE2 4
228−%define sad_reg %1
229−%define sum_cur_reg %2
230−%define sum_ref_reg %3
231−%define mad_reg %4
232− movdqa xmm1, [esi]
233− movdqa xmm2, [edi]
234− movdqa xmm3, xmm1
235− psadbw xmm3, xmm0
236− paddd sum_cur_reg, xmm3 ; sum_cur
237− movdqa xmm3, xmm2
238− psadbw xmm3, xmm0
239− paddd sum_ref_reg, xmm3 ; sum_ref
240−
241− movdqa xmm3, xmm1
242− pmaxub xmm3, xmm2
243− pminub xmm2, xmm1
244− psubb xmm3, xmm2 ; abs diff
245− pmaxub mad_reg, xmm3 ; max abs diff
246−
247− psadbw xmm3, xmm0
248− paddd sad_reg, xmm3 ; sad
249−
250− add esi, ebx
251− add edi, ebx
147+%macro WELS_SAD_SD_MAD_16x1_SSE2 7 ;esi:%5 edi:%6 ebx:%7
148+%define sad_reg %1
149+%define sum_cur_reg %2
150+%define sum_ref_reg %3
151+%define mad_reg %4
152+ movdqa xmm1, [%5]
153+ movdqa xmm2, [%6]
154+ movdqa xmm3, xmm1
155+ psadbw xmm3, xmm0
156+ paddd sum_cur_reg, xmm3 ; sum_cur
157+ movdqa xmm3, xmm2
158+ psadbw xmm3, xmm0
159+ paddd sum_ref_reg, xmm3 ; sum_ref
160+
161+ movdqa xmm3, xmm1
162+ pmaxub xmm3, xmm2
163+ pminub xmm2, xmm1
164+ psubb xmm3, xmm2 ; abs diff
165+ pmaxub mad_reg, xmm3 ; max abs diff
166+
167+ psadbw xmm3, xmm0
168+ paddd sad_reg, xmm3 ; sad
169+
170+ add %5, %7
171+ add %6, %7
252172 %endmacro
253173
254174
255−%macro WELS_MAX_REG_SSE2 1 ; xmm1, xmm2, xmm3 can be used
175+%macro WELS_MAX_REG_SSE2 1 ; xmm1, xmm2, xmm3 can be used
256176 %define max_reg %1
257− movdqa xmm1, max_reg
258− psrldq xmm1, 4
259− pmaxub max_reg, xmm1
260− movdqa xmm1, max_reg
261− psrldq xmm1, 2
262− pmaxub max_reg, xmm1
263− movdqa xmm1, max_reg
264− psrldq xmm1, 1
265− pmaxub max_reg, xmm1
177+ movdqa xmm1, max_reg
178+ psrldq xmm1, 4
179+ pmaxub max_reg, xmm1
180+ movdqa xmm1, max_reg
181+ psrldq xmm1, 2
182+ pmaxub max_reg, xmm1
183+ movdqa xmm1, max_reg
184+ psrldq xmm1, 1
185+ pmaxub max_reg, xmm1
266186 %endmacro
267187
268−%macro WELS_SAD_BGD_SQDIFF_16x1_SSE2 4
269−%define sad_reg %1
270−%define sum_reg %2
271−%define mad_reg %3
272−%define sqdiff_reg %4
273− movdqa xmm1, [esi]
274− movdqa xmm2, xmm1
275− movdqa xmm3, xmm1
276− punpcklbw xmm2, xmm0
277− punpckhbw xmm3, xmm0
278− pmaddwd xmm2, xmm2
279− pmaddwd xmm3, xmm3
280− paddd xmm2, xmm3
281− movdqa xmm3, xmm2
282− psllq xmm2, 32
283− psrlq xmm3, 32
284− psllq xmm3, 32
285− paddd xmm2, xmm3
286− paddd sad_reg, xmm2 ; sqsum
287−
288− movdqa xmm2, [edi]
289− movdqa xmm3, xmm1
290− psadbw xmm3, xmm0
291− paddd sum_reg, xmm3 ; sum_cur
292− movdqa xmm3, xmm2
293− psadbw xmm3, xmm0
294− pslldq xmm3, 4
295− paddd sum_reg, xmm3 ; sum_ref
296−
297− movdqa xmm3, xmm1
298− pmaxub xmm3, xmm2
299− pminub xmm2, xmm1
300− psubb xmm3, xmm2 ; abs diff
301− pmaxub mad_reg, xmm3 ; max abs diff
302−
303− movdqa xmm1, xmm3
304− psadbw xmm3, xmm0
305− paddd sad_reg, xmm3 ; sad
306−
307− movdqa xmm3, xmm1
308− punpcklbw xmm1, xmm0
309− punpckhbw xmm3, xmm0
310− pmaddwd xmm1, xmm1
311− pmaddwd xmm3, xmm3
312− paddd sqdiff_reg, xmm1
313− paddd sqdiff_reg, xmm3 ; sqdiff
314−
315− add esi, ebx
316− add edi, ebx
188+%macro WELS_SAD_BGD_SQDIFF_16x1_SSE2 7 ;esi:%5 edi:%6 ebx:%7
189+%define sad_reg %1
190+%define sum_reg %2
191+%define mad_reg %3
192+%define sqdiff_reg %4
193+ movdqa xmm1, [%5]
194+ movdqa xmm2, xmm1
195+ movdqa xmm3, xmm1
196+ punpcklbw xmm2, xmm0
197+ punpckhbw xmm3, xmm0
198+ pmaddwd xmm2, xmm2
199+ pmaddwd xmm3, xmm3
200+ paddd xmm2, xmm3
201+ movdqa xmm3, xmm2
202+ psllq xmm2, 32
203+ psrlq xmm3, 32
204+ psllq xmm3, 32
205+ paddd xmm2, xmm3
206+ paddd sad_reg, xmm2 ; sqsum
207+
208+ movdqa xmm2, [%6]
209+ movdqa xmm3, xmm1
210+ psadbw xmm3, xmm0
211+ paddd sum_reg, xmm3 ; sum_cur
212+ movdqa xmm3, xmm2
213+ psadbw xmm3, xmm0
214+ pslldq xmm3, 4
215+ paddd sum_reg, xmm3 ; sum_ref
216+
217+ movdqa xmm3, xmm1
218+ pmaxub xmm3, xmm2
219+ pminub xmm2, xmm1
220+ psubb xmm3, xmm2 ; abs diff
221+ pmaxub mad_reg, xmm3 ; max abs diff
222+
223+ movdqa xmm1, xmm3
224+ psadbw xmm3, xmm0
225+ paddd sad_reg, xmm3 ; sad
226+
227+ movdqa xmm3, xmm1
228+ punpcklbw xmm1, xmm0
229+ punpckhbw xmm3, xmm0
230+ pmaddwd xmm1, xmm1
231+ pmaddwd xmm3, xmm3
232+ paddd sqdiff_reg, xmm1
233+ paddd sqdiff_reg, xmm3 ; sqdiff
234+
235+ add %5, %7
236+ add %6, %7
317237 %endmacro
318238
319239
@@ -325,7 +245,7 @@ · 5 unmodified lines
325245
326246 ;ALIGN 16
327247 ;pack1_8x2:
328−; dw 1, 1, 1, 1, 1, 1, 1, 1
248+; dw 1, 1, 1, 1, 1, 1, 1, 1
329249
330250 ;***********************************************************************
331251 ; Code
@@ -333,1082 +253,1805 @@ · 1 unmodified line
333253
334254 SECTION .text
335255
336−WELS_EXTERN rc_sad_frame_sse2
337−;***********************************************************************
338−; uint32_t rc_sad_frame_sse2( uint8_t *ref_orig, uint8_t *cur_orig, const int mb_width, const int iPicHeight, const int iPicStride );
339−;***********************************************************************
340−ALIGN 16
341−rc_sad_frame_sse2:
342− push esi
343− push edi
344− push ebp
345− push ebx
346− push edx
347−
348− mov esi, [esp+24]
349− mov edi, [esp+28]
350− mov ebx, [esp+32]
351− mov ecx, [esp+36]
352− mov edx, [esp+40]
353− pxor xmm0, xmm0
354−.hloop:
355− mov eax, ebx
356− mov ebp, $00
357−.wloop:
358− movdqa xmm1, [esi+ebp]
359− movdqa xmm2, [edi+ebp]
360− psadbw xmm1, xmm2
361− pshufd xmm2, xmm1, 0f6h ; 11110110 B ; movhlps for float
362− paddd xmm1, xmm2
363− paddd xmm0, xmm1
364− add ebp, 010h
365− dec eax
366− jnz near .wloop
367− lea esi, [esi+edx]
368− lea edi, [edi+edx]
369− dec ecx
370− jnz near .hloop
371−
372− movd eax, xmm0
373− pop edx
374− pop ebx
375− pop ebp
376− pop edi
377− pop esi
378− ret
379−
256+%ifdef X86_32
380257
381258 WELS_EXTERN SampleVariance16x16_sse2
382259 ;***********************************************************************
383−; void SampleVariance16x16_sse2( uint8_t * y_ref, int32_t y_ref_stride, uint8_t * y_src, int32_t y_src_stride,SMotionTextureUnit* pMotionTexture );
260+; void SampleVariance16x16_sse2( uint8_t * y_ref, int32_t y_ref_stride, uint8_t * y_src, int32_t y_src_stride,SMotionTextureUnit* pMotionTexture );
384261 ;***********************************************************************
385262 ALIGN 16
386263 SampleVariance16x16_sse2:
387− push esi
388− push edi
389− push ebx
390−
391− sub esp, 16
392− %define SUM [esp]
393− %define SUM_CUR [esp+4]
394− %define SQR [esp+8]
395− %define SQR_CUR [esp+12]
396− %define PUSH_SIZE 28 ; 12 + 16
397−
398− mov edi, [esp+PUSH_SIZE+4] ; y_ref
399− mov edx, [esp+PUSH_SIZE+8] ; y_ref_stride
400− mov esi, [esp+PUSH_SIZE+12] ; y_src
401− mov eax, [esp+PUSH_SIZE+16] ; y_src_stride
402− mov ecx, 010h ; height = 16
403−
404− pxor xmm7, xmm7
405− movdqu SUM, xmm7
264+ push esi
265+ push edi
266+ push ebx
267+
268+ sub esp, 16
269+ %define SUM [esp]
270+ %define SUM_CUR [esp+4]
271+ %define SQR [esp+8]
272+ %define SQR_CUR [esp+12]
273+ %define PUSH_SIZE 28 ; 12 + 16
274+
275+ mov edi, [esp+PUSH_SIZE+4] ; y_ref
276+ mov edx, [esp+PUSH_SIZE+8] ; y_ref_stride
277+ mov esi, [esp+PUSH_SIZE+12] ; y_src
278+ mov eax, [esp+PUSH_SIZE+16] ; y_src_stride
279+ mov ecx, 010h ; height = 16
280+
281+ pxor xmm7, xmm7
282+ movdqu SUM, xmm7
406283
407284 .hloops:
408− movdqa xmm0, [edi] ; y_ref
409− movdqa xmm1, [esi] ; y_src
410− movdqa xmm2, xmm0 ; store first for future process
411− movdqa xmm3, xmm1
412− ; sum += diff;
413− movdqa xmm4, xmm0
414− psadbw xmm4, xmm1 ; 2 parts, [0,..,15], [64,..,79]
415− ; to be continued for sum
416− pshufd xmm5, xmm4, 0C6h ; 11000110 B
417− paddw xmm4, xmm5
418− movd ebx, xmm4
419− add SUM, ebx
420−
421− ; sqr += diff * diff;
422− pmaxub xmm0, xmm1
423− pminub xmm1, xmm2
424− psubb xmm0, xmm1 ; diff
425− SUM_SQR_SSE2 xmm1, xmm0, xmm7 ; dst, pSrc, zero
426− movd ebx, xmm1
427− add SQR, ebx
428−
429− ; sum_cur += y_src[x];
430− movdqa xmm0, xmm3 ; cur_orig
431− movdqa xmm1, xmm0
432− punpcklbw xmm0, xmm7
433− punpckhbw xmm1, xmm7
434− paddw xmm0, xmm1 ; 8x2
435− SUM_WORD_8x2_SSE2 xmm0, xmm1
436− movd ebx, xmm0
437− and ebx, 0ffffh
438− add SUM_CUR, ebx
439−
440− ; sqr_cur += y_src[x] * y_src[x];
441− SUM_SQR_SSE2 xmm0, xmm3, xmm7 ; dst, pSrc, zero
442− movd ebx, xmm0
443− add SQR_CUR, ebx
444−
445− lea edi, [edi+edx]
446− lea esi, [esi+eax]
447− dec ecx
448− jnz near .hloops
449−
450− mov ebx, 0
451− mov bx, word SUM
452− sar ebx, 8
453− imul ebx, ebx
454− mov ecx, SQR
455− sar ecx, 8
456− sub ecx, ebx
457− mov edi, [esp+PUSH_SIZE+20] ; pMotionTexture
458− mov [edi], cx ; to store uiMotionIndex
459− mov ebx, 0
460− mov bx, word SUM_CUR
461− sar ebx, 8
462− imul ebx, ebx
463− mov ecx, SQR_CUR
464− sar ecx, 8
465− sub ecx, ebx
466− mov [edi+2], cx ; to store uiTextureIndex
467−
468− %undef SUM
469− %undef SUM_CUR
470− %undef SQR
471− %undef SQR_CUR
472− %undef PUSH_SIZE
473−
474− add esp, 16
475− pop ebx
476− pop edi
477− pop esi
478−
479− ret
480−
481−; , 6/7/2010
482−
483−
484−WELS_EXTERN abs_difference_mbrow_sse2
285+ movdqa xmm0, [edi] ; y_ref
286+ movdqa xmm1, [esi] ; y_src
287+ movdqa xmm2, xmm0 ; store first for future process
288+ movdqa xmm3, xmm1
289+ ; sum += diff;
290+ movdqa xmm4, xmm0
291+ psadbw xmm4, xmm1 ; 2 parts, [0,..,15], [64,..,79]
292+ ; to be continued for sum
293+ pshufd xmm5, xmm4, 0C6h ; 11000110 B
294+ paddw xmm4, xmm5
295+ movd ebx, xmm4
296+ add SUM, ebx
297+
298+ ; sqr += diff * diff;
299+ pmaxub xmm0, xmm1
300+ pminub xmm1, xmm2
301+ psubb xmm0, xmm1 ; diff
302+ SUM_SQR_SSE2 xmm1, xmm0, xmm7 ; dst, pSrc, zero
303+ movd ebx, xmm1
304+ add SQR, ebx
305+
306+ ; sum_cur += y_src[x];
307+ movdqa xmm0, xmm3 ; cur_orig
308+ movdqa xmm1, xmm0
309+ punpcklbw xmm0, xmm7
310+ punpckhbw xmm1, xmm7
311+ paddw xmm0, xmm1 ; 8x2
312+ SUM_WORD_8x2_SSE2 xmm0, xmm1
313+ movd ebx, xmm0
314+ and ebx, 0ffffh
315+ add SUM_CUR, ebx
316+
317+ ; sqr_cur += y_src[x] * y_src[x];
318+ SUM_SQR_SSE2 xmm0, xmm3, xmm7 ; dst, pSrc, zero
319+ movd ebx, xmm0
320+ add SQR_CUR, ebx
321+
322+ lea edi, [edi+edx]
323+ lea esi, [esi+eax]
324+ dec ecx
325+ jnz near .hloops
326+
327+ mov ebx, 0
328+ mov bx, word SUM
329+ sar ebx, 8
330+ imul ebx, ebx
331+ mov ecx, SQR
332+ sar ecx, 8
333+ sub ecx, ebx
334+ mov edi, [esp+PUSH_SIZE+20] ; pMotionTexture
335+ mov [edi], cx ; to store uiMotionIndex
336+ mov ebx, 0
337+ mov bx, word SUM_CUR
338+ sar ebx, 8
339+ imul ebx, ebx
340+ mov ecx, SQR_CUR
341+ sar ecx, 8
342+ sub ecx, ebx
343+ mov [edi+2], cx ; to store uiTextureIndex
344+
345+ %undef SUM
346+ %undef SUM_CUR
347+ %undef SQR
348+ %undef SQR_CUR
349+ %undef PUSH_SIZE
350+
351+ add esp, 16
352+ pop ebx
353+ pop edi
354+ pop esi
355+
356+ ret
357+
358+
359+
360+WELS_EXTERN VAACalcSad_sse2
485361 ;*************************************************************************************************************
486−;void abs_difference_mbrow_sse2( uint8_t *ref_orig, uint8_t *cur_orig, int32_t iPicStride,
487−; int32_t gom_pixel_num, int32_t *pSum)
362+;void VAACalcSad_sse2( uint8_t *cur_data, uint8_t *ref_data, int32_t iPicWidth, int32_t iPicHeight
363+; int32_t iPicStride, int32_t *psadframe, int32_t *psad8x8)
488364 ;*************************************************************************************************************
365+
366+
489367 ALIGN 16
490−abs_difference_mbrow_sse2:
491−%define ref_orig esp + pushsize + 4
492−%define cur_orig esp + pushsize + 8
493−%define iPicStride esp + pushsize + 12
494−%define gom_pixel_num esp + pushsize + 16
495−%define pSum esp + pushsize + 20
496−%define pushsize 12
497− push esi
498− push edi
499− push ebx
500− mov esi, [ref_orig]
501− mov edi, [cur_orig]
502− mov ebx, [iPicStride]
503− mov eax, [gom_pixel_num]
504− mov ecx, 16 ;MB_WIDTH_LUMA
505− pxor xmm0, xmm0
506−mb_width_loop_p:
507− mov edx, esi
508− add edx, eax ; end address
509−gom_row_loop_p:
510− movdqa xmm1, [esi]
511− movdqa xmm2, [edi]
512− psadbw xmm1, xmm2
513− paddd xmm0, xmm1
514− add esi, 16
515− add edi, 16
516− cmp esi, edx
517− jl gom_row_loop_p
518−
519− sub esi, eax
520− sub edi, eax
521− add esi, ebx
522− add edi, ebx
523− loop mb_width_loop_p
524−
525− movdqa xmm1, xmm0
526− psrldq xmm1, 8
527− paddd xmm1, xmm0
528− movd eax, xmm1
529− mov edx, [pSum] ; pSum
530− add [edx], eax
531−
532−%undef ref_orig
533−%undef cur_orig
534−%undef iPicStride
535−%undef gom_pixel_num
536−%undef pSum
537−%undef pushsize
538− pop ebx
539− pop edi
540− pop esi
541− ret
542−
543−
544−
545−
546−WELS_EXTERN sum_sqrsum_mbrow_sse2
547−;*************************************************************************************************************
548−;void sum_sqrsum_mbrow_sse2( uint8_t *cur_orig, int32_t iPicStride,
549−; int32_t gom_pixel_num, int32_t *pSum, int32_t *pSqrSum)
550−;*************************************************************************************************************
368+VAACalcSad_sse2:
369+%define cur_data esp + pushsize + 4
370+%define ref_data esp + pushsize + 8
371+%define iPicWidth esp + pushsize + 12
372+%define iPicHeight esp + pushsize + 16
373+%define iPicStride esp + pushsize + 20
374+%define psadframe esp + pushsize + 24
375+%define psad8x8 esp + pushsize + 28
376+%define pushsize 12
377+ push esi
378+ push edi
379+ push ebx
380+ mov esi, [cur_data]
381+ mov edi, [ref_data]
382+ mov ebx, [iPicStride]
383+ mov edx, [psad8x8]
384+ mov eax, ebx
385+
386+ shr dword [iPicWidth], 4 ; iPicWidth/16
387+ shr dword [iPicHeight], 4 ; iPicHeight/16
388+ shl eax, 4 ; iPicStride*16
389+ pxor xmm0, xmm0
390+ pxor xmm7, xmm7 ; iFrameSad
391+height_loop:
392+ mov ecx, dword [iPicWidth]
393+ push esi
394+ push edi
395+width_loop:
396+ pxor xmm6, xmm6 ;
397+ WELS_SAD_16x2_SSE2 esi,edi,ebx
398+ WELS_SAD_16x2_SSE2 esi,edi,ebx
399+ WELS_SAD_16x2_SSE2 esi,edi,ebx
400+ WELS_SAD_16x2_SSE2 esi,edi,ebx
401+ paddd xmm7, xmm6
402+ movd [edx], xmm6
403+ psrldq xmm6, 8
404+ movd [edx+4], xmm6
405+
406+ pxor xmm6, xmm6
407+ WELS_SAD_16x2_SSE2 esi,edi,ebx
408+ WELS_SAD_16x2_SSE2 esi,edi,ebx
409+ WELS_SAD_16x2_SSE2 esi,edi,ebx
410+ WELS_SAD_16x2_SSE2 esi,edi,ebx
411+ paddd xmm7, xmm6
412+ movd [edx+8], xmm6
413+ psrldq xmm6, 8
414+ movd [edx+12], xmm6
415+
416+ add edx, 16
417+ sub esi, eax
418+ sub edi, eax
419+ add esi, 16
420+ add edi, 16
421+
422+ dec ecx
423+ jnz width_loop
424+
425+ pop edi
426+ pop esi
427+ add esi, eax
428+ add edi, eax
429+
430+ dec dword [iPicHeight]
431+ jnz height_loop
432+
433+ mov edx, [psadframe]
434+ movdqa xmm5, xmm7
435+ psrldq xmm7, 8
436+ paddd xmm7, xmm5
437+ movd [edx], xmm7
438+
439+%undef cur_data
440+%undef ref_data
441+%undef iPicWidth
442+%undef iPicHeight
443+%undef iPicStride
444+%undef psadframe
445+%undef psad8x8
446+%undef pushsize
447+ pop ebx
448+ pop edi
449+ pop esi
450+ ret
451+
452+%else ;64-bit
453+
454+WELS_EXTERN SampleVariance16x16_sse2
455+;***********************************************************************
456+; void SampleVariance16x16_sse2( uint8_t * y_ref, int32_t y_ref_stride, uint8_t * y_src, int32_t y_src_stride,SMotionTextureUnit* pMotionTexture );
457+;***********************************************************************
551458 ALIGN 16
552−sum_sqrsum_mbrow_sse2:
553−%define cur_orig esp + pushsize + 4
554−%define iPicStride esp + pushsize + 8
555−%define gom_pixel_num esp + pushsize + 12
556−%define pSum esp + pushsize + 16
557−%define pSqrSum esp + pushsize + 20
558−%define pushsize 8
559− push esi
560− push ebx
561− mov esi, [cur_orig]
562− mov eax, [gom_pixel_num]
563− mov ebx, [iPicStride]
564− mov ecx, 16 ;MB_WIDTH_LUMA
565− pxor xmm0, xmm0 ; zero
566− pxor xmm1, xmm1 ; sum
567− pxor xmm2, xmm2 ; sqr sum
568−mb_width_loop_i:
569− mov edx, esi
570− add edx, eax ; end address
571−gom_row_loop_i:
572− movdqa xmm3, [esi]
573− movdqa xmm4, xmm3
574− psadbw xmm4, xmm0
575− paddd xmm1, xmm4
576− movdqa xmm4, xmm3
577− punpcklbw xmm4, xmm0
578− punpckhbw xmm3, xmm0
579− pmaddwd xmm4, xmm4
580− pmaddwd xmm3, xmm3
581− paddd xmm2, xmm3
582− paddd xmm2, xmm4
583− add esi, 16
584− cmp esi, edx
585− jl gom_row_loop_i
586−
587− sub esi, eax
588− add esi, ebx
589− loop mb_width_loop_i
590−
591− movdqa xmm3, xmm1
592− psrldq xmm3, 8
593− paddd xmm1, xmm3
594− movd eax, xmm1
595− mov edx, [pSum]
596− add [edx], eax
597−
598− movdqa xmm3, xmm2
599− psrldq xmm3, 8
600− paddd xmm2, xmm3
601− movdqa xmm3, xmm2
602− psrldq xmm3, 4
603− paddd xmm2, xmm3
604− movd eax, xmm2
605− mov edx, [pSqrSum]
606− add [edx], eax
607−
608−
609−%undef cur_orig
610−%undef iPicStride
611−%undef gom_pixel_num
612−%undef pSum
613−%undef pSqrSum
614−%undef pushsize
615− pop ebx
616− pop esi
617− ret
459+SampleVariance16x16_sse2:
460+ %define SUM r10;[esp]
461+ %define SUM_CUR r11;[esp+4]
462+ %define SQR r13;[esp+8]
463+ %define SQR_CUR r15;[esp+12]
464+
465+ push r12
466+ push r13
467+ push r14
468+ push r15
469+ %assign push_num 4
470+ LOAD_5_PARA
471+ SIGN_EXTENTION r1,r1d
472+ SIGN_EXTENTION r3,r3d
473+
474+ mov r12,010h
475+ pxor xmm7, xmm7
476+ movq SUM, xmm7
477+ movq SUM_CUR,xmm7
478+ movq SQR,xmm7
479+ movq SQR_CUR,xmm7
618480
481+.hloops:
482+ mov r14,0
483+ movdqa xmm0, [r0] ; y_ref
484+ movdqa xmm1, [r2] ; y_src
485+ movdqa xmm2, xmm0 ; store first for future process
486+ movdqa xmm3, xmm1
487+ ; sum += diff;
488+ movdqa xmm4, xmm0
489+ psadbw xmm4, xmm1 ; 2 parts, [0,..,15], [64,..,79]
490+ ; to be continued for sum
491+ pshufd xmm5, xmm4, 0C6h ; 11000110 B
492+ paddw xmm4, xmm5
493+ movd r14d, xmm4
494+ add SUM, r14
495+
496+ ; sqr += diff * diff;
497+ pmaxub xmm0, xmm1
498+ pminub xmm1, xmm2
499+ psubb xmm0, xmm1 ; diff
500+ SUM_SQR_SSE2 xmm1, xmm0, xmm7 ; dst, pSrc, zero
501+ movd r14d, xmm1
502+ add SQR, r14
503+
504+ ; sum_cur += y_src[x];
505+ movdqa xmm0, xmm3 ; cur_orig
506+ movdqa xmm1, xmm0
507+ punpcklbw xmm0, xmm7
508+ punpckhbw xmm1, xmm7
509+ paddw xmm0, xmm1 ; 8x2
510+ SUM_WORD_8x2_SSE2 xmm0, xmm1
511+ movd r14d, xmm0
512+ and r14, 0ffffh
513+ add SUM_CUR, r14
514+
515+ ; sqr_cur += y_src[x] * y_src[x];
516+ SUM_SQR_SSE2 xmm0, xmm3, xmm7 ; dst, pSrc, zero
517+ movd r14d, xmm0
518+ add SQR_CUR, r14
519+
520+ lea r0, [r0+r1]
521+ lea r2, [r2+r3]
522+ dec r12
523+ jnz near .hloops
524+
525+ mov r0, SUM
526+ sar r0, 8
527+ imul r0, r0
528+ mov r1, SQR
529+ sar r1, 8
530+ sub r1, r0
531+ mov [r4], r1w ; to store uiMotionIndex
532+ mov r0, SUM_CUR
533+ sar r0, 8
534+ imul r0, r0
535+ mov r1, SQR_CUR
536+ sar r1, 8
537+ sub r1, r0
538+ mov [r4+2], r1w ; to store uiTextureIndex
539+
540+ LOAD_5_PARA_POP
541+ pop r15
542+ pop r14
543+ pop r13
544+ pop r12
545+
546+
547+ %assign push_num 0
548+
549+ ret
619550
620551
621552 WELS_EXTERN VAACalcSad_sse2
622553 ;*************************************************************************************************************
623554 ;void VAACalcSad_sse2( uint8_t *cur_data, uint8_t *ref_data, int32_t iPicWidth, int32_t iPicHeight
624−; int32_t iPicStride, int32_t *psadframe, int32_t *psad8x8)
555+; int32_t iPicStride, int32_t *psadframe, int32_t *psad8x8)
625556 ;*************************************************************************************************************
626557
627558
628559 ALIGN 16
629560 VAACalcSad_sse2:
630−%define cur_data esp + pushsize + 4
631−%define ref_data esp + pushsize + 8
632−%define iPicWidth esp + pushsize + 12
633−%define iPicHeight esp + pushsize + 16
634−%define iPicStride esp + pushsize + 20
635−%define psadframe esp + pushsize + 24
636−%define psad8x8 esp + pushsize + 28
637−%define pushsize 12
638− push esi
639− push edi
640− push ebx
641− mov esi, [cur_data]
642− mov edi, [ref_data]
643− mov ebx, [iPicStride]
644− mov edx, [psad8x8]
645− mov eax, ebx
646−
647− shr dword [iPicWidth], 4 ; iPicWidth/16
648− shr dword [iPicHeight], 4 ; iPicHeight/16
649− shl eax, 4 ; iPicStride*16
650− pxor xmm0, xmm0
651− pxor xmm7, xmm7 ; iFrameSad
561+%define cur_data r0
562+%define ref_data r1
563+%define iPicWidth r2
564+%define iPicHeight r3
565+%define iPicStride r4
566+%define psadframe r5
567+%define psad8x8 r6
568+
569+ push r12
570+ push r13
571+ %assign push_num 2
572+ LOAD_7_PARA
573+ SIGN_EXTENTION r2,r2d
574+ SIGN_EXTENTION r3,r3d
575+ SIGN_EXTENTION r4,r4d
576+
577+ mov r12,r4
578+ shr r2, 4 ; iPicWidth/16
579+ shr r3, 4 ; iPicHeight/16
580+
581+ shl r12, 4 ; iPicStride*16
582+ pxor xmm0, xmm0
583+ pxor xmm7, xmm7 ; iFrameSad
652584 height_loop:
653− mov ecx, dword [iPicWidth]
654− push esi
655− push edi
585+ mov r13, r2
586+ push r0
587+ push r1
656588 width_loop:
657− pxor xmm6, xmm6 ;
658− WELS_SAD_16x2_SSE2
659− WELS_SAD_16x2_SSE2
660− WELS_SAD_16x2_SSE2
661− WELS_SAD_16x2_SSE2
662− paddd xmm7, xmm6
663− movd [edx], xmm6
664− psrldq xmm6, 8
665− movd [edx+4], xmm6
666−
667− pxor xmm6, xmm6
668− WELS_SAD_16x2_SSE2
669− WELS_SAD_16x2_SSE2
670− WELS_SAD_16x2_SSE2
671− WELS_SAD_16x2_SSE2
672− paddd xmm7, xmm6
673− movd [edx+8], xmm6
674− psrldq xmm6, 8
675− movd [edx+12], xmm6
676−
677− add edx, 16
678− sub esi, eax
679− sub edi, eax
680− add esi, 16
681− add edi, 16
682−
683− dec ecx
684− jnz width_loop
685−
686− pop edi
687− pop esi
688− add esi, eax
689− add edi, eax
690−
691− dec dword [iPicHeight]
692− jnz height_loop
693−
694− mov edx, [psadframe]
695− movdqa xmm5, xmm7
696− psrldq xmm7, 8
697− paddd xmm7, xmm5
698− movd [edx], xmm7
699−
700−%undef cur_data
701−%undef ref_data
702−%undef iPicWidth
703−%undef iPicHeight
704−%undef iPicStride
705−%undef psadframe
706−%undef psad8x8
707−%undef pushsize
708− pop ebx
709− pop edi
710− pop esi
711− ret
589+ pxor xmm6, xmm6
590+ WELS_SAD_16x2_SSE2 r0,r1,r4
591+ WELS_SAD_16x2_SSE2 r0,r1,r4
592+ WELS_SAD_16x2_SSE2 r0,r1,r4
593+ WELS_SAD_16x2_SSE2 r0,r1,r4
594+ paddd xmm7, xmm6
595+ movd [r6], xmm6
596+ psrldq xmm6, 8
597+ movd [r6+4], xmm6
598+
599+ pxor xmm6, xmm6
600+ WELS_SAD_16x2_SSE2 r0,r1,r4
601+ WELS_SAD_16x2_SSE2 r0,r1,r4
602+ WELS_SAD_16x2_SSE2 r0,r1,r4
603+ WELS_SAD_16x2_SSE2 r0,r1,r4
604+ paddd xmm7, xmm6
605+ movd [r6+8], xmm6
606+ psrldq xmm6, 8
607+ movd [r6+12], xmm6
608+
609+ add r6, 16
610+ sub r0, r12
611+ sub r1, r12
612+ add r0, 16
613+ add r1, 16
614+
615+ dec r13
616+ jnz width_loop
617+
618+ pop r1
619+ pop r0
620+ add r0, r12
621+ add r1, r12
622+
623+ dec r3
624+ jnz height_loop
625+
626+ ;mov r13, [psadframe]
627+ movdqa xmm5, xmm7
628+ psrldq xmm7, 8
629+ paddd xmm7, xmm5
630+ movd [psadframe], xmm7
631+
632+%undef cur_data
633+%undef ref_data
634+%undef iPicWidth
635+%undef iPicHeight
636+%undef iPicStride
637+%undef psadframe
638+%undef psad8x8
639+%undef pushsize
640+ LOAD_7_PARA_POP
641+ pop r13
642+ pop r12
643+ %assign push_num 0
644+ ret
645+
646+%endif
712647
713648
649+%ifdef X86_32
714650 WELS_EXTERN VAACalcSadVar_sse2
715651 ;*************************************************************************************************************
716652 ;void VAACalcSadVar_sse2( uint8_t *cur_data, uint8_t *ref_data, int32_t iPicWidth, int32_t iPicHeight
717−; int32_t iPicStride, int32_t *psadframe, int32_t *psad8x8, int32_t *psum16x16, int32_t *psqsum16x16)
653+; int32_t iPicStride, int32_t *psadframe, int32_t *psad8x8, int32_t *psum16x16, int32_t *psqsum16x16)
718654 ;*************************************************************************************************************
719655
720656
721657 ALIGN 16
722658 VAACalcSadVar_sse2:
723−%define localsize 8
724−%define cur_data esp + pushsize + localsize + 4
725−%define ref_data esp + pushsize + localsize + 8
726−%define iPicWidth esp + pushsize + localsize + 12
727−%define iPicHeight esp + pushsize + localsize + 16
728−%define iPicStride esp + pushsize + localsize + 20
729−%define psadframe esp + pushsize + localsize + 24
730−%define psad8x8 esp + pushsize + localsize + 28
731−%define psum16x16 esp + pushsize + localsize + 32
732−%define psqsum16x16 esp + pushsize + localsize + 36
733−%define tmp_esi esp + 0
734−%define tmp_edi esp + 4
735−%define pushsize 16
736− push ebp
737− push esi
738− push edi
739− push ebx
740− sub esp, localsize
741− mov esi, [cur_data]
742− mov edi, [ref_data]
743− mov ebx, [iPicStride]
744− mov edx, [psad8x8]
745− mov eax, ebx
746−
747− shr dword [iPicWidth], 4 ; iPicWidth/16
748− shr dword [iPicHeight], 4 ; iPicHeight/16
749− shl eax, 4 ; iPicStride*16
750− pxor xmm0, xmm0
751− pxor xmm7, xmm7 ; iFrameSad
659+%define localsize 8
660+%define cur_data esp + pushsize + localsize + 4
661+%define ref_data esp + pushsize + localsize + 8
662+%define iPicWidth esp + pushsize + localsize + 12
663+%define iPicHeight esp + pushsize + localsize + 16
664+%define iPicStride esp + pushsize + localsize + 20
665+%define psadframe esp + pushsize + localsize + 24
666+%define psad8x8 esp + pushsize + localsize + 28
667+%define psum16x16 esp + pushsize + localsize + 32
668+%define psqsum16x16 esp + pushsize + localsize + 36
669+%define tmp_esi esp + 0
670+%define tmp_edi esp + 4
671+%define pushsize 16
672+ push ebp
673+ push esi
674+ push edi
675+ push ebx
676+ sub esp, localsize
677+ mov esi, [cur_data]
678+ mov edi, [ref_data]
679+ mov ebx, [iPicStride]
680+ mov edx, [psad8x8]
681+ mov eax, ebx
682+
683+ shr dword [iPicWidth], 4 ; iPicWidth/16
684+ shr dword [iPicHeight], 4 ; iPicHeight/16
685+ shl eax, 4 ; iPicStride*16
686+ pxor xmm0, xmm0
687+ pxor xmm7, xmm7 ; iFrameSad
752688 var_height_loop:
753− mov ecx, dword [iPicWidth]
754− mov [tmp_esi], esi
755− mov [tmp_edi], edi
689+ mov ecx, dword [iPicWidth]
690+ mov [tmp_esi], esi
691+ mov [tmp_edi], edi
756692 var_width_loop:
757− pxor xmm6, xmm6 ; hiQuad_loQuad pSad8x8
758− pxor xmm5, xmm5 ; pSum16x16
759− pxor xmm4, xmm4 ; sqsum_16x16
760− WELS_SAD_SUM_SQSUM_16x1_SSE2
761− WELS_SAD_SUM_SQSUM_16x1_SSE2
762− WELS_SAD_SUM_SQSUM_16x1_SSE2
763− WELS_SAD_SUM_SQSUM_16x1_SSE2
764− WELS_SAD_SUM_SQSUM_16x1_SSE2
765− WELS_SAD_SUM_SQSUM_16x1_SSE2
766− WELS_SAD_SUM_SQSUM_16x1_SSE2
767− WELS_SAD_SUM_SQSUM_16x1_SSE2
768− paddd xmm7, xmm6
769− movd [edx], xmm6
770− psrldq xmm6, 8
771− movd [edx+4], xmm6
772−
773− pxor xmm6, xmm6
774− WELS_SAD_SUM_SQSUM_16x1_SSE2
775− WELS_SAD_SUM_SQSUM_16x1_SSE2
776− WELS_SAD_SUM_SQSUM_16x1_SSE2
777− WELS_SAD_SUM_SQSUM_16x1_SSE2
778− WELS_SAD_SUM_SQSUM_16x1_SSE2
779− WELS_SAD_SUM_SQSUM_16x1_SSE2
780− WELS_SAD_SUM_SQSUM_16x1_SSE2
781− WELS_SAD_SUM_SQSUM_16x1_SSE2
782− paddd xmm7, xmm6
783− movd [edx+8], xmm6
784− psrldq xmm6, 8
785− movd [edx+12], xmm6
786−
787− mov ebp, [psum16x16]
788− movdqa xmm1, xmm5
789− psrldq xmm1, 8
790− paddd xmm5, xmm1
791− movd [ebp], xmm5
792− add dword [psum16x16], 4
793−
794− movdqa xmm5, xmm4
795− psrldq xmm5, 8
796− paddd xmm4, xmm5
797− movdqa xmm3, xmm4
798− psrldq xmm3, 4
799− paddd xmm4, xmm3
800−
801− mov ebp, [psqsum16x16]
802− movd [ebp], xmm4
803− add dword [psqsum16x16], 4
804−
805− add edx, 16
806− sub esi, eax
807− sub edi, eax
808− add esi, 16
809− add edi, 16
810−
811− dec ecx
812− jnz var_width_loop
813−
814− mov esi, [tmp_esi]
815− mov edi, [tmp_edi]
816− add esi, eax
817− add edi, eax
818−
819− dec dword [iPicHeight]
820− jnz var_height_loop
821−
822− mov edx, [psadframe]
823− movdqa xmm5, xmm7
824− psrldq xmm7, 8
825− paddd xmm7, xmm5
826− movd [edx], xmm7
827−
828− add esp, localsize
829− pop ebx
830− pop edi
831− pop esi
832− pop ebp
833−%undef cur_data
834−%undef ref_data
835−%undef iPicWidth
836−%undef iPicHeight
837−%undef iPicStride
838−%undef psadframe
839−%undef psad8x8
840−%undef psum16x16
841−%undef psqsum16x16
842−%undef tmp_esi
843−%undef tmp_edi
844−%undef pushsize
845−%undef localsize
846− ret
693+ pxor xmm6, xmm6 ; hiQuad_loQuad pSad8x8
694+ pxor xmm5, xmm5 ; pSum16x16
695+ pxor xmm4, xmm4 ; sqsum_16x16
696+ WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
697+ WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
698+ WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
699+ WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
700+ WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
701+ WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
702+ WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
703+ WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
704+ paddd xmm7, xmm6
705+ movd [edx], xmm6
706+ psrldq xmm6, 8
707+ movd [edx+4], xmm6
708+
709+ pxor xmm6, xmm6
710+ WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
711+ WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
712+ WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
713+ WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
714+ WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
715+ WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
716+ WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
717+ WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
718+ paddd xmm7, xmm6
719+ movd [edx+8], xmm6
720+ psrldq xmm6, 8
721+ movd [edx+12], xmm6
722+
723+ mov ebp, [psum16x16]
724+ movdqa xmm1, xmm5
725+ psrldq xmm1, 8
726+ paddd xmm5, xmm1
727+ movd [ebp], xmm5
728+ add dword [psum16x16], 4
729+
730+ movdqa xmm5, xmm4
731+ psrldq xmm5, 8
732+ paddd xmm4, xmm5
733+ movdqa xmm3, xmm4
734+ psrldq xmm3, 4
735+ paddd xmm4, xmm3
736+
737+ mov ebp, [psqsum16x16]
738+ movd [ebp], xmm4
739+ add dword [psqsum16x16], 4
740+
741+ add edx, 16
742+ sub esi, eax
743+ sub edi, eax
744+ add esi, 16
745+ add edi, 16
746+
747+ dec ecx
748+ jnz var_width_loop
749+
750+ mov esi, [tmp_esi]
751+ mov edi, [tmp_edi]
752+ add esi, eax
753+ add edi, eax
754+
755+ dec dword [iPicHeight]
756+ jnz var_height_loop
757+
758+ mov edx, [psadframe]
759+ movdqa xmm5, xmm7
760+ psrldq xmm7, 8
761+ paddd xmm7, xmm5
762+ movd [edx], xmm7
763+
764+ add esp, localsize
765+ pop ebx
766+ pop edi
767+ pop esi
768+ pop ebp
769+%undef cur_data
770+%undef ref_data
771+%undef iPicWidth
772+%undef iPicHeight
773+%undef iPicStride
774+%undef psadframe
775+%undef psad8x8
776+%undef psum16x16
777+%undef psqsum16x16
778+%undef tmp_esi
779+%undef tmp_edi
780+%undef pushsize
781+%undef localsize
782+ ret
783+
784+%else ;64-bit
847785
786+WELS_EXTERN VAACalcSadVar_sse2
787+;*************************************************************************************************************
788+;void VAACalcSadVar_sse2( uint8_t *cur_data, uint8_t *ref_data, int32_t iPicWidth, int32_t iPicHeight
789+; int32_t iPicStride, int32_t *psadframe, int32_t *psad8x8, int32_t *psum16x16, int32_t *psqsum16x16)
790+;*************************************************************************************************************
791+
792+
793+ALIGN 16
794+VAACalcSadVar_sse2:
795+%define cur_data arg1 ;r0
796+%define ref_data arg2 ;r1
797+%define iPicWidth arg3 ;r2
798+%define iPicHeight arg4 ;r3
799+%define iPicStride arg5
800+%define psadframe arg6
801+%define psad8x8 arg7
802+%define psum16x16 arg8
803+%define psqsum16x16 arg9
804+
805+ push r12
806+ push r13
807+ push r14
808+ push r15
809+ %assign push_num 4
810+
811+%ifdef WIN64
812+ mov r4, arg5 ;iPicStride
813+ mov r5, arg6 ;psad8x8
814+%endif
815+ mov r14,arg7
816+ SIGN_EXTENTION r2,r2d
817+ SIGN_EXTENTION r3,r3d
818+ SIGN_EXTENTION r4,r4d
819+
820+ mov r13,r4
821+ shr r2,4
822+ shr r3,4
823+
824+ shl r13,4 ; iPicStride*16
825+ pxor xmm0, xmm0
826+ pxor xmm7, xmm7 ; iFrameSad
827+var_height_loop:
828+ push r2
829+ %assign push_num push_num+1
830+ mov r11, r0
831+ mov r12, r1
832+var_width_loop:
833+ pxor xmm6, xmm6 ; hiQuad_loQuad pSad8x8
834+ pxor xmm5, xmm5 ; pSum16x16
835+ pxor xmm4, xmm4 ; sqsum_16x16
836+ WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4
837+ WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4
838+ WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4
839+ WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4
840+ WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4
841+ WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4
842+ WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4
843+ WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4
844+ paddd xmm7, xmm6
845+ movd [r14], xmm6
846+ psrldq xmm6, 8
847+ movd [r14+4], xmm6
848+
849+ pxor xmm6, xmm6
850+ WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4
851+ WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4
852+ WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4
853+ WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4
854+ WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4
855+ WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4
856+ WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4
857+ WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4
858+ paddd xmm7, xmm6
859+ movd [r14+8], xmm6
860+ psrldq xmm6, 8
861+ movd [r14+12], xmm6
862+
863+ mov r15, psum16x16
864+ movdqa xmm1, xmm5
865+ psrldq xmm1, 8
866+ paddd xmm5, xmm1
867+ movd [r15], xmm5
868+ add dword psum16x16, 4
869+
870+ movdqa xmm5, xmm4
871+ psrldq xmm5, 8
872+ paddd xmm4, xmm5
873+ movdqa xmm3, xmm4
874+ psrldq xmm3, 4
875+ paddd xmm4, xmm3
876+
877+ mov r15, psqsum16x16
878+ movd [r15], xmm4
879+ add dword psqsum16x16, 4
880+
881+ add r14,16
882+ sub r0, r13
883+ sub r1, r13
884+ add r0, 16
885+ add r1, 16
886+
887+ dec r2
888+ jnz var_width_loop
889+
890+ pop r2
891+ %assign push_num push_num-1
892+ mov r0, r11
893+ mov r1, r12
894+ add r0, r13
895+ add r1, r13
896+ dec r3
897+ jnz var_height_loop
898+
899+ mov r15, psadframe
900+ movdqa xmm5, xmm7
901+ psrldq xmm7, 8
902+ paddd xmm7, xmm5
903+ movd [r15], xmm7
904+
905+ pop r15
906+ pop r14
907+ pop r13
908+ pop r12
909+%assign push_num 0
910+%undef cur_data
911+%undef ref_data
912+%undef iPicWidth
913+%undef iPicHeight
914+%undef iPicStride
915+%undef psadframe
916+%undef psad8x8
917+%undef psum16x16
918+%undef psqsum16x16
919+%undef tmp_esi
920+%undef tmp_edi
921+%undef pushsize
922+%undef localsize
923+ ret
924+
925+%endif
926+
927+%ifdef X86_32
928+
929+WELS_EXTERN VAACalcSadSsd_sse2
930+;*************************************************************************************************************
931+;void VAACalcSadSsd_sse2(uint8_t *cur_data, uint8_t *ref_data, int32_t iPicWidth, int32_t iPicHeight,
932+; int32_t iPicStride,int32_t *psadframe, int32_t *psad8x8, int32_t *psum16x16, int32_t *psqsum16x16, int32_t *psqdiff16x16)
933+;*************************************************************************************************************
934+
935+
936+ALIGN 16
937+VAACalcSadSsd_sse2:
938+%define localsize 12
939+%define cur_data esp + pushsize + localsize + 4
940+%define ref_data esp + pushsize + localsize + 8
941+%define iPicWidth esp + pushsize + localsize + 12
942+%define iPicHeight esp + pushsize + localsize + 16
943+%define iPicStride esp + pushsize + localsize + 20
944+%define psadframe esp + pushsize + localsize + 24
945+%define psad8x8 esp + pushsize + localsize + 28
946+%define psum16x16 esp + pushsize + localsize + 32
947+%define psqsum16x16 esp + pushsize + localsize + 36
948+%define psqdiff16x16 esp + pushsize + localsize + 40
949+%define tmp_esi esp + 0
950+%define tmp_edi esp + 4
951+%define tmp_sadframe esp + 8
952+%define pushsize 16
953+ push ebp
954+ push esi
955+ push edi
956+ push ebx
957+ sub esp, localsize
958+
959+ mov ecx, [iPicWidth]
960+ mov ecx, [iPicHeight]
961+ mov esi, [cur_data]
962+ mov edi, [ref_data]
963+ mov ebx, [iPicStride]
964+ mov edx, [psad8x8]
965+ mov eax, ebx
966+
967+ shr dword [iPicWidth], 4 ; iPicWidth/16
968+ shr dword [iPicHeight], 4 ; iPicHeight/16
969+ shl eax, 4 ; iPicStride*16
970+ mov ecx, [iPicWidth]
971+ mov ecx, [iPicHeight]
972+ pxor xmm0, xmm0
973+ movd [tmp_sadframe], xmm0
974+sqdiff_height_loop:
975+ mov ecx, dword [iPicWidth]
976+ mov [tmp_esi], esi
977+ mov [tmp_edi], edi
978+sqdiff_width_loop:
979+ pxor xmm7, xmm7 ; hiQuad_loQuad pSad8x8
980+ pxor xmm6, xmm6 ; pSum16x16
981+ pxor xmm5, xmm5 ; sqsum_16x16 four dword
982+ pxor xmm4, xmm4 ; sqdiff_16x16 four Dword
983+ WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx
984+ WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx
985+ WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx
986+ WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx
987+ WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx
988+ WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx
989+ WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx
990+ WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx
991+ movdqa xmm1, xmm7
992+ movd [edx], xmm7
993+ psrldq xmm7, 8
994+ paddd xmm1, xmm7
995+ movd [edx+4], xmm7
996+ movd ebp, xmm1
997+ add [tmp_sadframe], ebp
998+
999+ pxor xmm7, xmm7
1000+ WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx
1001+ WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx
1002+ WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx
1003+ WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx
1004+ WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx
1005+ WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx
1006+ WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx
1007+ WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx
1008+ movdqa xmm1, xmm7
1009+ movd [edx+8], xmm7
1010+ psrldq xmm7, 8
1011+ paddd xmm1, xmm7
1012+ movd [edx+12], xmm7
1013+ movd ebp, xmm1
1014+ add [tmp_sadframe], ebp
1015+
1016+ mov ebp, [psum16x16]
1017+ movdqa xmm1, xmm6
1018+ psrldq xmm1, 8
1019+ paddd xmm6, xmm1
1020+ movd [ebp], xmm6
1021+ add dword [psum16x16], 4
1022+
1023+ mov ebp, [psqsum16x16]
1024+ pshufd xmm6, xmm5, 14 ;00001110
1025+ paddd xmm6, xmm5
1026+ pshufd xmm5, xmm6, 1 ;00000001
1027+ paddd xmm5, xmm6
1028+ movd [ebp], xmm5
1029+ add dword [psqsum16x16], 4
1030+
1031+ mov ebp, [psqdiff16x16]
1032+ pshufd xmm5, xmm4, 14 ; 00001110
1033+ paddd xmm5, xmm4
1034+ pshufd xmm4, xmm5, 1 ; 00000001
1035+ paddd xmm4, xmm5
1036+ movd [ebp], xmm4
1037+ add dword [psqdiff16x16], 4
1038+
1039+ add edx, 16
1040+ sub esi, eax
1041+ sub edi, eax
1042+ add esi, 16
1043+ add edi, 16
1044+
1045+ dec ecx
1046+ jnz sqdiff_width_loop
1047+
1048+ mov esi, [tmp_esi]
1049+ mov edi, [tmp_edi]
1050+ add esi, eax
1051+ add edi, eax
1052+
1053+ dec dword [iPicHeight]
1054+ jnz sqdiff_height_loop
1055+
1056+ mov ebx, [tmp_sadframe]
1057+ mov eax, [psadframe]
1058+ mov [eax], ebx
1059+
1060+ add esp, localsize
1061+ pop ebx
1062+ pop edi
1063+ pop esi
1064+ pop ebp
1065+%undef cur_data
1066+%undef ref_data
1067+%undef iPicWidth
1068+%undef iPicHeight
1069+%undef iPicStride
1070+%undef psadframe
1071+%undef psad8x8
1072+%undef psum16x16
1073+%undef psqsum16x16
1074+%undef psqdiff16x16
1075+%undef tmp_esi
1076+%undef tmp_edi
1077+%undef tmp_sadframe
1078+%undef pushsize
1079+%undef localsize
1080+ ret
1081+
1082+%else
8481083
8491084
8501085 WELS_EXTERN VAACalcSadSsd_sse2
8511086 ;*************************************************************************************************************
8521087 ;void VAACalcSadSsd_sse2(uint8_t *cur_data, uint8_t *ref_data, int32_t iPicWidth, int32_t iPicHeight,
853−; int32_t iPicStride,int32_t *psadframe, int32_t *psad8x8, int32_t *psum16x16, int32_t *psqsum16x16, int32_t *psqdiff16x16)
1088+; int32_t iPicStride,int32_t *psadframe, int32_t *psad8x8, int32_t *psum16x16, int32_t *psqsum16x16, int32_t *psqdiff16x16)
8541089 ;*************************************************************************************************************
8551090
8561091
8571092 ALIGN 16
8581093 VAACalcSadSsd_sse2:
859−%define localsize 12
860−%define cur_data esp + pushsize + localsize + 4
861−%define ref_data esp + pushsize + localsize + 8
862−%define iPicWidth esp + pushsize + localsize + 12
863−%define iPicHeight esp + pushsize + localsize + 16
864−%define iPicStride esp + pushsize + localsize + 20
865−%define psadframe esp + pushsize + localsize + 24
866−%define psad8x8 esp + pushsize + localsize + 28
867−%define psum16x16 esp + pushsize + localsize + 32
868−%define psqsum16x16 esp + pushsize + localsize + 36
869−%define psqdiff16x16 esp + pushsize + localsize + 40
870−%define tmp_esi esp + 0
871−%define tmp_edi esp + 4
872−%define tmp_sadframe esp + 8
873−%define pushsize 16
874− push ebp
875− push esi
876− push edi
877− push ebx
878− sub esp, localsize
879− mov ecx, [iPicWidth]
880− mov ecx, [iPicHeight]
881− mov esi, [cur_data]
882− mov edi, [ref_data]
883− mov ebx, [iPicStride]
884− mov edx, [psad8x8]
885− mov eax, ebx
886−
887− shr dword [iPicWidth], 4 ; iPicWidth/16
888− shr dword [iPicHeight], 4 ; iPicHeight/16
889− shl eax, 4 ; iPicStride*16
890− mov ecx, [iPicWidth]
891− mov ecx, [iPicHeight]
892− pxor xmm0, xmm0
893− movd [tmp_sadframe], xmm0
1094+%define localsize 12
1095+%define cur_data arg1;r0
1096+%define ref_data arg2;r1
1097+%define iPicWidth arg3;r2
1098+%define iPicHeight arg4;r3
1099+%define iPicStride arg5;
1100+%define psadframe arg6;
1101+%define psad8x8 arg7;
1102+%define psum16x16 arg8;
1103+%define psqsum16x16 arg9;
1104+%define psqdiff16x16 arg10
1105+
1106+ push r12
1107+ push r13
1108+ push r14
1109+ push r15
1110+ %assign push_num 4
1111+
1112+%ifdef WIN64
1113+ mov r4,arg5
1114+%endif
1115+ mov r14,arg7
1116+ SIGN_EXTENTION r2,r2d
1117+ SIGN_EXTENTION r3,r3d
1118+ SIGN_EXTENTION r4,r4d
1119+
1120+ mov r13,r4
1121+ shr r2,4 ; iPicWidth/16
1122+ shr r3,4 ; iPicHeight/16
1123+ shl r13,4 ; iPicStride*16
1124+ pxor xmm0, xmm0
1125+ pxor xmm8, xmm8 ;framesad
1126+ pxor xmm9, xmm9
8941127 sqdiff_height_loop:
895− mov ecx, dword [iPicWidth]
896− mov [tmp_esi], esi
897− mov [tmp_edi], edi
1128+ ;mov ecx, dword [iPicWidth]
1129+ ;mov r14,r2
1130+ push r2
1131+ %assign push_num push_num +1
1132+ mov r10, r0
1133+ mov r11, r1
8981134 sqdiff_width_loop:
899− pxor xmm7, xmm7 ; hiQuad_loQuad pSad8x8
900− pxor xmm6, xmm6 ; pSum16x16
901− pxor xmm5, xmm5 ; sqsum_16x16 four dword
902− pxor xmm4, xmm4 ; sqdiff_16x16 four Dword
903− WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2
904− WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2
905− WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2
906− WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2
907− WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2
908− WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2
909− WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2
910− WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2
911− movdqa xmm1, xmm7
912− movd [edx], xmm7
913− psrldq xmm7, 8
914− paddd xmm1, xmm7
915− movd [edx+4], xmm7
916− movd ebp, xmm1
917− add [tmp_sadframe], ebp
918−
919− pxor xmm7, xmm7
920− WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2
921− WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2
922− WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2
923− WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2
924− WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2
925− WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2
926− WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2
927− WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2
928− movdqa xmm1, xmm7
929− movd [edx+8], xmm7
930− psrldq xmm7, 8
931− paddd xmm1, xmm7
932− movd [edx+12], xmm7
933− movd ebp, xmm1
934− add [tmp_sadframe], ebp
935−
936− mov ebp, [psum16x16]
937− movdqa xmm1, xmm6
938− psrldq xmm1, 8
939− paddd xmm6, xmm1
940− movd [ebp], xmm6
941− add dword [psum16x16], 4
942−
943− mov ebp, [psqsum16x16]
944− pshufd xmm6, xmm5, 14 ;00001110
945− paddd xmm6, xmm5
946− pshufd xmm5, xmm6, 1 ;00000001
947− paddd xmm5, xmm6
948− movd [ebp], xmm5
949− add dword [psqsum16x16], 4
950−
951− mov ebp, [psqdiff16x16]
952− pshufd xmm5, xmm4, 14 ; 00001110
953− paddd xmm5, xmm4
954− pshufd xmm4, xmm5, 1 ; 00000001
955− paddd xmm4, xmm5
956− movd [ebp], xmm4
957− add dword [psqdiff16x16], 4
958−
959− add edx, 16
960− sub esi, eax
961− sub edi, eax
962− add esi, 16
963− add edi, 16
964−
965− dec ecx
966− jnz sqdiff_width_loop
967−
968− mov esi, [tmp_esi]
969− mov edi, [tmp_edi]
970− add esi, eax
971− add edi, eax
972−
973− dec dword [iPicHeight]
974− jnz sqdiff_height_loop
975−
976− mov ebx, [tmp_sadframe]
977− mov eax, [psadframe]
978− mov [eax], ebx
979−
980− add esp, localsize
981− pop ebx
982− pop edi
983− pop esi
984− pop ebp
985−%undef cur_data
986−%undef ref_data
987−%undef iPicWidth
988−%undef iPicHeight
989−%undef iPicStride
990−%undef psadframe
991−%undef psad8x8
992−%undef psum16x16
993−%undef psqsum16x16
994−%undef psqdiff16x16
995−%undef tmp_esi
996−%undef tmp_edi
997−%undef tmp_sadframe
998−%undef pushsize
999−%undef localsize
1000− ret
1135+ pxor xmm7, xmm7 ; hiQuad_loQuad pSad8x8
1136+ pxor xmm6, xmm6 ; pSum16x16
1137+ pxor xmm5, xmm5 ; sqsum_16x16 four dword
1138+ pxor xmm4, xmm4 ; sqdiff_16x16 four Dword
1139+ WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
1140+ WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
1141+ WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
1142+ WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
1143+ WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
1144+ WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
1145+ WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
1146+ WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
1147+ movdqa xmm1, xmm7
1148+ movd [r14], xmm7
1149+ psrldq xmm7, 8
1150+ paddd xmm1, xmm7
1151+ movd [r14+4], xmm7
1152+ movd r15d, xmm1
1153+ movd xmm9, r15d
1154+ paddd xmm8,xmm9
1155+
1156+
1157+ pxor xmm7, xmm7
1158+ WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
1159+ WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
1160+ WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
1161+ WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
1162+ WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
1163+ WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
1164+ WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
1165+ WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
1166+ movdqa xmm1, xmm7
1167+ movd [r14+8], xmm7
1168+ psrldq xmm7, 8
1169+ paddd xmm1, xmm7
1170+ movd [r14+12], xmm7
1171+ movd r15d, xmm1
1172+ movd xmm9, r15d
1173+ paddd xmm8,xmm9
1174+
1175+ mov r15, psum16x16
1176+ movdqa xmm1, xmm6
1177+ psrldq xmm1, 8
1178+ paddd xmm6, xmm1
1179+ movd [r15], xmm6
1180+ add dword psum16x16, 4
1181+
1182+ mov r15, psqsum16x16
1183+ pshufd xmm6, xmm5, 14 ;00001110
1184+ paddd xmm6, xmm5
1185+ pshufd xmm5, xmm6, 1 ;00000001
1186+ paddd xmm5, xmm6
1187+ movd [r15], xmm5
1188+ add dword psqsum16x16, 4
1189+
1190+ mov r15, psqdiff16x16
1191+ pshufd xmm5, xmm4, 14 ; 00001110
1192+ paddd xmm5, xmm4
1193+ pshufd xmm4, xmm5, 1 ; 00000001
1194+ paddd xmm4, xmm5
1195+ movd [r15], xmm4
1196+ add dword psqdiff16x16, 4
1197+
1198+ add r14,16
1199+ sub r0, r13
1200+ sub r1, r13
1201+ add r0, 16
1202+ add r1, 16
1203+
1204+ dec r2
1205+ jnz sqdiff_width_loop
1206+
1207+ pop r2
1208+ %assign push_num push_num -1
1209+
1210+ mov r0, r10
1211+ mov r1, r11
1212+ add r0, r13
1213+ add r1, r13
1214+
1215+ dec r3
1216+ jnz sqdiff_height_loop
1217+
1218+ mov r13, psadframe
1219+ movd [r13], xmm8
1220+
1221+ pop r15
1222+ pop r14
1223+ pop r13
1224+ pop r12
1225+ %assign push_num 0
1226+
1227+%undef cur_data
1228+%undef ref_data
1229+%undef iPicWidth
1230+%undef iPicHeight
1231+%undef iPicStride
1232+%undef psadframe
1233+%undef psad8x8
1234+%undef psum16x16
1235+%undef psqsum16x16
1236+%undef psqdiff16x16
1237+%undef tmp_esi
1238+%undef tmp_edi
1239+%undef tmp_sadframe
1240+%undef pushsize
1241+%undef localsize
1242+ ret
1243+
1244+
1245+
1246+%endif
1247+
1248+%ifdef X86_32
1249+WELS_EXTERN VAACalcSadBgd_sse2
1250+;*************************************************************************************************************
1251+;void VAACalcSadBgd_sse2(uint8_t *cur_data, uint8_t *ref_data, int32_t iPicWidth, int32_t iPicHeight,
1252+; int32_t iPicStride, int32_t *psadframe, int32_t *psad8x8, int32_t *p_sd8x8, uint8_t *p_mad8x8)
1253+;*************************************************************************************************************
1254+
1255+
1256+ALIGN 16
1257+VAACalcSadBgd_sse2:
1258+%define localsize 12
1259+%define cur_data esp + pushsize + localsize + 4
1260+%define ref_data esp + pushsize + localsize + 8
1261+%define iPicWidth esp + pushsize + localsize + 12
1262+%define iPicHeight esp + pushsize + localsize + 16
1263+%define iPicStride esp + pushsize + localsize + 20
1264+%define psadframe esp + pushsize + localsize + 24
1265+%define psad8x8 esp + pushsize + localsize + 28
1266+%define p_sd8x8 esp + pushsize + localsize + 32
1267+%define p_mad8x8 esp + pushsize + localsize + 36
1268+%define tmp_esi esp + 0
1269+%define tmp_edi esp + 4
1270+%define tmp_ecx esp + 8
1271+%define pushsize 16
1272+ push ebp
1273+ push esi
1274+ push edi
1275+ push ebx
1276+ sub esp, localsize
1277+ mov esi, [cur_data]
1278+ mov edi, [ref_data]
1279+ mov ebx, [iPicStride]
1280+ mov eax, ebx
1281+
1282+ shr dword [iPicWidth], 4 ; iPicWidth/16
1283+ shr dword [iPicHeight], 4 ; iPicHeight/16
1284+ shl eax, 4 ; iPicStride*16
1285+ xor ebp, ebp
1286+ pxor xmm0, xmm0
1287+bgd_height_loop:
1288+ mov ecx, dword [iPicWidth]
1289+ mov [tmp_esi], esi
1290+ mov [tmp_edi], edi
1291+bgd_width_loop:
1292+ pxor xmm7, xmm7 ; pSad8x8
1293+ pxor xmm6, xmm6 ; sum_cur_8x8
1294+ pxor xmm5, xmm5 ; sum_ref_8x8
1295+ pxor xmm4, xmm4 ; pMad8x8
1296+ WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx
1297+ WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx
1298+ WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx
1299+ WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx
1300+ WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx
1301+ WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx
1302+ WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx
1303+ WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx
1304+
1305+
1306+ mov edx, [p_mad8x8]
1307+ WELS_MAX_REG_SSE2 xmm4
1308+
1309+ ;movdqa xmm1, xmm4
1310+ ;punpcklbw xmm1, xmm0
1311+ ;punpcklwd xmm1, xmm0
1312+ ;movd [edx], xmm1
1313+ ;punpckhbw xmm4, xmm0
1314+ ;punpcklwd xmm4, xmm0
1315+ ;movd [edx+4], xmm4
1316+ ;add edx, 8
1317+ ;mov [p_mad8x8], edx
1318+ mov [tmp_ecx], ecx
1319+ movhlps xmm1, xmm4
1320+ movd ecx, xmm4
1321+ mov [edx], cl
1322+ movd ecx, xmm1
1323+ mov [edx+1],cl
1324+ add edx, 2
1325+ mov [p_mad8x8], edx
1326+
1327+
1328+ pslldq xmm7, 4
1329+ pslldq xmm6, 4
1330+ pslldq xmm5, 4
1331+
1332+
1333+ pxor xmm4, xmm4 ; pMad8x8
1334+ WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx
1335+ WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx
1336+ WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx
1337+ WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx
1338+ WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx
1339+ WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx
1340+ WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx
1341+ WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx
1342+
1343+ mov edx, [p_mad8x8]
1344+ WELS_MAX_REG_SSE2 xmm4
1345+
1346+ ;movdqa xmm1, xmm4
1347+ ;punpcklbw xmm1, xmm0
1348+ ;punpcklwd xmm1, xmm0
1349+ ;movd [edx], xmm1
1350+ ;punpckhbw xmm4, xmm0
1351+ ;punpcklwd xmm4, xmm0
1352+ ;movd [edx+4], xmm4
1353+ ;add edx, 8
1354+ ;mov [p_mad8x8], edx
1355+ movhlps xmm1, xmm4
1356+ movd ecx, xmm4
1357+ mov [edx], cl
1358+ movd ecx, xmm1
1359+ mov [edx+1],cl
1360+ add edx, 2
1361+ mov [p_mad8x8], edx
1362+
1363+ ; data in xmm7, xmm6, xmm5: D1 D3 D0 D2
1364+
1365+ mov edx, [psad8x8]
1366+ pshufd xmm1, xmm7, 10001101b ; D3 D2 D1 D0
1367+ movdqa [edx], xmm1
1368+ add edx, 16
1369+ mov [psad8x8], edx ; sad8x8
1370+
1371+ paddd xmm1, xmm7 ; D1+3 D3+2 D0+1 D2+0
1372+ pshufd xmm2, xmm1, 00000011b
1373+ paddd xmm1, xmm2
1374+ movd edx, xmm1
1375+ add ebp, edx ; sad frame
1376+
1377+ mov edx, [p_sd8x8]
1378+ psubd xmm6, xmm5
1379+ pshufd xmm1, xmm6, 10001101b
1380+ movdqa [edx], xmm1
1381+ add edx, 16
1382+ mov [p_sd8x8], edx
1383+
1384+
1385+ add edx, 16
1386+ sub esi, eax
1387+ sub edi, eax
1388+ add esi, 16
1389+ add edi, 16
1390+
1391+ mov ecx, [tmp_ecx]
1392+ dec ecx
1393+ jnz bgd_width_loop
1394+
1395+ mov esi, [tmp_esi]
1396+ mov edi, [tmp_edi]
1397+ add esi, eax
1398+ add edi, eax
1399+
1400+ dec dword [iPicHeight]
1401+ jnz bgd_height_loop
1402+
1403+ mov edx, [psadframe]
1404+ mov [edx], ebp
1405+
1406+ add esp, localsize
1407+ pop ebx
1408+ pop edi
1409+ pop esi
1410+ pop ebp
1411+%undef cur_data
1412+%undef ref_data
1413+%undef iPicWidth
1414+%undef iPicHeight
1415+%undef iPicStride
1416+%undef psadframe
1417+%undef psad8x8
1418+%undef p_sd8x8
1419+%undef p_mad8x8
1420+%undef tmp_esi
1421+%undef tmp_edi
1422+%undef pushsize
1423+%undef localsize
1424+ ret
1425+
10011426
10021427
1428+WELS_EXTERN VAACalcSadSsdBgd_sse2
1429+;*************************************************************************************************************
1430+;void VAACalcSadSsdBgd_sse2(uint8_t *cur_data, uint8_t *ref_data, int32_t iPicWidth, int32_t iPicHeight,
1431+; int32_t iPicStride, int32_t *psadframe, int32_t *psad8x8, int32_t *psum16x16, int32_t *psqsum16x16,
1432+; int32_t *psqdiff16x16, int32_t *p_sd8x8, uint8_t *p_mad8x8)
1433+;*************************************************************************************************************
10031434
10041435
1436+ALIGN 16
1437+VAACalcSadSsdBgd_sse2:
1438+%define localsize 16
1439+%define cur_data esp + pushsize + localsize + 4
1440+%define ref_data esp + pushsize + localsize + 8
1441+%define iPicWidth esp + pushsize + localsize + 12
1442+%define iPicHeight esp + pushsize + localsize + 16
1443+%define iPicStride esp + pushsize + localsize + 20
1444+%define psadframe esp + pushsize + localsize + 24
1445+%define psad8x8 esp + pushsize + localsize + 28
1446+%define psum16x16 esp + pushsize + localsize + 32
1447+%define psqsum16x16 esp + pushsize + localsize + 36
1448+%define psqdiff16x16 esp + pushsize + localsize + 40
1449+%define p_sd8x8 esp + pushsize + localsize + 44
1450+%define p_mad8x8 esp + pushsize + localsize + 48
1451+%define tmp_esi esp + 0
1452+%define tmp_edi esp + 4
1453+%define tmp_sadframe esp + 8
1454+%define tmp_ecx esp + 12
1455+%define pushsize 16
1456+ push ebp
1457+ push esi
1458+ push edi
1459+ push ebx
1460+ sub esp, localsize
1461+ mov esi, [cur_data]
1462+ mov edi, [ref_data]
1463+ mov ebx, [iPicStride]
1464+ mov eax, ebx
1465+
1466+ shr dword [iPicWidth], 4 ; iPicWidth/16
1467+ shr dword [iPicHeight], 4 ; iPicHeight/16
1468+ shl eax, 4 ; iPicStride*16
1469+ pxor xmm0, xmm0
1470+ movd [tmp_sadframe], xmm0
1471+sqdiff_bgd_height_loop:
1472+ mov ecx, dword [iPicWidth]
1473+ mov [tmp_esi], esi
1474+ mov [tmp_edi], edi
1475+sqdiff_bgd_width_loop:
1476+ pxor xmm7, xmm7 ; pSad8x8 interleaves sqsum16x16: sqsum1 sad1 sqsum0 sad0
1477+ pxor xmm6, xmm6 ; sum_8x8 interleaves cur and pRef in Dword, Sref1 Scur1 Sref0 Scur0
1478+ pxor xmm5, xmm5 ; pMad8x8
1479+ pxor xmm4, xmm4 ; sqdiff_16x16 four Dword
1480+ WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx
1481+ WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx
1482+ WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx
1483+ WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx
1484+ WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx
1485+ WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx
1486+ WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx
1487+ WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx
1488+
1489+ mov edx, [psad8x8]
1490+ movdqa xmm2, xmm7
1491+ pshufd xmm1, xmm2, 00001110b
1492+ movd [edx], xmm2
1493+ movd [edx+4], xmm1
1494+ add edx, 8
1495+ mov [psad8x8], edx ; sad8x8
1496+
1497+ paddd xmm1, xmm2
1498+ movd edx, xmm1
1499+ add [tmp_sadframe], edx ; iFrameSad
1500+
1501+ mov edx, [psum16x16]
1502+ movdqa xmm1, xmm6
1503+ pshufd xmm2, xmm1, 00001110b
1504+ paddd xmm1, xmm2
1505+ movd [edx], xmm1 ; sum
1506+
1507+ mov edx, [p_sd8x8]
1508+ pshufd xmm1, xmm6, 11110101b ; Sref1 Sref1 Sref0 Sref0
1509+ psubd xmm6, xmm1 ; 00 diff1 00 diff0
1510+ pshufd xmm1, xmm6, 00001000b ; xx xx diff1 diff0
1511+ movq [edx], xmm1
1512+ add edx, 8
1513+ mov [p_sd8x8], edx
1514+
1515+ mov edx, [p_mad8x8]
1516+ WELS_MAX_REG_SSE2 xmm5
1517+ ;movdqa xmm1, xmm5
1518+ ;punpcklbw xmm1, xmm0
1519+ ;punpcklwd xmm1, xmm0
1520+ ;movd [edx], xmm1
1521+ ;punpckhbw xmm5, xmm0
1522+ ;punpcklwd xmm5, xmm0
1523+ ;movd [edx+4], xmm5
1524+ ;add edx, 8
1525+ ;mov [p_mad8x8], edx
1526+ mov [tmp_ecx], ecx
1527+ movhlps xmm1, xmm5
1528+ movd ecx, xmm5
1529+ mov [edx], cl
1530+ movd ecx, xmm1
1531+ mov [edx+1],cl
1532+ add edx, 2
1533+ mov [p_mad8x8], edx
1534+
1535+ psrlq xmm7, 32
1536+ psllq xmm7, 32 ; clear sad
1537+ pxor xmm6, xmm6 ; sum_8x8 interleaves cur and pRef in Dword, Sref1 Scur1 Sref0 Scur0
1538+ pxor xmm5, xmm5 ; pMad8x8
1539+ WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx
1540+ WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx
1541+ WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx
1542+ WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx
1543+ WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx
1544+ WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx
1545+ WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx
1546+ WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx
1547+
1548+ mov edx, [psad8x8]
1549+ movdqa xmm2, xmm7
1550+ pshufd xmm1, xmm2, 00001110b
1551+ movd [edx], xmm2
1552+ movd [edx+4], xmm1
1553+ add edx, 8
1554+ mov [psad8x8], edx ; sad8x8
1555+
1556+ paddd xmm1, xmm2
1557+ movd edx, xmm1
1558+ add [tmp_sadframe], edx ; iFrameSad
1559+
1560+ mov edx, [psum16x16]
1561+ movdqa xmm1, xmm6
1562+ pshufd xmm2, xmm1, 00001110b
1563+ paddd xmm1, xmm2
1564+ movd ebp, xmm1 ; sum
1565+ add [edx], ebp
1566+ add edx, 4
1567+ mov [psum16x16], edx
1568+
1569+ mov edx, [psqsum16x16]
1570+ psrlq xmm7, 32
1571+ pshufd xmm2, xmm7, 00001110b
1572+ paddd xmm2, xmm7
1573+ movd [edx], xmm2 ; sqsum
1574+ add edx, 4
1575+ mov [psqsum16x16], edx
1576+
1577+ mov edx, [p_sd8x8]
1578+ pshufd xmm1, xmm6, 11110101b ; Sref1 Sref1 Sref0 Sref0
1579+ psubd xmm6, xmm1 ; 00 diff1 00 diff0
1580+ pshufd xmm1, xmm6, 00001000b ; xx xx diff1 diff0
1581+ movq [edx], xmm1
1582+ add edx, 8
1583+ mov [p_sd8x8], edx
1584+
1585+ mov edx, [p_mad8x8]
1586+ WELS_MAX_REG_SSE2 xmm5
1587+ ;movdqa xmm1, xmm5
1588+ ;punpcklbw xmm1, xmm0
1589+ ;punpcklwd xmm1, xmm0
1590+ ;movd [edx], xmm1
1591+ ;punpckhbw xmm5, xmm0
1592+ ;punpcklwd xmm5, xmm0
1593+ ;movd [edx+4], xmm5
1594+ ;add edx, 8
1595+ ;mov [p_mad8x8], edx
1596+ movhlps xmm1, xmm5
1597+ movd ecx, xmm5
1598+ mov [edx], cl
1599+ movd ecx, xmm1
1600+ mov [edx+1],cl
1601+ add edx, 2
1602+ mov [p_mad8x8], edx
1603+
1604+ mov edx, [psqdiff16x16]
1605+ pshufd xmm1, xmm4, 00001110b
1606+ paddd xmm4, xmm1
1607+ pshufd xmm1, xmm4, 00000001b
1608+ paddd xmm4, xmm1
1609+ movd [edx], xmm4
1610+ add edx, 4
1611+ mov [psqdiff16x16], edx
1612+
1613+ add edx, 16
1614+ sub esi, eax
1615+ sub edi, eax
1616+ add esi, 16
1617+ add edi, 16
1618+
1619+ mov ecx, [tmp_ecx]
1620+ dec ecx
1621+ jnz sqdiff_bgd_width_loop
1622+
1623+ mov esi, [tmp_esi]
1624+ mov edi, [tmp_edi]
1625+ add esi, eax
1626+ add edi, eax
1627+
1628+ dec dword [iPicHeight]
1629+ jnz sqdiff_bgd_height_loop
1630+
1631+ mov edx, [psadframe]
1632+ mov ebp, [tmp_sadframe]
1633+ mov [edx], ebp
1634+
1635+ add esp, localsize
1636+ pop ebx
1637+ pop edi
1638+ pop esi
1639+ pop ebp
1640+%undef cur_data
1641+%undef ref_data
1642+%undef iPicWidth
1643+%undef iPicHeight
1644+%undef iPicStride
1645+%undef psadframe
1646+%undef psad8x8
1647+%undef psum16x16
1648+%undef psqsum16x16
1649+%undef psqdiff16x16
1650+%undef p_sd8x8
1651+%undef p_mad8x8
1652+%undef tmp_esi
1653+%undef tmp_edi
1654+%undef pushsize
1655+%undef localsize
1656+ ret
1657+%else
10051658
10061659 WELS_EXTERN VAACalcSadBgd_sse2
10071660 ;*************************************************************************************************************
10081661 ;void VAACalcSadBgd_sse2(uint8_t *cur_data, uint8_t *ref_data, int32_t iPicWidth, int32_t iPicHeight,
1009−; int32_t iPicStride, int32_t *psadframe, int32_t *psad8x8, int32_t *p_sd8x8, uint8_t *p_mad8x8)
1662+; int32_t iPicStride, int32_t *psadframe, int32_t *psad8x8, int32_t *p_sd8x8, uint8_t *p_mad8x8)
10101663 ;*************************************************************************************************************
10111664
10121665
10131666 ALIGN 16
10141667 VAACalcSadBgd_sse2:
1015−%define localsize 12
1016−%define cur_data esp + pushsize + localsize + 4
1017−%define ref_data esp + pushsize + localsize + 8
1018−%define iPicWidth esp + pushsize + localsize + 12
1019−%define iPicHeight esp + pushsize + localsize + 16
1020−%define iPicStride esp + pushsize + localsize + 20
1021−%define psadframe esp + pushsize + localsize + 24
1022−%define psad8x8 esp + pushsize + localsize + 28
1023−%define p_sd8x8 esp + pushsize + localsize + 32
1024−%define p_mad8x8 esp + pushsize + localsize + 36
1025−%define tmp_esi esp + 0
1026−%define tmp_edi esp + 4
1027−%define tmp_ecx esp + 8
1028−%define pushsize 16
1029− push ebp
1030− push esi
1031− push edi
1032− push ebx
1033− sub esp, localsize
1034− mov esi, [cur_data]
1035− mov edi, [ref_data]
1036− mov ebx, [iPicStride]
1037− mov eax, ebx
1038−
1039− shr dword [iPicWidth], 4 ; iPicWidth/16
1040− shr dword [iPicHeight], 4 ; iPicHeight/16
1041− shl eax, 4 ; iPicStride*16
1042− xor ebp, ebp
1043− pxor xmm0, xmm0
1668+%define cur_data arg1;
1669+%define ref_data arg2;
1670+%define iPicWidth arg3;
1671+%define iPicHeight arg4;
1672+%define iPicStride arg5;
1673+%define psadframe arg6;
1674+%define psad8x8 arg7;
1675+%define p_sd8x8 arg8;
1676+%define p_mad8x8 arg9;
1677+
1678+ push r12
1679+ push r13
1680+ push r14
1681+ push r15
1682+%assign push_num 4
1683+%ifdef WIN64
1684+ mov r4,arg5
1685+ ; mov r5,arg6
1686+%endif
1687+ mov r14,arg7
1688+ SIGN_EXTENTION r2,r2d
1689+ SIGN_EXTENTION r3,r3d
1690+ SIGN_EXTENTION r4,r4d
1691+
1692+
1693+ mov r13,r4
1694+ mov r15,r0
1695+ shr r2,4
1696+ shr r3,4
1697+ shl r13,4
1698+ pxor xmm0, xmm0
1699+ pxor xmm8, xmm8
1700+ pxor xmm9, xmm9
10441701 bgd_height_loop:
1045− mov ecx, dword [iPicWidth]
1046− mov [tmp_esi], esi
1047− mov [tmp_edi], edi
1702+ ;mov ecx, dword [iPicWidth]
1703+ push r2
1704+ %assign push_num push_num+1
1705+ mov r10, r15
1706+ mov r11, r1
10481707 bgd_width_loop:
1049− pxor xmm7, xmm7 ; pSad8x8
1050− pxor xmm6, xmm6 ; sum_cur_8x8
1051− pxor xmm5, xmm5 ; sum_ref_8x8
1052− pxor xmm4, xmm4 ; pMad8x8
1053− WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4
1054− WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4
1055− WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4
1056− WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4
1057− WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4
1058− WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4
1059− WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4
1060− WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4
1061−
1062−
1063− mov edx, [p_mad8x8]
1064− WELS_MAX_REG_SSE2 xmm4
1065−
1066− ;movdqa xmm1, xmm4
1067− ;punpcklbw xmm1, xmm0
1068− ;punpcklwd xmm1, xmm0
1069− ;movd [edx], xmm1
1070− ;punpckhbw xmm4, xmm0
1071− ;punpcklwd xmm4, xmm0
1072− ;movd [edx+4], xmm4
1073− ;add edx, 8
1074− ;mov [p_mad8x8], edx
1075− mov [tmp_ecx], ecx
1076− movhlps xmm1, xmm4
1077− movd ecx, xmm4
1078− mov [edx], cl
1079− movd ecx, xmm1
1080− mov [edx+1],cl
1081− add edx, 2
1082− mov [p_mad8x8], edx
1083−
1084−
1085− pslldq xmm7, 4
1086− pslldq xmm6, 4
1087− pslldq xmm5, 4
1088−
1089−
1090− pxor xmm4, xmm4 ; pMad8x8
1091− WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4
1092− WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4
1093− WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4
1094− WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4
1095− WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4
1096− WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4
1097− WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4
1098− WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4
1099−
1100− mov edx, [p_mad8x8]
1101− WELS_MAX_REG_SSE2 xmm4
1102−
1103− ;movdqa xmm1, xmm4
1104− ;punpcklbw xmm1, xmm0
1105− ;punpcklwd xmm1, xmm0
1106− ;movd [edx], xmm1
1107− ;punpckhbw xmm4, xmm0
1108− ;punpcklwd xmm4, xmm0
1109− ;movd [edx+4], xmm4
1110− ;add edx, 8
1111− ;mov [p_mad8x8], edx
1112− movhlps xmm1, xmm4
1113− movd ecx, xmm4
1114− mov [edx], cl
1115− movd ecx, xmm1
1116− mov [edx+1],cl
1117− add edx, 2
1118− mov [p_mad8x8], edx
1119−
1120− ; data in xmm7, xmm6, xmm5: D1 D3 D0 D2
1121−
1122− mov edx, [psad8x8]
1123− pshufd xmm1, xmm7, 10001101b ; D3 D2 D1 D0
1124− movdqa [edx], xmm1
1125− add edx, 16
1126− mov [psad8x8], edx ; sad8x8
1127−
1128− paddd xmm1, xmm7 ; D1+3 D3+2 D0+1 D2+0
1129− pshufd xmm2, xmm1, 00000011b
1130− paddd xmm1, xmm2
1131− movd edx, xmm1
1132− add ebp, edx ; sad frame
1133−
1134− mov edx, [p_sd8x8]
1135− psubd xmm6, xmm5
1136− pshufd xmm1, xmm6, 10001101b
1137− movdqa [edx], xmm1
1138− add edx, 16
1139− mov [p_sd8x8], edx
1140−
1141−
1142− add edx, 16
1143− sub esi, eax
1144− sub edi, eax
1145− add esi, 16
1146− add edi, 16
1147−
1148− mov ecx, [tmp_ecx]
1149− dec ecx
1150− jnz bgd_width_loop
1151−
1152− mov esi, [tmp_esi]
1153− mov edi, [tmp_edi]
1154− add esi, eax
1155− add edi, eax
1156−
1157− dec dword [iPicHeight]
1158− jnz bgd_height_loop
1159−
1160− mov edx, [psadframe]
1161− mov [edx], ebp
1162−
1163− add esp, localsize
1164− pop ebx
1165− pop edi
1166− pop esi
1167− pop ebp
1168−%undef cur_data
1169−%undef ref_data
1170−%undef iPicWidth
1171−%undef iPicHeight
1172−%undef iPicStride
1173−%undef psadframe
1174−%undef psad8x8
1175−%undef p_sd8x8
1176−%undef p_mad8x8
1177−%undef tmp_esi
1178−%undef tmp_edi
1179−%undef pushsize
1180−%undef localsize
1181− ret
1708+ pxor xmm7, xmm7 ; pSad8x8
1709+ pxor xmm6, xmm6 ; sum_cur_8x8
1710+ pxor xmm5, xmm5 ; sum_ref_8x8
1711+ pxor xmm4, xmm4 ; pMad8x8
1712+ WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1713+ WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1714+ WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1715+ WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1716+ WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1717+ WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1718+ WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1719+ WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1720+
1721+
1722+ mov r14, p_mad8x8
1723+ WELS_MAX_REG_SSE2 xmm4
1724+
1725+ ;mov [tmp_ecx], ecx
1726+ movhlps xmm1, xmm4
1727+ movd r0d, xmm4
1728+
1729+
1730+ mov [r14], r0b
1731+ movd r0d, xmm1
1732+ mov [r14+1],r0b
1733+ add r14, 2
1734+ ;mov p_mad8x8, r14
1735+
1736+
1737+ pslldq xmm7, 4
1738+ pslldq xmm6, 4
1739+ pslldq xmm5, 4
1740+
1741+
1742+ pxor xmm4, xmm4 ; pMad8x8
1743+ WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1744+ WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1745+ WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1746+ WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1747+ WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1748+ WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1749+ WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1750+ WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1751+
1752+ ;mov r14, [p_mad8x8]
1753+ WELS_MAX_REG_SSE2 xmm4
1754+
1755+ movhlps xmm1, xmm4
1756+ movd r0d, xmm4
1757+ mov [r14], r0b
1758+ movd r0d, xmm1
1759+ mov [r14+1],r0b
1760+ add r14, 2
1761+ mov p_mad8x8, r14
1762+
1763+ ; data in xmm7, xmm6, xmm5: D1 D3 D0 D2
1764+
1765+ mov r14, psad8x8
1766+ pshufd xmm1, xmm7, 10001101b ; D3 D2 D1 D0
1767+ movdqa [r14], xmm1
1768+ add r14, 16
1769+ mov psad8x8, r14 ; sad8x8
1770+
1771+ paddd xmm1, xmm7 ; D1+3 D3+2 D0+1 D2+0
1772+ pshufd xmm2, xmm1, 00000011b
1773+ paddd xmm1, xmm2
1774+ movd r14d, xmm1
1775+ movd xmm9, r14d
1776+ paddd xmm8, xmm9 ; sad frame
1777+
1778+ mov r14, p_sd8x8
1779+ psubd xmm6, xmm5
1780+ pshufd xmm1, xmm6, 10001101b
1781+ movdqa [r14], xmm1
1782+ add r14, 16
1783+ mov p_sd8x8, r14
1784+
1785+
1786+ ;add edx, 16
1787+ sub r15, r13
1788+ sub r1, r13
1789+ add r15, 16
1790+ add r1, 16
1791+
1792+
1793+ dec r2
1794+ jnz bgd_width_loop
1795+ pop r2
1796+%assign push_num push_num-1
1797+ mov r15, r10
1798+ mov r1, r11
1799+ add r15, r13
1800+ add r1, r13
1801+
1802+ dec r3
1803+ jnz bgd_height_loop
1804+
1805+ mov r13, psadframe
1806+ movd [r13], xmm8
1807+
1808+ pop r15
1809+ pop r14
1810+ pop r13
1811+ pop r12
1812+%assign push_num 0
1813+%undef cur_data
1814+%undef ref_data
1815+%undef iPicWidth
1816+%undef iPicHeight
1817+%undef iPicStride
1818+%undef psadframe
1819+%undef psad8x8
1820+%undef p_sd8x8
1821+%undef p_mad8x8
1822+%undef tmp_esi
1823+%undef tmp_edi
1824+%undef pushsize
1825+%undef localsize
1826+ ret
11821827
11831828
11841829
11851830 WELS_EXTERN VAACalcSadSsdBgd_sse2
11861831 ;*************************************************************************************************************
11871832 ;void VAACalcSadSsdBgd_sse2(uint8_t *cur_data, uint8_t *ref_data, int32_t iPicWidth, int32_t iPicHeight,
1188−; int32_t iPicStride, int32_t *psadframe, int32_t *psad8x8, int32_t *psum16x16, int32_t *psqsum16x16,
1189−; int32_t *psqdiff16x16, int32_t *p_sd8x8, uint8_t *p_mad8x8)
1833+; int32_t iPicStride, int32_t *psadframe, int32_t *psad8x8, int32_t *psum16x16, int32_t *psqsum16x16,
1834+; int32_t *psqdiff16x16, int32_t *p_sd8x8, uint8_t *p_mad8x8)
11901835 ;*************************************************************************************************************
11911836
11921837
11931838 ALIGN 16
11941839 VAACalcSadSsdBgd_sse2:
1195−%define localsize 16
1196−%define cur_data esp + pushsize + localsize + 4
1197−%define ref_data esp + pushsize + localsize + 8
1198−%define iPicWidth esp + pushsize + localsize + 12
1199−%define iPicHeight esp + pushsize + localsize + 16
1200−%define iPicStride esp + pushsize + localsize + 20
1201−%define psadframe esp + pushsize + localsize + 24
1202−%define psad8x8 esp + pushsize + localsize + 28
1203−%define psum16x16 esp + pushsize + localsize + 32
1204−%define psqsum16x16 esp + pushsize + localsize + 36
1205−%define psqdiff16x16 esp + pushsize + localsize + 40
1206−%define p_sd8x8 esp + pushsize + localsize + 44
1207−%define p_mad8x8 esp + pushsize + localsize + 48
1208−%define tmp_esi esp + 0
1209−%define tmp_edi esp + 4
1210−%define tmp_sadframe esp + 8
1211−%define tmp_ecx esp + 12
1212−%define pushsize 16
1213− push ebp
1214− push esi
1215− push edi
1216− push ebx
1217− sub esp, localsize
1218− mov esi, [cur_data]
1219− mov edi, [ref_data]
1220− mov ebx, [iPicStride]
1221− mov eax, ebx
1222−
1223− shr dword [iPicWidth], 4 ; iPicWidth/16
1224− shr dword [iPicHeight], 4 ; iPicHeight/16
1225− shl eax, 4 ; iPicStride*16
1226− pxor xmm0, xmm0
1227− movd [tmp_sadframe], xmm0
1840+%define cur_data arg1;
1841+%define ref_data arg2;
1842+%define iPicWidth arg3;
1843+%define iPicHeight arg4;
1844+%define iPicStride arg5;
1845+%define psadframe arg6;
1846+%define psad8x8 arg7;
1847+%define psum16x16 arg8;
1848+%define psqsum16x16 arg9;
1849+%define psqdiff16x16 arg10;
1850+%ifdef WIN64
1851+%define p_sd8x8 [rsp + push_num*8 + 88];
1852+%define p_mad8x8 [rsp + push_num*8 + 96];
1853+%else ;linux
1854+%define p_sd8x8 [rsp + push_num*8 + 40];
1855+%define p_mad8x8 [rsp + push_num*8 + 48];
1856+%endif
1857+
1858+ push r12
1859+ push r13
1860+ push r14
1861+ push r15
1862+%assign push_num 4
1863+%ifdef WIN64
1864+ mov r4,arg5
1865+ ;mov r5,arg6
1866+%endif
1867+ SIGN_EXTENTION r2,r2d
1868+ SIGN_EXTENTION r3,r3d
1869+ SIGN_EXTENTION r4,r4d
1870+
1871+ mov r13,r4
1872+ shr r2, 4 ; iPicWidth/16
1873+ shr r3, 4 ; iPicHeight/16
1874+ shl r13, 4 ; iPicStride*16
1875+ pxor xmm0, xmm0
1876+ pxor xmm8, xmm8
1877+ pxor xmm9, xmm9
1878+
1879+
12281880 sqdiff_bgd_height_loop:
1229− mov ecx, dword [iPicWidth]
1230− mov [tmp_esi], esi
1231− mov [tmp_edi], edi
1881+ mov r10, r0
1882+ mov r11, r1
1883+ push r2
1884+%assign push_num push_num+1
12321885 sqdiff_bgd_width_loop:
1233− pxor xmm7, xmm7 ; pSad8x8 interleaves sqsum16x16: sqsum1 sad1 sqsum0 sad0
1234− pxor xmm6, xmm6 ; sum_8x8 interleaves cur and pRef in Dword, Sref1 Scur1 Sref0 Scur0
1235− pxor xmm5, xmm5 ; pMad8x8
1236− pxor xmm4, xmm4 ; sqdiff_16x16 four Dword
1237− WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4
1238− WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4
1239− WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4
1240− WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4
1241− WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4
1242− WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4
1243− WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4
1244− WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4
1245−
1246− mov edx, [psad8x8]
1247− movdqa xmm2, xmm7
1248− pshufd xmm1, xmm2, 00001110b
1249− movd [edx], xmm2
1250− movd [edx+4], xmm1
1251− add edx, 8
1252− mov [psad8x8], edx ; sad8x8
1253−
1254− paddd xmm1, xmm2
1255− movd edx, xmm1
1256− add [tmp_sadframe], edx ; iFrameSad
1257−
1258− mov edx, [psum16x16]
1259− movdqa xmm1, xmm6
1260− pshufd xmm2, xmm1, 00001110b
1261− paddd xmm1, xmm2
1262− movd [edx], xmm1 ; sum
1263−
1264− mov edx, [p_sd8x8]
1265− pshufd xmm1, xmm6, 11110101b ; Sref1 Sref1 Sref0 Sref0
1266− psubd xmm6, xmm1 ; 00 diff1 00 diff0
1267− pshufd xmm1, xmm6, 00001000b ; xx xx diff1 diff0
1268− movq [edx], xmm1
1269− add edx, 8
1270− mov [p_sd8x8], edx
1271−
1272− mov edx, [p_mad8x8]
1273− WELS_MAX_REG_SSE2 xmm5
1274− ;movdqa xmm1, xmm5
1275− ;punpcklbw xmm1, xmm0
1276− ;punpcklwd xmm1, xmm0
1277− ;movd [edx], xmm1
1278− ;punpckhbw xmm5, xmm0
1279− ;punpcklwd xmm5, xmm0
1280− ;movd [edx+4], xmm5
1281− ;add edx, 8
1282− ;mov [p_mad8x8], edx
1283− mov [tmp_ecx], ecx
1284− movhlps xmm1, xmm5
1285− movd ecx, xmm5
1286− mov [edx], cl
1287− movd ecx, xmm1
1288− mov [edx+1],cl
1289− add edx, 2
1290− mov [p_mad8x8], edx
1291−
1292− psrlq xmm7, 32
1293− psllq xmm7, 32 ; clear sad
1294− pxor xmm6, xmm6 ; sum_8x8 interleaves cur and pRef in Dword, Sref1 Scur1 Sref0 Scur0
1295− pxor xmm5, xmm5 ; pMad8x8
1296− WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4
1297− WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4
1298− WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4
1299− WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4
1300− WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4
1301− WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4
1302− WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4
1303− WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4
1304−
1305− mov edx, [psad8x8]
1306− movdqa xmm2, xmm7
1307− pshufd xmm1, xmm2, 00001110b
1308− movd [edx], xmm2
1309− movd [edx+4], xmm1
1310− add edx, 8
1311− mov [psad8x8], edx ; sad8x8
1312−
1313− paddd xmm1, xmm2
1314− movd edx, xmm1
1315− add [tmp_sadframe], edx ; iFrameSad
1316−
1317− mov edx, [psum16x16]
1318− movdqa xmm1, xmm6
1319− pshufd xmm2, xmm1, 00001110b
1320− paddd xmm1, xmm2
1321− movd ebp, xmm1 ; sum
1322− add [edx], ebp
1323− add edx, 4
1324− mov [psum16x16], edx
1325−
1326− mov edx, [psqsum16x16]
1327− psrlq xmm7, 32
1328− pshufd xmm2, xmm7, 00001110b
1329− paddd xmm2, xmm7
1330− movd [edx], xmm2 ; sqsum
1331− add edx, 4
1332− mov [psqsum16x16], edx
1333−
1334− mov edx, [p_sd8x8]
1335− pshufd xmm1, xmm6, 11110101b ; Sref1 Sref1 Sref0 Sref0
1336− psubd xmm6, xmm1 ; 00 diff1 00 diff0
1337− pshufd xmm1, xmm6, 00001000b ; xx xx diff1 diff0
1338− movq [edx], xmm1
1339− add edx, 8
1340− mov [p_sd8x8], edx
1341−
1342− mov edx, [p_mad8x8]
1343− WELS_MAX_REG_SSE2 xmm5
1344− ;movdqa xmm1, xmm5
1345− ;punpcklbw xmm1, xmm0
1346− ;punpcklwd xmm1, xmm0
1347− ;movd [edx], xmm1
1348− ;punpckhbw xmm5, xmm0
1349− ;punpcklwd xmm5, xmm0
1350− ;movd [edx+4], xmm5
1351− ;add edx, 8
1352− ;mov [p_mad8x8], edx
1353− movhlps xmm1, xmm5
1354− movd ecx, xmm5
1355− mov [edx], cl
1356− movd ecx, xmm1
1357− mov [edx+1],cl
1358− add edx, 2
1359− mov [p_mad8x8], edx
1360−
1361− mov edx, [psqdiff16x16]
1362− pshufd xmm1, xmm4, 00001110b
1363− paddd xmm4, xmm1
1364− pshufd xmm1, xmm4, 00000001b
1365− paddd xmm4, xmm1
1366− movd [edx], xmm4
1367− add edx, 4
1368− mov [psqdiff16x16], edx
1369−
1370− add edx, 16
1371− sub esi, eax
1372− sub edi, eax
1373− add esi, 16
1374− add edi, 16
1375−
1376− mov ecx, [tmp_ecx]
1377− dec ecx
1378− jnz sqdiff_bgd_width_loop
1379−
1380− mov esi, [tmp_esi]
1381− mov edi, [tmp_edi]
1382− add esi, eax
1383− add edi, eax
1384−
1385− dec dword [iPicHeight]
1386− jnz sqdiff_bgd_height_loop
1387−
1388− mov edx, [psadframe]
1389− mov ebp, [tmp_sadframe]
1390− mov [edx], ebp
1391−
1392− add esp, localsize
1393− pop ebx
1394− pop edi
1395− pop esi
1396− pop ebp
1397−%undef cur_data
1398−%undef ref_data
1399−%undef iPicWidth
1400−%undef iPicHeight
1401−%undef iPicStride
1402−%undef psadframe
1403−%undef psad8x8
1404−%undef psum16x16
1405−%undef psqsum16x16
1406−%undef psqdiff16x16
1407−%undef p_sd8x8
1408−%undef p_mad8x8
1409−%undef tmp_esi
1410−%undef tmp_edi
1411−%undef pushsize
1412−%undef localsize
1413− ret
1886+
1887+ pxor xmm7, xmm7 ; pSad8x8 interleaves sqsum16x16: sqsum1 sad1 sqsum0 sad0
1888+ pxor xmm6, xmm6 ; sum_8x8 interleaves cur and pRef in Dword, Sref1 Scur1 Sref0 Scur0
1889+ pxor xmm5, xmm5 ; pMad8x8
1890+ pxor xmm4, xmm4 ; sqdiff_16x16 four Dword
1891+ WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1892+ WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1893+ WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1894+ WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1895+ WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1896+ WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1897+ WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1898+ WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1899+
1900+ mov r14, psad8x8
1901+ movdqa xmm2, xmm7
1902+ pshufd xmm1, xmm2, 00001110b
1903+ movd [r14], xmm2
1904+ movd [r14+4], xmm1
1905+ add r14, 8
1906+ mov psad8x8, r14 ; sad8x8
1907+
1908+ paddd xmm1, xmm2
1909+ movd r14d, xmm1
1910+ movd xmm9,r14d
1911+ paddd xmm8, xmm9 ; iFrameSad
1912+
1913+ mov r14, psum16x16
1914+ movdqa xmm1, xmm6
1915+ pshufd xmm2, xmm1, 00001110b
1916+ paddd xmm1, xmm2
1917+ movd [r14], xmm1 ; sum
1918+
1919+ mov r14, p_sd8x8
1920+ pshufd xmm1, xmm6, 11110101b ; Sref1 Sref1 Sref0 Sref0
1921+ psubd xmm6, xmm1 ; 00 diff1 00 diff0
1922+ pshufd xmm1, xmm6, 00001000b ; xx xx diff1 diff0
1923+ movq [r14], xmm1
1924+ add r14, 8
1925+ mov p_sd8x8, r14
1926+
1927+ mov r14, p_mad8x8
1928+ WELS_MAX_REG_SSE2 xmm5
1929+
1930+ movhlps xmm1, xmm5
1931+ push r0
1932+ movd r0d, xmm5
1933+ mov [r14], r0b
1934+ movd r0d, xmm1
1935+ mov [r14+1],r0b
1936+ pop r0
1937+ add r14, 2
1938+ mov p_mad8x8, r14
1939+
1940+ psrlq xmm7, 32
1941+ psllq xmm7, 32 ; clear sad
1942+ pxor xmm6, xmm6 ; sum_8x8 interleaves cur and pRef in Dword, Sref1 Scur1 Sref0 Scur0
1943+ pxor xmm5, xmm5 ; pMad8x8
1944+ WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1945+ WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1946+ WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1947+ WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1948+ WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1949+ WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1950+ WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1951+ WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1952+
1953+ mov r14, psad8x8
1954+ movdqa xmm2, xmm7
1955+ pshufd xmm1, xmm2, 00001110b
1956+ movd [r14], xmm2
1957+ movd [r14+4], xmm1
1958+ add r14, 8
1959+ mov psad8x8, r14 ; sad8x8
1960+
1961+ paddd xmm1, xmm2
1962+ movd r14d, xmm1
1963+ movd xmm9, r14d
1964+ paddd xmm8, xmm9 ; iFrameSad
1965+
1966+ mov r14, psum16x16
1967+ movdqa xmm1, xmm6
1968+ pshufd xmm2, xmm1, 00001110b
1969+ paddd xmm1, xmm2
1970+ movd r15d, xmm1 ; sum
1971+ add [r14], r15d
1972+ add r14, 4
1973+ mov psum16x16, r14
1974+
1975+ mov r14, psqsum16x16
1976+ psrlq xmm7, 32
1977+ pshufd xmm2, xmm7, 00001110b
1978+ paddd xmm2, xmm7
1979+ movd [r14], xmm2 ; sqsum
1980+ add r14, 4
1981+ mov psqsum16x16, r14
1982+
1983+ mov r14, p_sd8x8
1984+ pshufd xmm1, xmm6, 11110101b ; Sref1 Sref1 Sref0 Sref0
1985+ psubd xmm6, xmm1 ; 00 diff1 00 diff0
1986+ pshufd xmm1, xmm6, 00001000b ; xx xx diff1 diff0
1987+ movq [r14], xmm1
1988+ add r14, 8
1989+ mov p_sd8x8, r14
1990+
1991+ mov r14, p_mad8x8
1992+ WELS_MAX_REG_SSE2 xmm5
1993+
1994+
1995+ movhlps xmm1, xmm5
1996+ push r0
1997+ movd r0d, xmm5
1998+ mov [r14], r0b
1999+ movd r0d, xmm1
2000+ mov [r14+1],r0b
2001+ pop r0
2002+ add r14, 2
2003+ mov p_mad8x8, r14
2004+
2005+ mov r14, psqdiff16x16
2006+ pshufd xmm1, xmm4, 00001110b
2007+ paddd xmm4, xmm1
2008+ pshufd xmm1, xmm4, 00000001b
2009+ paddd xmm4, xmm1
2010+ movd [r14], xmm4
2011+ add r14, 4
2012+ mov psqdiff16x16, r14
2013+
2014+ add r14, 16
2015+ sub r0, r13
2016+ sub r1, r13
2017+ add r0, 16
2018+ add r1, 16
2019+
2020+ dec r2
2021+ jnz sqdiff_bgd_width_loop
2022+ pop r2
2023+ %assign push_num push_num-1
2024+ mov r0, r10
2025+ mov r1, r11
2026+ add r0, r13
2027+ add r1, r13
2028+
2029+ dec r3
2030+ jnz sqdiff_bgd_height_loop
2031+
2032+ mov r14, psadframe
2033+ movd [r14], xmm8
2034+
2035+ pop r15
2036+ pop r14
2037+ pop r13
2038+ pop r12
2039+%assign push_num 0
2040+%undef cur_data
2041+%undef ref_data
2042+%undef iPicWidth
2043+%undef iPicHeight
2044+%undef iPicStride
2045+%undef psadframe
2046+%undef psad8x8
2047+%undef psum16x16
2048+%undef psqsum16x16
2049+%undef psqdiff16x16
2050+%undef p_sd8x8
2051+%undef p_mad8x8
2052+%undef tmp_esi
2053+%undef tmp_edi
2054+%undef pushsize
2055+%undef localsize
2056+ ret
14142057 %endif
codec/processing/src/common/cpu.cpp+0−196
@@ -1,196 +0,0 @@
1−/*!
2− * \copy
3− * Copyright (c) 2009-2013, Cisco Systems
4− * All rights reserved.
5− *
6− * Redistribution and use in source and binary forms, with or without
7− * modification, are permitted provided that the following conditions
8− * are met:
9− *
10− * * Redistributions of source code must retain the above copyright
11− * notice, this list of conditions and the following disclaimer.
12− *
13− * * Redistributions in binary form must reproduce the above copyright
14− * notice, this list of conditions and the following disclaimer in
15− * the documentation and/or other materials provided with the
16− * distribution.
17− *
18− * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19− * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20− * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
21− * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
22− * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
23− * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
24− * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25− * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26− * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27− * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
28− * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29− * POSSIBILITY OF SUCH DAMAGE.
30− *
31− * \file cpu.c
32− *
33− * \brief CPU compatibility detection
34− *
35− * \date 04/29/2009 Created
36− *
37− *************************************************************************************
38− */
39−
40−#include "util.h"
41−#include "cpu.h"
42−
43−WELSVP_NAMESPACE_BEGIN
44−
45−#define CPU_Vender_AMD "AuthenticAMD"
46−#define CPU_Vender_INTEL "GenuineIntel"
47−#define CPU_Vender_CYRIX "CyrixInstead"
48−
49−
50−#if defined(X86_ASM)
51−
52−uint32_t WelsCPUFeatureDetect (int32_t* pNumberOfLogicProcessors) {
53− uint32_t uiCPU = 0;
54− uint32_t uiFeatureA = 0, uiFeatureB = 0, uiFeatureC = 0, uiFeatureD = 0;
55− int32_t CacheLineSize = 0;
56− int8_t chVenderName[16] = { 0 };
57−
58− if (!WelsCPUIdVerify()) {
59− /* cpuid is not supported in cpu */
60− return 0;
61− }
62−
63− WelsCPUId (0, &uiFeatureA, (uint32_t*)&chVenderName[0], (uint32_t*)&chVenderName[8], (uint32_t*)&chVenderName[4]);
64− if (uiFeatureA == 0) {
65− /* maximum input value for basic cpuid information */
66− return 0;
67− }
68−
69− WelsCPUId (1, &uiFeatureA, &uiFeatureB, &uiFeatureC, &uiFeatureD);
70− if ((uiFeatureD & 0x00800000) == 0) {
71− /* Basic MMX technology is not support in cpu, mean nothing for us so return here */
72− return 0;
73− }
74−
75− uiCPU = WELS_CPU_MMX;
76− if (uiFeatureD & 0x02000000) {
77− /* SSE technology is identical to AMD MMX extensions */
78− uiCPU |= WELS_CPU_MMXEXT | WELS_CPU_SSE;
79− }
80− if (uiFeatureD & 0x04000000) {
81− /* SSE2 support here */
82− uiCPU |= WELS_CPU_SSE2;
83− }
84− if (uiFeatureD & 0x00000001) {
85− /* x87 FPU on-chip checking */
86− uiCPU |= WELS_CPU_FPU;
87− }
88− if (uiFeatureD & 0x00008000) {
89− /* CMOV instruction checking */
90− uiCPU |= WELS_CPU_CMOV;
91− }
92− if (!strcmp ((const str_t*)chVenderName, CPU_Vender_INTEL)) { // confirmed_safe_unsafe_usage
93− if (uiFeatureD & 0x10000000) {
94− /* Multi-Threading checking: contains of multiple logic processors */
95− uiCPU |= WELS_CPU_HTT;
96− }
97− }
98−
99− if (uiFeatureC & 0x00000001) {
100− /* SSE3 support here */
101− uiCPU |= WELS_CPU_SSE3;
102− }
103− if (uiFeatureC & 0x00000200) {
104− /* SSSE3 support here */
105− uiCPU |= WELS_CPU_SSSE3;
106− }
107− if (uiFeatureC & 0x00080000) {
108− /* SSE4.1 support here, 45nm Penryn processor */
109− uiCPU |= WELS_CPU_SSE41;
110− }
111− if (uiFeatureC & 0x00100000) {
112− /* SSE4.2 support here, next generation Nehalem processor */
113− uiCPU |= WELS_CPU_SSE42;
114− }
115− if (WelsCPUSupportAVX (uiFeatureA, uiFeatureC)) { //
116− /* AVX supported */
117− uiCPU |= WELS_CPU_AVX;
118− }
119− if (WelsCPUSupportFMA (uiFeatureA, uiFeatureC)) { //
120− /* AVX FMA supported */
121− uiCPU |= WELS_CPU_FMA;
122− }
123− if (uiFeatureC & 0x02000000) {
124− /* AES checking */
125− uiCPU |= WELS_CPU_AES;
126− }
127− if (uiFeatureC & 0x00400000) {
128− /* MOVBE checking */
129− uiCPU |= WELS_CPU_MOVBE;
130− }
131−
132− if (pNumberOfLogicProcessors != NULL) {
133− // HTT enabled on chip
134− *pNumberOfLogicProcessors = (uiFeatureB & 0x00ff0000) >> 16; // feature bits: 23-16 on returned EBX
135− }
136−
137− WelsCPUId (0x80000000, &uiFeatureA, &uiFeatureB, &uiFeatureC, &uiFeatureD);
138−
139− if ((!strcmp ((const str_t*)chVenderName, CPU_Vender_AMD))
140− && (uiFeatureA >= 0x80000001)) { // confirmed_safe_unsafe_usage
141− WelsCPUId (0x80000001, &uiFeatureA, &uiFeatureB, &uiFeatureC, &uiFeatureD);
142− if (uiFeatureD & 0x00400000) {
143− uiCPU |= WELS_CPU_MMXEXT;
144− }
145− if (uiFeatureD & 0x80000000) {
146− uiCPU |= WELS_CPU_3DNOW;
147− }
148− }
149−
150− if (!strcmp ((const str_t*)chVenderName, CPU_Vender_INTEL)) { // confirmed_safe_unsafe_usage
151− int32_t family, model;
152−
153− WelsCPUId (1, &uiFeatureA, &uiFeatureB, &uiFeatureC, &uiFeatureD);
154− family = ((uiFeatureA >> 8) & 0xf) + ((uiFeatureA >> 20) & 0xff);
155− model = ((uiFeatureA >> 4) & 0xf) + ((uiFeatureA >> 12) & 0xf0);
156−
157− if ((family == 6) && (model == 9 || model == 13 || model == 14)) {
158− uiCPU &= ~ (WELS_CPU_SSE2 | WELS_CPU_SSE3);
159− }
160− }
161−
162− // get cache line size
163− if ((!strcmp ((const str_t*)chVenderName, CPU_Vender_INTEL))
164− || ! (strcmp ((const str_t*)chVenderName, CPU_Vender_CYRIX))) { // confirmed_safe_unsafe_usage
165− WelsCPUId (1, &uiFeatureA, &uiFeatureB, &uiFeatureC, &uiFeatureD);
166−
167− CacheLineSize = (uiFeatureB & 0xff00) >>
168− 5; // ((clflush_line_size >> 8) << 3), CLFLUSH_line_size * 8 = CacheLineSize_in_byte
169−
170− if (CacheLineSize == 128) {
171− uiCPU |= WELS_CPU_CACHELINE_128;
172− } else if (CacheLineSize == 64) {
173− uiCPU |= WELS_CPU_CACHELINE_64;
174− } else if (CacheLineSize == 32) {
175− uiCPU |= WELS_CPU_CACHELINE_32;
176− } else if (CacheLineSize == 16) {
177− uiCPU |= WELS_CPU_CACHELINE_16;
178− }
179− }
180−
181− return uiCPU;
182−}
183−
184−
185−void WelsCPURestore (const uint32_t kuiCPU) {
186− if (kuiCPU & (WELS_CPU_MMX | WELS_CPU_MMXEXT | WELS_CPU_3DNOW | WELS_CPU_3DNOWEXT)) {
187− WelsEmms();
188− }
189−}
190−
191−#endif
192−
193−
194−WELSVP_NAMESPACE_END
195−
196−
codec/processing/src/common/cpu.h+0−102
@@ -1,102 +0,0 @@
1−/*!
2− * \copy
3− * Copyright (c) 2009-2013, Cisco Systems
4− * All rights reserved.
5− *
6− * Redistribution and use in source and binary forms, with or without
7− * modification, are permitted provided that the following conditions
8− * are met:
9− *
10− * * Redistributions of source code must retain the above copyright
11− * notice, this list of conditions and the following disclaimer.
12− *
13− * * Redistributions in binary form must reproduce the above copyright
14− * notice, this list of conditions and the following disclaimer in
15− * the documentation and/or other materials provided with the
16− * distribution.
17− *
18− * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19− * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20− * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
21− * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
22− * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
23− * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
24− * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25− * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26− * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27− * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
28− * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29− * POSSIBILITY OF SUCH DAMAGE.
30− *
31− * \file cpu.h
32− *
33− * \brief CPU feature compatibility detection
34− *
35− * \date 04/29/2009 Created
36− *
37− *************************************************************************************
38− */
39−
40−#ifndef WELSVP_CPU_H
41−#define WELSVP_CPU_H
42−
43−#include "typedef.h"
44−
45−WELSVP_NAMESPACE_BEGIN
46−
47−/*
48− * WELS CPU feature flags
49− */
50−#define WELS_CPU_MMX 0x00000001 /* mmx */
51−#define WELS_CPU_MMXEXT 0x00000002 /* mmx-ext*/
52−#define WELS_CPU_SSE 0x00000004 /* sse */
53−#define WELS_CPU_SSE2 0x00000008 /* sse 2 */
54−#define WELS_CPU_SSE3 0x00000010 /* sse 3 */
55−#define WELS_CPU_SSE41 0x00000020 /* sse 4.1 */
56−#define WELS_CPU_3DNOW 0x00000040 /* 3dnow! */
57−#define WELS_CPU_3DNOWEXT 0x00000080 /* 3dnow! ext */
58−#define WELS_CPU_ALTIVEC 0x00000100 /* altivec */
59−#define WELS_CPU_SSSE3 0x00000200 /* ssse3 */
60−#define WELS_CPU_SSE42 0x00000400 /* sse 4.2 */
61−
62−/* CPU features application extensive */
63−#define WELS_CPU_AVX 0x00000800 /* Advanced Vector eXtentions */
64−#define WELS_CPU_FPU 0x00001000 /* x87-FPU on chip */
65−#define WELS_CPU_HTT 0x00002000 /* Hyper-Threading Technology (HTT), Multi-threading enabled feature:
66− physical processor package is capable of supporting more than one logic processor
67− */
68−#define WELS_CPU_CMOV 0x00004000 /* Conditional Move Instructions,
69− also if x87-FPU is present at indicated by the CPUID.FPU feature bit, then FCOMI and FCMOV are supported
70− */
71−#define WELS_CPU_MOVBE 0x00008000 /* MOVBE instruction */
72−#define WELS_CPU_AES 0x00010000 /* AES instruction extensions */
73−#define WELS_CPU_FMA 0x00020000 /* AVX VEX FMA instruction sets */
74−
75−#define WELS_CPU_CACHELINE_16 0x10000000 /* CacheLine Size 16 */
76−#define WELS_CPU_CACHELINE_32 0x20000000 /* CacheLine Size 32 */
77−#define WELS_CPU_CACHELINE_64 0x40000000 /* CacheLine Size 64 */
78−#define WELS_CPU_CACHELINE_128 0x80000000 /* CacheLine Size 128 */
79−
80−/*
81− * Interfaces for CPU core feature detection as below
82− */
83−
84−#ifdef X86_ASM
85−WELSVP_EXTERN_C_BEGIN
86−
87−int32_t WelsCPUIdVerify();
88−
89−void WelsCPUId (uint32_t uiIndex, uint32_t* pFeatureA, uint32_t* pFeatureB, uint32_t* pFeatureC, uint32_t* pFeatureD);
90−int32_t WelsCPUSupportAVX (uint32_t eax, uint32_t ecx);
91−int32_t WelsCPUSupportFMA (uint32_t eax, uint32_t ecx);
92−
93−void WelsEmms();
94−
95−WELSVP_EXTERN_C_END
96−#endif
97−
98−uint32_t WelsCPUFeatureDetect (int32_t* pNumberOfLogicProcessors);
99−
100−WELSVP_NAMESPACE_END
101−
102−#endif
codec/processing/src/vaacalc/vaacalculation.cpp+5−5
@@ -58,11 +58,11 @@ void CVAACalculation::InitVaaFuncs (SVaaFuncs& sVaaFuncs, int32_t iCpuFlag) { · 57 unmodified lines
5858 sVaaFuncs.pfVAACalcSadVar = VAACalcSadVar_c;
5959 #ifdef X86_ASM
6060 if ((iCpuFlag & WELS_CPU_SSE2) == WELS_CPU_SSE2) {
61− /* sVaaFuncs.pfVAACalcSad = VAACalcSad_sse2;
62− sVaaFuncs.pfVAACalcSadBgd = VAACalcSadBgd_sse2;
63− sVaaFuncs.pfVAACalcSadSsd = VAACalcSadSsd_sse2;
64− sVaaFuncs.pfVAACalcSadSsdBgd = VAACalcSadSsdBgd_sse2;
65− sVaaFuncs.pfVAACalcSadVar = VAACalcSadVar_sse2;*/
61+ sVaaFuncs.pfVAACalcSad = VAACalcSad_sse2;
62+ sVaaFuncs.pfVAACalcSadBgd = VAACalcSadBgd_sse2;
63+ sVaaFuncs.pfVAACalcSadSsd = VAACalcSadSsd_sse2;
64+ sVaaFuncs.pfVAACalcSadSsdBgd = VAACalcSadSsdBgd_sse2;
65+ sVaaFuncs.pfVAACalcSadVar = VAACalcSadVar_sse2;
6666 }
6767 #endif//X86_ASM
6868 }

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