]> git.sesse.net Git - x264/blob - common/x86/predict-a.asm
Update file headers throughout x264
[x264] / common / x86 / predict-a.asm
1 ;*****************************************************************************
2 ;* predict-a.asm: h264 encoder library
3 ;*****************************************************************************
4 ;* Copyright (C) 2005-2008 x264 project
5 ;*
6 ;* Authors: Loren Merritt <lorenm@u.washington.edu>
7 ;*          Fiona Glaser <fiona@x264.com>
8 ;*
9 ;* This program is free software; you can redistribute it and/or modify
10 ;* it under the terms of the GNU General Public License as published by
11 ;* the Free Software Foundation; either version 2 of the License, or
12 ;* (at your option) any later version.
13 ;*
14 ;* This program is distributed in the hope that it will be useful,
15 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
16 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 ;* GNU General Public License for more details.
18 ;*
19 ;* You should have received a copy of the GNU General Public License
20 ;* along with this program; if not, write to the Free Software
21 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
22 ;*****************************************************************************
23
24 %include "x86inc.asm"
25
26 %macro STORE8x8 2
27     movq        [r0 + 0*FDEC_STRIDE], %1
28     movq        [r0 + 1*FDEC_STRIDE], %1
29     movq        [r0 + 2*FDEC_STRIDE], %1
30     movq        [r0 + 3*FDEC_STRIDE], %1
31     movq        [r0 + 4*FDEC_STRIDE], %2
32     movq        [r0 + 5*FDEC_STRIDE], %2
33     movq        [r0 + 6*FDEC_STRIDE], %2
34     movq        [r0 + 7*FDEC_STRIDE], %2
35 %endmacro
36
37 %macro STORE16x16 2
38     mov         r1d, 4
39 .loop:
40     movq        [r0 + 0*FDEC_STRIDE], %1
41     movq        [r0 + 1*FDEC_STRIDE], %1
42     movq        [r0 + 2*FDEC_STRIDE], %1
43     movq        [r0 + 3*FDEC_STRIDE], %1
44     movq        [r0 + 0*FDEC_STRIDE + 8], %2
45     movq        [r0 + 1*FDEC_STRIDE + 8], %2
46     movq        [r0 + 2*FDEC_STRIDE + 8], %2
47     movq        [r0 + 3*FDEC_STRIDE + 8], %2
48     add         r0, 4*FDEC_STRIDE
49     dec         r1d
50     jg          .loop
51 %endmacro
52
53 %macro STORE16x16_SSE2 1
54     mov         r1d, 4
55 .loop:
56     movdqa      [r0 + 0*FDEC_STRIDE], %1
57     movdqa      [r0 + 1*FDEC_STRIDE], %1
58     movdqa      [r0 + 2*FDEC_STRIDE], %1
59     movdqa      [r0 + 3*FDEC_STRIDE], %1
60     add         r0, 4*FDEC_STRIDE
61     dec         r1d
62     jg          .loop
63 %endmacro
64
65 SECTION_RODATA
66
67 ALIGN 16
68 pb_1:       times 16 db 1
69 pw_2:       times 4 dw 2
70 pw_4:       times 4 dw 4
71 pw_8:       times 8 dw 8
72 pw_76543210:
73 pw_3210:    dw 0, 1, 2, 3, 4, 5, 6, 7
74 pb_00s_ff:  times 8 db 0
75 pb_0s_ff:   times 7 db 0 
76             db 0xff
77
78 SECTION .text
79
80 ; dest, left, right, src, tmp
81 ; output: %1 = (t[n-1] + t[n]*2 + t[n+1] + 2) >> 2
82 %macro PRED8x8_LOWPASS0 6
83     mov%6       %5, %2
84     pavgb       %2, %3
85     pxor        %3, %5
86     mov%6       %1, %4
87     pand        %3, [pb_1 GLOBAL]
88     psubusb     %2, %3
89     pavgb       %1, %2
90 %endmacro
91 %macro PRED8x8_LOWPASS 5
92     PRED8x8_LOWPASS0 %1, %2, %3, %4, %5, q
93 %endmacro
94 %macro PRED8x8_LOWPASS_XMM 5
95     PRED8x8_LOWPASS0 %1, %2, %3, %4, %5, dqa
96 %endmacro
97
98
99 ;-----------------------------------------------------------------------------
100 ; void predict_4x4_ddl_mmxext( uint8_t *src )
101 ;-----------------------------------------------------------------------------
102 cglobal predict_4x4_ddl_mmxext, 1,1,1
103     sub         r0, FDEC_STRIDE
104     movq        mm3, [r0]
105     movq        mm1, [r0-1]
106     movq        mm2, mm3
107     movq        mm4, [pb_0s_ff GLOBAL]
108     psrlq       mm2, 8
109     pand        mm4, mm3
110     por         mm2, mm4
111
112     PRED8x8_LOWPASS mm0, mm1, mm2, mm3, mm5
113
114 %assign Y 1
115 %rep 4
116     psrlq       mm0, 8
117     movd        [r0+Y*FDEC_STRIDE], mm0
118 %assign Y (Y+1)
119 %endrep
120
121     RET
122
123 ;-----------------------------------------------------------------------------
124 ; void predict_4x4_vl_mmxext( uint8_t *src )
125 ;-----------------------------------------------------------------------------
126 cglobal predict_4x4_vl_mmxext, 1,1,1
127     movq        mm1, [r0-FDEC_STRIDE]
128     movq        mm3, mm1
129     movq        mm2, mm1
130     psrlq       mm3, 8
131     psrlq       mm2, 16
132     movq        mm4, mm3
133     pavgb       mm4, mm1
134
135     PRED8x8_LOWPASS mm0, mm1, mm2, mm3, mm5
136
137     movd        [r0+0*FDEC_STRIDE], mm4
138     movd        [r0+1*FDEC_STRIDE], mm0
139     psrlq       mm4, 8
140     psrlq       mm0, 8
141     movd        [r0+2*FDEC_STRIDE], mm4
142     movd        [r0+3*FDEC_STRIDE], mm0
143
144     RET
145
146 ;-----------------------------------------------------------------------------
147 ; void predict_8x8_v_mmxext( uint8_t *src, uint8_t *edge )
148 ;-----------------------------------------------------------------------------
149 cglobal predict_8x8_v_mmxext, 2,2
150     movq        mm0, [r1+16]
151     STORE8x8    mm0, mm0
152     RET
153
154 ;-----------------------------------------------------------------------------
155 ; void predict_8x8_dc_mmxext( uint8_t *src, uint8_t *edge );
156 ;-----------------------------------------------------------------------------
157 cglobal predict_8x8_dc_mmxext, 2,2,1
158     pxor        mm0, mm0
159     pxor        mm1, mm1
160     psadbw      mm0, [r1+7]
161     psadbw      mm1, [r1+16]
162     paddw       mm0, [pw_8 GLOBAL]
163     paddw       mm0, mm1
164     psrlw       mm0, 4
165     pshufw      mm0, mm0, 0
166     packuswb    mm0, mm0
167     STORE8x8    mm0, mm0
168     RET
169
170 ;-----------------------------------------------------------------------------
171 ; void predict_8x8_dc_top_mmxext( uint8_t *src, uint8_t *edge );
172 ;-----------------------------------------------------------------------------
173 %macro PRED8x8_DC 2
174 cglobal %1, 2,2,1
175     pxor        mm0, mm0
176     psadbw      mm0, [r1+%2]
177     paddw       mm0, [pw_4 GLOBAL]
178     psrlw       mm0, 3
179     pshufw      mm0, mm0, 0
180     packuswb    mm0, mm0
181     STORE8x8    mm0, mm0
182     RET
183 %endmacro
184
185 PRED8x8_DC predict_8x8_dc_top_mmxext, 16
186 PRED8x8_DC predict_8x8_dc_left_mmxext, 7
187
188 %ifndef ARCH_X86_64
189 ; sse2 is faster even on amd, so there's no sense in spending exe size on these
190 ; functions if we know sse2 is available.
191
192 ;-----------------------------------------------------------------------------
193 ; void predict_8x8_ddl_mmxext( uint8_t *src, uint8_t *edge )
194 ;-----------------------------------------------------------------------------
195 cglobal predict_8x8_ddl_mmxext, 2,2,1
196     movq        mm5, [r1+16]
197     movq        mm2, [r1+17]
198     movq        mm3, [r1+23]
199     movq        mm4, [r1+25]
200     movq        mm1, mm5
201     psllq       mm1, 8
202     PRED8x8_LOWPASS mm0, mm1, mm2, mm5, mm7
203     PRED8x8_LOWPASS mm1, mm3, mm4, [r1+24], mm6
204
205 %assign Y 7
206 %rep 6
207     movq        [r0+Y*FDEC_STRIDE], mm1
208     movq        mm2, mm0
209     psllq       mm1, 8
210     psrlq       mm2, 56
211     psllq       mm0, 8
212     por         mm1, mm2
213 %assign Y (Y-1)
214 %endrep
215     movq        [r0+Y*FDEC_STRIDE], mm1
216     psllq       mm1, 8
217     psrlq       mm0, 56
218     por         mm1, mm0
219 %assign Y (Y-1)
220     movq        [r0+Y*FDEC_STRIDE], mm1
221     RET
222
223 ;-----------------------------------------------------------------------------
224 ; void predict_8x8_ddr_mmxext( uint8_t *src, uint8_t *edge )
225 ;-----------------------------------------------------------------------------
226 cglobal predict_8x8_ddr_mmxext, 2,2,1
227     movq        mm1, [r1+7]
228     movq        mm2, [r1+9]
229     movq        mm3, [r1+15]
230     movq        mm4, [r1+17]
231     PRED8x8_LOWPASS mm0, mm1, mm2, [r1+8], mm7
232     PRED8x8_LOWPASS mm1, mm3, mm4, [r1+16], mm6
233
234 %assign Y 7
235 %rep 6
236     movq        [r0+Y*FDEC_STRIDE], mm0
237     movq        mm2, mm1
238     psrlq       mm0, 8
239     psllq       mm2, 56
240     psrlq       mm1, 8
241     por         mm0, mm2
242 %assign Y (Y-1)
243 %endrep
244     movq        [r0+Y*FDEC_STRIDE], mm0
245     psrlq       mm0, 8
246     psllq       mm1, 56
247     por         mm0, mm1
248 %assign Y (Y-1)
249     movq        [r0+Y*FDEC_STRIDE], mm0
250     RET
251
252 %endif ; !ARCH_X86_64
253
254 ;-----------------------------------------------------------------------------
255 ; void predict_8x8_ddl_sse2( uint8_t *src, uint8_t *edge )
256 ;-----------------------------------------------------------------------------
257 cglobal predict_8x8_ddl_sse2, 2,2,1
258     movdqa      xmm3, [r1+16]
259     movdqu      xmm2, [r1+17]
260     movdqa      xmm1, xmm3
261     pslldq      xmm1, 1
262     PRED8x8_LOWPASS_XMM xmm0, xmm1, xmm2, xmm3, xmm4
263
264 %assign Y 0
265 %rep 8
266     psrldq      xmm0, 1
267     movq        [r0+Y*FDEC_STRIDE], xmm0
268 %assign Y (Y+1)
269 %endrep
270     RET
271
272 ;-----------------------------------------------------------------------------
273 ; void predict_8x8_ddr_sse2( uint8_t *src, uint8_t *edge )
274 ;-----------------------------------------------------------------------------
275 cglobal predict_8x8_ddr_sse2, 2,2,1
276     movdqu      xmm3, [r1+8]
277     movdqu      xmm1, [r1+7]
278     movdqa      xmm2, xmm3
279     psrldq      xmm2, 1
280     PRED8x8_LOWPASS_XMM xmm0, xmm1, xmm2, xmm3, xmm4
281
282     movdqa      xmm1, xmm0
283     psrldq      xmm1, 1
284 %assign Y 7
285 %rep 3
286     movq        [r0+Y*FDEC_STRIDE], xmm0
287     movq        [r0+(Y-1)*FDEC_STRIDE], xmm1
288     psrldq      xmm0, 2
289     psrldq      xmm1, 2
290 %assign Y (Y-2)
291 %endrep
292     movq        [r0+1*FDEC_STRIDE], xmm0
293     movq        [r0+0*FDEC_STRIDE], xmm1
294
295     RET
296
297 ;-----------------------------------------------------------------------------
298 ; void predict_8x8_vl_sse2( uint8_t *src, uint8_t *edge )
299 ;-----------------------------------------------------------------------------
300 cglobal predict_8x8_vl_sse2, 2,2,1
301     movdqa      xmm4, [r1+16]
302     movdqa      xmm2, xmm4
303     movdqa      xmm1, xmm4
304     movdqa      xmm3, xmm4
305     psrldq      xmm2, 1
306     pslldq      xmm1, 1
307     pavgb       xmm3, xmm2
308     PRED8x8_LOWPASS_XMM xmm0, xmm1, xmm2, xmm4, xmm5
309 ; xmm0: (t0 + 2*t1 + t2 + 2) >> 2
310 ; xmm3: (t0 + t1 + 1) >> 1
311
312 %assign Y 0
313 %rep 3
314     psrldq      xmm0, 1
315     movq        [r0+ Y   *FDEC_STRIDE], xmm3
316     movq        [r0+(Y+1)*FDEC_STRIDE], xmm0
317     psrldq      xmm3, 1
318 %assign Y (Y+2)
319 %endrep
320     psrldq      xmm0, 1
321     movq        [r0+ Y   *FDEC_STRIDE], xmm3
322     movq        [r0+(Y+1)*FDEC_STRIDE], xmm0
323
324     RET
325
326 ;-----------------------------------------------------------------------------
327 ; void predict_8x8_vr_core_mmxext( uint8_t *src, uint8_t *edge )
328 ;-----------------------------------------------------------------------------
329
330 ; fills only some pixels:
331 ; f01234567
332 ; 0........
333 ; 1,,,,,,,,
334 ; 2 .......
335 ; 3 ,,,,,,,
336 ; 4  ......
337 ; 5  ,,,,,,
338 ; 6   .....
339 ; 7   ,,,,,
340
341 cglobal predict_8x8_vr_core_mmxext, 2,2,1
342     movq        mm2, [r1+16]
343     movq        mm3, [r1+15]
344     movq        mm1, [r1+14]
345     movq        mm4, mm3
346     pavgb       mm3, mm2
347     PRED8x8_LOWPASS mm0, mm1, mm2, mm4, mm7
348
349 %assign Y 0
350 %rep 3
351     movq        [r0+ Y   *FDEC_STRIDE], mm3
352     movq        [r0+(Y+1)*FDEC_STRIDE], mm0
353     psllq       mm3, 8
354     psllq       mm0, 8
355 %assign Y (Y+2)
356 %endrep
357     movq        [r0+ Y   *FDEC_STRIDE], mm3
358     movq        [r0+(Y+1)*FDEC_STRIDE], mm0
359
360     RET
361
362 ;-----------------------------------------------------------------------------
363 ; void predict_8x8c_v_mmx( uint8_t *src )
364 ;-----------------------------------------------------------------------------
365 cglobal predict_8x8c_v_mmx, 1,1
366     movq        mm0, [r0 - FDEC_STRIDE]
367     STORE8x8    mm0, mm0
368     RET
369
370 ;-----------------------------------------------------------------------------
371 ; void predict_8x8c_dc_core_mmxext( uint8_t *src, int s2, int s3 )
372 ;-----------------------------------------------------------------------------
373 cglobal predict_8x8c_dc_core_mmxext, 1,1,1
374     movq        mm0, [r0 - FDEC_STRIDE]
375     pxor        mm1, mm1
376     pxor        mm2, mm2
377     punpckhbw   mm1, mm0
378     punpcklbw   mm0, mm2
379     psadbw      mm1, mm2        ; s1
380     psadbw      mm0, mm2        ; s0
381
382 %ifdef ARCH_X86_64
383     movd        mm4, r1d
384     movd        mm5, r2d
385     paddw       mm0, mm4
386     pshufw      mm2, mm5, 0
387 %else
388     paddw       mm0, r1m
389     pshufw      mm2, r2m, 0
390 %endif
391     psrlw       mm0, 3
392     paddw       mm1, [pw_2 GLOBAL]
393     movq        mm3, mm2
394     pshufw      mm1, mm1, 0
395     pshufw      mm0, mm0, 0     ; dc0 (w)
396     paddw       mm3, mm1
397     psrlw       mm3, 3          ; dc3 (w)
398     psrlw       mm2, 2          ; dc2 (w)
399     psrlw       mm1, 2          ; dc1 (w)
400
401     packuswb    mm0, mm1        ; dc0,dc1 (b)
402     packuswb    mm2, mm3        ; dc2,dc3 (b)
403
404     STORE8x8    mm0, mm2
405     RET
406
407 %macro LOAD_PLANE_ARGS 0
408 %ifdef ARCH_X86_64
409     movd        mm0, r1d
410     movd        mm2, r2d
411     movd        mm4, r3d
412     pshufw      mm0, mm0, 0
413     pshufw      mm2, mm2, 0
414     pshufw      mm4, mm4, 0
415 %else
416     pshufw      mm0, r1m, 0
417     pshufw      mm2, r2m, 0
418     pshufw      mm4, r3m, 0
419 %endif
420 %endmacro
421
422 ;-----------------------------------------------------------------------------
423 ; void predict_8x8c_p_core_mmxext( uint8_t *src, int i00, int b, int c )
424 ;-----------------------------------------------------------------------------
425 cglobal predict_8x8c_p_core_mmxext, 1,2,1
426     LOAD_PLANE_ARGS
427     movq        mm1, mm2
428     pmullw      mm2, [pw_3210 GLOBAL]
429     psllw       mm1, 2
430     paddsw      mm0, mm2        ; mm0 = {i+0*b, i+1*b, i+2*b, i+3*b}
431     paddsw      mm1, mm0        ; mm1 = {i+4*b, i+5*b, i+6*b, i+7*b}
432
433     mov         r1d, 8
434 ALIGN 4
435 .loop:
436     movq        mm5, mm0
437     movq        mm6, mm1
438     psraw       mm5, 5
439     psraw       mm6, 5
440     packuswb    mm5, mm6
441     movq        [r0], mm5
442
443     paddsw      mm0, mm4
444     paddsw      mm1, mm4
445     add         r0, FDEC_STRIDE
446     dec         r1d
447     jg          .loop
448     REP_RET
449
450 ;-----------------------------------------------------------------------------
451 ; void predict_16x16_p_core_mmxext( uint8_t *src, int i00, int b, int c )
452 ;-----------------------------------------------------------------------------
453 cglobal predict_16x16_p_core_mmxext, 1,2,1
454     LOAD_PLANE_ARGS
455     movq        mm5, mm2
456     movq        mm1, mm2
457     pmullw      mm5, [pw_3210 GLOBAL]
458     psllw       mm2, 3
459     psllw       mm1, 2
460     movq        mm3, mm2
461     paddsw      mm0, mm5        ; mm0 = {i+ 0*b, i+ 1*b, i+ 2*b, i+ 3*b}
462     paddsw      mm1, mm0        ; mm1 = {i+ 4*b, i+ 5*b, i+ 6*b, i+ 7*b}
463     paddsw      mm2, mm0        ; mm2 = {i+ 8*b, i+ 9*b, i+10*b, i+11*b}
464     paddsw      mm3, mm1        ; mm3 = {i+12*b, i+13*b, i+14*b, i+15*b}
465
466     mov         r1d, 16
467 ALIGN 4
468 .loop:
469     movq        mm5, mm0
470     movq        mm6, mm1
471     psraw       mm5, 5
472     psraw       mm6, 5
473     packuswb    mm5, mm6
474     movq        [r0], mm5
475
476     movq        mm5, mm2
477     movq        mm6, mm3
478     psraw       mm5, 5
479     psraw       mm6, 5
480     packuswb    mm5, mm6
481     movq        [r0+8], mm5
482
483     paddsw      mm0, mm4
484     paddsw      mm1, mm4
485     paddsw      mm2, mm4
486     paddsw      mm3, mm4
487     add         r0, FDEC_STRIDE
488     dec         r1d
489     jg          .loop
490     REP_RET
491
492 ;-----------------------------------------------------------------------------
493 ; void predict_16x16_p_core_sse2( uint8_t *src, int i00, int b, int c )
494 ;-----------------------------------------------------------------------------
495 cglobal predict_16x16_p_core_sse2, 1,2,1
496     movd        xmm0, r1m
497     movd        xmm1, r2m
498     movd        xmm2, r3m
499     pshuflw     xmm0, xmm0, 0
500     pshuflw     xmm1, xmm1, 0
501     pshuflw     xmm2, xmm2, 0
502     punpcklqdq  xmm0, xmm0
503     punpcklqdq  xmm1, xmm1
504     punpcklqdq  xmm2, xmm2
505     movdqa      xmm3, xmm1
506     pmullw      xmm3, [pw_76543210 GLOBAL]
507     psllw       xmm1, 3
508     paddsw      xmm0, xmm3  ; xmm0 = {i+ 0*b, i+ 1*b, i+ 2*b, i+ 3*b, i+ 4*b, i+ 5*b, i+ 6*b, i+ 7*b}
509     paddsw      xmm1, xmm0  ; xmm1 = {i+ 8*b, i+ 9*b, i+10*b, i+11*b, i+12*b, i+13*b, i+14*b, i+15*b}
510
511     mov         r1d, 16
512 ALIGN 4
513 .loop:
514     movdqa      xmm3, xmm0
515     movdqa      xmm4, xmm1
516     psraw       xmm3, 5
517     psraw       xmm4, 5
518     packuswb    xmm3, xmm4
519     movdqa      [r0], xmm3
520
521     paddsw      xmm0, xmm2
522     paddsw      xmm1, xmm2
523     add         r0, FDEC_STRIDE
524     dec         r1d
525     jg          .loop
526     REP_RET
527
528 ;-----------------------------------------------------------------------------
529 ; void predict_16x16_v_mmx( uint8_t *src )
530 ;-----------------------------------------------------------------------------
531 cglobal predict_16x16_v_mmx, 1,2
532     movq        mm0, [r0 - FDEC_STRIDE]
533     movq        mm1, [r0 - FDEC_STRIDE + 8]
534     STORE16x16  mm0, mm1
535     REP_RET
536
537 ;-----------------------------------------------------------------------------
538 ; void predict_16x16_v_sse2( uint8_t *src )
539 ;-----------------------------------------------------------------------------
540 cglobal predict_16x16_v_sse2, 1,2
541     movdqa      xmm0, [r0 - FDEC_STRIDE]
542     STORE16x16_SSE2 xmm0
543     REP_RET
544
545 ;-----------------------------------------------------------------------------
546 ; void predict_16x16_dc_core_mmxext( uint8_t *src, int i_dc_left )
547 ;-----------------------------------------------------------------------------
548
549 %macro PRED16x16_DC 2
550     pxor        mm0, mm0
551     pxor        mm1, mm1
552     psadbw      mm0, [r0 - FDEC_STRIDE]
553     psadbw      mm1, [r0 - FDEC_STRIDE + 8]
554     paddusw     mm0, mm1
555     paddusw     mm0, %1
556     psrlw       mm0, %2                       ; dc
557     pshufw      mm0, mm0, 0
558     packuswb    mm0, mm0                      ; dc in bytes
559     STORE16x16  mm0, mm0
560 %endmacro
561
562 cglobal predict_16x16_dc_core_mmxext, 1,2
563 %ifdef ARCH_X86_64
564     movd         mm2, r1d
565     PRED16x16_DC mm2, 5
566 %else
567     PRED16x16_DC r1m, 5
568 %endif
569     REP_RET
570
571 cglobal predict_16x16_dc_top_mmxext, 1,2,1
572     PRED16x16_DC [pw_8 GLOBAL], 4
573     REP_RET
574
575 ;-----------------------------------------------------------------------------
576 ; void predict_16x16_dc_core_sse2( uint8_t *src, int i_dc_left )
577 ;-----------------------------------------------------------------------------
578
579 %macro PRED16x16_DC_SSE2 2
580     pxor        xmm0, xmm0
581     psadbw      xmm0, [r0 - FDEC_STRIDE]
582     movhlps     xmm1, xmm0
583     paddw       xmm0, xmm1
584     paddusw     xmm0, %1
585     psrlw       xmm0, %2                ; dc
586     pshuflw     xmm0, xmm0, 0
587     punpcklqdq  xmm0, xmm0
588     packuswb    xmm0, xmm0              ; dc in bytes
589     STORE16x16_SSE2 xmm0
590 %endmacro
591
592 cglobal predict_16x16_dc_core_sse2, 1,2
593     movd xmm2, r1m
594     PRED16x16_DC_SSE2 xmm2, 5
595     REP_RET
596
597 cglobal predict_16x16_dc_top_sse2, 1,2,1
598     PRED16x16_DC_SSE2 [pw_8 GLOBAL], 4
599     REP_RET
600