diff options
author | Thiago Macieira <thiago.macieira@nokia.com> | 2010-08-12 23:37:47 (GMT) |
---|---|---|
committer | Thiago Macieira <thiago.macieira@nokia.com> | 2010-08-24 10:36:34 (GMT) |
commit | ca9d0f597fe6212aa89fa2d6d45b27bae147d195 (patch) | |
tree | 99a75e4019cd000b4b810ea93a569c6d8651a978 /tests | |
parent | a9dae34157aeef00512bea49f11a8dd1895f676b (diff) | |
download | Qt-ca9d0f597fe6212aa89fa2d6d45b27bae147d195.zip Qt-ca9d0f597fe6212aa89fa2d6d45b27bae147d195.tar.gz Qt-ca9d0f597fe6212aa89fa2d6d45b27bae147d195.tar.bz2 |
Slightly better version that saves EBX in an XMM register
Diffstat (limited to 'tests')
-rw-r--r-- | tests/benchmarks/corelib/tools/qstring/main.cpp | 35 |
1 files changed, 20 insertions, 15 deletions
diff --git a/tests/benchmarks/corelib/tools/qstring/main.cpp b/tests/benchmarks/corelib/tools/qstring/main.cpp index 1c55f82..fb65f65 100644 --- a/tests/benchmarks/corelib/tools/qstring/main.cpp +++ b/tests/benchmarks/corelib/tools/qstring/main.cpp @@ -390,27 +390,32 @@ static bool equals2_sse4(ushort *p1, ushort *p2, int len) // difference found: CF = 1 // all equal, not finished: CF = ZF = SF = 0 // all equal, finished: CF = 0, ZF = SF = 1 - len += 8; + bool result; asm ( + "movd %%ebx, %%xmm1\n\t" + "sub %[p1], %[p2]\n\t" + "mov %[p1], %%ebx\n\t" + "sub $16, %%ebx\n\t" + "add $8, %[len]\n\t" "0:\n\t" - "movdqu (%[p1]), %%xmm0\n\t" // load 8 ushorts - "movdqu (%[p2]), %%xmm1\n\t" - "addl $16, %[p2]\n\t" - "addl $16, %[p1]\n\t" - "subl $8, %[len]\n\t" - "movl %[len], %%edx\n\t" - "pcmpestrm %[mode], %%xmm1, %%xmm0\n\t" + "add $16, %%ebx\n\t" + "sub $8, %[len]\n\t" + "movdqu (%%ebx), %%xmm0\n\t" + "mov %[len], %%edx\n\t" + "pcmpestrm %[mode], (%[p2],%%ebx), %%xmm0\n\t" "ja 0b\n\t" - "1:\n\t" - "mov $0, %[len]\n\t" + "1:\n\t" + "mov $0, %%eax\n\t" "setnc %%al\n\t" - : [len] "+a" (len) - : [p1] "r" (p1), + "movd %%xmm1, %%ebx\n\t" + : [result] "=a" (result) + : [len] "0" (len), + [p1] "d" (p1), [p2] "r" (p2), - [mode] "K" (_SIDD_UWORD_OPS | _SIDD_CMP_EQUAL_EACH | _SIDD_NEGATIVE_POLARITY | _SIDD_UNIT_MASK) - : "%edx", "%xmm0", "%xmm1" + [mode] "K" (_SIDD_UWORD_OPS | _SIDD_CMP_EQUAL_EACH | _SIDD_NEGATIVE_POLARITY) + : "%xmm0", "%xmm1" ); - return len; + return result; } //#endif #endif |