summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2014-01-16 17:59:45 -0800
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-02-22 04:38:28 +0100
commitd7287f595a5a8fe5d44d0b8c821362a4bb290c96 (patch)
treedcaf62f2b258a91c4a4e480eb261e6c9f11b7d25 /src
parent1704cecfac5cf42d98c97e552f04dca8f5dbe287 (diff)
Make QTextDecoder use our qt_from_latin1 code
Disassembly shows the Intel compiler does expand to SIMD, but a much worse code than ours. Clang 3.4 does generate a compact SIMD version, probably of the same quality as our hand-written code. And GCC 4.7 through 4.9 don't generate SIMD at all. So let's use the most efficient version. Change-Id: I418e201a774ac0df1fb2b7a7d9589df7c9b655db Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src')
-rw-r--r--src/corelib/codecs/qtextcodec.cpp10
-rw-r--r--src/corelib/tools/qstring.cpp2
2 files changed, 6 insertions, 6 deletions
diff --git a/src/corelib/codecs/qtextcodec.cpp b/src/corelib/codecs/qtextcodec.cpp
index 2552ddebe9..7e3e629c47 100644
--- a/src/corelib/codecs/qtextcodec.cpp
+++ b/src/corelib/codecs/qtextcodec.cpp
@@ -993,6 +993,8 @@ QString QTextDecoder::toUnicode(const char *chars, int len)
return c->toUnicode(chars, len, &state);
}
+// in qstring.cpp:
+void qt_from_latin1(ushort *dst, const char *str, size_t size);
/*! \overload
@@ -1005,12 +1007,10 @@ void QTextDecoder::toUnicode(QString *target, const char *chars, int len)
case 106: // utf8
static_cast<const QUtf8Codec*>(c)->convertToUnicode(target, chars, len, &state);
break;
- case 4: { // latin1
+ case 4: // latin1
target->resize(len);
- ushort *data = (ushort*)target->data();
- for (int i = len; i >=0; --i)
- data[i] = (uchar) chars[i];
- } break;
+ qt_from_latin1((ushort*)target->data(), chars, len);
+ break;
default:
*target = c->toUnicode(chars, len, &state);
}
diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp
index 50f616a010..2b58100baa 100644
--- a/src/corelib/tools/qstring.cpp
+++ b/src/corelib/tools/qstring.cpp
@@ -210,7 +210,7 @@ inline RetType UnrollTailLoop<0>::exec(int, RetType returnIfExited, Functor1, Fu
#endif
// conversion between Latin 1 and UTF-16
-static void qt_from_latin1(ushort *dst, const char *str, size_t size)
+void qt_from_latin1(ushort *dst, const char *str, size_t size)
{
/* SIMD:
* Unpacking with SSE has been shown to improve performance on recent CPUs