1
0
Fork 0
mirror of https://git.suyu.dev/suyu/dynarmic.git synced 2025-03-04 13:16:04 +00:00

tests/A64: Update {S,U}SHL tests

Converted tests to use oaknut, and added some extra test cases. SSHL's
additional tests are targetd to make sure that the sign of the lowest
byte is used to determine shift direction, not the entire element. USHL
targets this as well as just having more negative (right shift) cases in
general.
This commit is contained in:
zmt00 2024-02-22 19:23:02 -08:00 committed by merry
parent 2c0dc88715
commit 043f21df7d

View file

@ -256,60 +256,80 @@ TEST_CASE("A64: SSHL", "[a64]") {
A64TestEnv env; A64TestEnv env;
A64::Jit jit{A64::UserConfig{&env}}; A64::Jit jit{A64::UserConfig{&env}};
env.code_mem.emplace_back(0x4e204484); // SSHL v4.16b, v4.16b, v0.16b oaknut::VectorCodeGenerator code{env.code_mem, nullptr};
env.code_mem.emplace_back(0x4e6144a5); // SSHL v5.8h, v5.8h, v1.8h code.SSHL(V4.B16(), V4.B16(), V0.B16());
env.code_mem.emplace_back(0x4ea244c6); // SSHL v6.4s, v6.4s, v2.4s code.SSHL(V5.H8(), V5.H8(), V1.H8());
env.code_mem.emplace_back(0x4ee344e7); // SSHL v7.2d, v7.2d, v3.2d code.SSHL(V6.S4(), V6.S4(), V2.S4());
env.code_mem.emplace_back(0x14000000); // B . code.SSHL(V7.D2(), V7.D2(), V3.D2());
code.SSHL(V17.D2(), V17.D2(), V13.D2());
jit.SetPC(0); jit.SetPC(0);
jit.SetVector(0, {0xEFF0FAFBFCFDFEFF, 0x0807050403020100}); jit.SetVector(0, {0xEFF0FAFBFCFDFEFF, 0x0807050403020100});
jit.SetVector(1, {0xFFFCFFFDFFFEFFFF, 0x0004000300020001}); jit.SetVector(1, {0x00FCFFFDFFFEFFFF, 0xFF04000300020001});
jit.SetVector(2, {0xFFFFFFFDFFFFFFFE, 0x0000000200000001}); jit.SetVector(2, {0x000000FDFFFFFFFE, 0xFFFFFF0200000001});
jit.SetVector(3, {0xFFFFFFFFFFFFFFFF, 0x0000000000000001}); jit.SetVector(3, {0xFFFFFFFFFFFFFFFF, 0x0000000000000001});
jit.SetVector(13, {0x00000000000000FF, 0xFFFFFFFFFFFFFF01});
jit.SetVector(4, {0x8080808080808080, 0xFFFFFFFFFFFFFFFF}); jit.SetVector(4, {0x8080808080808080, 0xFFFFFFFFFFFFFFFF});
jit.SetVector(5, {0x8000800080008000, 0xFFFFFFFFFFFFFFFF}); jit.SetVector(5, {0x8000800080008000, 0xFFFFFFFFFFFFFFFF});
jit.SetVector(6, {0x8000000080000000, 0xFFFFFFFFFFFFFFFF}); jit.SetVector(6, {0x8000000080000000, 0xFFFFFFFFFFFFFFFF});
jit.SetVector(7, {0x8000000000000000, 0xFFFFFFFFFFFFFFFF}); jit.SetVector(7, {0x8000000000000000, 0xFFFFFFFFFFFFFFFF});
jit.SetVector(17, {0x8000000000000000, 0xFFFFFFFFFFFFFFFF});
env.ticks_left = 4; env.ticks_left = env.code_mem.size();
jit.Run(); jit.Run();
REQUIRE(jit.GetVector(4) == Vector{0xfffffefcf8f0e0c0, 0x0080e0f0f8fcfeff}); CHECK(jit.GetVector(4) == Vector{0xfffffefcf8f0e0c0, 0x0080e0f0f8fcfeff});
REQUIRE(jit.GetVector(5) == Vector{0xf800f000e000c000, 0xfff0fff8fffcfffe}); CHECK(jit.GetVector(5) == Vector{0xf800f000e000c000, 0xfff0fff8fffcfffe});
REQUIRE(jit.GetVector(6) == Vector{0xf0000000e0000000, 0xfffffffcfffffffe}); CHECK(jit.GetVector(6) == Vector{0xf0000000e0000000, 0xfffffffcfffffffe});
REQUIRE(jit.GetVector(7) == Vector{0xc000000000000000, 0xfffffffffffffffe}); CHECK(jit.GetVector(7) == Vector{0xc000000000000000, 0xfffffffffffffffe});
CHECK(jit.GetVector(17) == Vector{0xc000000000000000, 0xfffffffffffffffe});
} }
TEST_CASE("A64: USHL", "[a64]") { TEST_CASE("A64: USHL", "[a64]") {
A64TestEnv env; A64TestEnv env;
A64::Jit jit{A64::UserConfig{&env}}; A64::Jit jit{A64::UserConfig{&env}};
env.code_mem.emplace_back(0x6e204484); // USHL v4.16b, v4.16b, v0.16b oaknut::VectorCodeGenerator code{env.code_mem, nullptr};
env.code_mem.emplace_back(0x6e6144a5); // USHL v5.8h, v5.8h, v1.8h code.USHL(V4.B16(), V4.B16(), V0.B16());
env.code_mem.emplace_back(0x6ea244c6); // USHL v6.4s, v6.4s, v2.4s code.USHL(V14.B8(), V14.B8(), V10.B8());
env.code_mem.emplace_back(0x6ee344e7); // USHL v7.2d, v7.2d, v3.2d code.USHL(V5.H8(), V5.H8(), V1.H8());
env.code_mem.emplace_back(0x14000000); // B . code.USHL(V15.H4(), V15.H4(), V11.H4());
code.USHL(V6.S4(), V6.S4(), V2.S4());
code.USHL(V16.S2(), V16.S2(), V12.S2());
code.USHL(V7.D2(), V7.D2(), V3.D2());
code.USHL(V17.D2(), V17.D2(), V13.D2());
jit.SetPC(0); jit.SetPC(0);
jit.SetVector(0, {0x10FE0E0D0C0B0A09, 0x0807050403020100}); jit.SetVector(0, {0x10FE0E0D0C0B0A09, 0x0807050403020100});
jit.SetVector(10, {0xF6F7F8F9FAFBFCFD});
jit.SetVector(1, {0xFFFE000700060005, 0x0004000300020001}); jit.SetVector(1, {0xFFFE000700060005, 0x0004000300020001});
jit.SetVector(11, {0x00F1FF0F00F08010});
jit.SetVector(2, {0xFFFFFFFE00000003, 0x0000000200000001}); jit.SetVector(2, {0xFFFFFFFE00000003, 0x0000000200000001});
jit.SetVector(12, {0x000000E18000001F});
jit.SetVector(3, {0xFFFFFFFFFFFFFFFE, 0x0000000000000001}); jit.SetVector(3, {0xFFFFFFFFFFFFFFFE, 0x0000000000000001});
jit.SetVector(13, {0x00000000000000C1, 0xFF0000000000003F});
jit.SetVector(4, {0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF}); jit.SetVector(4, {0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF});
jit.SetVector(14, {0x8080808080808080});
jit.SetVector(5, {0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF}); jit.SetVector(5, {0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF});
jit.SetVector(15, {0x80000001FFFFFFFF});
jit.SetVector(6, {0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF}); jit.SetVector(6, {0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF});
jit.SetVector(16, {0x8000000000000001});
jit.SetVector(7, {0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF}); jit.SetVector(7, {0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF});
jit.SetVector(17, {0x8000000000000000, 0x0000000000000001});
env.ticks_left = 4; env.ticks_left = env.code_mem.size();
jit.Run(); jit.Run();
REQUIRE(jit.GetVector(4) == Vector{0x003f000000000000, 0x0080e0f0f8fcfeff}); CHECK(jit.GetVector(4) == Vector{0x003f000000000000, 0x0080e0f0f8fcfeff});
REQUIRE(jit.GetVector(5) == Vector{0x3fffff80ffc0ffe0, 0xfff0fff8fffcfffe}); CHECK(jit.GetVector(14) == Vector{0x0000000102040810});
REQUIRE(jit.GetVector(6) == Vector{0x3ffffffffffffff8, 0xfffffffcfffffffe}); CHECK(jit.GetVector(5) == Vector{0x3fffff80ffc0ffe0, 0xfff0fff8fffcfffe});
REQUIRE(jit.GetVector(7) == Vector{0x3fffffffffffffff, 0xfffffffffffffffe}); CHECK(jit.GetVector(15) == Vector{0x0001800000000000});
CHECK(jit.GetVector(6) == Vector{0x3ffffffffffffff8, 0xfffffffcfffffffe});
CHECK(jit.GetVector(16) == Vector{0x0000000180000000});
CHECK(jit.GetVector(7) == Vector{0x3fffffffffffffff, 0xfffffffffffffffe});
CHECK(jit.GetVector(17) == Vector{0x0000000000000001, 0x8000000000000000});
} }
TEST_CASE("A64: URSHL", "[a64]") { TEST_CASE("A64: URSHL", "[a64]") {