History

Remove an unused assembly source file

Nothing within processing uses functions from this file.

Martin Storsjö committed 12 years ago

Commit 04dba611 parent 37619013 files · +0 −1546Browse files

Showing the changes to codec/processing/src (1 of 3 files). Show all

Unified · Split

codec/processing/src/asm/intra_pred.asm+0−1505
@@ -1,1505 +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;*
32;* intra_pred.asm
33;*
34;* Abstract
35;* sse2 function for intra predict operations
36;*
37;* History
38;* 18/09/2009 Created
39;*
40;*
41;*************************************************************************/
42%include "asm_inc.asm"
43
44;***********************************************************************
45; Local Data (Read Only)
46;***********************************************************************
47
48%ifdef FORMAT_COFF
49SECTION .rodata pData
50%else
51SECTION .rodata align=16
52%endif
53
54align 16
55sse2_plane_inc_minus dw -7, -6, -5, -4, -3, -2, -1, 0
56align 16
57sse2_plane_inc dw 1, 2, 3, 4, 5, 6, 7, 8
58align 16
59sse2_plane_dec dw 8, 7, 6, 5, 4, 3, 2, 1
60
61; for chroma plane mode
62sse2_plane_inc_c dw 1, 2, 3, 4
63sse2_plane_dec_c dw 4, 3, 2, 1
64align 16
65sse2_plane_mul_b_c dw -3, -2, -1, 0, 1, 2, 3, 4
66
67align 16
68mmx_01bytes: times 16 db 1
69;align 16
70;sse_0x0004bytes: times 8 dw 4
71;ALIGN 16
72;sse_f000 db 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
73
74align 16
75mmx_0x02: dw 0x02, 0x00, 0x00, 0x00
76
77
78;***********************************************************************
79; macros
80;***********************************************************************
81;dB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
82;%1 will keep the last result
83%macro SSE_DB_1_2REG 2
84 pxor %1, %1
85 pcmpeqw %2, %2
86 psubb %1, %2
87%endmacro
88
89;xmm0, xmm1, xmm2, eax, ecx
90;lower 64 bits of xmm0 save the result
91%macro SSE2_PRED_H_4X4_TWO_LINE 5
92 movd %1, [%4-1]
93 movdqa %3, %1
94 punpcklbw %1, %3
95 movdqa %3, %1
96 punpcklbw %1, %3
97
98 ;add %4, %5
99 movd %2, [%4+%5-1]
100 movdqa %3, %2
101 punpcklbw %2, %3
102 movdqa %3, %2
103 punpcklbw %2, %3
104 punpckldq %1, %2
105%endmacro
106
107%macro SUMW_HORIZON1 2
108 movdqa %2, %1
109 psrldq %2, 8
110 paddusw %1, %2
111 movdqa %2, %1
112 psrldq %2, 4
113 paddusw %1, %2
114 movdqa %2, %1
115 psrldq %2, 2
116 paddusw %1, %2
117%endmacro
118
119%macro LOAD_COLUMN 6
120 movd %1, [%5]
121 movd %2, [%5+%6]
122 punpcklbw %1, %2
123 lea %5, [%5+2*%6]
124 movd %3, [%5]
125 movd %2, [%5+%6]
126 punpcklbw %3, %2
127 punpcklwd %1, %3
128 lea %5, [%5+2*%6]
129 movd %4, [%5]
130 movd %2, [%5+%6]
131 punpcklbw %4, %2
132 lea %5, [%5+2*%6]
133 movd %3, [%5]
134 movd %2, [%5+%6]
135 lea %5, [%5+2*%6]
136 punpcklbw %3, %2
137 punpcklwd %4, %3
138 punpckhdq %1, %4
139%endmacro
140
141%macro SUMW_HORIZON 3
142 movhlps %2, %1 ; x2 = xx xx xx xx d7 d6 d5 d4
143 paddw %1, %2 ; x1 = xx xx xx xx d37 d26 d15 d04
144 punpcklwd %1, %3 ; x1 = d37 d26 d15 d04
145 movhlps %2, %1 ; x2 = xxxx xxxx d37 d26
146 paddd %1, %2 ; x1 = xxxx xxxx d1357 d0246
147 pshuflw %2, %1, 0x4e ; x2 = xxxx xxxx d0246 d1357
148 paddd %1, %2 ; x1 = xxxx xxxx xxxx d01234567
149%endmacro
150
151
152%macro COPY_16_TIMES 2
153 movdqa %2, [%1-16]
154 psrldq %2, 15
155 pmuludq %2, [mmx_01bytes]
156 pshufd %2, %2, 0
157%endmacro
158
159%macro COPY_16_TIMESS 3
160 movdqa %2, [%1+%3-16]
161 psrldq %2, 15
162 pmuludq %2, [mmx_01bytes]
163 pshufd %2, %2, 0
164%endmacro
165
166%macro LOAD_COLUMN_C 6
167 movd %1, [%5]
168 movd %2, [%5+%6]
169 punpcklbw %1,%2
170 lea %5, [%5+2*%6]
171 movd %3, [%5]
172 movd %2, [%5+%6]
173 punpcklbw %3, %2
174 punpckhwd %1, %3
175 lea %5, [%5+2*%6]
176%endmacro
177
178%macro LOAD_2_LEFT_AND_ADD 0
179 lea r1, [r1+2*r2]
180 movzx r4, byte [r1-0x01]
181 add r3, r4
182 movzx r4, byte [r1+r2-0x01]
183 add r3, r4
184%endmacro
185
186;***********************************************************************
187; Code
188;***********************************************************************
189
190SECTION .text
191WELS_EXTERN WelsI4x4LumaPredH_sse2
192WELS_EXTERN WelsI4x4LumaPredDDR_mmx
193WELS_EXTERN WelsI4x4LumaPredDc_sse2
194WELS_EXTERN WelsI16x16LumaPredPlane_sse2
195
196ALIGN 16
197;***********************************************************************
198; void __cdecl WelsI4x4LumaPredH_sse2(uint8_t *pred, uint8_t *pRef, int32_t stride)
199;
200; pred must align to 16
201;***********************************************************************
202WelsI4x4LumaPredH_sse2:
203 push r3
204 %assign push_num 1
205 LOAD_3_PARA
206 %ifndef X86_32
207 movsx r2, r2d
208 %endif
209 movzx r3, byte [r1-1]
210 movd xmm0, r3d
211 pmuludq xmm0, [mmx_01bytes]
212
213 movzx r3, byte [r1+r2-1]
214 movd xmm1, r3d
215 pmuludq xmm1, [mmx_01bytes]
216
217 unpcklps xmm0, xmm1
218
219 lea r1, [r1+r2*2]
220 movzx r3, byte [r1-1]
221 movd xmm2, r3d
222 pmuludq xmm2, [mmx_01bytes]
223
224 movzx r3, byte [r1+r2-1]
225 movd xmm3, r3d
226 pmuludq xmm3, [mmx_01bytes]
227
228 unpcklps xmm2, xmm3
229 unpcklpd xmm0, xmm2
230
231 movdqa [r0], xmm0
232 pop r3
233 ret
234
235;***********************************************************************
236; void WelsI16x16LumaPredPlane_sse2(uint8_t *pred, uint8_t *pRef, int32_t stride);
237;***********************************************************************
238WelsI16x16LumaPredPlane_sse2:
239 ;%define pushsize 4
240 ;push esi
241 ;mov esi, [esp + pushsize + 8]
242 ;mov ecx, [esp + pushsize + 12]
243 push r3
244 push r4
245 %assign push_num 2
246 LOAD_3_PARA
247 %ifndef X86_32
248 movsx r2, r2d
249 %endif
250 sub r1, 1
251 sub r1, r2
252
253 ;for H
254 pxor xmm7, xmm7
255 movq xmm0, [r1]
256 movdqa xmm5, [sse2_plane_dec]
257 punpcklbw xmm0, xmm7
258 pmullw xmm0, xmm5
259 movq xmm1, [r1 + 9]
260 movdqa xmm6, [sse2_plane_inc]
261 punpcklbw xmm1, xmm7
262 pmullw xmm1, xmm6
263 psubw xmm1, xmm0
264
265 SUMW_HORIZON xmm1,xmm0,xmm2
266 movd r3d, xmm1 ; H += (i + 1) * (top[8 + i] - top[6 - i]);
267 movsx r3, r3w
268 imul r3, 5
269 add r3, 32
270 sar r3, 6 ; b = (5 * H + 32) >> 6;
271 SSE2_Copy8Times xmm1, r3d ; xmm1 = b,b,b,b,b,b,b,b
272
273 movzx r4, BYTE [r1+16]
274 sub r1, 3
275 LOAD_COLUMN xmm0, xmm2, xmm3, xmm4, r1, r2
276
277 add r1, 3
278 movzx r3, BYTE [r1+8*r2]
279 add r4, r3
280 shl r4, 4 ; a = (left[15*stride] + top[15]) << 4;
281
282 sub r1, 3
283 add r1, r2
284 LOAD_COLUMN xmm7, xmm2, xmm3, xmm4, r1, r2
285 pxor xmm4, xmm4
286 punpckhbw xmm0, xmm4
287 pmullw xmm0, xmm5
288 punpckhbw xmm7, xmm4
289 pmullw xmm7, xmm6
290 psubw xmm7, xmm0
291
292 SUMW_HORIZON xmm7,xmm0,xmm2
293 movd r3d, xmm7 ; V
294 movsx r3, r3w
295 imul r3, 5
296 add r3, 32
297 sar r3, 6 ; c = (5 * V + 32) >> 6;
298 SSE2_Copy8Times xmm4, r3d ; xmm4 = c,c,c,c,c,c,c,c
299
300 ;mov esi, [esp + pushsize + 4]
301 add r4, 16
302 imul r3, -7
303 add r3, r4 ; s = a + 16 + (-7)*c
304 SSE2_Copy8Times xmm0, r3d ; xmm0 = s,s,s,s,s,s,s,s
305
306 xor r3, r3
307 movdqa xmm5, [sse2_plane_inc_minus]
308
309get_i16x16_luma_pred_plane_sse2_1:
310 movdqa xmm2, xmm1
311 pmullw xmm2, xmm5
312 paddw xmm2, xmm0
313 psraw xmm2, 5
314 movdqa xmm3, xmm1
315 pmullw xmm3, xmm6
316 paddw xmm3, xmm0
317 psraw xmm3, 5
318 packuswb xmm2, xmm3
319 movdqa [r0], xmm2
320 paddw xmm0, xmm4
321 add r0, 16
322 inc r3
323 cmp r3, 16
324 jnz get_i16x16_luma_pred_plane_sse2_1
325 pop r4
326 pop r3
327 ret
328
329;***********************************************************************
330; void WelsI16x16LumaPredH_sse2(uint8_t *pred, uint8_t *pRef, int32_t stride);
331;***********************************************************************
332
333%macro SSE2_PRED_H_16X16_ONE_LINE 0
334 add r0, 16
335 add r1, r2
336 movzx r3, byte [r1]
337 SSE2_Copy16Times xmm0, r3d
338 movdqa [r0], xmm0
339%endmacro
340
341WELS_EXTERN WelsI16x16LumaPredH_sse2
342WelsI16x16LumaPredH_sse2:
343 push r3
344 %assign push_num 1
345 LOAD_3_PARA
346 %ifndef X86_32
347 movsx r2, r2d
348 %endif
349 dec r1
350 movzx r3, byte [r1]
351 SSE2_Copy16Times xmm0, r3d
352 movdqa [r0], xmm0
353 SSE2_PRED_H_16X16_ONE_LINE
354 SSE2_PRED_H_16X16_ONE_LINE
355 SSE2_PRED_H_16X16_ONE_LINE
356 SSE2_PRED_H_16X16_ONE_LINE
357 SSE2_PRED_H_16X16_ONE_LINE
358 SSE2_PRED_H_16X16_ONE_LINE
359 SSE2_PRED_H_16X16_ONE_LINE
360 SSE2_PRED_H_16X16_ONE_LINE
361 SSE2_PRED_H_16X16_ONE_LINE
362 SSE2_PRED_H_16X16_ONE_LINE
363 SSE2_PRED_H_16X16_ONE_LINE
364 SSE2_PRED_H_16X16_ONE_LINE
365 SSE2_PRED_H_16X16_ONE_LINE
366 SSE2_PRED_H_16X16_ONE_LINE
367 SSE2_PRED_H_16X16_ONE_LINE
368 pop r3
369 ret
370
371;***********************************************************************
372; void WelsI16x16LumaPredV_sse2(uint8_t *pred, uint8_t *pRef, int32_t stride);
373;***********************************************************************
374WELS_EXTERN WelsI16x16LumaPredV_sse2
375WelsI16x16LumaPredV_sse2:
376 ;mov edx, [esp+4] ; pred
377 ;mov eax, [esp+8] ; pRef
378 ;mov ecx, [esp+12] ; stride
379 %assign push_num 0
380 LOAD_3_PARA
381 %ifndef X86_32
382 movsx r2, r2d
383 %endif
384 sub r1, r2
385 movdqa xmm0, [r1]
386
387 movdqa [r0], xmm0
388 movdqa [r0+10h], xmm0
389 movdqa [r0+20h], xmm0
390 movdqa [r0+30h], xmm0
391 movdqa [r0+40h], xmm0
392 movdqa [r0+50h], xmm0
393 movdqa [r0+60h], xmm0
394 movdqa [r0+70h], xmm0
395 movdqa [r0+80h], xmm0
396 movdqa [r0+90h], xmm0
397 movdqa [r0+160], xmm0
398 movdqa [r0+176], xmm0
399 movdqa [r0+192], xmm0
400 movdqa [r0+208], xmm0
401 movdqa [r0+224], xmm0
402 movdqa [r0+240], xmm0
403
404 ret
405
406;***********************************************************************
407; void WelsIChromaPredPlane_sse2(uint8_t *pred, uint8_t *pRef, int32_t stride);
408;***********************************************************************
409WELS_EXTERN WelsIChromaPredPlane_sse2
410WelsIChromaPredPlane_sse2:
411 ;%define pushsize 4
412 ;push esi
413 ;mov esi, [esp + pushsize + 8] ;pRef
414 ;mov ecx, [esp + pushsize + 12] ;stride
415 push r3
416 push r4
417 %assign push_num 2
418 LOAD_3_PARA
419 %ifndef X86_32
420 movsx r2, r2d
421 %endif
422 sub r1, 1
423 sub r1, r2
424
425 pxor mm7, mm7
426 movq mm0, [r1]
427 movq mm5, [sse2_plane_dec_c]
428 punpcklbw mm0, mm7
429 pmullw mm0, mm5
430 movq mm1, [r1 + 5]
431 movq mm6, [sse2_plane_inc_c]
432 punpcklbw mm1, mm7
433 pmullw mm1, mm6
434 psubw mm1, mm0
435
436 movq2dq xmm1, mm1
437 pxor xmm2, xmm2
438 SUMW_HORIZON xmm1,xmm0,xmm2
439 movd r3d, xmm1
440 movsx r3, r3w
441 imul r3, 17
442 add r3, 16
443 sar r3, 5 ; b = (17 * H + 16) >> 5;
444 SSE2_Copy8Times xmm1, r3d ; mm1 = b,b,b,b,b,b,b,b
445
446 movzx r3, BYTE [r1+8]
447 sub r1, 3
448 LOAD_COLUMN_C mm0, mm2, mm3, mm4, r1, r2
449
450 add r1, 3
451 movzx r4, BYTE [r1+4*r2]
452 add r4, r3
453 shl r4, 4 ; a = (left[7*stride] + top[7]) << 4;
454
455 sub r1, 3
456 add r1, r2
457 LOAD_COLUMN_C mm7, mm2, mm3, mm4, r1, r2
458 pxor mm4, mm4
459 punpckhbw mm0, mm4
460 pmullw mm0, mm5
461 punpckhbw mm7, mm4
462 pmullw mm7, mm6
463 psubw mm7, mm0
464
465 movq2dq xmm7, mm7
466 pxor xmm2, xmm2
467 SUMW_HORIZON xmm7,xmm0,xmm2
468 movd r3d, xmm7 ; V
469 movsx r3, r3w
470 imul r3, 17
471 add r3, 16
472 sar r3, 5 ; c = (17 * V + 16) >> 5;
473 SSE2_Copy8Times xmm4, r3d ; mm4 = c,c,c,c,c,c,c,c
474
475 ;mov esi, [esp + pushsize + 4]
476 add r4, 16
477 imul r3, -3
478 add r3, r4 ; s = a + 16 + (-3)*c
479 SSE2_Copy8Times xmm0, r3d ; xmm0 = s,s,s,s,s,s,s,s
480
481 xor r3, r3
482 movdqa xmm5, [sse2_plane_mul_b_c]
483
484get_i_chroma_pred_plane_sse2_1:
485 movdqa xmm2, xmm1
486 pmullw xmm2, xmm5
487 paddw xmm2, xmm0
488 psraw xmm2, 5
489 packuswb xmm2, xmm2
490 movq [r0], xmm2
491 paddw xmm0, xmm4
492 add r0, 8
493 inc r3
494 cmp r3, 8
495 jnz get_i_chroma_pred_plane_sse2_1
496 pop r4
497 pop r3
498 WELSEMMS
499 ret
500
501ALIGN 16
502;***********************************************************************
503; 0 |1 |2 |3 |4 |
504; 6 |7 |8 |9 |10|
505; 11|12|13|14|15|
506; 16|17|18|19|20|
507; 21|22|23|24|25|
508; 7 is the start pixel of current 4x4 block
509; pred[7] = ([6]+[0]*2+[1]+2)/4
510;
511; void __cdecl WelsI4x4LumaPredDDR_mmx(uint8_t *pred,uint8_t *pRef,int32_t stride)
512;
513;***********************************************************************
514WelsI4x4LumaPredDDR_mmx:
515 ;mov edx,[esp+4] ;pred
516 ;mov eax,[esp+8] ;pRef
517 ;mov ecx,[esp+12] ;stride
518 %assign push_num 0
519 LOAD_3_PARA
520 %ifndef X86_32
521 movsx r2, r2d
522 %endif
523 movq mm1,[r1+r2-8] ;get value of 11,decreasing 8 is trying to improve the performance of movq mm1[8] = 11
524 movq mm2,[r1-8] ;get value of 6 mm2[8] = 6
525 sub r1, r2 ;mov eax to above line of current block(postion of 1)
526 punpckhbw mm2,[r1-8] ;mm2[8](high 8th byte of mm2) = [0](value of 0), mm2[7]= [6]
527 movd mm3,[r1] ;get value 1, mm3[1] = [1],mm3[2]=[2],mm3[3]=[3]
528 punpckhwd mm1,mm2 ;mm1[8]=[0],mm1[7]=[6],mm1[6]=[11]
529 psllq mm3,18h ;mm3[5]=[1]
530 psrlq mm1,28h ;mm1[3]=[0],mm1[2]=[6],mm1[1]=[11]
531 por mm3,mm1 ;mm3[6]=[3],mm3[5]=[2],mm3[4]=[1],mm3[3]=[0],mm3[2]=[6],mm3[1]=[11]
532 movq mm1,mm3 ;mm1[6]=[3],mm1[5]=[2],mm1[4]=[1],mm1[3]=[0],mm1[2]=[6],mm1[1]=[11]
533 lea r1,[r1+r2*2-8h] ;set eax point to 12
534 movq mm4,[r1+r2] ;get value of 16, mm4[8]=[16]
535 psllq mm3,8 ;mm3[7]=[3],mm3[6]=[2],mm3[5]=[1],mm3[4]=[0],mm3[3]=[6],mm3[2]=[11],mm3[1]=0
536 psrlq mm4,38h ;mm4[1]=[16]
537 por mm3,mm4 ;mm3[7]=[3],mm3[6]=[2],mm3[5]=[1],mm3[4]=[0],mm3[3]=[6],mm3[2]=[11],mm3[1]=[16]
538 movq mm2,mm3 ;mm2[7]=[3],mm2[6]=[2],mm2[5]=[1],mm2[4]=[0],mm2[3]=[6],mm2[2]=[11],mm2[1]=[16]
539 movq mm4,[r1+r2*2] ;mm4[8]=[21]
540 psllq mm3,8 ;mm3[8]=[3],mm3[7]=[2],mm3[6]=[1],mm3[5]=[0],mm3[4]=[6],mm3[3]=[11],mm3[2]=[16],mm3[1]=0
541 psrlq mm4,38h ;mm4[1]=[21]
542 por mm3,mm4 ;mm3[8]=[3],mm3[7]=[2],mm3[6]=[1],mm3[5]=[0],mm3[4]=[6],mm3[3]=[11],mm3[2]=[16],mm3[1]=[21]
543 movq mm4,mm3 ;mm4[8]=[3],mm4[7]=[2],mm4[6]=[1],mm4[5]=[0],mm4[4]=[6],mm4[3]=[11],mm4[2]=[16],mm4[1]=[21]
544 pavgb mm3,mm1 ;mm3=([11]+[21]+1)/2
545 pxor mm1,mm4 ;find odd value in the lowest bit of each byte
546 pand mm1,[mmx_01bytes] ;set the odd bit
547 psubusb mm3,mm1 ;decrease 1 from odd bytes
548 pavgb mm2,mm3 ;mm2=(([11]+[21]+1)/2+1+[16])/2
549
550 movd [r0+12],mm2
551 psrlq mm2,8
552 movd [r0+8],mm2
553 psrlq mm2,8
554 movd [r0+4],mm2
555 psrlq mm2,8
556 movd [r0],mm2
557 WELSEMMS
558 ret
559
560ALIGN 16
561;***********************************************************************
562; 0 |1 |2 |3 |4 |
563; 5 |6 |7 |8 |9 |
564; 10|11|12|13|14|
565; 15|16|17|18|19|
566; 20|21|22|23|24|
567; 6 is the start pixel of current 4x4 block
568; pred[6] = ([1]+[2]+[3]+[4]+[5]+[10]+[15]+[20]+4)/8
569;
570; void __cdecl WelsI4x4LumaPredDc_sse2(uint8_t *pred,uint8_t *pRef,int32_t stride)
571;
572;***********************************************************************
573WelsI4x4LumaPredDc_sse2:
574 push r3
575 push r4
576 %assign push_num 2
577 LOAD_3_PARA
578 %ifndef X86_32
579 movsx r2, r2d
580 %endif
581 movzx r4, byte [r1-1h]
582 sub r1, r2
583 movd xmm0, [r1]
584 pxor xmm1, xmm1
585 psadbw xmm0, xmm1
586 xor r3, r3
587 movd r3d, xmm0
588 add r3, r4
589 movzx r4, byte [r1+r2*2-1h]
590 add r3, r4
591
592 lea r1, [r1+r2*2-1]
593 movzx r4, byte [r1+r2]
594 add r3, r4
595
596 movzx r4, byte [r1+r2*2]
597 add r3, r4
598 add r3, 4
599 sar r3, 3
600 imul r3, 0x01010101
601
602 movd xmm0, r3d
603 pshufd xmm0, xmm0, 0
604 movdqa [r0], xmm0
605 pop r4
606 pop r3
607 ret
608
609ALIGN 16
610;***********************************************************************
611; void __cdecl WelsIChromaPredH_mmx(uint8_t *pred, uint8_t *pRef, int32_t stride)
612; copy 8 pixel of 8 line from left
613;***********************************************************************
614%macro MMX_PRED_H_8X8_ONE_LINE 4
615 movq %1, [%3-8]
616 psrlq %1, 38h
617
618 ;pmuludq %1, [mmx_01bytes] ;extend to 4 bytes
619 pmullw %1, [mmx_01bytes]
620 pshufw %1, %1, 0
621 movq [%4], %1
622%endmacro
623
624%macro MMX_PRED_H_8X8_ONE_LINEE 4
625 movq %1, [%3+r2-8]
626 psrlq %1, 38h
627
628 ;pmuludq %1, [mmx_01bytes] ;extend to 4 bytes
629 pmullw %1, [mmx_01bytes]
630 pshufw %1, %1, 0
631 movq [%4], %1
632%endmacro
633
634WELS_EXTERN WelsIChromaPredH_mmx
635WelsIChromaPredH_mmx:
636 ;mov edx, [esp+4] ;pred
637 ;mov eax, [esp+8] ;pRef
638 ;mov ecx, [esp+12] ;stride
639 %assign push_num 0
640 LOAD_3_PARA
641 %ifndef X86_32
642 movsx r2, r2d
643 %endif
644 movq mm0, [r1-8]
645 psrlq mm0, 38h
646
647 ;pmuludq mm0, [mmx_01bytes] ;extend to 4 bytes
648 pmullw mm0, [mmx_01bytes]
649 pshufw mm0, mm0, 0
650 movq [r0], mm0
651
652 MMX_PRED_H_8X8_ONE_LINEE mm0, mm1, r1,r0+8
653
654 lea r1,[r1+r2*2]
655 MMX_PRED_H_8X8_ONE_LINE mm0, mm1, r1,r0+16
656
657 MMX_PRED_H_8X8_ONE_LINEE mm0, mm1, r1,r0+24
658
659 lea r1,[r1+r2*2]
660 MMX_PRED_H_8X8_ONE_LINE mm0, mm1, r1,r0+32
661
662 MMX_PRED_H_8X8_ONE_LINEE mm0, mm1, r1,r0+40
663
664 lea r1,[r1+r2*2]
665 MMX_PRED_H_8X8_ONE_LINE mm0, mm1, r1,r0+48
666
667 MMX_PRED_H_8X8_ONE_LINEE mm0, mm1, r1,r0+56
668 WELSEMMS
669 ret
670
671ALIGN 16
672;***********************************************************************
673; void __cdecl WelsI4x4LumaPredV_sse2(uint8_t *pred, uint8_t *pRef, int32_t stride)
674; copy pixels from top 4 pixels
675;***********************************************************************
676WELS_EXTERN WelsI4x4LumaPredV_sse2
677WelsI4x4LumaPredV_sse2:
678 %assign push_num 0
679 LOAD_3_PARA
680 %ifndef X86_32
681 movsx r2, r2d
682 %endif
683 sub r1, r2
684 movd xmm0, [r1]
685 pshufd xmm0, xmm0, 0
686 movdqa [r0], xmm0
687 ret
688
689ALIGN 16
690;***********************************************************************
691; void __cdecl WelsIChromaPredV_sse2(uint8_t *pred, uint8_t *pRef, int32_t stride)
692; copy 8 pixels from top 8 pixels
693;***********************************************************************
694WELS_EXTERN WelsIChromaPredV_sse2
695WelsIChromaPredV_sse2:
696 %assign push_num 0
697 LOAD_3_PARA
698 %ifndef X86_32
699 movsx r2, r2d
700 %endif
701 sub r1, r2
702 movq xmm0, [r1]
703 movdqa xmm1, xmm0
704 punpcklqdq xmm0, xmm1
705 movdqa [r0], xmm0
706 movdqa [r0+16], xmm0
707 movdqa [r0+32], xmm0
708 movdqa [r0+48], xmm0
709 ret
710
711 ALIGN 16
712;***********************************************************************
713; lt|t0|t1|t2|t3|
714; l0|
715; l1|
716; l2|
717; l3|
718; t3 will never been used
719; destination:
720; |a |b |c |d |
721; |e |f |a |b |
722; |g |h |e |f |
723; |i |j |g |h |
724
725; a = (1 + lt + l0)>>1
726; e = (1 + l0 + l1)>>1
727; g = (1 + l1 + l2)>>1
728; i = (1 + l2 + l3)>>1
729
730; d = (2 + t0 + (t1<<1) + t2)>>2
731; c = (2 + lt + (t0<<1) + t1)>>2
732; b = (2 + l0 + (lt<<1) + t0)>>2
733
734; f = (2 + l1 + (l0<<1) + lt)>>2
735; h = (2 + l2 + (l1<<1) + l0)>>2
736; j = (2 + l3 + (l2<<1) + l1)>>2
737; [b a f e h g j i] + [d c b a] --> mov to memory
738;
739; void WelsI4x4LumaPredHD_mmx(uint8_t *pred,uint8_t *pRef,int32_t stride)
740;***********************************************************************
741WELS_EXTERN WelsI4x4LumaPredHD_mmx
742WelsI4x4LumaPredHD_mmx:
743 %assign push_num 0
744 LOAD_3_PARA
745 %ifndef X86_32
746 movsx r2, r2d
747 %endif
748 sub r1, r2
749 movd mm0, [r1-1] ; mm0 = [xx xx xx xx t2 t1 t0 lt]
750 psllq mm0, 20h ; mm0 = [t2 t1 t0 lt xx xx xx xx]
751
752 movd mm1, [r1+2*r2-4]
753 punpcklbw mm1, [r1+r2-4] ; mm1[7] = l0, mm1[6] = l1
754 lea r1, [r1+2*r2]
755 movd mm2, [r1+2*r2-4]
756 punpcklbw mm2, [r1+r2-4] ; mm2[7] = l2, mm2[6] = l3
757 punpckhwd mm2, mm1 ; mm2 = [l0 l1 l2 l3 xx xx xx xx]
758 psrlq mm2, 20h
759 pxor mm0, mm2 ; mm0 = [t2 t1 t0 lt l0 l1 l2 l3]
760
761 movq mm1, mm0
762 psrlq mm1, 10h ; mm1 = [xx xx t2 t1 t0 lt l0 l1]
763 movq mm2, mm0
764 psrlq mm2, 8h ; mm2 = [xx t2 t1 t0 lt l0 l1 l2]
765 movq mm3, mm2
766 movq mm4, mm1
767 pavgb mm1, mm0
768
769 pxor mm4, mm0 ; find odd value in the lowest bit of each byte
770 pand mm4, [mmx_01bytes] ; set the odd bit
771 psubusb mm1, mm4 ; decrease 1 from odd bytes
772
773 pavgb mm2, mm1 ; mm2 = [xx xx d c b f h j]
774
775 movq mm4, mm0
776 pavgb mm3, mm4 ; mm3 = [xx xx xx xx a e g i]
777 punpcklbw mm3, mm2 ; mm3 = [b a f e h g j i]
778
779 psrlq mm2, 20h
780 psllq mm2, 30h ; mm2 = [d c 0 0 0 0 0 0]
781 movq mm4, mm3
782 psrlq mm4, 10h ; mm4 = [0 0 b a f e h j]
783 pxor mm2, mm4 ; mm2 = [d c b a xx xx xx xx]
784 psrlq mm2, 20h ; mm2 = [xx xx xx xx d c b a]
785
786 movd [r0], mm2
787 movd [r0+12], mm3
788 psrlq mm3, 10h
789 movd [r0+8], mm3
790 psrlq mm3, 10h
791 movd [r0+4], mm3
792 WELSEMMS
793 ret
794
795ALIGN 16
796;***********************************************************************
797; lt|t0|t1|t2|t3|
798; l0|
799; l1|
800; l2|
801; l3|
802; t3 will never been used
803; destination:
804; |a |b |c |d |
805; |c |d |e |f |
806; |e |f |g |g |
807; |g |g |g |g |
808
809; a = (1 + l0 + l1)>>1
810; c = (1 + l1 + l2)>>1
811; e = (1 + l2 + l3)>>1
812; g = l3
813
814; b = (2 + l0 + (l1<<1) + l2)>>2
815; d = (2 + l1 + (l2<<1) + l3)>>2
816; f = (2 + l2 + (l3<<1) + l3)>>2
817
818; [g g f e d c b a] + [g g g g] --> mov to memory
819;
820; void WelsI4x4LumaPredHU_mmx(uint8_t *pred,uint8_t *pRef,int32_t stride)
821;***********************************************************************
822WELS_EXTERN WelsI4x4LumaPredHU_mmx
823WelsI4x4LumaPredHU_mmx:
824 %assign push_num 0
825 LOAD_3_PARA
826 %ifndef X86_32
827 movsx r2, r2d
828 %endif
829 movd mm0, [r1-4] ; mm0[3] = l0
830 punpcklbw mm0, [r1+r2-4] ; mm0[7] = l1, mm0[6] = l0
831 lea r1, [r1+2*r2]
832 movd mm2, [r1-4] ; mm2[3] = l2
833 movd mm4, [r1+r2-4] ; mm4[3] = l3
834 punpcklbw mm2, mm4
835 punpckhwd mm0, mm2 ; mm0 = [l3 l2 l1 l0 xx xx xx xx]
836
837 psrlq mm4, 18h
838 psllq mm4, 38h ; mm4 = [l3 xx xx xx xx xx xx xx]
839 psrlq mm0, 8h
840 pxor mm0, mm4 ; mm0 = [l3 l3 l2 l1 l0 xx xx xx]
841
842 movq mm1, mm0
843 psllq mm1, 8h ; mm1 = [l3 l2 l1 l0 xx xx xx xx]
844 movq mm3, mm1 ; mm3 = [l3 l2 l1 l0 xx xx xx xx]
845 pavgb mm1, mm0 ; mm1 = [g e c a xx xx xx xx]
846
847 movq mm2, mm0
848 psllq mm2, 10h ; mm2 = [l2 l1 l0 xx xx xx xx xx]
849 movq mm5, mm2
850 pavgb mm2, mm0
851
852 pxor mm5, mm0 ; find odd value in the lowest bit of each byte
853 pand mm5, [mmx_01bytes] ; set the odd bit
854 psubusb mm2, mm5 ; decrease 1 from odd bytes
855
856 pavgb mm2, mm3 ; mm2 = [f d b xx xx xx xx xx]
857
858 psrlq mm2, 8h
859 pxor mm2, mm4 ; mm2 = [g f d b xx xx xx xx]
860
861 punpckhbw mm1, mm2 ; mm1 = [g g f e d c b a]
862 punpckhbw mm4, mm4 ; mm4 = [g g xx xx xx xx xx xx]
863 punpckhbw mm4, mm4 ; mm4 = [g g g g xx xx xx xx]
864
865 psrlq mm4, 20h
866 movd [r0+12], mm4
867
868 movd [r0], mm1
869 psrlq mm1, 10h
870 movd [r0+4], mm1
871 psrlq mm1, 10h
872 movd [r0+8], mm1
873 WELSEMMS
874 ret
875
876
877
878ALIGN 16
879;***********************************************************************
880; lt|t0|t1|t2|t3|
881; l0|
882; l1|
883; l2|
884; l3|
885; l3 will never been used
886; destination:
887; |a |b |c |d |
888; |e |f |g |h |
889; |i |a |b |c |
890; |j |e |f |g |
891
892; a = (1 + lt + t0)>>1
893; b = (1 + t0 + t1)>>1
894; c = (1 + t1 + t2)>>1
895; d = (1 + t2 + t3)>>1
896
897; e = (2 + l0 + (lt<<1) + t0)>>2
898; f = (2 + lt + (t0<<1) + t1)>>2
899; g = (2 + t0 + (t1<<1) + t2)>>2
900
901; h = (2 + t1 + (t2<<1) + t3)>>2
902; i = (2 + lt + (l0<<1) + l1)>>2
903; j = (2 + l0 + (l1<<1) + l2)>>2
904;
905; void WelsI4x4LumaPredVR_mmx(uint8_t *pred,uint8_t *pRef,int32_t stride)
906;***********************************************************************
907WELS_EXTERN WelsI4x4LumaPredVR_mmx
908WelsI4x4LumaPredVR_mmx:
909 %assign push_num 0
910 LOAD_3_PARA
911 %ifndef X86_32
912 movsx r2, r2d
913 %endif
914 sub r1, r2
915 movq mm0, [r1-1] ; mm0 = [xx xx xx t3 t2 t1 t0 lt]
916 psllq mm0, 18h ; mm0 = [t3 t2 t1 t0 lt xx xx xx]
917
918 movd mm1, [r1+2*r2-4]
919 punpcklbw mm1, [r1+r2-4] ; mm1[7] = l0, mm1[6] = l1
920 lea r1, [r1+2*r2]
921 movq mm2, [r1+r2-8] ; mm2[7] = l2
922 punpckhwd mm2, mm1 ; mm2 = [l0 l1 l2 xx xx xx xx xx]
923 psrlq mm2, 28h
924 pxor mm0, mm2 ; mm0 = [t3 t2 t1 t0 lt l0 l1 l2]
925
926 movq mm1, mm0
927 psllq mm1, 8h ; mm1 = [t2 t1 t0 lt l0 l1 l2 xx]
928 pavgb mm1, mm0 ; mm1 = [d c b a xx xx xx xx]
929
930 movq mm2, mm0
931 psllq mm2, 10h ; mm2 = [t1 t0 lt l0 l1 l2 xx xx]
932 movq mm3, mm2
933 pavgb mm2, mm0
934
935 pxor mm3, mm0 ; find odd value in the lowest bit of each byte
936 pand mm3, [mmx_01bytes] ; set the odd bit
937 psubusb mm2, mm3 ; decrease 1 from odd bytes
938
939 movq mm3, mm0
940 psllq mm3, 8h ; mm3 = [t2 t1 t0 lt l0 l1 l2 xx]
941 pavgb mm3, mm2 ; mm3 = [h g f e i j xx xx]
942 movq mm2, mm3
943
944 psrlq mm1, 20h ; mm1 = [xx xx xx xx d c b a]
945 movd [r0], mm1
946
947 psrlq mm2, 20h ; mm2 = [xx xx xx xx h g f e]
948 movd [r0+4], mm2
949
950 movq mm4, mm3
951 psllq mm4, 20h
952 psrlq mm4, 38h ; mm4 = [xx xx xx xx xx xx xx i]
953
954 movq mm5, mm3
955 psllq mm5, 28h
956 psrlq mm5, 38h ; mm5 = [xx xx xx xx xx xx xx j]
957
958 psllq mm1, 8h
959 pxor mm4, mm1 ; mm4 = [xx xx xx xx c b a i]
960 movd [r0+8], mm4
961
962 psllq mm2, 8h
963 pxor mm5, mm2 ; mm5 = [xx xx xx xx g f e j]
964 movd [r0+12], mm5
965 WELSEMMS
966 ret
967
968ALIGN 16
969;***********************************************************************
970; lt|t0|t1|t2|t3|t4|t5|t6|t7
971; l0|
972; l1|
973; l2|
974; l3|
975; lt,t0,t1,t2,t3 will never been used
976; destination:
977; |a |b |c |d |
978; |b |c |d |e |
979; |c |d |e |f |
980; |d |e |f |g |
981
982; a = (2 + t0 + t2 + (t1<<1))>>2
983; b = (2 + t1 + t3 + (t2<<1))>>2
984; c = (2 + t2 + t4 + (t3<<1))>>2
985; d = (2 + t3 + t5 + (t4<<1))>>2
986
987; e = (2 + t4 + t6 + (t5<<1))>>2
988; f = (2 + t5 + t7 + (t6<<1))>>2
989; g = (2 + t6 + t7 + (t7<<1))>>2
990
991; [g f e d c b a] --> mov to memory
992;
993; void WelsI4x4LumaPredDDL_mmx(uint8_t *pred,uint8_t *pRef,int32_t stride)
994;***********************************************************************
995WELS_EXTERN WelsI4x4LumaPredDDL_mmx
996WelsI4x4LumaPredDDL_mmx:
997 %assign push_num 0
998 LOAD_3_PARA
999 %ifndef X86_32
1000 movsx r2, r2d
1001 %endif
1002 sub r1, r2
1003 movq mm0, [r1] ; mm0 = [t7 t6 t5 t4 t3 t2 t1 t0]
1004 movq mm1, mm0
1005 movq mm2, mm0
1006
1007 movq mm3, mm0
1008 psrlq mm3, 38h
1009 psllq mm3, 38h ; mm3 = [t7 xx xx xx xx xx xx xx]
1010
1011 psllq mm1, 8h ; mm1 = [t6 t5 t4 t3 t2 t1 t0 xx]
1012 psrlq mm2, 8h
1013 pxor mm2, mm3 ; mm2 = [t7 t7 t6 t5 t4 t3 t2 t1]
1014
1015 movq mm3, mm1
1016 pavgb mm1, mm2
1017 pxor mm3, mm2 ; find odd value in the lowest bit of each byte
1018 pand mm3, [mmx_01bytes] ; set the odd bit
1019 psubusb mm1, mm3 ; decrease 1 from odd bytes
1020
1021 pavgb mm0, mm1 ; mm0 = [g f e d c b a xx]
1022
1023 psrlq mm0, 8h
1024 movd [r0], mm0
1025 psrlq mm0, 8h
1026 movd [r0+4], mm0
1027 psrlq mm0, 8h
1028 movd [r0+8], mm0
1029 psrlq mm0, 8h
1030 movd [r0+12], mm0
1031 WELSEMMS
1032 ret
1033
1034
1035ALIGN 16
1036;***********************************************************************
1037; lt|t0|t1|t2|t3|t4|t5|t6|t7
1038; l0|
1039; l1|
1040; l2|
1041; l3|
1042; lt,t0,t1,t2,t3 will never been used
1043; destination:
1044; |a |b |c |d |
1045; |e |f |g |h |
1046; |b |c |d |i |
1047; |f |g |h |j |
1048
1049; a = (1 + t0 + t1)>>1
1050; b = (1 + t1 + t2)>>1
1051; c = (1 + t2 + t3)>>1
1052; d = (1 + t3 + t4)>>1
1053; i = (1 + t4 + t5)>>1
1054
1055; e = (2 + t0 + (t1<<1) + t2)>>2
1056; f = (2 + t1 + (t2<<1) + t3)>>2
1057; g = (2 + t2 + (t3<<1) + t4)>>2
1058; h = (2 + t3 + (t4<<1) + t5)>>2
1059; j = (2 + t4 + (t5<<1) + t6)>>2
1060
1061; [i d c b a] + [j h g f e] --> mov to memory
1062;
1063; void WelsI4x4LumaPredVL_mmx(uint8_t *pred,uint8_t *pRef,int32_t stride)
1064;***********************************************************************
1065WELS_EXTERN WelsI4x4LumaPredVL_mmx
1066WelsI4x4LumaPredVL_mmx:
1067 %assign push_num 0
1068 LOAD_3_PARA
1069 %ifndef X86_32
1070 movsx r2, r2d
1071 %endif
1072 sub r1, r2
1073 movq mm0, [r1] ; mm0 = [t7 t6 t5 t4 t3 t2 t1 t0]
1074 movq mm1, mm0
1075 movq mm2, mm0
1076
1077 psrlq mm1, 8h ; mm1 = [xx t7 t6 t5 t4 t3 t2 t1]
1078 psrlq mm2, 10h ; mm2 = [xx xx t7 t6 t5 t4 t3 t2]
1079
1080 movq mm3, mm1
1081 pavgb mm3, mm0 ; mm3 = [xx xx xx i d c b a]
1082
1083 movq mm4, mm2
1084 pavgb mm2, mm0
1085 pxor mm4, mm0 ; find odd value in the lowest bit of each byte
1086 pand mm4, [mmx_01bytes] ; set the odd bit
1087 psubusb mm2, mm4 ; decrease 1 from odd bytes
1088
1089 pavgb mm2, mm1 ; mm2 = [xx xx xx j h g f e]
1090
1091 movd [r0], mm3
1092 psrlq mm3, 8h
1093 movd [r0+8], mm3
1094
1095 movd [r0+4], mm2
1096 psrlq mm2, 8h
1097 movd [r0+12], mm2
1098 WELSEMMS
1099 ret
1100
1101ALIGN 16
1102;***********************************************************************
1103;
1104; void WelsIChromaPredDc_sse2(uint8_t *pred, uint8_t *pRef, int32_t stride)
1105;***********************************************************************
1106WELS_EXTERN WelsIChromaPredDc_sse2
1107WelsIChromaPredDc_sse2:
1108 push r3
1109 push r4
1110 %assign push_num 2
1111 LOAD_3_PARA
1112 %ifndef X86_32
1113 movsx r2, r2d
1114 %endif
1115 sub r1, r2
1116 movq mm0, [r1]
1117
1118 movzx r3, byte [r1+r2-0x01] ; l1
1119 lea r1, [r1+2*r2]
1120 movzx r4, byte [r1-0x01] ; l2
1121 add r3, r4
1122 movzx r4, byte [r1+r2-0x01] ; l3
1123 add r3, r4
1124 lea r1, [r1+2*r2]
1125 movzx r4, byte [r1-0x01] ; l4
1126 add r3, r4
1127 movd mm1, r3d ; mm1 = l1+l2+l3+l4
1128
1129 movzx r3, byte [r1+r2-0x01] ; l5
1130 lea r1, [r1+2*r2]
1131 movzx r4, byte [r1-0x01] ; l6
1132 add r3, r4
1133 movzx r4, byte [r1+r2-0x01] ; l7
1134 add r3, r4
1135 lea r1, [r1+2*r2]
1136 movzx r4, byte [r1-0x01] ; l8
1137 add r3, r4
1138 movd mm2, r3d ; mm2 = l5+l6+l7+l8
1139
1140 movq mm3, mm0
1141 psrlq mm0, 0x20
1142 psllq mm3, 0x20
1143 psrlq mm3, 0x20
1144 pxor mm4, mm4
1145 psadbw mm0, mm4
1146 psadbw mm3, mm4 ; sum1 = mm3+mm1, sum2 = mm0, sum3 = mm2
1147
1148 paddq mm3, mm1
1149 movq mm1, mm2
1150 paddq mm1, mm0; ; sum1 = mm3, sum2 = mm0, sum3 = mm2, sum4 = mm1
1151
1152 movq mm4, [mmx_0x02]
1153
1154 paddq mm0, mm4
1155 psrlq mm0, 0x02
1156
1157 paddq mm2, mm4
1158 psrlq mm2, 0x02
1159
1160 paddq mm3, mm4
1161 paddq mm3, mm4
1162 psrlq mm3, 0x03
1163
1164 paddq mm1, mm4
1165 paddq mm1, mm4
1166 psrlq mm1, 0x03
1167
1168 pmuludq mm0, [mmx_01bytes]
1169 pmuludq mm3, [mmx_01bytes]
1170 psllq mm0, 0x20
1171 pxor mm0, mm3 ; mm0 = m_up
1172
1173 pmuludq mm2, [mmx_01bytes]
1174 pmuludq mm1, [mmx_01bytes]
1175 psllq mm1, 0x20
1176 pxor mm1, mm2 ; mm2 = m_down
1177
1178 movq [r0], mm0
1179 movq [r0+0x08], mm0
1180 movq [r0+0x10], mm0
1181 movq [r0+0x18], mm0
1182
1183 movq [r0+0x20], mm1
1184 movq [r0+0x28], mm1
1185 movq [r0+0x30], mm1
1186 movq [r0+0x38], mm1
1187
1188 pop r4
1189 pop r3
1190 WELSEMMS
1191 ret
1192
1193
1194
1195ALIGN 16
1196;***********************************************************************
1197;
1198; void WelsI16x16LumaPredDc_sse2(uint8_t *pred, uint8_t *pRef, int32_t stride)
1199;***********************************************************************
1200WELS_EXTERN WelsI16x16LumaPredDc_sse2
1201WelsI16x16LumaPredDc_sse2:
1202 push r3
1203 push r4
1204 %assign push_num 2
1205 LOAD_3_PARA
1206 %ifndef X86_32
1207 movsx r2, r2d
1208 %endif
1209 sub r1, r2
1210 movdqa xmm0, [r1] ; read one row
1211 pxor xmm1, xmm1
1212 psadbw xmm0, xmm1
1213 movdqa xmm1, xmm0
1214 psrldq xmm1, 0x08
1215 pslldq xmm0, 0x08
1216 psrldq xmm0, 0x08
1217 paddw xmm0, xmm1
1218
1219 movzx r3, byte [r1+r2-0x01]
1220 movzx r4, byte [r1+2*r2-0x01]
1221 add r3, r4
1222 lea r1, [r1+r2]
1223 LOAD_2_LEFT_AND_ADD
1224 LOAD_2_LEFT_AND_ADD
1225 LOAD_2_LEFT_AND_ADD
1226 LOAD_2_LEFT_AND_ADD
1227 LOAD_2_LEFT_AND_ADD
1228 LOAD_2_LEFT_AND_ADD
1229 LOAD_2_LEFT_AND_ADD
1230 add r3, 0x10
1231 movd xmm1, r3d
1232 paddw xmm0, xmm1
1233 psrld xmm0, 0x05
1234 pmuludq xmm0, [mmx_01bytes]
1235 pshufd xmm0, xmm0, 0
1236
1237 movdqa [r0], xmm0
1238 movdqa [r0+0x10], xmm0
1239 movdqa [r0+0x20], xmm0
1240 movdqa [r0+0x30], xmm0
1241 movdqa [r0+0x40], xmm0
1242 movdqa [r0+0x50], xmm0
1243 movdqa [r0+0x60], xmm0
1244 movdqa [r0+0x70], xmm0
1245 movdqa [r0+0x80], xmm0
1246 movdqa [r0+0x90], xmm0
1247 movdqa [r0+0xa0], xmm0
1248 movdqa [r0+0xb0], xmm0
1249 movdqa [r0+0xc0], xmm0
1250 movdqa [r0+0xd0], xmm0
1251 movdqa [r0+0xe0], xmm0
1252 movdqa [r0+0xf0], xmm0
1253
1254 pop r4
1255 pop r3
1256 ret
1257
1258;***********************************************************************
1259;
1260;int32_t WelsSmpleSatdThree4x4_sse2( uint8_t *pDec, int32_t iLineSizeDec, uint8_t *pEnc, int32_t iLinesizeEnc,
1261; uint8_t* pRed, int32_t* pBestMode, int32_t, int32_t, int32_t);
1262;
1263;***********************************************************************
1264%ifdef X86_ASM
1265WELS_EXTERN WelsSmpleSatdThree4x4_sse2
1266align 16
1267WelsSmpleSatdThree4x4_sse2:
1268 push ebx
1269 push esi
1270 push edi
1271 mov eax, [esp+24];p_enc
1272 mov ebx, [esp+28];linesize_enc
1273
1274 ; load source 4x4 samples and Hadamard transform
1275 movd xmm0, [eax]
1276 movd xmm1, [eax+ebx]
1277 lea eax , [eax+2*ebx]
1278 movd xmm2, [eax]
1279 movd xmm3, [eax+ebx]
1280 punpckldq xmm0, xmm2
1281 punpckldq xmm1, xmm3
1282
1283 pxor xmm6, xmm6
1284 punpcklbw xmm0, xmm6
1285 punpcklbw xmm1, xmm6
1286
1287 movdqa xmm2, xmm0
1288 paddw xmm0, xmm1
1289 psubw xmm2, xmm1
1290 SSE2_XSawp qdq, xmm0, xmm2, xmm3
1291
1292 movdqa xmm4, xmm0
1293 paddw xmm0, xmm3
1294 psubw xmm4, xmm3
1295
1296 movdqa xmm2, xmm0
1297 punpcklwd xmm0, xmm4
1298 punpckhwd xmm4, xmm2
1299
1300 SSE2_XSawp dq, xmm0, xmm4, xmm3
1301 SSE2_XSawp qdq, xmm0, xmm3, xmm5
1302
1303 movdqa xmm7, xmm0
1304 paddw xmm0, xmm5
1305 psubw xmm7, xmm5
1306
1307 SSE2_XSawp qdq, xmm0, xmm7, xmm1
1308
1309 ; Hadamard transform results are saved in xmm0 and xmm2
1310 movdqa xmm2, xmm0
1311 paddw xmm0, xmm1
1312 psubw xmm2, xmm1
1313
1314 ; load top boundary samples: [a b c d]
1315 mov eax, [esp+16];p_dec
1316 sub eax, [esp+20];linesize_dec
1317 movzx ecx, byte [eax]
1318 movzx edx, byte [eax+1]
1319 movzx esi, byte [eax+2]
1320 movzx edi, byte [eax+3]
1321
1322 ; get the transform results of top boundary samples: [a b c d]
1323 add edx, ecx ; edx = a + b
1324 add edi, esi ; edi = c + d
1325 add ecx, ecx ; ecx = a + a
1326 add esi, esi ; esi = c + c
1327 sub ecx, edx ; ecx = a + a - a - b = a - b
1328 sub esi, edi ; esi = c + c - c - d = c - d
1329 add edi, edx ; edi = (a + b) + (c + d)
1330 add edx, edx
1331 sub edx, edi ; edx = (a + b) - (c + d)
1332 add esi, ecx ; esi = (a - b) + (c - d)
1333 add ecx, ecx
1334 sub ecx, esi ; ecx = (a - b) - (c - d) ; [edi edx ecx esi]
1335
1336 movdqa xmm6, xmm0
1337 movdqa xmm7, xmm2
1338 movd xmm5, edi ; store the edi for DC mode
1339 pxor xmm3, xmm3
1340 pxor xmm4, xmm4
1341 pinsrw xmm3, edi, 0
1342 pinsrw xmm3, esi, 4
1343 psllw xmm3, 2
1344 pinsrw xmm4, edx, 0
1345 pinsrw xmm4, ecx, 4
1346 psllw xmm4, 2
1347
1348 ; get the satd of H
1349 psubw xmm0, xmm3
1350 psubw xmm2, xmm4
1351
1352 WELS_AbsW xmm0, xmm1
1353 WELS_AbsW xmm2, xmm1
1354 paddusw xmm0, xmm2
1355 SUMW_HORIZON1 xmm0, xmm1 ; satd of V is stored in xmm0
1356
1357 ; load left boundary samples: [a b c d]'
1358 mov eax, [esp+16]
1359 mov ebx, [esp+20]
1360 movzx ecx, byte [eax-1]
1361 movzx edx, byte [eax+ebx-1]
1362 lea eax , [eax+2*ebx]
1363 movzx esi, byte [eax-1]
1364 movzx edi, byte [eax+ebx-1]
1365
1366 ; get the transform results of left boundary samples: [a b c d]'
1367 add edx, ecx ; edx = a + b
1368 add edi, esi ; edi = c + d
1369 add ecx, ecx ; ecx = a + a
1370 add esi, esi ; esi = c + c
1371 sub ecx, edx ; ecx = a + a - a - b = a - b
1372 sub esi, edi ; esi = c + c - c - d = c - d
1373 add edi, edx ; edi = (a + b) + (c + d)
1374 add edx, edx
1375 sub edx, edi ; edx = (a + b) - (c + d)
1376 add esi, ecx ; esi = (a - b) + (c - d)
1377 add ecx, ecx
1378 sub ecx, esi ; ecx = (a - b) - (c - d) ; [edi edx ecx esi]'
1379
1380 ; store the transform results in xmm3
1381 movd xmm3, edi
1382 pinsrw xmm3, edx, 1
1383 pinsrw xmm3, ecx, 2
1384 pinsrw xmm3, esi, 3
1385 psllw xmm3, 2
1386
1387 ; get the satd of V
1388 movdqa xmm2, xmm6
1389 movdqa xmm4, xmm7
1390 psubw xmm2, xmm3
1391 WELS_AbsW xmm2, xmm1
1392 WELS_AbsW xmm4, xmm1
1393 paddusw xmm2, xmm4
1394 SUMW_HORIZON1 xmm2, xmm1 ; satd of H is stored in xmm2
1395
1396 ; DC result is stored in xmm1
1397 add edi, 4
1398 movd xmm1, edi
1399 paddw xmm1, xmm5
1400 psrlw xmm1, 3
1401 movdqa xmm5, xmm1
1402 psllw xmm1, 4
1403
1404 ; get the satd of DC
1405 psubw xmm6, xmm1
1406 WELS_AbsW xmm6, xmm1
1407 WELS_AbsW xmm7, xmm1
1408 paddusw xmm6, xmm7
1409 SUMW_HORIZON1 xmm6, xmm1 ; satd of DC is stored in xmm6
1410
1411 ; comparing order: DC H V
1412 mov edx, [esp+32]
1413 movd eax, xmm6
1414 movd edi, xmm2
1415 movd esi, xmm0
1416 and eax, 0xffff
1417 shr eax, 1
1418 and edi, 0xffff
1419 shr edi, 1
1420 and esi, 0xffff
1421 shr esi, 1
1422 add eax, [esp+40]
1423 add edi, [esp+44]
1424 add esi, [esp+48]
1425 cmp ax, di
1426 jg near not_dc
1427 cmp ax, si
1428 jg near not_dc_h
1429
1430 ; for DC mode
1431 movd ebx, xmm5
1432 imul ebx, 0x01010101
1433 movd xmm5, ebx
1434 pshufd xmm5, xmm5, 0
1435 movdqa [edx], xmm5
1436 mov ebx, [esp+36]
1437 mov dword [ebx], 0x02
1438 pop edi
1439 pop esi
1440 pop ebx
1441 ret
1442
1443not_dc:
1444 cmp di, si
1445 jg near not_dc_h
1446
1447 ; for H mode
1448 SSE_DB_1_2REG xmm6, xmm7
1449 mov eax, [esp+16]
1450 mov ebx, [esp+20]
1451 movzx ecx, byte [eax-1]
1452 movd xmm0, ecx
1453 pmuludq xmm0, xmm6
1454
1455 movzx ecx, byte [eax+ebx-1]
1456 movd xmm1, ecx
1457 pmuludq xmm1, xmm6
1458%if 1
1459 punpckldq xmm0, xmm1
1460%else
1461 unpcklps xmm0, xmm1
1462%endif
1463 lea eax, [eax+ebx*2]
1464 movzx ecx, byte [eax-1]
1465 movd xmm2, ecx
1466 pmuludq xmm2, xmm6
1467
1468 movzx ecx, byte [eax+ebx-1]
1469 movd xmm3, ecx
1470 pmuludq xmm3, xmm6
1471%if 1
1472 punpckldq xmm2, xmm3
1473 punpcklqdq xmm0, xmm2
1474%else
1475 unpcklps xmm2, xmm3
1476 unpcklpd xmm0, xmm2
1477%endif
1478 movdqa [edx],xmm0
1479
1480 mov eax, edi
1481 mov ebx, [esp+36]
1482 mov dword [ebx], 0x01
1483
1484 pop edi
1485 pop esi
1486 pop ebx
1487 ret
1488not_dc_h:
1489 ; for V mode
1490 mov eax, [esp+16]
1491 sub eax, [esp+20]
1492 movd xmm0, [eax]
1493 pshufd xmm0, xmm0, 0
1494 movdqa [edx],xmm0
1495
1496 mov eax, esi
1497 mov ebx, [esp+36]
1498 mov dword [ebx], 0x00
1499
1500 pop edi
1501 pop esi
1502 pop ebx
1503 ret
1504%endif
1505

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