about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <seebastien.chev@gmail.com>2023-09-04 09:29:55 +0200
committerptitSeb <seebastien.chev@gmail.com>2023-09-04 09:29:55 +0200
commit96025a19771dafc7d17d5f22207f64fde957930e (patch)
tree9760ac76ace4393158d872c2bf76c0fcfb06ad73
parent6e1bcc03a60d105ced5251bac25a52f97e3b6f1c (diff)
downloadbox64-96025a19771dafc7d17d5f22207f64fde957930e.tar.gz
box64-96025a19771dafc7d17d5f22207f64fde957930e.zip
[ARM64_DYNAREC] Fixed 0F 38 00 PSHUFB opcode (thanks @wannacu for the hint)
-rw-r--r--CMakeLists.txt13
-rw-r--r--src/dynarec/arm64/dynarec_arm64_0f.c2
-rw-r--r--tests/ref23.txt1
-rwxr-xr-xtests/test23bin0 -> 15984 bytes
-rw-r--r--tests/test23.c28
5 files changed, 39 insertions, 5 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 716047f2..0fa6d0c5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -945,19 +945,24 @@ add_test(irelative_reloc ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${
     -D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests/ref20.txt
     -P ${CMAKE_SOURCE_DIR}/runTest.cmake )
 
-    add_test(longjumpInSignals ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
+add_test(longjumpInSignals ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
     -D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test21 -D TEST_OUTPUT=tmpfile21.txt
     -D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests/ref21.txt
     -P ${CMAKE_SOURCE_DIR}/runTest.cmake )
 
-    add_test(x87 ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
+add_test(x87 ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
     -D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test22 -D TEST_OUTPUT=tmpfile22.txt
     -D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests/ref22.txt
     -P ${CMAKE_SOURCE_DIR}/runTest.cmake )
 
-    set_tests_properties(x87 PROPERTIES ENVIRONMENT "BOX64_DYNAREC_FASTROUND=0")
+set_tests_properties(x87 PROPERTIES ENVIRONMENT "BOX64_DYNAREC_FASTROUND=0")
 
-    file(GLOB extension_tests "${CMAKE_SOURCE_DIR}/tests/extensions/*.c")
+add_test(pshufb ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
+    -D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test23 -D TEST_OUTPUT=tmpfile23.txt
+    -D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests/ref23.txt
+    -P ${CMAKE_SOURCE_DIR}/runTest.cmake )
+
+file(GLOB extension_tests "${CMAKE_SOURCE_DIR}/tests/extensions/*.c")
 foreach(file ${extension_tests})
     get_filename_component(testname "${file}" NAME_WE)
     add_test(NAME "${testname}" COMMAND ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
diff --git a/src/dynarec/arm64/dynarec_arm64_0f.c b/src/dynarec/arm64/dynarec_arm64_0f.c
index fe39a5e6..d5417113 100644
--- a/src/dynarec/arm64/dynarec_arm64_0f.c
+++ b/src/dynarec/arm64/dynarec_arm64_0f.c
@@ -421,7 +421,7 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     GETGM(q0);

                     GETEM(q1, 0);

                     d0 = fpu_get_scratch(dyn);

-                    MOVI_8(d0, 0b10001111);

+                    MOVI_8(d0, 0b10000111);

                     VAND(d0, d0, q1);  // mask the index

                     VTBL1_8(q0, q0, d0);

                     break;

diff --git a/tests/ref23.txt b/tests/ref23.txt
new file mode 100644
index 00000000..b06138f6
--- /dev/null
+++ b/tests/ref23.txt
@@ -0,0 +1 @@
+Res = 0xefcd00ef
diff --git a/tests/test23 b/tests/test23
new file mode 100755
index 00000000..e6e84636
--- /dev/null
+++ b/tests/test23
Binary files differdiff --git a/tests/test23.c b/tests/test23.c
new file mode 100644
index 00000000..7328a398
--- /dev/null
+++ b/tests/test23.c
@@ -0,0 +1,28 @@
+#include <stdio.h>
+#include <string.h>
+#include <stddef.h>
+#include <stdint.h>
+// Build with `gcc -march=core2 -O2 test23.c -o test23`
+
+uint64_t pshufb(uint64_t Gm, uint64_t Em) {
+uint64_t Res;
+asm(
+"movq %[_Gm], %%mm0\n"
+"movq %[_Em], %%mm1\n"
+"pshufb %%mm1, %%mm0\n"
+"movq %%mm0, %[_Res]\n"
+: [_Res] "+r"(Res)
+: [_Gm] "r"(Gm)
+, [_Em] "r"(Em)
+);
+return Res;
+}
+
+int main() {
+uint64_t Gm = 0x12345678abcdef00;
+uint64_t Em = 0x8182888971727879;
+uint64_t Res = pshufb(Gm, Em);
+printf("Res = 0x%lx\n", Res);
+//assert(Res == 0xefcd00ef);
+return 0;
+}