diff --git a/include/share/Makefile.am b/include/share/Makefile.am index 2cc1cd35..217faac6 100644 --- a/include/share/Makefile.am +++ b/include/share/Makefile.am @@ -7,6 +7,7 @@ SUBDIRS = grabbag EXTRA_DIST = \ alloc.h \ compat.h \ + endswap.h \ getopt.h \ grabbag.h \ replaygain_analysis.h \ diff --git a/include/share/endswap.h b/include/share/endswap.h new file mode 100644 index 00000000..5262075e --- /dev/null +++ b/include/share/endswap.h @@ -0,0 +1,49 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2012 Xiph.org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* It is assumed that this header will be included after "config.h". */ + +#if HAVE_BYTESWAP_H + +#include /* Linux */ + +#define ENDSWAP_INT(x) ((int) bswap_32 (x)) + +#elif defined _MSC_VER /* Windows. Apparently in . */ + +#define ENDSWAP_INT(x) ((int) _byteswap_ulong (x)) + +#else + +#define ENDSWAP_INT(x) ((((x) >> 24) & 0xFF) + (((x) >> 8) & 0xFF00) + (((x) & 0xFF00) << 8) + (((x) & 0xFF) << 24)) + +#endif + diff --git a/src/libFLAC/bitreader.c b/src/libFLAC/bitreader.c index c639a3e4..b4e44ed6 100644 --- a/src/libFLAC/bitreader.c +++ b/src/libFLAC/bitreader.c @@ -33,24 +33,13 @@ # include #endif -#include /* for malloc() */ -#include /* for memcpy(), memset() */ -#ifdef _MSC_VER -# include /* for ntohl() */ -# if _MSC_VER >= 1310 -# include /* for ntohl(), sometimes it is not in winsock.h */ -# endif -#elif defined FLAC__SYS_DARWIN -# include /* for ntohl() */ -#elif defined __MINGW32__ -# include /* for ntohl() */ -#else -# include /* for ntohl() */ -#endif +#include +#include #include "private/bitmath.h" #include "private/bitreader.h" #include "private/crc.h" #include "FLAC/assert.h" +#include "share/endswap.h" /* Things should be fastest when this matches the machine word size */ /* WATCHOUT: if you change this you must also change the following #defines down to COUNT_ZERO_MSBS below to match */ @@ -64,11 +53,7 @@ typedef FLAC__uint32 brword; #if WORDS_BIGENDIAN #define SWAP_BE_WORD_TO_HOST(x) (x) #else -#ifdef _MSC_VER -#define SWAP_BE_WORD_TO_HOST(x) local_swap32_(x) -#else -#define SWAP_BE_WORD_TO_HOST(x) ntohl(x) -#endif +#define SWAP_BE_WORD_TO_HOST(x) ENDSWAP_INT(x) #endif /* counts the # of zero MSBs in a word */ #define COUNT_ZERO_MSBS(word) ( \ @@ -152,36 +137,6 @@ struct FLAC__BitReader { FLAC__CPUInfo cpu_info; }; -#ifdef _MSC_VER -/* OPT: an MSVC built-in would be better */ -/* OPT: use _byteswap_ulong intrinsic? */ -static _inline FLAC__uint32 local_swap32_(FLAC__uint32 x) -{ - x = ((x<<8)&0xFF00FF00) | ((x>>8)&0x00FF00FF); - return (x>>16) | (x<<16); -} -#ifdef _WIN64 -#else -static void local_swap32_block_(FLAC__uint32 *start, FLAC__uint32 len) -{ - __asm { - mov edx, start - mov ecx, len - test ecx, ecx -loop1: - jz done1 - mov eax, [edx] - bswap eax - mov [edx], eax - add edx, 4 - dec ecx - jmp short loop1 -done1: - } -} -#endif -#endif - static FLaC__INLINE void crc16_update_word_(FLAC__BitReader *br, brword word) { register unsigned crc = br->read_crc16; @@ -270,13 +225,6 @@ FLAC__bool bitreader_read_from_client_(FLAC__BitReader *br) #if WORDS_BIGENDIAN #else end = (br->words*FLAC__BYTES_PER_WORD + br->bytes + bytes + (FLAC__BYTES_PER_WORD-1)) / FLAC__BYTES_PER_WORD; -# if defined(_MSC_VER) && !defined(_WIN64) && (FLAC__BYTES_PER_WORD == 4) - if(br->cpu_info.type == FLAC__CPUINFO_TYPE_IA32 && br->cpu_info.data.ia32.bswap) { - start = br->words; - local_swap32_block_(br->buffer + start, end - start); - } - else -# endif for(start = br->words; start < end; start++) br->buffer[start] = SWAP_BE_WORD_TO_HOST(br->buffer[start]); #endif diff --git a/src/libFLAC/bitwriter.c b/src/libFLAC/bitwriter.c index 280253f3..ed7d379b 100644 --- a/src/libFLAC/bitwriter.c +++ b/src/libFLAC/bitwriter.c @@ -33,27 +33,13 @@ # include #endif -#include /* for malloc() */ -#include /* for memcpy(), memset() */ -#ifdef _MSC_VER -# include /* for ntohl() */ -# if _MSC_VER >= 1310 -# include /* for ntohl(), sometimes it is not in winsock.h */ -# endif -#elif defined FLAC__SYS_DARWIN -# include /* for ntohl() */ -#elif defined __MINGW32__ -# include /* for ntohl() */ -#else -# include /* for ntohl() */ -#endif -#if 0 /* UNUSED */ -#include "private/bitmath.h" -#endif +#include +#include #include "private/bitwriter.h" #include "private/crc.h" #include "FLAC/assert.h" #include "share/alloc.h" +#include "share/endswap.h" /* Things should be fastest when this matches the machine word size */ /* WATCHOUT: if you change this you must also change the following #defines down to SWAP_BE_WORD_TO_HOST below to match */ @@ -66,11 +52,7 @@ typedef FLAC__uint32 bwword; #if WORDS_BIGENDIAN #define SWAP_BE_WORD_TO_HOST(x) (x) #else -#ifdef _MSC_VER -#define SWAP_BE_WORD_TO_HOST(x) local_swap32_(x) -#else -#define SWAP_BE_WORD_TO_HOST(x) ntohl(x) -#endif +#define SWAP_BE_WORD_TO_HOST(x) ENDSWAP_INT(x) #endif /* @@ -110,15 +92,6 @@ struct FLAC__BitWriter { unsigned bits; /* # of used bits in accum */ }; -#ifdef _MSC_VER -/* OPT: an MSVC built-in would be better */ -static _inline FLAC__uint32 local_swap32_(FLAC__uint32 x) -{ - x = ((x<<8)&0xFF00FF00) | ((x>>8)&0x00FF00FF); - return (x>>16) | (x<<16); -} -#endif - /* * WATCHOUT: The current implementation only grows the buffer. */ static FLAC__bool bitwriter_grow_(FLAC__BitWriter *bw, unsigned bits_to_add) {