use x264_mc_copy_w16_sse2 in mc.copy, it was previously only in mc_luma
[x262.git] / common / x86 / mc-a.asm
1 ;*****************************************************************************
2 ;* mc-a.asm: h264 encoder library
3 ;*****************************************************************************
4 ;* Copyright (C) 2003-2008 x264 project
5 ;*
6 ;* Authors: Loren Merritt <lorenm@u.washington.edu>
7 ;*          Laurent Aimar <fenrir@via.ecp.fr>
8 ;*          Min Chen <chenm001.163.com>
9 ;*
10 ;* This program is free software; you can redistribute it and/or modify
11 ;* it under the terms of the GNU General Public License as published by
12 ;* the Free Software Foundation; either version 2 of the License, or
13 ;* (at your option) any later version.
14 ;*
15 ;* This program is distributed in the hope that it will be useful,
16 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 ;* GNU General Public License for more details.
19 ;*
20 ;* You should have received a copy of the GNU General Public License
21 ;* along with this program; if not, write to the Free Software
22 ;* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
23 ;*****************************************************************************
24
25 %include "x86inc.asm"
26
27 SECTION_RODATA
28
29 pw_4:  times 4 dw  4
30 pw_8:  times 4 dw  8
31 pw_32: times 4 dw 32
32 pw_64: times 4 dw 64
33
34 SECTION .text
35
36 ;=============================================================================
37 ; pixel avg
38 ;=============================================================================
39
40 ;-----------------------------------------------------------------------------
41 ; void x264_pixel_avg_4x4_mmxext( uint8_t *dst, int dst_stride,
42 ;                                 uint8_t *src, int src_stride );
43 ;-----------------------------------------------------------------------------
44 %macro AVGH 3
45 %assign function_align 8 ; the whole function fits in 8 bytes, so a larger align just wastes space
46 cglobal x264_pixel_avg_%1x%2_%3
47     mov eax, %2
48     jmp x264_pixel_avg_w%1_%3
49 %assign function_align 16
50 %endmacro
51
52 ;-----------------------------------------------------------------------------
53 ; void x264_pixel_avg_w4_mmxext( uint8_t *dst, int dst_stride,
54 ;                                uint8_t *src, int src_stride,
55 ;                                int height );
56 ;-----------------------------------------------------------------------------
57 %ifdef ARCH_X86_64
58     %define t0 r0
59     %define t1 r1
60     %define t2 r2
61     %define t3 r3
62     %macro AVG_START 1
63         cglobal %1, 4,5
64         .height_loop:
65     %endmacro
66 %else
67     %define t0 r1
68     %define t1 r2
69     %define t2 r3
70     %define t3 r4
71     %macro AVG_START 1
72         cglobal %1, 0,5
73         mov t0, r0m
74         mov t1, r1m
75         mov t2, r2m
76         mov t3, r3m
77         .height_loop:
78     %endmacro
79 %endif
80
81 %macro AVG_END 0
82     sub    eax, 2
83     lea    t2, [t2+t3*2]
84     lea    t0, [t0+t1*2]
85     jg     .height_loop
86     REP_RET
87 %endmacro
88
89 AVG_START x264_pixel_avg_w4_mmxext
90     movd   mm0, [t2]
91     movd   mm1, [t2+t3]
92     pavgb  mm0, [t0]
93     pavgb  mm1, [t0+t1]
94     movd   [t0], mm0
95     movd   [t0+t1], mm1
96 AVG_END
97
98 AVGH 4, 8, mmxext
99 AVGH 4, 4, mmxext
100 AVGH 4, 2, mmxext
101
102 AVG_START x264_pixel_avg_w8_mmxext
103     movq   mm0, [t2]
104     movq   mm1, [t2+t3]
105     pavgb  mm0, [t0]
106     pavgb  mm1, [t0+t1]
107     movq   [t0], mm0
108     movq   [t0+t1], mm1
109 AVG_END
110
111 AVGH 8, 16, mmxext
112 AVGH 8, 8,  mmxext
113 AVGH 8, 4,  mmxext
114
115 AVG_START x264_pixel_avg_w16_mmxext
116     movq   mm0, [t2  ]
117     movq   mm1, [t2+8]
118     movq   mm2, [t2+t3  ]
119     movq   mm3, [t2+t3+8]
120     pavgb  mm0, [t0  ]
121     pavgb  mm1, [t0+8]
122     pavgb  mm2, [t0+t1  ]
123     pavgb  mm3, [t0+t1+8]
124     movq   [t0  ], mm0
125     movq   [t0+8], mm1
126     movq   [t0+t1  ], mm2
127     movq   [t0+t1+8], mm3
128 AVG_END
129
130 AVGH 16, 16, mmxext
131 AVGH 16, 8,  mmxext
132
133 AVG_START x264_pixel_avg_w16_sse2
134     movdqu xmm0, [t2]
135     movdqu xmm1, [t2+t3]
136     pavgb  xmm0, [t0]
137     pavgb  xmm1, [t0+t1]
138     movdqa [t0], xmm0
139     movdqa [t0+t1], xmm1
140 AVG_END
141
142 AVGH 16, 16, sse2
143 AVGH 16, 8,  sse2
144
145
146
147 ;=============================================================================
148 ; pixel avg2
149 ;=============================================================================
150
151 ;-----------------------------------------------------------------------------
152 ; void x264_pixel_avg2_w4_mmxext( uint8_t *dst, int dst_stride,
153 ;                                 uint8_t *src1, int src_stride,
154 ;                                 uint8_t *src2, int height );
155 ;-----------------------------------------------------------------------------
156 %macro AVG2_W8 2
157 cglobal x264_pixel_avg2_w%1_mmxext, 6,7
158     sub    r4, r2
159     lea    r6, [r4+r3]
160 .height_loop:
161     %2     mm0, [r2]
162     %2     mm1, [r2+r3]
163     pavgb  mm0, [r2+r4]
164     pavgb  mm1, [r2+r6]
165     %2     [r0], mm0
166     %2     [r0+r1], mm1
167     sub    r5d, 2
168     lea    r2, [r2+r3*2]
169     lea    r0, [r0+r1*2]
170     jg     .height_loop
171     REP_RET
172 %endmacro
173
174 AVG2_W8 4, movd
175 AVG2_W8 8, movq
176
177 %macro AVG2_W16 2
178 cglobal x264_pixel_avg2_w%1_mmxext, 6,7
179     sub    r4, r2
180     lea    r6, [r4+r3]
181 .height_loop:
182     movq   mm0, [r2]
183     %2     mm1, [r2+8]
184     movq   mm2, [r2+r3]
185     %2     mm3, [r2+r3+8]
186     pavgb  mm0, [r2+r4]
187     pavgb  mm1, [r2+r4+8]
188     pavgb  mm2, [r2+r6]
189     pavgb  mm3, [r2+r6+8]
190     movq   [r0], mm0
191     %2     [r0+8], mm1
192     movq   [r0+r1], mm2
193     %2     [r0+r1+8], mm3
194     lea    r2, [r2+r3*2]
195     lea    r0, [r0+r1*2]
196     sub    r5d, 2
197     jg     .height_loop
198     REP_RET
199 %endmacro
200
201 AVG2_W16 12, movd
202 AVG2_W16 16, movq
203
204 cglobal x264_pixel_avg2_w20_mmxext, 6,7
205     sub    r4, r2
206     lea    r6, [r4+r3]
207 .height_loop:
208     movq   mm0, [r2]
209     movq   mm1, [r2+8]
210     movd   mm2, [r2+16]
211     movq   mm3, [r2+r3]
212     movq   mm4, [r2+r3+8]
213     movd   mm5, [r2+r3+16]
214     pavgb  mm0, [r2+r4]
215     pavgb  mm1, [r2+r4+8]
216     pavgb  mm2, [r2+r4+16]
217     pavgb  mm3, [r2+r6]
218     pavgb  mm4, [r2+r6+8]
219     pavgb  mm5, [r2+r6+16]
220     movq   [r0], mm0
221     movq   [r0+8], mm1
222     movd   [r0+16], mm2
223     movq   [r0+r1], mm3
224     movq   [r0+r1+8], mm4
225     movd   [r0+r1+16], mm5
226     lea    r2, [r2+r3*2]
227     lea    r0, [r0+r1*2]
228     sub    r5d, 2
229     jg     .height_loop
230     REP_RET
231
232 cglobal x264_pixel_avg2_w16_sse2, 6,7
233     sub    r4, r2
234     lea    r6, [r4+r3]
235 .height_loop:
236     movdqu xmm0, [r2]
237     movdqu xmm2, [r2+r3]
238     movdqu xmm1, [r2+r4]
239     movdqu xmm3, [r2+r6]
240     pavgb  xmm0, xmm1
241     pavgb  xmm2, xmm3
242     movdqa [r0], xmm0
243     movdqa [r0+r1], xmm2
244     lea    r2, [r2+r3*2]
245     lea    r0, [r0+r1*2]
246     sub    r5d, 2
247     jg     .height_loop
248     REP_RET
249
250 cglobal x264_pixel_avg2_w20_sse2, 6,7
251     sub    r4, r2
252     lea    r6, [r4+r3]
253 .height_loop:
254     movdqu xmm0, [r2]
255     movdqu xmm2, [r2+r3]
256     movdqu xmm1, [r2+r4]
257     movdqu xmm3, [r2+r6]
258     movd   mm4,  [r2+16]
259     movd   mm5,  [r2+r3+16]
260     pavgb  xmm0, xmm1
261     pavgb  xmm2, xmm3
262     pavgb  mm4,  [r2+r4+16]
263     pavgb  mm5,  [r2+r6+16]
264     movdqa [r0], xmm0
265     movd   [r0+16], mm4
266     movdqa [r0+r1], xmm2
267     movd   [r0+r1+16], mm5
268     lea    r2, [r2+r3*2]
269     lea    r0, [r0+r1*2]
270     sub    r5d, 2
271     jg     .height_loop
272     REP_RET
273
274
275
276 ;=============================================================================
277 ; pixel copy
278 ;=============================================================================
279
280 %macro COPY4 3
281     %1  mm0, [r2]
282     %1  mm1, [r2+r3]
283     %1  mm2, [r2+r3*2]
284     %1  mm3, [r2+%3]
285     %1  [r0],      mm0
286     %1  [r0+r1],   mm1
287     %1  [r0+r1*2], mm2
288     %1  [r0+%2],   mm3
289 %endmacro
290
291 ;-----------------------------------------------------------------------------
292 ; void x264_mc_copy_w4_mmx( uint8_t *dst, int i_dst_stride,
293 ;                           uint8_t *src, int i_src_stride, int i_height )
294 ;-----------------------------------------------------------------------------
295 cglobal x264_mc_copy_w4_mmx, 4,6
296     cmp     r4m, dword 4
297     lea     r5, [r3*3]
298     lea     r4, [r1*3]
299     je .end
300     COPY4 movd, r4, r5
301     lea     r2, [r2+r3*4]
302     lea     r0, [r0+r1*4]
303 .end:
304     COPY4 movd, r4, r5
305     RET
306
307 cglobal x264_mc_copy_w8_mmx, 5,7
308     lea     r6, [r3*3]
309     lea     r5, [r1*3]
310 .height_loop:
311     COPY4 movq, r5, r6
312     lea     r2, [r2+r3*4]
313     lea     r0, [r0+r1*4]
314     sub     r4d, 4
315     jg      .height_loop
316     REP_RET
317
318 cglobal x264_mc_copy_w16_mmx, 5,7
319     lea     r6, [r3*3]
320     lea     r5, [r1*3]
321 .height_loop:
322     movq    mm0, [r2]
323     movq    mm1, [r2+8]
324     movq    mm2, [r2+r3]
325     movq    mm3, [r2+r3+8]
326     movq    mm4, [r2+r3*2]
327     movq    mm5, [r2+r3*2+8]
328     movq    mm6, [r2+r6]
329     movq    mm7, [r2+r6+8]
330     movq    [r0], mm0
331     movq    [r0+8], mm1
332     movq    [r0+r1], mm2
333     movq    [r0+r1+8], mm3
334     movq    [r0+r1*2], mm4
335     movq    [r0+r1*2+8], mm5
336     movq    [r0+r5], mm6
337     movq    [r0+r5+8], mm7
338     lea     r2, [r2+r3*4]
339     lea     r0, [r0+r1*4]
340     sub     r4d, 4
341     jg      .height_loop
342     REP_RET
343
344 %macro COPY_W16_SSE2 2
345 cglobal %1, 5,7
346     lea     r6, [r3*3]
347     lea     r5, [r1*3]
348 .height_loop:
349     %2      xmm0, [r2]
350     %2      xmm1, [r2+r3]
351     %2      xmm2, [r2+r3*2]
352     %2      xmm3, [r2+r6]
353     movdqa  [r0], xmm0
354     movdqa  [r0+r1], xmm1
355     movdqa  [r0+r1*2], xmm2
356     movdqa  [r0+r5], xmm3
357     lea     r2, [r2+r3*4]
358     lea     r0, [r0+r1*4]
359     sub     r4d, 4
360     jg      .height_loop
361     REP_RET
362 %endmacro
363
364 COPY_W16_SSE2 x264_mc_copy_w16_sse2, movdqu
365 COPY_W16_SSE2 x264_mc_copy_w16_aligned_sse2, movdqa
366
367
368
369 ;=============================================================================
370 ; weighted prediction
371 ;=============================================================================
372 ; implicit bipred only:
373 ; assumes log2_denom = 5, offset = 0, weight1 + weight2 = 64
374
375 %macro BIWEIGHT_4P_MMX 2
376     movd      mm0, %1
377     movd      mm1, %2
378     punpcklbw mm0, mm7
379     punpcklbw mm1, mm7
380     pmullw    mm0, mm4
381     pmullw    mm1, mm5
382     paddw     mm0, mm1
383     paddw     mm0, mm6
384     psraw     mm0, 6
385     pmaxsw    mm0, mm7
386     packuswb  mm0, mm0
387     movd      %1,  mm0
388 %endmacro
389
390 %macro BIWEIGHT_START_MMX 1
391 %ifidn r4m, r4d
392     movd    mm4, r4m
393     pshufw  mm4, mm4, 0   ; weight_dst
394 %else
395     pshufw  mm4, r4m, 0
396 %endif
397     picgetgot r4
398     movq    mm5, [pw_64 GLOBAL]
399     psubw   mm5, mm4      ; weight_src
400     movq    mm6, [pw_32 GLOBAL] ; rounding
401     pxor    mm7, mm7
402 %if %1
403 %ifidn r5m, r5d
404     %define t0 r5d
405 %else
406     %define t0 r4d
407     mov  r4d, r5m
408 %endif
409 %endif
410 .height_loop:
411 %endmacro
412
413 ;-----------------------------------------------------------------------------
414 ; int x264_pixel_avg_weight_w16_mmxext( uint8_t *dst, int, uint8_t *src, int, int i_weight, int )
415 ;-----------------------------------------------------------------------------
416 cglobal x264_pixel_avg_weight_w16_mmxext, 4,5
417     BIWEIGHT_START_MMX 1
418     BIWEIGHT_4P_MMX  [r0   ], [r2   ]
419     BIWEIGHT_4P_MMX  [r0+ 4], [r2+ 4]
420     BIWEIGHT_4P_MMX  [r0+ 8], [r2+ 8]
421     BIWEIGHT_4P_MMX  [r0+12], [r2+12]
422     add  r0, r1
423     add  r2, r3
424     dec  t0
425     jg   .height_loop
426     REP_RET
427
428 ;-----------------------------------------------------------------------------
429 ; int x264_pixel_avg_weight_w8_mmxext( uint8_t *, int, uint8_t *, int, int, int )
430 ;-----------------------------------------------------------------------------
431 cglobal x264_pixel_avg_weight_w8_mmxext, 4,5
432     BIWEIGHT_START_MMX 1
433     BIWEIGHT_4P_MMX  [r0  ], [r2  ]
434     BIWEIGHT_4P_MMX  [r0+4], [r2+4]
435     add  r0, r1
436     add  r2, r3
437     dec  t0
438     jg   .height_loop
439     REP_RET
440
441 ;-----------------------------------------------------------------------------
442 ; int x264_pixel_avg_weight_4x4_mmxext( uint8_t *, int, uint8_t *, int, int )
443 ;-----------------------------------------------------------------------------
444 cglobal x264_pixel_avg_weight_4x4_mmxext, 4,4,1
445     BIWEIGHT_START_MMX 0
446     BIWEIGHT_4P_MMX  [r0     ], [r2     ]
447     BIWEIGHT_4P_MMX  [r0+r1  ], [r2+r3  ]
448     BIWEIGHT_4P_MMX  [r0+r1*2], [r2+r3*2]
449     add  r0, r1
450     add  r2, r3
451     BIWEIGHT_4P_MMX  [r0+r1*2], [r2+r3*2]
452     RET
453
454
455
456 ;=============================================================================
457 ; prefetch
458 ;=============================================================================
459 ; FIXME assumes 64 byte cachelines
460
461 ;-----------------------------------------------------------------------------
462 ; void x264_prefetch_fenc_mmxext( uint8_t *pix_y, int stride_y, 
463 ;                                 uint8_t *pix_uv, int stride_uv, int mb_x )
464 ;-----------------------------------------------------------------------------
465 %ifdef ARCH_X86_64
466 cglobal x264_prefetch_fenc_mmxext, 5,5
467     mov    eax, r4d
468     and    eax, 3
469     imul   eax, r1d
470     lea    r0,  [r0+rax*4+64]
471     prefetcht0  [r0]
472     prefetcht0  [r0+r1]
473     lea    r0,  [r0+r1*2]
474     prefetcht0  [r0]
475     prefetcht0  [r0+r1]
476
477     and    r4d, 6
478     imul   r4d, r3d
479     lea    r2,  [r2+r4+64]
480     prefetcht0  [r2]
481     prefetcht0  [r2+r3]
482     ret
483
484 %else
485 cglobal x264_prefetch_fenc_mmxext
486     mov    r2, [esp+20]
487     mov    r1, [esp+8]
488     mov    r0, [esp+4]
489     and    r2, 3
490     imul   r2, r1
491     lea    r0, [r0+r2*4+64]
492     prefetcht0 [r0]
493     prefetcht0 [r0+r1]
494     lea    r0, [r0+r1*2]
495     prefetcht0 [r0]
496     prefetcht0 [r0+r1]
497
498     mov    r2, [esp+20]
499     mov    r1, [esp+16]
500     mov    r0, [esp+12]
501     and    r2, 6
502     imul   r2, r1
503     lea    r0, [r0+r2+64]
504     prefetcht0 [r0]
505     prefetcht0 [r0+r1]
506     ret
507 %endif ; ARCH_X86_64
508
509 ;-----------------------------------------------------------------------------
510 ; void x264_prefetch_ref_mmxext( uint8_t *pix, int stride, int parity )
511 ;-----------------------------------------------------------------------------
512 cglobal x264_prefetch_ref_mmxext, 3,3
513     dec    r2d
514     and    r2d, r1d
515     lea    r0,  [r0+r2*8+64]
516     lea    r2,  [r1*3]
517     prefetcht0  [r0]
518     prefetcht0  [r0+r1]
519     prefetcht0  [r0+r1*2]
520     prefetcht0  [r0+r2]
521     lea    r0,  [r0+r1*4]
522     prefetcht0  [r0]
523     prefetcht0  [r0+r1]
524     prefetcht0  [r0+r1*2]
525     prefetcht0  [r0+r2]
526     ret
527
528
529
530 ;=============================================================================
531 ; chroma MC
532 ;=============================================================================
533
534 ;-----------------------------------------------------------------------------
535 ; void x264_mc_chroma_mmxext( uint8_t *dst, int i_dst_stride,
536 ;                             uint8_t *src, int i_src_stride,
537 ;                             int dx, int dy,
538 ;                             int i_width, int i_height )
539 ;-----------------------------------------------------------------------------
540 cglobal x264_mc_chroma_mmxext, 0,6,1
541 %ifdef ARCH_X86_64
542     %define t0   r10d
543 %else
544     %define t0   r1d
545 %endif
546     movifnidn r2d, r2m
547     movifnidn r3d, r3m
548     movifnidn r4d, r4m
549     movifnidn r5d, r5m
550     mov     eax, r5d
551     mov     t0,  r4d
552     sar     eax, 3
553     sar     t0,  3
554     imul    eax, r3d
555     pxor    mm3, mm3
556     add     eax, t0
557     movsxdifnidn rax, eax
558     add     r2,  rax            ; src += (dx>>3) + (dy>>3) * src_stride
559     and     r4d, 7              ; dx &= 7
560     je      .mc1d
561     and     r5d, 7              ; dy &= 7
562     je      .mc1d
563
564     movd    mm0, r4d
565     movd    mm1, r5d
566     pshufw  mm5, mm0, 0         ; mm5 = dx
567     pshufw  mm6, mm1, 0         ; mm6 = dy
568
569     movq    mm4, [pw_8 GLOBAL]
570     movq    mm0, mm4
571     psubw   mm4, mm5            ; mm4 = 8-dx
572     psubw   mm0, mm6            ; mm0 = 8-dy
573
574     movq    mm7, mm5
575     pmullw  mm5, mm0            ; mm5 = dx*(8-dy) =     cB
576     pmullw  mm7, mm6            ; mm7 = dx*dy =         cD
577     pmullw  mm6, mm4            ; mm6 = (8-dx)*dy =     cC
578     pmullw  mm4, mm0            ; mm4 = (8-dx)*(8-dy) = cA
579
580     mov     r4d, r7m
581 %ifdef ARCH_X86_64
582     mov     r10, r0
583     mov     r11, r2
584 %else
585     mov     r0,  r0m
586     mov     r1,  r1m
587     mov     r5,  r2
588 %endif
589
590 ALIGN 4
591 .height_loop:
592
593     movd    mm1, [r2+r3]
594     movd    mm0, [r2]
595     punpcklbw mm1, mm3          ; 00 px1 | 00 px2 | 00 px3 | 00 px4
596     punpcklbw mm0, mm3
597     pmullw  mm1, mm6            ; 2nd line * cC
598     pmullw  mm0, mm4            ; 1st line * cA
599     paddw   mm0, mm1            ; mm0 <- result
600
601     movd    mm2, [r2+1]
602     movd    mm1, [r2+r3+1]
603     punpcklbw mm2, mm3
604     punpcklbw mm1, mm3
605
606     paddw   mm0, [pw_32 GLOBAL]
607
608     pmullw  mm2, mm5            ; line * cB
609     pmullw  mm1, mm7            ; line * cD
610     paddw   mm0, mm2
611     paddw   mm0, mm1
612     psrlw   mm0, 6
613
614     packuswb mm0, mm3           ; 00 00 00 00 px1 px2 px3 px4
615     movd    [r0], mm0
616
617     add     r2,  r3
618     add     r0,  r1             ; i_dst_stride
619     dec     r4d
620     jnz     .height_loop
621
622     sub dword r6m, 8
623     jnz     .finish             ; width != 8 so assume 4
624
625 %ifdef ARCH_X86_64
626     lea     r0, [r10+4]         ; dst
627     lea     r2, [r11+4]         ; src
628 %else
629     mov     r0,  r0m
630     lea     r2, [r5+4]
631     add     r0,  4
632 %endif
633     mov     r4d, r7m            ; i_height
634     jmp     .height_loop
635
636 ALIGN 4
637 .mc1d:
638     mov       eax, r4d
639     or        eax, r5d
640     and       eax, 7
641     cmp       r4d, 0
642     mov       r5d, 1
643     cmove     r5,  r3           ; pel_offset = dx ? 1 : src_stride
644     movd      mm6, eax
645     movq      mm5, [pw_8 GLOBAL]
646     pshufw    mm6, mm6, 0
647     movq      mm7, [pw_4 GLOBAL]
648     psubw     mm5, mm6
649
650     cmp dword r6m, 8
651     movifnidn r0d, r0m
652     movifnidn r1d, r1m
653     mov       r4d, r7m
654     je .height_loop1_w8
655
656 ALIGN 4
657 .height_loop1_w4:
658     movd      mm0, [r2+r5]
659     movd      mm1, [r2]
660     punpcklbw mm0, mm3
661     punpcklbw mm1, mm3
662     pmullw    mm0, mm6
663     pmullw    mm1, mm5
664     paddw     mm0, mm7
665     paddw     mm0, mm1
666     psrlw     mm0, 3
667     packuswb  mm0, mm3
668     movd     [r0], mm0
669     add       r2,  r3
670     add       r0,  r1
671     dec       r4d
672     jnz .height_loop1_w4
673 .finish:
674     REP_RET
675
676 ALIGN 4
677 .height_loop1_w8:
678     movq      mm0, [r2+r5]
679     movq      mm1, [r2]
680     movq      mm2, mm0
681     movq      mm4, mm1
682     punpcklbw mm0, mm3
683     punpcklbw mm1, mm3
684     punpckhbw mm2, mm3
685     punpckhbw mm4, mm3
686     pmullw    mm0, mm6
687     pmullw    mm1, mm5
688     pmullw    mm2, mm6
689     pmullw    mm4, mm5
690     paddw     mm0, mm7
691     paddw     mm2, mm7
692     paddw     mm0, mm1
693     paddw     mm2, mm4
694     psrlw     mm0, 3
695     psrlw     mm2, 3
696     packuswb  mm0, mm2
697     movq     [r0], mm0
698     add       r2,  r3
699     add       r0,  r1
700     dec       r4d
701     jnz .height_loop1_w8
702     REP_RET
703