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