filter_neon.S revision b50c217251b086440efcdb273c22f86a06c80cba
1b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
2b50c217251b086440efcdb273c22f86a06c80cbaChris Craik/* filter_neon.S - NEON optimised filter functions
3b50c217251b086440efcdb273c22f86a06c80cbaChris Craik *
4b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * Copyright (c) 2013 Glenn Randers-Pehrson
5b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * Written by Mans Rullgard, 2011.
6b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * Last changed in libpng 1.5.17 [July 18, 2013]
7b50c217251b086440efcdb273c22f86a06c80cbaChris Craik *
8b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * This code is released under the libpng license.
9b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * For conditions of distribution and use, see the disclaimer
10b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * and license in png.h
11b50c217251b086440efcdb273c22f86a06c80cbaChris Craik */
12b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
13b50c217251b086440efcdb273c22f86a06c80cbaChris Craik/* This is required to get the symbol renames, which are #defines, and also
14b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * includes the definition (or not) of PNG_ARM_NEON_OPT.
15b50c217251b086440efcdb273c22f86a06c80cbaChris Craik */
16b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#define PNG_VERSION_INFO_ONLY
17b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#include "../pngpriv.h"
18b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
19b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#if defined(__linux__) && defined(__ELF__)
20b50c217251b086440efcdb273c22f86a06c80cbaChris Craik.section .note.GNU-stack,"",%progbits /* mark stack as non-executable */
21b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
22b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
23b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_READ_SUPPORTED
24b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#if PNG_ARM_NEON_OPT > 0
25b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
26b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef __ELF__
27b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#   define ELF
28b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#else
29b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#   define ELF @
30b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
31b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
32b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        .arch armv7-a
33b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        .fpu  neon
34b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
35b50c217251b086440efcdb273c22f86a06c80cbaChris Craik.macro  func    name, export=0
36b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    .macro endfunc
37b50c217251b086440efcdb273c22f86a06c80cbaChris CraikELF     .size   \name, . - \name
38b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        .endfunc
39b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        .purgem endfunc
40b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    .endm
41b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        .text
42b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    .if \export
43b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        .global \name
44b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    .endif
45b50c217251b086440efcdb273c22f86a06c80cbaChris CraikELF     .type   \name, STT_FUNC
46b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        .func   \name
47b50c217251b086440efcdb273c22f86a06c80cbaChris Craik\name:
48b50c217251b086440efcdb273c22f86a06c80cbaChris Craik.endm
49b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
50b50c217251b086440efcdb273c22f86a06c80cbaChris Craikfunc    png_read_filter_row_sub4_neon, export=1
51b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        ldr             r3,  [r0, #4]           @ rowbytes
52b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vmov.i8         d3,  #0
53b50c217251b086440efcdb273c22f86a06c80cbaChris Craik1:
54b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vld4.32         {d4[],d5[],d6[],d7[]},    [r1,:128]
55b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vadd.u8         d0,  d3,  d4
56b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vadd.u8         d1,  d0,  d5
57b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vadd.u8         d2,  d1,  d6
58b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vadd.u8         d3,  d2,  d7
59b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vst4.32         {d0[0],d1[0],d2[0],d3[0]},[r1,:128]!
60b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        subs            r3,  r3,  #16
61b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        bgt             1b
62b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
63b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        bx              lr
64b50c217251b086440efcdb273c22f86a06c80cbaChris Craikendfunc
65b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
66b50c217251b086440efcdb273c22f86a06c80cbaChris Craikfunc    png_read_filter_row_sub3_neon, export=1
67b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        ldr             r3,  [r0, #4]           @ rowbytes
68b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vmov.i8         d3,  #0
69b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        mov             r0,  r1
70b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        mov             r2,  #3
71b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        mov             r12, #12
72b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vld1.8          {q11},    [r0], r12
73b50c217251b086440efcdb273c22f86a06c80cbaChris Craik1:
74b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vext.8          d5,  d22, d23, #3
75b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vadd.u8         d0,  d3,  d22
76b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vext.8          d6,  d22, d23, #6
77b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vadd.u8         d1,  d0,  d5
78b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vext.8          d7,  d23, d23, #1
79b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vld1.8          {q11},    [r0], r12
80b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vst1.32         {d0[0]},  [r1,:32], r2
81b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vadd.u8         d2,  d1,  d6
82b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vst1.32         {d1[0]},  [r1], r2
83b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vadd.u8         d3,  d2,  d7
84b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vst1.32         {d2[0]},  [r1], r2
85b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vst1.32         {d3[0]},  [r1], r2
86b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        subs            r3,  r3,  #12
87b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        bgt             1b
88b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
89b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        bx              lr
90b50c217251b086440efcdb273c22f86a06c80cbaChris Craikendfunc
91b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
92b50c217251b086440efcdb273c22f86a06c80cbaChris Craikfunc    png_read_filter_row_up_neon, export=1
93b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        ldr             r3,  [r0, #4]           @ rowbytes
94b50c217251b086440efcdb273c22f86a06c80cbaChris Craik1:
95b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vld1.8          {q0}, [r1,:128]
96b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vld1.8          {q1}, [r2,:128]!
97b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vadd.u8         q0,  q0,  q1
98b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vst1.8          {q0}, [r1,:128]!
99b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        subs            r3,  r3,  #16
100b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        bgt             1b
101b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
102b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        bx              lr
103b50c217251b086440efcdb273c22f86a06c80cbaChris Craikendfunc
104b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
105b50c217251b086440efcdb273c22f86a06c80cbaChris Craikfunc    png_read_filter_row_avg4_neon, export=1
106b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        ldr             r12, [r0, #4]           @ rowbytes
107b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vmov.i8         d3,  #0
108b50c217251b086440efcdb273c22f86a06c80cbaChris Craik1:
109b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vld4.32         {d4[],d5[],d6[],d7[]},    [r1,:128]
110b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vld4.32         {d16[],d17[],d18[],d19[]},[r2,:128]!
111b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vhadd.u8        d0,  d3,  d16
112b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vadd.u8         d0,  d0,  d4
113b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vhadd.u8        d1,  d0,  d17
114b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vadd.u8         d1,  d1,  d5
115b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vhadd.u8        d2,  d1,  d18
116b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vadd.u8         d2,  d2,  d6
117b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vhadd.u8        d3,  d2,  d19
118b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vadd.u8         d3,  d3,  d7
119b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vst4.32         {d0[0],d1[0],d2[0],d3[0]},[r1,:128]!
120b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        subs            r12, r12, #16
121b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        bgt             1b
122b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
123b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        bx              lr
124b50c217251b086440efcdb273c22f86a06c80cbaChris Craikendfunc
125b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
126b50c217251b086440efcdb273c22f86a06c80cbaChris Craikfunc    png_read_filter_row_avg3_neon, export=1
127b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        push            {r4,lr}
128b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        ldr             r12, [r0, #4]           @ rowbytes
129b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vmov.i8         d3,  #0
130b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        mov             r0,  r1
131b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        mov             r4,  #3
132b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        mov             lr,  #12
133b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vld1.8          {q11},    [r0], lr
134b50c217251b086440efcdb273c22f86a06c80cbaChris Craik1:
135b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vld1.8          {q10},    [r2], lr
136b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vext.8          d5,  d22, d23, #3
137b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vhadd.u8        d0,  d3,  d20
138b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vext.8          d17, d20, d21, #3
139b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vadd.u8         d0,  d0,  d22
140b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vext.8          d6,  d22, d23, #6
141b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vhadd.u8        d1,  d0,  d17
142b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vext.8          d18, d20, d21, #6
143b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vadd.u8         d1,  d1,  d5
144b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vext.8          d7,  d23, d23, #1
145b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vld1.8          {q11},    [r0], lr
146b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vst1.32         {d0[0]},  [r1,:32], r4
147b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vhadd.u8        d2,  d1,  d18
148b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vst1.32         {d1[0]},  [r1], r4
149b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vext.8          d19, d21, d21, #1
150b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vadd.u8         d2,  d2,  d6
151b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vhadd.u8        d3,  d2,  d19
152b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vst1.32         {d2[0]},  [r1], r4
153b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vadd.u8         d3,  d3,  d7
154b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vst1.32         {d3[0]},  [r1], r4
155b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        subs            r12, r12, #12
156b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        bgt             1b
157b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
158b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        pop             {r4,pc}
159b50c217251b086440efcdb273c22f86a06c80cbaChris Craikendfunc
160b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
161b50c217251b086440efcdb273c22f86a06c80cbaChris Craik.macro  paeth           rx,  ra,  rb,  rc
162b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vaddl.u8        q12, \ra, \rb           @ a + b
163b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vaddl.u8        q15, \rc, \rc           @ 2*c
164b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vabdl.u8        q13, \rb, \rc           @ pa
165b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vabdl.u8        q14, \ra, \rc           @ pb
166b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vabd.u16        q15, q12, q15           @ pc
167b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vcle.u16        q12, q13, q14           @ pa <= pb
168b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vcle.u16        q13, q13, q15           @ pa <= pc
169b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vcle.u16        q14, q14, q15           @ pb <= pc
170b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vand            q12, q12, q13           @ pa <= pb && pa <= pc
171b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vmovn.u16       d28, q14
172b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vmovn.u16       \rx, q12
173b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vbsl            d28, \rb, \rc
174b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vbsl            \rx, \ra, d28
175b50c217251b086440efcdb273c22f86a06c80cbaChris Craik.endm
176b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
177b50c217251b086440efcdb273c22f86a06c80cbaChris Craikfunc    png_read_filter_row_paeth4_neon, export=1
178b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        ldr             r12, [r0, #4]           @ rowbytes
179b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vmov.i8         d3,  #0
180b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vmov.i8         d20, #0
181b50c217251b086440efcdb273c22f86a06c80cbaChris Craik1:
182b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vld4.32         {d4[],d5[],d6[],d7[]},    [r1,:128]
183b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vld4.32         {d16[],d17[],d18[],d19[]},[r2,:128]!
184b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        paeth           d0,  d3,  d16, d20
185b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vadd.u8         d0,  d0,  d4
186b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        paeth           d1,  d0,  d17, d16
187b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vadd.u8         d1,  d1,  d5
188b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        paeth           d2,  d1,  d18, d17
189b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vadd.u8         d2,  d2,  d6
190b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        paeth           d3,  d2,  d19, d18
191b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vmov            d20, d19
192b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vadd.u8         d3,  d3,  d7
193b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vst4.32         {d0[0],d1[0],d2[0],d3[0]},[r1,:128]!
194b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        subs            r12, r12, #16
195b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        bgt             1b
196b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
197b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        bx              lr
198b50c217251b086440efcdb273c22f86a06c80cbaChris Craikendfunc
199b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
200b50c217251b086440efcdb273c22f86a06c80cbaChris Craikfunc    png_read_filter_row_paeth3_neon, export=1
201b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        push            {r4,lr}
202b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        ldr             r12, [r0, #4]           @ rowbytes
203b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vmov.i8         d3,  #0
204b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vmov.i8         d4,  #0
205b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        mov             r0,  r1
206b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        mov             r4,  #3
207b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        mov             lr,  #12
208b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vld1.8          {q11},    [r0], lr
209b50c217251b086440efcdb273c22f86a06c80cbaChris Craik1:
210b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vld1.8          {q10},    [r2], lr
211b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        paeth           d0,  d3,  d20, d4
212b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vext.8          d5,  d22, d23, #3
213b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vadd.u8         d0,  d0,  d22
214b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vext.8          d17, d20, d21, #3
215b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        paeth           d1,  d0,  d17, d20
216b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vst1.32         {d0[0]},  [r1,:32], r4
217b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vext.8          d6,  d22, d23, #6
218b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vadd.u8         d1,  d1,  d5
219b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vext.8          d18, d20, d21, #6
220b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        paeth           d2,  d1,  d18, d17
221b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vext.8          d7,  d23, d23, #1
222b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vld1.8          {q11},    [r0], lr
223b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vst1.32         {d1[0]},  [r1], r4
224b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vadd.u8         d2,  d2,  d6
225b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vext.8          d19, d21, d21, #1
226b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        paeth           d3,  d2,  d19, d18
227b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vst1.32         {d2[0]},  [r1], r4
228b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vmov            d4,  d19
229b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vadd.u8         d3,  d3,  d7
230b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        vst1.32         {d3[0]},  [r1], r4
231b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        subs            r12, r12, #12
232b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        bgt             1b
233b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
234b50c217251b086440efcdb273c22f86a06c80cbaChris Craik        pop             {r4,pc}
235b50c217251b086440efcdb273c22f86a06c80cbaChris Craikendfunc
236b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif /* PNG_ARM_NEON_OPT > 0 */
237b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif /* PNG_READ_SUPPORTED */
238