[cvs] / xvidcore / src / utils / x86_asm / interlacing_mmx.asm Repository:
ViewVC logotype

Annotation of /xvidcore/src/utils/x86_asm/interlacing_mmx.asm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.10.2.1 - (view) (download)

1 : edgomez 1.3 ;/****************************************************************************
2 : edgomez 1.2 ; *
3 : edgomez 1.3 ; * XVID MPEG-4 VIDEO CODEC
4 :     ; * - Interlacing Field test -
5 : edgomez 1.2 ; *
6 : edgomez 1.3 ; * Copyright(C) 2002 Daniel Smith <danielsmith@astroboymail.com>
7 : edgomez 1.2 ; *
8 : Isibaar 1.9 ; * This program is free software ; you can r_EDIstribute it and/or modify
9 : edgomez 1.3 ; * it 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 : edgomez 1.2 ; *
13 : edgomez 1.3 ; * 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 : edgomez 1.2 ; *
18 : edgomez 1.3 ; * 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 : edgomez 1.2 ; *
22 : Isibaar 1.10.2.1 ; * $Id: interlacing_mmx.asm,v 1.10 2008/11/27 18:35:36 Isibaar Exp $
23 : edgomez 1.2 ; *
24 : edgomez 1.3 ; ***************************************************************************/
25 : edgomez 1.2
26 : Isibaar 1.9 %include "nasm.inc"
27 : edgomez 1.2
28 : edgomez 1.3 ;=============================================================================
29 :     ; Read only data
30 :     ;=============================================================================
31 :    
32 : Isibaar 1.9 DATA
33 : edgomez 1.3
34 :     ; advances to next block on right
35 : Isibaar 1.9 ALIGN SECTION_ALIGN
36 : edgomez 1.3 nexts:
37 :     dd 0, 0, 8, 120, 8
38 :    
39 :     ; multiply word sums into dwords
40 : Isibaar 1.9 ALIGN SECTION_ALIGN
41 : edgomez 1.3 ones:
42 :     times 4 dw 1
43 :    
44 :     ;=============================================================================
45 :     ; Code
46 :     ;=============================================================================
47 : edgomez 1.2
48 : Isibaar 1.10.2.1 TEXT
49 : edgomez 1.2
50 :     cglobal MBFieldTest_mmx
51 :    
52 :     ; neater
53 : Isibaar 1.9 %define line0 _ESI
54 :     %define line1 _ESI+16
55 :     %define line2 _ESI+32
56 :     %define line3 _ESI+48
57 :     %define line4 _ESI+64
58 :     %define line5 _ESI+80
59 :     %define line6 _ESI+96
60 :     %define line7 _ESI+112
61 :     %define line8 _EDI
62 :     %define line9 _EDI+16
63 :     %define line10 _EDI+32
64 :     %define line11 _EDI+48
65 :     %define line12 _EDI+64
66 :     %define line13 _EDI+80
67 :     %define line14 _EDI+96
68 :     %define line15 _EDI+112
69 : edgomez 1.2
70 :     ; keep from losing track which reg holds which line - these never overlap
71 :     %define m00 mm0
72 :     %define m01 mm1
73 :     %define m02 mm2
74 :     %define m03 mm0
75 :     %define m04 mm1
76 :     %define m05 mm2
77 :     %define m06 mm0
78 :     %define m07 mm1
79 :     %define m08 mm2
80 :     %define m09 mm0
81 :     %define m10 mm1
82 :     %define m11 mm2
83 :     %define m12 mm0
84 :     %define m13 mm1
85 :     %define m14 mm2
86 :     %define m15 mm0
87 :    
88 :     ; gets diff between three lines low(%2),mid(%3),hi(%4): frame = mid-low, field = hi-low
89 :     %macro ABS8 4
90 : edgomez 1.3 movq %4, [%1] ; m02 = hi
91 :     movq mm3, %2 ; mm3 = low copy
92 : edgomez 1.2
93 : edgomez 1.3 pxor mm4, mm4 ; mm4 = 0
94 :     pxor mm5, mm5 ; mm5 = 0
95 : edgomez 1.2
96 : edgomez 1.3 psubw %2, %3 ; diff(med,low) for frame
97 :     psubw mm3, %4 ; diff(hi,low) for field
98 : edgomez 1.2
99 : edgomez 1.3 pcmpgtw mm4, %2 ; if (diff<0), mm4 will be all 1's, else all 0's
100 :     pcmpgtw mm5, mm3
101 :     pxor %2, mm4 ; this will get abs(), but off by 1 if (diff<0)
102 :     pxor mm3, mm5
103 :     psubw %2, mm4 ; correct abs being off by 1 when (diff<0)
104 :     psubw mm3, mm5
105 : edgomez 1.2
106 : edgomez 1.3 paddw mm6, %2 ; add to totals
107 :     paddw mm7, mm3
108 : edgomez 1.2 %endmacro
109 :    
110 : edgomez 1.3 ;-----------------------------------------------------------------------------
111 : edgomez 1.2 ;
112 :     ; uint32_t MBFieldTest_mmx(int16_t * const data);
113 :     ;
114 : edgomez 1.3 ;-----------------------------------------------------------------------------
115 : edgomez 1.2
116 : Isibaar 1.9 ALIGN SECTION_ALIGN
117 : edgomez 1.2 MBFieldTest_mmx:
118 :    
119 : Isibaar 1.9 mov _EAX, prm1
120 :    
121 :     push _ESI
122 :     push _EDI
123 : edgomez 1.2
124 : Isibaar 1.9 mov _ESI, _EAX ; _ESI = top left block
125 :     mov _EDI, _ESI
126 :     add _EDI, 256 ; _EDI = bottom left block
127 : edgomez 1.3
128 :     pxor mm6, mm6 ; frame total
129 :     pxor mm7, mm7 ; field total
130 :    
131 : Isibaar 1.9 mov _EAX, 4 ; we do left 8 bytes of data[0*64], then right 8 bytes
132 : edgomez 1.3 ; then left 8 bytes of data[1*64], then last 8 bytes
133 :     .loop:
134 :     movq m00, [line0] ; line0
135 :     movq m01, [line1] ; line1
136 :    
137 :     ABS8 line2, m00, m01, m02 ; frame += (line2-line1), field += (line2-line0)
138 :     ABS8 line3, m01, m02, m03
139 :     ABS8 line4, m02, m03, m04
140 :     ABS8 line5, m03, m04, m05
141 :     ABS8 line6, m04, m05, m06
142 :     ABS8 line7, m05, m06, m07
143 :     ABS8 line8, m06, m07, m08
144 :    
145 :     movq m09, [line9] ; line9-line7, no frame comp for line9-line8!
146 :     pxor mm4, mm4
147 :     psubw m07, m09
148 :     pcmpgtw mm4, mm1
149 :     pxor m07, mm4
150 :     psubw m07, mm4
151 :     paddw mm7, m07 ; add to field total
152 :    
153 :     ABS8 line10, m08, m09, m10 ; frame += (line10-line9), field += (line10-line8)
154 :     ABS8 line11, m09, m10, m11
155 :     ABS8 line12, m10, m11, m12
156 :     ABS8 line13, m11, m12, m13
157 :     ABS8 line14, m12, m13, m14
158 :     ABS8 line15, m13, m14, m15
159 :    
160 :     pxor mm4, mm4 ; line15-line14, we're done with field comps!
161 :     psubw m14, m15
162 :     pcmpgtw mm4, m14
163 :     pxor m14, mm4
164 :     psubw m14, mm4
165 :     paddw mm6, m14 ; add to frame total
166 :    
167 : Isibaar 1.9 lea TMP0, [nexts]
168 : Isibaar 1.10 mov TMP0d, dword [TMP0+_EAX*4] ; move _ESI/_EDI 8 pixels to the right
169 : Isibaar 1.9 add _ESI, TMP0
170 :     add _EDI, TMP0
171 : edgomez 1.3
172 : Isibaar 1.9 dec _EAX
173 : edgomez 1.3 jnz near .loop
174 :    
175 :     .decide:
176 :     movq mm0, [ones] ; add packed words into single dwords
177 :     pmaddwd mm6, mm0
178 :     pmaddwd mm7, mm0
179 :    
180 : Isibaar 1.9 movq mm0, mm6 ; TMP0 will be frame total, TMP1 field
181 : edgomez 1.3 movq mm1, mm7
182 :     psrlq mm0, 32
183 :     psrlq mm1, 32
184 :     paddd mm0, mm6
185 :     paddd mm1, mm7
186 : Isibaar 1.9 movd TMP0d, mm0
187 :     movd TMP1d, mm1
188 : edgomez 1.3
189 : Isibaar 1.9 add TMP1, 350 ; add bias against field decision
190 :     cmp TMP0, TMP1
191 : edgomez 1.3 jb .end ; if frame<field, don't use field dct
192 : Isibaar 1.9 inc _EAX ; if frame>=field, use field dct (return 1)
193 : edgomez 1.3
194 :     .end:
195 : Isibaar 1.9 pop _EDI
196 :     pop _ESI
197 : edgomez 1.2
198 : edgomez 1.3 ret
199 : Isibaar 1.8 ENDFUNC
200 : edgomez 1.6
201 : Isibaar 1.7
202 :     %ifidn __OUTPUT_FORMAT__,elf
203 :     section ".note.GNU-stack" noalloc noexec nowrite progbits
204 :     %endif
205 :    

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