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
50 m_pfVar = NULL;50 m_pfVar = NULL;
51 WelsMemset (&m_sAdaptiveQuantParam, 0, sizeof (m_sAdaptiveQuantParam));51 WelsMemset (&m_sAdaptiveQuantParam, 0, sizeof (m_sAdaptiveQuantParam));
52 WelsInitVarFunc (m_pfVar, m_CPUFlag);52 WelsInitVarFunc (m_pfVar, m_CPUFlag);
53 XMMREG_PROTECT_INIT(AdaptiveQuantization);
53}54}
54 55
55CAdaptiveQuantization::~CAdaptiveQuantization() {56CAdaptiveQuantization::~CAdaptiveQuantization() {
57 XMMREG_PROTECT_UNINIT(AdaptiveQuantization);
56}58}
57 59
58EResult CAdaptiveQuantization::Process (int32_t iType, SPixMap* pSrcPixMap, SPixMap* pRefPixMap) {60EResult 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
101 pRefFrameTmp = pRefFrameY;103 pRefFrameTmp = pRefFrameY;
102 pCurFrameTmp = pCurFrameY;104 pCurFrameTmp = pCurFrameY;
103 for (i = 0; i < iMbWidth; i++) {105 for (i = 0; i < iMbWidth; i++) {
106 XMMREG_PROTECT_STORE(AdaptiveQuantization);
104 iSumDiff = pVaaCalcResults->pSad8x8[iMbIndex][0];107 iSumDiff = pVaaCalcResults->pSad8x8[iMbIndex][0];
105 iSumDiff += pVaaCalcResults->pSad8x8[iMbIndex][1];108 iSumDiff += pVaaCalcResults->pSad8x8[iMbIndex][1];
106 iSumDiff += pVaaCalcResults->pSad8x8[iMbIndex][2];109 iSumDiff += pVaaCalcResults->pSad8x8[iMbIndex][2];
@@ -109,6 +112,7 @@ EResult CAdaptiveQuantization::Process (int32_t iType, SPixMap* pSrcPixMap, SPix · 2 unmodified lines
109 iSQDiff = pVaaCalcResults->pSsd16x16[iMbIndex];112 iSQDiff = pVaaCalcResults->pSsd16x16[iMbIndex];
110 uiSum = pVaaCalcResults->pSum16x16[iMbIndex];113 uiSum = pVaaCalcResults->pSum16x16[iMbIndex];
111 iSQSum = pVaaCalcResults->pSumOfSquare16x16[iMbIndex];114 iSQSum = pVaaCalcResults->pSumOfSquare16x16[iMbIndex];
115 XMMREG_PROTECT_LOAD(AdaptiveQuantization);
112 116
113 iSumDiff = iSumDiff >> 8;117 iSumDiff = iSumDiff >> 8;
114 pMotionTexture->uiMotionIndex = (iSQDiff >> 8) - (iSumDiff * iSumDiff);118 pMotionTexture->uiMotionIndex = (iSQDiff >> 8) - (iSumDiff * iSumDiff);
@@ -131,7 +135,9 @@ EResult CAdaptiveQuantization::Process (int32_t iType, SPixMap* pSrcPixMap, SPix · 16 unmodified lines
131 pRefFrameTmp = pRefFrameY;135 pRefFrameTmp = pRefFrameY;
132 pCurFrameTmp = pCurFrameY;136 pCurFrameTmp = pCurFrameY;
133 for (i = 0; i < iMbWidth; i++) {137 for (i = 0; i < iMbWidth; i++) {
138 XMMREG_PROTECT_STORE(AdaptiveQuantization);
134 m_pfVar (pRefFrameTmp, iRefStride, pCurFrameTmp, iCurStride, pMotionTexture);139 m_pfVar (pRefFrameTmp, iRefStride, pCurFrameTmp, iCurStride, pMotionTexture);
140 XMMREG_PROTECT_LOAD(AdaptiveQuantization);
135 dAverageMotionIndex += pMotionTexture->uiMotionIndex;141 dAverageMotionIndex += pMotionTexture->uiMotionIndex;
136 dAverageTextureIndex += pMotionTexture->uiTextureIndex;142 dAverageTextureIndex += pMotionTexture->uiTextureIndex;
137 pMotionTexture++;143 pMotionTexture++;
@@ -223,7 +229,7 @@ void CAdaptiveQuantization::WelsInitVarFunc (PVarFunc& pfVar, int32_t iCpuFlag) · 85 unmodified lines
223 229
224#ifdef X86_ASM230#ifdef X86_ASM
225 if (iCpuFlag & WELS_CPU_SSE2) {231 if (iCpuFlag & WELS_CPU_SSE2) {
226 // pfVar = SampleVariance16x16_sse2;232 pfVar = SampleVariance16x16_sse2;
227 }233 }
228#endif234#endif
229}235}
codec/processing/src/adaptivequantization/AdaptiveQuantization.h+2−0
@@ -45,6 +45,7 @@ · 44 unmodified lines
45#include "../common/memory.h"45#include "../common/memory.h"
46#include "../common/WelsFrameWork.h"46#include "../common/WelsFrameWork.h"
47#include "../../interface/IWelsVP.h"47#include "../../interface/IWelsVP.h"
48#include "cpu.h"
48 49
49WELSVP_NAMESPACE_BEGIN50WELSVP_NAMESPACE_BEGIN
50 51
@@ -78,6 +79,7 @@ class CAdaptiveQuantization : public IStrategy { · 27 unmodified lines
78 PVarFunc m_pfVar;79 PVarFunc m_pfVar;
79 int32_t m_CPUFlag;80 int32_t m_CPUFlag;
80 SAdaptiveQuantizationParam m_sAdaptiveQuantParam;81 SAdaptiveQuantizationParam m_sAdaptiveQuantParam;
82 XMMREG_PROTECT_DECLARE(AdaptiveQuantization);
81};83};
82 84
83WELSVP_NAMESPACE_END85WELSVP_NAMESPACE_END
codec/processing/src/asm/vaa.asm+1907−1264
@@ -29,291 +29,211 @@ · 28 unmodified lines
29;* POSSIBILITY OF SUCH DAMAGE.29;* POSSIBILITY OF SUCH DAMAGE.
30;*30;*
31;*31;*
32;* vaa.asm32;* vaa.asm
33;*33;*
34;* Abstract34;* Abstract
35;* sse2 for pVaa routines35;* sse2 for pVaa routines
36;*36;*
37;* History37;* History
38;* 04/14/2010 Created38;* 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
39;*42;*
40;*************************************************************************/43;*************************************************************************/
41%include "asm_inc.asm"44%include "asm_inc.asm"
42%ifdef X86_3245
46
43;***********************************************************************47;***********************************************************************
44; Macros and other preprocessor constants48; Macros and other preprocessor constants
45;***********************************************************************49;***********************************************************************
46 50%macro SUM_SQR_SSE2 3 ; dst, pSrc, zero
47;%macro SUM_SSE2 4 ; dst, pSrc, zero, pack1_8x251 movdqa %1, %2
48; movdqa %1, %252 punpcklbw %1, %3
49; punpcklbw %1, %353 punpckhbw %2, %3
50; punpckhbw %2, %354 pmaddwd %1, %1
51; paddw %1, %255 pmaddwd %2, %2
52; pmaddwd %1, %456 paddd %1, %2
53; pshufd %2, %1, 04Eh ; 01001110 B57 pshufd %2, %1, 04Eh ; 01001110 B
54; paddd %1, %258 paddd %1, %2
55; pshufd %2, %1, 0B1h ; 10110001 B59 pshufd %2, %1, 0B1h ; 10110001 B
56; paddd %1, %260 paddd %1, %2
57;%endmacro ; END OF SUM_SSE261%endmacro ; END OF SUM_SQR_SSE2
58 62
59; by comparing it outperforms than phaddw(SSSE3) sets63%macro WELS_SAD_16x2_SSE2 3 ;esi :%1 edi:%2 ebx:%3
60%macro SUM_WORD_8x2_SSE2 2 ; dst(pSrc), tmp64 movdqa xmm1, [%1]
61 ; @sum_8x2 begin65 movdqa xmm2, [%2]
62 pshufd %2, %1, 04Eh ; 01001110 B66 movdqa xmm3, [%1+%3]
63 paddw %1, %267 movdqa xmm4, [%2+%3]
64 pshuflw %2, %1, 04Eh ; 01001110 B68 psadbw xmm1, xmm2
65 paddw %1, %269 psadbw xmm3, xmm4
66 pshuflw %2, %1, 0B1h ; 10110001 B70 paddd xmm6, xmm1
67 paddw %1, %271 paddd xmm6, xmm3
68 ; end of @sum_8x272 lea %1, [%1+%3*2]
69%endmacro ; END of SUM_WORD_8x2_SSE273 lea %2, [%2+%3*2]
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
125%endmacro74%endmacro
126 75
127%macro VAA_AVG_BLOCK_SSSE3 6 ; dst, t0, t1, t2, t3, t476; by comparing it outperforms than phaddw(SSSE3) sets
128 movdqa %1, [esi ] ; line 077%macro SUM_WORD_8x2_SSE2 2 ; dst(pSrc), tmp
129 movdqa %2, [esi+ecx] ; line 178 ; @sum_8x2 begin
130 movdqa %3, %179 pshufd %2, %1, 04Eh ; 01001110 B
131 punpcklbw %1, xmm780 paddw %1, %2
132 punpckhbw %3, xmm781 pshuflw %2, %1, 04Eh ; 01001110 B
133 movdqa %4, %282 paddw %1, %2
134 punpcklbw %4, xmm783 pshuflw %2, %1, 0B1h ; 10110001 B
135 punpckhbw %2, xmm784 paddw %1, %2
136 paddw %1, %485 ; end of @sum_8x2
137 paddw %2, %386%endmacro ; END of SUM_WORD_8x2_SSE2
138 movdqa %3, [esi+ebx] ; line 287
139 movdqa %4, [esi+edx] ; line 388%macro WELS_SAD_SUM_SQSUM_16x1_SSE2 3 ;esi:%1,edi:%2,ebx:%3
140 movdqa %5, %389 movdqa xmm1, [%1]
141 punpcklbw %3, xmm790 movdqa xmm2, [%2]
142 punpckhbw %5, xmm791 movdqa xmm3, xmm1
143 movdqa %6, %492 psadbw xmm3, xmm2
144 punpcklbw %6, xmm793 paddd xmm6, xmm3
145 punpckhbw %4, xmm794
146 paddw %3, %695 movdqa xmm3, xmm1
147 paddw %4, %596 psadbw xmm3, xmm0
148 paddw %1, %3 ; block 0, 197 paddd xmm5, xmm3
149 paddw %2, %4 ; block 2, 398
150 phaddw %1, %2 ; block[0]: 0-15, 16-31; block[1]: 32-47, 48-63; ..99 movdqa xmm2, xmm1
151 phaddw %1, xmm7 ; block[0]: 0-15; block[1]: 16-31; block[2]: 32-47; block[3]: 48-63; ....100 punpcklbw xmm1, xmm0
152 psraw %1, $04101 punpckhbw xmm2, xmm0
153%endmacro102 pmaddwd xmm1, xmm1
154 103 pmaddwd xmm2, xmm2
155%macro WELS_SAD_16x2_SSE2 0104 paddd xmm4, xmm1
156 movdqa xmm1, [esi]105 paddd xmm4, xmm2
157 movdqa xmm2, [edi]106
158 movdqa xmm3, [esi+ebx]107 add %1, %3
159 movdqa xmm4, [edi+ebx]108 add %2, %3
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
189%endmacro109%endmacro
190 110
191%macro WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 0111%macro WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 3 ;esi:%1 edi:%2 ebx:%3
192 movdqa xmm1, [esi]112 movdqa xmm1, [%1]
193 movdqa xmm2, [edi]113 movdqa xmm2, [%2]
194 movdqa xmm3, xmm1114 movdqa xmm3, xmm1
195 psadbw xmm3, xmm2115 psadbw xmm3, xmm2
196 paddd xmm7, xmm3 ; sad116 paddd xmm7, xmm3 ; sad
197 117
198 movdqa xmm3, xmm1118 movdqa xmm3, xmm1
199 pmaxub xmm3, xmm2119 pmaxub xmm3, xmm2
200 pminub xmm2, xmm1120 pminub xmm2, xmm1
201 psubb xmm3, xmm2 ; diff121 psubb xmm3, xmm2 ; diff
202 122
203 movdqa xmm2, xmm1123 movdqa xmm2, xmm1
204 psadbw xmm2, xmm0124 psadbw xmm2, xmm0
205 paddd xmm6, xmm2 ; sum125 paddd xmm6, xmm2 ; sum
206 126
207 movdqa xmm2, xmm1127 movdqa xmm2, xmm1
208 punpcklbw xmm1, xmm0128 punpcklbw xmm1, xmm0
209 punpckhbw xmm2, xmm0129 punpckhbw xmm2, xmm0
210 pmaddwd xmm1, xmm1130 pmaddwd xmm1, xmm1
211 pmaddwd xmm2, xmm2131 pmaddwd xmm2, xmm2
212 paddd xmm5, xmm1132 paddd xmm5, xmm1
213 paddd xmm5, xmm2 ; sqsum133 paddd xmm5, xmm2 ; sqsum
214 134
215 movdqa xmm1, xmm3135 movdqa xmm1, xmm3
216 punpcklbw xmm1, xmm0136 punpcklbw xmm1, xmm0
217 punpckhbw xmm3, xmm0137 punpckhbw xmm3, xmm0
218 pmaddwd xmm1, xmm1138 pmaddwd xmm1, xmm1
219 pmaddwd xmm3, xmm3139 pmaddwd xmm3, xmm3
220 paddd xmm4, xmm1140 paddd xmm4, xmm1
221 paddd xmm4, xmm3 ; sqdiff141 paddd xmm4, xmm3 ; sqdiff
222 142
223 add esi, ebx143 add %1, %3
224 add edi, ebx144 add %2, %3
225%endmacro145%endmacro
226 146
227%macro WELS_SAD_SD_MAD_16x1_SSE2 4147%macro WELS_SAD_SD_MAD_16x1_SSE2 7 ;esi:%5 edi:%6 ebx:%7
228%define sad_reg %1148%define sad_reg %1
229%define sum_cur_reg %2149%define sum_cur_reg %2
230%define sum_ref_reg %3150%define sum_ref_reg %3
231%define mad_reg %4151%define mad_reg %4
232 movdqa xmm1, [esi]152 movdqa xmm1, [%5]
233 movdqa xmm2, [edi]153 movdqa xmm2, [%6]
234 movdqa xmm3, xmm1154 movdqa xmm3, xmm1
235 psadbw xmm3, xmm0155 psadbw xmm3, xmm0
236 paddd sum_cur_reg, xmm3 ; sum_cur156 paddd sum_cur_reg, xmm3 ; sum_cur
237 movdqa xmm3, xmm2157 movdqa xmm3, xmm2
238 psadbw xmm3, xmm0158 psadbw xmm3, xmm0
239 paddd sum_ref_reg, xmm3 ; sum_ref159 paddd sum_ref_reg, xmm3 ; sum_ref
240 160
241 movdqa xmm3, xmm1161 movdqa xmm3, xmm1
242 pmaxub xmm3, xmm2162 pmaxub xmm3, xmm2
243 pminub xmm2, xmm1163 pminub xmm2, xmm1
244 psubb xmm3, xmm2 ; abs diff164 psubb xmm3, xmm2 ; abs diff
245 pmaxub mad_reg, xmm3 ; max abs diff165 pmaxub mad_reg, xmm3 ; max abs diff
246 166
247 psadbw xmm3, xmm0167 psadbw xmm3, xmm0
248 paddd sad_reg, xmm3 ; sad168 paddd sad_reg, xmm3 ; sad
249 169
250 add esi, ebx170 add %5, %7
251 add edi, ebx171 add %6, %7
252%endmacro172%endmacro
253 173
254 174
255%macro WELS_MAX_REG_SSE2 1 ; xmm1, xmm2, xmm3 can be used175%macro WELS_MAX_REG_SSE2 1 ; xmm1, xmm2, xmm3 can be used
256%define max_reg %1176%define max_reg %1
257 movdqa xmm1, max_reg177 movdqa xmm1, max_reg
258 psrldq xmm1, 4178 psrldq xmm1, 4
259 pmaxub max_reg, xmm1179 pmaxub max_reg, xmm1
260 movdqa xmm1, max_reg180 movdqa xmm1, max_reg
261 psrldq xmm1, 2181 psrldq xmm1, 2
262 pmaxub max_reg, xmm1182 pmaxub max_reg, xmm1
263 movdqa xmm1, max_reg183 movdqa xmm1, max_reg
264 psrldq xmm1, 1184 psrldq xmm1, 1
265 pmaxub max_reg, xmm1185 pmaxub max_reg, xmm1
266%endmacro186%endmacro
267 187
268%macro WELS_SAD_BGD_SQDIFF_16x1_SSE2 4188%macro WELS_SAD_BGD_SQDIFF_16x1_SSE2 7 ;esi:%5 edi:%6 ebx:%7
269%define sad_reg %1189%define sad_reg %1
270%define sum_reg %2190%define sum_reg %2
271%define mad_reg %3191%define mad_reg %3
272%define sqdiff_reg %4192%define sqdiff_reg %4
273 movdqa xmm1, [esi]193 movdqa xmm1, [%5]
274 movdqa xmm2, xmm1194 movdqa xmm2, xmm1
275 movdqa xmm3, xmm1195 movdqa xmm3, xmm1
276 punpcklbw xmm2, xmm0196 punpcklbw xmm2, xmm0
277 punpckhbw xmm3, xmm0197 punpckhbw xmm3, xmm0
278 pmaddwd xmm2, xmm2198 pmaddwd xmm2, xmm2
279 pmaddwd xmm3, xmm3199 pmaddwd xmm3, xmm3
280 paddd xmm2, xmm3200 paddd xmm2, xmm3
281 movdqa xmm3, xmm2201 movdqa xmm3, xmm2
282 psllq xmm2, 32202 psllq xmm2, 32
283 psrlq xmm3, 32203 psrlq xmm3, 32
284 psllq xmm3, 32204 psllq xmm3, 32
285 paddd xmm2, xmm3205 paddd xmm2, xmm3
286 paddd sad_reg, xmm2 ; sqsum206 paddd sad_reg, xmm2 ; sqsum
287 207
288 movdqa xmm2, [edi]208 movdqa xmm2, [%6]
289 movdqa xmm3, xmm1209 movdqa xmm3, xmm1
290 psadbw xmm3, xmm0210 psadbw xmm3, xmm0
291 paddd sum_reg, xmm3 ; sum_cur211 paddd sum_reg, xmm3 ; sum_cur
292 movdqa xmm3, xmm2212 movdqa xmm3, xmm2
293 psadbw xmm3, xmm0213 psadbw xmm3, xmm0
294 pslldq xmm3, 4214 pslldq xmm3, 4
295 paddd sum_reg, xmm3 ; sum_ref215 paddd sum_reg, xmm3 ; sum_ref
296 216
297 movdqa xmm3, xmm1217 movdqa xmm3, xmm1
298 pmaxub xmm3, xmm2218 pmaxub xmm3, xmm2
299 pminub xmm2, xmm1219 pminub xmm2, xmm1
300 psubb xmm3, xmm2 ; abs diff220 psubb xmm3, xmm2 ; abs diff
301 pmaxub mad_reg, xmm3 ; max abs diff221 pmaxub mad_reg, xmm3 ; max abs diff
302 222
303 movdqa xmm1, xmm3223 movdqa xmm1, xmm3
304 psadbw xmm3, xmm0224 psadbw xmm3, xmm0
305 paddd sad_reg, xmm3 ; sad225 paddd sad_reg, xmm3 ; sad
306 226
307 movdqa xmm3, xmm1227 movdqa xmm3, xmm1
308 punpcklbw xmm1, xmm0228 punpcklbw xmm1, xmm0
309 punpckhbw xmm3, xmm0229 punpckhbw xmm3, xmm0
310 pmaddwd xmm1, xmm1230 pmaddwd xmm1, xmm1
311 pmaddwd xmm3, xmm3231 pmaddwd xmm3, xmm3
312 paddd sqdiff_reg, xmm1232 paddd sqdiff_reg, xmm1
313 paddd sqdiff_reg, xmm3 ; sqdiff233 paddd sqdiff_reg, xmm3 ; sqdiff
314 234
315 add esi, ebx235 add %5, %7
316 add edi, ebx236 add %6, %7
317%endmacro237%endmacro
318 238
319 239
@@ -325,7 +245,7 @@ · 5 unmodified lines
325 245
326;ALIGN 16246;ALIGN 16
327;pack1_8x2:247;pack1_8x2:
328; dw 1, 1, 1, 1, 1, 1, 1, 1248; dw 1, 1, 1, 1, 1, 1, 1, 1
329 249
330;***********************************************************************250;***********************************************************************
331; Code251; Code
@@ -333,1082 +253,1805 @@ · 1 unmodified line
333 253
334SECTION .text254SECTION .text
335 255
336WELS_EXTERN rc_sad_frame_sse2256%ifdef X86_32
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;***********************************************************************
340ALIGN 16
341rc_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
380 257
381WELS_EXTERN SampleVariance16x16_sse2258WELS_EXTERN SampleVariance16x16_sse2
382;***********************************************************************259;***********************************************************************
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 );
384;***********************************************************************261;***********************************************************************
385ALIGN 16262ALIGN 16
386SampleVariance16x16_sse2:263SampleVariance16x16_sse2:
387 push esi264 push esi
388 push edi265 push edi
389 push ebx266 push ebx
390 267
391 sub esp, 16268 sub esp, 16
392 %define SUM [esp]269 %define SUM [esp]
393 %define SUM_CUR [esp+4]270 %define SUM_CUR [esp+4]
394 %define SQR [esp+8]271 %define SQR [esp+8]
395 %define SQR_CUR [esp+12]272 %define SQR_CUR [esp+12]
396 %define PUSH_SIZE 28 ; 12 + 16273 %define PUSH_SIZE 28 ; 12 + 16
397 274
398 mov edi, [esp+PUSH_SIZE+4] ; y_ref275 mov edi, [esp+PUSH_SIZE+4] ; y_ref
399 mov edx, [esp+PUSH_SIZE+8] ; y_ref_stride276 mov edx, [esp+PUSH_SIZE+8] ; y_ref_stride
400 mov esi, [esp+PUSH_SIZE+12] ; y_src277 mov esi, [esp+PUSH_SIZE+12] ; y_src
401 mov eax, [esp+PUSH_SIZE+16] ; y_src_stride278 mov eax, [esp+PUSH_SIZE+16] ; y_src_stride
402 mov ecx, 010h ; height = 16279 mov ecx, 010h ; height = 16
403 280
404 pxor xmm7, xmm7281 pxor xmm7, xmm7
405 movdqu SUM, xmm7282 movdqu SUM, xmm7
406 283
407.hloops:284.hloops:
408 movdqa xmm0, [edi] ; y_ref285 movdqa xmm0, [edi] ; y_ref
409 movdqa xmm1, [esi] ; y_src286 movdqa xmm1, [esi] ; y_src
410 movdqa xmm2, xmm0 ; store first for future process287 movdqa xmm2, xmm0 ; store first for future process
411 movdqa xmm3, xmm1288 movdqa xmm3, xmm1
412 ; sum += diff;289 ; sum += diff;
413 movdqa xmm4, xmm0290 movdqa xmm4, xmm0
414 psadbw xmm4, xmm1 ; 2 parts, [0,..,15], [64,..,79]291 psadbw xmm4, xmm1 ; 2 parts, [0,..,15], [64,..,79]
415 ; to be continued for sum292 ; to be continued for sum
416 pshufd xmm5, xmm4, 0C6h ; 11000110 B293 pshufd xmm5, xmm4, 0C6h ; 11000110 B
417 paddw xmm4, xmm5294 paddw xmm4, xmm5
418 movd ebx, xmm4295 movd ebx, xmm4
419 add SUM, ebx296 add SUM, ebx
420 297
421 ; sqr += diff * diff;298 ; sqr += diff * diff;
422 pmaxub xmm0, xmm1299 pmaxub xmm0, xmm1
423 pminub xmm1, xmm2300 pminub xmm1, xmm2
424 psubb xmm0, xmm1 ; diff301 psubb xmm0, xmm1 ; diff
425 SUM_SQR_SSE2 xmm1, xmm0, xmm7 ; dst, pSrc, zero302 SUM_SQR_SSE2 xmm1, xmm0, xmm7 ; dst, pSrc, zero
426 movd ebx, xmm1303 movd ebx, xmm1
427 add SQR, ebx304 add SQR, ebx
428 305
429 ; sum_cur += y_src[x];306 ; sum_cur += y_src[x];
430 movdqa xmm0, xmm3 ; cur_orig307 movdqa xmm0, xmm3 ; cur_orig
431 movdqa xmm1, xmm0308 movdqa xmm1, xmm0
432 punpcklbw xmm0, xmm7309 punpcklbw xmm0, xmm7
433 punpckhbw xmm1, xmm7310 punpckhbw xmm1, xmm7
434 paddw xmm0, xmm1 ; 8x2311 paddw xmm0, xmm1 ; 8x2
435 SUM_WORD_8x2_SSE2 xmm0, xmm1312 SUM_WORD_8x2_SSE2 xmm0, xmm1
436 movd ebx, xmm0313 movd ebx, xmm0
437 and ebx, 0ffffh314 and ebx, 0ffffh
438 add SUM_CUR, ebx315 add SUM_CUR, ebx
439 316
440 ; sqr_cur += y_src[x] * y_src[x];317 ; sqr_cur += y_src[x] * y_src[x];
441 SUM_SQR_SSE2 xmm0, xmm3, xmm7 ; dst, pSrc, zero318 SUM_SQR_SSE2 xmm0, xmm3, xmm7 ; dst, pSrc, zero
442 movd ebx, xmm0319 movd ebx, xmm0
443 add SQR_CUR, ebx320 add SQR_CUR, ebx
444 321
445 lea edi, [edi+edx]322 lea edi, [edi+edx]
446 lea esi, [esi+eax]323 lea esi, [esi+eax]
447 dec ecx324 dec ecx
448 jnz near .hloops325 jnz near .hloops
449 326
450 mov ebx, 0327 mov ebx, 0
451 mov bx, word SUM328 mov bx, word SUM
452 sar ebx, 8329 sar ebx, 8
453 imul ebx, ebx330 imul ebx, ebx
454 mov ecx, SQR331 mov ecx, SQR
455 sar ecx, 8332 sar ecx, 8
456 sub ecx, ebx333 sub ecx, ebx
457 mov edi, [esp+PUSH_SIZE+20] ; pMotionTexture334 mov edi, [esp+PUSH_SIZE+20] ; pMotionTexture
458 mov [edi], cx ; to store uiMotionIndex335 mov [edi], cx ; to store uiMotionIndex
459 mov ebx, 0336 mov ebx, 0
460 mov bx, word SUM_CUR337 mov bx, word SUM_CUR
461 sar ebx, 8338 sar ebx, 8
462 imul ebx, ebx339 imul ebx, ebx
463 mov ecx, SQR_CUR340 mov ecx, SQR_CUR
464 sar ecx, 8341 sar ecx, 8
465 sub ecx, ebx342 sub ecx, ebx
466 mov [edi+2], cx ; to store uiTextureIndex343 mov [edi+2], cx ; to store uiTextureIndex
467 344
468 %undef SUM345 %undef SUM
469 %undef SUM_CUR346 %undef SUM_CUR
470 %undef SQR347 %undef SQR
471 %undef SQR_CUR348 %undef SQR_CUR
472 %undef PUSH_SIZE349 %undef PUSH_SIZE
473 350
474 add esp, 16351 add esp, 16
475 pop ebx352 pop ebx
476 pop edi353 pop edi
477 pop esi354 pop esi
478 355
479 ret356 ret
480 357
481; , 6/7/2010358
482 359
483 360WELS_EXTERN VAACalcSad_sse2
484WELS_EXTERN abs_difference_mbrow_sse2
485;*************************************************************************************************************361;*************************************************************************************************************
486;void abs_difference_mbrow_sse2( uint8_t *ref_orig, uint8_t *cur_orig, int32_t iPicStride,362;void VAACalcSad_sse2( uint8_t *cur_data, uint8_t *ref_data, int32_t iPicWidth, int32_t iPicHeight
487; int32_t gom_pixel_num, int32_t *pSum)363; int32_t iPicStride, int32_t *psadframe, int32_t *psad8x8)
488;*************************************************************************************************************364;*************************************************************************************************************
365
366
489ALIGN 16367ALIGN 16
490abs_difference_mbrow_sse2:368VAACalcSad_sse2:
491%define ref_orig esp + pushsize + 4369%define cur_data esp + pushsize + 4
492%define cur_orig esp + pushsize + 8370%define ref_data esp + pushsize + 8
493%define iPicStride esp + pushsize + 12371%define iPicWidth esp + pushsize + 12
494%define gom_pixel_num esp + pushsize + 16372%define iPicHeight esp + pushsize + 16
495%define pSum esp + pushsize + 20373%define iPicStride esp + pushsize + 20
496%define pushsize 12374%define psadframe esp + pushsize + 24
497 push esi375%define psad8x8 esp + pushsize + 28
498 push edi376%define pushsize 12
499 push ebx377 push esi
500 mov esi, [ref_orig]378 push edi
501 mov edi, [cur_orig]379 push ebx
502 mov ebx, [iPicStride]380 mov esi, [cur_data]
503 mov eax, [gom_pixel_num]381 mov edi, [ref_data]
504 mov ecx, 16 ;MB_WIDTH_LUMA382 mov ebx, [iPicStride]
505 pxor xmm0, xmm0383 mov edx, [psad8x8]
506mb_width_loop_p:384 mov eax, ebx
507 mov edx, esi385
508 add edx, eax ; end address386 shr dword [iPicWidth], 4 ; iPicWidth/16
509gom_row_loop_p:387 shr dword [iPicHeight], 4 ; iPicHeight/16
510 movdqa xmm1, [esi]388 shl eax, 4 ; iPicStride*16
511 movdqa xmm2, [edi]389 pxor xmm0, xmm0
512 psadbw xmm1, xmm2390 pxor xmm7, xmm7 ; iFrameSad
513 paddd xmm0, xmm1391height_loop:
514 add esi, 16392 mov ecx, dword [iPicWidth]
515 add edi, 16393 push esi
516 cmp esi, edx394 push edi
517 jl gom_row_loop_p395width_loop:
518 396 pxor xmm6, xmm6 ;
519 sub esi, eax397 WELS_SAD_16x2_SSE2 esi,edi,ebx
520 sub edi, eax398 WELS_SAD_16x2_SSE2 esi,edi,ebx
521 add esi, ebx399 WELS_SAD_16x2_SSE2 esi,edi,ebx
522 add edi, ebx400 WELS_SAD_16x2_SSE2 esi,edi,ebx
523 loop mb_width_loop_p401 paddd xmm7, xmm6
524 402 movd [edx], xmm6
525 movdqa xmm1, xmm0403 psrldq xmm6, 8
526 psrldq xmm1, 8404 movd [edx+4], xmm6
527 paddd xmm1, xmm0405
528 movd eax, xmm1406 pxor xmm6, xmm6
529 mov edx, [pSum] ; pSum407 WELS_SAD_16x2_SSE2 esi,edi,ebx
530 add [edx], eax408 WELS_SAD_16x2_SSE2 esi,edi,ebx
531 409 WELS_SAD_16x2_SSE2 esi,edi,ebx
532%undef ref_orig410 WELS_SAD_16x2_SSE2 esi,edi,ebx
533%undef cur_orig411 paddd xmm7, xmm6
534%undef iPicStride412 movd [edx+8], xmm6
535%undef gom_pixel_num413 psrldq xmm6, 8
536%undef pSum414 movd [edx+12], xmm6
537%undef pushsize415
538 pop ebx416 add edx, 16
539 pop edi417 sub esi, eax
540 pop esi418 sub edi, eax
541 ret419 add esi, 16
542 420 add edi, 16
543 421
544 422 dec ecx
545 423 jnz width_loop
546WELS_EXTERN sum_sqrsum_mbrow_sse2424
547;*************************************************************************************************************425 pop edi
548;void sum_sqrsum_mbrow_sse2( uint8_t *cur_orig, int32_t iPicStride,426 pop esi
549; int32_t gom_pixel_num, int32_t *pSum, int32_t *pSqrSum)427 add esi, eax
550;*************************************************************************************************************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
454WELS_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;***********************************************************************
551ALIGN 16458ALIGN 16
552sum_sqrsum_mbrow_sse2:459SampleVariance16x16_sse2:
553%define cur_orig esp + pushsize + 4460 %define SUM r10;[esp]
554%define iPicStride esp + pushsize + 8461 %define SUM_CUR r11;[esp+4]
555%define gom_pixel_num esp + pushsize + 12462 %define SQR r13;[esp+8]
556%define pSum esp + pushsize + 16463 %define SQR_CUR r15;[esp+12]
557%define pSqrSum esp + pushsize + 20464
558%define pushsize 8465 push r12
559 push esi466 push r13
560 push ebx467 push r14
561 mov esi, [cur_orig]468 push r15
562 mov eax, [gom_pixel_num]469 %assign push_num 4
563 mov ebx, [iPicStride]470 LOAD_5_PARA
564 mov ecx, 16 ;MB_WIDTH_LUMA471 SIGN_EXTENTION r1,r1d
565 pxor xmm0, xmm0 ; zero472 SIGN_EXTENTION r3,r3d
566 pxor xmm1, xmm1 ; sum473
567 pxor xmm2, xmm2 ; sqr sum474 mov r12,010h
568mb_width_loop_i:475 pxor xmm7, xmm7
569 mov edx, esi476 movq SUM, xmm7
570 add edx, eax ; end address477 movq SUM_CUR,xmm7
571gom_row_loop_i:478 movq SQR,xmm7
572 movdqa xmm3, [esi]479 movq SQR_CUR,xmm7
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
618 480
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
619 550
620 551
621WELS_EXTERN VAACalcSad_sse2552WELS_EXTERN VAACalcSad_sse2
622;*************************************************************************************************************553;*************************************************************************************************************
623;void VAACalcSad_sse2( uint8_t *cur_data, uint8_t *ref_data, int32_t iPicWidth, int32_t iPicHeight554;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)
625;*************************************************************************************************************556;*************************************************************************************************************
626 557
627 558
628ALIGN 16559ALIGN 16
629VAACalcSad_sse2:560VAACalcSad_sse2:
630%define cur_data esp + pushsize + 4561%define cur_data r0
631%define ref_data esp + pushsize + 8562%define ref_data r1
632%define iPicWidth esp + pushsize + 12563%define iPicWidth r2
633%define iPicHeight esp + pushsize + 16564%define iPicHeight r3
634%define iPicStride esp + pushsize + 20565%define iPicStride r4
635%define psadframe esp + pushsize + 24566%define psadframe r5
636%define psad8x8 esp + pushsize + 28567%define psad8x8 r6
637%define pushsize 12568
638 push esi569 push r12
639 push edi570 push r13
640 push ebx571 %assign push_num 2
641 mov esi, [cur_data]572 LOAD_7_PARA
642 mov edi, [ref_data]573 SIGN_EXTENTION r2,r2d
643 mov ebx, [iPicStride]574 SIGN_EXTENTION r3,r3d
644 mov edx, [psad8x8]575 SIGN_EXTENTION r4,r4d
645 mov eax, ebx576
646 577 mov r12,r4
647 shr dword [iPicWidth], 4 ; iPicWidth/16578 shr r2, 4 ; iPicWidth/16
648 shr dword [iPicHeight], 4 ; iPicHeight/16579 shr r3, 4 ; iPicHeight/16
649 shl eax, 4 ; iPicStride*16580
650 pxor xmm0, xmm0581 shl r12, 4 ; iPicStride*16
651 pxor xmm7, xmm7 ; iFrameSad582 pxor xmm0, xmm0
583 pxor xmm7, xmm7 ; iFrameSad
652height_loop:584height_loop:
653 mov ecx, dword [iPicWidth]585 mov r13, r2
654 push esi586 push r0
655 push edi587 push r1
656width_loop:588width_loop:
657 pxor xmm6, xmm6 ;589 pxor xmm6, xmm6
658 WELS_SAD_16x2_SSE2590 WELS_SAD_16x2_SSE2 r0,r1,r4
659 WELS_SAD_16x2_SSE2591 WELS_SAD_16x2_SSE2 r0,r1,r4
660 WELS_SAD_16x2_SSE2592 WELS_SAD_16x2_SSE2 r0,r1,r4
661 WELS_SAD_16x2_SSE2593 WELS_SAD_16x2_SSE2 r0,r1,r4
662 paddd xmm7, xmm6594 paddd xmm7, xmm6
663 movd [edx], xmm6595 movd [r6], xmm6
664 psrldq xmm6, 8596 psrldq xmm6, 8
665 movd [edx+4], xmm6597 movd [r6+4], xmm6
666 598
667 pxor xmm6, xmm6599 pxor xmm6, xmm6
668 WELS_SAD_16x2_SSE2600 WELS_SAD_16x2_SSE2 r0,r1,r4
669 WELS_SAD_16x2_SSE2601 WELS_SAD_16x2_SSE2 r0,r1,r4
670 WELS_SAD_16x2_SSE2602 WELS_SAD_16x2_SSE2 r0,r1,r4
671 WELS_SAD_16x2_SSE2603 WELS_SAD_16x2_SSE2 r0,r1,r4
672 paddd xmm7, xmm6604 paddd xmm7, xmm6
673 movd [edx+8], xmm6605 movd [r6+8], xmm6
674 psrldq xmm6, 8606 psrldq xmm6, 8
675 movd [edx+12], xmm6607 movd [r6+12], xmm6
676 608
677 add edx, 16609 add r6, 16
678 sub esi, eax610 sub r0, r12
679 sub edi, eax611 sub r1, r12
680 add esi, 16612 add r0, 16
681 add edi, 16613 add r1, 16
682 614
683 dec ecx615 dec r13
684 jnz width_loop616 jnz width_loop
685 617
686 pop edi618 pop r1
687 pop esi619 pop r0
688 add esi, eax620 add r0, r12
689 add edi, eax621 add r1, r12
690 622
691 dec dword [iPicHeight]623 dec r3
692 jnz height_loop624 jnz height_loop
693 625
694 mov edx, [psadframe]626 ;mov r13, [psadframe]
695 movdqa xmm5, xmm7627 movdqa xmm5, xmm7
696 psrldq xmm7, 8628 psrldq xmm7, 8
697 paddd xmm7, xmm5629 paddd xmm7, xmm5
698 movd [edx], xmm7630 movd [psadframe], xmm7
699 631
700%undef cur_data632%undef cur_data
701%undef ref_data633%undef ref_data
702%undef iPicWidth634%undef iPicWidth
703%undef iPicHeight635%undef iPicHeight
704%undef iPicStride636%undef iPicStride
705%undef psadframe637%undef psadframe
706%undef psad8x8638%undef psad8x8
707%undef pushsize639%undef pushsize
708 pop ebx640 LOAD_7_PARA_POP
709 pop edi641 pop r13
710 pop esi642 pop r12
711 ret643 %assign push_num 0
644 ret
645
646%endif
712 647
713 648
649%ifdef X86_32
714WELS_EXTERN VAACalcSadVar_sse2650WELS_EXTERN VAACalcSadVar_sse2
715;*************************************************************************************************************651;*************************************************************************************************************
716;void VAACalcSadVar_sse2( uint8_t *cur_data, uint8_t *ref_data, int32_t iPicWidth, int32_t iPicHeight652;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)
718;*************************************************************************************************************654;*************************************************************************************************************
719 655
720 656
721ALIGN 16657ALIGN 16
722VAACalcSadVar_sse2:658VAACalcSadVar_sse2:
723%define localsize 8659%define localsize 8
724%define cur_data esp + pushsize + localsize + 4660%define cur_data esp + pushsize + localsize + 4
725%define ref_data esp + pushsize + localsize + 8661%define ref_data esp + pushsize + localsize + 8
726%define iPicWidth esp + pushsize + localsize + 12662%define iPicWidth esp + pushsize + localsize + 12
727%define iPicHeight esp + pushsize + localsize + 16663%define iPicHeight esp + pushsize + localsize + 16
728%define iPicStride esp + pushsize + localsize + 20664%define iPicStride esp + pushsize + localsize + 20
729%define psadframe esp + pushsize + localsize + 24665%define psadframe esp + pushsize + localsize + 24
730%define psad8x8 esp + pushsize + localsize + 28666%define psad8x8 esp + pushsize + localsize + 28
731%define psum16x16 esp + pushsize + localsize + 32667%define psum16x16 esp + pushsize + localsize + 32
732%define psqsum16x16 esp + pushsize + localsize + 36668%define psqsum16x16 esp + pushsize + localsize + 36
733%define tmp_esi esp + 0669%define tmp_esi esp + 0
734%define tmp_edi esp + 4670%define tmp_edi esp + 4
735%define pushsize 16671%define pushsize 16
736 push ebp672 push ebp
737 push esi673 push esi
738 push edi674 push edi
739 push ebx675 push ebx
740 sub esp, localsize676 sub esp, localsize
741 mov esi, [cur_data]677 mov esi, [cur_data]
742 mov edi, [ref_data]678 mov edi, [ref_data]
743 mov ebx, [iPicStride]679 mov ebx, [iPicStride]
744 mov edx, [psad8x8]680 mov edx, [psad8x8]
745 mov eax, ebx681 mov eax, ebx
746 682
747 shr dword [iPicWidth], 4 ; iPicWidth/16683 shr dword [iPicWidth], 4 ; iPicWidth/16
748 shr dword [iPicHeight], 4 ; iPicHeight/16684 shr dword [iPicHeight], 4 ; iPicHeight/16
749 shl eax, 4 ; iPicStride*16685 shl eax, 4 ; iPicStride*16
750 pxor xmm0, xmm0686 pxor xmm0, xmm0
751 pxor xmm7, xmm7 ; iFrameSad687 pxor xmm7, xmm7 ; iFrameSad
752var_height_loop:688var_height_loop:
753 mov ecx, dword [iPicWidth]689 mov ecx, dword [iPicWidth]
754 mov [tmp_esi], esi690 mov [tmp_esi], esi
755 mov [tmp_edi], edi691 mov [tmp_edi], edi
756var_width_loop:692var_width_loop:
757 pxor xmm6, xmm6 ; hiQuad_loQuad pSad8x8693 pxor xmm6, xmm6 ; hiQuad_loQuad pSad8x8
758 pxor xmm5, xmm5 ; pSum16x16694 pxor xmm5, xmm5 ; pSum16x16
759 pxor xmm4, xmm4 ; sqsum_16x16695 pxor xmm4, xmm4 ; sqsum_16x16
760 WELS_SAD_SUM_SQSUM_16x1_SSE2696 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
761 WELS_SAD_SUM_SQSUM_16x1_SSE2697 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
762 WELS_SAD_SUM_SQSUM_16x1_SSE2698 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
763 WELS_SAD_SUM_SQSUM_16x1_SSE2699 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
764 WELS_SAD_SUM_SQSUM_16x1_SSE2700 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
765 WELS_SAD_SUM_SQSUM_16x1_SSE2701 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
766 WELS_SAD_SUM_SQSUM_16x1_SSE2702 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
767 WELS_SAD_SUM_SQSUM_16x1_SSE2703 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
768 paddd xmm7, xmm6704 paddd xmm7, xmm6
769 movd [edx], xmm6705 movd [edx], xmm6
770 psrldq xmm6, 8706 psrldq xmm6, 8
771 movd [edx+4], xmm6707 movd [edx+4], xmm6
772 708
773 pxor xmm6, xmm6709 pxor xmm6, xmm6
774 WELS_SAD_SUM_SQSUM_16x1_SSE2710 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
775 WELS_SAD_SUM_SQSUM_16x1_SSE2711 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
776 WELS_SAD_SUM_SQSUM_16x1_SSE2712 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
777 WELS_SAD_SUM_SQSUM_16x1_SSE2713 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
778 WELS_SAD_SUM_SQSUM_16x1_SSE2714 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
779 WELS_SAD_SUM_SQSUM_16x1_SSE2715 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
780 WELS_SAD_SUM_SQSUM_16x1_SSE2716 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
781 WELS_SAD_SUM_SQSUM_16x1_SSE2717 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
782 paddd xmm7, xmm6718 paddd xmm7, xmm6
783 movd [edx+8], xmm6719 movd [edx+8], xmm6
784 psrldq xmm6, 8720 psrldq xmm6, 8
785 movd [edx+12], xmm6721 movd [edx+12], xmm6
786 722
787 mov ebp, [psum16x16]723 mov ebp, [psum16x16]
788 movdqa xmm1, xmm5724 movdqa xmm1, xmm5
789 psrldq xmm1, 8725 psrldq xmm1, 8
790 paddd xmm5, xmm1726 paddd xmm5, xmm1
791 movd [ebp], xmm5727 movd [ebp], xmm5
792 add dword [psum16x16], 4728 add dword [psum16x16], 4
793 729
794 movdqa xmm5, xmm4730 movdqa xmm5, xmm4
795 psrldq xmm5, 8731 psrldq xmm5, 8
796 paddd xmm4, xmm5732 paddd xmm4, xmm5
797 movdqa xmm3, xmm4733 movdqa xmm3, xmm4
798 psrldq xmm3, 4734 psrldq xmm3, 4
799 paddd xmm4, xmm3735 paddd xmm4, xmm3
800 736
801 mov ebp, [psqsum16x16]737 mov ebp, [psqsum16x16]
802 movd [ebp], xmm4738 movd [ebp], xmm4
803 add dword [psqsum16x16], 4739 add dword [psqsum16x16], 4
804 740
805 add edx, 16741 add edx, 16
806 sub esi, eax742 sub esi, eax
807 sub edi, eax743 sub edi, eax
808 add esi, 16744 add esi, 16
809 add edi, 16745 add edi, 16
810 746
811 dec ecx747 dec ecx
812 jnz var_width_loop748 jnz var_width_loop
813 749
814 mov esi, [tmp_esi]750 mov esi, [tmp_esi]
815 mov edi, [tmp_edi]751 mov edi, [tmp_edi]
816 add esi, eax752 add esi, eax
817 add edi, eax753 add edi, eax
818 754
819 dec dword [iPicHeight]755 dec dword [iPicHeight]
820 jnz var_height_loop756 jnz var_height_loop
821 757
822 mov edx, [psadframe]758 mov edx, [psadframe]
823 movdqa xmm5, xmm7759 movdqa xmm5, xmm7
824 psrldq xmm7, 8760 psrldq xmm7, 8
825 paddd xmm7, xmm5761 paddd xmm7, xmm5
826 movd [edx], xmm7762 movd [edx], xmm7
827 763
828 add esp, localsize764 add esp, localsize
829 pop ebx765 pop ebx
830 pop edi766 pop edi
831 pop esi767 pop esi
832 pop ebp768 pop ebp
833%undef cur_data769%undef cur_data
834%undef ref_data770%undef ref_data
835%undef iPicWidth771%undef iPicWidth
836%undef iPicHeight772%undef iPicHeight
837%undef iPicStride773%undef iPicStride
838%undef psadframe774%undef psadframe
839%undef psad8x8775%undef psad8x8
840%undef psum16x16776%undef psum16x16
841%undef psqsum16x16777%undef psqsum16x16
842%undef tmp_esi778%undef tmp_esi
843%undef tmp_edi779%undef tmp_edi
844%undef pushsize780%undef pushsize
845%undef localsize781%undef localsize
846 ret782 ret
783
784%else ;64-bit
847 785
786WELS_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
793ALIGN 16
794VAACalcSadVar_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
827var_height_loop:
828 push r2
829 %assign push_num push_num+1
830 mov r11, r0
831 mov r12, r1
832var_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
929WELS_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
936ALIGN 16
937VAACalcSadSsd_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
974sqdiff_height_loop:
975 mov ecx, dword [iPicWidth]
976 mov [tmp_esi], esi
977 mov [tmp_edi], edi
978sqdiff_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
848 1083
849 1084
850WELS_EXTERN VAACalcSadSsd_sse21085WELS_EXTERN VAACalcSadSsd_sse2
851;*************************************************************************************************************1086;*************************************************************************************************************
852;void VAACalcSadSsd_sse2(uint8_t *cur_data, uint8_t *ref_data, int32_t iPicWidth, int32_t iPicHeight,1087;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)
854;*************************************************************************************************************1089;*************************************************************************************************************
855 1090
856 1091
857ALIGN 161092ALIGN 16
858VAACalcSadSsd_sse2:1093VAACalcSadSsd_sse2:
859%define localsize 121094%define localsize 12
860%define cur_data esp + pushsize + localsize + 41095%define cur_data arg1;r0
861%define ref_data esp + pushsize + localsize + 81096%define ref_data arg2;r1
862%define iPicWidth esp + pushsize + localsize + 121097%define iPicWidth arg3;r2
863%define iPicHeight esp + pushsize + localsize + 161098%define iPicHeight arg4;r3
864%define iPicStride esp + pushsize + localsize + 201099%define iPicStride arg5;
865%define psadframe esp + pushsize + localsize + 241100%define psadframe arg6;
866%define psad8x8 esp + pushsize + localsize + 281101%define psad8x8 arg7;
867%define psum16x16 esp + pushsize + localsize + 321102%define psum16x16 arg8;
868%define psqsum16x16 esp + pushsize + localsize + 361103%define psqsum16x16 arg9;
869%define psqdiff16x16 esp + pushsize + localsize + 401104%define psqdiff16x16 arg10
870%define tmp_esi esp + 01105
871%define tmp_edi esp + 41106 push r12
872%define tmp_sadframe esp + 81107 push r13
873%define pushsize 161108 push r14
874 push ebp1109 push r15
875 push esi1110 %assign push_num 4
876 push edi1111
877 push ebx1112%ifdef WIN64
878 sub esp, localsize1113 mov r4,arg5
879 mov ecx, [iPicWidth]1114%endif
880 mov ecx, [iPicHeight]1115 mov r14,arg7
881 mov esi, [cur_data]1116 SIGN_EXTENTION r2,r2d
882 mov edi, [ref_data]1117 SIGN_EXTENTION r3,r3d
883 mov ebx, [iPicStride]1118 SIGN_EXTENTION r4,r4d
884 mov edx, [psad8x8]1119
885 mov eax, ebx1120 mov r13,r4
886 1121 shr r2,4 ; iPicWidth/16
887 shr dword [iPicWidth], 4 ; iPicWidth/161122 shr r3,4 ; iPicHeight/16
888 shr dword [iPicHeight], 4 ; iPicHeight/161123 shl r13,4 ; iPicStride*16
889 shl eax, 4 ; iPicStride*161124 pxor xmm0, xmm0
890 mov ecx, [iPicWidth]1125 pxor xmm8, xmm8 ;framesad
891 mov ecx, [iPicHeight]1126 pxor xmm9, xmm9
892 pxor xmm0, xmm0
893 movd [tmp_sadframe], xmm0
894sqdiff_height_loop:1127sqdiff_height_loop:
895 mov ecx, dword [iPicWidth]1128 ;mov ecx, dword [iPicWidth]
896 mov [tmp_esi], esi1129 ;mov r14,r2
897 mov [tmp_edi], edi1130 push r2
1131 %assign push_num push_num +1
1132 mov r10, r0
1133 mov r11, r1
898sqdiff_width_loop:1134sqdiff_width_loop:
899 pxor xmm7, xmm7 ; hiQuad_loQuad pSad8x81135 pxor xmm7, xmm7 ; hiQuad_loQuad pSad8x8
900 pxor xmm6, xmm6 ; pSum16x161136 pxor xmm6, xmm6 ; pSum16x16
901 pxor xmm5, xmm5 ; sqsum_16x16 four dword1137 pxor xmm5, xmm5 ; sqsum_16x16 four dword
902 pxor xmm4, xmm4 ; sqdiff_16x16 four Dword1138 pxor xmm4, xmm4 ; sqdiff_16x16 four Dword
903 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE21139 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
904 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE21140 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
905 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE21141 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
906 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE21142 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
907 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE21143 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
908 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE21144 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
909 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE21145 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
910 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE21146 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
911 movdqa xmm1, xmm71147 movdqa xmm1, xmm7
912 movd [edx], xmm71148 movd [r14], xmm7
913 psrldq xmm7, 81149 psrldq xmm7, 8
914 paddd xmm1, xmm71150 paddd xmm1, xmm7
915 movd [edx+4], xmm71151 movd [r14+4], xmm7
916 movd ebp, xmm11152 movd r15d, xmm1
917 add [tmp_sadframe], ebp1153 movd xmm9, r15d
918 1154 paddd xmm8,xmm9
919 pxor xmm7, xmm71155
920 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE21156
921 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE21157 pxor xmm7, xmm7
922 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE21158 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
923 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE21159 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
924 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE21160 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
925 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE21161 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
926 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE21162 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
927 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE21163 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
928 movdqa xmm1, xmm71164 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
929 movd [edx+8], xmm71165 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
930 psrldq xmm7, 81166 movdqa xmm1, xmm7
931 paddd xmm1, xmm71167 movd [r14+8], xmm7
932 movd [edx+12], xmm71168 psrldq xmm7, 8
933 movd ebp, xmm11169 paddd xmm1, xmm7
934 add [tmp_sadframe], ebp1170 movd [r14+12], xmm7
935 1171 movd r15d, xmm1
936 mov ebp, [psum16x16]1172 movd xmm9, r15d
937 movdqa xmm1, xmm61173 paddd xmm8,xmm9
938 psrldq xmm1, 81174
939 paddd xmm6, xmm11175 mov r15, psum16x16
940 movd [ebp], xmm61176 movdqa xmm1, xmm6
941 add dword [psum16x16], 41177 psrldq xmm1, 8
942 1178 paddd xmm6, xmm1
943 mov ebp, [psqsum16x16]1179 movd [r15], xmm6
944 pshufd xmm6, xmm5, 14 ;000011101180 add dword psum16x16, 4
945 paddd xmm6, xmm51181
946 pshufd xmm5, xmm6, 1 ;000000011182 mov r15, psqsum16x16
947 paddd xmm5, xmm61183 pshufd xmm6, xmm5, 14 ;00001110
948 movd [ebp], xmm51184 paddd xmm6, xmm5
949 add dword [psqsum16x16], 41185 pshufd xmm5, xmm6, 1 ;00000001
950 1186 paddd xmm5, xmm6
951 mov ebp, [psqdiff16x16]1187 movd [r15], xmm5
952 pshufd xmm5, xmm4, 14 ; 000011101188 add dword psqsum16x16, 4
953 paddd xmm5, xmm41189
954 pshufd xmm4, xmm5, 1 ; 000000011190 mov r15, psqdiff16x16
955 paddd xmm4, xmm51191 pshufd xmm5, xmm4, 14 ; 00001110
956 movd [ebp], xmm41192 paddd xmm5, xmm4
957 add dword [psqdiff16x16], 41193 pshufd xmm4, xmm5, 1 ; 00000001
958 1194 paddd xmm4, xmm5
959 add edx, 161195 movd [r15], xmm4
960 sub esi, eax1196 add dword psqdiff16x16, 4
961 sub edi, eax1197
962 add esi, 161198 add r14,16
963 add edi, 161199 sub r0, r13
964 1200 sub r1, r13
965 dec ecx1201 add r0, 16
966 jnz sqdiff_width_loop1202 add r1, 16
967 1203
968 mov esi, [tmp_esi]1204 dec r2
969 mov edi, [tmp_edi]1205 jnz sqdiff_width_loop
970 add esi, eax1206
971 add edi, eax1207 pop r2
972 1208 %assign push_num push_num -1
973 dec dword [iPicHeight]1209
974 jnz sqdiff_height_loop1210 mov r0, r10
975 1211 mov r1, r11
976 mov ebx, [tmp_sadframe]1212 add r0, r13
977 mov eax, [psadframe]1213 add r1, r13
978 mov [eax], ebx1214
979 1215 dec r3
980 add esp, localsize1216 jnz sqdiff_height_loop
981 pop ebx1217
982 pop edi1218 mov r13, psadframe
983 pop esi1219 movd [r13], xmm8
984 pop ebp1220
985%undef cur_data1221 pop r15
986%undef ref_data1222 pop r14
987%undef iPicWidth1223 pop r13
988%undef iPicHeight1224 pop r12
989%undef iPicStride1225 %assign push_num 0
990%undef psadframe1226
991%undef psad8x81227%undef cur_data
992%undef psum16x161228%undef ref_data
993%undef psqsum16x161229%undef iPicWidth
994%undef psqdiff16x161230%undef iPicHeight
995%undef tmp_esi1231%undef iPicStride
996%undef tmp_edi1232%undef psadframe
997%undef tmp_sadframe1233%undef psad8x8
998%undef pushsize1234%undef psum16x16
999%undef localsize1235%undef psqsum16x16
1000 ret1236%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
1249WELS_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
1256ALIGN 16
1257VAACalcSadBgd_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
1287bgd_height_loop:
1288 mov ecx, dword [iPicWidth]
1289 mov [tmp_esi], esi
1290 mov [tmp_edi], edi
1291bgd_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
1001 1426
1002 1427
1428WELS_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;*************************************************************************************************************
1003 1434
1004 1435
1436ALIGN 16
1437VAACalcSadSsdBgd_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
1471sqdiff_bgd_height_loop:
1472 mov ecx, dword [iPicWidth]
1473 mov [tmp_esi], esi
1474 mov [tmp_edi], edi
1475sqdiff_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
1005 1658
1006WELS_EXTERN VAACalcSadBgd_sse21659WELS_EXTERN VAACalcSadBgd_sse2
1007;*************************************************************************************************************1660;*************************************************************************************************************
1008;void VAACalcSadBgd_sse2(uint8_t *cur_data, uint8_t *ref_data, int32_t iPicWidth, int32_t iPicHeight,1661;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)
1010;*************************************************************************************************************1663;*************************************************************************************************************
1011 1664
1012 1665
1013ALIGN 161666ALIGN 16
1014VAACalcSadBgd_sse2:1667VAACalcSadBgd_sse2:
1015%define localsize 121668%define cur_data arg1;
1016%define cur_data esp + pushsize + localsize + 41669%define ref_data arg2;
1017%define ref_data esp + pushsize + localsize + 81670%define iPicWidth arg3;
1018%define iPicWidth esp + pushsize + localsize + 121671%define iPicHeight arg4;
1019%define iPicHeight esp + pushsize + localsize + 161672%define iPicStride arg5;
1020%define iPicStride esp + pushsize + localsize + 201673%define psadframe arg6;
1021%define psadframe esp + pushsize + localsize + 241674%define psad8x8 arg7;
1022%define psad8x8 esp + pushsize + localsize + 281675%define p_sd8x8 arg8;
1023%define p_sd8x8 esp + pushsize + localsize + 321676%define p_mad8x8 arg9;
1024%define p_mad8x8 esp + pushsize + localsize + 361677
1025%define tmp_esi esp + 01678 push r12
1026%define tmp_edi esp + 41679 push r13
1027%define tmp_ecx esp + 81680 push r14
1028%define pushsize 161681 push r15
1029 push ebp1682%assign push_num 4
1030 push esi1683%ifdef WIN64
1031 push edi1684 mov r4,arg5
1032 push ebx1685 ; mov r5,arg6
1033 sub esp, localsize1686%endif
1034 mov esi, [cur_data]1687 mov r14,arg7
1035 mov edi, [ref_data]1688 SIGN_EXTENTION r2,r2d
1036 mov ebx, [iPicStride]1689 SIGN_EXTENTION r3,r3d
1037 mov eax, ebx1690 SIGN_EXTENTION r4,r4d
1038 1691
1039 shr dword [iPicWidth], 4 ; iPicWidth/161692
1040 shr dword [iPicHeight], 4 ; iPicHeight/161693 mov r13,r4
1041 shl eax, 4 ; iPicStride*161694 mov r15,r0
1042 xor ebp, ebp1695 shr r2,4
1043 pxor xmm0, xmm01696 shr r3,4
1697 shl r13,4
1698 pxor xmm0, xmm0
1699 pxor xmm8, xmm8
1700 pxor xmm9, xmm9
1044bgd_height_loop:1701bgd_height_loop:
1045 mov ecx, dword [iPicWidth]1702 ;mov ecx, dword [iPicWidth]
1046 mov [tmp_esi], esi1703 push r2
1047 mov [tmp_edi], edi1704 %assign push_num push_num+1
1705 mov r10, r15
1706 mov r11, r1
1048bgd_width_loop:1707bgd_width_loop:
1049 pxor xmm7, xmm7 ; pSad8x81708 pxor xmm7, xmm7 ; pSad8x8
1050 pxor xmm6, xmm6 ; sum_cur_8x81709 pxor xmm6, xmm6 ; sum_cur_8x8
1051 pxor xmm5, xmm5 ; sum_ref_8x81710 pxor xmm5, xmm5 ; sum_ref_8x8
1052 pxor xmm4, xmm4 ; pMad8x81711 pxor xmm4, xmm4 ; pMad8x8
1053 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm41712 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1054 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm41713 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1055 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm41714 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1056 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm41715 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1057 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm41716 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1058 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm41717 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1059 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm41718 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1060 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm41719 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1061 1720
1062 1721
1063 mov edx, [p_mad8x8]1722 mov r14, p_mad8x8
1064 WELS_MAX_REG_SSE2 xmm41723 WELS_MAX_REG_SSE2 xmm4
1065 1724
1066 ;movdqa xmm1, xmm41725 ;mov [tmp_ecx], ecx
1067 ;punpcklbw xmm1, xmm01726 movhlps xmm1, xmm4
1068 ;punpcklwd xmm1, xmm01727 movd r0d, xmm4
1069 ;movd [edx], xmm11728
1070 ;punpckhbw xmm4, xmm01729
1071 ;punpcklwd xmm4, xmm01730 mov [r14], r0b
1072 ;movd [edx+4], xmm41731 movd r0d, xmm1
1073 ;add edx, 81732 mov [r14+1],r0b
1074 ;mov [p_mad8x8], edx1733 add r14, 2
1075 mov [tmp_ecx], ecx1734 ;mov p_mad8x8, r14
1076 movhlps xmm1, xmm41735
1077 movd ecx, xmm41736
1078 mov [edx], cl1737 pslldq xmm7, 4
1079 movd ecx, xmm11738 pslldq xmm6, 4
1080 mov [edx+1],cl1739 pslldq xmm5, 4
1081 add edx, 21740
1082 mov [p_mad8x8], edx1741
1083 1742 pxor xmm4, xmm4 ; pMad8x8
1084 1743 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1085 pslldq xmm7, 41744 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1086 pslldq xmm6, 41745 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1087 pslldq xmm5, 41746 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1088 1747 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1089 1748 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1090 pxor xmm4, xmm4 ; pMad8x81749 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1091 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm41750 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1092 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm41751
1093 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm41752 ;mov r14, [p_mad8x8]
1094 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm41753 WELS_MAX_REG_SSE2 xmm4
1095 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm41754
1096 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm41755 movhlps xmm1, xmm4
1097 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm41756 movd r0d, xmm4
1098 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm41757 mov [r14], r0b
1099 1758 movd r0d, xmm1
1100 mov edx, [p_mad8x8]1759 mov [r14+1],r0b
1101 WELS_MAX_REG_SSE2 xmm41760 add r14, 2
1102 1761 mov p_mad8x8, r14
1103 ;movdqa xmm1, xmm41762
1104 ;punpcklbw xmm1, xmm01763 ; data in xmm7, xmm6, xmm5: D1 D3 D0 D2
1105 ;punpcklwd xmm1, xmm01764
1106 ;movd [edx], xmm11765 mov r14, psad8x8
1107 ;punpckhbw xmm4, xmm01766 pshufd xmm1, xmm7, 10001101b ; D3 D2 D1 D0
1108 ;punpcklwd xmm4, xmm01767 movdqa [r14], xmm1
1109 ;movd [edx+4], xmm41768 add r14, 16
1110 ;add edx, 81769 mov psad8x8, r14 ; sad8x8
1111 ;mov [p_mad8x8], edx1770
1112 movhlps xmm1, xmm41771 paddd xmm1, xmm7 ; D1+3 D3+2 D0+1 D2+0
1113 movd ecx, xmm41772 pshufd xmm2, xmm1, 00000011b
1114 mov [edx], cl1773 paddd xmm1, xmm2
1115 movd ecx, xmm11774 movd r14d, xmm1
1116 mov [edx+1],cl1775 movd xmm9, r14d
1117 add edx, 21776 paddd xmm8, xmm9 ; sad frame
1118 mov [p_mad8x8], edx1777
1119 1778 mov r14, p_sd8x8
1120 ; data in xmm7, xmm6, xmm5: D1 D3 D0 D21779 psubd xmm6, xmm5
1121 1780 pshufd xmm1, xmm6, 10001101b
1122 mov edx, [psad8x8]1781 movdqa [r14], xmm1
1123 pshufd xmm1, xmm7, 10001101b ; D3 D2 D1 D01782 add r14, 16
1124 movdqa [edx], xmm11783 mov p_sd8x8, r14
1125 add edx, 161784
1126 mov [psad8x8], edx ; sad8x81785
1127 1786 ;add edx, 16
1128 paddd xmm1, xmm7 ; D1+3 D3+2 D0+1 D2+01787 sub r15, r13
1129 pshufd xmm2, xmm1, 00000011b1788 sub r1, r13
1130 paddd xmm1, xmm21789 add r15, 16
1131 movd edx, xmm11790 add r1, 16
1132 add ebp, edx ; sad frame1791
1133 1792
1134 mov edx, [p_sd8x8]1793 dec r2
1135 psubd xmm6, xmm51794 jnz bgd_width_loop
1136 pshufd xmm1, xmm6, 10001101b1795 pop r2
1137 movdqa [edx], xmm11796%assign push_num push_num-1
1138 add edx, 161797 mov r15, r10
1139 mov [p_sd8x8], edx1798 mov r1, r11
1140 1799 add r15, r13
1141 1800 add r1, r13
1142 add edx, 161801
1143 sub esi, eax1802 dec r3
1144 sub edi, eax1803 jnz bgd_height_loop
1145 add esi, 161804
1146 add edi, 161805 mov r13, psadframe
1147 1806 movd [r13], xmm8
1148 mov ecx, [tmp_ecx]1807
1149 dec ecx1808 pop r15
1150 jnz bgd_width_loop1809 pop r14
1151 1810 pop r13
1152 mov esi, [tmp_esi]1811 pop r12
1153 mov edi, [tmp_edi]1812%assign push_num 0
1154 add esi, eax1813%undef cur_data
1155 add edi, eax1814%undef ref_data
1156 1815%undef iPicWidth
1157 dec dword [iPicHeight]1816%undef iPicHeight
1158 jnz bgd_height_loop1817%undef iPicStride
1159 1818%undef psadframe
1160 mov edx, [psadframe]1819%undef psad8x8
1161 mov [edx], ebp1820%undef p_sd8x8
1162 1821%undef p_mad8x8
1163 add esp, localsize1822%undef tmp_esi
1164 pop ebx1823%undef tmp_edi
1165 pop edi1824%undef pushsize
1166 pop esi1825%undef localsize
1167 pop ebp1826 ret
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
1182 1827
1183 1828
1184 1829
1185WELS_EXTERN VAACalcSadSsdBgd_sse21830WELS_EXTERN VAACalcSadSsdBgd_sse2
1186;*************************************************************************************************************1831;*************************************************************************************************************
1187;void VAACalcSadSsdBgd_sse2(uint8_t *cur_data, uint8_t *ref_data, int32_t iPicWidth, int32_t iPicHeight,1832;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,1833; 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)1834; int32_t *psqdiff16x16, int32_t *p_sd8x8, uint8_t *p_mad8x8)
1190;*************************************************************************************************************1835;*************************************************************************************************************
1191 1836
1192 1837
1193ALIGN 161838ALIGN 16
1194VAACalcSadSsdBgd_sse2:1839VAACalcSadSsdBgd_sse2:
1195%define localsize 161840%define cur_data arg1;
1196%define cur_data esp + pushsize + localsize + 41841%define ref_data arg2;
1197%define ref_data esp + pushsize + localsize + 81842%define iPicWidth arg3;
1198%define iPicWidth esp + pushsize + localsize + 121843%define iPicHeight arg4;
1199%define iPicHeight esp + pushsize + localsize + 161844%define iPicStride arg5;
1200%define iPicStride esp + pushsize + localsize + 201845%define psadframe arg6;
1201%define psadframe esp + pushsize + localsize + 241846%define psad8x8 arg7;
1202%define psad8x8 esp + pushsize + localsize + 281847%define psum16x16 arg8;
1203%define psum16x16 esp + pushsize + localsize + 321848%define psqsum16x16 arg9;
1204%define psqsum16x16 esp + pushsize + localsize + 361849%define psqdiff16x16 arg10;
1205%define psqdiff16x16 esp + pushsize + localsize + 401850%ifdef WIN64
1206%define p_sd8x8 esp + pushsize + localsize + 441851%define p_sd8x8 [rsp + push_num*8 + 88];
1207%define p_mad8x8 esp + pushsize + localsize + 481852%define p_mad8x8 [rsp + push_num*8 + 96];
1208%define tmp_esi esp + 01853%else ;linux
1209%define tmp_edi esp + 41854%define p_sd8x8 [rsp + push_num*8 + 40];
1210%define tmp_sadframe esp + 81855%define p_mad8x8 [rsp + push_num*8 + 48];
1211%define tmp_ecx esp + 121856%endif
1212%define pushsize 161857
1213 push ebp1858 push r12
1214 push esi1859 push r13
1215 push edi1860 push r14
1216 push ebx1861 push r15
1217 sub esp, localsize1862%assign push_num 4
1218 mov esi, [cur_data]1863%ifdef WIN64
1219 mov edi, [ref_data]1864 mov r4,arg5
1220 mov ebx, [iPicStride]1865 ;mov r5,arg6
1221 mov eax, ebx1866%endif
1222 1867 SIGN_EXTENTION r2,r2d
1223 shr dword [iPicWidth], 4 ; iPicWidth/161868 SIGN_EXTENTION r3,r3d
1224 shr dword [iPicHeight], 4 ; iPicHeight/161869 SIGN_EXTENTION r4,r4d
1225 shl eax, 4 ; iPicStride*161870
1226 pxor xmm0, xmm01871 mov r13,r4
1227 movd [tmp_sadframe], xmm01872 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
1228sqdiff_bgd_height_loop:1880sqdiff_bgd_height_loop:
1229 mov ecx, dword [iPicWidth]1881 mov r10, r0
1230 mov [tmp_esi], esi1882 mov r11, r1
1231 mov [tmp_edi], edi1883 push r2
1884%assign push_num push_num+1
1232sqdiff_bgd_width_loop:1885sqdiff_bgd_width_loop:
1233 pxor xmm7, xmm7 ; pSad8x8 interleaves sqsum16x16: sqsum1 sad1 sqsum0 sad01886
1234 pxor xmm6, xmm6 ; sum_8x8 interleaves cur and pRef in Dword, Sref1 Scur1 Sref0 Scur01887 pxor xmm7, xmm7 ; pSad8x8 interleaves sqsum16x16: sqsum1 sad1 sqsum0 sad0
1235 pxor xmm5, xmm5 ; pMad8x81888 pxor xmm6, xmm6 ; sum_8x8 interleaves cur and pRef in Dword, Sref1 Scur1 Sref0 Scur0
1236 pxor xmm4, xmm4 ; sqdiff_16x16 four Dword1889 pxor xmm5, xmm5 ; pMad8x8
1237 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm41890 pxor xmm4, xmm4 ; sqdiff_16x16 four Dword
1238 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm41891 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1239 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm41892 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1240 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm41893 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1241 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm41894 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1242 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm41895 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1243 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm41896 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1244 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm41897 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1245 1898 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1246 mov edx, [psad8x8]1899
1247 movdqa xmm2, xmm71900 mov r14, psad8x8
1248 pshufd xmm1, xmm2, 00001110b1901 movdqa xmm2, xmm7
1249 movd [edx], xmm21902 pshufd xmm1, xmm2, 00001110b
1250 movd [edx+4], xmm11903 movd [r14], xmm2
1251 add edx, 81904 movd [r14+4], xmm1
1252 mov [psad8x8], edx ; sad8x81905 add r14, 8
1253 1906 mov psad8x8, r14 ; sad8x8
1254 paddd xmm1, xmm21907
1255 movd edx, xmm11908 paddd xmm1, xmm2
1256 add [tmp_sadframe], edx ; iFrameSad1909 movd r14d, xmm1
1257 1910 movd xmm9,r14d
1258 mov edx, [psum16x16]1911 paddd xmm8, xmm9 ; iFrameSad
1259 movdqa xmm1, xmm61912
1260 pshufd xmm2, xmm1, 00001110b1913 mov r14, psum16x16
1261 paddd xmm1, xmm21914 movdqa xmm1, xmm6
1262 movd [edx], xmm1 ; sum1915 pshufd xmm2, xmm1, 00001110b
1263 1916 paddd xmm1, xmm2
1264 mov edx, [p_sd8x8]1917 movd [r14], xmm1 ; sum
1265 pshufd xmm1, xmm6, 11110101b ; Sref1 Sref1 Sref0 Sref01918
1266 psubd xmm6, xmm1 ; 00 diff1 00 diff01919 mov r14, p_sd8x8
1267 pshufd xmm1, xmm6, 00001000b ; xx xx diff1 diff01920 pshufd xmm1, xmm6, 11110101b ; Sref1 Sref1 Sref0 Sref0
1268 movq [edx], xmm11921 psubd xmm6, xmm1 ; 00 diff1 00 diff0
1269 add edx, 81922 pshufd xmm1, xmm6, 00001000b ; xx xx diff1 diff0
1270 mov [p_sd8x8], edx1923 movq [r14], xmm1
1271 1924 add r14, 8
1272 mov edx, [p_mad8x8]1925 mov p_sd8x8, r14
1273 WELS_MAX_REG_SSE2 xmm51926
1274 ;movdqa xmm1, xmm51927 mov r14, p_mad8x8
1275 ;punpcklbw xmm1, xmm01928 WELS_MAX_REG_SSE2 xmm5
1276 ;punpcklwd xmm1, xmm01929
1277 ;movd [edx], xmm11930 movhlps xmm1, xmm5
1278 ;punpckhbw xmm5, xmm01931 push r0
1279 ;punpcklwd xmm5, xmm01932 movd r0d, xmm5
1280 ;movd [edx+4], xmm51933 mov [r14], r0b
1281 ;add edx, 81934 movd r0d, xmm1
1282 ;mov [p_mad8x8], edx1935 mov [r14+1],r0b
1283 mov [tmp_ecx], ecx1936 pop r0
1284 movhlps xmm1, xmm51937 add r14, 2
1285 movd ecx, xmm51938 mov p_mad8x8, r14
1286 mov [edx], cl1939
1287 movd ecx, xmm11940 psrlq xmm7, 32
1288 mov [edx+1],cl1941 psllq xmm7, 32 ; clear sad
1289 add edx, 21942 pxor xmm6, xmm6 ; sum_8x8 interleaves cur and pRef in Dword, Sref1 Scur1 Sref0 Scur0
1290 mov [p_mad8x8], edx1943 pxor xmm5, xmm5 ; pMad8x8
1291 1944 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1292 psrlq xmm7, 321945 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1293 psllq xmm7, 32 ; clear sad1946 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1294 pxor xmm6, xmm6 ; sum_8x8 interleaves cur and pRef in Dword, Sref1 Scur1 Sref0 Scur01947 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1295 pxor xmm5, xmm5 ; pMad8x81948 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1296 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm41949 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1297 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm41950 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1298 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm41951 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1299 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm41952
1300 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm41953 mov r14, psad8x8
1301 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm41954 movdqa xmm2, xmm7
1302 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm41955 pshufd xmm1, xmm2, 00001110b
1303 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm41956 movd [r14], xmm2
1304 1957 movd [r14+4], xmm1
1305 mov edx, [psad8x8]1958 add r14, 8
1306 movdqa xmm2, xmm71959 mov psad8x8, r14 ; sad8x8
1307 pshufd xmm1, xmm2, 00001110b1960
1308 movd [edx], xmm21961 paddd xmm1, xmm2
1309 movd [edx+4], xmm11962 movd r14d, xmm1
1310 add edx, 81963 movd xmm9, r14d
1311 mov [psad8x8], edx ; sad8x81964 paddd xmm8, xmm9 ; iFrameSad
1312 1965
1313 paddd xmm1, xmm21966 mov r14, psum16x16
1314 movd edx, xmm11967 movdqa xmm1, xmm6
1315 add [tmp_sadframe], edx ; iFrameSad1968 pshufd xmm2, xmm1, 00001110b
1316 1969 paddd xmm1, xmm2
1317 mov edx, [psum16x16]1970 movd r15d, xmm1 ; sum
1318 movdqa xmm1, xmm61971 add [r14], r15d
1319 pshufd xmm2, xmm1, 00001110b1972 add r14, 4
1320 paddd xmm1, xmm21973 mov psum16x16, r14
1321 movd ebp, xmm1 ; sum1974
1322 add [edx], ebp1975 mov r14, psqsum16x16
1323 add edx, 41976 psrlq xmm7, 32
1324 mov [psum16x16], edx1977 pshufd xmm2, xmm7, 00001110b
1325 1978 paddd xmm2, xmm7
1326 mov edx, [psqsum16x16]1979 movd [r14], xmm2 ; sqsum
1327 psrlq xmm7, 321980 add r14, 4
1328 pshufd xmm2, xmm7, 00001110b1981 mov psqsum16x16, r14
1329 paddd xmm2, xmm71982
1330 movd [edx], xmm2 ; sqsum1983 mov r14, p_sd8x8
1331 add edx, 41984 pshufd xmm1, xmm6, 11110101b ; Sref1 Sref1 Sref0 Sref0
1332 mov [psqsum16x16], edx1985 psubd xmm6, xmm1 ; 00 diff1 00 diff0
1333 1986 pshufd xmm1, xmm6, 00001000b ; xx xx diff1 diff0
1334 mov edx, [p_sd8x8]1987 movq [r14], xmm1
1335 pshufd xmm1, xmm6, 11110101b ; Sref1 Sref1 Sref0 Sref01988 add r14, 8
1336 psubd xmm6, xmm1 ; 00 diff1 00 diff01989 mov p_sd8x8, r14
1337 pshufd xmm1, xmm6, 00001000b ; xx xx diff1 diff01990
1338 movq [edx], xmm11991 mov r14, p_mad8x8
1339 add edx, 81992 WELS_MAX_REG_SSE2 xmm5
1340 mov [p_sd8x8], edx1993
1341 1994
1342 mov edx, [p_mad8x8]1995 movhlps xmm1, xmm5
1343 WELS_MAX_REG_SSE2 xmm51996 push r0
1344 ;movdqa xmm1, xmm51997 movd r0d, xmm5
1345 ;punpcklbw xmm1, xmm01998 mov [r14], r0b
1346 ;punpcklwd xmm1, xmm01999 movd r0d, xmm1
1347 ;movd [edx], xmm12000 mov [r14+1],r0b
1348 ;punpckhbw xmm5, xmm02001 pop r0
1349 ;punpcklwd xmm5, xmm02002 add r14, 2
1350 ;movd [edx+4], xmm52003 mov p_mad8x8, r14
1351 ;add edx, 82004
1352 ;mov [p_mad8x8], edx2005 mov r14, psqdiff16x16
1353 movhlps xmm1, xmm52006 pshufd xmm1, xmm4, 00001110b
1354 movd ecx, xmm52007 paddd xmm4, xmm1
1355 mov [edx], cl2008 pshufd xmm1, xmm4, 00000001b
1356 movd ecx, xmm12009 paddd xmm4, xmm1
1357 mov [edx+1],cl2010 movd [r14], xmm4
1358 add edx, 22011 add r14, 4
1359 mov [p_mad8x8], edx2012 mov psqdiff16x16, r14
1360 2013
1361 mov edx, [psqdiff16x16]2014 add r14, 16
1362 pshufd xmm1, xmm4, 00001110b2015 sub r0, r13
1363 paddd xmm4, xmm12016 sub r1, r13
1364 pshufd xmm1, xmm4, 00000001b2017 add r0, 16
1365 paddd xmm4, xmm12018 add r1, 16
1366 movd [edx], xmm42019
1367 add edx, 42020 dec r2
1368 mov [psqdiff16x16], edx2021 jnz sqdiff_bgd_width_loop
1369 2022 pop r2
1370 add edx, 162023 %assign push_num push_num-1
1371 sub esi, eax2024 mov r0, r10
1372 sub edi, eax2025 mov r1, r11
1373 add esi, 162026 add r0, r13
1374 add edi, 162027 add r1, r13
1375 2028
1376 mov ecx, [tmp_ecx]2029 dec r3
1377 dec ecx2030 jnz sqdiff_bgd_height_loop
1378 jnz sqdiff_bgd_width_loop2031
1379 2032 mov r14, psadframe
1380 mov esi, [tmp_esi]2033 movd [r14], xmm8
1381 mov edi, [tmp_edi]2034
1382 add esi, eax2035 pop r15
1383 add edi, eax2036 pop r14
1384 2037 pop r13
1385 dec dword [iPicHeight]2038 pop r12
1386 jnz sqdiff_bgd_height_loop2039%assign push_num 0
1387 2040%undef cur_data
1388 mov edx, [psadframe]2041%undef ref_data
1389 mov ebp, [tmp_sadframe]2042%undef iPicWidth
1390 mov [edx], ebp2043%undef iPicHeight
1391 2044%undef iPicStride
1392 add esp, localsize2045%undef psadframe
1393 pop ebx2046%undef psad8x8
1394 pop edi2047%undef psum16x16
1395 pop esi2048%undef psqsum16x16
1396 pop ebp2049%undef psqdiff16x16
1397%undef cur_data2050%undef p_sd8x8
1398%undef ref_data2051%undef p_mad8x8
1399%undef iPicWidth2052%undef tmp_esi
1400%undef iPicHeight2053%undef tmp_edi
1401%undef iPicStride2054%undef pushsize
1402%undef psadframe2055%undef localsize
1403%undef psad8x82056 ret
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
1414%endif2057%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
43WELSVP_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
52uint32_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
185void 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
194WELSVP_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
45WELSVP_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
85WELSVP_EXTERN_C_BEGIN
86
87int32_t WelsCPUIdVerify();
88
89void WelsCPUId (uint32_t uiIndex, uint32_t* pFeatureA, uint32_t* pFeatureB, uint32_t* pFeatureC, uint32_t* pFeatureD);
90int32_t WelsCPUSupportAVX (uint32_t eax, uint32_t ecx);
91int32_t WelsCPUSupportFMA (uint32_t eax, uint32_t ecx);
92
93void WelsEmms();
94
95WELSVP_EXTERN_C_END
96#endif
97
98uint32_t WelsCPUFeatureDetect (int32_t* pNumberOfLogicProcessors);
99
100WELSVP_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
58 sVaaFuncs.pfVAACalcSadVar = VAACalcSadVar_c;58 sVaaFuncs.pfVAACalcSadVar = VAACalcSadVar_c;
59#ifdef X86_ASM59#ifdef X86_ASM
60 if ((iCpuFlag & WELS_CPU_SSE2) == WELS_CPU_SSE2) {60 if ((iCpuFlag & WELS_CPU_SSE2) == WELS_CPU_SSE2) {
61 /* sVaaFuncs.pfVAACalcSad = VAACalcSad_sse2;61 sVaaFuncs.pfVAACalcSad = VAACalcSad_sse2;
62 sVaaFuncs.pfVAACalcSadBgd = VAACalcSadBgd_sse2;62 sVaaFuncs.pfVAACalcSadBgd = VAACalcSadBgd_sse2;
63 sVaaFuncs.pfVAACalcSadSsd = VAACalcSadSsd_sse2;63 sVaaFuncs.pfVAACalcSadSsd = VAACalcSadSsd_sse2;
64 sVaaFuncs.pfVAACalcSadSsdBgd = VAACalcSadSsdBgd_sse2;64 sVaaFuncs.pfVAACalcSadSsdBgd = VAACalcSadSsdBgd_sse2;
65 sVaaFuncs.pfVAACalcSadVar = VAACalcSadVar_sse2;*/65 sVaaFuncs.pfVAACalcSadVar = VAACalcSadVar_sse2;
66 }66 }
67#endif//X86_ASM67#endif//X86_ASM
68}68}

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