add audio to proxy, and minor bug fixes
[goodguy/history.git] / cinelerra-5.1 / libzmpeg3 / video / reconmmx.s
1 ADD_1:          dd 01010101h, 01010101h
2 MASK_AND:       dd 7f7f7f7fh, 7f7f7f7fh
3 PLUS_384:       dd 01800180h, 01800180h
4 PLUS_128:       dd 00800080h, 00800080h
5
6 %assign LocalFrameSize  0
7 %assign RegisterStorageSize  16
8
9 ; Arguments:
10 %assign source                    LocalFrameSize + RegisterStorageSize +  4
11 %assign dest                      LocalFrameSize + RegisterStorageSize +  8
12 %assign lx2                       LocalFrameSize + RegisterStorageSize + 12
13 %assign h                         LocalFrameSize + RegisterStorageSize + 16
14
15 ; Locals (on local stack frame)
16
17
18 ; extern void C rec_mmx (
19 ;                                     unsigned char *source,
20 ;                                     unsigned char *dest,
21 ;                                     int lx2,
22 ;                                     int h
23 ;
24 ;  The local variables are on the stack,
25 ;
26
27 global recva_mmx
28 global recvac_mmx
29 global rech_mmx
30 global rechc_mmx
31 global add_block_mmx
32 global set_block_mmx
33
34
35   align 16
36 rech_mmx:
37   push       esi
38   push       edi
39   push       ecx
40   push       ebx
41   mov        esi, [esp+source]
42   mov        edi, [esp+dest]
43   mov        ecx, [esp+h]
44   mov        ebx, [esp+lx2]
45   movq       mm5, [MASK_AND]
46   movq       mm6, [ADD_1]
47 .rech1:
48   movq       mm0,[esi]
49   movq       mm1,[esi+1]
50   movq       mm2,[esi+8]
51   movq       mm3,[esi+9]
52   psrlw      mm0,1
53   psrlw      mm1,1
54   psrlw      mm2,1
55   psrlw      mm3,1
56   pand       mm0,mm5
57   pand       mm1,mm5
58   pand       mm2,mm5
59   pand       mm3,mm5
60   paddusb    mm0,mm1
61   paddusb    mm2,mm3
62   paddusb    mm0,mm6
63   paddusb    mm2,mm6
64   movq       [edi],mm0
65   add        esi,ebx
66   movq       [edi+8],mm2
67   add        edi,ebx
68   dec        ecx
69   jnz        .rech1
70   emms
71   pop        ebx
72   pop        ecx
73   pop        edi
74   pop        esi
75   ret
76
77   align 16
78 rechc_mmx:
79   push       esi
80   push       edi
81   push       ecx
82   push       ebx
83 ;  sub        esp, LocalFrameSize
84   mov        esi, [esp+source]
85   mov        edi, [esp+dest]
86   mov        ecx, [esp+h]
87   mov        ebx, [esp+lx2]
88   movq       mm5, [MASK_AND]
89   movq       mm6, [ADD_1]
90 .rechc1:
91   movq       mm0,[esi]
92   movq       mm1,[esi+1]
93   psrlw      mm0,1
94   psrlw      mm1,1
95   pand       mm0,mm5
96   pand       mm1,mm5
97   paddusb    mm0,mm1
98   paddusb    mm0,mm6
99   movq       [edi],mm0
100   add        edi,ebx
101   add        esi,ebx
102   dec        ecx
103   jnz        .rechc1
104   emms
105 ;  add        esp, LocalFrameSize
106   pop        ebx
107   pop        ecx
108   pop        edi
109   pop        esi
110   ret
111
112
113
114 %assign RegisterStorageSize  20
115 %assign source                    LocalFrameSize + RegisterStorageSize +  4
116 %assign dest                      LocalFrameSize + RegisterStorageSize +  8
117 %assign lx                        LocalFrameSize + RegisterStorageSize + 12
118 %assign lx2                       LocalFrameSize + RegisterStorageSize + 16
119 %assign h                         LocalFrameSize + RegisterStorageSize + 20
120
121   align 16
122 recva_mmx:
123   push       esi
124   push       edi
125   push       ecx
126   push       ebx
127   push       edx
128   mov        esi, [esp+source]
129   mov        edi, [esp+dest]
130   mov        ecx, [esp+h]
131   mov        ebx, [esp+lx2]
132   mov        edx, [esp+lx]
133   movq       mm7, [MASK_AND]
134   movq       mm6, [ADD_1]
135 .recva1:
136   movq       mm0,[esi]
137   movq       mm1,[esi+edx]
138   movq       mm2,[esi+8]
139   movq       mm3,[esi+edx+8]
140   movq       mm4,[edi]
141   movq       mm5,[edi+8]
142   psrlw      mm0,1
143   psrlw      mm1,1
144   psrlw      mm2,1
145   psrlw      mm3,1
146   psrlw      mm4,1
147   psrlw      mm5,1
148   pand       mm0,mm7
149   pand       mm1,mm7
150   pand       mm2,mm7
151   pand       mm3,mm7
152   pand       mm4,mm7
153   pand       mm5,mm7
154   paddusb    mm0,mm1
155   paddusb    mm2,mm3
156   paddusb    mm0,mm6
157   paddusb    mm2,mm6
158   psrlw      mm0,1
159   psrlw      mm2,1
160   pand       mm0,mm7
161   pand       mm2,mm7
162   paddusb    mm4,mm0
163   paddusb    mm5,mm2
164   paddusb    mm4,mm6
165   paddusb    mm5,mm6
166   movq       [edi],mm4
167   movq       [edi+8],mm5
168   add        edi,ebx
169   add        esi,ebx
170   dec        ecx
171   jnz        near .recva1
172   emms
173   pop        edx
174   pop        ebx
175   pop        ecx
176   pop        edi
177   pop        esi
178   ret
179
180   align 16
181 recvac_mmx:
182   push       esi
183   push       edi
184   push       ecx
185   push       ebx
186   push       edx
187   mov        esi, [esp+source]
188   mov        edi, [esp+dest]
189   mov        ecx, [esp+h]
190   mov        ebx, [esp+lx2]
191   mov        edx, [esp+lx]
192   movq       mm5, [MASK_AND]
193   movq       mm6, [ADD_1]
194 .recvac1:
195   movq       mm0,[esi]
196   movq       mm1,[esi+edx]
197   movq       mm4,[edi]
198   psrlw      mm0,1
199   psrlw      mm1,1
200   psrlw      mm4,1
201   pand       mm0,mm5
202   pand       mm1,mm5
203   pand       mm4,mm5
204   paddusb    mm0,mm1
205   paddusb    mm0,mm6
206   psrlw      mm0,1
207   pand       mm0,mm5
208   paddusb    mm4,mm0
209   paddusb    mm4,mm6
210   movq       [edi],mm4
211   add        edi,ebx
212   add        esi,ebx
213   dec        ecx
214   jnz        .recvac1
215   emms
216   pop        edx
217   pop        ebx
218   pop        ecx
219   pop        edi
220   pop        esi
221   ret
222
223 %assign RegisterStorageSize  20
224 %assign rfp                       LocalFrameSize + RegisterStorageSize +  4
225 %assign bp                        LocalFrameSize + RegisterStorageSize +  8
226 %assign iincr                     LocalFrameSize + RegisterStorageSize + 12
227
228 ; FIXME clipping needs to be done
229
230   align 16
231 add_block_mmx:
232   push       esi
233   push       edi
234   push       ecx
235   push       ebx
236   push       edx
237   mov        esi, [esp+bp]
238   mov        edi, [esp+rfp]
239   mov        ebx, [esp+iincr]
240 ;  movq       mm7, [PLUS_384]
241   mov        ecx,8
242   pxor        mm2,mm2           ; clear
243 %rep 8
244   movq       mm0, [edi]         ; get dest
245   movq       mm1,mm0            
246   punpcklbw  mm0,mm2
247   punpckhbw  mm1,mm2
248   paddsw     mm0, [esi]
249   paddsw     mm1, [esi+8]
250 ;  paddsw     mm0, mm7
251 ;  paddsw     mm1, mm7
252   packuswb   mm0,mm1         
253   movq       [edi], mm0
254   add        edi,ebx
255   add        esi,16
256 %endrep
257   emms
258   pop        edx
259   pop        ebx
260   pop        ecx
261   pop        edi
262   pop        esi
263   ret
264
265   align 16
266 set_block_mmx:
267   push       esi
268   push       edi
269   push       ecx
270   push       ebx
271   push       edx
272   mov        esi, [esp+bp]
273   mov        edi, [esp+rfp]
274   mov        ebx, [esp+iincr]
275   movq       mm7, [PLUS_128]
276 %rep 4
277   movq       mm0, [esi]
278   movq       mm1, [esi+8]
279   paddsw     mm0, mm7
280   movq       mm2, [esi+16]
281   paddsw     mm1, mm7
282   movq       mm3, [esi+24]
283   paddsw     mm2, mm7
284   packuswb   mm0, mm1
285   paddsw     mm3, mm7
286   movq       [edi], mm0
287   packuswb   mm2, mm3
288   add        edi, ebx
289   add        esi, 32
290   movq       [edi], mm2
291   add        edi, ebx
292 %endrep
293   emms
294   pop        edx
295   pop        ebx
296   pop        ecx
297   pop        edi
298   pop        esi
299   ret
300
301