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

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

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

revision 1.1, Wed Oct 11 13:55:32 2006 UTC revision 1.12, Thu Dec 4 14:41:50 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 1  %macro ACC_ROW 2
30          movq %1,[ecx]          movq %1,[    TMP0]
31            movq %2,[TMP0+TMP1]
32          psadbw %1,mm0          psadbw %1,mm0
33          add ecx, edx          psadbw %2,mm0
34  %endmacro          lea TMP0, [TMP0+2*TMP1]
35            paddw  %1, %2
         ;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  
36  %endmacro  %endmacro
37    
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            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 .text  TEXT
130    
131  cglobal lum_8x8_mmx  cglobal lum_8x8_mmx
132  cglobal consim_sse2  cglobal consim_sse2
# Line 147  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    
144          ACC_ROW mm1          ACC_ROW mm1, mm2
145          ACC_ROW mm2  
146          paddw mm1 ,mm2          ACC_ROW mm3, mm4
147    
148          ACC_ROW mm3          ACC_ROW mm5, mm6
149          ACC_ROW mm4  
150          paddw mm3 ,mm4          ACC_ROW mm7, mm4
   
         ACC_ROW mm5  
         ACC_ROW mm6  
         paddw mm5, mm6  
   
         ACC_ROW mm7  
         ACC_ROW mm4  
         paddw mm7, mm4  
151    
152          paddw mm1, mm3          paddw mm1, mm3
153          paddw mm5, mm7          paddw mm5, mm7
154          paddw mm1, mm5          paddw mm1, mm5
155    
156          movd eax,mm1          movd eax,mm1
         emms  
157          ret          ret
158  .endfunc  ENDFUNC
159    
160  ALIGN 16  ALIGN SECTION_ALIGN
161  consim_mmx:  consim_sse2:
162          mov ecx,[esp+4] ;ptro          PUSH_XMM6_XMM7
163          pxor mm6,mm6;          mov TMP0,prm1 ;ptro
164            mov TMP1,prm2 ;ptrc
165            mov _EAX, prm3 ;stride
166    
167            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            add TMP0,_EAX
174            add TMP1,_EAX
175            CONSIM_1x8_SSE2
176            add TMP0,_EAX
177            add TMP1,_EAX
178            CONSIM_1x8_SSE2
179            add TMP0,_EAX
180            add TMP1,_EAX
181            CONSIM_1x8_SSE2
182            add TMP0,_EAX
183            add TMP1,_EAX
184            CONSIM_1x8_SSE2
185            add TMP0,_EAX
186            add TMP1,_EAX
187            CONSIM_1x8_SSE2
188            add TMP0,_EAX
189            add TMP1,_EAX
190            CONSIM_1x8_SSE2
191            add TMP0,_EAX
192            add TMP1,_EAX
193            CONSIM_1x8_SSE2
194    
195            ;accumulate xmm5-7
196            pshufd     xmm0, xmm5, 0x0E
197            paddd      xmm5, xmm0
198            pshufd     xmm0, xmm5, 0x01
199            paddd      xmm5, xmm0
200    
201            pshufd     xmm1, xmm6, 0x0E
202            paddd      xmm6, xmm1
203            pshufd     xmm1, xmm6, 0x01
204            paddd      xmm6, xmm1
205    
206            pshufd     xmm2, xmm7, 0x0E
207            paddd      xmm7, xmm2
208            pshufd     xmm2, xmm7, 0x01
209            paddd      xmm7, xmm2
210    
211            CONSIM_WRITEOUT xmm5,xmm6,xmm7
212    
213          mov edx,[esp+8] ;ptrc          POP_XMM6_XMM7
214          pxor mm3,mm3;devo          ret
215          pxor mm4,mm4;devc  ENDFUNC
216          movd mm6,[esp + 16];lumo  
217          pxor mm7,mm7  
218          mov eax,[esp+12];stride  
219          movd mm7,[esp + 20];lumc  
220          pshufw mm6,mm6,00000000b  
221          pxor mm5,mm5;corr  ALIGN SECTION_ALIGN
222          pshufw mm7,mm7,00000000b  consim_mmx:
223            mov TMP0,prm1 ;ptro
224            mov TMP1,prm2 ;ptrc
225            mov _EAX,prm3;stride
226            pxor mm2,mm2;null
227            pxor mm5,mm5;devo
228            pxor mm6,mm6;devc
229            pxor mm7,mm7;corr
230    
231          CONSIM_1x8_MMX          CONSIM_1x8_MMX
232          add ecx,eax          add TMP0,_EAX
233          add edx,eax          add TMP1,_EAX
234          CONSIM_1x8_MMX          CONSIM_1x8_MMX
235          add ecx,eax          add TMP0,_EAX
236          add edx,eax          add TMP1,_EAX
237          CONSIM_1x8_MMX          CONSIM_1x8_MMX
238          add ecx,eax          add TMP0,_EAX
239          add edx,eax          add TMP1,_EAX
240          CONSIM_1x8_MMX          CONSIM_1x8_MMX
241          add ecx,eax          add TMP0,_EAX
242          add edx,eax          add TMP1,_EAX
243          CONSIM_1x8_MMX          CONSIM_1x8_MMX
244          add ecx,eax          add TMP0,_EAX
245          add edx,eax          add TMP1,_EAX
246          CONSIM_1x8_MMX          CONSIM_1x8_MMX
247          add ecx,eax          add TMP0,_EAX
248          add edx,eax          add TMP1,_EAX
249          CONSIM_1x8_MMX          CONSIM_1x8_MMX
250          add ecx,eax          add TMP0,_EAX
251          add edx,eax          add TMP1,_EAX
252          CONSIM_1x8_MMX          CONSIM_1x8_MMX
253    
254          pshufw mm0,mm3,01001110b          movq mm0,mm5
255          paddd mm3,mm0          psrlq mm0,32
256          pshufw mm1,mm4,01001110b          paddd mm5,mm0
257          paddd mm4,mm1          movq mm1,mm6
258          pshufw mm2,mm5,01001110b          psrlq mm1,32
259          paddd mm5,mm2          paddd mm6,mm1
260            movq mm2,mm7
261          ;load target pointer          psrlq mm2,32
262          mov ecx,[esp + 24]; pdevo          paddd mm7,mm2
         movd [ecx],mm3  
         mov edx,[esp + 28]; pdevc  
         movd [edx],mm4  
         mov eax,[esp + 32]; corr  
         movd [eax],mm5  
         emms  
         ret  
 .endfunc  
   
 consim_sse2:  
         mov ecx,[esp+4] ;ptro  
         pxor xmm6,xmm6;  
         mov edx,[esp+8] ;ptrc  
         pxor xmm3,xmm3;devo  
         pxor xmm4,xmm4;devc  
         movd xmm6,[esp + 16];lumo  
         pxor xmm7,xmm7  
         mov eax,[esp+12];stride  
         movd xmm7,[esp + 20];lumc  
         pxor xmm5,xmm5;corr  
   
         ;broadcast lumo/c  
         ;punpcklbw xmm6,xmm6  
         punpcklwd xmm6,xmm6  
         pshufd xmm6,xmm6,00000000b;or shufps  
         ;punpcklbw xmm7,xmm7  
         punpcklwd xmm7,xmm7  
         pshufd xmm7,xmm7,00000000b  
   
         CONSIM_1x8_SSE2  
         add ecx,eax  
         add edx,eax  
         CONSIM_1x8_SSE2  
         add ecx,eax  
         add edx,eax  
         CONSIM_1x8_SSE2  
         add ecx,eax  
         add edx,eax  
         CONSIM_1x8_SSE2  
         add ecx,eax  
         add edx,eax  
         CONSIM_1x8_SSE2  
         add ecx,eax  
         add edx,eax  
         CONSIM_1x8_SSE2  
         add ecx,eax  
         add edx,eax  
         CONSIM_1x8_SSE2  
         add ecx,eax  
         add edx,eax  
         CONSIM_1x8_SSE2  
263    
264  ;accumulate xmm3-5          CONSIM_WRITEOUT mm5,mm6,mm7
         pshufd     xmm0, xmm3, 0EH ; Get bit 64-127 from xmm1 (or use movhlps)  
         paddd      xmm3, xmm0      ; Sums are in 2 dwords  
         pshufd     xmm0, xmm3, 01H ; Get bit 32-63 from xmm0  
         paddd      xmm3, xmm0      ; Sum is in one dword  
   
         pshufd     xmm1, xmm4, 0EH ; Get bit 64-127 from xmm1 (or use movhlps)  
         paddd      xmm4, xmm1      ; Sums are in 2 dwords  
         pshufd     xmm1, xmm4, 01H ; Get bit 32-63 from xmm0  
         paddd      xmm4, xmm1      ; Sum is in one dword  
   
         pshufd     xmm2, xmm5, 0EH ; Get bit 64-127 from xmm1 (or use movhlps)  
         paddd      xmm5, xmm2      ; Sums are in 2 dwords  
         pshufd     xmm2, xmm5, 01H ; Get bit 32-63 from xmm0  
         paddd      xmm5, xmm2      ; Sum is in one dword  
   
   
         ;load target pointer  
         mov ecx,[esp + 24]; pdevo  
         movd [ecx],xmm3  
         mov edx,[esp + 28]; pdevc  
         movd [edx],xmm4  
         mov eax,[esp + 32]; corr  
         movd [eax],xmm5  
265          ret          ret
 .endfunc  
266    ENDFUNC
267    
268    %ifidn __OUTPUT_FORMAT__,elf
269    section ".note.GNU-stack" noalloc noexec nowrite progbits
270    %endif

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.12

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