29a8c56202ae2e427d514d1d3dd4553ca87a47a1
[ffmpeg.git] / libavfilter / x86 / vf_stereo3d.asm
1 ;*****************************************************************************
2 ;* x86-optimized functions for stereo3d filter
3 ;*
4 ;* Copyright (C) 2015 Paul B Mahol
5 ;*
6 ;* This file is part of FFmpeg.
7 ;*
8 ;* FFmpeg is free software; you can redistribute it and/or
9 ;* modify it under the terms of the GNU Lesser General Public
10 ;* License as published by the Free Software Foundation; either
11 ;* version 2.1 of the License, or (at your option) any later version.
12 ;*
13 ;* FFmpeg 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 GNU
16 ;* Lesser General Public License for more details.
17 ;*
18 ;* You should have received a copy of the GNU Lesser General Public
19 ;* License along with FFmpeg; if not, write to the Free Software
20 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 ;*****************************************************************************
22
23 %include "libavutil/x86/x86util.asm"
24
25 %if ARCH_X86_64
26
27 SECTION_RODATA
28
29 ; rgbrgbrgbrgb
30 ; rrrrggggbbbb
31
32 shuf: db 0, 4, 8, 1,5, 9, 2, 6,10,3, 7,11,-1,-1,-1,-1
33 ex_r: db 0,-1,-1,-1,3,-1,-1,-1,6,-1,-1,-1, 9,-1,-1,-1
34 ex_g: db 1,-1,-1,-1,4,-1,-1,-1,7,-1,-1,-1,10,-1,-1,-1
35 ex_b: db 2,-1,-1,-1,5,-1,-1,-1,8,-1,-1,-1,11,-1,-1,-1
36
37 SECTION .text
38
39 INIT_XMM sse4
40 cglobal anaglyph, 6, 10, 14, 2*6*mmsize, dst, lsrc, rsrc, dst_linesize, l_linesize, r_linesize, width, height, o, cnt
41 %define ana_matrix_rq r6q
42 %define ana_matrix_gq r7q
43 %define ana_matrix_bq r8q
44     mov        ana_matrix_rq, r8m
45     mov        ana_matrix_gq, r9m
46     mov        ana_matrix_bq, r10m
47     movu                  m3, [ana_matrix_rq+ 0]
48     movq                  m5, [ana_matrix_rq+16]
49     pshufd                m0, m3, q0000
50     pshufd                m1, m3, q1111
51     pshufd                m2, m3, q2222
52     pshufd                m3, m3, q3333
53     pshufd                m4, m5, q0000
54     pshufd                m5, m5, q1111
55     mova      [rsp+mmsize*0], m0
56     mova      [rsp+mmsize*1], m1
57     mova      [rsp+mmsize*2], m2
58     mova      [rsp+mmsize*3], m3
59     mova      [rsp+mmsize*4], m4
60     mova      [rsp+mmsize*5], m5
61
62     movu                  m3, [ana_matrix_gq+ 0]
63     movq                  m5, [ana_matrix_gq+16]
64     pshufd                m0, m3, q0000
65     pshufd                m1, m3, q1111
66     pshufd                m2, m3, q2222
67     pshufd                m3, m3, q3333
68     pshufd                m4, m5, q0000
69     pshufd                m5, m5, q1111
70     mova     [rsp+mmsize*6 ], m0
71     mova     [rsp+mmsize*7 ], m1
72     mova     [rsp+mmsize*8 ], m2
73     mova     [rsp+mmsize*9 ], m3
74     mova     [rsp+mmsize*10], m4
75     mova     [rsp+mmsize*11], m5
76
77     movu                 m11, [ana_matrix_bq+ 0]
78     movq                 m13, [ana_matrix_bq+16]
79     pshufd                m8, m11, q0000
80     pshufd                m9, m11, q1111
81     pshufd               m10, m11, q2222
82     pshufd               m11, m11, q3333
83     pshufd               m12, m13, q0000
84     pshufd               m13, m13, q1111
85     mov               widthd, dword widthm
86     mov              heightd, dword heightm
87
88 .nextrow:
89     mov                   od, widthd
90     xor                 cntd, cntd
91
92     .loop:
93         movu                 m0, [lsrcq+cntq]
94         pshufb               m1, m0, [ex_r]
95         pshufb               m2, m0, [ex_g]
96         pshufb               m3, m0, [ex_b]
97         movu                 m0, [rsrcq+cntq]
98         pshufb               m4, m0, [ex_r]
99         pshufb               m5, m0, [ex_g]
100         pshufb               m0, [ex_b]
101         pmulld               m1, [rsp+mmsize*0]
102         pmulld               m2, [rsp+mmsize*1]
103         pmulld               m3, [rsp+mmsize*2]
104         pmulld               m4, [rsp+mmsize*3]
105         pmulld               m5, [rsp+mmsize*4]
106         pmulld               m0, [rsp+mmsize*5]
107         paddd                m1, m2
108         paddd                m3, m4
109         paddd                m5, m0
110         paddd                m1, m3
111         paddd                m1, m5
112
113         movu                 m0, [lsrcq+cntq]
114         pshufb               m7, m0, [ex_r]
115         pshufb               m2, m0, [ex_g]
116         pshufb               m3, m0, [ex_b]
117         movu                 m0, [rsrcq+cntq]
118         pshufb               m4, m0, [ex_r]
119         pshufb               m5, m0, [ex_g]
120         pshufb               m0, [ex_b]
121         pmulld               m7, [rsp+mmsize*6]
122         pmulld               m2, [rsp+mmsize*7]
123         pmulld               m3, [rsp+mmsize*8]
124         pmulld               m4, [rsp+mmsize*9]
125         pmulld               m5, [rsp+mmsize*10]
126         pmulld               m0, [rsp+mmsize*11]
127         paddd                m7, m2
128         paddd                m3, m4
129         paddd                m5, m0
130         paddd                m7, m3
131         paddd                m7, m5
132
133         movu                 m0, [lsrcq+cntq]
134         pshufb               m2, m0, [ex_r]
135         pshufb               m3, m0, [ex_g]
136         pshufb               m4, m0, [ex_b]
137         movu                 m0, [rsrcq+cntq]
138         pshufb               m5, m0, [ex_r]
139         pshufb               m6, m0, [ex_g]
140         pshufb               m0, [ex_b]
141         pmulld               m2, m8
142         pmulld               m3, m9
143         pmulld               m4, m10
144         pmulld               m5, m11
145         pmulld               m6, m12
146         pmulld               m0, m13
147         paddd                m2, m3
148         paddd                m4, m5
149         paddd                m6, m0
150         paddd                m2, m4
151         paddd                m2, m6
152
153         psrld                m1, 16
154         psrld                m7, 16
155         psrld                m2, 16
156
157         packusdw             m1, m7
158         packusdw             m2, m2
159         packuswb             m1, m2
160         pshufb               m1, [shuf]
161
162         movq      [dstq+cntq+0], m1
163         psrldq               m1, 8
164         movd      [dstq+cntq+8], m1
165         add                cntd, 12
166         sub                  od, 4
167     jg .loop
168
169     add          dstq, dst_linesizeq
170     add         lsrcq, l_linesizeq
171     add         rsrcq, r_linesizeq
172     sub       heightd, 1
173     jg .nextrow
174 REP_RET
175 %endif