[svn] / trunk / xvidcore / src / image / x86_asm / gmc_mmx.asm Repository:
ViewVC logotype

Annotation of /trunk/xvidcore/src/image/x86_asm/gmc_mmx.asm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1794 - (view) (download)

1 : Skal 1709 ;/*****************************************************************************
2 :     ; *
3 :     ; * XVID MPEG-4 VIDEO CODEC
4 :     ; * - GMC core functions -
5 :     ; * Copyright(C) 2006 Pascal Massimino <skal@planet-d.net>
6 :     ; *
7 :     ; * This file is part of XviD, a free MPEG-4 video encoder/decoder
8 :     ; *
9 :     ; * XviD is free software; you can redistribute it and/or modify it
10 :     ; * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 :     ; *
23 : Isibaar 1794 ; * $Id: gmc_mmx.asm,v 1.5 2008-11-14 15:43:27 Isibaar Exp $
24 : Skal 1709 ; *
25 :     ; *************************************************************************/
26 :    
27 :     ;/**************************************************************************
28 :     ; *
29 :     ; * History:
30 :     ; *
31 :     ; * Jun 14 2006: initial version (during Germany/Poland match;)
32 :     ; *
33 :     ; *************************************************************************/
34 :    
35 :     bits 32
36 :    
37 :     %macro cglobal 1
38 :     %ifdef PREFIX
39 :     %ifdef MARK_FUNCS
40 :     global _%1:function %1.endfunc-%1
41 :     %define %1 _%1:function %1.endfunc-%1
42 : Isibaar 1793 %define ENDFUNC .endfunc
43 : Skal 1709 %else
44 :     global _%1
45 :     %define %1 _%1
46 : Isibaar 1793 %define ENDFUNC
47 : Skal 1709 %endif
48 :     %else
49 :     %ifdef MARK_FUNCS
50 :     global %1:function %1.endfunc-%1
51 : Isibaar 1793 %define ENDFUNC .endfunc
52 : Skal 1709 %else
53 :     global %1
54 : Isibaar 1793 %define ENDFUNC
55 : Skal 1709 %endif
56 :     %endif
57 :     %endmacro
58 :    
59 :     ;//////////////////////////////////////////////////////////////////////
60 :    
61 :     cglobal xvid_GMC_Core_Lin_8_mmx
62 :     cglobal xvid_GMC_Core_Lin_8_sse2
63 : Isibaar 1794 cglobal xvid_GMC_Core_Lin_8_sse41
64 : Skal 1709
65 :     ;//////////////////////////////////////////////////////////////////////
66 :    
67 :     %ifdef FORMAT_COFF
68 :     SECTION .rodata
69 :     %else
70 :     SECTION .rodata align=16
71 :     %endif
72 :    
73 :     align 16
74 :     Cst16:
75 :     times 8 dw 16
76 :    
77 :     SECTION .text
78 :    
79 :     ;//////////////////////////////////////////////////////////////////////
80 :     ;// mmx version
81 :    
82 :     %macro GMC_4_SSE 2 ; %1: i %2: out reg (mm5 or mm6)
83 :    
84 :     pcmpeqw mm0, mm0
85 :     movq mm1, [eax+2*(%1) ] ; u0 | u1 | u2 | u3
86 :     psrlw mm0, 12 ; mask 0x000f
87 :     movq mm2, [eax+2*(%1)+2*16] ; v0 | v1 | v2 | v3
88 :    
89 :     pand mm1, mm0 ; u0
90 :     pand mm2, mm0 ; v0
91 :    
92 :     movq mm0, [Cst16]
93 :     movq mm3, mm1 ; u | ...
94 :     movq mm4, mm0
95 :     pmullw mm3, mm2 ; u.v
96 :     psubw mm0, mm1 ; 16-u
97 :     psubw mm4, mm2 ; 16-v
98 :     pmullw mm2, mm0 ; (16-u).v
99 :     pmullw mm0, mm4 ; (16-u).(16-v)
100 :     pmullw mm1, mm4 ; u .(16-v)
101 :    
102 :     movd mm4, [ecx+edx +%1] ; src2
103 :     movd %2, [ecx+edx+1+%1] ; src3
104 :     punpcklbw mm4, mm7
105 :     punpcklbw %2, mm7
106 :     pmullw mm2, mm4
107 :     pmullw mm3, %2
108 :    
109 :     movd mm4, [ecx +%1] ; src0
110 :     movd %2, [ecx +1+%1] ; src1
111 :     punpcklbw mm4, mm7
112 :     punpcklbw %2, mm7
113 :     pmullw mm4, mm0
114 :     pmullw %2, mm1
115 :    
116 :     paddw mm2, mm3
117 :     paddw %2, mm4
118 :    
119 :     paddw %2, mm2
120 :     %endmacro
121 :    
122 :     align 16
123 :     xvid_GMC_Core_Lin_8_mmx:
124 :     mov eax, [esp + 8] ; Offsets
125 :     mov ecx, [esp +12] ; Src0
126 :     mov edx, [esp +16] ; BpS
127 :    
128 :     pxor mm7, mm7
129 :    
130 :     GMC_4_SSE 0, mm5
131 :     GMC_4_SSE 4, mm6
132 :    
133 :     ; pshufw mm4, [esp +20], 01010101b ; Rounder (bits [16..31])
134 :     movd mm4, [esp+20] ; Rounder (bits [16..31])
135 :     mov eax, [esp + 4] ; Dst
136 :     punpcklwd mm4, mm4
137 :     punpckhdq mm4, mm4
138 :    
139 :     paddw mm5, mm4
140 :     paddw mm6, mm4
141 :     psrlw mm5, 8
142 :     psrlw mm6, 8
143 :     packuswb mm5, mm6
144 :     movq [eax], mm5
145 :    
146 :     ret
147 : Isibaar 1793 ENDFUNC
148 : Skal 1709
149 :     ;//////////////////////////////////////////////////////////////////////
150 :     ;// SSE2 version
151 :    
152 : Isibaar 1794 %macro GMC_8_SSE2 1
153 : Skal 1709
154 :     pcmpeqw xmm0, xmm0
155 :     movdqa xmm1, [eax ] ; u...
156 :     psrlw xmm0, 12 ; mask = 0x000f
157 :     movdqa xmm2, [eax+2*16] ; v...
158 :     pand xmm1, xmm0
159 :     pand xmm2, xmm0
160 :    
161 :     movdqa xmm0, [Cst16]
162 :     movdqa xmm3, xmm1 ; u | ...
163 :     movdqa xmm4, xmm0
164 :     pmullw xmm3, xmm2 ; u.v
165 :     psubw xmm0, xmm1 ; 16-u
166 :     psubw xmm4, xmm2 ; 16-v
167 :     pmullw xmm2, xmm0 ; (16-u).v
168 :     pmullw xmm0, xmm4 ; (16-u).(16-v)
169 :     pmullw xmm1, xmm4 ; u .(16-v)
170 :    
171 : Isibaar 1794 %if (%1!=0) ; SSE41
172 :     pmovzxbw xmm4, [ecx+edx ] ; src2
173 :     pmovzxbw xmm5, [ecx+edx+1] ; src3
174 :     %else
175 : Skal 1709 movq xmm4, [ecx+edx ] ; src2
176 :     movq xmm5, [ecx+edx+1] ; src3
177 :     punpcklbw xmm4, xmm7
178 :     punpcklbw xmm5, xmm7
179 : Isibaar 1794 %endif
180 : Skal 1709 pmullw xmm2, xmm4
181 :     pmullw xmm3, xmm5
182 :    
183 : Isibaar 1794 %if (%1!=0) ; SSE41
184 :     pmovzxbw xmm4, [ecx ] ; src0
185 :     pmovzxbw xmm5, [ecx +1] ; src1
186 :     %else
187 : Skal 1709 movq xmm4, [ecx ] ; src0
188 :     movq xmm5, [ecx +1] ; src1
189 :     punpcklbw xmm4, xmm7
190 :     punpcklbw xmm5, xmm7
191 : Isibaar 1794 %endif
192 : Skal 1709 pmullw xmm4, xmm0
193 :     pmullw xmm5, xmm1
194 :    
195 :     paddw xmm2, xmm3
196 :     paddw xmm5, xmm4
197 :    
198 :     paddw xmm5, xmm2
199 :     %endmacro
200 :    
201 :     align 16
202 :     xvid_GMC_Core_Lin_8_sse2:
203 :     mov eax, [esp + 8] ; Offsets
204 :     mov ecx, [esp +12] ; Src0
205 :     mov edx, [esp +16] ; BpS
206 :    
207 :     pxor xmm7, xmm7
208 :    
209 : Isibaar 1794 GMC_8_SSE2 0
210 : Skal 1709
211 : Skal 1756 movd xmm4, [esp +20]
212 :     pshuflw xmm4, xmm4, 01010101b ; Rounder (bits [16..31])
213 : Skal 1709 punpckldq xmm4, xmm4
214 :     mov eax, [esp + 4] ; Dst
215 :    
216 :     paddw xmm5, xmm4
217 :     psrlw xmm5, 8
218 :     packuswb xmm5, xmm5
219 :     movq [eax], xmm5
220 :    
221 :     ret
222 : Isibaar 1793 ENDFUNC
223 : Skal 1709
224 : Isibaar 1794 align 16
225 :     xvid_GMC_Core_Lin_8_sse41:
226 :     mov eax, [esp + 8] ; Offsets
227 :     mov ecx, [esp +12] ; Src0
228 :     mov edx, [esp +16] ; BpS
229 :    
230 :     GMC_8_SSE2 1
231 :    
232 :     movd xmm4, [esp +20]
233 :     pshuflw xmm4, xmm4, 01010101b ; Rounder (bits [16..31])
234 :     punpckldq xmm4, xmm4
235 :     mov eax, [esp + 4] ; Dst
236 :    
237 :     paddw xmm5, xmm4
238 :     psrlw xmm5, 8
239 :     packuswb xmm5, xmm5
240 :     movq [eax], xmm5
241 :    
242 :     ret
243 :     ENDFUNC
244 :    
245 : Skal 1709 ;//////////////////////////////////////////////////////////////////////
246 : Isibaar 1790
247 :     %ifidn __OUTPUT_FORMAT__,elf
248 :     section ".note.GNU-stack" noalloc noexec nowrite progbits
249 :     %endif

No admin address has been configured
ViewVC Help
Powered by ViewVC 1.0.4