mirror of
https://git.code.sf.net/p/libpng/code.git
synced 2025-07-10 18:04:09 +02:00
[libpng16] Changed NEON implementation selection mechanism to allow assembler
or intrinsics to be turned on during the build by defining PNG_ARM_NEON_IMPLEMENTATION to the correct value (2 or 1). The default is "undefined" and the build type is selected in pngpriv.h.
This commit is contained in:
committed by
Glenn Randers-Pehrson
parent
bb9adfdad9
commit
fd8bba4b80
8
ANNOUNCE
8
ANNOUNCE
@@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
Libpng 1.6.7beta04 - October 24, 2013
|
Libpng 1.6.7beta04 - October 25, 2013
|
||||||
|
|
||||||
This is not intended to be a public release. It will be replaced
|
This is not intended to be a public release. It will be replaced
|
||||||
within a few weeks by a public version or by another test version.
|
within a few weeks by a public version or by another test version.
|
||||||
@@ -80,11 +80,15 @@ Version 1.6.7beta03 [October 19, 2013]
|
|||||||
Cleaned up ARM NEON compilation handling. The tests are now in pngpriv.h
|
Cleaned up ARM NEON compilation handling. The tests are now in pngpriv.h
|
||||||
and detect the broken GCC compilers.
|
and detect the broken GCC compilers.
|
||||||
|
|
||||||
Version 1.6.7beta04 [October 24, 2013]
|
Version 1.6.7beta04 [October 25, 2013]
|
||||||
Allow clang derived from older GCC versions to use ARM intrinsics. This
|
Allow clang derived from older GCC versions to use ARM intrinsics. This
|
||||||
causes all clang builds that use -mfpu=neon to use the intrinsics code,
|
causes all clang builds that use -mfpu=neon to use the intrinsics code,
|
||||||
not the assembler code. This has only been tested on iOS 7. It may be
|
not the assembler code. This has only been tested on iOS 7. It may be
|
||||||
necessary to exclude some earlier clang versions but this seems unlikely.
|
necessary to exclude some earlier clang versions but this seems unlikely.
|
||||||
|
Changed NEON implementation selection mechanism. This allows assembler
|
||||||
|
or intrinsics to be turned on during the build by defining
|
||||||
|
PNG_ARM_NEON_IMPLEMENTATION to the correct value (2 or 1). The
|
||||||
|
default is "undefined" and the build type is selected in pngpriv.h.
|
||||||
|
|
||||||
Send comments/corrections/commendations to png-mng-implement at lists.sf.net
|
Send comments/corrections/commendations to png-mng-implement at lists.sf.net
|
||||||
(subscription required; visit
|
(subscription required; visit
|
||||||
|
|||||||
6
CHANGES
6
CHANGES
@@ -4694,11 +4694,15 @@ Version 1.6.7beta03 [October 19, 2013]
|
|||||||
Cleaned up ARM NEON compilation handling. The tests are now in pngpriv.h
|
Cleaned up ARM NEON compilation handling. The tests are now in pngpriv.h
|
||||||
and detect the broken GCC compilers.
|
and detect the broken GCC compilers.
|
||||||
|
|
||||||
Version 1.6.7beta04 [October 24, 2013]
|
Version 1.6.7beta04 [October 25, 2013]
|
||||||
Allow clang derived from older GCC versions to use ARM intrinsics. This
|
Allow clang derived from older GCC versions to use ARM intrinsics. This
|
||||||
causes all clang builds that use -mfpu=neon to use the intrinsics code,
|
causes all clang builds that use -mfpu=neon to use the intrinsics code,
|
||||||
not the assembler code. This has only been tested on iOS 7. It may be
|
not the assembler code. This has only been tested on iOS 7. It may be
|
||||||
necessary to exclude some earlier clang versions but this seems unlikely.
|
necessary to exclude some earlier clang versions but this seems unlikely.
|
||||||
|
Changed NEON implementation selection mechanism. This allows assembler
|
||||||
|
or intrinsics to be turned on during the build by defining
|
||||||
|
PNG_ARM_NEON_IMPLEMENTATION to the correct value (2 or 1). The
|
||||||
|
default is "undefined" and the build type is selected in pngpriv.h.
|
||||||
|
|
||||||
Send comments/corrections/commendations to png-mng-implement at lists.sf.net
|
Send comments/corrections/commendations to png-mng-implement at lists.sf.net
|
||||||
(subscription required; visit
|
(subscription required; visit
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
* only works if -mfpu=neon is specified on the GCC command line. See pngpriv.h
|
* only works if -mfpu=neon is specified on the GCC command line. See pngpriv.h
|
||||||
* for the logic which sets PNG_USE_ARM_NEON_ASM:
|
* for the logic which sets PNG_USE_ARM_NEON_ASM:
|
||||||
*/
|
*/
|
||||||
#ifdef PNG_USE_ARM_NEON_ASM /* else use arm/filter_neon_intrinsics.c */
|
#if PNG_ARM_NEON_IMPLEMENTATION == 2 /* hand-coded assembler */
|
||||||
|
|
||||||
#ifdef PNG_READ_SUPPORTED
|
#ifdef PNG_READ_SUPPORTED
|
||||||
#if PNG_ARM_NEON_OPT > 0
|
#if PNG_ARM_NEON_OPT > 0
|
||||||
@@ -242,4 +242,4 @@ func png_read_filter_row_paeth3_neon, export=1
|
|||||||
endfunc
|
endfunc
|
||||||
#endif /* PNG_ARM_NEON_OPT > 0 */
|
#endif /* PNG_ARM_NEON_OPT > 0 */
|
||||||
#endif /* PNG_READ_SUPPORTED */
|
#endif /* PNG_READ_SUPPORTED */
|
||||||
#endif /* PNG_USE_ARM_NEON_ASM */
|
#endif /* PNG_ARM_NEON_IMPLEMENTATION == 2 (assembler) */
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
#include "pngpriv.h"
|
#include "pngpriv.h"
|
||||||
|
|
||||||
/* This code requires -mfpu=neon on the command line: */
|
/* This code requires -mfpu=neon on the command line: */
|
||||||
#ifndef PNG_USE_ARM_NEON_ASM /* else use arm/filter_neon.S */
|
#if PNG_ARM_NEON_IMPLEMENTATION == 1 /* intrinsics code */
|
||||||
|
|
||||||
#include <arm_neon.h>
|
#include <arm_neon.h>
|
||||||
|
|
||||||
@@ -369,4 +369,4 @@ png_read_filter_row_paeth4_neon(png_row_infop row_info, png_bytep row,
|
|||||||
|
|
||||||
#endif /* PNG_ARM_NEON_OPT > 0 */
|
#endif /* PNG_ARM_NEON_OPT > 0 */
|
||||||
#endif /* PNG_READ_SUPPORTED */
|
#endif /* PNG_READ_SUPPORTED */
|
||||||
#endif /* !PNG_USE_ARM_NEON_ASM */
|
#endif /* PNG_ARM_NEON_IMPLEMENTATION == 1 (intrinsics) */
|
||||||
|
|||||||
63
pngpriv.h
63
pngpriv.h
@@ -126,36 +126,49 @@
|
|||||||
* callbacks to do this.
|
* callbacks to do this.
|
||||||
*/
|
*/
|
||||||
# define PNG_FILTER_OPTIMIZATIONS png_init_filter_functions_neon
|
# define PNG_FILTER_OPTIMIZATIONS png_init_filter_functions_neon
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef PNG_USE_ARM_NEON_ASM
|
|
||||||
/* By default the 'intrinsics' code in arm/filter_neon_intrinsics.c is used
|
/* By default the 'intrinsics' code in arm/filter_neon_intrinsics.c is used
|
||||||
* if possible - if __ARM_NEON__ is set and the compiler version is not known
|
* if possible - if __ARM_NEON__ is set and the compiler version is not known
|
||||||
* to be broken. ASM code can be forced by -DPNG_USE_ARM_NEON_ASM on the
|
* to be broken. This is control by PNG_ARM_NEON_IMPLEMENTATION which can
|
||||||
* command line.
|
* be:
|
||||||
|
*
|
||||||
|
* 1 The intrinsics code (the default with __ARM_NEON__)
|
||||||
|
* 2 The hand coded assembler (the default without __ARM_NEON__)
|
||||||
|
*
|
||||||
|
* It is possible to set PNG_ARM_NEON_IMPLEMENTATION in CPPFLAGS, however
|
||||||
|
* this is *NOT* supported and may cease to work even after a minor revision
|
||||||
|
* to libpng. It *is* valid to do this for testing purposes, e.g. speed
|
||||||
|
* testing or a new compiler, but the results should be communicated to the
|
||||||
|
* libpng implementation list for incorporation in the next minor release.
|
||||||
*/
|
*/
|
||||||
# ifndef __ARM_NEON__
|
# ifndef PNG_ARM_NEON_IMPLEMENTATION
|
||||||
/* The 'intrinsics' code simply won't compile without this -mfpu=neon: */
|
# ifdef __ARM_NEON__
|
||||||
# define PNG_USE_ARM_NEON_ASM
|
# if defined(__clang__)
|
||||||
# endif
|
/* At present it is unknown by the libpng developers which versions
|
||||||
#endif
|
* of clang support the intrinsics, however some or perhaps all
|
||||||
|
* versions do not work with the assembler so this may be
|
||||||
|
* irrelevant, so just use the default (do nothing here.)
|
||||||
|
*/
|
||||||
|
# elif defined(__GNUC__)
|
||||||
|
/* GCC 4.5.4 NEON support is known to be broken. 4.6.3 is known to
|
||||||
|
* work, so if this *is* GCC, or G++, look for a version >4.5
|
||||||
|
*/
|
||||||
|
# if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 6)
|
||||||
|
# define PNG_ARM_NEON_IMPLEMENTATION 2
|
||||||
|
# endif /* no GNUC support */
|
||||||
|
# endif /* __GNUC__ */
|
||||||
|
# else /* !__ARM_NEON__ */
|
||||||
|
/* The 'intrinsics' code simply won't compile without this -mfpu=neon:
|
||||||
|
*/
|
||||||
|
# define PNG_ARM_NEON_IMPLEMENTATION 2
|
||||||
|
# endif /* !__ARM_NEON */
|
||||||
|
# endif /* !defined PNG_ARM_NEON_IMPLEMENTATION */
|
||||||
|
|
||||||
/* Put compiler specific checks below: */
|
# ifndef PNG_ARM_NEON_IMPLEMENTATION
|
||||||
#ifndef PNG_USE_ARM_NEON_ASM
|
/* Use the intrinsics code by default. */
|
||||||
# if defined(__clang__)
|
# define PNG_ARM_NEON_IMPLEMENTATION 1
|
||||||
/* At present it is unknown by the libpng developers which versions of
|
# endif
|
||||||
* clang support the intrinsics, however some or perhaps all versions
|
#endif /* PNG_ARM_NEON_OPT > 0 */
|
||||||
* do not work with the assembler so this may be irrelevant.
|
|
||||||
*/
|
|
||||||
# elif defined(__GNUC__)
|
|
||||||
/* GCC 4.5.4 NEON support is known to be broken. 4.6.3 is known to work,
|
|
||||||
* so if this *is* GCC, or G++, look for a version >4.5
|
|
||||||
*/
|
|
||||||
# if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 6)
|
|
||||||
# define PNG_USE_ARM_NEON_ASM
|
|
||||||
# endif
|
|
||||||
# endif /* __GNUC__ */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Is this a build of a DLL where compilation of the object modules requires
|
/* Is this a build of a DLL where compilation of the object modules requires
|
||||||
* different preprocessor settings to those required for a simple library? If
|
* different preprocessor settings to those required for a simple library? If
|
||||||
|
|||||||
Reference in New Issue
Block a user