Import TinyPTC 0.7.3 sources, switch from OpenGL to TinyPTC for now.
[ccbs] / bigscreen / tinyptc / yv12.s
1 ;
2 ; TinyPTC x11 v0.7.3 MMX-Optimized YV12 converter
3 ; Copyright (C) 2002 Fred Howell <foohoo@shaw.ca>
4 ;
5 ; http://www.sourceforge.net/projects/tinyptc/
6 ;
7 ; This library is free software; you can redistribute it and/or
8 ; modify it under the terms of the GNU Lesser General Public
9 ; License as published by the Free Software Foundation; either
10 ; version 2 of the License, or (at your option) any later version.
11 ;
12 ; This library is distributed in the hope that it will be useful,
13 ; but WITHOUT ANY WARRANTY; without even the implied warranty of
14 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 ; Lesser General Public License for more details.
16 ;
17 ; You should have received a copy of the GNU Lesser General Public
18 ; License along with this library; if not, write to the Free Software
19 ; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 ;
21
22 bits 32
23
24 global convert_yv12_mmx
25
26 section .data
27
28 align 16
29
30 ;       static short ygr0bcoff[] = {33058/2,16390/2,0,6405/2};
31 ;       static short vgr0bcoff[] = {-24110/2,28781/2,0,-4671/2};
32 ;       static short ugr0bcoff[] = {-19068/2,-9713/2,0,28781/2};
33 ;       static short yb0grcoff[] = {6405/2,0,33058/2,16390/2};
34 ;       static short vb0grcoff[] = {-4671/2,0,-24110/2,28781/2};
35 ;       static short ub0grcoff[] = {28781/2,-19068/2,-9713/2,0};
36 ;
37 ;       static unsigned short add2w[] = {1,1,1,1};
38 ;       static short aoff[] = {16,128,16,128};
39 ;       static unsigned char bmask[] = {0xff, 0, 0, 0, 0, 0, 0, 0};
40 ;       static unsigned short grmask[] = {0,0xffff,0,0};
41
42 thezero dw  0,0,0,0
43 ygr0bcoff dw 0x4091,0x2003,0x0000,0x0c82
44 ugr0bcoff dw 0xdac2,0xed08,0x0000,0x3836
45 vgr0bcoff dw 0xd0e9,0x3836,0x0000,0xf6e1
46 yb0grcoff dw 0x0c82,0x0000,0x4091,0x2003
47 ub0grcoff dw 0x3836,0x0000,0xdac2,0xed08
48 vb0grcoff dw 0xf6e1,0x0000,0xd0e9,0x3836
49 yoff  dw 0x0010,0x0010,0x0010,0x0010
50 uvoff  dw 0x0080,0x0080,0x0080,0x0080
51 add2w dw 1,1,1,1
52 grmask dw  0,0xffff,0,0
53 bmask  db 0xff,0,0,0, 0,0,0,0
54
55
56 section text
57
58 align 16
59
60 convert_yv12_mmx:
61
62 push ebp
63 push eax
64 push ebx
65 push ecx
66 push edx
67 push edi
68 push esi
69
70 ;// initialisation du mm7 à zero
71 pxor mm7,mm7
72
73 %assign _P 7*4
74 mov edx, [esp+_P+ 4]
75 mov ebx, [esp+_P+8]
76 mov ebp,[esp+_P+12]
77 mov eax,[esp+_P+16]
78 mov ecx,[esp+_P+20]
79 mov edi,ecx
80 mov esi,ecx
81 shr ecx, 3
82 shl edi, 2
83
84
85 .while:
86 ; 1ere quad 1ere ligne
87         movq mm3, [edx];
88         movq mm1,mm3;
89         psrlq mm3,8;
90         movq mm4,mm1;
91         psrlq mm1, 24;
92         pand mm4, [bmask];
93         pand mm1, [grmask];
94         por  mm4, mm1;
95         punpcklbw mm3, [thezero];
96         punpcklbw mm4, [thezero];
97
98 ; Y
99         movq mm5, mm3;
100                         
101         pmaddwd mm5, [ygr0bcoff];
102
103         movq mm1, mm4;
104
105         pmaddwd mm1, [yb0grcoff];
106
107         paddd mm5, mm1
108         psrad mm5,15;
109                         
110
111 ; U
112         movq mm6, mm3;
113                         
114         pmaddwd mm6, [ugr0bcoff];
115
116         movq mm1, mm4;
117
118         pmaddwd mm1, [ub0grcoff];
119
120         paddd mm6, mm1;
121         psrad mm6,15;
122
123
124 ; V
125         
126         pmaddwd mm3, [vgr0bcoff];
127
128
129         pmaddwd mm4, [vb0grcoff];
130
131         paddd mm3, mm4;
132         psrad mm3,15;
133
134         movq mm7, mm3;
135
136 ; 1ere quad 2eme ligne
137         movq mm3, [edx+edi];
138         movq mm1,mm3;
139         psrlq mm3,8;
140         movq mm4,mm1;
141         psrlq mm1, 24;
142         pand mm4, [bmask];
143         pand mm1, [grmask];
144         por  mm4, mm1;
145         punpcklbw mm3, [thezero];
146         punpcklbw mm4, [thezero];
147
148
149 ; Y
150         movq mm2, mm3;
151                         
152         pmaddwd mm2, [ygr0bcoff];
153
154         movq mm1, mm4;
155
156         pmaddwd mm1, [yb0grcoff];
157
158         paddd mm2, mm1
159         psrad mm2,15;
160
161 ; U
162         movq mm0, mm3;
163                         
164         pmaddwd mm0, [ugr0bcoff];
165
166         movq mm1, mm4;
167
168         pmaddwd mm1, [ub0grcoff];
169
170         paddd mm0, mm1;
171         psrad mm0,15;
172
173         packssdw mm6,mm0;
174         pmaddwd mm6,[add2w];
175
176         packssdw mm6,[thezero];
177 ; V
178         
179         pmaddwd mm3, [vgr0bcoff];
180
181
182         pmaddwd mm4, [vb0grcoff];
183
184         paddd mm3, mm4;
185         psrad mm3,15;
186
187         packssdw mm7,mm3;
188         pmaddwd mm7,[add2w];
189
190         packssdw mm7,[thezero];
191
192 ; 2eme quad 1ere ligne
193         movq mm3, [edx+8];
194         movq mm1,mm3;
195         psrlq mm3,8;
196         movq mm4,mm1;
197         psrlq mm1, 24;
198         pand mm4, [bmask];
199         pand mm1, [grmask];
200         por  mm4, mm1;
201         punpcklbw mm3, [thezero];
202         punpcklbw mm4, [thezero];
203
204 ; Y
205         movq mm0, mm3;
206                         
207         pmaddwd mm0, [ygr0bcoff];
208
209         movq mm1, mm4;
210
211         pmaddwd mm1, [yb0grcoff];
212
213         paddd mm0, mm1
214         psrad mm0,15;
215         packssdw mm5,mm0
216                         
217         paddw mm5,[yoff]
218         packuswb mm5,mm5
219
220         movd [ebx], mm5
221
222 ; U
223         movq mm0, mm3;
224                         
225         pmaddwd mm0, [ugr0bcoff];
226
227         movq mm1, mm4;
228
229         pmaddwd mm1, [ub0grcoff];
230
231         paddd mm0, mm1;
232         psrad mm0,15;
233
234         packssdw mm0,mm0
235         psllq mm0,32
236
237         paddw mm6,mm0
238
239
240 ; V
241         
242         pmaddwd mm3, [vgr0bcoff];
243
244
245         pmaddwd mm4, [vb0grcoff];
246
247         paddd mm3, mm4;
248         psrad mm3,15;
249
250         packssdw mm3,mm3
251         psllq mm3,32
252
253         paddw mm7,mm3
254
255 ; 2eme quad 2eme ligne
256         movq mm3, [edx+edi+8];
257         movq mm1,mm3;
258         psrlq mm3,8;
259         movq mm4,mm1;
260         psrlq mm1, 24;
261         pand mm4, [bmask];
262         pand mm1, [grmask];
263         por  mm4, mm1;
264         punpcklbw mm3, [thezero];
265         punpcklbw mm4, [thezero];
266
267
268 ; Y
269         movq mm0, mm3;
270                         
271         pmaddwd mm0, [ygr0bcoff];
272
273         movq mm1, mm4;
274
275         pmaddwd mm1, [yb0grcoff];
276
277         paddd mm0, mm1
278         psrad mm0,15;
279         packssdw mm2,mm0
280
281         paddw mm2,[yoff]
282         packuswb mm2,mm2
283
284         movd [ebx+esi], mm2
285
286 ; U
287         movq mm0, mm3;
288                         
289         pmaddwd mm0, [ugr0bcoff];
290
291         movq mm1, mm4;
292
293         pmaddwd mm1, [ub0grcoff];
294
295         paddd mm0, mm1;
296         psrad mm0,15;
297
298         packssdw mm0,mm0
299         psllq mm0,32
300
301         paddw mm6,mm0
302         pmaddwd mm6,[add2w]
303         packssdw mm6,[thezero]
304 ; V
305         
306         pmaddwd mm3, [vgr0bcoff];
307
308
309         pmaddwd mm4, [vb0grcoff];
310
311         paddd mm3, mm4;
312         psrad mm3,15;
313
314         packssdw mm3,mm3
315         psllq mm3,32
316
317         paddw mm7,mm3
318         pmaddwd mm7,[add2w]
319         packssdw mm7,[thezero]
320
321 ; 3eme quad 1ere ligne
322         movq mm3, [edx+16];
323         movq mm1,mm3;
324         psrlq mm3,8;
325         movq mm4,mm1;
326         psrlq mm1, 24;
327         pand mm4, [bmask];
328         pand mm1, [grmask];
329         por  mm4, mm1;
330         punpcklbw mm3, [thezero];
331         punpcklbw mm4, [thezero];
332
333 ; Y
334         movq mm5, mm3;
335                         
336         pmaddwd mm5, [ygr0bcoff];
337
338         movq mm1, mm4;
339
340         pmaddwd mm1, [yb0grcoff];
341
342         paddd mm5, mm1
343         psrad mm5,15;
344                         
345
346 ; U
347         movq mm0, mm3;
348                         
349         pmaddwd mm0, [ugr0bcoff];
350
351         movq mm1, mm4;
352
353         pmaddwd mm1, [ub0grcoff];
354
355         paddd mm0, mm1;
356         psrad mm0,15;
357
358         packssdw mm0,mm0
359         pmaddwd mm0,[add2w]
360         psllq mm0,32
361         paddw mm6, mm0
362
363 ; V
364         
365         pmaddwd mm3, [vgr0bcoff];
366
367
368         pmaddwd mm4, [vb0grcoff];
369
370         paddd mm3, mm4;
371         psrad mm3,15;
372
373         packssdw mm3,mm3
374         pmaddwd mm3,[add2w]
375         psllq mm3,32
376         paddw mm7, mm3
377
378 ; 3eme quad 2eme ligne
379         movq mm3, [edx+edi+16];
380         movq mm1,mm3;
381         psrlq mm3,8;
382         movq mm4,mm1;
383         psrlq mm1, 24;
384         pand mm4, [bmask];
385         pand mm1, [grmask];
386         por  mm4, mm1;
387         punpcklbw mm3, [thezero];
388         punpcklbw mm4, [thezero];
389
390
391 ; Y
392         movq mm2, mm3;
393                         
394         pmaddwd mm2, [ygr0bcoff];
395
396         movq mm1, mm4;
397
398         pmaddwd mm1, [yb0grcoff];
399
400         paddd mm2, mm1
401         psrad mm2,15;
402
403 ; U
404         movq mm0, mm3;
405                         
406         pmaddwd mm0, [ugr0bcoff];
407
408         movq mm1, mm4;
409
410         pmaddwd mm1, [ub0grcoff];
411
412         paddd mm0, mm1;
413         psrad mm0,15;
414
415         packssdw mm0,mm0
416         pmaddwd mm0,[add2w]
417         psllq mm0,32
418         paddw mm6, mm0
419 ; V
420         
421         pmaddwd mm3, [vgr0bcoff];
422
423
424         pmaddwd mm4, [vb0grcoff];
425
426         paddd mm3, mm4;
427         psrad mm3,15;
428
429         packssdw mm3,mm3
430         pmaddwd mm3,[add2w]
431         psllq mm3,32
432         paddw mm7, mm3
433
434 ; 4eme quad 1ere ligne
435         movq mm3, [edx+24];
436         movq mm1,mm3;
437         psrlq mm3,8;
438         movq mm4,mm1;
439         psrlq mm1, 24;
440         pand mm4, [bmask];
441         pand mm1, [grmask];
442         por  mm4, mm1;
443         punpcklbw mm3, [thezero];
444         punpcklbw mm4, [thezero];
445
446 ; Y
447         movq mm0, mm3;
448                         
449         pmaddwd mm0, [ygr0bcoff];
450
451         movq mm1, mm4;
452
453         pmaddwd mm1, [yb0grcoff];
454
455         paddd mm0, mm1
456         psrad mm0,15;
457         packssdw mm5,mm0
458                         
459         paddw mm5,[yoff]
460         packuswb mm5,mm5
461
462         movd [ebx+4], mm5
463
464 ; U
465         movq mm0, mm3;
466                         
467         pmaddwd mm0, [ugr0bcoff];
468
469         movq mm1, mm4;
470
471         pmaddwd mm1, [ub0grcoff];
472
473         paddd mm0, mm1;
474         psrad mm0,15;
475
476         packssdw mm0,mm0
477         pmaddwd mm0,[add2w]
478         psllq mm0,48
479         paddw mm6, mm0
480
481 ; V
482         
483         pmaddwd mm3, [vgr0bcoff];
484
485
486         pmaddwd mm4, [vb0grcoff];
487
488         paddd mm3, mm4;
489         psrad mm3,15;
490
491         packssdw mm3,mm3
492         pmaddwd mm3,[add2w]
493         psllq mm3,48
494         paddw mm7, mm3
495
496 ; 4eme quad 2eme line
497         movq mm3, [edx+edi+24];
498         movq mm1,mm3;
499         psrlq mm3,8;
500         movq mm4,mm1;
501         psrlq mm1, 24;
502         pand mm4, [bmask];
503         pand mm1, [grmask];
504         por  mm4, mm1;
505         punpcklbw mm3, [thezero];
506         punpcklbw mm4, [thezero];
507
508
509 ; Y
510         movq mm0, mm3;
511                         
512         pmaddwd mm0, [ygr0bcoff];
513
514         movq mm1, mm4;
515
516         pmaddwd mm1, [yb0grcoff];
517
518         paddd mm0, mm1
519         psrad mm0,15;
520         packssdw mm2,mm0
521
522         paddw mm2,[yoff]
523         packuswb mm2,mm2
524
525         movd [ebx+esi+4], mm2
526
527 ; U
528         movq mm0, mm3;
529                         
530         pmaddwd mm0, [ugr0bcoff];
531
532         movq mm1, mm4;
533
534         pmaddwd mm1, [ub0grcoff];
535
536         paddd mm0, mm1;
537         psrad mm0,15;
538
539         packssdw mm0,mm0
540         pmaddwd mm0,[add2w]
541         psllq mm0,48
542         paddw mm6, mm0
543
544         psraw mm6,2
545         paddw mm6, [uvoff]
546         packuswb mm6,mm6
547         movd [eax],mm6
548 ; V
549         
550         pmaddwd mm3, [vgr0bcoff];
551
552
553         pmaddwd mm4, [vb0grcoff];
554
555         paddd mm3, mm4;
556         psrad mm3,15;
557
558         packssdw mm3,mm3
559         pmaddwd mm3,[add2w]
560         psllq mm3,48
561         paddw mm7, mm3
562
563         psraw mm7,2
564         paddw mm7, [uvoff]
565         packuswb mm7,mm7
566         movd [ebp],mm7
567
568
569         dec ecx
570
571         cmp ecx,0
572
573 jz .fin_while
574
575 ; preparations pour les 4 quads suivantes
576         lea edx, [edx + 32];
577         lea ebx, [ebx + 8];
578         lea eax, [eax + 4];
579         lea ebp, [ebp + 4];
580         
581 jmp .while
582
583 .fin_while:
584 emms
585
586 pop esi
587 pop edi
588 pop edx
589 pop ecx
590 pop ebx
591 pop eax
592 pop ebp
593
594 ret                  ;//The End