]> git.sesse.net Git - ffmpeg/blob - libavcodec/x86/cfhddsp.asm
avcodec/x86/cfhddsp: try to fix build on x32
[ffmpeg] / libavcodec / x86 / cfhddsp.asm
1 ;******************************************************************************
2 ;* x86-optimized functions for the CFHD decoder
3 ;* Copyright (c) 2020 Paul B Mahol
4 ;*
5 ;* This file is part of FFmpeg.
6 ;*
7 ;* FFmpeg 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.1 of the License, or (at your option) any later version.
11 ;*
12 ;* FFmpeg 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 FFmpeg; if not, write to the Free Software
19 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 ;******************************************************************************
21
22 %include "libavutil/x86/x86util.asm"
23
24 SECTION_RODATA
25
26 factor_p1_n1: dw 1, -1, 1, -1, 1, -1, 1, -1,
27 factor_n1_p1: dw -1, 1, -1, 1, -1, 1, -1, 1,
28 factor_p11_n4: dw 11, -4, 11, -4, 11, -4, 11, -4,
29 factor_p5_p4: dw 5, 4, 5, 4, 5, 4, 5, 4,
30 pd_4: times 4 dd 4
31 pw_1: times 8 dw 1
32 pw_0: times 8 dw 0
33 pw_1023: times 8 dw 1023
34 pw_4095: times 8 dw 4095
35
36 SECTION .text
37
38 %macro CFHD_HORIZ_FILTER 1
39 %if %1 == 1023
40 cglobal cfhd_horiz_filter_clip10, 5, 6, 8 + 4 * ARCH_X86_64, output, low, high, width, bpc
41     DEFINE_ARGS    output, low, high, width, x, temp
42     shl        widthd, 1
43 %define ostrideq widthq
44 %define lwidthq  widthq
45 %define hwidthq  widthq
46 %elif %1 == 4095
47 cglobal cfhd_horiz_filter_clip12, 5, 6, 8 + 4 * ARCH_X86_64, output, low, high, width, bpc
48     DEFINE_ARGS    output, low, high, width, x, temp
49     shl        widthd, 1
50 %define ostrideq widthq
51 %define lwidthq  widthq
52 %define hwidthq  widthq
53 %else
54 %if ARCH_X86_64
55 cglobal cfhd_horiz_filter, 11, 11, 12, output, ostride, low, lwidth, high, hwidth, width, height
56 DEFINE_ARGS    output, ostride, low, lwidth, high, hwidth, width, height, x, y, temp
57     shl  ostrided, 1
58     shl   lwidthd, 1
59     shl   hwidthd, 1
60     shl    widthd, 1
61
62     mov        yq, heightq
63     neg        yq
64 %else
65 cglobal cfhd_horiz_filter, 7, 7, 8, output, x, low, y, high, temp, width, height
66     shl        xd, 1
67     shl        yd, 1
68     shl     tempd, 1
69     shl    widthd, 1
70
71     mov       xmp, xq
72     mov       ymp, yq
73     mov    tempmp, tempq
74
75     mov        yd, r7m
76     neg        yq
77
78 %define ostrideq xm
79 %define lwidthq  ym
80 %define hwidthq  tempm
81 %endif
82 %endif
83
84 %if ARCH_X86_64
85     mova       m8, [factor_p1_n1]
86     mova       m9, [factor_n1_p1]
87     mova      m10, [pw_1]
88     mova      m11, [pd_4]
89 %endif
90
91 %if %1 == 0
92 .looph:
93 %endif
94     movsx          xq, word [lowq]
95     imul           xq, 11
96
97     movsx       tempq, word [lowq + 2]
98     imul        tempq, -4
99     add         tempq, xq
100
101     movsx          xq, word [lowq + 4]
102     add         tempq, xq
103     add         tempq, 4
104     sar         tempq, 3
105
106     movsx          xq, word [highq]
107     add         tempq, xq
108     sar         tempq, 1
109
110 %if %1
111     movd          xm0, tempd
112     CLIPW          m0, [pw_0], [pw_%1]
113     pextrw      tempd, xm0, 0
114 %endif
115     mov  word [outputq], tempw
116
117     movsx          xq, word [lowq]
118     imul           xq, 5
119
120     movsx       tempq, word [lowq + 2]
121     imul        tempq, 4
122     add         tempq, xq
123
124     movsx          xq, word [lowq + 4]
125     sub         tempq, xq
126     add         tempq, 4
127     sar         tempq, 3
128
129     movsx          xq, word [highq]
130     sub         tempq, xq
131     sar         tempq, 1
132
133 %if %1
134     movd          xm0, tempd
135     CLIPW          m0, [pw_0], [pw_%1]
136     pextrw      tempd, xm0, 0
137 %endif
138     mov  word [outputq + 2], tempw
139
140     mov            xq, 0
141
142 .loop:
143     movu           m4, [lowq + xq]
144     movu           m1, [lowq + xq + 4]
145
146     mova           m5, m4
147     punpcklwd      m4, m1
148     punpckhwd      m5, m1
149
150     mova           m6, m4
151     mova           m7, m5
152
153 %if ARCH_X86_64
154     pmaddwd        m4, m8
155     pmaddwd        m5, m8
156     pmaddwd        m6, m9
157     pmaddwd        m7, m9
158
159     paddd          m4, m11
160     paddd          m5, m11
161     paddd          m6, m11
162     paddd          m7, m11
163 %else
164     pmaddwd        m4, [factor_p1_n1]
165     pmaddwd        m5, [factor_p1_n1]
166     pmaddwd        m6, [factor_n1_p1]
167     pmaddwd        m7, [factor_n1_p1]
168
169     paddd          m4, [pd_4]
170     paddd          m5, [pd_4]
171     paddd          m6, [pd_4]
172     paddd          m7, [pd_4]
173 %endif
174
175     psrad          m4, 3
176     psrad          m5, 3
177     psrad          m6, 3
178     psrad          m7, 3
179
180     movu           m2, [lowq + xq + 2]
181     movu           m3, [highq + xq + 2]
182
183     mova           m0, m2
184     punpcklwd      m2, m3
185     punpckhwd      m0, m3
186
187     mova           m1, m2
188     mova           m3, m0
189
190 %if ARCH_X86_64
191     pmaddwd        m2, m10
192     pmaddwd        m0, m10
193     pmaddwd        m1, m8
194     pmaddwd        m3, m8
195 %else
196     pmaddwd        m2, [pw_1]
197     pmaddwd        m0, [pw_1]
198     pmaddwd        m1, [factor_p1_n1]
199     pmaddwd        m3, [factor_p1_n1]
200 %endif
201
202     paddd          m2, m4
203     paddd          m0, m5
204     paddd          m1, m6
205     paddd          m3, m7
206
207     psrad          m2, 1
208     psrad          m0, 1
209     psrad          m1, 1
210     psrad          m3, 1
211
212     packssdw       m2, m0
213     packssdw       m1, m3
214
215     mova           m0, m2
216     punpcklwd      m2, m1
217     punpckhwd      m0, m1
218
219 %if %1
220     CLIPW          m2, [pw_0], [pw_%1]
221     CLIPW          m0, [pw_0], [pw_%1]
222 %endif
223
224     movu  [outputq + xq * 2 + 4], m2
225     movu  [outputq + xq * 2 + mmsize + 4], m0
226
227     add            xq, mmsize
228     cmp            xq, widthq
229     jl .loop
230
231     add          lowq, widthq
232     add         highq, widthq
233     add       outputq, widthq
234     add       outputq, widthq
235
236     movsx          xq, word [lowq - 2]
237     imul           xq, 5
238
239     movsx       tempq, word [lowq - 4]
240     imul        tempq, 4
241     add         tempq, xq
242
243     movsx          xq, word [lowq - 6]
244     sub         tempq, xq
245     add         tempq, 4
246     sar         tempq, 3
247
248     movsx          xq, word [highq - 2]
249     add         tempq, xq
250     sar         tempq, 1
251
252 %if %1
253     movd          xm0, tempd
254     CLIPW          m0, [pw_0], [pw_%1]
255     pextrw      tempd, xm0, 0
256 %endif
257     mov  word [outputq - 4], tempw
258
259     movsx          xq, word [lowq - 2]
260     imul           xq, 11
261
262     movsx       tempq, word [lowq - 4]
263     imul        tempq, -4
264     add         tempq, xq
265
266     movsx          xq, word [lowq - 6]
267     add         tempq, xq
268     add         tempq, 4
269     sar         tempq, 3
270
271     movsx          xq, word [highq - 2]
272     sub         tempq, xq
273     sar         tempq, 1
274
275 %if %1
276     movd          xm0, tempd
277     CLIPW          m0, [pw_0], [pw_%1]
278     pextrw      tempd, xm0, 0
279 %endif
280     mov  word [outputq - 2], tempw
281
282 %if %1 == 0
283     sub          lowq, widthq
284     sub         highq, widthq
285     sub       outputq, widthq
286     sub       outputq, widthq
287
288     add          lowq, lwidthq
289     add         highq, hwidthq
290     add       outputq, ostrideq
291     add       outputq, ostrideq
292     add            yq, 1
293     jl .looph
294 %endif
295
296     RET
297 %endmacro
298
299 INIT_XMM sse2
300 CFHD_HORIZ_FILTER 0
301
302 INIT_XMM sse2
303 CFHD_HORIZ_FILTER 1023
304
305 INIT_XMM sse2
306 CFHD_HORIZ_FILTER 4095
307
308 INIT_XMM sse2
309 %if ARCH_X86_64
310 cglobal cfhd_vert_filter, 11, 11, 14, output, ostride, low, lwidth, high, hwidth, width, height
311 DEFINE_ARGS    output, ostride, low, lwidth, high, hwidth, width, height, x, y, pos
312     shl        ostrided, 1
313     shl         lwidthd, 1
314     shl         hwidthd, 1
315     shl          widthd, 1
316
317     dec   heightq
318
319     mova       m8, [factor_p1_n1]
320     mova       m9, [factor_n1_p1]
321     mova      m10, [pw_1]
322     mova      m11, [pd_4]
323     mova      m12, [factor_p11_n4]
324     mova      m13, [factor_p5_p4]
325 %else
326 cglobal cfhd_vert_filter, 7, 7, 8, output, x, low, y, high, pos, width, height
327     shl        xd, 1
328     shl        yd, 1
329     shl      posd, 1
330     shl    widthd, 1
331
332     mov       xmp, xq
333     mov       ymp, yq
334     mov     posmp, posq
335
336     mov        xq, r7m
337     dec        xq
338     mov   widthmp, xq
339
340 %define ostrideq xm
341 %define lwidthq  ym
342 %define hwidthq  posm
343 %define heightq  widthm
344
345 %endif
346
347     xor        xq, xq
348 .loopw:
349     xor        yq, yq
350
351     mov      posq, xq
352     movu       m0, [lowq + posq]
353     add      posq, lwidthq
354     movu       m1, [lowq + posq]
355     mova       m2, m0
356     punpcklwd  m0, m1
357     punpckhwd  m2, m1
358
359 %if ARCH_X86_64
360     pmaddwd    m0, m12
361     pmaddwd    m2, m12
362 %else
363     pmaddwd    m0, [factor_p11_n4]
364     pmaddwd    m2, [factor_p11_n4]
365 %endif
366
367     pxor       m4, m4
368     add      posq, lwidthq
369     movu       m1, [lowq + posq]
370     mova       m3, m4
371     punpcklwd  m4, m1
372     punpckhwd  m3, m1
373
374     psrad      m4, 16
375     psrad      m3, 16
376
377     paddd      m0, m4
378     paddd      m2, m3
379
380     paddd      m0, [pd_4]
381     paddd      m2, [pd_4]
382
383     psrad      m0, 3
384     psrad      m2, 3
385
386     mov      posq, xq
387     pxor       m4, m4
388     movu       m1, [highq + posq]
389     mova       m3, m4
390     punpcklwd  m4, m1
391     punpckhwd  m3, m1
392
393     psrad      m4, 16
394     psrad      m3, 16
395
396     paddd      m0, m4
397     paddd      m2, m3
398
399     psrad      m0, 1
400     psrad      m2, 1
401
402     packssdw   m0, m2
403
404     movu    [outputq + posq], m0
405
406     movu       m0, [lowq + posq]
407     add      posq, lwidthq
408     movu       m1, [lowq + posq]
409     mova       m2, m0
410     punpcklwd  m0, m1
411     punpckhwd  m2, m1
412
413 %if ARCH_X86_64
414     pmaddwd    m0, m13
415     pmaddwd    m2, m13
416 %else
417     pmaddwd    m0, [factor_p5_p4]
418     pmaddwd    m2, [factor_p5_p4]
419 %endif
420
421     pxor       m4, m4
422     add      posq, lwidthq
423     movu       m1, [lowq + posq]
424     mova       m3, m4
425     punpcklwd  m4, m1
426     punpckhwd  m3, m1
427
428     psrad      m4, 16
429     psrad      m3, 16
430
431     psubd      m0, m4
432     psubd      m2, m3
433
434     paddd      m0, [pd_4]
435     paddd      m2, [pd_4]
436
437     psrad      m0, 3
438     psrad      m2, 3
439
440     mov      posq, xq
441     pxor       m4, m4
442     movu       m1, [highq + posq]
443     mova       m3, m4
444     punpcklwd  m4, m1
445     punpckhwd  m3, m1
446
447     psrad      m4, 16
448     psrad      m3, 16
449
450     psubd      m0, m4
451     psubd      m2, m3
452
453     psrad      m0, 1
454     psrad      m2, 1
455
456     packssdw   m0, m2
457
458     add      posq, ostrideq
459     movu    [outputq + posq], m0
460
461     add        yq, 1
462 .looph:
463     mov      posq, lwidthq
464     imul     posq, yq
465     sub      posq, lwidthq
466     add      posq, xq
467
468     movu       m4, [lowq + posq]
469
470     add      posq, lwidthq
471     add      posq, lwidthq
472     movu       m1, [lowq + posq]
473
474     mova       m5, m4
475     punpcklwd  m4, m1
476     punpckhwd  m5, m1
477
478     mova       m6, m4
479     mova       m7, m5
480
481 %if ARCH_X86_64
482     pmaddwd    m4, m8
483     pmaddwd    m5, m8
484     pmaddwd    m6, m9
485     pmaddwd    m7, m9
486
487     paddd      m4, m11
488     paddd      m5, m11
489     paddd      m6, m11
490     paddd      m7, m11
491 %else
492     pmaddwd    m4, [factor_p1_n1]
493     pmaddwd    m5, [factor_p1_n1]
494     pmaddwd    m6, [factor_n1_p1]
495     pmaddwd    m7, [factor_n1_p1]
496
497     paddd      m4, [pd_4]
498     paddd      m5, [pd_4]
499     paddd      m6, [pd_4]
500     paddd      m7, [pd_4]
501 %endif
502
503     psrad      m4, 3
504     psrad      m5, 3
505     psrad      m6, 3
506     psrad      m7, 3
507
508     sub      posq, lwidthq
509     movu       m0, [lowq + posq]
510
511     mov      posq, hwidthq
512     imul     posq, yq
513     add      posq, xq
514     movu       m1, [highq + posq]
515
516     mova       m2, m0
517     punpcklwd  m0, m1
518     punpckhwd  m2, m1
519
520     mova       m1, m0
521     mova       m3, m2
522
523 %if ARCH_X86_64
524     pmaddwd    m0, m10
525     pmaddwd    m2, m10
526     pmaddwd    m1, m8
527     pmaddwd    m3, m8
528 %else
529     pmaddwd    m0, [pw_1]
530     pmaddwd    m2, [pw_1]
531     pmaddwd    m1, [factor_p1_n1]
532     pmaddwd    m3, [factor_p1_n1]
533 %endif
534
535     paddd      m0, m4
536     paddd      m2, m5
537     paddd      m1, m6
538     paddd      m3, m7
539
540     psrad      m0, 1
541     psrad      m2, 1
542     psrad      m1, 1
543     psrad      m3, 1
544
545     packssdw   m0, m2
546     packssdw   m1, m3
547
548     mov      posq, ostrideq
549     imul     posq, 2
550     imul     posq, yq
551     add      posq, xq
552
553     movu    [outputq + posq], m0
554     add      posq, ostrideq
555     movu    [outputq + posq], m1
556
557     add        yq, 1
558     cmp        yq, heightq
559     jl .looph
560
561     mov      posq, lwidthq
562     imul     posq, yq
563     add      posq, xq
564     movu       m0, [lowq + posq]
565     sub      posq, lwidthq
566     movu       m1, [lowq + posq]
567     mova       m2, m0
568     punpcklwd  m0, m1
569     punpckhwd  m2, m1
570
571 %if ARCH_X86_64
572     pmaddwd    m0, m13
573     pmaddwd    m2, m13
574 %else
575     pmaddwd    m0, [factor_p5_p4]
576     pmaddwd    m2, [factor_p5_p4]
577 %endif
578
579     pxor       m4, m4
580     sub      posq, lwidthq
581     movu       m1, [lowq + posq]
582     mova       m3, m4
583     punpcklwd  m4, m1
584     punpckhwd  m3, m1
585
586     psrad      m4, 16
587     psrad      m3, 16
588
589     psubd      m0, m4
590     psubd      m2, m3
591
592 %if ARCH_X86_64
593     paddd      m0, m11
594     paddd      m2, m11
595 %else
596     paddd      m0, [pd_4]
597     paddd      m2, [pd_4]
598 %endif
599
600     psrad      m0, 3
601     psrad      m2, 3
602
603     mov      posq, hwidthq
604     imul     posq, yq
605     add      posq, xq
606     pxor       m4, m4
607     movu       m1, [highq + posq]
608     mova       m3, m4
609     punpcklwd  m4, m1
610     punpckhwd  m3, m1
611
612     psrad      m4, 16
613     psrad      m3, 16
614
615     paddd      m0, m4
616     paddd      m2, m3
617
618     psrad      m0, 1
619     psrad      m2, 1
620
621     packssdw   m0, m2
622
623     mov      posq, ostrideq
624     imul     posq, 2
625     imul     posq, yq
626     add      posq, xq
627     movu    [outputq + posq], m0
628
629     mov      posq, lwidthq
630     imul     posq, yq
631     add      posq, xq
632     movu       m0, [lowq + posq]
633     sub      posq, lwidthq
634     movu       m1, [lowq + posq]
635     mova       m2, m0
636     punpcklwd  m0, m1
637     punpckhwd  m2, m1
638
639 %if ARCH_X86_64
640     pmaddwd    m0, m12
641     pmaddwd    m2, m12
642 %else
643     pmaddwd    m0, [factor_p11_n4]
644     pmaddwd    m2, [factor_p11_n4]
645 %endif
646
647     pxor       m4, m4
648     sub      posq, lwidthq
649     movu       m1, [lowq + posq]
650     mova       m3, m4
651     punpcklwd  m4, m1
652     punpckhwd  m3, m1
653
654     psrad      m4, 16
655     psrad      m3, 16
656
657     paddd      m0, m4
658     paddd      m2, m3
659
660 %if ARCH_X86_64
661     paddd      m0, m11
662     paddd      m2, m11
663 %else
664     paddd      m0, [pd_4]
665     paddd      m2, [pd_4]
666 %endif
667
668     psrad      m0, 3
669     psrad      m2, 3
670
671     mov      posq, hwidthq
672     imul     posq, yq
673     add      posq, xq
674     pxor       m4, m4
675     movu       m1, [highq + posq]
676     mova       m3, m4
677     punpcklwd  m4, m1
678     punpckhwd  m3, m1
679
680     psrad      m4, 16
681     psrad      m3, 16
682
683     psubd      m0, m4
684     psubd      m2, m3
685
686     psrad      m0, 1
687     psrad      m2, 1
688
689     packssdw   m0, m2
690
691     mov      posq, ostrideq
692     imul     posq, 2
693     imul     posq, yq
694     add      posq, ostrideq
695     add      posq, xq
696     movu    [outputq + posq], m0
697
698     add        xq, mmsize
699     cmp        xq, widthq
700     jl .loopw
701     RET