Increase max resync size, fix demuxing of dvgrab-2009.03.28_19-07-22.m2t
[libav.git] / libavcodec / x86 / dsputil_yasm.asm
CommitLineData
7ca7d5fa
LM
1;******************************************************************************
2;* MMX optimized DSP utils
3;* Copyright (c) 2008 Loren Merritt
4;*
5;* This file is part of FFmpeg.
6;*
7;* FFmpeg is free software; you can redistribute it and/or
8;* modify it under the terms of the GNU Lesser General Public
9;* License as published by the Free Software Foundation; either
10;* version 2.1 of the License, or (at your option) any later version.
11;*
12;* FFmpeg is distributed in the hope that it will be useful,
13;* but WITHOUT ANY WARRANTY; without even the implied warranty of
14;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15;* Lesser General Public License for more details.
16;*
17;* You should have received a copy of the GNU Lesser General Public
18;* License along with FFmpeg; if not, write to the Free Software
19;* 51, Inc., Foundation Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20;******************************************************************************
21
22%include "x86inc.asm"
23
24section .text align=16
25
26%macro PSWAPD_SSE 2
27 pshufw %1, %2, 0x4e
28%endmacro
29%macro PSWAPD_3DN1 2
30 movq %1, %2
31 psrlq %1, 32
32 punpckldq %1, %2
33%endmacro
34
35%macro FLOAT_TO_INT16_INTERLEAVE6 1
36; void ff_float_to_int16_interleave6_sse(int16_t *dst, const float **src, int len)
40c7d0ae 37cglobal float_to_int16_interleave6_%1, 2,7,0, dst, src, src1, src2, src3, src4, src5
7ca7d5fa
LM
38%ifdef ARCH_X86_64
39 %define lend r10d
40 mov lend, r2d
41%else
42 %define lend dword r2m
43%endif
44 mov src1q, [srcq+1*gprsize]
45 mov src2q, [srcq+2*gprsize]
46 mov src3q, [srcq+3*gprsize]
47 mov src4q, [srcq+4*gprsize]
48 mov src5q, [srcq+5*gprsize]
49 mov srcq, [srcq]
50 sub src1q, srcq
51 sub src2q, srcq
52 sub src3q, srcq
53 sub src4q, srcq
54 sub src5q, srcq
55.loop:
56 cvtps2pi mm0, [srcq]
57 cvtps2pi mm1, [srcq+src1q]
58 cvtps2pi mm2, [srcq+src2q]
59 cvtps2pi mm3, [srcq+src3q]
60 cvtps2pi mm4, [srcq+src4q]
61 cvtps2pi mm5, [srcq+src5q]
62 packssdw mm0, mm3
63 packssdw mm1, mm4
64 packssdw mm2, mm5
65 pswapd mm3, mm0
66 punpcklwd mm0, mm1
67 punpckhwd mm1, mm2
68 punpcklwd mm2, mm3
69 pswapd mm3, mm0
70 punpckldq mm0, mm2
71 punpckhdq mm2, mm1
72 punpckldq mm1, mm3
73 movq [dstq ], mm0
74 movq [dstq+16], mm2
75 movq [dstq+ 8], mm1
76 add srcq, 8
77 add dstq, 24
78 sub lend, 2
79 jg .loop
80 emms
81 RET
82%endmacro ; FLOAT_TO_INT16_INTERLEAVE6
83
84%define pswapd PSWAPD_SSE
85FLOAT_TO_INT16_INTERLEAVE6 sse
86%define cvtps2pi pf2id
87%define pswapd PSWAPD_3DN1
88FLOAT_TO_INT16_INTERLEAVE6 3dnow
89%undef pswapd
90FLOAT_TO_INT16_INTERLEAVE6 3dn2
91%undef cvtps2pi
92
3daa434a
LM
93
94
95; void ff_add_hfyu_median_prediction_mmx2(uint8_t *dst, uint8_t *top, uint8_t *diff, int w, int *left, int *left_top)
96cglobal add_hfyu_median_prediction_mmx2, 6,6,0, dst, top, diff, w, left, left_top
97 movq mm0, [topq]
98 movq mm2, mm0
99 movd mm4, [left_topq]
100 psllq mm2, 8
101 movq mm1, mm0
102 por mm4, mm2
103 movd mm3, [leftq]
104 psubb mm0, mm4 ; t-tl
105 add dstq, wq
106 add topq, wq
107 add diffq, wq
108 neg wq
109 jmp .skip
110.loop:
111 movq mm4, [topq+wq]
112 movq mm0, mm4
113 psllq mm4, 8
114 por mm4, mm1
115 movq mm1, mm0 ; t
116 psubb mm0, mm4 ; t-tl
117.skip:
118 movq mm2, [diffq+wq]
119%assign i 0
120%rep 8
121 movq mm4, mm0
122 paddb mm4, mm3 ; t-tl+l
123 movq mm5, mm3
124 pmaxub mm3, mm1
125 pminub mm5, mm1
126 pminub mm3, mm4
127 pmaxub mm3, mm5 ; median
128 paddb mm3, mm2 ; +residual
129%if i==0
130 movq mm7, mm3
131 psllq mm7, 56
132%else
133 movq mm6, mm3
134 psrlq mm7, 8
135 psllq mm6, 56
136 por mm7, mm6
137%endif
138%if i<7
139 psrlq mm0, 8
140 psrlq mm1, 8
141 psrlq mm2, 8
142%endif
143%assign i i+1
144%endrep
145 movq [dstq+wq], mm7
146 add wq, 8
147 jl .loop
148 movzx r2d, byte [dstq-1]
149 mov [leftq], r2d
150 movzx r2d, byte [topq-1]
151 mov [left_topq], r2d
152 RET