[Decompiler] More support for bitfields (#363)

* temp

* initial support for dynamic bitfields

* some more progress on display

* dma-buffer good

* small fixes
This commit is contained in:
water111
2021-04-17 18:35:50 -04:00
committed by GitHub
parent ab6a40a352
commit 9867155e7c
28 changed files with 1215 additions and 397 deletions
+209 -1
View File
@@ -788,4 +788,212 @@ TEST_F(FormRegressionTest, DmaInitialize) {
test_with_expr(func, type, expected, false, "", {},
"[[1, \"v1\", \"vif-bank\"], [8, \"v1\", \"vif-bank\"], [6, \"a0\", "
"\"vif-bank\"], [13, \"a0\", \"vif-bank\"]]");
}
}
// Dynamic bitfield stuff.
TEST_F(FormRegressionTest, SetDisplayEnv) {
std::string func =
"sll r0, r0, 0\n"
" ori v1, r0, 65441\n"
" sd v1, 0(a0)\n"
" addiu v1, r0, 3\n"
" sd v1, 8(a0)\n"
" dsll32 v1, t2, 23\n"
" dsrl32 v1, v1, 23\n"
" dsra t2, a2, 6\n"
" dsll32 t2, t2, 26\n"
" dsrl32 t2, t2, 17\n"
" or v1, v1, t2\n"
" dsll32 a1, a1, 27\n"
" dsrl32 a1, a1, 12\n"
" or v1, v1, a1\n"
" sd v1, 16(a0)\n"
" addiu v1, r0, 2559\n"
" dsll32 v1, v1, 0\n"
" daddiu a1, a2, 2559\n"
" div a1, a2\n"
" mflo a1\n"
" daddiu a1, a1, -1\n"
" dsll32 a1, a1, 28\n"
" dsrl32 a1, a1, 5\n"
" or v1, v1, a1\n"
" dsll a1, a3, 1\n"
" daddiu a1, a1, -1\n"
" dsll32 a1, a1, 21\n"
" dsrl a1, a1, 9\n"
" or v1, v1, a1\n"
" addiu a1, r0, 2560\n"
" div a1, a2\n"
" mflo a1\n"
" mult3 a1, t0, a1\n"
" daddiu a1, a1, 652\n"
" dsll32 a1, a1, 20\n"
" dsrl32 a1, a1, 20\n"
" or v1, v1, a1\n"
" daddiu a1, t1, 50\n"
" dsll32 a1, a1, 21\n"
" dsrl32 a1, a1, 9\n"
" or v1, v1, a1\n"
" sd v1, 24(a0)\n"
" sd r0, 32(a0)\n"
" or v0, a0, r0\n"
" jr ra\n"
" daddu sp, sp, r0";
std::string type = "(function display-env int int int int int int display-env)";
std::string expected =
"(begin\n"
" (set!\n"
" (-> arg0 pmode)\n"
" (new (quote static) (quote gs-pmode) :en1 1 :mmod 1 :slbg 1 :alp 255)\n"
" )\n"
" (set! (-> arg0 smode2) (new (quote static) (quote gs-smode2) :int 1 :ffmd 1))\n"
" (set!\n"
" (-> arg0 dspfb)\n"
" (new\n"
" (quote static)\n"
" (quote gs-display-fb)\n"
" :psm\n"
" arg1\n"
" :fbw\n"
" (sar arg2 6)\n"
" :fbp\n"
" arg6\n"
" )\n"
" )\n"
" (set!\n"
" (-> arg0 display)\n"
" (new\n"
" (quote static)\n"
" (quote gs-display)\n"
" :dw\n"
" 2559\n"
" :dy\n"
" (+ arg5 50)\n"
" :dx\n"
" (+ (* arg4 (/ 2560 arg2)) 652)\n"
" :dh\n"
" (+ (shl arg3 1) -1)\n"
" :magh\n"
" (+ (/ (+ arg2 2559) arg2) -1)\n"
" )\n"
" )\n"
" (set! (-> arg0 bgcolor) (new (quote static) (quote gs-bgcolor)))\n"
" arg0\n"
" )";
test_with_expr(func, type, expected);
}
TEST_F(FormRegressionTest, DmaBufferAddVuFunction) {
std::string func =
"sll r0, r0, 0\n"
" daddiu v1, a1, 16\n"
" lw a3, 8(a1)\n"
" lw a1, 4(a1)\n"
" beq r0, r0, L9\n"
" sll r0, r0, 0\n"
"L6:\n"
" addiu t0, r0, 127\n"
" or t1, a3, r0\n"
" slt t2, t0, t1\n"
" movz t0, t1, t2\n"
" or t1, a0, r0\n"
" lwu t2, 4(t1)\n"
" lui t3, 12288\n"
" dsll32 t4, t0, 16\n"
" dsrl32 t4, t4, 16\n"
" or t3, t3, t4\n"
" dsll32 t4, v1, 1\n"
" dsrl t4, t4, 1\n"
" or t3, t3, t4\n"
" sd t3, 0(t2)\n"
" bne a2, r0, L7\n"
" sll r0, r0, 0\n"
" addiu t3, r0, 16\n"
" beq r0, r0, L8\n"
" sll r0, r0, 0\n"
"L7:\n"
" addiu t3, r0, 19\n"
"L8:\n"
" dsll32 t3, t3, 25\n"
" dsrl32 t3, t3, 1\n"
" sw t3, 8(t2)\n"
" lui t3, 18944\n"
" dsll32 t4, a1, 16\n"
" dsrl32 t4, t4, 16\n"
" or t3, t3, t4\n"
" dsll t4, t0, 1\n"
" dsll32 t4, t4, 24\n"
" dsrl32 t4, t4, 8\n"
" or t3, t3, t4\n"
" sw t3, 12(t2)\n"
" daddiu t2, t2, 16\n"
" sw t2, 4(t1)\n"
" dsll t1, t0, 4\n"
" daddu v1, v1, t1\n"
" dsubu a3, a3, t0\n"
" dsll t0, t0, 1\n"
" daddu a1, a1, t0\n"
" or t0, a1, r0\n"
"L9:\n"
" slt t0, r0, a3\n"
" bne t0, r0, L6\n"
" sll r0, r0, 0\n"
" or v0, s7, r0\n"
" jr ra\n"
" daddu sp, sp, r0";
std::string type = "(function dma-buffer vu-function int symbol)";
std::string expected =
"(begin\n"
" (let ((v1-0 (the-as pointer (&-> arg1 data 4)))\n"
" (a3-0 (-> arg1 qlength))\n"
" (a1-1 (-> arg1 origin))\n"
" )\n"
" (while (> a3-0 0)\n"
" (let ((t0-1 (min 127 a3-0)))\n"
" (let* ((t1-1 arg0)\n"
" (t2-0 (the-as dma-packet (-> t1-1 base)))\n"
" )\n"
" (set!\n"
" (-> (the-as dma-packet t2-0) dma)\n"
" (new\n"
" (quote static)\n"
" (quote dma-tag)\n"
" :id\n"
" 3\n"
" :addr\n"
" (the-as int v1-0)\n"
" :qwc\n"
" t0-1\n"
" )\n"
" )\n"
" (set!\n"
" (-> (the-as dma-packet t2-0) vif0)\n"
" (new (quote static) (quote vif-tag) :cmd (if (zero? arg2)\n"
" 16\n"
" 19\n"
" )\n"
" )\n"
" )\n"
" (set!\n"
" (-> (the-as dma-packet t2-0) vif1)\n"
" (new (quote static) (quote vif-tag) :cmd 74 :num (shl t0-1 1) :imm a1-1)\n"
" )\n"
" (set! (-> t1-1 base) (&+ (the-as pointer t2-0) 16))\n"
" )\n"
" (&+! v1-0 (shl t0-1 4))\n"
" (set! a3-0 (- a3-0 t0-1))\n"
" (+! a1-1 (shl t0-1 1))\n"
" )\n"
" )\n"
" )\n"
" #f\n"
" )";
test_with_expr(func, type, expected, false, "", {}, "[[[9, 33], \"t2\", \"dma-packet\"]]");
}