[svn] / branches / release-1_2-branch / xvidcore / src / plugins / x86_asm / plugin_ssim-a.asm Repository:
ViewVC logotype

Diff of /branches/release-1_2-branch/xvidcore/src/plugins/x86_asm/plugin_ssim-a.asm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1740, Thu Oct 26 16:34:32 2006 UTC revision 1814, Thu Nov 27 20:46:13 2008 UTC
# Line 24  Line 24 
24    
25  BITS 32  BITS 32
26    
27  %macro cglobal 1  %include "nasm.inc"
         %ifdef PREFIX  
                 %ifdef MARK_FUNCS  
                         global _%1:function %1.endfunc-%1  
                         %define %1 _%1:function %1.endfunc-%1  
                 %else  
                         global _%1  
                         %define %1 _%1  
                 %endif  
         %else  
                 %ifdef MARK_FUNCS  
                         global %1:function %1.endfunc-%1  
                 %else  
                         global %1  
                 %endif  
         %endif  
 %endmacro  
28    
29  %macro ACC_ROW 2  %macro ACC_ROW 2
30          movq %1,[    ecx]          movq %1,[    TMP0]
31          movq %2,[ecx+edx]          movq %2,[TMP0+TMP1]
32          psadbw %1,mm0          psadbw %1,mm0
33          psadbw %2,mm0          psadbw %2,mm0
34          lea ecx, [ecx+2*edx]          lea TMP0, [TMP0+2*TMP1]
35          paddw  %1, %2          paddw  %1, %2
36  %endmacro  %endmacro
37    
         ;load a dq from mem to a xmm reg  
 %macro LOAD_XMM 2  
         movdqu %1,[%2]  
         ;movhps %1,[%2+8]  
 %endmacro  
   
 %macro WRITE_XMM 2  
         ;movlps [%1],%2  
         ;movhps [%1+8],%2  
         movdqu [%1],%2  
 %endmacro  
   
38  %macro CONSIM_1x8_SSE2 0  %macro CONSIM_1x8_SSE2 0
39          LOAD_XMM xmm0,ecx          movdqu xmm0,[TMP0]
40          LOAD_XMM xmm1,edx          movdqu xmm1,[TMP1]
         pxor xmm2,xmm2  
41    
42          ;unpack to words          ;unpack to words
43          punpcklbw xmm0,xmm2          punpcklbw xmm0,xmm2
44          punpcklbw xmm1,xmm2          punpcklbw xmm1,xmm2
45    
46          ;devo          movaps xmm3,xmm0
47          psubw xmm0,xmm6          movaps xmm4,xmm1
         movaps xmm2,xmm0  
         pmaddwd xmm2,xmm0  
         paddd xmm3,xmm2  
   
         ;devc  
         psubw xmm1,xmm7  
         movaps xmm2,xmm1  
         pmaddwd xmm2,xmm1  
         paddd xmm4,xmm2  
   
         ;corr  
         pmaddwd xmm1,xmm0  
         paddd xmm5,xmm1  
 %endmacro  
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    %endmacro
57    
58  %macro CONSIM_1x8_MMX 0  %macro CONSIM_1x8_MMX 0
59          movq mm0,[ecx];orig          movq mm0,[TMP0];orig
60          movq mm1,[edx];comp          movq mm1,[TMP1];comp
         pxor mm2,mm2;null vector  
61    
62          ;unpack low half of qw to words          ;unpack low half of qw to words
63          punpcklbw mm0,mm2          punpcklbw mm0,mm2
64          punpcklbw mm1,mm2          punpcklbw mm1,mm2
65    
66          ;devo          movq mm3,mm0
67          psubw mm0,mm6          pmaddwd mm3,mm0
68          movq mm2,mm0          paddd mm5,mm3;
69          pmaddwd mm2,mm0  
70          paddd mm3,mm2;          movq mm4,mm1
71            pmaddwd mm4,mm1
72          ;devc          paddd mm6,mm4;
         psubw mm1,mm7  
         movq mm2,mm1  
         pmaddwd mm2,mm1  
         paddd mm4,mm2  
73    
         ;corr  
74          pmaddwd mm1,mm0          pmaddwd mm1,mm0
75          paddd mm5,mm1          paddd mm7,mm1
76    
77          movq mm0,[ecx]          movq mm0,[TMP0];orig
78          movq mm1,[edx]          movq mm1,[TMP1];comp
         pxor mm2,mm2;null vector  
79    
80          ;unpack high half of qw to words          ;unpack high half of qw to words
81          punpckhbw mm0,mm2          punpckhbw mm0,mm2
82          punpckhbw mm1,mm2          punpckhbw mm1,mm2
83    
84          ;devo          movq mm3,mm0
85          psubw mm0,mm6          pmaddwd mm3,mm0
86          movq mm2,mm0          paddd mm5,mm3;
87          pmaddwd mm2,mm0  
88          paddd mm3,mm2;          movq mm4,mm1
89            pmaddwd mm4,mm1
90          ;devc          paddd mm6,mm4;
         psubw mm1,mm7  
         movq mm2,mm1  
         pmaddwd mm2,mm1  
         paddd mm4,mm2  
91    
         ;corr  
92          pmaddwd mm1,mm0          pmaddwd mm1,mm0
93          paddd mm5,mm1          paddd mm7,mm1
94  %endmacro  %endmacro
95    
96    %macro CONSIM_WRITEOUT 3
97            mov eax,prm4d;lumo
98            mul eax; lumo^2
99            add eax, 32
100            shr eax, 6; 64*lum0^2
101            movd TMP0d,%1
102            sub TMP0d, eax
103    
104            mov TMP1,prm6; pdevo
105            mov dword [TMP1],TMP0d
106    
107            mov eax,prm5d ;lumc
108            mul eax; lumc^2
109            add eax, 32
110            shr eax, 6; 64*lumc^2
111            movd TMP0d,%2
112            sub TMP0d, eax
113    
114  SECTION .text          mov TMP1,prm7; pdevc
115            mov dword [TMP1],TMP0d
116    
117            mov eax,prm4d;lumo
118            mul prm5d; lumo*lumc, should fit in _EAX
119            add eax, 32
120            shr eax, 6; 64*lumo*lumc
121            movd TMP0d,%3
122            sub TMP0d, eax
123    
124            mov TMP1,prm8; pcorr
125            mov dword [TMP1],TMP0d
126    %endmacro
127    
128    
129    SECTION .rotext align=SECTION_ALIGN
130    
131  cglobal lum_8x8_mmx  cglobal lum_8x8_mmx
132  cglobal consim_sse2  cglobal consim_sse2
# Line 150  Line 134 
134    
135  ;int lum_8x8_c(uint8_t* ptr, uint32_t stride)  ;int lum_8x8_c(uint8_t* ptr, uint32_t stride)
136    
137  ALIGN 16  ALIGN SECTION_ALIGN
138  lum_8x8_mmx:  lum_8x8_mmx:
139          mov ecx, [esp + 4] ;ptr          mov TMP0, prm1 ;ptr
140          mov edx, [esp + 8];stride          mov TMP1, prm2 ;stride
141    
142          pxor mm0,mm0          pxor mm0,mm0
143    
# Line 171  Line 155 
155    
156          movd eax,mm1          movd eax,mm1
157          ret          ret
158  .endfunc  ENDFUNC
   
 ALIGN 16  
 consim_mmx:  
         mov ecx,[esp+4] ;ptro  
         pxor mm6,mm6;  
   
         mov edx,[esp+8] ;ptrc  
         pxor mm3,mm3;devo  
         pxor mm4,mm4;devc  
         movd mm6,[esp + 16];lumo  
         pxor mm7,mm7  
         mov eax,[esp+12];stride  
         movd mm7,[esp + 20];lumc  
         pshufw mm6,mm6,00000000b                ; TODO: remove later! not MMX, but SSE  
         pxor mm5,mm5;corr  
         pshufw mm7,mm7,00000000b  
   
         CONSIM_1x8_MMX  
         add ecx,eax  
         add edx,eax  
         CONSIM_1x8_MMX  
         add ecx,eax  
         add edx,eax  
         CONSIM_1x8_MMX  
         add ecx,eax  
         add edx,eax  
         CONSIM_1x8_MMX  
         add ecx,eax  
         add edx,eax  
         CONSIM_1x8_MMX  
         add ecx,eax  
         add edx,eax  
         CONSIM_1x8_MMX  
         add ecx,eax  
         add edx,eax  
         CONSIM_1x8_MMX  
         add ecx,eax  
         add edx,eax  
         CONSIM_1x8_MMX  
   
         pshufw mm0,mm3,01001110b  
         paddd mm3,mm0  
         pshufw mm1,mm4,01001110b  
         paddd mm4,mm1  
         pshufw mm2,mm5,01001110b  
         paddd mm5,mm2  
   
         ;load target pointer  
         mov ecx,[esp + 24]; pdevo  
         movd [ecx],mm3  
         mov edx,[esp + 28]; pdevc  
         movd [edx],mm4  
         mov eax,[esp + 32]; corr  
         movd [eax],mm5  
         emms  
         ret  
 .endfunc  
159    
160    ALIGN SECTION_ALIGN
161  consim_sse2:  consim_sse2:
162          mov ecx,[esp+4] ;ptro          mov TMP0,prm1 ;ptro
163          pxor xmm6,xmm6;          mov TMP1,prm2 ;ptrc
164          mov edx,[esp+8] ;ptrc          mov _EAX, prm3 ;stride
165          pxor xmm3,xmm3;devo  
166          pxor xmm4,xmm4;devc          pxor xmm2,xmm2;null vektor
167          movd xmm6,[esp + 16];lumo          pxor xmm5,xmm5;devo
168          pxor xmm7,xmm7          pxor xmm6,xmm6;devc
169          mov eax,[esp+12];stride          pxor xmm7,xmm7;corr
         movd xmm7,[esp + 20];lumc  
         pxor xmm5,xmm5;corr  
170    
171          ;broadcast lumo/c          ;broadcast lumo/c
172          ;punpcklbw xmm6,xmm6          punpcklbw xmm6,xmm6
173          punpcklwd xmm6,xmm6          punpcklwd xmm6,xmm6
174          pshufd xmm6,xmm6,00000000b;or shufps          pshufd xmm6,xmm6,00000000b;or shufps
175          ;punpcklbw xmm7,xmm7          punpcklbw xmm7,xmm7
176          punpcklwd xmm7,xmm7          punpcklwd xmm7,xmm7
177          pshufd xmm7,xmm7,00000000b          pshufd xmm7,xmm7,00000000b
178    
179          CONSIM_1x8_SSE2          CONSIM_1x8_SSE2
180          add ecx,eax          add TMP0,_EAX
181          add edx,eax          add TMP1,_EAX
182          CONSIM_1x8_SSE2          CONSIM_1x8_SSE2
183          add ecx,eax          add TMP0,_EAX
184          add edx,eax          add TMP1,_EAX
185          CONSIM_1x8_SSE2          CONSIM_1x8_SSE2
186          add ecx,eax          add TMP0,_EAX
187          add edx,eax          add TMP1,_EAX
188          CONSIM_1x8_SSE2          CONSIM_1x8_SSE2
189          add ecx,eax          add TMP0,_EAX
190          add edx,eax          add TMP1,_EAX
191          CONSIM_1x8_SSE2          CONSIM_1x8_SSE2
192          add ecx,eax          add TMP0,_EAX
193          add edx,eax          add TMP1,_EAX
194          CONSIM_1x8_SSE2          CONSIM_1x8_SSE2
195          add ecx,eax          add TMP0,_EAX
196          add edx,eax          add TMP1,_EAX
197          CONSIM_1x8_SSE2          CONSIM_1x8_SSE2
198          add ecx,eax          add TMP0,_EAX
199          add edx,eax          add TMP1,_EAX
200          CONSIM_1x8_SSE2          CONSIM_1x8_SSE2
201    
202  ;accumulate xmm3-5          ;accumulate xmm5-7
203          pshufd     xmm0, xmm3, 0EH ; Get bit 64-127 from xmm1 (or use movhlps)          pshufd     xmm0, xmm5, 0x0E
204          paddd      xmm3, xmm0      ; Sums are in 2 dwords          paddd      xmm5, xmm0
205          pshufd     xmm0, xmm3, 01H ; Get bit 32-63 from xmm0          pshufd     xmm0, xmm5, 0x01
206          paddd      xmm3, xmm0      ; Sum is in one dword          paddd      xmm5, xmm0
207    
208          pshufd     xmm1, xmm4, 0EH ; Get bit 64-127 from xmm1 (or use movhlps)          pshufd     xmm1, xmm6, 0x0E
209          paddd      xmm4, xmm1      ; Sums are in 2 dwords          paddd      xmm6, xmm1
210          pshufd     xmm1, xmm4, 01H ; Get bit 32-63 from xmm0          pshufd     xmm1, xmm6, 0x01
211          paddd      xmm4, xmm1      ; Sum is in one dword          paddd      xmm6, xmm1
212    
213          pshufd     xmm2, xmm5, 0EH ; Get bit 64-127 from xmm1 (or use movhlps)          pshufd     xmm2, xmm7, 0x0E
214          paddd      xmm5, xmm2      ; Sums are in 2 dwords          paddd      xmm7, xmm2
215          pshufd     xmm2, xmm5, 01H ; Get bit 32-63 from xmm0          pshufd     xmm2, xmm7, 0x01
216          paddd      xmm5, xmm2      ; Sum is in one dword          paddd      xmm7, xmm2
217    
218            CONSIM_WRITEOUT xmm5,xmm6,xmm7
219          ;load target pointer          ret
220          mov ecx,[esp + 24]; pdevo  ENDFUNC
221          movd [ecx],xmm3  
222          mov edx,[esp + 28]; pdevc  
223          movd [edx],xmm4  
224          mov eax,[esp + 32]; corr  
225          movd [eax],xmm5  
226    ALIGN SECTION_ALIGN
227    consim_mmx:
228            mov TMP0,prm1 ;ptro
229            mov TMP1,prm2 ;ptrc
230            mov _EAX,prm3;stride
231            pxor mm2,mm2;null
232            pxor mm5,mm5;devo
233            pxor mm6,mm6;devc
234            pxor mm7,mm7;corr
235    
236            CONSIM_1x8_MMX
237            add TMP0,_EAX
238            add TMP1,_EAX
239            CONSIM_1x8_MMX
240            add TMP0,_EAX
241            add TMP1,_EAX
242            CONSIM_1x8_MMX
243            add TMP0,_EAX
244            add TMP1,_EAX
245            CONSIM_1x8_MMX
246            add TMP0,_EAX
247            add TMP1,_EAX
248            CONSIM_1x8_MMX
249            add TMP0,_EAX
250            add TMP1,_EAX
251            CONSIM_1x8_MMX
252            add TMP0,_EAX
253            add TMP1,_EAX
254            CONSIM_1x8_MMX
255            add TMP0,_EAX
256            add TMP1,_EAX
257            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    
269            CONSIM_WRITEOUT mm5,mm6,mm7
270          ret          ret
 .endfunc  
271    ENDFUNC
272    
273    %ifidn __OUTPUT_FORMAT__,elf
274    section ".note.GNU-stack" noalloc noexec nowrite progbits
275    %endif

Legend:
Removed from v.1740  
changed lines
  Added in v.1814

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