diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-11-05 15:04:35 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-11-05 15:04:35 +0100 |
| commit | 6f0d09536405c1a80faa3f27f377d23a551dd8e8 (patch) | |
| tree | 70dbb422d644f4103edd6b4251f95763d46da11e | |
| parent | cc661c75493a94aede5839456acbc37d1a40b3f1 (diff) | |
| download | box64-6f0d09536405c1a80faa3f27f377d23a551dd8e8.tar.gz box64-6f0d09536405c1a80faa3f27f377d23a551dd8e8.zip | |
Fixed some issue with some SSE4.2 string compare oprations (should help #1013)
| -rw-r--r-- | src/emu/x64compstrings.c | 4 | ||||
| -rw-r--r-- | tests/ref27.txt | 192 | ||||
| -rwxr-xr-x | tests/test27 | bin | 232896 -> 282056 bytes | |||
| -rw-r--r-- | tests/test27.c | 2 |
4 files changed, 196 insertions, 2 deletions
diff --git a/src/emu/x64compstrings.c b/src/emu/x64compstrings.c index 72781ebb..d61a516c 100644 --- a/src/emu/x64compstrings.c +++ b/src/emu/x64compstrings.c @@ -89,8 +89,8 @@ uint32_t sse42_compare_string_explicit_len(x64emu_t* emu, sse_regs_t* mem, int l // build intres2 uint32_t intres2 = intres1; switch((imm8>>4)&3) { - case 0b01: intres2 ^= ((1<<n_packed)-1); - case 0b11: intres2 ^= ((1<<lmem)-1); + case 0b01: intres2 ^= ((1<<n_packed)-1); break; + case 0b11: intres2 ^= ((1<<lmem)-1); break; } // and now set the flags RESET_FLAGS(emu); diff --git a/tests/ref27.txt b/tests/ref27.txt index 6283aec8..09cef0c4 100644 --- a/tests/ref27.txt +++ b/tests/ref27.txt @@ -383,6 +383,198 @@ mm_cmpestrm("", 0, "This is a string", 16, 0xd) = 0000000000000000-0000000000000 _mm_cmpistri("", "This is a string", 0xd) => 0 _mm_cmpestri("", "This is a string", 0xd) flags: a:0 s:1 z:0 c:1 o:1 mm_cmpestrm("", "This is a string", 0xd) = 0000000000000000-00000000000000ff +_mm_cmpestri("This is a string", 16, "This", 4, 0x10) => 4 +_mm_cmpestri("This is a string", 16, "This", 4, 0x10) flags: a:0 s:0 z:1 c:1 o:0 +mm_cmpestrm("This is a string", 16, "This", 4, 0x10) = 0000000000000000-000000000000fff0 +_mm_cmpistri("This is a string", "This", 0x10) => 4 +_mm_cmpestri("This is a string", "This", 0x10) flags: a:0 s:0 z:1 c:1 o:0 +mm_cmpestrm("This is a string", "This", 0x10) = 0000000000000000-000000000000fff0 +_mm_cmpestri("This is a string", 16, "This", 4, 0x11) => 4 +_mm_cmpestri("This is a string", 16, "This", 4, 0x11) flags: a:0 s:0 z:1 c:1 o:0 +mm_cmpestrm("This is a string", 16, "This", 4, 0x11) = 0000000000000000-00000000000000f0 +_mm_cmpistri("This is a string", "This", 0x11) => 4 +_mm_cmpestri("This is a string", "This", 0x11) flags: a:0 s:0 z:1 c:1 o:0 +mm_cmpestrm("This is a string", "This", 0x11) = 0000000000000000-00000000000000f0 +_mm_cmpestri("This", 4, "This is a string", 16, 0x10) => 4 +_mm_cmpestri("This", 4, "This is a string", 16, 0x10) flags: a:0 s:1 z:0 c:1 o:0 +mm_cmpestrm("This", 4, "This is a string", 16, 0x10) = 0000000000000000-000000000000db90 +_mm_cmpistri("This", "This is a string", 0x10) => 4 +_mm_cmpestri("This", "This is a string", 0x10) flags: a:0 s:1 z:0 c:1 o:0 +mm_cmpestrm("This", "This is a string", 0x10) = 0000000000000000-000000000000db90 +_mm_cmpestri("This", 4, "This is a string", 16, 0x11) => 4 +_mm_cmpestri("This", 4, "This is a string", 16, 0x11) flags: a:0 s:1 z:0 c:1 o:0 +mm_cmpestrm("This", 4, "This is a string", 16, 0x11) = 0000000000000000-0000000000000090 +_mm_cmpistri("This", "This is a string", 0x11) => 4 +_mm_cmpestri("This", "This is a string", 0x11) flags: a:0 s:1 z:0 c:1 o:0 +mm_cmpestrm("This", "This is a string", 0x11) = 0000000000000000-0000000000000090 +_mm_cmpestri("This is a string", 16, "is", 2, 0x10) => 2 +_mm_cmpestri("This is a string", 16, "is", 2, 0x10) flags: a:0 s:0 z:1 c:1 o:0 +mm_cmpestrm("This is a string", 16, "is", 2, 0x10) = 0000000000000000-000000000000fffc +_mm_cmpistri("This is a string", "is", 0x10) => 2 +_mm_cmpestri("This is a string", "is", 0x10) flags: a:0 s:0 z:1 c:1 o:0 +mm_cmpestrm("This is a string", "is", 0x10) = 0000000000000000-000000000000fffc +_mm_cmpestri("This is a string", 16, "is", 2, 0x11) => 2 +_mm_cmpestri("This is a string", 16, "is", 2, 0x11) flags: a:0 s:0 z:1 c:1 o:0 +mm_cmpestrm("This is a string", 16, "is", 2, 0x11) = 0000000000000000-00000000000000fc +_mm_cmpistri("This is a string", "is", 0x11) => 2 +_mm_cmpestri("This is a string", "is", 0x11) flags: a:0 s:0 z:1 c:1 o:0 +mm_cmpestrm("This is a string", "is", 0x11) = 0000000000000000-00000000000000fc +_mm_cmpestri("is", 2, "This is a string", 16, 0x10) => 0 +_mm_cmpestri("is", 2, "This is a string", 16, 0x10) flags: a:0 s:1 z:0 c:1 o:1 +mm_cmpestrm("is", 2, "This is a string", 16, 0x10) = 0000000000000000-000000000000db93 +_mm_cmpistri("is", "This is a string", 0x10) => 0 +_mm_cmpestri("is", "This is a string", 0x10) flags: a:0 s:1 z:0 c:1 o:1 +mm_cmpestrm("is", "This is a string", 0x10) = 0000000000000000-000000000000db93 +_mm_cmpestri("is", 2, "This is a string", 16, 0x11) => 0 +_mm_cmpestri("is", 2, "This is a string", 16, 0x11) flags: a:0 s:1 z:0 c:1 o:1 +mm_cmpestrm("is", 2, "This is a string", 16, 0x11) = 0000000000000000-0000000000000093 +_mm_cmpistri("is", "This is a string", 0x11) => 0 +_mm_cmpestri("is", "This is a string", 0x11) flags: a:0 s:1 z:0 c:1 o:1 +mm_cmpestrm("is", "This is a string", 0x11) = 0000000000000000-0000000000000093 +_mm_cmpestri("This is a string", 16, "maestrum-foo-bar", 16, 0x10) => 0 +_mm_cmpestri("This is a string", 16, "maestrum-foo-bar", 16, 0x10) flags: a:0 s:0 z:0 c:1 o:1 +mm_cmpestrm("This is a string", 16, "maestrum-foo-bar", 16, 0x10) = 0000000000000000-0000000000003fc5 +_mm_cmpistri("This is a string", "maestrum-foo-bar", 0x10) => 0 +_mm_cmpestri("This is a string", "maestrum-foo-bar", 0x10) flags: a:0 s:0 z:0 c:1 o:1 +mm_cmpestrm("This is a string", "maestrum-foo-bar", 0x10) = 0000000000000000-0000000000003fc5 +_mm_cmpestri("This is a string", 16, "maestrum-foo-bar", 16, 0x11) => 0 +_mm_cmpestri("This is a string", 16, "maestrum-foo-bar", 16, 0x11) flags: a:0 s:0 z:0 c:1 o:1 +mm_cmpestrm("This is a string", 16, "maestrum-foo-bar", 16, 0x11) = 0000000000000000-00000000000000f7 +_mm_cmpistri("This is a string", "maestrum-foo-bar", 0x11) => 0 +_mm_cmpestri("This is a string", "maestrum-foo-bar", 0x11) flags: a:0 s:0 z:0 c:1 o:1 +mm_cmpestrm("This is a string", "maestrum-foo-bar", 0x11) = 0000000000000000-00000000000000f7 +_mm_cmpestri("maestrum-foo-bar", 16, "This is a string", 16, 0x10) => 0 +_mm_cmpestri("maestrum-foo-bar", 16, "This is a string", 16, 0x10) flags: a:0 s:0 z:0 c:1 o:1 +mm_cmpestrm("maestrum-foo-bar", 16, "This is a string", 16, 0x10) = 0000000000000000-000000000000e2b7 +_mm_cmpistri("maestrum-foo-bar", "This is a string", 0x10) => 0 +_mm_cmpestri("maestrum-foo-bar", "This is a string", 0x10) flags: a:0 s:0 z:0 c:1 o:1 +mm_cmpestrm("maestrum-foo-bar", "This is a string", 0x10) = 0000000000000000-000000000000e2b7 +_mm_cmpestri("maestrum-foo-bar", 16, "This is a string", 16, 0x11) => 0 +_mm_cmpestri("maestrum-foo-bar", 16, "This is a string", 16, 0x11) flags: a:0 s:0 z:0 c:1 o:1 +mm_cmpestrm("maestrum-foo-bar", 16, "This is a string", 16, 0x11) = 0000000000000000-00000000000000b7 +_mm_cmpistri("maestrum-foo-bar", "This is a string", 0x11) => 0 +_mm_cmpestri("maestrum-foo-bar", "This is a string", 0x11) flags: a:0 s:0 z:0 c:1 o:1 +mm_cmpestrm("maestrum-foo-bar", "This is a string", 0x11) = 0000000000000000-00000000000000b7 +_mm_cmpestri("This is a string", 16, "", 0, 0x10) => 0 +_mm_cmpestri("This is a string", 16, "", 0, 0x10) flags: a:0 s:0 z:1 c:1 o:1 +mm_cmpestrm("This is a string", 16, "", 0, 0x10) = 0000000000000000-000000000000ffff +_mm_cmpistri("This is a string", "", 0x10) => 0 +_mm_cmpestri("This is a string", "", 0x10) flags: a:0 s:0 z:1 c:1 o:1 +mm_cmpestrm("This is a string", "", 0x10) = 0000000000000000-000000000000ffff +_mm_cmpestri("This is a string", 16, "", 0, 0x11) => 0 +_mm_cmpestri("This is a string", 16, "", 0, 0x11) flags: a:0 s:0 z:1 c:1 o:1 +mm_cmpestrm("This is a string", 16, "", 0, 0x11) = 0000000000000000-00000000000000ff +_mm_cmpistri("This is a string", "", 0x11) => 0 +_mm_cmpestri("This is a string", "", 0x11) flags: a:0 s:0 z:1 c:1 o:1 +mm_cmpestrm("This is a string", "", 0x11) = 0000000000000000-00000000000000ff +_mm_cmpestri("", 0, "This is a string", 16, 0x10) => 0 +_mm_cmpestri("", 0, "This is a string", 16, 0x10) flags: a:0 s:1 z:0 c:1 o:1 +mm_cmpestrm("", 0, "This is a string", 16, 0x10) = 0000000000000000-000000000000ffff +_mm_cmpistri("", "This is a string", 0x10) => 0 +_mm_cmpestri("", "This is a string", 0x10) flags: a:0 s:1 z:0 c:1 o:1 +mm_cmpestrm("", "This is a string", 0x10) = 0000000000000000-000000000000ffff +_mm_cmpestri("", 0, "This is a string", 16, 0x11) => 0 +_mm_cmpestri("", 0, "This is a string", 16, 0x11) flags: a:0 s:1 z:0 c:1 o:1 +mm_cmpestrm("", 0, "This is a string", 16, 0x11) = 0000000000000000-00000000000000ff +_mm_cmpistri("", "This is a string", 0x11) => 0 +_mm_cmpestri("", "This is a string", 0x11) flags: a:0 s:1 z:0 c:1 o:1 +mm_cmpestrm("", "This is a string", 0x11) = 0000000000000000-00000000000000ff +_mm_cmpestri("This is a string", 16, "This", 4, 0x30) => 16 +_mm_cmpestri("This is a string", 16, "This", 4, 0x30) flags: a:0 s:0 z:1 c:0 o:0 +mm_cmpestrm("This is a string", 16, "This", 4, 0x30) = 0000000000000000-0000000000000000 +_mm_cmpistri("This is a string", "This", 0x30) => 16 +_mm_cmpestri("This is a string", "This", 0x30) flags: a:0 s:0 z:1 c:0 o:0 +mm_cmpestrm("This is a string", "This", 0x30) = 0000000000000000-0000000000000000 +_mm_cmpestri("This is a string", 16, "This", 4, 0x31) => 8 +_mm_cmpestri("This is a string", 16, "This", 4, 0x31) flags: a:0 s:0 z:1 c:0 o:0 +mm_cmpestrm("This is a string", 16, "This", 4, 0x31) = 0000000000000000-0000000000000000 +_mm_cmpistri("This is a string", "This", 0x31) => 8 +_mm_cmpestri("This is a string", "This", 0x31) flags: a:0 s:0 z:1 c:0 o:0 +mm_cmpestrm("This is a string", "This", 0x31) = 0000000000000000-0000000000000000 +_mm_cmpestri("This", 4, "This is a string", 16, 0x30) => 4 +_mm_cmpestri("This", 4, "This is a string", 16, 0x30) flags: a:0 s:1 z:0 c:1 o:0 +mm_cmpestrm("This", 4, "This is a string", 16, 0x30) = 0000000000000000-000000000000db90 +_mm_cmpistri("This", "This is a string", 0x30) => 4 +_mm_cmpestri("This", "This is a string", 0x30) flags: a:0 s:1 z:0 c:1 o:0 +mm_cmpestrm("This", "This is a string", 0x30) = 0000000000000000-000000000000db90 +_mm_cmpestri("This", 4, "This is a string", 16, 0x31) => 4 +_mm_cmpestri("This", 4, "This is a string", 16, 0x31) flags: a:0 s:1 z:0 c:1 o:0 +mm_cmpestrm("This", 4, "This is a string", 16, 0x31) = 0000000000000000-0000000000000090 +_mm_cmpistri("This", "This is a string", 0x31) => 4 +_mm_cmpestri("This", "This is a string", 0x31) flags: a:0 s:1 z:0 c:1 o:0 +mm_cmpestrm("This", "This is a string", 0x31) = 0000000000000000-0000000000000090 +_mm_cmpestri("This is a string", 16, "is", 2, 0x30) => 16 +_mm_cmpestri("This is a string", 16, "is", 2, 0x30) flags: a:0 s:0 z:1 c:0 o:0 +mm_cmpestrm("This is a string", 16, "is", 2, 0x30) = 0000000000000000-0000000000000000 +_mm_cmpistri("This is a string", "is", 0x30) => 16 +_mm_cmpestri("This is a string", "is", 0x30) flags: a:0 s:0 z:1 c:0 o:0 +mm_cmpestrm("This is a string", "is", 0x30) = 0000000000000000-0000000000000000 +_mm_cmpestri("This is a string", 16, "is", 2, 0x31) => 8 +_mm_cmpestri("This is a string", 16, "is", 2, 0x31) flags: a:0 s:0 z:1 c:0 o:0 +mm_cmpestrm("This is a string", 16, "is", 2, 0x31) = 0000000000000000-0000000000000000 +_mm_cmpistri("This is a string", "is", 0x31) => 8 +_mm_cmpestri("This is a string", "is", 0x31) flags: a:0 s:0 z:1 c:0 o:0 +mm_cmpestrm("This is a string", "is", 0x31) = 0000000000000000-0000000000000000 +_mm_cmpestri("is", 2, "This is a string", 16, 0x30) => 0 +_mm_cmpestri("is", 2, "This is a string", 16, 0x30) flags: a:0 s:1 z:0 c:1 o:1 +mm_cmpestrm("is", 2, "This is a string", 16, 0x30) = 0000000000000000-000000000000db93 +_mm_cmpistri("is", "This is a string", 0x30) => 0 +_mm_cmpestri("is", "This is a string", 0x30) flags: a:0 s:1 z:0 c:1 o:1 +mm_cmpestrm("is", "This is a string", 0x30) = 0000000000000000-000000000000db93 +_mm_cmpestri("is", 2, "This is a string", 16, 0x31) => 0 +_mm_cmpestri("is", 2, "This is a string", 16, 0x31) flags: a:0 s:1 z:0 c:1 o:1 +mm_cmpestrm("is", 2, "This is a string", 16, 0x31) = 0000000000000000-0000000000000093 +_mm_cmpistri("is", "This is a string", 0x31) => 0 +_mm_cmpestri("is", "This is a string", 0x31) flags: a:0 s:1 z:0 c:1 o:1 +mm_cmpestrm("is", "This is a string", 0x31) = 0000000000000000-0000000000000093 +_mm_cmpestri("This is a string", 16, "maestrum-foo-bar", 16, 0x30) => 0 +_mm_cmpestri("This is a string", 16, "maestrum-foo-bar", 16, 0x30) flags: a:0 s:0 z:0 c:1 o:1 +mm_cmpestrm("This is a string", 16, "maestrum-foo-bar", 16, 0x30) = 0000000000000000-0000000000003fc5 +_mm_cmpistri("This is a string", "maestrum-foo-bar", 0x30) => 0 +_mm_cmpestri("This is a string", "maestrum-foo-bar", 0x30) flags: a:0 s:0 z:0 c:1 o:1 +mm_cmpestrm("This is a string", "maestrum-foo-bar", 0x30) = 0000000000000000-0000000000003fc5 +_mm_cmpestri("This is a string", 16, "maestrum-foo-bar", 16, 0x31) => 0 +_mm_cmpestri("This is a string", 16, "maestrum-foo-bar", 16, 0x31) flags: a:0 s:0 z:0 c:1 o:1 +mm_cmpestrm("This is a string", 16, "maestrum-foo-bar", 16, 0x31) = 0000000000000000-00000000000000f7 +_mm_cmpistri("This is a string", "maestrum-foo-bar", 0x31) => 0 +_mm_cmpestri("This is a string", "maestrum-foo-bar", 0x31) flags: a:0 s:0 z:0 c:1 o:1 +mm_cmpestrm("This is a string", "maestrum-foo-bar", 0x31) = 0000000000000000-00000000000000f7 +_mm_cmpestri("maestrum-foo-bar", 16, "This is a string", 16, 0x30) => 0 +_mm_cmpestri("maestrum-foo-bar", 16, "This is a string", 16, 0x30) flags: a:0 s:0 z:0 c:1 o:1 +mm_cmpestrm("maestrum-foo-bar", 16, "This is a string", 16, 0x30) = 0000000000000000-000000000000e2b7 +_mm_cmpistri("maestrum-foo-bar", "This is a string", 0x30) => 0 +_mm_cmpestri("maestrum-foo-bar", "This is a string", 0x30) flags: a:0 s:0 z:0 c:1 o:1 +mm_cmpestrm("maestrum-foo-bar", "This is a string", 0x30) = 0000000000000000-000000000000e2b7 +_mm_cmpestri("maestrum-foo-bar", 16, "This is a string", 16, 0x31) => 0 +_mm_cmpestri("maestrum-foo-bar", 16, "This is a string", 16, 0x31) flags: a:0 s:0 z:0 c:1 o:1 +mm_cmpestrm("maestrum-foo-bar", 16, "This is a string", 16, 0x31) = 0000000000000000-00000000000000b7 +_mm_cmpistri("maestrum-foo-bar", "This is a string", 0x31) => 0 +_mm_cmpestri("maestrum-foo-bar", "This is a string", 0x31) flags: a:0 s:0 z:0 c:1 o:1 +mm_cmpestrm("maestrum-foo-bar", "This is a string", 0x31) = 0000000000000000-00000000000000b7 +_mm_cmpestri("This is a string", 16, "", 0, 0x30) => 16 +_mm_cmpestri("This is a string", 16, "", 0, 0x30) flags: a:0 s:0 z:1 c:0 o:0 +mm_cmpestrm("This is a string", 16, "", 0, 0x30) = 0000000000000000-0000000000000000 +_mm_cmpistri("This is a string", "", 0x30) => 16 +_mm_cmpestri("This is a string", "", 0x30) flags: a:0 s:0 z:1 c:0 o:0 +mm_cmpestrm("This is a string", "", 0x30) = 0000000000000000-0000000000000000 +_mm_cmpestri("This is a string", 16, "", 0, 0x31) => 8 +_mm_cmpestri("This is a string", 16, "", 0, 0x31) flags: a:0 s:0 z:1 c:0 o:0 +mm_cmpestrm("This is a string", 16, "", 0, 0x31) = 0000000000000000-0000000000000000 +_mm_cmpistri("This is a string", "", 0x31) => 8 +_mm_cmpestri("This is a string", "", 0x31) flags: a:0 s:0 z:1 c:0 o:0 +mm_cmpestrm("This is a string", "", 0x31) = 0000000000000000-0000000000000000 +_mm_cmpestri("", 0, "This is a string", 16, 0x30) => 0 +_mm_cmpestri("", 0, "This is a string", 16, 0x30) flags: a:0 s:1 z:0 c:1 o:1 +mm_cmpestrm("", 0, "This is a string", 16, 0x30) = 0000000000000000-000000000000ffff +_mm_cmpistri("", "This is a string", 0x30) => 0 +_mm_cmpestri("", "This is a string", 0x30) flags: a:0 s:1 z:0 c:1 o:1 +mm_cmpestrm("", "This is a string", 0x30) = 0000000000000000-000000000000ffff +_mm_cmpestri("", 0, "This is a string", 16, 0x31) => 0 +_mm_cmpestri("", 0, "This is a string", 16, 0x31) flags: a:0 s:1 z:0 c:1 o:1 +mm_cmpestrm("", 0, "This is a string", 16, 0x31) = 0000000000000000-00000000000000ff +_mm_cmpistri("", "This is a string", 0x31) => 0 +_mm_cmpestri("", "This is a string", 0x31) flags: a:0 s:1 z:0 c:1 o:1 +mm_cmpestrm("", "This is a string", 0x31) = 0000000000000000-00000000000000ff _mm_cmpestri("This is a string", 16, "This", 4, 0x4c) => 16 _mm_cmpestri("This is a string", 16, "This", 4, 0x4c) flags: a:0 s:0 z:1 c:0 o:0 mm_cmpestrm("This is a string", 16, "This", 4, 0x4c) = 0000000000000000-0000000000000000 diff --git a/tests/test27 b/tests/test27 index fdde43c8..abe2dafb 100755 --- a/tests/test27 +++ b/tests/test27 Binary files differdiff --git a/tests/test27.c b/tests/test27.c index 140cb4c2..37847e07 100644 --- a/tests/test27.c +++ b/tests/test27.c @@ -101,6 +101,8 @@ int main(int argc, const char** argv) GO2(0x04) GO2(0x08) GO2(0x0c) + GO2(0x10) + GO2(0x30) GO2(0b1001100) GO2(0b0101100) GO2(0b0110100) |