[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.9 - (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.8 SECTION .rotext align=SECTION_ALIGN
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.8 mov TMP0,prm1 ;ptro
163 :     mov TMP1,prm2 ;ptrc
164 :     mov _EAX, prm3 ;stride
165 : Skal 1.1
166 : Skal 1.3 pxor xmm2,xmm2;null vektor
167 :     pxor xmm5,xmm5;devo
168 :     pxor xmm6,xmm6;devc
169 :     pxor xmm7,xmm7;corr
170 :    
171 :     ;broadcast lumo/c
172 :     punpcklbw xmm6,xmm6
173 :     punpcklwd xmm6,xmm6
174 :     pshufd xmm6,xmm6,00000000b;or shufps
175 :     punpcklbw xmm7,xmm7
176 :     punpcklwd xmm7,xmm7
177 :     pshufd xmm7,xmm7,00000000b
178 :    
179 :     CONSIM_1x8_SSE2
180 : Isibaar 1.8 add TMP0,_EAX
181 :     add TMP1,_EAX
182 : Skal 1.3 CONSIM_1x8_SSE2
183 : Isibaar 1.8 add TMP0,_EAX
184 :     add TMP1,_EAX
185 : Skal 1.3 CONSIM_1x8_SSE2
186 : Isibaar 1.8 add TMP0,_EAX
187 :     add TMP1,_EAX
188 : Skal 1.3 CONSIM_1x8_SSE2
189 : Isibaar 1.8 add TMP0,_EAX
190 :     add TMP1,_EAX
191 : Skal 1.3 CONSIM_1x8_SSE2
192 : Isibaar 1.8 add TMP0,_EAX
193 :     add TMP1,_EAX
194 : Skal 1.3 CONSIM_1x8_SSE2
195 : Isibaar 1.8 add TMP0,_EAX
196 :     add TMP1,_EAX
197 : Skal 1.3 CONSIM_1x8_SSE2
198 : Isibaar 1.8 add TMP0,_EAX
199 :     add TMP1,_EAX
200 : Skal 1.3 CONSIM_1x8_SSE2
201 : Skal 1.1
202 : Skal 1.3 ;accumulate xmm5-7
203 : chl 1.5 pshufd xmm0, xmm5, 0x0E
204 : Skal 1.3 paddd xmm5, xmm0
205 : chl 1.5 pshufd xmm0, xmm5, 0x01
206 : Skal 1.3 paddd xmm5, xmm0
207 :    
208 : chl 1.5 pshufd xmm1, xmm6, 0x0E
209 : Skal 1.3 paddd xmm6, xmm1
210 : chl 1.5 pshufd xmm1, xmm6, 0x01
211 : Skal 1.3 paddd xmm6, xmm1
212 :    
213 : chl 1.5 pshufd xmm2, xmm7, 0x0E
214 : Skal 1.3 paddd xmm7, xmm2
215 : chl 1.5 pshufd xmm2, xmm7, 0x01
216 : Skal 1.3 paddd xmm7, xmm2
217 : Skal 1.1
218 : Skal 1.3 CONSIM_WRITEOUT xmm5,xmm6,xmm7
219 : Skal 1.1 ret
220 : Isibaar 1.7 ENDFUNC
221 : Skal 1.1
222 : Skal 1.3
223 :    
224 :    
225 :    
226 : Isibaar 1.8 ALIGN SECTION_ALIGN
227 : Skal 1.3 consim_mmx:
228 : Isibaar 1.8 mov TMP0,prm1 ;ptro
229 :     mov TMP1,prm2 ;ptrc
230 :     mov _EAX,prm3;stride
231 : Skal 1.3 pxor mm2,mm2;null
232 :     pxor mm5,mm5;devo
233 :     pxor mm6,mm6;devc
234 :     pxor mm7,mm7;corr
235 : Skal 1.1
236 : Skal 1.3 CONSIM_1x8_MMX
237 : Isibaar 1.8 add TMP0,_EAX
238 :     add TMP1,_EAX
239 : Skal 1.3 CONSIM_1x8_MMX
240 : Isibaar 1.8 add TMP0,_EAX
241 :     add TMP1,_EAX
242 : Skal 1.3 CONSIM_1x8_MMX
243 : Isibaar 1.8 add TMP0,_EAX
244 :     add TMP1,_EAX
245 : Skal 1.3 CONSIM_1x8_MMX
246 : Isibaar 1.8 add TMP0,_EAX
247 :     add TMP1,_EAX
248 : Skal 1.3 CONSIM_1x8_MMX
249 : Isibaar 1.8 add TMP0,_EAX
250 :     add TMP1,_EAX
251 : Skal 1.3 CONSIM_1x8_MMX
252 : Isibaar 1.8 add TMP0,_EAX
253 :     add TMP1,_EAX
254 : Skal 1.3 CONSIM_1x8_MMX
255 : Isibaar 1.8 add TMP0,_EAX
256 :     add TMP1,_EAX
257 : Skal 1.3 CONSIM_1x8_MMX
258 :    
259 :     movq mm0,mm5
260 :     psrlq mm0,32
261 :     paddd mm5,mm0
262 :     movq mm1,mm6
263 :     psrlq mm1,32
264 :     paddd mm6,mm1
265 :     movq mm2,mm7
266 :     psrlq mm2,32
267 :     paddd mm7,mm2
268 : Skal 1.1
269 : Skal 1.3 CONSIM_WRITEOUT mm5,mm6,mm7
270 : Skal 1.1 ret
271 : Isibaar 1.7 ENDFUNC
272 : Isibaar 1.6
273 :     %ifidn __OUTPUT_FORMAT__,elf
274 :     section ".note.GNU-stack" noalloc noexec nowrite progbits
275 :     %endif

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