[svn] / trunk / xvidcore / src / utils / x86_64_asm / interlacing_mmx.asm Repository:
ViewVC logotype

Annotation of /trunk/xvidcore/src/utils/x86_64_asm/interlacing_mmx.asm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1793 - (view) (download)

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

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