Improve endswapping (especially purge ntohl).
authorErik de Castro Lopo <erikd@mega-nerd.com>
Sat, 4 Feb 2012 11:06:23 +0000 (22:06 +1100)
committerErik de Castro Lopo <erikd@mega-nerd.com>
Sun, 5 Feb 2012 00:24:14 +0000 (11:24 +1100)
include/share/Makefile.am
include/share/endswap.h [new file with mode: 0644]
src/libFLAC/bitreader.c
src/libFLAC/bitwriter.c

index 2cc1cd3..217faac 100644 (file)
@@ -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 (file)
index 0000000..5262075
--- /dev/null
@@ -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 <byteswap.h>          /* Linux */
+
+#define        ENDSWAP_INT(x)          ((int) bswap_32 (x))
+
+#elif defined _MSC_VER         /* Windows. Apparently in <stdlib.h>. */
+
+#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
+
index c639a3e..b4e44ed 100644 (file)
 #  include <config.h>
 #endif
 
-#include <stdlib.h> /* for malloc() */
-#include <string.h> /* for memcpy(), memset() */
-#ifdef _MSC_VER
-# include <winsock.h> /* for ntohl() */
-# if _MSC_VER >= 1310
-#  include <winsock2.h> /* for ntohl(), sometimes it is not in winsock.h */
-# endif
-#elif defined FLAC__SYS_DARWIN
-# include <machine/endian.h> /* for ntohl() */
-#elif defined __MINGW32__
-# include <winsock.h> /* for ntohl() */
-#else
-# include <netinet/in.h> /* for ntohl() */
-#endif
+#include <stdlib.h>
+#include <string.h>
 #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
index 280253f..ed7d379 100644 (file)
 #  include <config.h>
 #endif
 
-#include <stdlib.h> /* for malloc() */
-#include <string.h> /* for memcpy(), memset() */
-#ifdef _MSC_VER
-# include <winsock.h> /* for ntohl() */
-# if _MSC_VER >= 1310
-#  include <winsock2.h> /* for ntohl(), sometimes it is not in winsock.h */
-# endif
-#elif defined FLAC__SYS_DARWIN
-# include <machine/endian.h> /* for ntohl() */
-#elif defined __MINGW32__
-# include <winsock.h> /* for ntohl() */
-#else
-# include <netinet/in.h> /* for ntohl() */
-#endif
-#if 0 /* UNUSED */
-#include "private/bitmath.h"
-#endif
+#include <stdlib.h>
+#include <string.h>
 #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)
 {