diff options
| author | ptitSeb <seebastien.chev@gmail.com> | 2023-09-04 09:29:55 +0200 |
|---|---|---|
| committer | ptitSeb <seebastien.chev@gmail.com> | 2023-09-04 09:29:55 +0200 |
| commit | 96025a19771dafc7d17d5f22207f64fde957930e (patch) | |
| tree | 9760ac76ace4393158d872c2bf76c0fcfb06ad73 | |
| parent | 6e1bcc03a60d105ced5251bac25a52f97e3b6f1c (diff) | |
| download | box64-96025a19771dafc7d17d5f22207f64fde957930e.tar.gz box64-96025a19771dafc7d17d5f22207f64fde957930e.zip | |
[ARM64_DYNAREC] Fixed 0F 38 00 PSHUFB opcode (thanks @wannacu for the hint)
| -rw-r--r-- | CMakeLists.txt | 13 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_0f.c | 2 | ||||
| -rw-r--r-- | tests/ref23.txt | 1 | ||||
| -rwxr-xr-x | tests/test23 | bin | 0 -> 15984 bytes | |||
| -rw-r--r-- | tests/test23.c | 28 |
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; +} |