about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-11-05 15:04:35 +0100
committerptitSeb <sebastien.chev@gmail.com>2023-11-05 15:04:35 +0100
commit6f0d09536405c1a80faa3f27f377d23a551dd8e8 (patch)
tree70dbb422d644f4103edd6b4251f95763d46da11e
parentcc661c75493a94aede5839456acbc37d1a40b3f1 (diff)
downloadbox64-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.c4
-rw-r--r--tests/ref27.txt192
-rwxr-xr-xtests/test27bin232896 -> 282056 bytes
-rw-r--r--tests/test27.c2
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)