[Decompiler] WIP: Stack Spills (#382)

* set up types

* cleaned up type analysis and got things working through atomic ops

* expression working, need types

* improved types and names

* getting close

* finish up dma-disasm

* fix
This commit is contained in:
water111
2021-04-25 14:48:54 -04:00
committed by GitHub
parent 54ccc9db97
commit 2002db359a
43 changed files with 3187 additions and 99 deletions
+1
View File
@@ -29,6 +29,7 @@ add_executable(goalc-test
${CMAKE_CURRENT_LIST_DIR}/decompiler/test_gkernel_decomp.cpp
${CMAKE_CURRENT_LIST_DIR}/decompiler/test_math_decomp.cpp
${CMAKE_CURRENT_LIST_DIR}/decompiler/test_DataParser.cpp
${CMAKE_CURRENT_LIST_DIR}/decompiler/test_DisasmVifDecompile.cpp
${GOALC_TEST_FRAMEWORK_SOURCES}
${GOALC_TEST_CASES})
+6
View File
@@ -6,6 +6,7 @@
#include "decompiler/analysis/cfg_builder.h"
#include "decompiler/analysis/expression_build.h"
#include "decompiler/analysis/final_output.h"
#include "decompiler/analysis/stack_spill.h"
#include "decompiler/analysis/insert_lets.h"
#include "decompiler/util/config_parsers.h"
#include "common/goos/PrettyPrinter.h"
@@ -153,6 +154,11 @@ std::unique_ptr<FormRegressionTest::TestData> FormRegressionTest::make_function(
fmt::print("CFG:\n{}\n", test->func.cfg->to_dot());
}
// find stack spill slots
auto spill_map = build_spill_map(test->func.instructions,
{test->func.prologue_end, test->func.epilogue_start});
test->func.ir2.env.set_stack_spills(spill_map);
// convert instruction to atomic ops
DecompWarnings warnings;
auto ops = convert_function_to_atomic_ops(test->func, program.labels, warnings);
@@ -3,6 +3,7 @@
(define-extern fact (function int int))
(define-extern max (function int int int))
(define-extern min (function int int int))
(define-extern valid? (function object type basic basic object symbol))
;; KERNEL
(declare-type process basic)
@@ -82,6 +83,10 @@
'(none)
)
(defmacro empty-form ()
'(none)
)
;; math
(define-extern fabs (function float float))
@@ -172,6 +177,7 @@
(unpack-v4-16 109)
(unpack-v4-8 110)
(unpack-v4-5 111)
(cmd-mask 239)
)
(defenum vif-cmd-32
+917
View File
@@ -0,0 +1,917 @@
;;-*-Lisp-*-
(in-package goal)
;; this file is debug only
(when *debug-segment*
;; definition of type vif-disasm-element
(deftype vif-disasm-element (structure)
((mask uint32 :offset-assert 0)
(tag vif-cmd-32 :offset-assert 4)
(val uint32 :offset-assert 8)
(print uint32 :offset-assert 12)
(string1 string :offset-assert 16)
(string2 string :offset-assert 20)
)
:method-count-assert 9
:size-assert #x18
:flag-assert #x900000018
)
;; definition for method 3 of type vif-disasm-element
(defmethod inspect vif-disasm-element ((obj vif-disasm-element))
(format #t "[~8x] ~A~%" obj 'vif-disasm-element)
(format #t "~Tmask: ~D~%" (-> obj mask))
(format #t "~Ttag: ~D~%" (-> obj tag))
(format #t "~Tval: ~D~%" (-> obj val))
(format #t "~Tprint: ~D~%" (-> obj print))
(format #t "~Tstring1: ~A~%" (-> obj string1))
(format #t "~Tstring2: ~A~%" (-> obj string2))
obj
)
;; definition for symbol *vif-disasm-table*, type (array vif-disasm-element)
(define
*vif-disasm-table*
(the-as (array vif-disasm-element)
(new
'static
'boxed-array
vif-disasm-element
34
(new 'static 'vif-disasm-element :mask #x7f :string1 "nop")
(new 'static 'vif-disasm-element
:mask #x7f
:tag (vif-cmd-32 stcycl)
:print #x2
:string1 "stcycl"
)
(new 'static 'vif-disasm-element
:mask #x7f
:tag (vif-cmd-32 offset)
:print #x1
:string1 "offset"
:string2 "offset"
)
(new 'static 'vif-disasm-element
:mask #x7f
:tag (vif-cmd-32 base)
:print #x1
:string1 "base"
:string2 "base"
)
(new 'static 'vif-disasm-element
:mask #x7f
:tag (vif-cmd-32 itop)
:print #x1
:string1 "itop"
:string2 "addr"
)
(new 'static 'vif-disasm-element
:mask #x7f
:tag (vif-cmd-32 stmod)
:print #x1
:string1 "stmod"
:string2 "mode"
)
(new 'static 'vif-disasm-element
:mask #x7f
:tag (vif-cmd-32 mskpath3)
:print #x1
:string1 "mskpath3"
:string2 "mask"
)
(new 'static 'vif-disasm-element
:mask #x7f
:tag (vif-cmd-32 mark)
:print #x1
:string1 "mark"
:string2 "mark"
)
(new 'static 'vif-disasm-element
:mask #x7f
:tag (vif-cmd-32 flushe)
:string1 "flushe"
)
(new 'static 'vif-disasm-element
:mask #x7f
:tag (vif-cmd-32 flush)
:string1 "flush"
)
(new 'static 'vif-disasm-element
:mask #x7f
:tag (vif-cmd-32 flusha)
:string1 "flusha"
)
(new 'static 'vif-disasm-element
:mask #x7f
:tag (vif-cmd-32 mscal)
:print #x1
:string1 "mscal"
:string2 "addr"
)
(new 'static 'vif-disasm-element
:mask #x7f
:tag (vif-cmd-32 mscnt)
:string1 "mscnt"
)
(new 'static 'vif-disasm-element
:mask #x7f
:tag (vif-cmd-32 mscalf)
:print #x1
:string1 "mscalf"
:string2 "addr"
)
(new 'static 'vif-disasm-element
:mask #x7f
:tag (vif-cmd-32 stmask)
:print #x3
:string1 "stmask"
:string2 "mask"
)
(new 'static 'vif-disasm-element
:mask #x7f
:tag (vif-cmd-32 strow)
:print #x4
:string1 "strow"
:string2 "row"
)
(new 'static 'vif-disasm-element
:mask #x7f
:tag (vif-cmd-32 stcol)
:print #x4
:string1 "stcol"
:string2 "col"
)
(new 'static 'vif-disasm-element
:mask #x7f
:tag (vif-cmd-32 mpg)
:print #x5
:string1 "mpg"
)
(new 'static 'vif-disasm-element
:mask #x7f
:tag (vif-cmd-32 direct)
:print #x6
:string1 "direct"
)
(new 'static 'vif-disasm-element
:mask #x7f
:tag (vif-cmd-32 directhl)
:print #x6
:string1 "directhl"
)
(new 'static 'vif-disasm-element
:mask #x6f
:tag (vif-cmd-32 unpack-s-32)
:val #x10
:print #x7
:string1 "unpack-s-32"
)
(new 'static 'vif-disasm-element
:mask #x6f
:tag (vif-cmd-32 unpack-s-16)
:val #x8
:print #x7
:string1 "unpack-s-16"
)
(new 'static 'vif-disasm-element
:mask #x6f
:tag (vif-cmd-32 unpack-s-8)
:val #x4
:print #x7
:string1 "unpack-s-8"
)
(new 'static 'vif-disasm-element
:mask #x6f
:tag (vif-cmd-32 unpack-v2-32)
:val #x8
:print #x7
:string1 "unpack-v2-32"
)
(new 'static 'vif-disasm-element
:mask #x6f
:tag (vif-cmd-32 unpack-v2-16)
:val #x4
:print #x7
:string1 "unpack-v2-16"
)
(new 'static 'vif-disasm-element
:mask #x6f
:tag (vif-cmd-32 unpack-v2-8)
:val #x2
:print #x7
:string1 "unpack-v2-8"
)
(new 'static 'vif-disasm-element
:mask #x6f
:tag (vif-cmd-32 unpack-v3-32)
:val #xc
:print #x7
:string1 "unpack-v3-32"
)
(new 'static 'vif-disasm-element
:mask #x6f
:tag (vif-cmd-32 unpack-v3-16)
:val #x6
:print #x7
:string1 "unpack-v3-16"
)
(new 'static 'vif-disasm-element
:mask #x6f
:tag (vif-cmd-32 unpack-v3-8)
:val #x3
:print #x7
:string1 "unpack-v3-8"
)
(new 'static 'vif-disasm-element
:mask #x6f
:tag (vif-cmd-32 unpack-v4-32)
:val #x10
:print #x7
:string1 "unpack-v4-32"
)
(new 'static 'vif-disasm-element
:mask #x6f
:tag (vif-cmd-32 unpack-v4-16)
:val #x8
:print #x7
:string1 "unpack-v4-16"
)
(new 'static 'vif-disasm-element
:mask #x6f
:tag (vif-cmd-32 unpack-v4-8)
:val #x4
:print #x7
:string1 "unpack-v4-8"
)
(new 'static 'vif-disasm-element
:mask #x6f
:tag (vif-cmd-32 unpack-v4-5)
:val #x2
:print #x7
:string1 "unpack-v4-5"
)
(new 'static 'vif-disasm-element :print #x8)
)
)
)
;; definition for function disasm-vif-details
(defun
disasm-vif-details
((stream symbol) (data (pointer uint8)) (kind vif-cmd) (count int))
(let ((count2 count))
(cond
((= kind (vif-cmd unpack-v4-8))
(let ((data-ptr (&-> data 4)))
(dotimes (i count2)
(format
stream
" #x~X: #x~2X #x~2X #x~2X #x~2X~%"
(+ (+ (shl i 2) 4) (the-as int data))
(-> data-ptr (shl i 2))
(-> data-ptr (+ (shl i 2) 1))
(-> data-ptr (+ (shl i 2) 2))
(-> data-ptr (+ (shl i 2) 3))
)
)
)
)
((= kind (vif-cmd unpack-s-8))
(let ((s3-1 (&-> data 4)))
(dotimes (s2-1 count2)
(format
stream
" #x~X: #x~2x~%"
(+ (+ s2-1 4) (the-as int data))
count
)
(let ((v1-21 (-> s3-1 (* 3 s2-1))))
)
(let ((v1-26 (-> s3-1 (+ (* 3 s2-1) 1))))
)
)
)
)
((= kind (vif-cmd unpack-v4-32))
(let ((s3-2 (the-as (pointer uint32) (&-> data 4))))
(dotimes (s2-2 count2)
(format
stream
" #x~X: #x~8x #x~8x #x~8x #x~8x~%"
(+ (+ (shl s2-2 4) 4) (the-as int data))
(-> s3-2 (shl s2-2 2))
(-> s3-2 (+ (shl s2-2 2) 1))
(-> s3-2 (+ (shl s2-2 2) 2))
(-> s3-2 (+ (shl s2-2 2) 3))
)
)
)
)
((= kind (vif-cmd unpack-v4-16))
(let ((s3-3 (the-as (pointer uint16) (&-> data 4))))
(dotimes (s2-3 count2)
(format
stream
" #x~X: #x~4x #x~4x #x~4x #x~4x~%"
(+ (+ (shl s2-3 3) 4) (the-as int data))
(-> s3-3 (shl s2-3 2))
(-> s3-3 (+ (shl s2-3 2) 1))
(-> s3-3 (+ (shl s2-3 2) 2))
(-> s3-3 (+ (shl s2-3 2) 3))
)
)
)
)
((= kind (vif-cmd unpack-v3-32))
(let ((s3-4 (the-as (pointer uint32) (&-> data 4))))
(dotimes (s2-4 count2)
(format
stream
" #x~X: #x~8x #x~8x #x~8x~%"
(+ (+ (* 12 s2-4) 4) (the-as int data))
(-> (&+ s3-4 (* 12 s2-4)) 0)
(-> s3-4 (+ (* 3 s2-4) 1))
(-> s3-4 (+ (* 3 s2-4) 2))
)
)
)
)
((= kind (vif-cmd unpack-v3-16))
(let ((s3-5 (the-as (pointer uint16) (&-> data 4))))
(dotimes (s2-5 count2)
(format
stream
" #x~X: #x~4x #x~4x #x~4x~%"
(+ (+ (* 6 s2-5) 4) (the-as int data))
(-> (&+ s3-5 (* 6 s2-5)) 0)
(-> s3-5 (+ (* 3 s2-5) 1))
(-> s3-5 (+ (* 3 s2-5) 2))
)
)
)
)
((= kind (vif-cmd unpack-v2-16))
(let ((s3-6 (the-as (pointer uint16) (&-> data 4))))
(dotimes (s2-6 count2)
(format
stream
" #x~X: #x~4x #x~4x~%"
(+ (+ (shl s2-6 2) 4) (the-as int data))
(-> (&+ s3-6 (* 6 s2-6)) 0)
(-> s3-6 (+ (* 3 s2-6) 1))
)
)
)
)
(else
(format
stream
" #x~X: Data format #b~b not yet supported, add it for yourself!~%"
(&-> data 4)
kind
)
)
)
)
#f
)
;; definition for function disasm-vif-tag
;; Used lq/sq
(defun
disasm-vif-tag
((data (pointer vif-tag)) (words int) (stream symbol) (details symbol))
(local-vars
(cmd vif-cmd)
(data-ptr (pointer vif-tag))
(data-idx int)
(unpack-imm vif-unpack-imm)
)
(let ((byte-idx 0))
(while (< byte-idx (shl words 2))
(let ((packet-size 4))
(let ((first-tag (-> data 0)))
(format stream " #x~X:" data)
(dotimes (cmd-template-idx (-> *vif-disasm-table* length))
(set! cmd (-> first-tag cmd))
(when
(=
(logand
cmd
(the-as uint (-> *vif-disasm-table* cmd-template-idx mask))
)
(-> *vif-disasm-table* cmd-template-idx tag)
)
(let* ((print-kind (-> *vif-disasm-table* cmd-template-idx print))
(v0-1 (cond
((zero? print-kind)
(format
stream
" (~s :irq ~D)~%"
(-> *vif-disasm-table* cmd-template-idx string1)
(-> first-tag irq)
)
)
((= print-kind 1)
(format
stream
" (~s :irq ~D :~s #x~X)~%"
(-> *vif-disasm-table* cmd-template-idx string1)
(-> first-tag irq)
(-> *vif-disasm-table* cmd-template-idx string2)
(-> first-tag imm)
)
)
((= print-kind 2)
(let
((stcycl-imm (the-as vif-stcycl-imm (-> first-tag imm)))
)
(format
stream
" (~s :irq ~D :wl ~D :cl ~D)~%"
(-> *vif-disasm-table* cmd-template-idx string1)
(-> first-tag irq)
(-> stcycl-imm wl)
(-> stcycl-imm cl)
)
)
)
((= print-kind 3)
(set! packet-size 8)
(format
stream
" (~s :irq ~D :~s #x~X)~%"
(-> *vif-disasm-table* cmd-template-idx string1)
(-> first-tag irq)
(-> *vif-disasm-table* cmd-template-idx string2)
(-> data 1)
)
)
((= print-kind 4)
(set! packet-size 20)
(format
stream
" (~s :irq ~D :~s "
(-> *vif-disasm-table* cmd-template-idx string1)
(-> first-tag irq)
(-> *vif-disasm-table* cmd-template-idx string2)
)
(format
stream
"#x~X #x~X #x~X #x~X)~%"
(-> data 1)
(-> data 2)
(-> data 3)
(-> data 4)
)
)
((= print-kind 5)
(format
stream
" (~s :irq ~D :instructions #x~D :addr #x~X)~%"
(-> *vif-disasm-table* cmd-template-idx string1)
(-> first-tag irq)
(-> first-tag num)
(-> first-tag imm)
)
)
((= print-kind 6)
(if (-> first-tag imm)
(set! packet-size #x100000)
(set!
packet-size
(the-as int (shl (the-as int (-> first-tag imm)) 4))
)
)
(format
stream
" (~s :irq ~D :qwc #x~D)~%"
(-> *vif-disasm-table* cmd-template-idx string1)
(-> first-tag irq)
(-> first-tag imm)
)
(set! data-ptr (&-> data 1))
(set! data-idx 0)
(while (< data-idx (the-as int (-> first-tag imm)))
(format
stream
" #x~X: #x~8x #x~8x #x~8x #x~8x~%"
(+ (+ (shl data-idx 4) 4) (the-as int data))
(-> data-ptr (shl data-idx 2))
(-> data-ptr (+ (shl data-idx 2) 1))
(-> data-ptr (+ (shl data-idx 2) 2))
(-> data-ptr (+ (shl data-idx 2) 3))
)
(set! data-idx (+ data-idx 1))
)
#f
)
((= print-kind 7)
(set!
packet-size
(the-as
int
(+
(logand
-4
(the-as
int
(+
(*
(-> *vif-disasm-table* cmd-template-idx val)
(the-as uint (-> first-tag num))
)
3
)
)
)
4
)
)
)
(set!
unpack-imm
(the-as vif-unpack-imm (-> first-tag imm))
)
(format
stream
" (~s :irq ~D :num ~D :addr #x~X "
(-> *vif-disasm-table* cmd-template-idx string1)
(-> first-tag irq)
(-> first-tag num)
(-> unpack-imm addr)
)
(format
stream
":msk ~D :flg ~D :usn ~D [skip ~d])~%"
(-> first-tag msk)
(-> unpack-imm flg)
(-> unpack-imm usn)
(the-as uint packet-size)
)
(if details
(disasm-vif-details
stream
(the-as (pointer uint8) data)
(logand cmd (vif-cmd cmd-mask))
(the-as int (-> first-tag num))
)
)
)
((= print-kind 8)
(format
stream
" (*unknown* vif-tag #x~X)~%"
(-> first-tag cmd)
)
)
)
)
)
)
(set! cmd-template-idx (-> *vif-disasm-table* length))
)
)
)
(+! byte-idx packet-size)
(&+! data packet-size)
)
)
(- byte-idx (shl words 2))
)
)
;; definition for function disasm-dma-tag
;; INFO: Return type mismatch object vs none.
(defun disasm-dma-tag ((arg0 dma-tag) (arg1 symbol))
(format arg1 "(dma-tag ")
(let ((t9-1 format)
(a0-2 arg1)
(a1-2 "~s")
(v1-1 (-> arg0 id))
)
(t9-1 a0-2 a1-2 (cond
((= v1-1 (dma-tag-id end))
"end"
)
((= v1-1 (dma-tag-id ret))
"ret"
)
((= v1-1 (dma-tag-id call))
"call"
)
((= v1-1 (dma-tag-id refs))
"refs"
)
((= v1-1 (dma-tag-id ref))
"ref"
)
((= v1-1 (dma-tag-id next))
"next"
)
((= v1-1 (dma-tag-id cnt))
"cnt"
)
((zero? v1-1)
"refe"
)
(else
"*unknown*"
)
)
)
)
(if (> (the-as uint (-> arg0 addr)) 0)
(format arg1 " :addr #x~8x" (-> arg0 addr))
)
(if (> (the-as uint (-> arg0 qwc)) 0)
(format arg1 " :qwc ~d" (-> arg0 qwc))
)
(if (> (the-as uint (-> arg0 spr)) 0)
(format arg1 " :spr ~d" (-> arg0 spr))
)
(if (> (the-as uint (-> arg0 irq)) 0)
(format arg1 " :irq ~d" (-> arg0 irq))
)
(if (> (the-as uint (-> arg0 pce)) 0)
(format arg1 " :pce ~d" (-> arg0 pce))
)
(format arg1 ")~%")
(none)
)
;; definition for symbol *dma-disasm*, type symbol
(define *dma-disasm* #t)
;; definition for function disasm-dma-list
;; WARN: Check prologue - tricky store of a0
;; Used lq/sq
(defun
disasm-dma-list
((data dma-packet)
(mode symbol)
(verbose symbol)
(stream symbol)
(expected-size int)
)
(local-vars
(addr object)
(data-2 dma-packet)
(qwc int)
(ra-1 object)
(ra-2 object)
(call-depth int)
(current-tag dma-tag)
)
(set! data-2 data)
(let ((mode-2 mode)
(verbose-2 verbose)
(stream-2 stream)
(expected-size-2 expected-size)
)
(if verbose-2
(format stream-2 "~%--- ~X -----------------------------~%" data-2)
)
(let ((end-condition #f))
(let ((total-qwc 0)
(total-tags 0)
)
(set! addr 0)
(set! qwc 0)
(set! ra-1 0)
(set! ra-2 1)
(set! call-depth -1)
(set! current-tag (new 'static 'dma-tag))
(while (not end-condition)
(cond
((not
(valid? data-2 (the-as type #f) "dma-list tag pointer" #t stream-2)
)
(format stream-2 "ERROR: dma-list tag pointer invalid~%")
(set! end-condition 'error)
)
(else
(set! current-tag (-> data-2 dma))
(when
(not
(or
(zero? total-tags)
(valid? addr (the-as type #f) "dma-list data pointer" #t stream-2)
)
)
(format stream-2 "ERROR: dma-list data pointer invalid~%")
(set! end-condition 'error)
)
(when (nonzero? (logand #x3ff0000 (the-as int current-tag)))
(format stream-2 "ERROR: dma tag has data in reserved bits ~X~%")
(set! end-condition 'error)
)
)
)
(when (or verbose-2 (= end-condition 'error))
(format stream-2 "#x~8x: " data-2)
(cond
((zero? call-depth)
(format stream-2 " ")
)
((= call-depth 1)
(format stream-2 " ")
)
)
(disasm-dma-tag current-tag stream-2)
)
(if end-condition
(empty-form)
(cond
((or
(zero? (+ (the-as uint (-> current-tag id)) (the-as uint -3)))
(zero? (+ (the-as uint (-> current-tag id)) (the-as uint -4)))
(zero? (-> current-tag id))
)
(set! addr (-> current-tag addr))
(set! qwc (the-as int (-> current-tag qwc)))
(if mode-2
(let
((v0-9
(disasm-vif-tag (&-> data-2 vif0) 2 stream-2 (= mode-2 'details))
)
)
(disasm-vif-tag
(the-as (pointer vif-tag) (+ (the-as uint addr) (the-as uint v0-9)))
(the-as int (- (shl (the-as int qwc) 2) (the-as uint (sar v0-9 2))))
stream-2
(= mode-2 'details)
)
)
)
(set!
data-2
(the-as dma-packet (&-> (the-as (pointer uint64) data-2) 2))
)
(if (zero? (-> current-tag id))
(set! end-condition #t)
)
)
(else
(cond
((= (-> current-tag id) (dma-tag-id cnt))
(set! addr (&-> (the-as (pointer uint64) data-2) 2))
(set! qwc (the-as int (-> current-tag qwc)))
(if mode-2
(disasm-vif-tag
(the-as (pointer vif-tag) (&-> (the-as (pointer uint64) data-2) 1))
(the-as int (+ (shl (the-as int qwc) 2) 2))
stream-2
(= mode-2 'details)
)
)
(set!
data-2
(the-as
dma-packet
(+
(the-as uint data-2)
(the-as
uint
(shl (the-as int (+ (the-as uint qwc) (the-as uint 1))) 4)
)
)
)
)
(let ((v1-68 data-2))
)
)
((= (-> current-tag id) (dma-tag-id next))
(set! addr (&-> (the-as (pointer uint64) data-2) 2))
(set! qwc (the-as int (-> current-tag qwc)))
(if mode-2
(disasm-vif-tag
(the-as (pointer vif-tag) (&-> (the-as (pointer uint64) data-2) 1))
(the-as int (+ (shl (the-as int qwc) 2) 2))
stream-2
(= mode-2 'details)
)
)
(when (= data-2 (-> current-tag addr))
(format stream-2 "ERROR: next tag creates infinite loop.~%")
(set! end-condition 'error)
)
(set! data-2 (the-as dma-packet (-> current-tag addr)))
(let ((v1-88 data-2))
)
)
(else
(cond
((= (-> current-tag id) (dma-tag-id call))
(set! addr (&-> (the-as (pointer uint64) data-2) 2))
(set! qwc (the-as int (-> current-tag qwc)))
(if mode-2
(disasm-vif-tag
(the-as
(pointer vif-tag)
(&-> (the-as (pointer uint64) data-2) 1)
)
(the-as int (+ (shl (the-as int qwc) 2) 2))
stream-2
(= mode-2 'details)
)
)
(set! data-2 (the-as dma-packet (-> current-tag addr)))
(set! call-depth (+ call-depth 1))
(cond
((zero? call-depth)
(set! ra-1 (&+ addr qwc))
(let ((v1-108 (the-as (pointer uint64) ra-1)))
)
)
(else
(set! ra-2 (&+ addr qwc))
(let ((v1-111 (the-as (pointer uint64) ra-2)))
)
)
)
)
((= (-> current-tag id) (dma-tag-id ret))
(set! addr (&-> (the-as (pointer uint64) data-2) 2))
(set! qwc (the-as int (-> current-tag qwc)))
(if mode-2
(disasm-vif-tag
(the-as
(pointer vif-tag)
(&-> (the-as (pointer uint64) data-2) 1)
)
(the-as int (+ (shl (the-as int qwc) 2) 2))
stream-2
(= mode-2 'details)
)
)
(let ((v1-123 call-depth))
(cond
((zero? v1-123)
(set! data-2 (the-as dma-packet ra-1))
(let ((v1-125 data-2))
)
)
((= v1-123 1)
(set! data-2 (the-as dma-packet ra-2))
(let ((v1-127 data-2))
)
)
(else
(set! end-condition #t)
)
)
)
(set! call-depth (+ call-depth -1))
(let ((v1-131 call-depth))
)
)
((= (-> current-tag id) (dma-tag-id end))
(set! addr (&-> (the-as (pointer uint64) data-2) 2))
(set! qwc (the-as int (-> current-tag qwc)))
(set! end-condition #t)
(let ((v0-16 (if mode-2
(disasm-vif-tag
(the-as
(pointer vif-tag)
(&-> (the-as (pointer uint64) data-2) 1)
)
(the-as int (+ (shl (the-as int qwc) 2) 2))
stream-2
(= mode-2 'details)
)
)
)
)
)
)
(else
(format stream-2 "ERROR: Unknown DMA TAG command.~%")
(set! end-condition 'error)
)
)
)
)
)
)
)
(+! total-qwc qwc)
(+! total-tags 1)
(if (and (>= expected-size-2 0) (>= total-tags expected-size-2))
(set! end-condition #t)
)
)
(when (or verbose-2 (= end-condition 'error))
(format stream-2 "NOTICE: Total tags: ~d~%" total-tags)
(format stream-2 "NOTICE: Total QWC: ~d~%" total-qwc)
(format stream-2 "--------------------------------~%~%")
)
)
(!= end-condition 'error)
)
)
)
)
+25 -13
View File
@@ -562,22 +562,34 @@
(>= (the-as uint 102) (-> next-char-2 0))
)
)
(set!
result
(if
(and
(>= (-> next-char-2 0) (the-as uint 65))
(>= (the-as uint 70) (-> next-char-2 0))
)
(+ (+ (-> next-char-2 0) -55) (the-as uint (shl result 4)))
(if
(and
(>= (-> next-char-2 0) (the-as uint 65))
(>= (the-as uint 70) (-> next-char-2 0))
)
(set!
result
(the-as
int
(if
(and
(>= (-> next-char-2 0) (the-as uint 97))
(>= (the-as uint 102) (-> next-char-2 0))
)
(+ (+ (-> next-char-2 0) -55) (the-as uint (shl result 4)))
)
)
(if
(and
(>= (-> next-char-2 0) (the-as uint 97))
(>= (the-as uint 102) (-> next-char-2 0))
)
(set!
result
(the-as
int
(+ (+ (-> next-char-2 0) -87) (the-as uint (shl result 4)))
)
)
(set!
result
(the-as
int
(+ (+ (-> next-char-2 0) -48) (the-as uint (shl result 4)))
)
)
+710
View File
@@ -0,0 +1,710 @@
#include "gtest/gtest.h"
#include "FormRegressionTest.h"
using namespace decompiler;
TEST_F(FormRegressionTest, ExprDisasmVif) {
std::string func =
" sll r0, r0, 0\n"
"L53:\n"
" daddiu sp, sp, -192\n"
" sd ra, 0(sp)\n"
" sd fp, 8(sp)\n"
" or fp, t9, r0\n"
" sq s0, 80(sp)\n"
" sq s1, 96(sp)\n"
" sq s2, 112(sp)\n"
" sq s3, 128(sp)\n"
" sq s4, 144(sp)\n"
" sq s5, 160(sp)\n"
" sq gp, 176(sp)\n"
" or s4, a0, r0\n"
" or s5, a1, r0\n"
" or s3, a2, r0\n"
" or s2, a3, r0\n"
" addiu gp, r0, 0\n"
" beq r0, r0, L72\n"
" sll r0, r0, 0\n"
"L54:\n"
" addiu s0, r0, 4\n"
" lwu s1, 0(s4)\n"
" lw t9, format(s7)\n"
" or a0, s3, r0\n"
" daddiu a1, fp, L139\n"
" or a2, s4, r0\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
" addiu v1, r0, 0\n"
" beq r0, r0, L71\n"
" sll r0, r0, 0\n"
"L55:\n"
" dsll32 a0, s1, 1\n"
" dsrl32 a0, a0, 25\n"
" sq a0, 16(sp)\n"
" dsll a0, v1, 2\n"
" lw a1, *vif-disasm-table*(s7)\n"
" daddu a0, a0, a1\n"
" lwu a0, 12(a0)\n"
" lwu a0, 4(a0)\n"
" lq a1, 16(sp)\n"
" dsll a2, v1, 2\n"
" lw a3, *vif-disasm-table*(s7)\n"
" daddu a2, a2, a3\n"
" lwu a2, 12(a2)\n"
" lwu a2, 0(a2)\n"
" and a1, a1, a2\n"
" bne a1, a0, L70\n"
" or a0, s7, r0\n"
" dsll a0, v1, 2\n"
" lw a1, *vif-disasm-table*(s7)\n"
" daddu a0, a0, a1\n"
" lwu a0, 12(a0)\n"
" lwu a0, 12(a0)\n"
" bne a0, r0, L56\n"
" or a1, s7, r0\n"
" lw t9, format(s7)\n"
" or a0, s3, r0\n"
" daddiu a1, fp, L138\n"
" dsll v1, v1, 2\n"
" lw a2, *vif-disasm-table*(s7)\n"
" daddu v1, v1, a2\n"
" lwu v1, 12(v1)\n"
" lwu a2, 16(v1)\n"
" srl a3, s1, 31\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
" beq r0, r0, L69\n"
" sll r0, r0, 0\n"
"L56:\n"
" addiu a1, r0, 1\n"
" bne a0, a1, L57\n"
" or a1, s7, r0\n"
" lw t9, format(s7)\n"
" or a0, s3, r0\n"
" daddiu a1, fp, L137\n"
" dsll a2, v1, 2\n"
" lw a3, *vif-disasm-table*(s7)\n"
" daddu a2, a2, a3\n"
" lwu a2, 12(a2)\n"
" lwu a2, 16(a2)\n"
" srl a3, s1, 31\n"
" dsll v1, v1, 2\n"
" lw t0, *vif-disasm-table*(s7)\n"
" daddu v1, v1, t0\n"
" lwu v1, 12(v1)\n"
" lwu t0, 20(v1)\n"
" dsll32 v1, s1, 16\n"
" dsrl32 t1, v1, 16\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
" beq r0, r0, L69\n"
" sll r0, r0, 0\n"
"L57:\n"
" addiu a1, r0, 2\n"
" bne a0, a1, L58\n"
" or a1, s7, r0\n"
" dsll32 a0, s1, 16\n"
" dsrl32 t1, a0, 16\n"
" lw t9, format(s7)\n"
" or a0, s3, r0\n"
" daddiu a1, fp, L136\n"
" dsll v1, v1, 2\n"
" lw a2, *vif-disasm-table*(s7)\n"
" daddu v1, v1, a2\n"
" lwu v1, 12(v1)\n"
" lwu a2, 16(v1)\n"
" srl a3, s1, 31\n"
" dsll32 v1, t1, 16\n"
" dsrl32 t0, v1, 24\n"
" dsll32 v1, t1, 24\n"
" dsrl32 t1, v1, 24\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
" beq r0, r0, L69\n"
" sll r0, r0, 0\n"
"L58:\n"
" addiu a1, r0, 3\n"
" bne a0, a1, L59\n"
" or a1, s7, r0\n"
" addiu s0, r0, 8\n"
" lw t9, format(s7)\n"
" or a0, s3, r0\n"
" daddiu a1, fp, L137\n"
" dsll a2, v1, 2\n"
" lw a3, *vif-disasm-table*(s7)\n"
" daddu a2, a2, a3\n"
" lwu a2, 12(a2)\n"
" lwu a2, 16(a2)\n"
" srl a3, s1, 31\n"
" dsll v1, v1, 2\n"
" lw t0, *vif-disasm-table*(s7)\n"
" daddu v1, v1, t0\n"
" lwu v1, 12(v1)\n"
" lwu t0, 20(v1)\n"
" lwu t1, 4(s4)\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
" beq r0, r0, L69\n"
" sll r0, r0, 0\n"
"L59:\n"
" addiu a1, r0, 4\n"
" bne a0, a1, L60\n"
" or a1, s7, r0\n"
" addiu s0, r0, 20\n"
" lw t9, format(s7)\n"
" or a0, s3, r0\n"
" daddiu a1, fp, L135\n"
" dsll a2, v1, 2\n"
" lw a3, *vif-disasm-table*(s7)\n"
" daddu a2, a2, a3\n"
" lwu a2, 12(a2)\n"
" lwu a2, 16(a2)\n"
" srl a3, s1, 31\n"
" dsll v1, v1, 2\n"
" lw t0, *vif-disasm-table*(s7)\n"
" daddu v1, v1, t0\n"
" lwu v1, 12(v1)\n"
" lwu t0, 20(v1)\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
" lw t9, format(s7)\n"
" or a0, s3, r0\n"
" daddiu a1, fp, L134\n"
" lwu a2, 4(s4)\n"
" lwu a3, 8(s4)\n"
" lwu t0, 12(s4)\n"
" lwu t1, 16(s4)\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
" beq r0, r0, L69\n"
" sll r0, r0, 0\n"
"L60:\n"
" addiu a1, r0, 5\n"
" bne a0, a1, L61\n"
" or a1, s7, r0\n"
" lw t9, format(s7)\n"
" or a0, s3, r0\n"
" daddiu a1, fp, L133\n"
" dsll v1, v1, 2\n"
" lw a2, *vif-disasm-table*(s7)\n"
" daddu v1, v1, a2\n"
" lwu v1, 12(v1)\n"
" lwu a2, 16(v1)\n"
" srl a3, s1, 31\n"
" dsll32 v1, s1, 8\n"
" dsrl32 t0, v1, 24\n"
" dsll32 v1, s1, 16\n"
" dsrl32 t1, v1, 16\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
" beq r0, r0, L69\n"
" sll r0, r0, 0\n"
"L61:\n"
" addiu a1, r0, 6\n"
" bne a0, a1, L66\n"
" or a1, s7, r0\n"
" dsll32 a0, s1, 16\n"
" dsrl32 a0, a0, 16\n"
" beq s7, a0, L62\n"
" sll r0, r0, 0\n"
" lui s0, 16\n"
" or a0, s0, r0\n"
" beq r0, r0, L63\n"
" sll r0, r0, 0\n"
"L62:\n"
" dsll32 a0, s1, 16\n"
" dsrl32 a0, a0, 16\n"
" dsll s0, a0, 4\n"
" or a0, s0, r0\n"
"L63:\n"
" lw t9, format(s7)\n"
" or a0, s3, r0\n"
" daddiu a1, fp, L132\n"
" dsll v1, v1, 2\n"
" lw a2, *vif-disasm-table*(s7)\n"
" daddu v1, v1, a2\n"
" lwu v1, 12(v1)\n"
" lwu a2, 16(v1)\n"
" srl a3, s1, 31\n"
" dsll32 v1, s1, 16\n"
" dsrl32 t0, v1, 16\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
" daddiu v1, s4, 4\n"
" sq v1, 32(sp)\n"
" addiu v1, r0, 0\n"
" sq v1, 48(sp)\n"
" beq r0, r0, L65\n"
" sll r0, r0, 0\n"
"L64:\n"
" lw t9, format(s7)\n"
" or a0, s3, r0\n"
" daddiu a1, fp, L145\n"
" lq v1, 48(sp)\n"
" dsll v1, v1, 4\n"
" daddiu v1, v1, 4\n"
" daddu a2, v1, s4\n"
" lq v1, 32(sp)\n"
" lq a3, 48(sp)\n"
" dsll a3, a3, 2\n"
" dsll a3, a3, 2\n"
" daddu v1, v1, a3\n"
" lwu a3, 0(v1)\n"
" lq v1, 32(sp)\n"
" lq t0, 48(sp)\n"
" dsll t0, t0, 2\n"
" daddiu t0, t0, 1\n"
" dsll t0, t0, 2\n"
" daddu v1, v1, t0\n"
" lwu t0, 0(v1)\n"
" lq v1, 32(sp)\n"
" lq t1, 48(sp)\n"
" dsll t1, t1, 2\n"
" daddiu t1, t1, 2\n"
" dsll t1, t1, 2\n"
" daddu v1, v1, t1\n"
" lwu t1, 0(v1)\n"
" lq v1, 32(sp)\n"
" lq t2, 48(sp)\n"
" dsll t2, t2, 2\n"
" daddiu t2, t2, 3\n"
" dsll t2, t2, 2\n"
" daddu v1, v1, t2\n"
" lwu t2, 0(v1)\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
" lq v1, 48(sp)\n"
" daddiu v1, v1, 1\n"
" sq v1, 48(sp)\n"
"L65:\n"
" lq v1, 48(sp)\n"
" dsll32 a0, s1, 16\n"
" dsrl32 a0, a0, 16\n"
" slt v1, v1, a0\n"
" bne v1, r0, L64\n"
" sll r0, r0, 0\n"
" or v1, s7, r0\n"
" or v1, s7, r0\n"
" or v0, v1, r0\n"
" beq r0, r0, L69\n"
" sll r0, r0, 0\n"
"L66:\n"
" addiu a1, r0, 7\n"
" bne a0, a1, L68\n"
" or a1, s7, r0\n"
" addiu a0, r0, -4\n"
" dsll a1, v1, 2\n"
" lw a2, *vif-disasm-table*(s7)\n"
" daddu a1, a1, a2\n"
" lwu a1, 12(a1)\n"
" lwu a1, 8(a1)\n"
" dsll32 a2, s1, 8\n"
" dsrl32 a2, a2, 24\n"
" multu3 a1, a1, a2\n"
" daddiu a1, a1, 3\n"
" and a0, a0, a1\n"
" daddiu s0, a0, 4\n"
" dsll32 a0, s1, 16\n"
" dsrl32 a0, a0, 16\n"
" sq a0, 64(sp)\n"
" lw t9, format(s7)\n"
" or a0, s3, r0\n"
" daddiu a1, fp, L131\n"
" dsll v1, v1, 2\n"
" lw a2, *vif-disasm-table*(s7)\n"
" daddu v1, v1, a2\n"
" lwu v1, 12(v1)\n"
" lwu a2, 16(v1)\n"
" srl a3, s1, 31\n"
" dsll32 v1, s1, 8\n"
" dsrl32 t0, v1, 24\n"
" lq v1, 64(sp)\n"
" dsll32 v1, v1, 22\n"
" dsrl32 t1, v1, 22\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
" lw t9, format(s7)\n"
" or a0, s3, r0\n"
" daddiu a1, fp, L130\n"
" dsll32 v1, s1, 3\n"
" dsrl32 a2, v1, 31\n"
" lq v1, 64(sp)\n"
" dsll32 v1, v1, 16\n"
" dsrl32 a3, v1, 31\n"
" lq v1, 64(sp)\n"
" dsll32 v1, v1, 17\n"
" dsrl32 t0, v1, 31\n"
" or t1, s0, r0\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
" beq s7, s2, L67\n"
" or v0, s7, r0\n"
" lw t9, disasm-vif-details(s7)\n"
" or a0, s3, r0\n"
" or a1, s4, r0\n"
" lq v1, 16(sp)\n"
" andi a2, v1, 239\n"
" dsll32 v1, s1, 8\n"
" dsrl32 a3, v1, 24\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
"L67:\n"
" or v1, v0, r0\n"
" or v0, v1, r0\n"
" beq r0, r0, L69\n"
" sll r0, r0, 0\n"
"L68:\n"
" addiu v1, r0, 8\n"
" bne a0, v1, L69\n"
" or v0, s7, r0\n"
" lw t9, format(s7)\n"
" or a0, s3, r0\n"
" daddiu a1, fp, L129\n"
" dsll32 v1, s1, 1\n"
" dsrl32 a2, v1, 25\n"
" jalr ra, t9\n"
" sll v0, ra, 0\n"
"L69:\n"
" or v1, v0, r0\n"
" lw v1, *vif-disasm-table*(s7)\n"
" lw v1, 0(v1)\n"
" or a0, v1, r0\n"
"L70:\n"
" daddiu v1, v1, 1\n"
"L71:\n"
" lw a0, *vif-disasm-table*(s7)\n"
" lw a0, 0(a0)\n"
" slt a0, v1, a0\n"
" bne a0, r0, L55\n"
" sll r0, r0, 0\n"
" or v1, s7, r0\n"
" or v1, s7, r0\n"
" daddu gp, gp, s0\n"
" daddu s4, s4, s0\n"
" or v1, s4, r0\n"
"L72:\n"
" dsll v1, s5, 2\n"
" slt v1, gp, v1\n"
" bne v1, r0, L54\n"
" sll r0, r0, 0\n"
" or v1, s7, r0\n"
" dsll v1, s5, 2\n"
" dsubu v0, gp, v1\n"
" ld ra, 0(sp)\n"
" ld fp, 8(sp)\n"
" lq gp, 176(sp)\n"
" lq s5, 160(sp)\n"
" lq s4, 144(sp)\n"
" lq s3, 128(sp)\n"
" lq s2, 112(sp)\n"
" lq s1, 96(sp)\n"
" lq s0, 80(sp)\n"
" jr ra\n"
" daddiu sp, sp, 192";
std::string type = "(function (pointer vif-tag) int symbol symbol int)";
std::string expected =
"(let ((gp-0 0))\n"
" (while (< gp-0 (shl arg1 2))\n"
" (let ((s0-0 4))\n"
" (let ((s1-0 (-> arg0 0)))\n"
" (format arg2 \" #x~X:\" arg0)\n"
" (dotimes (v1-0 (-> *vif-disasm-table* length))\n"
" (set! sv-16 (-> s1-0 cmd))\n"
" (when\n"
" (=\n"
" (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 (the-as int t1-1) 48) 56)\n"
" (shr (shl (the-as int 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!\n"
" s0-0\n"
" (the-as int (shl (the-as int (-> s1-0 imm)) 4))\n"
" )\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"
" (+ (+ (shl sv-48 4) 4) (the-as int arg0))\n"
" (-> sv-32 (shl sv-48 2))\n"
" (-> sv-32 (+ (shl sv-48 2) 1))\n"
" (-> sv-32 (+ (shl sv-48 2) 2))\n"
" (-> sv-32 (+ (shl sv-48 2) 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"
" (*\n"
" (-> *vif-disasm-table* v1-0 val)\n"
" (the-as uint (-> s1-0 num))\n"
" )\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 (the-as int 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 (the-as int sv-64) 48) 63)\n"
" (shr (shl (the-as int 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"
" )\n"
" )\n"
" (set! v1-0 (-> *vif-disasm-table* length))\n"
" )\n"
" )\n"
" )\n"
" (+! gp-0 s0-0)\n"
" (&+! arg0 s0-0)\n"
" )\n"
" )\n"
" (- gp-0 (shl arg1 2))\n"
" )";
test_with_expr(func, type, expected, false, "",
{{"L139", " #x~X:"},
{"L138", " (~s :irq ~D)~%"},
{"L137", " (~s :irq ~D :~s #x~X)~%"},
{"L136", " (~s :irq ~D :wl ~D :cl ~D)~%"},
{"L135", " (~s :irq ~D :~s "},
{"L134", "#x~X #x~X #x~X #x~X)~%"},
{"L133", " (~s :irq ~D :instructions #x~D :addr #x~X)~%"},
{"L132", " (~s :irq ~D :qwc #x~D)~%"},
{"L145", " #x~X: #x~8x #x~8x #x~8x #x~8x~%"},
{"L131", " (~s :irq ~D :num ~D :addr #x~X "},
{"L130", ":msk ~D :flg ~D :usn ~D [skip ~d])~%"},
{"L129", " (*unknown* vif-tag #x~X)~%"}});
}
@@ -2373,24 +2373,27 @@ TEST_F(FormRegressionTest, ExprStringToInt) {
" (>= (the-as uint 102) (-> a0-3 0))\n"
" )\n"
" )\n"
" (set!\n"
" v0-0\n"
" (if\n"
" (and\n"
" (>= (-> a0-3 0) (the-as uint 65))\n"
" (>= (the-as uint 70) (-> a0-3 0))\n"
" )\n"
" (set!\n"
" v0-0\n"
" (the-as int (+ (+ (-> a0-3 0) -55) (the-as uint (shl v0-0 4))))\n"
" )\n"
" (if\n"
" (and\n"
" (>= (-> a0-3 0) (the-as uint 65))\n"
" (>= (the-as uint 70) (-> a0-3 0))\n"
" (>= (-> a0-3 0) (the-as uint 97))\n"
" (>= (the-as uint 102) (-> a0-3 0))\n"
" )\n"
" (+ (+ (-> a0-3 0) -55) (the-as uint (shl v0-0 4)))\n"
" (the-as\n"
" int\n"
" (if\n"
" (and\n"
" (>= (-> a0-3 0) (the-as uint 97))\n"
" (>= (the-as uint 102) (-> a0-3 0))\n"
" )\n"
" (+ (+ (-> a0-3 0) -87) (the-as uint (shl v0-0 4)))\n"
" (+ (+ (-> a0-3 0) -48) (the-as uint (shl v0-0 4)))\n"
" )\n"
" (set!\n"
" v0-0\n"
" (the-as int (+ (+ (-> a0-3 0) -87) (the-as uint (shl v0-0 4))))\n"
" )\n"
" (set!\n"
" v0-0\n"
" (the-as int (+ (+ (-> a0-3 0) -48) (the-as uint (shl v0-0 4))))\n"
" )\n"
" )\n"
" )\n"
+8 -5
View File
@@ -17,7 +17,7 @@ const std::unordered_set<std::string> g_object_files_to_decompile = {
"trigonometry-h", /* transformq-h */ "matrix", "transform", "quaternion",
"euler", /* geometry, trigonometry, */
"gsound-h", "timer-h", "timer", "vif-h", "dma-h", "video-h", "vu1-user-h", "dma", "dma-buffer",
"dma-bucket",
"dma-bucket", "dma-disasm",
/* gap */
"bounding-box",
/* gap */
@@ -32,7 +32,7 @@ const std::vector<std::string> g_object_files_to_check_against_reference = {
/* transformq-h, */
"matrix", "transform", "quaternion", "euler", /* geometry, trigonometry */
"gsound-h", "timer-h", /* timer, */ "vif-h", "dma-h", "video-h", "vu1-user-h", "dma",
"dma-buffer", "dma-bucket",
"dma-buffer", "dma-bucket", "dma-disasm",
/* gap */ "bounding-box",
/* gap */
"sync-info-h", "sync-info"};
@@ -117,6 +117,9 @@ const std::unordered_set<std::string> skip_in_compiling = {
"(method 3 profile-frame)", // double definition.
// dma-disasm
"disasm-dma-list",
// sync-info
"(method 15 sync-info)", // needs display stuff first
"(method 15 sync-info-eased)", // needs display stuff first
@@ -389,9 +392,9 @@ TEST_F(OfflineDecompilation, Reference) {
std::string src = db->ir2_final_out(obj_l.at(0));
// if (file == "gstate") {
// fmt::print("{}\n", src);
// }
/* if (file == "gstring") {
fmt::print("{}\n", src);
}*/
auto reference = file_util::read_text_file(file_util::get_file_path(
{"test", "decompiler", "reference", fmt::format("{}_REF.gc", file)}));