[cvs] / xvidcore / src / plugins / x86_asm / plugin_ssim-a.asm Repository:
ViewVC logotype

Annotation of /xvidcore/src/plugins/x86_asm/plugin_ssim-a.asm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.13 - (view) (download)

1 : Skal 1.1 ;/****************************************************************************
2 :     ; *
3 :     ; * XVID MPEG-4 VIDEO CODEC
4 :     ; * - optimized SSIM routines -
5 :     ; *
6 :     ; * Copyright(C) 2006 Johannes Reinhardt <johannes.reinhardt@gmx.de>
7 :     ; *
8 :     ; * This program is free software; you can redistribute it and/or modify it
9 :     ; * under the terms of the GNU General Public License as published by
10 :     ; * the Free Software Foundation; either version 2 of the License, or
11 :     ; * (at your option) any later version.
12 :     ; *
13 :     ; * This program 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
16 :     ; * GNU General Public License for more details.
17 :     ; *
18 :     ; * You should have received a copy of the GNU General Public License
19 :     ; * along with this program; if not, write to the Free Software
20 :     ; * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 :     ; *
22 :     ; *
23 :     ; ***************************************************************************/
24 :    
25 :     BITS 32
26 :    
27 : Isibaar 1.8 %include "nasm.inc"
28 : Skal 1.1
29 : Skal 1.2 %macro ACC_ROW 2
30 : Isibaar 1.8 movq %1,[ TMP0]
31 :     movq %2,[TMP0+TMP1]
32 : Skal 1.1 psadbw %1,mm0
33 : Skal 1.2 psadbw %2,mm0
34 : Isibaar 1.8 lea TMP0, [TMP0+2*TMP1]
35 : Skal 1.2 paddw %1, %2
36 : Skal 1.1 %endmacro
37 :    
38 :     %macro CONSIM_1x8_SSE2 0
39 : Isibaar 1.8 movdqu xmm0,[TMP0]
40 :     movdqu xmm1,[TMP1]
41 : Skal 1.1
42 :     ;unpack to words
43 :     punpcklbw xmm0,xmm2
44 :     punpcklbw xmm1,xmm2
45 :    
46 : Skal 1.3 movaps xmm3,xmm0
47 :     movaps xmm4,xmm1
48 :    
49 :     pmaddwd xmm0,xmm0;orig
50 :     pmaddwd xmm1,xmm1;comp
51 :     pmaddwd xmm3,xmm4;corr
52 :    
53 :     paddd xmm5,xmm0
54 :     paddd xmm6,xmm1
55 :     paddd xmm7,xmm3
56 : Skal 1.1 %endmacro
57 :    
58 : Skal 1.3 %macro CONSIM_1x8_MMX 0
59 : Isibaar 1.8 movq mm0,[TMP0];orig
60 :     movq mm1,[TMP1];comp
61 : Skal 1.1
62 : Skal 1.3 ;unpack low half of qw to words
63 :     punpcklbw mm0,mm2
64 :     punpcklbw mm1,mm2
65 :    
66 :     movq mm3,mm0
67 :     pmaddwd mm3,mm0
68 :     paddd mm5,mm3;
69 :    
70 :     movq mm4,mm1
71 :     pmaddwd mm4,mm1
72 :     paddd mm6,mm4;
73 : Skal 1.1
74 :     pmaddwd mm1,mm0
75 : Skal 1.3 paddd mm7,mm1
76 :    
77 : Isibaar 1.8 movq mm0,[TMP0];orig
78 :     movq mm1,[TMP1];comp
79 : Skal 1.1
80 : Skal 1.3 ;unpack high half of qw to words
81 :     punpckhbw mm0,mm2
82 :     punpckhbw mm1,mm2
83 :    
84 :     movq mm3,mm0
85 :     pmaddwd mm3,mm0
86 :     paddd mm5,mm3;
87 :    
88 :     movq mm4,mm1
89 :     pmaddwd mm4,mm1
90 :     paddd mm6,mm4;
91 : Skal 1.1
92 :     pmaddwd mm1,mm0
93 : Skal 1.3 paddd mm7,mm1
94 : Skal 1.1 %endmacro
95 :    
96 : Skal 1.3 %macro CONSIM_WRITEOUT 3
97 : Isibaar 1.9 mov eax,prm4d;lumo
98 :     mul eax; lumo^2
99 :     add eax, 32
100 :     shr eax, 6; 64*lum0^2
101 : Isibaar 1.8 movd TMP0d,%1
102 : Isibaar 1.9 sub TMP0d, eax
103 : Isibaar 1.8
104 :     mov TMP1,prm6; pdevo
105 : Isibaar 1.9 mov dword [TMP1],TMP0d
106 : Isibaar 1.8
107 :     mov eax,prm5d ;lumc
108 : Isibaar 1.9 mul eax; lumc^2
109 :     add eax, 32
110 :     shr eax, 6; 64*lumc^2
111 : Isibaar 1.8 movd TMP0d,%2
112 : Isibaar 1.9 sub TMP0d, eax
113 : Isibaar 1.8
114 :     mov TMP1,prm7; pdevc
115 : Isibaar 1.9 mov dword [TMP1],TMP0d
116 : Isibaar 1.8
117 : Isibaar 1.9 mov eax,prm4d;lumo
118 : Isibaar 1.8 mul prm5d; lumo*lumc, should fit in _EAX
119 : Isibaar 1.9 add eax, 32
120 :     shr eax, 6; 64*lumo*lumc
121 : Isibaar 1.8 movd TMP0d,%3
122 : Isibaar 1.9 sub TMP0d, eax
123 : Skal 1.3
124 : Isibaar 1.8 mov TMP1,prm8; pcorr
125 : Isibaar 1.9 mov dword [TMP1],TMP0d
126 : Skal 1.3 %endmacro
127 : Skal 1.1
128 :    
129 : Isibaar 1.12 TEXT
130 : Skal 1.1
131 :     cglobal lum_8x8_mmx
132 :     cglobal consim_sse2
133 :     cglobal consim_mmx
134 :    
135 :     ;int lum_8x8_c(uint8_t* ptr, uint32_t stride)
136 :    
137 : Isibaar 1.8 ALIGN SECTION_ALIGN
138 : Skal 1.1 lum_8x8_mmx:
139 : Isibaar 1.8 mov TMP0, prm1 ;ptr
140 :     mov TMP1, prm2 ;stride
141 : Skal 1.1
142 :     pxor mm0,mm0
143 :    
144 : Skal 1.2 ACC_ROW mm1, mm2
145 : Skal 1.1
146 : Skal 1.2 ACC_ROW mm3, mm4
147 :    
148 :     ACC_ROW mm5, mm6
149 :    
150 :     ACC_ROW mm7, mm4
151 : Skal 1.1
152 :     paddw mm1, mm3
153 :     paddw mm5, mm7
154 :     paddw mm1, mm5
155 :    
156 :     movd eax,mm1
157 :     ret
158 : Isibaar 1.7 ENDFUNC
159 : Skal 1.1
160 : Isibaar 1.8 ALIGN SECTION_ALIGN
161 : Skal 1.3 consim_sse2:
162 : Isibaar 1.10 PUSH_XMM6_XMM7
163 : Isibaar 1.8 mov TMP0,prm1 ;ptro
164 :     mov TMP1,prm2 ;ptrc
165 :     mov _EAX, prm3 ;stride
166 : Skal 1.1
167 : Skal 1.3 pxor xmm2,xmm2;null vektor
168 :     pxor xmm5,xmm5;devo
169 :     pxor xmm6,xmm6;devc
170 :     pxor xmm7,xmm7;corr
171 :    
172 :     CONSIM_1x8_SSE2
173 : Isibaar 1.8 add TMP0,_EAX
174 :     add TMP1,_EAX
175 : Skal 1.3 CONSIM_1x8_SSE2
176 : Isibaar 1.8 add TMP0,_EAX
177 :     add TMP1,_EAX
178 : Skal 1.3 CONSIM_1x8_SSE2
179 : Isibaar 1.8 add TMP0,_EAX
180 :     add TMP1,_EAX
181 : Skal 1.3 CONSIM_1x8_SSE2
182 : Isibaar 1.8 add TMP0,_EAX
183 :     add TMP1,_EAX
184 : Skal 1.3 CONSIM_1x8_SSE2
185 : Isibaar 1.8 add TMP0,_EAX
186 :     add TMP1,_EAX
187 : Skal 1.3 CONSIM_1x8_SSE2
188 : Isibaar 1.8 add TMP0,_EAX
189 :     add TMP1,_EAX
190 : Skal 1.3 CONSIM_1x8_SSE2
191 : Isibaar 1.8 add TMP0,_EAX
192 :     add TMP1,_EAX
193 : Skal 1.3 CONSIM_1x8_SSE2
194 : Skal 1.1
195 : Skal 1.3 ;accumulate xmm5-7
196 : chl 1.5 pshufd xmm0, xmm5, 0x0E
197 : Skal 1.3 paddd xmm5, xmm0
198 : chl 1.5 pshufd xmm0, xmm5, 0x01
199 : Skal 1.3 paddd xmm5, xmm0
200 :    
201 : chl 1.5 pshufd xmm1, xmm6, 0x0E
202 : Skal 1.3 paddd xmm6, xmm1
203 : chl 1.5 pshufd xmm1, xmm6, 0x01
204 : Skal 1.3 paddd xmm6, xmm1
205 :    
206 : chl 1.5 pshufd xmm2, xmm7, 0x0E
207 : Skal 1.3 paddd xmm7, xmm2
208 : chl 1.5 pshufd xmm2, xmm7, 0x01
209 : Skal 1.3 paddd xmm7, xmm2
210 : Skal 1.1
211 : Skal 1.3 CONSIM_WRITEOUT xmm5,xmm6,xmm7
212 : Isibaar 1.10
213 :     POP_XMM6_XMM7
214 : Skal 1.1 ret
215 : Isibaar 1.7 ENDFUNC
216 : Skal 1.1
217 : Skal 1.3
218 :    
219 :    
220 :    
221 : Isibaar 1.8 ALIGN SECTION_ALIGN
222 : Skal 1.3 consim_mmx:
223 : Isibaar 1.8 mov TMP0,prm1 ;ptro
224 :     mov TMP1,prm2 ;ptrc
225 :     mov _EAX,prm3;stride
226 : Skal 1.3 pxor mm2,mm2;null
227 :     pxor mm5,mm5;devo
228 :     pxor mm6,mm6;devc
229 :     pxor mm7,mm7;corr
230 : Skal 1.1
231 : Skal 1.3 CONSIM_1x8_MMX
232 : Isibaar 1.8 add TMP0,_EAX
233 :     add TMP1,_EAX
234 : Skal 1.3 CONSIM_1x8_MMX
235 : Isibaar 1.8 add TMP0,_EAX
236 :     add TMP1,_EAX
237 : Skal 1.3 CONSIM_1x8_MMX
238 : Isibaar 1.8 add TMP0,_EAX
239 :     add TMP1,_EAX
240 : Skal 1.3 CONSIM_1x8_MMX
241 : Isibaar 1.8 add TMP0,_EAX
242 :     add TMP1,_EAX
243 : Skal 1.3 CONSIM_1x8_MMX
244 : Isibaar 1.8 add TMP0,_EAX
245 :     add TMP1,_EAX
246 : Skal 1.3 CONSIM_1x8_MMX
247 : Isibaar 1.8 add TMP0,_EAX
248 :     add TMP1,_EAX
249 : Skal 1.3 CONSIM_1x8_MMX
250 : Isibaar 1.8 add TMP0,_EAX
251 :     add TMP1,_EAX
252 : Skal 1.3 CONSIM_1x8_MMX
253 :    
254 :     movq mm0,mm5
255 :     psrlq mm0,32
256 :     paddd mm5,mm0
257 :     movq mm1,mm6
258 :     psrlq mm1,32
259 :     paddd mm6,mm1
260 :     movq mm2,mm7
261 :     psrlq mm2,32
262 :     paddd mm7,mm2
263 : Skal 1.1
264 : Skal 1.3 CONSIM_WRITEOUT mm5,mm6,mm7
265 : Skal 1.1 ret
266 : Isibaar 1.7 ENDFUNC
267 : Isibaar 1.6
268 : Isibaar 1.13 NON_EXEC_STACK

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