Make libvpx Chromium build friendly
[profile/ivi/libvpx.git] / vp8 / common / x86 / subpixel_mmx.asm
1 ;
2 ;  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3 ;
4 ;  Use of this source code is governed by a BSD-style license
5 ;  that can be found in the LICENSE file in the root of the source
6 ;  tree. An additional intellectual property rights grant can be found
7 ;  in the file PATENTS.  All contributing project authors may
8 ;  be found in the AUTHORS file in the root of the source tree.
9 ;
10
11
12 %include "vpx_ports/x86_abi_support.asm"
13 extern sym(vp8_bilinear_filters_x86_8)
14
15
16 %define BLOCK_HEIGHT_WIDTH 4
17 %define vp8_filter_weight 128
18 %define VP8_FILTER_SHIFT  7
19
20
21 ;void vp8_filter_block1d_h6_mmx
22 ;(
23 ;    unsigned char   *src_ptr,
24 ;    unsigned short  *output_ptr,
25 ;    unsigned int    src_pixels_per_line,
26 ;    unsigned int    pixel_step,
27 ;    unsigned int    output_height,
28 ;    unsigned int    output_width,
29 ;    short           * vp8_filter
30 ;)
31 global sym(vp8_filter_block1d_h6_mmx) PRIVATE
32 sym(vp8_filter_block1d_h6_mmx):
33     push        rbp
34     mov         rbp, rsp
35     SHADOW_ARGS_TO_STACK 7
36     GET_GOT     rbx
37     push        rsi
38     push        rdi
39     ; end prolog
40
41         mov         rdx,    arg(6) ;vp8_filter
42
43         movq        mm1,    [rdx + 16]             ; do both the negative taps first!!!
44         movq        mm2,    [rdx + 32]         ;
45         movq        mm6,    [rdx + 48]        ;
46         movq        mm7,    [rdx + 64]        ;
47
48         mov         rdi,    arg(1) ;output_ptr
49         mov         rsi,    arg(0) ;src_ptr
50         movsxd      rcx,    dword ptr arg(4) ;output_height
51         movsxd      rax,    dword ptr arg(5) ;output_width      ; destination pitch?
52         pxor        mm0,    mm0              ; mm0 = 00000000
53
54 .nextrow:
55         movq        mm3,    [rsi-2]          ; mm3 = p-2..p5
56         movq        mm4,    mm3              ; mm4 = p-2..p5
57         psrlq       mm3,    8                ; mm3 = p-1..p5
58         punpcklbw   mm3,    mm0              ; mm3 = p-1..p2
59         pmullw      mm3,    mm1              ; mm3 *= kernel 1 modifiers.
60
61         movq        mm5,    mm4              ; mm5 = p-2..p5
62         punpckhbw   mm4,    mm0              ; mm5 = p2..p5
63         pmullw      mm4,    mm7              ; mm5 *= kernel 4 modifiers
64         paddsw      mm3,    mm4              ; mm3 += mm5
65
66         movq        mm4,    mm5              ; mm4 = p-2..p5;
67         psrlq       mm5,    16               ; mm5 = p0..p5;
68         punpcklbw   mm5,    mm0              ; mm5 = p0..p3
69         pmullw      mm5,    mm2              ; mm5 *= kernel 2 modifiers
70         paddsw      mm3,    mm5              ; mm3 += mm5
71
72         movq        mm5,    mm4              ; mm5 = p-2..p5
73         psrlq       mm4,    24               ; mm4 = p1..p5
74         punpcklbw   mm4,    mm0              ; mm4 = p1..p4
75         pmullw      mm4,    mm6              ; mm5 *= kernel 3 modifiers
76         paddsw      mm3,    mm4              ; mm3 += mm5
77
78         ; do outer positive taps
79         movd        mm4,    [rsi+3]
80         punpcklbw   mm4,    mm0              ; mm5 = p3..p6
81         pmullw      mm4,    [rdx+80]         ; mm5 *= kernel 0 modifiers
82         paddsw      mm3,    mm4              ; mm3 += mm5
83
84         punpcklbw   mm5,    mm0              ; mm5 = p-2..p1
85         pmullw      mm5,    [rdx]            ; mm5 *= kernel 5 modifiers
86         paddsw      mm3,    mm5              ; mm3 += mm5
87
88         paddsw      mm3,    [GLOBAL(rd)]              ; mm3 += round value
89         psraw       mm3,    VP8_FILTER_SHIFT     ; mm3 /= 128
90         packuswb    mm3,    mm0              ; pack and unpack to saturate
91         punpcklbw   mm3,    mm0              ;
92
93         movq        [rdi],  mm3              ; store the results in the destination
94
95 %if ABI_IS_32BIT
96         add         rsi,    dword ptr arg(2) ;src_pixels_per_line ; next line
97         add         rdi,    rax;
98 %else
99         movsxd      r8,     dword ptr arg(2) ;src_pixels_per_line
100         add         rdi,    rax;
101
102         add         rsi,    r8               ; next line
103 %endif
104
105         dec         rcx                      ; decrement count
106         jnz         .nextrow                 ; next row
107
108     ; begin epilog
109     pop rdi
110     pop rsi
111     RESTORE_GOT
112     UNSHADOW_ARGS
113     pop         rbp
114     ret
115
116
117 ;void vp8_filter_block1dc_v6_mmx
118 ;(
119 ;   short *src_ptr,
120 ;   unsigned char *output_ptr,
121 ;    int output_pitch,
122 ;   unsigned int pixels_per_line,
123 ;   unsigned int pixel_step,
124 ;   unsigned int output_height,
125 ;   unsigned int output_width,
126 ;   short * vp8_filter
127 ;)
128 global sym(vp8_filter_block1dc_v6_mmx) PRIVATE
129 sym(vp8_filter_block1dc_v6_mmx):
130     push        rbp
131     mov         rbp, rsp
132     SHADOW_ARGS_TO_STACK 8
133     GET_GOT     rbx
134     push        rsi
135     push        rdi
136     ; end prolog
137
138         movq      mm5, [GLOBAL(rd)]
139         push        rbx
140         mov         rbx, arg(7) ;vp8_filter
141         movq      mm1, [rbx + 16]             ; do both the negative taps first!!!
142         movq      mm2, [rbx + 32]         ;
143         movq      mm6, [rbx + 48]        ;
144         movq      mm7, [rbx + 64]        ;
145
146         movsxd      rdx, dword ptr arg(3) ;pixels_per_line
147         mov         rdi, arg(1) ;output_ptr
148         mov         rsi, arg(0) ;src_ptr
149         sub         rsi, rdx
150         sub         rsi, rdx
151         movsxd      rcx, DWORD PTR arg(5) ;output_height
152         movsxd      rax, DWORD PTR arg(2) ;output_pitch      ; destination pitch?
153         pxor        mm0, mm0              ; mm0 = 00000000
154
155
156 .nextrow_cv:
157         movq        mm3, [rsi+rdx]        ; mm3 = p0..p8  = row -1
158         pmullw      mm3, mm1              ; mm3 *= kernel 1 modifiers.
159
160
161         movq        mm4, [rsi + 4*rdx]      ; mm4 = p0..p3  = row 2
162         pmullw      mm4, mm7              ; mm4 *= kernel 4 modifiers.
163         paddsw      mm3, mm4              ; mm3 += mm4
164
165         movq        mm4, [rsi + 2*rdx]           ; mm4 = p0..p3  = row 0
166         pmullw      mm4, mm2              ; mm4 *= kernel 2 modifiers.
167         paddsw      mm3, mm4              ; mm3 += mm4
168
169         movq        mm4, [rsi]            ; mm4 = p0..p3  = row -2
170         pmullw      mm4, [rbx]            ; mm4 *= kernel 0 modifiers.
171         paddsw      mm3, mm4              ; mm3 += mm4
172
173
174         add         rsi, rdx              ; move source forward 1 line to avoid 3 * pitch
175         movq        mm4, [rsi + 2*rdx]     ; mm4 = p0..p3  = row 1
176         pmullw      mm4, mm6              ; mm4 *= kernel 3 modifiers.
177         paddsw      mm3, mm4              ; mm3 += mm4
178
179         movq        mm4, [rsi + 4*rdx]    ; mm4 = p0..p3  = row 3
180         pmullw      mm4, [rbx +80]        ; mm4 *= kernel 3 modifiers.
181         paddsw      mm3, mm4              ; mm3 += mm4
182
183
184         paddsw      mm3, mm5               ; mm3 += round value
185         psraw       mm3, VP8_FILTER_SHIFT     ; mm3 /= 128
186         packuswb    mm3, mm0              ; pack and saturate
187
188         movd        [rdi],mm3             ; store the results in the destination
189         ; the subsequent iterations repeat 3 out of 4 of these reads.  Since the
190         ; recon block should be in cache this shouldn't cost much.  Its obviously
191         ; avoidable!!!.
192         lea         rdi,  [rdi+rax] ;
193         dec         rcx                   ; decrement count
194         jnz         .nextrow_cv           ; next row
195
196         pop         rbx
197
198     ; begin epilog
199     pop rdi
200     pop rsi
201     RESTORE_GOT
202     UNSHADOW_ARGS
203     pop         rbp
204     ret
205
206
207 ;void bilinear_predict8x8_mmx
208 ;(
209 ;    unsigned char  *src_ptr,
210 ;    int   src_pixels_per_line,
211 ;    int  xoffset,
212 ;    int  yoffset,
213 ;   unsigned char *dst_ptr,
214 ;    int dst_pitch
215 ;)
216 global sym(vp8_bilinear_predict8x8_mmx) PRIVATE
217 sym(vp8_bilinear_predict8x8_mmx):
218     push        rbp
219     mov         rbp, rsp
220     SHADOW_ARGS_TO_STACK 6
221     GET_GOT     rbx
222     push        rsi
223     push        rdi
224     ; end prolog
225
226     ;const short *HFilter = vp8_bilinear_filters_x86_8[xoffset];
227     ;const short *VFilter = vp8_bilinear_filters_x86_8[yoffset];
228
229         movsxd      rax,        dword ptr arg(2) ;xoffset
230         mov         rdi,        arg(4) ;dst_ptr           ;
231
232         shl         rax,        5 ; offset * 32
233         lea         rcx,        [GLOBAL(sym(vp8_bilinear_filters_x86_8))]
234
235         add         rax,        rcx ; HFilter
236         mov         rsi,        arg(0) ;src_ptr              ;
237
238         movsxd      rdx,        dword ptr arg(5) ;dst_pitch
239         movq        mm1,        [rax]               ;
240
241         movq        mm2,        [rax+16]            ;
242         movsxd      rax,        dword ptr arg(3) ;yoffset
243
244         pxor        mm0,        mm0                 ;
245
246         shl         rax,        5 ; offset*32
247         add         rax,        rcx ; VFilter
248
249         lea         rcx,        [rdi+rdx*8]          ;
250         movsxd      rdx,        dword ptr arg(1) ;src_pixels_per_line    ;
251
252
253
254         ; get the first horizontal line done       ;
255         movq        mm3,        [rsi]               ; xx 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14
256         movq        mm4,        mm3                 ; make a copy of current line
257
258         punpcklbw   mm3,        mm0                 ; xx 00 01 02 03 04 05 06
259         punpckhbw   mm4,        mm0                 ;
260
261         pmullw      mm3,        mm1                 ;
262         pmullw      mm4,        mm1                 ;
263
264         movq        mm5,        [rsi+1]             ;
265         movq        mm6,        mm5                 ;
266
267         punpcklbw   mm5,        mm0                 ;
268         punpckhbw   mm6,        mm0                 ;
269
270         pmullw      mm5,        mm2                 ;
271         pmullw      mm6,        mm2                 ;
272
273         paddw       mm3,        mm5                 ;
274         paddw       mm4,        mm6                 ;
275
276         paddw       mm3,        [GLOBAL(rd)]                 ; xmm3 += round value
277         psraw       mm3,        VP8_FILTER_SHIFT        ; xmm3 /= 128
278
279         paddw       mm4,        [GLOBAL(rd)]                 ;
280         psraw       mm4,        VP8_FILTER_SHIFT        ;
281
282         movq        mm7,        mm3                 ;
283         packuswb    mm7,        mm4                 ;
284
285         add         rsi,        rdx                 ; next line
286 .next_row_8x8:
287         movq        mm3,        [rsi]               ; xx 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14
288         movq        mm4,        mm3                 ; make a copy of current line
289
290         punpcklbw   mm3,        mm0                 ; xx 00 01 02 03 04 05 06
291         punpckhbw   mm4,        mm0                 ;
292
293         pmullw      mm3,        mm1                 ;
294         pmullw      mm4,        mm1                 ;
295
296         movq        mm5,        [rsi+1]             ;
297         movq        mm6,        mm5                 ;
298
299         punpcklbw   mm5,        mm0                 ;
300         punpckhbw   mm6,        mm0                 ;
301
302         pmullw      mm5,        mm2                 ;
303         pmullw      mm6,        mm2                 ;
304
305         paddw       mm3,        mm5                 ;
306         paddw       mm4,        mm6                 ;
307
308         movq        mm5,        mm7                 ;
309         movq        mm6,        mm7                 ;
310
311         punpcklbw   mm5,        mm0                 ;
312         punpckhbw   mm6,        mm0
313
314         pmullw      mm5,        [rax]               ;
315         pmullw      mm6,        [rax]               ;
316
317         paddw       mm3,        [GLOBAL(rd)]                 ; xmm3 += round value
318         psraw       mm3,        VP8_FILTER_SHIFT        ; xmm3 /= 128
319
320         paddw       mm4,        [GLOBAL(rd)]                 ;
321         psraw       mm4,        VP8_FILTER_SHIFT        ;
322
323         movq        mm7,        mm3                 ;
324         packuswb    mm7,        mm4                 ;
325
326
327         pmullw      mm3,        [rax+16]            ;
328         pmullw      mm4,        [rax+16]            ;
329
330         paddw       mm3,        mm5                 ;
331         paddw       mm4,        mm6                 ;
332
333
334         paddw       mm3,        [GLOBAL(rd)]                 ; xmm3 += round value
335         psraw       mm3,        VP8_FILTER_SHIFT        ; xmm3 /= 128
336
337         paddw       mm4,        [GLOBAL(rd)]                 ;
338         psraw       mm4,        VP8_FILTER_SHIFT        ;
339
340         packuswb    mm3,        mm4
341
342         movq        [rdi],      mm3                 ; store the results in the destination
343
344 %if ABI_IS_32BIT
345         add         rsi,        rdx                 ; next line
346         add         rdi,        dword ptr arg(5) ;dst_pitch                   ;
347 %else
348         movsxd      r8,         dword ptr arg(5) ;dst_pitch
349         add         rsi,        rdx                 ; next line
350         add         rdi,        r8                  ;dst_pitch
351 %endif
352         cmp         rdi,        rcx                 ;
353         jne         .next_row_8x8
354
355     ; begin epilog
356     pop rdi
357     pop rsi
358     RESTORE_GOT
359     UNSHADOW_ARGS
360     pop         rbp
361     ret
362
363
364 ;void bilinear_predict8x4_mmx
365 ;(
366 ;    unsigned char  *src_ptr,
367 ;    int   src_pixels_per_line,
368 ;    int  xoffset,
369 ;    int  yoffset,
370 ;    unsigned char *dst_ptr,
371 ;    int dst_pitch
372 ;)
373 global sym(vp8_bilinear_predict8x4_mmx) PRIVATE
374 sym(vp8_bilinear_predict8x4_mmx):
375     push        rbp
376     mov         rbp, rsp
377     SHADOW_ARGS_TO_STACK 6
378     GET_GOT     rbx
379     push        rsi
380     push        rdi
381     ; end prolog
382
383     ;const short *HFilter = vp8_bilinear_filters_x86_8[xoffset];
384     ;const short *VFilter = vp8_bilinear_filters_x86_8[yoffset];
385
386         movsxd      rax,        dword ptr arg(2) ;xoffset
387         mov         rdi,        arg(4) ;dst_ptr           ;
388
389         lea         rcx,        [GLOBAL(sym(vp8_bilinear_filters_x86_8))]
390         shl         rax,        5
391
392         mov         rsi,        arg(0) ;src_ptr              ;
393         add         rax,        rcx
394
395         movsxd      rdx,        dword ptr arg(5) ;dst_pitch
396         movq        mm1,        [rax]               ;
397
398         movq        mm2,        [rax+16]            ;
399         movsxd      rax,        dword ptr arg(3) ;yoffset
400
401         pxor        mm0,        mm0                 ;
402         shl         rax,        5
403
404         add         rax,        rcx
405         lea         rcx,        [rdi+rdx*4]          ;
406
407         movsxd      rdx,        dword ptr arg(1) ;src_pixels_per_line    ;
408
409         ; get the first horizontal line done       ;
410         movq        mm3,        [rsi]               ; xx 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14
411         movq        mm4,        mm3                 ; make a copy of current line
412
413         punpcklbw   mm3,        mm0                 ; xx 00 01 02 03 04 05 06
414         punpckhbw   mm4,        mm0                 ;
415
416         pmullw      mm3,        mm1                 ;
417         pmullw      mm4,        mm1                 ;
418
419         movq        mm5,        [rsi+1]             ;
420         movq        mm6,        mm5                 ;
421
422         punpcklbw   mm5,        mm0                 ;
423         punpckhbw   mm6,        mm0                 ;
424
425         pmullw      mm5,        mm2                 ;
426         pmullw      mm6,        mm2                 ;
427
428         paddw       mm3,        mm5                 ;
429         paddw       mm4,        mm6                 ;
430
431         paddw       mm3,        [GLOBAL(rd)]                 ; xmm3 += round value
432         psraw       mm3,        VP8_FILTER_SHIFT        ; xmm3 /= 128
433
434         paddw       mm4,        [GLOBAL(rd)]                 ;
435         psraw       mm4,        VP8_FILTER_SHIFT        ;
436
437         movq        mm7,        mm3                 ;
438         packuswb    mm7,        mm4                 ;
439
440         add         rsi,        rdx                 ; next line
441 .next_row_8x4:
442         movq        mm3,        [rsi]               ; xx 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14
443         movq        mm4,        mm3                 ; make a copy of current line
444
445         punpcklbw   mm3,        mm0                 ; xx 00 01 02 03 04 05 06
446         punpckhbw   mm4,        mm0                 ;
447
448         pmullw      mm3,        mm1                 ;
449         pmullw      mm4,        mm1                 ;
450
451         movq        mm5,        [rsi+1]             ;
452         movq        mm6,        mm5                 ;
453
454         punpcklbw   mm5,        mm0                 ;
455         punpckhbw   mm6,        mm0                 ;
456
457         pmullw      mm5,        mm2                 ;
458         pmullw      mm6,        mm2                 ;
459
460         paddw       mm3,        mm5                 ;
461         paddw       mm4,        mm6                 ;
462
463         movq        mm5,        mm7                 ;
464         movq        mm6,        mm7                 ;
465
466         punpcklbw   mm5,        mm0                 ;
467         punpckhbw   mm6,        mm0
468
469         pmullw      mm5,        [rax]               ;
470         pmullw      mm6,        [rax]               ;
471
472         paddw       mm3,        [GLOBAL(rd)]                 ; xmm3 += round value
473         psraw       mm3,        VP8_FILTER_SHIFT        ; xmm3 /= 128
474
475         paddw       mm4,        [GLOBAL(rd)]                 ;
476         psraw       mm4,        VP8_FILTER_SHIFT        ;
477
478         movq        mm7,        mm3                 ;
479         packuswb    mm7,        mm4                 ;
480
481
482         pmullw      mm3,        [rax+16]            ;
483         pmullw      mm4,        [rax+16]            ;
484
485         paddw       mm3,        mm5                 ;
486         paddw       mm4,        mm6                 ;
487
488
489         paddw       mm3,        [GLOBAL(rd)]                 ; xmm3 += round value
490         psraw       mm3,        VP8_FILTER_SHIFT        ; xmm3 /= 128
491
492         paddw       mm4,        [GLOBAL(rd)]                 ;
493         psraw       mm4,        VP8_FILTER_SHIFT        ;
494
495         packuswb    mm3,        mm4
496
497         movq        [rdi],      mm3                 ; store the results in the destination
498
499 %if ABI_IS_32BIT
500         add         rsi,        rdx                 ; next line
501         add         rdi,        dword ptr arg(5) ;dst_pitch                   ;
502 %else
503         movsxd      r8,         dword ptr arg(5) ;dst_pitch
504         add         rsi,        rdx                 ; next line
505         add         rdi,        r8
506 %endif
507         cmp         rdi,        rcx                 ;
508         jne         .next_row_8x4
509
510     ; begin epilog
511     pop rdi
512     pop rsi
513     RESTORE_GOT
514     UNSHADOW_ARGS
515     pop         rbp
516     ret
517
518
519 ;void bilinear_predict4x4_mmx
520 ;(
521 ;    unsigned char  *src_ptr,
522 ;    int   src_pixels_per_line,
523 ;    int  xoffset,
524 ;    int  yoffset,
525 ;    unsigned char *dst_ptr,
526 ;    int dst_pitch
527 ;)
528 global sym(vp8_bilinear_predict4x4_mmx) PRIVATE
529 sym(vp8_bilinear_predict4x4_mmx):
530     push        rbp
531     mov         rbp, rsp
532     SHADOW_ARGS_TO_STACK 6
533     GET_GOT     rbx
534     push        rsi
535     push        rdi
536     ; end prolog
537
538     ;const short *HFilter = vp8_bilinear_filters_x86_8[xoffset];
539     ;const short *VFilter = vp8_bilinear_filters_x86_8[yoffset];
540
541         movsxd      rax,        dword ptr arg(2) ;xoffset
542         mov         rdi,        arg(4) ;dst_ptr           ;
543
544         lea         rcx,        [GLOBAL(sym(vp8_bilinear_filters_x86_8))]
545         shl         rax,        5
546
547         add         rax,        rcx ; HFilter
548         mov         rsi,        arg(0) ;src_ptr              ;
549
550         movsxd      rdx,        dword ptr arg(5) ;ldst_pitch
551         movq        mm1,        [rax]               ;
552
553         movq        mm2,        [rax+16]            ;
554         movsxd      rax,        dword ptr arg(3) ;yoffset
555
556         pxor        mm0,        mm0                 ;
557         shl         rax,        5
558
559         add         rax,        rcx
560         lea         rcx,        [rdi+rdx*4]          ;
561
562         movsxd      rdx,        dword ptr arg(1) ;src_pixels_per_line    ;
563
564         ; get the first horizontal line done       ;
565         movd        mm3,        [rsi]               ; xx 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14
566         punpcklbw   mm3,        mm0                 ; xx 00 01 02 03 04 05 06
567
568         pmullw      mm3,        mm1                 ;
569         movd        mm5,        [rsi+1]             ;
570
571         punpcklbw   mm5,        mm0                 ;
572         pmullw      mm5,        mm2                 ;
573
574         paddw       mm3,        mm5                 ;
575         paddw       mm3,        [GLOBAL(rd)]                 ; xmm3 += round value
576
577         psraw       mm3,        VP8_FILTER_SHIFT        ; xmm3 /= 128
578
579         movq        mm7,        mm3                 ;
580         packuswb    mm7,        mm0                 ;
581
582         add         rsi,        rdx                 ; next line
583 .next_row_4x4:
584         movd        mm3,        [rsi]               ; xx 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14
585         punpcklbw   mm3,        mm0                 ; xx 00 01 02 03 04 05 06
586
587         pmullw      mm3,        mm1                 ;
588         movd        mm5,        [rsi+1]             ;
589
590         punpcklbw   mm5,        mm0                 ;
591         pmullw      mm5,        mm2                 ;
592
593         paddw       mm3,        mm5                 ;
594
595         movq        mm5,        mm7                 ;
596         punpcklbw   mm5,        mm0                 ;
597
598         pmullw      mm5,        [rax]               ;
599         paddw       mm3,        [GLOBAL(rd)]                 ; xmm3 += round value
600
601         psraw       mm3,        VP8_FILTER_SHIFT        ; xmm3 /= 128
602         movq        mm7,        mm3                 ;
603
604         packuswb    mm7,        mm0                 ;
605
606         pmullw      mm3,        [rax+16]            ;
607         paddw       mm3,        mm5                 ;
608
609
610         paddw       mm3,        [GLOBAL(rd)]                 ; xmm3 += round value
611         psraw       mm3,        VP8_FILTER_SHIFT        ; xmm3 /= 128
612
613         packuswb    mm3,        mm0
614         movd        [rdi],      mm3                 ; store the results in the destination
615
616 %if ABI_IS_32BIT
617         add         rsi,        rdx                 ; next line
618         add         rdi,        dword ptr arg(5) ;dst_pitch                   ;
619 %else
620         movsxd      r8,         dword ptr arg(5) ;dst_pitch                   ;
621         add         rsi,        rdx                 ; next line
622         add         rdi,        r8
623 %endif
624
625         cmp         rdi,        rcx                 ;
626         jne         .next_row_4x4
627
628     ; begin epilog
629     pop rdi
630     pop rsi
631     RESTORE_GOT
632     UNSHADOW_ARGS
633     pop         rbp
634     ret
635
636
637
638 SECTION_RODATA
639 align 16
640 rd:
641     times 4 dw 0x40
642
643 align 16
644 global HIDDEN_DATA(sym(vp8_six_tap_mmx))
645 sym(vp8_six_tap_mmx):
646     times 8 dw 0
647     times 8 dw 0
648     times 8 dw 128
649     times 8 dw 0
650     times 8 dw 0
651     times 8 dw 0
652
653     times 8 dw 0
654     times 8 dw -6
655     times 8 dw 123
656     times 8 dw 12
657     times 8 dw -1
658     times 8 dw 0
659
660     times 8 dw 2
661     times 8 dw -11
662     times 8 dw 108
663     times 8 dw 36
664     times 8 dw -8
665     times 8 dw 1
666
667     times 8 dw 0
668     times 8 dw -9
669     times 8 dw 93
670     times 8 dw 50
671     times 8 dw -6
672     times 8 dw 0
673
674     times 8 dw 3
675     times 8 dw -16
676     times 8 dw 77
677     times 8 dw 77
678     times 8 dw -16
679     times 8 dw 3
680
681     times 8 dw 0
682     times 8 dw -6
683     times 8 dw 50
684     times 8 dw 93
685     times 8 dw -9
686     times 8 dw 0
687
688     times 8 dw 1
689     times 8 dw -8
690     times 8 dw 36
691     times 8 dw 108
692     times 8 dw -11
693     times 8 dw 2
694
695     times 8 dw 0
696     times 8 dw -1
697     times 8 dw 12
698     times 8 dw 123
699     times 8 dw -6
700     times 8 dw 0
701
702