From 6c3d5bd2a0fadf948cc282b95406aa0641257686 Mon Sep 17 00:00:00 2001 From: Glenn Randers-Pehrson Date: Mon, 22 Feb 2016 16:38:10 -0600 Subject: [PATCH] [libpng16] Moved contrib/intel/*.patch into INSTALL and added intel_sse.patch --- Makefile.am | 9 ++- configure.ac | 7 ++ contrib/intel/INSTALL | 88 ++++++++++++++++++-- contrib/intel/Makefile.am.patch | 20 ----- contrib/intel/configure.ac.patch | 50 ------------ contrib/intel/filter_sse2_intrinsics.c | 10 +++ contrib/intel/intel_sse.patch | 107 +++++++++++++++++++++++++ 7 files changed, 213 insertions(+), 78 deletions(-) delete mode 100644 contrib/intel/Makefile.am.patch delete mode 100644 contrib/intel/configure.ac.patch create mode 100644 contrib/intel/intel_sse.patch diff --git a/Makefile.am b/Makefile.am index 73097dbcc..5c517b993 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,6 +1,11 @@ -# Makefile.am: -# Source file for Makefile.in (and hence Makefile) +# Makefile.am, the source file for Makefile.in (and hence Makefile), is # +# Copyright (c) 2004-2016 Glenn Randers-Pehrson +# Last changed in libpng 1.6.22 [(PENDING RELEASE)] +# +# This code is released under the libpng license. +# For conditions of distribution and use, see the disclaimer +# and license in png.h PNGLIB_BASENAME= libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@ diff --git a/configure.ac b/configure.ac index 10538fcc4..3d6b4a016 100644 --- a/configure.ac +++ b/configure.ac @@ -1,5 +1,12 @@ # configure.ac +# Copyright (c) 2004-2015 Glenn Randers-Pehrson +# Last changed in libpng 1.6.22 [(PENDING RELEASE)] + +# This code is released under the libpng license. +# For conditions of distribution and use, see the disclaimer +# and license in png.h + dnl Process this file with autoconf to produce a configure script. dnl dnl Minor upgrades (compatible ABI): increment the package version diff --git a/contrib/intel/INSTALL b/contrib/intel/INSTALL index 105c953fe..aab07ebdd 100644 --- a/contrib/intel/INSTALL +++ b/contrib/intel/INSTALL @@ -1,8 +1,84 @@ +Enabling SSE support -To enable SSE support in libpng, manually edit configure.ac and Makefile.am, -following the instructions in the configure.ac.patch and Makefile.am.patch -files, then configure with -DPNG_INTEL_SSE in CPPFLAGS. +Copyright (c) 2016 Google, Inc. +Written by Mike Klein and Matt Sarett -If you have moved the *.c files to a different directory, be sure to update -the '#include "../../pngpriv.h"' line in both files if necessary to point -to the correct relative location of pngpriv.h. +To enable SSE support in libpng, apply intel_sse.patch in your build +directory. If you prefer, manually edit configure.ac and Makefile.am, +following the instructions below. + +Then configure libpng with -DPNG_INTEL_SSE in CPPFLAGS. +If you only want to optimize 4bpp images, also use -DPNG_NO_INTEL_SSE_3BPP. + +If you have moved intel_init.c and filter_sse2_intrinsics.c to a different +directory, be sure to update the '#include "../../pngpriv.h"' line in both +files if necessary to point to the correct relative location of pngpriv.h +with respect to the new location of those files. + +1. Insert the following lines above the copyright line near the top of +configure.ac: + +-----------------cut---------------- +# Copyright (c) 2016 Google, Inc. +# Written by Mike Klein and Matt Sarett +# Derived from the ARM supporting code in libpng/configure.ac, which was +-----------------cut---------------- + +2. Add the following code to configure.ac under HOST SPECIFIC OPTIONS +directly beneath the section for ARM: + +-----------------cut---------------- +# INTEL +# ===== +# +# INTEL SSE (SIMD) support. + +AC_ARG_ENABLE([intel-sse], + AS_HELP_STRING([[[--enable-intel-sse]]], + [Enable Intel SSE optimizations: =no/off, yes/on:] + [no/off: disable the optimizations;] + [yes/on: enable the optimizations.] + [If not specified: determined by the compiler.]), + [case "$enableval" in + no|off) + # disable the default enabling: + AC_DEFINE([PNG_INTEL_SSE_OPT], [0], + [Disable Intel SSE optimizations]) + # Prevent inclusion of the assembler files below: + enable_intel_sse=no;; + yes|on) + AC_DEFINE([PNG_INTEL_SSE_OPT], [1], + [Enable Intel SSE optimizations]);; + *) + AC_MSG_ERROR([--enable-intel-sse=${enable_intel_sse}: invalid value]) + esac]) + +# Add Intel specific files to all builds where the host_cpu is Intel ('x86*') +# or where Intel optimizations were explicitly requested (this allows a +# fallback if a future host CPU does not match 'x86*') +AM_CONDITIONAL([PNG_INTEL_SSE], + [test "$enable_intel_sse" != 'no' && + case "$host_cpu" in + i?86|x86_64) :;; + *) test "$enable_intel_sse" != '';; + esac]) +-----------------cut---------------- + +3. Insert the following lines above the copyright line near the top of +Makefile.am: + +-----------------cut---------------- +# Copyright (c) 2016 Google, Inc. +# Written by Mike Klein and Matt Sarett +# Derived from the ARM supporting code in libpng/configure.ac, which was +-----------------cut---------------- + +4. Add the following code to Makefile.am under HOST SPECIFIC OPTIONS +directly beneath the "if PNG_ARM_NEON ... endif" statement: + +-----------------cut---------------- +if PNG_INTEL_SSE +libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_SOURCES += contrib/intel/intel_init.c\ + contrib/intel/filter_sse2_intrinsics.c +endif +-----------------cut---------------- diff --git a/contrib/intel/Makefile.am.patch b/contrib/intel/Makefile.am.patch deleted file mode 100644 index 3ac57ec82..000000000 --- a/contrib/intel/Makefile.am.patch +++ /dev/null @@ -1,20 +0,0 @@ - -# Copyright (c) 2016 Google, Inc. -# Written by Mike Klein and Matt Sarett -# Derived from the ARM supporting code in libpng/Makefile.am, which was -# Copyright (c) 2004-2015 Glenn Randers-Pehrson -# -# Last changed in libpng 1.6.22 [(PENDING RELEASE)] -# -# This code is released under the libpng license. -# For conditions of distribution and use, see the disclaimer -# and license in png.h -# -# In order to compile Intel SSE optimizations for libpng, please add -# the following code to Makefile.am under HOST SPECIFIC OPTIONS -# directly beneath the "if PNG_ARM_NEON ... endif" statement. - -if PNG_INTEL_SSE -libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_SOURCES += contrib/intel/intel_init.c\ - contrib/intel/filter_sse2_intrinsics.c -endif diff --git a/contrib/intel/configure.ac.patch b/contrib/intel/configure.ac.patch deleted file mode 100644 index cd5d91b27..000000000 --- a/contrib/intel/configure.ac.patch +++ /dev/null @@ -1,50 +0,0 @@ -# -# Copyright (c) 2016 Google, Inc. -# Written by Mike Klein and Matt Sarett -# Derived from the ARM supporting code in libpng/configure.ac, which was -# Copyright (c) 2004-2015 Glenn Randers-Pehrson -# -# Last changed in libpng 1.6.22 [(PENDING RELEASE)] -# -# This code is released under the libpng license. -# For conditions of distribution and use, see the disclaimer -# and license in png.h -# -# In order to compile Intel SSE optimizations for libpng, please add -# the following code to configure.ac under HOST SPECIFIC OPTIONS -# directly beneath the section for ARM. - -# INTEL -# ===== -# -# INTEL SSE (SIMD) support. - -AC_ARG_ENABLE([intel-sse], - AS_HELP_STRING([[[--enable-intel-sse]]], - [Enable Intel SSE optimizations: =no/off, yes/on:] - [no/off: disable the optimizations;] - [yes/on: enable the optimizations.] - [If not specified: determined by the compiler.]), - [case "$enableval" in - no|off) - # disable the default enabling: - AC_DEFINE([PNG_INTEL_SSE_OPT], [0], - [Disable Intel SSE optimizations]) - # Prevent inclusion of the assembler files below: - enable_intel_sse=no;; - yes|on) - AC_DEFINE([PNG_INTEL_SSE_OPT], [1], - [Enable Intel SSE optimizations]);; - *) - AC_MSG_ERROR([--enable-intel-sse=${enable_intel_sse}: invalid value]) - esac]) - -# Add Intel specific files to all builds where the host_cpu is Intel ('x86*') -# or where Intel optimizations were explicitly requested (this allows a -# fallback if a future host CPU does not match 'x86*') -AM_CONDITIONAL([PNG_INTEL_SSE], - [test "$enable_intel_sse" != 'no' && - case "$host_cpu" in - i?86|x86_64) :;; - *) test "$enable_intel_sse" != '';; - esac]) diff --git a/contrib/intel/filter_sse2_intrinsics.c b/contrib/intel/filter_sse2_intrinsics.c index fcd875f6b..e7b317159 100644 --- a/contrib/intel/filter_sse2_intrinsics.c +++ b/contrib/intel/filter_sse2_intrinsics.c @@ -29,25 +29,30 @@ * whichever of a, b, or c is closest to p=a+b-c. */ +#ifndef PNG_NO_INTEL_SSE_3BPP static __m128i load3(const void* p) { png_uint_32 packed; memcpy(&packed, p, 3); return _mm_cvtsi32_si128(packed); } +#endif static __m128i load4(const void* p) { return _mm_cvtsi32_si128(*(const int*)p); } +#ifndef PNG_NO_INTEL_SSE_3BPP static void store3(void* p, __m128i v) { png_uint_32 packed = _mm_cvtsi128_si32(v); memcpy(p, &packed, 3); } +#endif static void store4(void* p, __m128i v) { *(int*)p = _mm_cvtsi128_si32(v); } +#ifndef PNG_NO_INTEL_SSE_3BPP void png_read_filter_row_sub3_sse2(png_row_infop row_info, png_bytep row, png_const_bytep prev) { @@ -68,6 +73,7 @@ void png_read_filter_row_sub3_sse2(png_row_infop row_info, png_bytep row, rb -= 3; } } +#endif void png_read_filter_row_sub4_sse2(png_row_infop row_info, png_bytep row, png_const_bytep prev) @@ -90,6 +96,7 @@ void png_read_filter_row_sub4_sse2(png_row_infop row_info, png_bytep row, } } +#ifndef PNG_NO_INTEL_SSE_3BPP void png_read_filter_row_avg3_sse2(png_row_infop row_info, png_bytep row, png_const_bytep prev) { @@ -122,6 +129,7 @@ void png_read_filter_row_avg3_sse2(png_row_infop row_info, png_bytep row, rb -= 3; } } +#endif void png_read_filter_row_avg4_sse2(png_row_infop row_info, png_bytep row, png_const_bytep prev) @@ -184,6 +192,7 @@ static __m128i if_then_else(__m128i c, __m128i t, __m128i e) { #endif } +#ifndef PNG_NO_INTEL_SSE_3BPP void png_read_filter_row_paeth3_sse2(png_row_infop row_info, png_bytep row, png_const_bytep prev) { @@ -242,6 +251,7 @@ void png_read_filter_row_paeth3_sse2(png_row_infop row_info, png_bytep row, rb -= 3; } } +#endif void png_read_filter_row_paeth4_sse2(png_row_infop row_info, png_bytep row, png_const_bytep prev) diff --git a/contrib/intel/intel_sse.patch b/contrib/intel/intel_sse.patch new file mode 100644 index 000000000..070e8d891 --- /dev/null +++ b/contrib/intel/intel_sse.patch @@ -0,0 +1,107 @@ +diff --git a/configure.ac b/configure.ac +--- a/configure.ac 2016-02-22 14:31:48.000000000 -0600 ++++ b/configure.ac 2016-02-22 14:40:13.665955674 -0600 +@@ -1,10 +1,13 @@ + # configure.ac + ++# Copyright (c) 2016 Google, Inc. ++# Written by Mike Klein and Matt Sarett ++# Derived from the ARM supporting code in libpng/configure.ac, which was + # Copyright (c) 2004-2015 Glenn Randers-Pehrson + # Last changed in libpng 1.6.22 [(PENDING RELEASE)] + + # This code is released under the libpng license. + # For conditions of distribution and use, see the disclaimer + # and license in png.h + + dnl Process this file with autoconf to produce a configure script. +@@ -314,16 +317,50 @@ AC_ARG_ENABLE([arm-neon], + # future host CPU does not match 'arm*') + + AM_CONDITIONAL([PNG_ARM_NEON], + [test "$enable_arm_neon" != 'no' && + case "$host_cpu" in + arm*|aarch64*) :;; + *) test "$enable_arm_neon" != '';; + esac]) ++ ++# INTEL ++# ===== ++# ++# INTEL SSE (SIMD) support. ++ ++AC_ARG_ENABLE([intel-sse], ++ AS_HELP_STRING([[[--enable-intel-sse]]], ++ [Enable Intel SSE optimizations: =no/off, yes/on:] ++ [no/off: disable the optimizations;] ++ [yes/on: enable the optimizations.] ++ [If not specified: determined by the compiler.]), ++ [case "$enableval" in ++ no|off) ++ # disable the default enabling: ++ AC_DEFINE([PNG_INTEL_SSE_OPT], [0], ++ [Disable Intel SSE optimizations]) ++ # Prevent inclusion of the assembler files below: ++ enable_intel_sse=no;; ++ yes|on) ++ AC_DEFINE([PNG_INTEL_SSE_OPT], [1], ++ [Enable Intel SSE optimizations]);; ++ *) ++ AC_MSG_ERROR([--enable-intel-sse=${enable_intel_sse}: invalid value]) ++ esac]) ++ ++# Add Intel specific files to all builds where the host_cpu is Intel ('x86*') ++# or where Intel optimizations were explicitly requested (this allows a ++# fallback if a future host CPU does not match 'x86*') ++AM_CONDITIONAL([PNG_INTEL_SSE], ++ [test "$enable_intel_sse" != 'no' && ++ case "$host_cpu" in ++ i?86|x86_64) :;; ++ *) test "$enable_intel_sse" != '';; + esac]) + + AC_MSG_NOTICE([[Extra options for compiler: $PNG_COPTS]]) + + # Config files, substituting as above + AC_CONFIG_FILES([Makefile libpng.pc:libpng.pc.in]) + AC_CONFIG_FILES([libpng-config:libpng-config.in], + [chmod +x libpng-config]) +diff --git a/Makefile.am b/Makefile.am +--- a/Makefile.am 2016-02-22 14:31:47.000000000 -0600 ++++ b/Makefile.am 2016-02-22 14:42:40.380041684 -0600 +@@ -1,10 +1,13 @@ + # Makefile.am, the source file for Makefile.in (and hence Makefile), is + # ++# Copyright (c) 2016 Google, Inc. ++# Written by Mike Klein and Matt Sarett ++# Derived from the ARM supporting code in libpng/configure.ac, which was + # Copyright (c) 2004-2016 Glenn Randers-Pehrson + # Last changed in libpng 1.6.22 [(PENDING RELEASE)] + # + # This code is released under the libpng license. + # For conditions of distribution and use, see the disclaimer + # and license in png.h + + PNGLIB_BASENAME= libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@ +@@ -83,16 +88,21 @@ libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_SO + pngset.c pngtrans.c pngwio.c pngwrite.c pngwtran.c pngwutil.c\ + png.h pngconf.h pngdebug.h pnginfo.h pngpriv.h pngstruct.h pngusr.dfa + + if PNG_ARM_NEON + libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_SOURCES += arm/arm_init.c\ + arm/filter_neon.S arm/filter_neon_intrinsics.c + endif + ++if PNG_INTEL_SSE ++libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_SOURCES += contrib/intel/intel_init.c\ ++ contrib/intel/filter_sse2_intrinsics.c ++endif ++ + nodist_libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_SOURCES = pnglibconf.h + + libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_LDFLAGS = -no-undefined -export-dynamic \ + -version-number @PNGLIB_MAJOR@@PNGLIB_MINOR@:@PNGLIB_RELEASE@:0 + + if HAVE_LD_VERSION_SCRIPT + # Versioned symbols and restricted exports + if HAVE_SOLARIS_LD