[cvs] / xvidcore / src / motion / x86_asm / sad_sse2.asm Repository:
ViewVC logotype

Annotation of /xvidcore/src/motion/x86_asm/sad_sse2.asm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.17 - (view) (download)

1 : edgomez 1.9 ;/****************************************************************************
2 : Isibaar 1.1 ; *
3 : edgomez 1.9 ; * XVID MPEG-4 VIDEO CODEC
4 :     ; * - SSE2 optimized SAD operators -
5 : Isibaar 1.1 ; *
6 : edgomez 1.9 ; * Copyright(C) 2003 Pascal Massimino <skal@planet-d.net>
7 : Isibaar 1.1 ; *
8 : chl 1.3 ; *
9 : edgomez 1.9 ; * This program 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 : edgomez 1.7 ; *
14 : edgomez 1.9 ; * 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 : Isibaar 1.1 ; *
19 : edgomez 1.9 ; * 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 : edgomez 1.8 ; *
23 : Isibaar 1.17 ; * $Id: sad_sse2.asm,v 1.16 2008/11/26 01:04:34 Isibaar Exp $
24 : edgomez 1.8 ; *
25 : edgomez 1.9 ; ***************************************************************************/
26 : Isibaar 1.1
27 : Isibaar 1.16 %include "nasm.inc"
28 : Isibaar 1.1
29 : edgomez 1.9 ;=============================================================================
30 :     ; Read only data
31 :     ;=============================================================================
32 : Isibaar 1.1
33 : Isibaar 1.16 DATA
34 : Isibaar 1.1
35 : Isibaar 1.16 ALIGN SECTION_ALIGN
36 : Isibaar 1.1 zero times 4 dd 0
37 :    
38 : edgomez 1.9 ;=============================================================================
39 :     ; Code
40 :     ;=============================================================================
41 :    
42 : Isibaar 1.16 SECTION .rotext align=SECTION_ALIGN
43 : Isibaar 1.1
44 :     cglobal sad16_sse2
45 :     cglobal dev16_sse2
46 :    
47 : Isibaar 1.13 cglobal sad16_sse3
48 :     cglobal dev16_sse3
49 :    
50 : edgomez 1.9 ;-----------------------------------------------------------------------------
51 :     ; uint32_t sad16_sse2 (const uint8_t * const cur, <- assumed aligned!
52 :     ; const uint8_t * const ref,
53 :     ; const uint32_t stride,
54 :     ; const uint32_t /*ignored*/);
55 :     ;-----------------------------------------------------------------------------
56 :    
57 :    
58 : Isibaar 1.13 %macro SAD_16x16_SSE2 1
59 : Isibaar 1.16 %1 xmm0, [TMP1]
60 :     %1 xmm1, [TMP1+TMP0]
61 :     lea TMP1,[TMP1+2*TMP0]
62 :     movdqa xmm2, [_EAX]
63 :     movdqa xmm3, [_EAX+TMP0]
64 :     lea _EAX,[_EAX+2*TMP0]
65 : edgomez 1.9 psadbw xmm0, xmm2
66 :     paddusw xmm6,xmm0
67 :     psadbw xmm1, xmm3
68 :     paddusw xmm6,xmm1
69 :     %endmacro
70 :    
71 : Isibaar 1.13 %macro SAD16_SSE2_SSE3 1
72 : Isibaar 1.17 PUSH_XMM6_XMM7
73 : Isibaar 1.16 mov _EAX, prm1 ; cur (assumed aligned)
74 :     mov TMP1, prm2 ; ref
75 :     mov TMP0, prm3 ; stride
76 : edgomez 1.9
77 :     pxor xmm6, xmm6 ; accum
78 :    
79 : Isibaar 1.13 SAD_16x16_SSE2 %1
80 :     SAD_16x16_SSE2 %1
81 :     SAD_16x16_SSE2 %1
82 :     SAD_16x16_SSE2 %1
83 :     SAD_16x16_SSE2 %1
84 :     SAD_16x16_SSE2 %1
85 :     SAD_16x16_SSE2 %1
86 :     SAD_16x16_SSE2 %1
87 : edgomez 1.9
88 :     pshufd xmm5, xmm6, 00000010b
89 :     paddusw xmm6, xmm5
90 :     pextrw eax, xmm6, 0
91 : Isibaar 1.17
92 :     POP_XMM6_XMM7
93 : edgomez 1.9 ret
94 : Isibaar 1.13 %endmacro
95 :    
96 : Isibaar 1.16 ALIGN SECTION_ALIGN
97 : Isibaar 1.13 sad16_sse2:
98 :     SAD16_SSE2_SSE3 movdqu
99 : Isibaar 1.15 ENDFUNC
100 : Isibaar 1.13
101 :    
102 : Isibaar 1.16 ALIGN SECTION_ALIGN
103 : Isibaar 1.13 sad16_sse3:
104 :     SAD16_SSE2_SSE3 lddqu
105 : Isibaar 1.15 ENDFUNC
106 : edgomez 1.9
107 :    
108 :     ;-----------------------------------------------------------------------------
109 :     ; uint32_t dev16_sse2(const uint8_t * const cur, const uint32_t stride);
110 :     ;-----------------------------------------------------------------------------
111 :    
112 : Isibaar 1.16 %macro MEAN_16x16_SSE2 1 ; _EAX: src, TMP0:stride, mm7: zero or mean => mm6: result
113 :     %1 xmm0, [_EAX]
114 :     %1 xmm1, [_EAX+TMP0]
115 :     lea _EAX, [_EAX+2*TMP0] ; + 2*stride
116 : edgomez 1.9 psadbw xmm0, xmm7
117 :     paddusw xmm6, xmm0
118 :     psadbw xmm1, xmm7
119 :     paddusw xmm6, xmm1
120 :     %endmacro
121 :    
122 :    
123 : Isibaar 1.13 %macro MEAN16_SSE2_SSE3 1
124 : Isibaar 1.17 PUSH_XMM6_XMM7
125 : Isibaar 1.16 mov _EAX, prm1 ; src
126 :     mov TMP0, prm2 ; stride
127 : edgomez 1.9
128 :     pxor xmm6, xmm6 ; accum
129 :     pxor xmm7, xmm7 ; zero
130 :    
131 : Isibaar 1.13 MEAN_16x16_SSE2 %1
132 :     MEAN_16x16_SSE2 %1
133 :     MEAN_16x16_SSE2 %1
134 :     MEAN_16x16_SSE2 %1
135 :    
136 :     MEAN_16x16_SSE2 %1
137 :     MEAN_16x16_SSE2 %1
138 :     MEAN_16x16_SSE2 %1
139 :     MEAN_16x16_SSE2 %1
140 : edgomez 1.9
141 : Isibaar 1.16 mov _EAX, prm1 ; src again
142 : edgomez 1.9
143 :     pshufd xmm7, xmm6, 10b
144 :     paddusw xmm7, xmm6
145 :     pxor xmm6, xmm6 ; zero accum
146 :     psrlw xmm7, 8 ; => Mean
147 :     pshuflw xmm7, xmm7, 0 ; replicate Mean
148 :     packuswb xmm7, xmm7
149 :     pshufd xmm7, xmm7, 00000000b
150 :    
151 : Isibaar 1.13 MEAN_16x16_SSE2 %1
152 :     MEAN_16x16_SSE2 %1
153 :     MEAN_16x16_SSE2 %1
154 :     MEAN_16x16_SSE2 %1
155 :    
156 :     MEAN_16x16_SSE2 %1
157 :     MEAN_16x16_SSE2 %1
158 :     MEAN_16x16_SSE2 %1
159 :     MEAN_16x16_SSE2 %1
160 : edgomez 1.9
161 :     pshufd xmm7, xmm6, 10b
162 :     paddusw xmm7, xmm6
163 :     pextrw eax, xmm7, 0
164 : Isibaar 1.17
165 :     POP_XMM6_XMM7
166 : edgomez 1.9 ret
167 : Isibaar 1.13 %endmacro
168 :    
169 : Isibaar 1.16 ALIGN SECTION_ALIGN
170 : Isibaar 1.13 dev16_sse2:
171 :     MEAN16_SSE2_SSE3 movdqu
172 : Isibaar 1.15 ENDFUNC
173 : edgomez 1.12
174 : Isibaar 1.16 ALIGN SECTION_ALIGN
175 : Isibaar 1.13 dev16_sse3:
176 :     MEAN16_SSE2_SSE3 lddqu
177 : Isibaar 1.15 ENDFUNC
178 : Isibaar 1.14
179 :    
180 :     %ifidn __OUTPUT_FORMAT__,elf
181 :     section ".note.GNU-stack" noalloc noexec nowrite progbits
182 :     %endif
183 :    

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