mirror of
https://github.com/open-goal/jak-project
synced 2026-06-17 07:08:17 -04:00
[decompiler] Add tests and fixes for vector-h and math (#333)
* before messing with ssa stuff * fix ash * bounding box
This commit is contained in:
@@ -2822,4 +2822,131 @@ TEST_F(FormRegressionTest, LoopingCode) {
|
||||
" (the-as symbol #f)\n"
|
||||
" )";
|
||||
test_with_expr(func, type, expected);
|
||||
}
|
||||
|
||||
TEST_F(FormRegressionTest, AbsAsSideEffect) {
|
||||
std::string func =
|
||||
"sll r0, r0, 0\n"
|
||||
" dsubu v1, a1, a0\n"
|
||||
" or a3, v1, r0\n"
|
||||
" bltzl a3, L14\n"
|
||||
|
||||
" dsubu a3, r0, a3\n"
|
||||
|
||||
"L14:\n"
|
||||
" slt a3, a2, a3\n"
|
||||
" bne a3, r0, L15\n"
|
||||
" sll r0, r0, 0\n"
|
||||
|
||||
" or v0, a1, r0\n"
|
||||
" beq r0, r0, L17\n"
|
||||
" sll r0, r0, 0\n"
|
||||
|
||||
"L15:\n"
|
||||
" slt v1, v1, r0\n"
|
||||
" bne v1, r0, L16\n"
|
||||
" sll r0, r0, 0\n"
|
||||
|
||||
" daddu v0, a0, a2\n"
|
||||
" beq r0, r0, L17\n"
|
||||
" sll r0, r0, 0\n"
|
||||
|
||||
"L16:\n"
|
||||
" dsubu v0, a0, a2\n"
|
||||
|
||||
"L17:\n"
|
||||
" jr ra\n"
|
||||
" daddu sp, sp, r0";
|
||||
std::string type = "(function int int int int)";
|
||||
std::string expected =
|
||||
"(let* ((v1-0 (- arg1 arg0))\n"
|
||||
" (a3-0 (abs v1-0))\n" // modified
|
||||
" )\n"
|
||||
//" (set! a3-0 (abs a3-0))\n"
|
||||
" (cond\n"
|
||||
" ((>= arg2 a3-0)\n"
|
||||
" arg1\n"
|
||||
" )\n"
|
||||
" ((>= v1-0 0)\n"
|
||||
" (+ arg0 arg2)\n"
|
||||
" )\n"
|
||||
" (else\n"
|
||||
" (- arg0 arg2)\n"
|
||||
" )\n"
|
||||
" )\n"
|
||||
" )";
|
||||
test_with_expr(func, type, expected);
|
||||
}
|
||||
|
||||
// for github https://github.com/water111/jak-project/issues/332
|
||||
// method 11 bit-array
|
||||
TEST_F(FormRegressionTest, AshPropagation) {
|
||||
// (ash a2-0 a3-0)
|
||||
std::string func =
|
||||
"sll r0, r0, 0\n"
|
||||
" dsra v1, a1, 3\n"
|
||||
" daddu v1, v1, a0\n"
|
||||
" lbu v1, 8(v1)\n" // (-> arg0 bytes (sar arg1 3)) [LOAD]
|
||||
" addiu a2, r0, 1\n"
|
||||
" andi a3, a1, 7\n"
|
||||
" bgezl a3, L17\n" // use
|
||||
|
||||
" dsllv a2, a2, a3\n" // use, def
|
||||
|
||||
" dsubu a3, r0, a3\n" // use
|
||||
" dsrav a2, a2, a3\n" // (ash 1 (logand arg1 7)
|
||||
|
||||
"L17:\n"
|
||||
" or v1, v1, a2\n" // (logior (-> arg0 bytes (sar arg1 3)) (ash 1 (logand arg1 7)))
|
||||
" dsra a1, a1, 3\n" // compute source.
|
||||
" daddu a0, a1, a0\n"
|
||||
|
||||
" sb v1, 8(a0)\n"
|
||||
" or v0, r0, r0\n"
|
||||
" jr ra\n"
|
||||
" daddu sp, sp, r0";
|
||||
std::string type = "(function bit-array int int)";
|
||||
std::string expected =
|
||||
"(begin\n"
|
||||
" (set!\n"
|
||||
" (-> arg0 bytes (sar arg1 3))\n"
|
||||
" (logior (-> arg0 bytes (sar arg1 3)) (the-as uint (ash 1 (logand arg1 7))))\n"
|
||||
" )\n"
|
||||
" 0\n"
|
||||
" )";
|
||||
test_with_expr(func, type, expected);
|
||||
}
|
||||
|
||||
// for github https://github.com/water111/jak-project/issues/332
|
||||
// method 9 bit-array
|
||||
// also checks output prop.
|
||||
TEST_F(FormRegressionTest, AshPropagation2) {
|
||||
// (ash a2-0 a3-0)
|
||||
std::string func =
|
||||
"sll r0, r0, 0\n"
|
||||
"L20:\n"
|
||||
" dsra v1, a1, 3\n"
|
||||
" daddu v1, v1, a0\n"
|
||||
" lbu v1, 8(v1)\n"
|
||||
" daddiu v0, s7, 8\n"
|
||||
" addiu a0, r0, 1\n"
|
||||
" andi a1, a1, 7\n"
|
||||
" bgezl a1, L21\n"
|
||||
|
||||
" dsllv a0, a0, a1\n"
|
||||
|
||||
" dsubu a1, r0, a1\n"
|
||||
" dsrav a0, a0, a1\n"
|
||||
|
||||
"L21:\n"
|
||||
" and v1, v1, a0\n"
|
||||
" movz v0, s7, v1\n"
|
||||
" jr ra\n"
|
||||
" daddu sp, sp, r0";
|
||||
std::string type = "(function bit-array int symbol)";
|
||||
std::string expected =
|
||||
"(let ((v1-2 (-> arg0 bytes (sar arg1 3))))\n"
|
||||
" (nonzero? (logand v1-2 (the-as uint (ash 1 (logand arg1 7)))))\n"
|
||||
" )";
|
||||
test_with_expr(func, type, expected);
|
||||
}
|
||||
Reference in New Issue
Block a user