[decompiler] clean up vector detection and add vector float product detection (#638)

* change

* recognize vector float product and update tests
This commit is contained in:
water111
2021-06-27 17:24:35 -04:00
committed by GitHub
parent bfb1fbe1fc
commit a6d5c4eda3
146 changed files with 1085 additions and 1653 deletions
+144 -149
View File
@@ -526,157 +526,152 @@ TEST_F(FormRegressionTest, ExprDisasmVif) {
" (logand sv-16 (the-as uint (-> *vif-disasm-table* v1-0 mask)))\n"
" (-> *vif-disasm-table* v1-0 tag)\n"
" )\n"
" (let* ((a0-12 (-> *vif-disasm-table* v1-0 print))\n"
" (v0-1 (cond\n"
" ((zero? a0-12)\n"
" (format\n"
" arg2\n"
" \" (~s :irq ~D)~%\"\n"
" (-> *vif-disasm-table* v1-0 string1)\n"
" (-> s1-0 irq)\n"
" )\n"
" )\n"
" ((= a0-12 1)\n"
" (format\n"
" arg2\n"
" \" (~s :irq ~D :~s #x~X)~%\"\n"
" (-> *vif-disasm-table* v1-0 string1)\n"
" (-> s1-0 irq)\n"
" (-> *vif-disasm-table* v1-0 string2)\n"
" (-> s1-0 imm)\n"
" )\n"
" )\n"
" ((= a0-12 2)\n"
" (let ((t1-1 (-> s1-0 imm)))\n"
" (format\n"
" arg2\n"
" \" (~s :irq ~D :wl ~D :cl ~D)~%\"\n"
" (-> *vif-disasm-table* v1-0 string1)\n"
" (-> s1-0 irq)\n"
" (shr (shl t1-1 48) 56)\n"
" (shr (shl t1-1 56) 56)\n"
" )\n"
" )\n"
" )\n"
" ((= a0-12 3)\n"
" (set! s0-0 8)\n"
" (format\n"
" arg2\n"
" \" (~s :irq ~D :~s #x~X)~%\"\n"
" (-> *vif-disasm-table* v1-0 string1)\n"
" (-> s1-0 irq)\n"
" (-> *vif-disasm-table* v1-0 string2)\n"
" (-> arg0 1)\n"
" )\n"
" )\n"
" ((= a0-12 4)\n"
" (set! s0-0 20)\n"
" (format\n"
" arg2\n"
" \" (~s :irq ~D :~s \"\n"
" (-> *vif-disasm-table* v1-0 string1)\n"
" (-> s1-0 irq)\n"
" (-> *vif-disasm-table* v1-0 string2)\n"
" )\n"
" (format\n"
" arg2\n"
" \"#x~X #x~X #x~X #x~X)~%\"\n"
" (-> arg0 1)\n"
" (-> arg0 2)\n"
" (-> arg0 3)\n"
" (-> arg0 4)\n"
" )\n"
" )\n"
" ((= a0-12 5)\n"
" (format\n"
" arg2\n"
" \" (~s :irq ~D :instructions #x~D :addr #x~X)~%\"\n"
" (-> *vif-disasm-table* v1-0 string1)\n"
" (-> s1-0 irq)\n"
" (-> s1-0 num)\n"
" (-> s1-0 imm)\n"
" )\n"
" )\n"
" ((= a0-12 6)\n"
" (if (-> s1-0 imm)\n"
" (set! s0-0 #x100000)\n"
" (set! s0-0 (the-as int (* (-> s1-0 imm) 16)))\n"
" )\n"
" (format\n"
" arg2\n"
" \" (~s :irq ~D :qwc #x~D)~%\"\n"
" (-> *vif-disasm-table* v1-0 string1)\n"
" (-> s1-0 irq)\n"
" (-> s1-0 imm)\n"
" )\n"
" (set! sv-32 (&-> arg0 1))\n"
" (set! sv-48 0)\n"
" (while (< sv-48 (the-as int (-> s1-0 imm)))\n"
" (format\n"
" arg2\n"
" \" #x~X: #x~8x #x~8x #x~8x #x~8x~%\"\n"
" (+ (+ (* sv-48 16) 4) (the-as int arg0))\n"
" (-> sv-32 (* sv-48 4))\n"
" (-> sv-32 (+ (* sv-48 4) 1))\n"
" (-> sv-32 (+ (* sv-48 4) 2))\n"
" (-> sv-32 (+ (* sv-48 4) 3))\n"
" )\n"
" (set! sv-48 (+ sv-48 1))\n"
" )\n"
" #f\n"
" )\n"
" ((= a0-12 7)\n"
" (set!\n"
" s0-0\n"
" (the-as\n"
" int\n"
" (+\n"
" (logand\n"
" -4\n"
" (the-as\n"
" int\n"
" (+\n"
" (* (-> *vif-disasm-table* v1-0 val) (-> s1-0 num))\n"
" 3\n"
" )\n"
" )\n"
" )\n"
" 4\n"
" )\n"
" )\n"
" )\n"
" (set! sv-64 (-> s1-0 imm))\n"
" (format\n"
" arg2\n"
" \" (~s :irq ~D :num ~D :addr #x~X \"\n"
" (-> *vif-disasm-table* v1-0 string1)\n"
" (-> s1-0 irq)\n"
" (-> s1-0 num)\n"
" (shr (shl sv-64 54) 54)\n"
" )\n"
" (format\n"
" arg2\n"
" \":msk ~D :flg ~D :usn ~D [skip ~d])~%\"\n"
" (-> s1-0 msk)\n"
" (shr (shl sv-64 48) 63)\n"
" (shr (shl sv-64 49) 63)\n"
" (the-as uint s0-0)\n"
" )\n"
" (if arg3\n"
" (disasm-vif-details\n"
" arg2\n"
" (the-as (pointer uint8) arg0)\n"
" (logand sv-16 (vif-cmd cmd-mask))\n"
" (the-as int (-> s1-0 num))\n"
" )\n"
" )\n"
" )\n"
" ((= a0-12 8)\n"
" (format arg2 \" (*unknown* vif-tag #x~X)~%\" (-> s1-0 cmd))\n"
" )\n"
" )\n"
" (let ((a0-12 (-> *vif-disasm-table* v1-0 print)))\n"
" (cond\n"
" ((zero? a0-12)\n"
" (format\n"
" arg2\n"
" \" (~s :irq ~D)~%\"\n"
" (-> *vif-disasm-table* v1-0 string1)\n"
" (-> s1-0 irq)\n"
" )\n"
" )\n"
" ((= a0-12 1)\n"
" (format\n"
" arg2\n"
" \" (~s :irq ~D :~s #x~X)~%\"\n"
" (-> *vif-disasm-table* v1-0 string1)\n"
" (-> s1-0 irq)\n"
" (-> *vif-disasm-table* v1-0 string2)\n"
" (-> s1-0 imm)\n"
" )\n"
" )\n"
" ((= a0-12 2)\n"
" (let ((t1-1 (-> s1-0 imm)))\n"
" (format\n"
" arg2\n"
" \" (~s :irq ~D :wl ~D :cl ~D)~%\"\n"
" (-> *vif-disasm-table* v1-0 string1)\n"
" (-> s1-0 irq)\n"
" (shr (shl t1-1 48) 56)\n"
" (shr (shl t1-1 56) 56)\n"
" )\n"
" )\n"
" )\n"
" ((= a0-12 3)\n"
" (set! s0-0 8)\n"
" (format\n"
" arg2\n"
" \" (~s :irq ~D :~s #x~X)~%\"\n"
" (-> *vif-disasm-table* v1-0 string1)\n"
" (-> s1-0 irq)\n"
" (-> *vif-disasm-table* v1-0 string2)\n"
" (-> arg0 1)\n"
" )\n"
" )\n"
" ((= a0-12 4)\n"
" (set! s0-0 20)\n"
" (format\n"
" arg2\n"
" \" (~s :irq ~D :~s \"\n"
" (-> *vif-disasm-table* v1-0 string1)\n"
" (-> s1-0 irq)\n"
" (-> *vif-disasm-table* v1-0 string2)\n"
" )\n"
" (format\n"
" arg2\n"
" \"#x~X #x~X #x~X #x~X)~%\"\n"
" (-> arg0 1)\n"
" (-> arg0 2)\n"
" (-> arg0 3)\n"
" (-> arg0 4)\n"
" )\n"
" )\n"
" ((= a0-12 5)\n"
" (format\n"
" arg2\n"
" \" (~s :irq ~D :instructions #x~D :addr #x~X)~%\"\n"
" (-> *vif-disasm-table* v1-0 string1)\n"
" (-> s1-0 irq)\n"
" (-> s1-0 num)\n"
" (-> s1-0 imm)\n"
" )\n"
" )\n"
" ((= a0-12 6)\n"
" (if (-> s1-0 imm)\n"
" (set! s0-0 #x100000)\n"
" (set! s0-0 (the-as int (* (-> s1-0 imm) 16)))\n"
" )\n"
" (format\n"
" arg2\n"
" \" (~s :irq ~D :qwc #x~D)~%\"\n"
" (-> *vif-disasm-table* v1-0 string1)\n"
" (-> s1-0 irq)\n"
" (-> s1-0 imm)\n"
" )\n"
" (set! sv-32 (&-> arg0 1))\n"
" (set! sv-48 0)\n"
" (while (< sv-48 (the-as int (-> s1-0 imm)))\n"
" (format\n"
" arg2\n"
" \" #x~X: #x~8x #x~8x #x~8x #x~8x~%\"\n"
" (+ (+ (* sv-48 16) 4) (the-as int arg0))\n"
" (-> sv-32 (* sv-48 4))\n"
" (-> sv-32 (+ (* sv-48 4) 1))\n"
" (-> sv-32 (+ (* sv-48 4) 2))\n"
" (-> sv-32 (+ (* sv-48 4) 3))\n"
" )\n"
" (set! sv-48 (+ sv-48 1))\n"
" )\n"
" #f\n"
" )\n"
" ((= a0-12 7)\n"
" (set!\n"
" s0-0\n"
" (the-as\n"
" int\n"
" (+\n"
" (logand\n"
" -4\n"
" (the-as\n"
" int\n"
" (+ (* (-> *vif-disasm-table* v1-0 val) (-> s1-0 num)) 3)\n"
" )\n"
" )\n"
" 4\n"
" )\n"
" )\n"
" )\n"
" (set! sv-64 (-> s1-0 imm))\n"
" (format\n"
" arg2\n"
" \" (~s :irq ~D :num ~D :addr #x~X \"\n"
" (-> *vif-disasm-table* v1-0 string1)\n"
" (-> s1-0 irq)\n"
" (-> s1-0 num)\n"
" (shr (shl sv-64 54) 54)\n"
" )\n"
" (format\n"
" arg2\n"
" \":msk ~D :flg ~D :usn ~D [skip ~d])~%\"\n"
" (-> s1-0 msk)\n"
" (shr (shl sv-64 48) 63)\n"
" (shr (shl sv-64 49) 63)\n"
" (the-as uint s0-0)\n"
" )\n"
" (if arg3\n"
" (disasm-vif-details\n"
" arg2\n"
" (the-as (pointer uint8) arg0)\n"
" (logand sv-16 (vif-cmd cmd-mask))\n"
" (the-as int (-> s1-0 num))\n"
" )\n"
" )\n"
" )\n"
" ((= a0-12 8)\n"
" (format arg2 \" (*unknown* vif-tag #x~X)~%\" (-> s1-0 cmd))\n"
" )\n"
" )\n"
" )\n"
" (set! v1-0 (-> *vif-disasm-table* length))\n"
" )\n"