]> git.sesse.net Git - ffmpeg/blob - libavcodec/x86/h264_chromamc.asm
x86: dsputil: Move specific optimization settings out of global init function
[ffmpeg] / libavcodec / x86 / h264_chromamc.asm
1 ;******************************************************************************
2 ;* MMX/SSSE3-optimized functions for H264 chroma MC
3 ;* Copyright (c) 2005 Zoltan Hidvegi <hzoli -a- hzoli -d- com>,
4 ;*               2005-2008 Loren Merritt
5 ;*
6 ;* This file is part of Libav.
7 ;*
8 ;* Libav is free software; you can redistribute it and/or
9 ;* modify it under the terms of the GNU Lesser General Public
10 ;* License as published by the Free Software Foundation; either
11 ;* version 2.1 of the License, or (at your option) any later version.
12 ;*
13 ;* Libav is distributed in the hope that it will be useful,
14 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
15 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16 ;* Lesser General Public License for more details.
17 ;*
18 ;* You should have received a copy of the GNU Lesser General Public
19 ;* License along with Libav; if not, write to the Free Software
20 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 ;******************************************************************************
22
23 %include "x86inc.asm"
24 %include "x86util.asm"
25
26 SECTION_RODATA
27
28 rnd_rv40_2d_tbl: times 4 dw  0
29                  times 4 dw 16
30                  times 4 dw 32
31                  times 4 dw 16
32                  times 4 dw 32
33                  times 4 dw 28
34                  times 4 dw 32
35                  times 4 dw 28
36                  times 4 dw  0
37                  times 4 dw 32
38                  times 4 dw 16
39                  times 4 dw 32
40                  times 4 dw 32
41                  times 4 dw 28
42                  times 4 dw 32
43                  times 4 dw 28
44 rnd_rv40_1d_tbl: times 4 dw  0
45                  times 4 dw  2
46                  times 4 dw  4
47                  times 4 dw  2
48                  times 4 dw  4
49                  times 4 dw  3
50                  times 4 dw  4
51                  times 4 dw  3
52                  times 4 dw  0
53                  times 4 dw  4
54                  times 4 dw  2
55                  times 4 dw  4
56                  times 4 dw  4
57                  times 4 dw  3
58                  times 4 dw  4
59                  times 4 dw  3
60
61 cextern pw_3
62 cextern pw_4
63 cextern pw_8
64 cextern pw_28
65 cextern pw_32
66 cextern pw_64
67
68 SECTION .text
69
70 %macro mv0_pixels_mc8 0
71     lea           r4, [r2*2 ]
72 .next4rows:
73     movq         mm0, [r1   ]
74     movq         mm1, [r1+r2]
75     add           r1, r4
76     CHROMAMC_AVG mm0, [r0   ]
77     CHROMAMC_AVG mm1, [r0+r2]
78     movq     [r0   ], mm0
79     movq     [r0+r2], mm1
80     add           r0, r4
81     movq         mm0, [r1   ]
82     movq         mm1, [r1+r2]
83     add           r1, r4
84     CHROMAMC_AVG mm0, [r0   ]
85     CHROMAMC_AVG mm1, [r0+r2]
86     movq     [r0   ], mm0
87     movq     [r0+r2], mm1
88     add           r0, r4
89     sub          r3d, 4
90     jne .next4rows
91 %endmacro
92
93 %macro chroma_mc8_mmx_func 3
94 %ifidn %2, rv40
95 %ifdef PIC
96 %define rnd_1d_rv40 r8
97 %define rnd_2d_rv40 r8
98 %define extra_regs 2
99 %else ; no-PIC
100 %define rnd_1d_rv40 rnd_rv40_1d_tbl
101 %define rnd_2d_rv40 rnd_rv40_2d_tbl
102 %define extra_regs 1
103 %endif ; PIC
104 %else
105 %define extra_regs 0
106 %endif ; rv40
107 ; put/avg_h264_chroma_mc8_mmx_*(uint8_t *dst /*align 8*/, uint8_t *src /*align 1*/,
108 ;                              int stride, int h, int mx, int my)
109 cglobal %1_%2_chroma_mc8_%3, 6, 7 + extra_regs, 0
110 %if ARCH_X86_64
111     movsxd        r2, r2d
112 %endif
113     mov          r6d, r5d
114     or           r6d, r4d
115     jne .at_least_one_non_zero
116     ; mx == 0 AND my == 0 - no filter needed
117     mv0_pixels_mc8
118     REP_RET
119
120 .at_least_one_non_zero:
121 %ifidn %2, rv40
122 %if ARCH_X86_64
123     mov           r7, r5
124     and           r7, 6         ; &~1 for mx/my=[0,7]
125     lea           r7, [r7*4+r4]
126     sar          r7d, 1
127 %define rnd_bias r7
128 %define dest_reg r0
129 %else ; x86-32
130     mov           r0, r5
131     and           r0, 6         ; &~1 for mx/my=[0,7]
132     lea           r0, [r0*4+r4]
133     sar          r0d, 1
134 %define rnd_bias r0
135 %define dest_reg r5
136 %endif
137 %else ; vc1, h264
138 %define rnd_bias  0
139 %define dest_reg r0
140 %endif
141
142     test         r5d, r5d
143     mov           r6, 1
144     je .my_is_zero
145     test         r4d, r4d
146     mov           r6, r2        ; dxy = x ? 1 : stride
147     jne .both_non_zero
148 .my_is_zero:
149     ; mx == 0 XOR my == 0 - 1 dimensional filter only
150     or           r4d, r5d       ; x + y
151
152 %ifidn %2, rv40
153 %ifdef PIC
154     lea           r8, [rnd_rv40_1d_tbl]
155 %endif
156 %if ARCH_X86_64 == 0
157     mov           r5, r0m
158 %endif
159 %endif
160
161     movd          m5, r4d
162     movq          m4, [pw_8]
163     movq          m6, [rnd_1d_%2+rnd_bias*8] ; mm6 = rnd >> 3
164     punpcklwd     m5, m5
165     punpckldq     m5, m5        ; mm5 = B = x
166     pxor          m7, m7
167     psubw         m4, m5        ; mm4 = A = 8-x
168
169 .next1drow:
170     movq          m0, [r1   ]   ; mm0 = src[0..7]
171     movq          m2, [r1+r6]   ; mm1 = src[1..8]
172
173     movq          m1, m0
174     movq          m3, m2
175     punpcklbw     m0, m7
176     punpckhbw     m1, m7
177     punpcklbw     m2, m7
178     punpckhbw     m3, m7
179     pmullw        m0, m4        ; [mm0,mm1] = A * src[0..7]
180     pmullw        m1, m4
181     pmullw        m2, m5        ; [mm2,mm3] = B * src[1..8]
182     pmullw        m3, m5
183
184     paddw         m0, m6
185     paddw         m1, m6
186     paddw         m0, m2
187     paddw         m1, m3
188     psrlw         m0, 3
189     psrlw         m1, 3
190     packuswb      m0, m1
191     CHROMAMC_AVG  m0, [dest_reg]
192     movq  [dest_reg], m0        ; dst[0..7] = (A * src[0..7] + B * src[1..8] + (rnd >> 3)) >> 3
193
194     add     dest_reg, r2
195     add           r1, r2
196     dec           r3d
197     jne .next1drow
198     REP_RET
199
200 .both_non_zero: ; general case, bilinear
201     movd          m4, r4d         ; x
202     movd          m6, r5d         ; y
203 %ifidn %2, rv40
204 %ifdef PIC
205     lea           r8, [rnd_rv40_2d_tbl]
206 %endif
207 %if ARCH_X86_64 == 0
208     mov           r5, r0m
209 %endif
210 %endif
211     mov           r6, rsp         ; backup stack pointer
212     and          rsp, ~(mmsize-1) ; align stack
213     sub          rsp, 16          ; AA and DD
214
215     punpcklwd     m4, m4
216     punpcklwd     m6, m6
217     punpckldq     m4, m4          ; mm4 = x words
218     punpckldq     m6, m6          ; mm6 = y words
219     movq          m5, m4
220     pmullw        m4, m6          ; mm4 = x * y
221     psllw         m5, 3
222     psllw         m6, 3
223     movq          m7, m5
224     paddw         m7, m6
225     movq     [rsp+8], m4          ; DD = x * y
226     psubw         m5, m4          ; mm5 = B = 8x - xy
227     psubw         m6, m4          ; mm6 = C = 8y - xy
228     paddw         m4, [pw_64]
229     psubw         m4, m7          ; mm4 = A = xy - (8x+8y) + 64
230     pxor          m7, m7
231     movq     [rsp  ], m4
232
233     movq          m0, [r1  ]      ; mm0 = src[0..7]
234     movq          m1, [r1+1]      ; mm1 = src[1..8]
235 .next2drow:
236     add           r1, r2
237
238     movq          m2, m0
239     movq          m3, m1
240     punpckhbw     m0, m7
241     punpcklbw     m1, m7
242     punpcklbw     m2, m7
243     punpckhbw     m3, m7
244     pmullw        m0, [rsp]
245     pmullw        m2, [rsp]
246     pmullw        m1, m5
247     pmullw        m3, m5
248     paddw         m2, m1          ; mm2 = A * src[0..3] + B * src[1..4]
249     paddw         m3, m0          ; mm3 = A * src[4..7] + B * src[5..8]
250
251     movq          m0, [r1]
252     movq          m1, m0
253     punpcklbw     m0, m7
254     punpckhbw     m1, m7
255     pmullw        m0, m6
256     pmullw        m1, m6
257     paddw         m2, m0
258     paddw         m3, m1          ; [mm2,mm3] += C * src[0..7]
259
260     movq          m1, [r1+1]
261     movq          m0, m1
262     movq          m4, m1
263     punpcklbw     m0, m7
264     punpckhbw     m4, m7
265     pmullw        m0, [rsp+8]
266     pmullw        m4, [rsp+8]
267     paddw         m2, m0
268     paddw         m3, m4          ; [mm2,mm3] += D * src[1..8]
269     movq          m0, [r1]
270
271     paddw         m2, [rnd_2d_%2+rnd_bias*8]
272     paddw         m3, [rnd_2d_%2+rnd_bias*8]
273     psrlw         m2, 6
274     psrlw         m3, 6
275     packuswb      m2, m3
276     CHROMAMC_AVG  m2, [dest_reg]
277     movq  [dest_reg], m2          ; dst[0..7] = ([mm2,mm3] + rnd) >> 6
278
279     add     dest_reg, r2
280     dec          r3d
281     jne .next2drow
282     mov          rsp, r6          ; restore stack pointer
283     RET
284 %endmacro
285
286 %macro chroma_mc4_mmx_func 3
287 %define extra_regs 0
288 %ifidn %2, rv40
289 %ifdef PIC
290 %define extra_regs 1
291 %endif ; PIC
292 %endif ; rv40
293 cglobal %1_%2_chroma_mc4_%3, 6, 6 + extra_regs, 0
294 %if ARCH_X86_64
295     movsxd        r2, r2d
296 %endif
297     pxor          m7, m7
298     movd          m2, r4d         ; x
299     movd          m3, r5d         ; y
300     movq          m4, [pw_8]
301     movq          m5, [pw_8]
302     punpcklwd     m2, m2
303     punpcklwd     m3, m3
304     punpcklwd     m2, m2
305     punpcklwd     m3, m3
306     psubw         m4, m2
307     psubw         m5, m3
308
309 %ifidn %2, rv40
310 %ifdef PIC
311    lea            r6, [rnd_rv40_2d_tbl]
312 %define rnd_2d_rv40 r6
313 %else
314 %define rnd_2d_rv40 rnd_rv40_2d_tbl
315 %endif
316     and           r5, 6         ; &~1 for mx/my=[0,7]
317     lea           r5, [r5*4+r4]
318     sar          r5d, 1
319 %define rnd_bias r5
320 %else ; vc1, h264
321 %define rnd_bias 0
322 %endif
323
324     movd          m0, [r1  ]
325     movd          m6, [r1+1]
326     add           r1, r2
327     punpcklbw     m0, m7
328     punpcklbw     m6, m7
329     pmullw        m0, m4
330     pmullw        m6, m2
331     paddw         m6, m0
332
333 .next2rows:
334     movd          m0, [r1  ]
335     movd          m1, [r1+1]
336     add           r1, r2
337     punpcklbw     m0, m7
338     punpcklbw     m1, m7
339     pmullw        m0, m4
340     pmullw        m1, m2
341     paddw         m1, m0
342     movq          m0, m1
343
344     pmullw        m6, m5
345     pmullw        m1, m3
346     paddw         m6, [rnd_2d_%2+rnd_bias*8]
347     paddw         m1, m6
348     psrlw         m1, 6
349     packuswb      m1, m1
350     CHROMAMC_AVG4 m1, m6, [r0]
351     movd        [r0], m1
352     add           r0, r2
353
354     movd          m6, [r1  ]
355     movd          m1, [r1+1]
356     add           r1, r2
357     punpcklbw     m6, m7
358     punpcklbw     m1, m7
359     pmullw        m6, m4
360     pmullw        m1, m2
361     paddw         m1, m6
362     movq          m6, m1
363     pmullw        m0, m5
364     pmullw        m1, m3
365     paddw         m0, [rnd_2d_%2+rnd_bias*8]
366     paddw         m1, m0
367     psrlw         m1, 6
368     packuswb      m1, m1
369     CHROMAMC_AVG4 m1, m0, [r0]
370     movd        [r0], m1
371     add           r0, r2
372     sub          r3d, 2
373     jnz .next2rows
374     REP_RET
375 %endmacro
376
377 %macro chroma_mc2_mmx_func 3
378 cglobal %1_%2_chroma_mc2_%3, 6, 7, 0
379 %if ARCH_X86_64
380     movsxd        r2, r2d
381 %endif
382
383     mov          r6d, r4d
384     shl          r4d, 16
385     sub          r4d, r6d
386     add          r4d, 8
387     imul         r5d, r4d         ; x*y<<16 | y*(8-x)
388     shl          r4d, 3
389     sub          r4d, r5d         ; x*(8-y)<<16 | (8-x)*(8-y)
390
391     movd          m5, r4d
392     movd          m6, r5d
393     punpckldq     m5, m5          ; mm5 = {A,B,A,B}
394     punpckldq     m6, m6          ; mm6 = {C,D,C,D}
395     pxor          m7, m7
396     movd          m2, [r1]
397     punpcklbw     m2, m7
398     pshufw        m2, m2, 0x94    ; mm0 = src[0,1,1,2]
399
400 .nextrow:
401     add           r1, r2
402     movq          m1, m2
403     pmaddwd       m1, m5          ; mm1 = A * src[0,1] + B * src[1,2]
404     movd          m0, [r1]
405     punpcklbw     m0, m7
406     pshufw        m0, m0, 0x94    ; mm0 = src[0,1,1,2]
407     movq          m2, m0
408     pmaddwd       m0, m6
409     paddw         m1, [rnd_2d_%2]
410     paddw         m1, m0          ; mm1 += C * src[0,1] + D * src[1,2]
411     psrlw         m1, 6
412     packssdw      m1, m7
413     packuswb      m1, m7
414     CHROMAMC_AVG4 m1, m3, [r0]
415     movd         r5d, m1
416     mov         [r0], r5w
417     add           r0, r2
418     sub          r3d, 1
419     jnz .nextrow
420     REP_RET
421 %endmacro
422
423 %define rnd_1d_h264 pw_4
424 %define rnd_2d_h264 pw_32
425 %define rnd_1d_vc1  pw_3
426 %define rnd_2d_vc1  pw_28
427
428 %macro NOTHING 2-3
429 %endmacro
430 %macro DIRECT_AVG 2
431     PAVG          %1, %2
432 %endmacro
433 %macro COPY_AVG 3
434     movd          %2, %3
435     PAVG          %1, %2
436 %endmacro
437
438 INIT_MMX
439 %define CHROMAMC_AVG  NOTHING
440 %define CHROMAMC_AVG4 NOTHING
441 chroma_mc8_mmx_func put, h264, mmx_rnd
442 chroma_mc8_mmx_func put, vc1,  mmx_nornd
443 chroma_mc8_mmx_func put, rv40, mmx
444 chroma_mc4_mmx_func put, h264, mmx
445 chroma_mc4_mmx_func put, rv40, mmx
446 chroma_mc2_mmx_func put, h264, mmx2
447
448 %define CHROMAMC_AVG  DIRECT_AVG
449 %define CHROMAMC_AVG4 COPY_AVG
450 %define PAVG          pavgb
451 chroma_mc8_mmx_func avg, h264, mmx2_rnd
452 chroma_mc8_mmx_func avg, vc1,  mmx2_nornd
453 chroma_mc8_mmx_func avg, rv40, mmx2
454 chroma_mc4_mmx_func avg, h264, mmx2
455 chroma_mc4_mmx_func avg, rv40, mmx2
456 chroma_mc2_mmx_func avg, h264, mmx2
457
458 %define PAVG          pavgusb
459 chroma_mc8_mmx_func avg, h264, 3dnow_rnd
460 chroma_mc8_mmx_func avg, vc1,  3dnow_nornd
461 chroma_mc8_mmx_func avg, rv40, 3dnow
462 chroma_mc4_mmx_func avg, h264, 3dnow
463 chroma_mc4_mmx_func avg, rv40, 3dnow
464
465 %macro chroma_mc8_ssse3_func 3
466 cglobal %1_%2_chroma_mc8_%3, 6, 7, 8
467 %if ARCH_X86_64
468     movsxd        r2, r2d
469 %endif
470     mov          r6d, r5d
471     or           r6d, r4d
472     jne .at_least_one_non_zero
473     ; mx == 0 AND my == 0 - no filter needed
474     mv0_pixels_mc8
475     REP_RET
476
477 .at_least_one_non_zero:
478     test         r5d, r5d
479     je .my_is_zero
480     test         r4d, r4d
481     je .mx_is_zero
482
483     ; general case, bilinear
484     mov          r6d, r4d
485     shl          r4d, 8
486     sub           r4, r6
487     mov           r6, 8
488     add           r4, 8           ; x*288+8 = x<<8 | (8-x)
489     sub          r6d, r5d
490     imul          r6, r4          ; (8-y)*(x*255+8) = (8-y)*x<<8 | (8-y)*(8-x)
491     imul         r4d, r5d         ;    y *(x*255+8) =    y *x<<8 |    y *(8-x)
492
493     movd          m7, r6d
494     movd          m6, r4d
495     movdqa        m5, [rnd_2d_%2]
496     movq          m0, [r1  ]
497     movq          m1, [r1+1]
498     pshuflw       m7, m7, 0
499     pshuflw       m6, m6, 0
500     punpcklbw     m0, m1
501     movlhps       m7, m7
502     movlhps       m6, m6
503
504 .next2rows:
505     movq          m1, [r1+r2*1   ]
506     movq          m2, [r1+r2*1+1]
507     movq          m3, [r1+r2*2  ]
508     movq          m4, [r1+r2*2+1]
509     lea           r1, [r1+r2*2]
510     punpcklbw     m1, m2
511     movdqa        m2, m1
512     punpcklbw     m3, m4
513     movdqa        m4, m3
514     pmaddubsw     m0, m7
515     pmaddubsw     m1, m6
516     pmaddubsw     m2, m7
517     pmaddubsw     m3, m6
518     paddw         m0, m5
519     paddw         m2, m5
520     paddw         m1, m0
521     paddw         m3, m2
522     psrlw         m1, 6
523     movdqa        m0, m4
524     psrlw         m3, 6
525 %ifidn %1, avg
526     movq          m2, [r0   ]
527     movhps        m2, [r0+r2]
528 %endif
529     packuswb      m1, m3
530     CHROMAMC_AVG  m1, m2
531     movq     [r0   ], m1
532     movhps   [r0+r2], m1
533     sub          r3d, 2
534     lea           r0, [r0+r2*2]
535     jg .next2rows
536     REP_RET
537
538 .my_is_zero:
539     mov          r5d, r4d
540     shl          r4d, 8
541     add           r4, 8
542     sub           r4, r5          ; 255*x+8 = x<<8 | (8-x)
543     movd          m7, r4d
544     movdqa        m6, [rnd_1d_%2]
545     pshuflw       m7, m7, 0
546     movlhps       m7, m7
547
548 .next2xrows:
549     movq          m0, [r1     ]
550     movq          m1, [r1   +1]
551     movq          m2, [r1+r2  ]
552     movq          m3, [r1+r2+1]
553     punpcklbw     m0, m1
554     punpcklbw     m2, m3
555     pmaddubsw     m0, m7
556     pmaddubsw     m2, m7
557 %ifidn %1, avg
558     movq          m4, [r0   ]
559     movhps        m4, [r0+r2]
560 %endif
561     paddw         m0, m6
562     paddw         m2, m6
563     psrlw         m0, 3
564     psrlw         m2, 3
565     packuswb      m0, m2
566     CHROMAMC_AVG  m0, m4
567     movq     [r0   ], m0
568     movhps   [r0+r2], m0
569     sub          r3d, 2
570     lea           r0, [r0+r2*2]
571     lea           r1, [r1+r2*2]
572     jg .next2xrows
573     REP_RET
574
575 .mx_is_zero:
576     mov          r4d, r5d
577     shl          r5d, 8
578     add           r5, 8
579     sub           r5, r4          ; 255*y+8 = y<<8 | (8-y)
580     movd          m7, r5d
581     movdqa        m6, [rnd_1d_%2]
582     pshuflw       m7, m7, 0
583     movlhps       m7, m7
584
585 .next2yrows:
586     movq          m0, [r1     ]
587     movq          m1, [r1+r2  ]
588     movdqa        m2, m1
589     movq          m3, [r1+r2*2]
590     lea           r1, [r1+r2*2]
591     punpcklbw     m0, m1
592     punpcklbw     m2, m3
593     pmaddubsw     m0, m7
594     pmaddubsw     m2, m7
595 %ifidn %1, avg
596     movq          m4, [r0   ]
597     movhps        m4, [r0+r2]
598 %endif
599     paddw         m0, m6
600     paddw         m2, m6
601     psrlw         m0, 3
602     psrlw         m2, 3
603     packuswb      m0, m2
604     CHROMAMC_AVG  m0, m4
605     movq     [r0   ], m0
606     movhps   [r0+r2], m0
607     sub          r3d, 2
608     lea           r0, [r0+r2*2]
609     jg .next2yrows
610     REP_RET
611 %endmacro
612
613 %macro chroma_mc4_ssse3_func 3
614 cglobal %1_%2_chroma_mc4_%3, 6, 7, 0
615 %if ARCH_X86_64
616     movsxd        r2, r2d
617 %endif
618     mov           r6, r4
619     shl          r4d, 8
620     sub          r4d, r6d
621     mov           r6, 8
622     add          r4d, 8           ; x*288+8
623     sub          r6d, r5d
624     imul         r6d, r4d         ; (8-y)*(x*255+8) = (8-y)*x<<8 | (8-y)*(8-x)
625     imul         r4d, r5d         ;    y *(x*255+8) =    y *x<<8 |    y *(8-x)
626
627     movd          m7, r6d
628     movd          m6, r4d
629     movq          m5, [pw_32]
630     movd          m0, [r1  ]
631     pshufw        m7, m7, 0
632     punpcklbw     m0, [r1+1]
633     pshufw        m6, m6, 0
634
635 .next2rows:
636     movd          m1, [r1+r2*1  ]
637     movd          m3, [r1+r2*2  ]
638     punpcklbw     m1, [r1+r2*1+1]
639     punpcklbw     m3, [r1+r2*2+1]
640     lea           r1, [r1+r2*2]
641     movq          m2, m1
642     movq          m4, m3
643     pmaddubsw     m0, m7
644     pmaddubsw     m1, m6
645     pmaddubsw     m2, m7
646     pmaddubsw     m3, m6
647     paddw         m0, m5
648     paddw         m2, m5
649     paddw         m1, m0
650     paddw         m3, m2
651     psrlw         m1, 6
652     movq          m0, m4
653     psrlw         m3, 6
654     packuswb      m1, m1
655     packuswb      m3, m3
656     CHROMAMC_AVG  m1, [r0  ]
657     CHROMAMC_AVG  m3, [r0+r2]
658     movd     [r0   ], m1
659     movd     [r0+r2], m3
660     sub          r3d, 2
661     lea           r0, [r0+r2*2]
662     jg .next2rows
663     REP_RET
664 %endmacro
665
666 %define CHROMAMC_AVG NOTHING
667 INIT_XMM
668 chroma_mc8_ssse3_func put, h264, ssse3_rnd
669 chroma_mc8_ssse3_func put, vc1,  ssse3_nornd
670 INIT_MMX
671 chroma_mc4_ssse3_func put, h264, ssse3
672
673 %define CHROMAMC_AVG DIRECT_AVG
674 %define PAVG         pavgb
675 INIT_XMM
676 chroma_mc8_ssse3_func avg, h264, ssse3_rnd
677 chroma_mc8_ssse3_func avg, vc1,  ssse3_nornd
678 INIT_MMX
679 chroma_mc4_ssse3_func avg, h264, ssse3