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>
This commit is contained in:
Thiago Macieira 2014-01-16 17:59:45 -08:00 committed by The Qt Project
parent 1704cecfac
commit d7287f595a
2 changed files with 6 additions and 6 deletions

View File

@ -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);
}

View File

@ -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