]> git.sesse.net Git - ffmpeg/blob - libavcodec/x86/pngdsp.asm
celp filters: Do not read earlier than the start of the 'out' vector.
[ffmpeg] / libavcodec / x86 / pngdsp.asm
1 ;******************************************************************************
2 ;* x86 optimizations for PNG decoding
3 ;*
4 ;* Copyright (c) 2008 Loren Merritt <lorenm@u.washington.edu>
5 ;* Copyright (c) 2012 Ronald S. Bultje <rsbultje@gmail.com>
6 ;*
7 ;* This file is part of Libav.
8 ;*
9 ;* Libav is free software; you can redistribute it and/or
10 ;* modify it under the terms of the GNU Lesser General Public
11 ;* License as published by the Free Software Foundation; either
12 ;* version 2.1 of the License, or (at your option) any later version.
13 ;*
14 ;* Libav 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 GNU
17 ;* Lesser General Public License for more details.
18 ;*
19 ;* You should have received a copy of the GNU Lesser General Public
20 ;* License along with Libav; if not, write to the Free Software
21 ;* 51, Inc., Foundation Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 ;******************************************************************************
23
24 %include "x86inc.asm"
25 %include "x86util.asm"
26
27 SECTION_RODATA
28
29 cextern pw_255
30
31 section .text align=16
32
33 ; %1 = nr. of xmm registers used
34 %macro ADD_BYTES_FN 1
35 cglobal add_bytes_l2, 4, 6, %1, dst, src1, src2, wa, w, i
36 %if ARCH_X86_64
37     movsxd             waq, wad
38 %endif
39     xor                 iq, iq
40
41     ; vector loop
42     mov                 wq, waq
43     and                waq, ~(mmsize*2-1)
44     jmp .end_v
45 .loop_v:
46     mova                m0, [src1q+iq]
47     mova                m1, [src1q+iq+mmsize]
48     paddb               m0, [src2q+iq]
49     paddb               m1, [src2q+iq+mmsize]
50     mova  [dstq+iq       ], m0
51     mova  [dstq+iq+mmsize], m1
52     add                 iq, mmsize*2
53 .end_v:
54     cmp                 iq, waq
55     jl .loop_v
56
57 %if mmsize == 16
58     ; vector loop
59     mov                waq, wq
60     and                waq, ~7
61     jmp .end_l
62 .loop_l:
63     movq               mm0, [src1q+iq]
64     paddb              mm0, [src2q+iq]
65     movq  [dstq+iq       ], mm0
66     add                 iq, 8
67 .end_l:
68     cmp                 iq, waq
69     jl .loop_l
70 %endif
71
72     ; scalar loop for leftover
73     jmp .end_s
74 .loop_s:
75     mov                wab, [src1q+iq]
76     add                wab, [src2q+iq]
77     mov          [dstq+iq], wab
78     inc                 iq
79 .end_s:
80     cmp                 iq, wq
81     jl .loop_s
82     REP_RET
83 %endmacro
84
85 %if ARCH_X86_32
86 INIT_MMX mmx
87 ADD_BYTES_FN 0
88 %endif
89
90 INIT_XMM sse2
91 ADD_BYTES_FN 2
92
93 %macro ADD_PAETH_PRED_FN 1
94 cglobal add_png_paeth_prediction, 5, 7, %1, dst, src, top, w, bpp, end, cntr
95 %if ARCH_X86_64
96     movsxd            bppq, bppd
97     movsxd              wq, wd
98 %endif
99     lea               endq, [dstq+wq-(mmsize/2-1)]
100     sub               topq, dstq
101     sub               srcq, dstq
102     sub               dstq, bppq
103     pxor                m7, m7
104
105     PUSH              dstq
106     lea              cntrq, [bppq-1]
107     shr              cntrq, 2 + mmsize/16
108 .bpp_loop:
109     lea               dstq, [dstq+cntrq*(mmsize/2)]
110     movh                m0, [dstq]
111     movh                m1, [topq+dstq]
112     punpcklbw           m0, m7
113     punpcklbw           m1, m7
114     add               dstq, bppq
115 .loop:
116     mova                m2, m1
117     movh                m1, [topq+dstq]
118     mova                m3, m2
119     punpcklbw           m1, m7
120     mova                m4, m2
121     psubw               m3, m1
122     psubw               m4, m0
123     mova                m5, m3
124     paddw               m5, m4
125 %if cpuflag(ssse3)
126     pabsw               m3, m3
127     pabsw               m4, m4
128     pabsw               m5, m5
129 %else ; !cpuflag(ssse3)
130     psubw               m7, m5
131     pmaxsw              m5, m7
132     pxor                m6, m6
133     pxor                m7, m7
134     psubw               m6, m3
135     psubw               m7, m4
136     pmaxsw              m3, m6
137     pmaxsw              m4, m7
138     pxor                m7, m7
139 %endif ; cpuflag(ssse3)
140     mova                m6, m4
141     pminsw              m6, m5
142     pcmpgtw             m3, m6
143     pcmpgtw             m4, m5
144     mova                m6, m4
145     pand                m4, m3
146     pandn               m6, m3
147     pandn               m3, m0
148     movh                m0, [srcq+dstq]
149     pand                m6, m1
150     pand                m2, m4
151     punpcklbw           m0, m7
152     paddw               m0, m6
153     paddw               m3, m2
154     paddw               m0, m3
155     pand                m0, [pw_255]
156     mova                m3, m0
157     packuswb            m3, m3
158     movh            [dstq], m3
159     add               dstq, bppq
160     cmp               dstq, endq
161     jle .loop
162
163     mov               dstq, [rsp]
164     dec              cntrq
165     jge .bpp_loop
166     POP               dstq
167     RET
168 %endmacro
169
170 INIT_MMX mmx2
171 ADD_PAETH_PRED_FN 0
172
173 INIT_MMX ssse3
174 ADD_PAETH_PRED_FN 0