mirror of
https://github.com/open-goal/jak-project
synced 2026-08-10 19:17:55 -04:00
[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:
@@ -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\"]]");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user