From f3cbb883f2a7611c7f9a3847aeba3c16dd4276f9 Mon Sep 17 00:00:00 2001 From: Tsuda Kageyu Date: Sun, 28 Apr 2013 02:57:51 +0900 Subject: [PATCH] Fixed detection of alignment-tolerant CPUs --- taglib/toolkit/tstring.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/taglib/toolkit/tstring.cpp b/taglib/toolkit/tstring.cpp index eeba15af..392f32ed 100644 --- a/taglib/toolkit/tstring.cpp +++ b/taglib/toolkit/tstring.cpp @@ -32,6 +32,12 @@ #include #include +// x86 CPUs are alignment-tolerant or allow pointer casts from smaller types to larger types. +#if defined(__i386__) || defined(_M_IX86) || defined(__amd64) || defined(__amd64__) \ + || defined(_M_AMD64) || defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) +# define TAGLIB_ALIGNMENT_TOLERANT 1 +#endif + #ifdef HAVE_STD_CODECVT # include #else @@ -805,16 +811,12 @@ void String::copyFromUTF16(const wchar_t *s, size_t length, Type t) void String::copyFromUTF16(const char *s, size_t length, Type t) { -#if !defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64)) - - // It's certain that sizeof(wchar_t) == 2 and alignment-tolerant. +#if SIZEOF_WCHAR_T == 2 && defined(TAGLIB_ALIGNMENT_TOLERANT) copyFromUTF16(reinterpret_cast(s), length / 2, t); #else - // Maybe sizeof(wchar_t) != 2 or alignment-strict. - bool swap; if(t == UTF16) { if(length < 2) {