2 /* filter_neon.S - NEON optimised filter functions
4 * Copyright (c) 2011 Glenn Randers-Pehrson
5 * Written by Mans Rullgard, 2011.
7 * This code is released under the libpng license.
8 * For conditions of distribution and use, see the disclaimer
12 #if defined(__linux__) && defined(__ELF__)
13 .section .note.GNU-stack,"",%progbits /* mark stack as non-executable */
25 .macro func name, export=0
27 ELF .size \name, . - \name
35 ELF .type \name, STT_FUNC
40 func png_read_filter_row_sub4_neon, export=1
41 ldr r3, [r0, #4] @ rowbytes
44 vld4.32 {d4[],d5[],d6[],d7[]}, [r1,:128]
49 vst4.32 {d0[0],d1[0],d2[0],d3[0]},[r1,:128]!
56 func png_read_filter_row_sub3_neon, export=1
57 ldr r3, [r0, #4] @ rowbytes
62 vld1.8 {q11}, [r0], r12
64 vext.8 d5, d22, d23, #3
66 vext.8 d6, d22, d23, #6
68 vext.8 d7, d23, d23, #1
69 vld1.8 {q11}, [r0], r12
70 vst1.32 {d0[0]}, [r1,:32], r2
72 vst1.32 {d1[0]}, [r1], r2
74 vst1.32 {d2[0]}, [r1], r2
75 vst1.32 {d3[0]}, [r1], r2
82 func png_read_filter_row_up_neon, export=1
83 ldr r3, [r0, #4] @ rowbytes
85 vld1.8 {q0}, [r1,:128]
86 vld1.8 {q1}, [r2,:128]!
88 vst1.8 {q0}, [r1,:128]!
95 func png_read_filter_row_avg4_neon, export=1
96 ldr r12, [r0, #4] @ rowbytes
99 vld4.32 {d4[],d5[],d6[],d7[]}, [r1,:128]
100 vld4.32 {d16[],d17[],d18[],d19[]},[r2,:128]!
109 vst4.32 {d0[0],d1[0],d2[0],d3[0]},[r1,:128]!
116 func png_read_filter_row_avg3_neon, export=1
118 ldr r12, [r0, #4] @ rowbytes
123 vld1.8 {q11}, [r0], lr
125 vld1.8 {q10}, [r2], lr
126 vext.8 d5, d22, d23, #3
128 vext.8 d17, d20, d21, #3
130 vext.8 d6, d22, d23, #6
132 vext.8 d18, d20, d21, #6
134 vext.8 d7, d23, d23, #1
135 vld1.8 {q11}, [r0], lr
136 vst1.32 {d0[0]}, [r1,:32], r4
138 vst1.32 {d1[0]}, [r1], r4
139 vext.8 d19, d21, d21, #1
142 vst1.32 {d2[0]}, [r1], r4
144 vst1.32 {d3[0]}, [r1], r4
151 .macro paeth rx, ra, rb, rc
152 vaddl.u8 q12, \ra, \rb @ a + b
153 vaddl.u8 q15, \rc, \rc @ 2*c
154 vabdl.u8 q13, \rb, \rc @ pa
155 vabdl.u8 q14, \ra, \rc @ pb
156 vabd.u16 q15, q12, q15 @ pc
157 vcle.u16 q12, q13, q14 @ pa <= pb
158 vcle.u16 q13, q13, q15 @ pa <= pc
159 vcle.u16 q14, q14, q15 @ pb <= pc
160 vand q12, q12, q13 @ pa <= pb && pa <= pc
167 func png_read_filter_row_paeth4_neon, export=1
168 ldr r12, [r0, #4] @ rowbytes
172 vld4.32 {d4[],d5[],d6[],d7[]}, [r1,:128]
173 vld4.32 {d16[],d17[],d18[],d19[]},[r2,:128]!
174 paeth d0, d3, d16, d20
176 paeth d1, d0, d17, d16
178 paeth d2, d1, d18, d17
180 paeth d3, d2, d19, d18
183 vst4.32 {d0[0],d1[0],d2[0],d3[0]},[r1,:128]!
190 func png_read_filter_row_paeth3_neon, export=1
192 ldr r12, [r0, #4] @ rowbytes
198 vld1.8 {q11}, [r0], lr
200 vld1.8 {q10}, [r2], lr
201 paeth d0, d3, d20, d4
202 vext.8 d5, d22, d23, #3
204 vext.8 d17, d20, d21, #3
205 paeth d1, d0, d17, d20
206 vst1.32 {d0[0]}, [r1,:32], r4
207 vext.8 d6, d22, d23, #6
209 vext.8 d18, d20, d21, #6
210 paeth d2, d1, d18, d17
211 vext.8 d7, d23, d23, #1
212 vld1.8 {q11}, [r0], lr
213 vst1.32 {d1[0]}, [r1], r4
215 vext.8 d19, d21, d21, #1
216 paeth d3, d2, d19, d18
217 vst1.32 {d2[0]}, [r1], r4
220 vst1.32 {d3[0]}, [r1], r4