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:
parent
2c0dc88715
commit
043f21df7d
1 changed files with 42 additions and 22 deletions
|
@ -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]") {
|
||||||
|
|
Loading…
Reference in a new issue