diff --git a/decompiler/IR2/AtomicOpForm.cpp b/decompiler/IR2/AtomicOpForm.cpp index ccf74204d0..43e6b4fe6b 100644 --- a/decompiler/IR2/AtomicOpForm.cpp +++ b/decompiler/IR2/AtomicOpForm.cpp @@ -233,12 +233,31 @@ FormElement* StoreOp::get_vf_store_as_form(FormPool& pool, const Env& env) const auto addr = pool.alloc_single_element_form(nullptr, source, true, tokens); return pool.alloc_element(m_value.var().reg(), addr, false); + } else { + // try again with no deref. + rd_in.deref = {}; + auto rd_no_deref = env.dts->ts.reverse_field_lookup(rd_in); + if (rd_no_deref.success) { + auto source = pool.alloc_single_element_form( + nullptr, SimpleAtom::make_var(ro.var).as_expr(), m_my_idx); + std::vector tokens; + for (auto& x : rd_no_deref.tokens) { + tokens.push_back(to_token(x)); + } + auto addr = pool.alloc_single_element_form(nullptr, source, + rd_no_deref.addr_of, tokens); + // this cast isn't required (.svf will take anything), but it makes it clear that there's + // some sketchy type stuff going on. + addr = pool.alloc_single_element_form( + nullptr, TypeSpec("pointer", {TypeSpec("uint128")}), addr); + + return pool.alloc_element(m_value.var().reg(), addr, false); + } } } } - // nothing worked. - throw std::runtime_error("NYI get_vf_store_as_form fallback"); + return pool.alloc_element(this); } FormElement* StoreOp::get_as_form(FormPool& pool, const Env& env) const { diff --git a/decompiler/config/all-types.gc b/decompiler/config/all-types.gc index 8c40279d42..d015a0aec0 100644 --- a/decompiler/config/all-types.gc +++ b/decompiler/config/all-types.gc @@ -1419,12 +1419,12 @@ (dummy-19 () none 19) (dummy-20 () none 20) (dummy-21 () none 21) - (dummy-22 () none 22) - (dummy-23 () none 23) - (dummy-24 () none 24) + (y-angle (_type_) float 22) + (global-y-angle-to-point (_type_ vector) float 23) + (relative-y-angle-to-point (_type_ vector) float 24) (dummy-25 () none 25) (dummy-26 () none 26) - (dummy-27 () none 27) + (get-quaternion (_type_) quaternion 27) ) ) @@ -1664,7 +1664,7 @@ (define-extern coserp (function float float float float)) (define-extern sinerp-clamp (function float float float float)) -;;(define-extern exp-slead object) ;; unknown type +;; ;; unknown type (define-extern coserp180-clamp (function float float float float)) ;; unknown type (define-extern exp (function float float)) @@ -1675,20 +1675,21 @@ (define-extern coserp180 (function float float float float)) (define-extern sign (function float float)) (define-extern sinerp (function float float float float)) -;; unknown type + (define-extern ease-in-out (function int int float)) (define-extern asin (function float float)) -;;(define-extern sincos-table object) ;; unknown type -;;(define-extern exp-strail object) ;; unknown type + (define-extern coserp-clamp (function float float float float)) (define-extern tan (function float float)) -;; ;; unknown type -;;(define-extern binary-table object) ;; unknown type +(define-extern binary-table (array float)) +(define-extern sincos-table (array float)) +(define-extern exp-slead (pointer float)) +(define-extern exp-strail (pointer float)) (define-extern sincos! (function (pointer float) float int)) (define-extern sincos-rad! (function (pointer float) float int)) @@ -9894,25 +9895,6 @@ :flag-assert #x38000000b8 (:methods (new (symbol type process int) _type_) - (dummy-9 () none 9) - (dummy-10 () none 10) - (dummy-11 () none 11) - (dummy-12 () none 12) - (dummy-13 () none 13) - (dummy-14 () none 14) - (dummy-15 () none 15) - (dummy-16 () none 16) - (dummy-17 () none 17) - (dummy-18 () none 18) - (dummy-19 () none 19) - (dummy-20 () none 20) - (dummy-21 () none 21) - (dummy-22 () none 22) - (dummy-23 () none 23) - (dummy-24 () none 24) - (dummy-25 () none 25) - (dummy-26 () none 26) - (dummy-27 () none 27) (dummy-28 () none 28) (dummy-29 () none 29) (dummy-30 () none 30) @@ -9976,53 +9958,6 @@ :size-assert #x1bc :flag-assert #x41000001bc (:methods - (dummy-9 () none 9) - (dummy-10 () none 10) - (dummy-11 () none 11) - (dummy-12 () none 12) - (dummy-13 () none 13) - (dummy-14 () none 14) - (dummy-15 () none 15) - (dummy-16 () none 16) - (dummy-17 () none 17) - (dummy-18 () none 18) - (dummy-19 () none 19) - (dummy-20 () none 20) - (dummy-21 () none 21) - (dummy-22 () none 22) - (dummy-23 () none 23) - (dummy-24 () none 24) - (dummy-25 () none 25) - (dummy-26 () none 26) - (dummy-27 () none 27) - (dummy-28 () none 28) - (dummy-29 () none 29) - (dummy-30 () none 30) - (dummy-31 () none 31) - (dummy-32 () none 32) - (dummy-33 () none 33) - (dummy-34 () none 34) - (dummy-35 () none 35) - (dummy-36 () none 36) - (dummy-37 () none 37) - (dummy-38 () none 38) - (dummy-39 () none 39) - (dummy-40 () none 40) - (dummy-41 () none 41) - (dummy-42 () none 42) - (dummy-43 () none 43) - (dummy-44 () none 44) - (dummy-45 () none 45) - (dummy-46 () none 46) - (dummy-47 () none 47) - (dummy-48 () none 48) - (dummy-49 () none 49) - (dummy-50 () none 50) - (dummy-51 () none 51) - (dummy-52 () none 52) - (dummy-53 () none 53) - (dummy-54 () none 54) - (dummy-55 () none 55) (dummy-56 () none 56) (dummy-57 () none 57) (dummy-58 () none 58) diff --git a/decompiler/config/jak1_ntsc_black_label/label_types.jsonc b/decompiler/config/jak1_ntsc_black_label/label_types.jsonc index 7aa5ee95f4..45dec1cd44 100644 --- a/decompiler/config/jak1_ntsc_black_label/label_types.jsonc +++ b/decompiler/config/jak1_ntsc_black_label/label_types.jsonc @@ -22,6 +22,19 @@ ["L41", "float", true] ], + "trigonometry" : [ + ["L98", "(pointer float)", true, 32], + ["L99", "(pointer float)", true, 32], + ["L104", "_auto_", true], + ["L103", "_auto_", true], + ["L102", "vector", true], + ["L101", "vector", true], + ["L100", "vector", true], + ["L152", "float", true], + ["L138", "float", true], + ["L137", "float", true] + ], + "vector-h": [ ["L32", "vector", true], ["L31", "vector", true], diff --git a/decompiler/config/jak1_ntsc_black_label/stack_vars.jsonc b/decompiler/config/jak1_ntsc_black_label/stack_vars.jsonc index 0cc325a01d..781f57459d 100644 --- a/decompiler/config/jak1_ntsc_black_label/stack_vars.jsonc +++ b/decompiler/config/jak1_ntsc_black_label/stack_vars.jsonc @@ -147,5 +147,10 @@ "update-mood-erase-color2": [[16, "mood-fog"]], - "make-light-kit": [[16, "matrix"]] + "make-light-kit": [[16, "matrix"]], + + "(method 23 trsqv)": [[16, "vector"]], + "(method 24 trsqv)": [[16, "vector"]], + + "vector-sincos!": [[16, "vector"]] } diff --git a/goal_src/engine/collide/collide-shape-h.gc b/goal_src/engine/collide/collide-shape-h.gc index e2e6ca854f..1494e1774c 100644 --- a/goal_src/engine/collide/collide-shape-h.gc +++ b/goal_src/engine/collide/collide-shape-h.gc @@ -305,25 +305,6 @@ :flag-assert #x38000000b8 (:methods (new (symbol type process int) _type_) - (dummy-9 () none 9) - (dummy-10 () none 10) - (dummy-11 () none 11) - (dummy-12 () none 12) - (dummy-13 () none 13) - (dummy-14 () none 14) - (dummy-15 () none 15) - (dummy-16 () none 16) - (dummy-17 () none 17) - (dummy-18 () none 18) - (dummy-19 () none 19) - (dummy-20 () none 20) - (dummy-21 () none 21) - (dummy-22 () none 22) - (dummy-23 () none 23) - (dummy-24 () none 24) - (dummy-25 () none 25) - (dummy-26 () none 26) - (dummy-27 () none 27) (dummy-28 () none 28) (dummy-29 () none 29) (dummy-30 () none 30) @@ -387,53 +368,6 @@ :size-assert #x1bc :flag-assert #x41000001bc (:methods - (dummy-9 () none 9) - (dummy-10 () none 10) - (dummy-11 () none 11) - (dummy-12 () none 12) - (dummy-13 () none 13) - (dummy-14 () none 14) - (dummy-15 () none 15) - (dummy-16 () none 16) - (dummy-17 () none 17) - (dummy-18 () none 18) - (dummy-19 () none 19) - (dummy-20 () none 20) - (dummy-21 () none 21) - (dummy-22 () none 22) - (dummy-23 () none 23) - (dummy-24 () none 24) - (dummy-25 () none 25) - (dummy-26 () none 26) - (dummy-27 () none 27) - (dummy-28 () none 28) - (dummy-29 () none 29) - (dummy-30 () none 30) - (dummy-31 () none 31) - (dummy-32 () none 32) - (dummy-33 () none 33) - (dummy-34 () none 34) - (dummy-35 () none 35) - (dummy-36 () none 36) - (dummy-37 () none 37) - (dummy-38 () none 38) - (dummy-39 () none 39) - (dummy-40 () none 40) - (dummy-41 () none 41) - (dummy-42 () none 42) - (dummy-43 () none 43) - (dummy-44 () none 44) - (dummy-45 () none 45) - (dummy-46 () none 46) - (dummy-47 () none 47) - (dummy-48 () none 48) - (dummy-49 () none 49) - (dummy-50 () none 50) - (dummy-51 () none 51) - (dummy-52 () none 52) - (dummy-53 () none 53) - (dummy-54 () none 54) - (dummy-55 () none 55) (dummy-56 () none 56) (dummy-57 () none 57) (dummy-58 () none 58) diff --git a/goal_src/engine/math/quaternion-h.gc b/goal_src/engine/math/quaternion-h.gc index 15e2518731..5b5148e5d0 100644 --- a/goal_src/engine/math/quaternion-h.gc +++ b/goal_src/engine/math/quaternion-h.gc @@ -22,3 +22,4 @@ (define *unity-quaternion* (new 'static 'quaternion :x 0.0 :y 0.0 :z 0.0 :w 1.0)) (define-extern matrix->quaternion (function quaternion matrix quaternion)) +(define-extern vector-y-angle (function vector float)) diff --git a/goal_src/engine/math/transformq-h.gc b/goal_src/engine/math/transformq-h.gc index 4bbc2ad096..349b677b5e 100644 --- a/goal_src/engine/math/transformq-h.gc +++ b/goal_src/engine/math/transformq-h.gc @@ -40,26 +40,54 @@ :size-assert #x8c :flag-assert #x1c0000008c (:methods - (dummy-9 () none 9) - (dummy-10 () none 10) - (dummy-11 () none 11) - (dummy-12 () none 12) - (dummy-13 () none 13) - (dummy-14 () none 14) - (dummy-15 () none 15) - (dummy-16 () none 16) - (dummy-17 () none 17) - (dummy-18 () none 18) - (dummy-19 () none 19) - (dummy-20 () none 20) - (dummy-21 () none 21) - (dummy-22 () none 22) - (dummy-23 () none 23) - (dummy-24 () none 24) - (dummy-25 () none 25) - (dummy-26 () none 26) - (dummy-27 () none 27) + (dummy-9 () none 9) + (dummy-10 () none 10) + (dummy-11 () none 11) + (dummy-12 () none 12) + (dummy-13 () none 13) + (dummy-14 () none 14) + (dummy-15 () none 15) + (dummy-16 () none 16) + (dummy-17 () none 17) + (dummy-18 () none 18) + (dummy-19 () none 19) + (dummy-20 () none 20) + (dummy-21 () none 21) + (y-angle (_type_) float 22) + (global-y-angle-to-point (_type_ vector) float 23) + (relative-y-angle-to-point (_type_ vector) float 24) + (dummy-25 () none 25) + (dummy-26 () none 26) + (get-quaternion (_type_) quaternion 27) + ) + ) + +(defmethod global-y-angle-to-point trsqv ((obj trsqv) (arg0 vector)) + "Get the angle from the position of this trsqv to the point arg0." + (rlet ((vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + ) + (.lvf vf0 (new 'static 'vector :x 0.0 :y 0.0 :z 0.0 :w 1.0)) + (vector-y-angle + (vector-! (new 'stack-no-clear 'vector) arg0 (-> obj trans)) + ) ) ) -;; todo trsqv methods 23 and 24 +(defmethod relative-y-angle-to-point trsqv ((obj trsqv) (arg0 vector)) + "Get the y angle between here and arg0, starting at whatever angle we're currently at." + (rlet ((vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + ) + (.lvf vf0 (new 'static 'vector :x 0.0 :y 0.0 :z 0.0 :w 1.0)) + + (deg-diff + (y-angle obj) + (vector-y-angle (vector-! (new 'stack-no-clear 'vector) arg0 (-> obj trans))) + ) + ) + ) diff --git a/goal_src/engine/math/trigonometry.gc b/goal_src/engine/math/trigonometry.gc index 55bdb28629..3be9526f75 100644 --- a/goal_src/engine/math/trigonometry.gc +++ b/goal_src/engine/math/trigonometry.gc @@ -36,15 +36,14 @@ (defun radmod ((arg0 float)) "Wrap arg0 to be within (-pi, pi)." - (local-vars (f0-1 float)) - (set! f0-1 (+ PI arg0)) - (if (< 0.0 f0-1) - (+ MINUS_PI (- f0-1 (* (the float (the int (/ f0-1 TWO_PI))) TWO_PI))) - (+ PI (- f0-1 (* (the float (the int (/ f0-1 TWO_PI))) TWO_PI))) - ) + (let ((f0-1 (+ PI arg0))) + (if (< 0.0 f0-1) + (+ MINUS_PI (- f0-1 (* (the float (the int (/ f0-1 6.283185))) 6.283185))) + (+ PI (- f0-1 (* (the float (the int (/ f0-1 6.283185))) 6.283185))) + ) + ) ) - (defun deg- ((arg0 float) (arg1 float)) "Compute arg0-arg1, unwrapped, using rotation units. Result should be in the range (-180, 180)" @@ -64,52 +63,45 @@ (defun deg-seek ((in float) (target float) (max-diff float)) "Move in toward target by at most max-diff, using rotation units" - (local-vars - (in-int int) - (target-int int) - (max-diff-int int) - (diff int) - (abs-diff int) - ) - (set! in-int (shl (the int in) 48)) - (set! target-int (shl (the int target) 48)) - (set! max-diff-int (shl (the int max-diff) 48)) - (set! diff (- target-int in-int)) - (set! abs-diff (abs diff)) - (the float - (sar (cond - ((< abs-diff 0) ;; ?? - (+ in-int max-diff-int) - ) - ((>= max-diff-int abs-diff) - target-int - ) - ((>= diff 0) - (+ in-int max-diff-int) - ) - (else - (- in-int max-diff-int) - ) - ) - 48 + (let ((in-int (shl (the int in) 48)) + (target-int (shl (the int target) 48)) + ) + (let* ((max-diff-int (shl (the int max-diff) 48)) + (diff (- target-int in-int)) + (abs-diff (abs diff)) + ) + (set! target-int (cond + ((< abs-diff 0) + (+ in-int max-diff-int) + ) + ((>= max-diff-int abs-diff) + target-int + ) + ((>= diff 0) + (+ in-int max-diff-int) + ) + (else + (- in-int max-diff-int) + ) + ) ) - ) + ) + (the float (sar target-int 48)) + ) ) (defun deg-seek-smooth ((in float) (target float) (max-diff float) (amount float)) "Step amount of the way from in to target, by at most max-diff, using rotation units" - (local-vars (step float)) - ;; how much we want to go - (set! step (* (deg- target in) amount)) - ;; can we make it in one go? - (if (< max-diff (fabs step)) - ;; nope, saturate. - (if (>= step 0.00000000) - (set! step max-diff) - (set! step (- max-diff)) - ) - ) - (+ in step) + (let ((step (* (deg- target in) amount))) + (if (< max-diff (fabs step)) + (set! step (if (>= step 0.0) + max-diff + (- max-diff) + ) + ) + ) + (+ in step) + ) ) (defun deg-lerp-clamp ((min-val float) (max-val float) (in float)) @@ -220,31 +212,23 @@ (defun sin ((arg0 float)) "Compute the sine of an angle in rotation units. Unwraps it." - (local-vars - (f0-1 float) - (f0-3 float) - (f0-4 float) - (f1-4 float) - (f1-5 float) - (f1-6 float) - (f1-7 float) - (f2-0 float) - (f2-1 float) - (f2-2 float) - (f2-3 float) - ) - (set! f2-0 (* ROT_TO_RAD (the float (sar (shl (the int arg0) 48) 48)))) - (set! f0-1 f2-0) - (set! f1-4 (* (the-as float #x3f7fffde) f2-0)) - (set! f0-3 (* f2-0 f2-0)) - (set! f2-1 (* f2-0 f0-3)) - (set! f1-5 (+ f1-4 (* (the-as float #xbe2aa8f5) f2-1))) - (set! f2-2 (* f2-1 f0-3)) - (set! f1-6 (+ f1-5 (* (the-as float #x3c086bf6) f2-2))) - (set! f2-3 (* f2-2 f0-3)) - (set! f1-7 (+ f1-6 (* (the-as float #xb94d2072) f2-3))) - (set! f0-4 (* f2-3 f0-3)) - (+ f1-7 (* (the-as float #x361aa27f) f0-4)) + ;; convert + (let ((f2-0 (* 0.000095873795 (the float (sar (shl (the int arg0) 48) 48))))) + (let ((f0-1 f2-0)) + ) + (let* ((f1-4 (* 0.999998 f2-0)) + (f0-3 (* f2-0 f2-0)) + (f2-1 (* f2-0 f0-3)) + (f1-5 (+ f1-4 (* -0.16666014 f2-1))) + (f2-2 (* f2-1 f0-3)) + (f1-6 (+ f1-5 (* 0.008326521 f2-2))) + (f2-3 (* f2-2 f0-3)) + (f1-7 (+ f1-6 (* -0.0001956241 f2-3))) + (f0-4 (* f2-3 f0-3)) + ) + (+ f1-7 (* 0.0000023042373 f0-4)) + ) + ) ) (defun sin-rad ((arg0 float)) @@ -610,7 +594,7 @@ (set! f17 (the-as float #xBEFF0000)) ) ) - + ;; sll r0, r0, 0 ;; mul.s f5, f3, f2 (set! f5 (* f3 f2)) @@ -938,7 +922,7 @@ (defun atan-rad ((arg0 float)) "inverse tangent in radians" - (atan-series-rad (/ (+ -1.000000 arg0) (+ 1.000000 arg0))) + (atan-series-rad (/ (+ -1.0 arg0) (+ 1.0 arg0))) ) (defun sign ((arg0 float)) @@ -950,42 +934,44 @@ -1.000000) (else 0.000000) - ) + ) ) + (defun atan2-rad ((arg0 float) (arg1 float)) - (local-vars - (f0-6 float) - (f0-14 float) - (f0-22 float) - (f0-28 float) - (f30-1 float) - (f30-2 float) - ) - (if (= arg1 0.000000) - (* PI_OVER_2 (sign arg0)) - (cond - ((and (< arg0 0.000000) (< arg1 0.000000)) - ;; this was probably an inline call to atan-rad - (set! f30-1 MINUS_PI) - (set! f0-6 (/ arg0 arg1)) - (+ f30-1 (atan-series-rad (/ (+ -1.000000 f0-6) (+ 1.000000 f0-6)))) - ) - ((< arg0 0.000000) - (set! f0-14 (- (/ arg0 arg1))) - (- (atan-series-rad (/ (+ -1.000000 f0-14) (+ 1.000000 f0-14)))) - ) - ((< arg1 0.000000) - (set! f30-2 PI) - (set! f0-22 (- (/ arg0 arg1))) - (- f30-2 (atan-series-rad (/ (+ -1.000000 f0-22) (+ 1.000000 f0-22)))) - ) - (else - (set! f0-28 (/ arg0 arg1)) - (atan-series-rad (/ (+ -1.000000 f0-28) (+ 1.000000 f0-28))) - ) + (cond + ((= arg1 0.0) + (* 1.5707963 (sign arg0)) + ) + (else + (cond + ((and (< arg0 0.0) (< arg1 0.0)) + (let ((f30-1 MINUS_PI) + (f0-6 (/ arg0 arg1)) + ) + (+ f30-1 (atan-series-rad (/ (+ -1.0 f0-6) (+ 1.0 f0-6)))) + ) ) - ) + ((< arg0 0.0) + (let ((f0-14 (- (/ arg0 arg1)))) + (- (atan-series-rad (/ (+ -1.0 f0-14) (+ 1.0 f0-14)))) + ) + ) + ((< arg1 0.0) + (let ((f30-2 PI) + (f0-22 (- (/ arg0 arg1))) + ) + (- f30-2 (atan-series-rad (/ (+ -1.0 f0-22) (+ 1.0 f0-22)))) + ) + ) + (else + (let ((f0-28 (/ arg0 arg1))) + (atan-series-rad (/ (+ -1.0 f0-28) (+ 1.0 f0-28))) + ) + ) + ) + ) + ) ) ;; ???? @@ -1220,49 +1206,52 @@ (and (= arg1 0.0) (= arg0 0.0)) 0.000000 (cond - ((and (< arg1 0.0) (< arg0 0.0)) - (+ -32768.0 (atan0 (- arg0) (- arg1))) + ((and (< arg1 0.0) (< arg0 0.0)) + (+ -32768.0 (atan0 (- arg0) (- arg1))) + ) + ((< arg0 0.) + (- (atan0 (- arg0) arg1)) + ) + ((< arg1 0.) + (- 32768.0 (atan0 arg0 (- arg1))) + ) + (else + (atan0 arg0 arg1) + ) ) - ((< arg0 0.) - (- (atan0 (- arg0) arg1)) - ) - ((< arg1 0.) - (- 32768.0 (atan0 arg0 (- arg1))) - ) - (else - (atan0 arg0 arg1) - ) - ) ) ) (defun asin ((arg0 float)) "Inverse sine. Returns rotation units" - (local-vars - (v1-1 symbol) - (v1-2 float) - (v1-4 float) - (gp-0 symbol) - (f0-0 float) - (f0-5 float) - (f0-6 float) - (f0-8 float) - (f1-2 float) - ) - (set! gp-0 '#f) - (set! f0-0 0.000000) - (when (< arg0 0.000000) (set! arg0 (- arg0)) (set! gp-0 '#t) (set! v1-1 gp-0)) - (cond - ((< 1.000000 arg0) (set! f0-5 (the-as float #x467ffffc)) (set! v1-2 f0-5)) - (else - (set! f0-6 1.000000) - (set! f1-2 arg0) - (set! f0-8 (sqrtf (- f0-6 (* f1-2 f1-2)))) - (set! f0-5 (atan0 arg0 f0-8)) - (set! v1-4 f0-5) + (let ((gp-0 #f)) + (let ((f0-0 0.0)) + ) + (when (< arg0 0.0) + (set! arg0 (- arg0)) + (set! gp-0 #t) + ) + (let ((f0-5 (cond + ((< 1.0 arg0) + 16383.996 + ) + (else + (let* ((f0-6 1.0) + (f1-2 arg0) + (f0-8 (sqrtf (- f0-6 (* f1-2 f1-2)))) + ) + (atan0 arg0 f0-8) + ) + ) + ) + ) + ) + (if gp-0 + (- f0-5) + f0-5 + ) + ) ) - ) - (if gp-0 (- f0-5) f0-5) ) (defun acos ((arg0 float)) @@ -1272,33 +1261,26 @@ (defun acos-rad ((arg0 float)) "Inverse cosine, returning radians." - (local-vars - (a1-0 none) - (f0-1 float) - (f0-3 float) - (f0-5 float) - (f0-6 float) - (f0-8 float) - (f0-10 float) - (f1-1 float) - (f1-6 float) - ) (cond - ((>= arg0 0.000000) - (set! f0-1 1.000000) - (set! f1-1 arg0) - (set! f0-3 (sqrtf (- f0-1 (* f1-1 f1-1)))) - (set! f0-5 (/ (- f0-3 arg0) (+ f0-3 arg0))) - (atan-series-rad f0-5) + ((>= arg0 0.0) + (let* ((f0-1 1.0) + (f1-1 arg0) + (f0-3 (sqrtf (- f0-1 (* f1-1 f1-1)))) + (f0-5 (/ (- f0-3 arg0) (+ f0-3 arg0))) + ) + (atan-series-rad f0-5) + ) + ) + (else + (let* ((f0-6 1.0) + (f1-6 arg0) + (f0-8 (sqrtf (- f0-6 (* f1-6 f1-6)))) + (f0-10 (/ (+ f0-8 arg0) (- f0-8 arg0))) + ) + (- PI (atan-series-rad f0-10)) + ) + ) ) - (else - (set! f0-6 1.000000) - (set! f1-6 arg0) - (set! f0-8 (sqrtf (- f0-6 (* f1-6 f1-6)))) - (set! f0-10 (/ (+ f0-8 arg0) (- f0-8 arg0))) - (- (the-as float #x40490fda) (atan-series-rad f0-10)) - ) - ) ) (defun sinerp ((minimum float) (maximum float) (amount float)) @@ -1309,10 +1291,10 @@ (defun sinerp-clamp ((minimum float) (maximum float) (amount float)) "Like sinerp, but clamp to min,max" (cond - ((>= 0.000000 amount) minimum) - ((>= amount 1.000000) maximum) - (else (sinerp minimum maximum amount)) - ) + ((>= 0.000000 amount) minimum) + ((>= amount 1.000000) maximum) + (else (sinerp minimum maximum amount)) + ) ) (defun coserp ((minimum float) (maximum float) (amount float)) @@ -1323,10 +1305,10 @@ (defun coserp-clamp ((minimum float) (maximum float) (amount float)) "Weird 90 degree lerp with cosine, clamped to min,max" (cond - ((>= 0.000000 amount) minimum) - ((>= amount 1.000000) maximum) - (else (coserp minimum maximum amount)) - ) + ((>= 0.000000 amount) minimum) + ((>= amount 1.000000) maximum) + (else (coserp minimum maximum amount)) + ) ) (defun coserp180 ((minimum float) (maximum float) (amount float)) diff --git a/test/decompiler/reference/all_forward_declarations.gc b/test/decompiler/reference/all_forward_declarations.gc index 14bcf52f67..3e16cf3f9f 100644 --- a/test/decompiler/reference/all_forward_declarations.gc +++ b/test/decompiler/reference/all_forward_declarations.gc @@ -581,3 +581,7 @@ ; but the decompiler won't output it, so we have to manually define it (define-extern wind-work type) (define-extern *wind-work* wind-work) +(define-extern vector-y-angle (function vector float)) +(define-extern atan0 (function float float float)) +(define-extern vector-rad<-vector-deg! (function vector vector none)) +(define-extern vector-rad<-vector-deg/2! (function vector vector int)) \ No newline at end of file diff --git a/test/decompiler/reference/engine/math/transformq-h_REF.gc b/test/decompiler/reference/engine/math/transformq-h_REF.gc new file mode 100644 index 0000000000..c003c7ca3a --- /dev/null +++ b/test/decompiler/reference/engine/math/transformq-h_REF.gc @@ -0,0 +1,155 @@ +;;-*-Lisp-*- +(in-package goal) + +;; definition of type transformq +(deftype transformq (transform) + ((quat quaternion :inline :offset 16) + ) + :method-count-assert 9 + :size-assert #x30 + :flag-assert #x900000030 + ) + +;; definition for method 3 of type transformq +(defmethod inspect transformq ((obj transformq)) + (format #t "[~8x] ~A~%" obj 'transformq) + (format #t "~Ttrans: ~`vector`P~%" (-> obj trans)) + (format #t "~Trot: ~`vector`P~%" (-> obj rot)) + (format #t "~Tscale: ~`vector`P~%" (-> obj scale)) + (format #t "~Tquat: #~%" (-> obj rot)) + obj + ) + +;; definition of type trsq +(deftype trsq (trs) + ((quat quaternion :inline :offset 32) + ) + :method-count-assert 9 + :size-assert #x40 + :flag-assert #x900000040 + ) + +;; definition for method 3 of type trsq +(defmethod inspect trsq ((obj trsq)) + (format #t "[~8x] ~A~%" obj (-> obj type)) + (format #t "~Ttrans: ~`vector`P~%" (-> obj trans)) + (format #t "~Trot: ~`vector`P~%" (-> obj rot)) + (format #t "~Tscale: ~`vector`P~%" (-> obj scale)) + (format #t "~Tquat: #~%" (-> obj rot)) + obj + ) + +;; definition of type trsqv +(deftype trsqv (trsq) + ((pause-adjust-distance float :offset 4) + (nav-radius float :offset 8) + (transv vector :inline :offset-assert 64) + (rotv vector :inline :offset-assert 80) + (scalev vector :inline :offset-assert 96) + (dir-targ quaternion :inline :offset-assert 112) + (angle-change-time uint64 :offset-assert 128) + (old-y-angle-diff float :offset-assert 136) + ) + :method-count-assert 28 + :size-assert #x8c + :flag-assert #x1c0000008c + (:methods + (dummy-9 () none 9) + (dummy-10 () none 10) + (dummy-11 () none 11) + (dummy-12 () none 12) + (dummy-13 () none 13) + (dummy-14 () none 14) + (dummy-15 () none 15) + (dummy-16 () none 16) + (dummy-17 () none 17) + (dummy-18 () none 18) + (dummy-19 () none 19) + (dummy-20 () none 20) + (dummy-21 () none 21) + (y-angle (_type_) float 22) + (global-y-angle-to-point (_type_ vector) float 23) + (relative-y-angle-to-point (_type_ vector) float 24) + (dummy-25 () none 25) + (dummy-26 () none 26) + (get-quaternion (_type_) quaternion 27) + ) + ) + +;; definition for method 3 of type trsqv +(defmethod inspect trsqv ((obj trsqv)) + (format #t "[~8x] ~A~%" obj (-> obj type)) + (format #t "~Ttrans: ~`vector`P~%" (-> obj trans)) + (format #t "~Trot: ~`vector`P~%" (-> obj rot)) + (format #t "~Tscale: ~`vector`P~%" (-> obj scale)) + (format #t "~Tquat: #~%" (-> obj rot)) + (format + #t + "~Tpause-adjust-distance: (meters ~m)~%" + (-> obj pause-adjust-distance) + ) + (format #t "~Tnav-radius: (meters ~m)~%" (-> obj nav-radius)) + (format #t "~Ttransv: ~`vector`P~%" (-> obj transv)) + (format #t "~Trotv: ~`vector`P~%" (-> obj rotv)) + (format #t "~Tscalev: ~`vector`P~%" (-> obj scalev)) + (format #t "~Tdir-targ: #~%" (-> obj dir-targ)) + (format #t "~Tangle-change-time: ~D~%" (-> obj angle-change-time)) + (format #t "~Told-y-angle-diff: ~f~%" (-> obj old-y-angle-diff)) + obj + ) + +;; definition for method 23 of type trsqv +(defmethod global-y-angle-to-point trsqv ((obj trsqv) (arg0 vector)) + (rlet ((vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + ) + (.lvf vf0 (new 'static 'vector :x 0.0 :y 0.0 :z 0.0 :w 1.0)) + (let ((t9-0 vector-y-angle) + (v1-0 (new 'stack-no-clear 'vector)) + ) + (let ((a0-1 (-> obj trans))) + (.lvf vf4 (&-> arg0 quad)) + (.lvf vf5 (&-> a0-1 quad)) + ) + (.mov.vf vf6 vf0 :mask #b1000) + (.sub.vf vf6 vf4 vf5 :mask #b111) + (.svf (&-> v1-0 quad) vf6) + (t9-0 v1-0) + ) + ) + ) + +;; definition for method 24 of type trsqv +(defmethod relative-y-angle-to-point trsqv ((obj trsqv) (arg0 vector)) + (rlet ((vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + ) + (.lvf vf0 (new 'static 'vector :x 0.0 :y 0.0 :z 0.0 :w 1.0)) + (let ((gp-0 deg-diff) + (s3-0 (y-angle obj)) + (t9-1 vector-y-angle) + (a0-2 (new 'stack-no-clear 'vector)) + ) + (let ((v1-1 (-> obj trans))) + (.lvf vf4 (&-> arg0 quad)) + (.lvf vf5 (&-> v1-1 quad)) + ) + (.mov.vf vf6 vf0 :mask #b1000) + (.sub.vf vf6 vf4 vf5 :mask #b111) + (.svf (&-> a0-2 quad) vf6) + (gp-0 s3-0 (t9-1 a0-2)) + ) + ) + ) + +;; failed to figure out what this is: +(let ((v0-3 0)) + ) + + + + diff --git a/test/decompiler/reference/engine/math/trigonometry_REF.gc b/test/decompiler/reference/engine/math/trigonometry_REF.gc new file mode 100644 index 0000000000..d259e8b604 --- /dev/null +++ b/test/decompiler/reference/engine/math/trigonometry_REF.gc @@ -0,0 +1,856 @@ +;;-*-Lisp-*- +(in-package goal) + +;; definition for function radmod +(defun radmod ((arg0 float)) + (let ((f0-1 (+ PI arg0))) + (if (< 0.0 f0-1) + (+ MINUS_PI (- f0-1 (* (the float (the int (/ f0-1 6.283185))) 6.283185))) + (+ PI (- f0-1 (* (the float (the int (/ f0-1 6.283185))) 6.283185))) + ) + ) + ) + +;; definition for function deg- +(defun deg- ((arg0 float) (arg1 float)) + (the float (sar (- (shl (the int arg0) 48) (shl (the int arg1) 48)) 48)) + ) + +;; definition for function deg-diff +(defun deg-diff ((arg0 float) (arg1 float)) + (the float (sar (- (shl (the int arg1) 48) (shl (the int arg0) 48)) 48)) + ) + +;; definition for function deg-seek +(defun deg-seek ((in float) (target float) (max-diff float)) + (let ((in-int (shl (the int in) 48)) + (target-int (shl (the int target) 48)) + ) + (let* ((max-diff-int (shl (the int max-diff) 48)) + (diff (- target-int in-int)) + (abs-diff (abs diff)) + ) + (set! target-int (cond + ((< abs-diff 0) + (+ in-int max-diff-int) + ) + ((>= max-diff-int abs-diff) + (empty) + target-int + ) + ((>= diff 0) + (+ in-int max-diff-int) + ) + (else + (- in-int max-diff-int) + ) + ) + ) + ) + (the float (sar target-int 48)) + ) + ) + +;; definition for function deg-seek-smooth +(defun + deg-seek-smooth + ((in float) (target float) (max-diff float) (amount float)) + (let ((step (* (deg- target in) amount))) + (if (< max-diff (fabs step)) + (set! step (if (>= step 0.0) + max-diff + (- max-diff) + ) + ) + ) + (+ in step) + ) + ) + +;; definition for function deg-lerp-clamp +(defun deg-lerp-clamp ((min-val float) (max-val float) (in float)) + (cond + ((>= 0.0 in) + min-val + ) + ((>= in 1.0) + max-val + ) + (else + (the + float + (sar (shl (the int (+ min-val (* in (deg-diff min-val max-val)))) 48) 48) + ) + ) + ) + ) + +;; definition for symbol binary-table, type (array float) +(define + binary-table + (the-as (array float) + (new + 'static + 'boxed-array + float + 32 + 1.0 + 0.5 + 0.25 + 0.125 + 0.0625 + 0.03125 + 0.015625 + 0.0078125 + 0.00390625 + 0.001953125 + 0.0009765625 + 0.00048828125 + 0.00024414062 + 0.00012207031 + 0.000061035156 + 0.000030517578 + 0.000015258789 + 0.0000076293945 + 0.0000038146973 + 0.0000019073486 + 0.0000009536743 + 0.00000047683716 + 0.00000023841858 + 0.00000011920929 + 0.000000059604645 + 0.000000029802322 + 0.000000014901161 + 0.000000007450581 + 0.0000000037252903 + 0.0000000018626451 + 0.0000000009313226 + 0.0000000004656613 + ) + ) + ) + +;; definition for symbol sincos-table, type (array float) +(define + sincos-table + (the-as (array float) + (new + 'static + 'boxed-array + float + 32 + 0.7853982 + 0.4636476 + 0.24497867 + 0.124354996 + 0.06241881 + 0.031239834 + 0.015623729 + 0.007812341 + 0.0039062302 + 0.0019531226 + 0.0009765622 + 0.0004882812 + 0.00024414062 + 0.00012207031 + 0.000061035156 + 0.000030517578 + 0.000015258789 + 0.0000076293945 + 0.0000038146973 + 0.0000019073486 + 0.0000009536743 + 0.00000047683716 + 0.00000023841858 + 0.00000011920929 + 0.000000059604645 + 0.000000029802322 + 0.000000014901161 + 0.000000007450581 + 0.0000000037252903 + 0.0000000018626451 + 0.0000000009313226 + 0.0000000004656613 + ) + ) + ) + +;; definition for function sin +(defun sin ((arg0 float)) + (let ((f2-0 (* 0.000095873795 (the float (sar (shl (the int arg0) 48) 48))))) + (let ((f0-1 f2-0)) + ) + (let* ((f1-4 (* 0.999998 f2-0)) + (f0-3 (* f2-0 f2-0)) + (f2-1 (* f2-0 f0-3)) + (f1-5 (+ f1-4 (* -0.16666014 f2-1))) + (f2-2 (* f2-1 f0-3)) + (f1-6 (+ f1-5 (* 0.008326521 f2-2))) + (f2-3 (* f2-2 f0-3)) + (f1-7 (+ f1-6 (* -0.0001956241 f2-3))) + (f0-4 (* f2-3 f0-3)) + ) + (+ f1-7 (* 0.0000023042373 f0-4)) + ) + ) + ) + +;; definition for function sin-rad +;; WARN: Unsupported inline assembly instruction kind - [mula.s f0, f7] +;; WARN: Unsupported inline assembly instruction kind - [madda.s f2, f8] +;; WARN: Unsupported inline assembly instruction kind - [madda.s f4, f9] +;; WARN: Unsupported inline assembly instruction kind - [madda.s f5, f10] +;; WARN: Unsupported inline assembly instruction kind - [madd.s f12, f6, f11] +(defun sin-rad ((arg0 float)) + (local-vars (f12-0 float)) + (let* ((f1-0 (* arg0 arg0)) + (f7-0 0.999998) + (f8-0 -0.16666014) + (f2-0 (* arg0 f1-0)) + (f3-0 (* f1-0 f1-0)) + (f9-0 0.008326521) + (f4-0 (* f2-0 f1-0)) + (f5-0 (* f3-0 f2-0)) + (f10-0 -0.0001956241) + (f6-0 (* f4-0 f3-0)) + (f11-0 0.0000023042373) + ) + (.mula.s arg0 f7-0) + (.madda.s f2-0 f8-0) + (.madda.s f4-0 f9-0) + (.madda.s f5-0 f10-0) + (.madd.s f12-0 f6-0 f11-0) + ) + f12-0 + ) + +;; definition for symbol *sin-poly-vec*, type vector +(define + *sin-poly-vec* + (new 'static 'vector + :x -0.16666014 + :y 0.008326521 + :z -0.0001956241 + :w 0.0000023042373 + ) + ) + +;; definition for symbol *sin-poly-vec2*, type vector +(define *sin-poly-vec2* (new 'static 'vector :x 0.999998)) + +;; definition for function vector-sin-rad! +(defun vector-sin-rad! ((arg0 vector) (arg1 vector)) + (rlet ((acc :class vf) + (vf1 :class vf) + (vf10 :class vf) + (vf2 :class vf) + (vf3 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + (vf8 :class vf) + (vf9 :class vf) + ) + (.lvf vf1 (&-> arg1 quad)) + (.mul.vf vf3 vf1 vf1) + (let ((v1-0 *sin-poly-vec2*)) + (.lvf vf10 (&-> v1-0 quad)) + ) + (let ((v1-1 *sin-poly-vec*)) + (.lvf vf9 (&-> v1-1 quad)) + ) + (.mul.vf vf4 vf3 vf1) + (.mul.vf vf5 vf3 vf3) + (.mul.x.vf acc vf1 vf10) + (.mul.vf vf6 vf4 vf3) + (.mul.vf vf7 vf5 vf4) + (.add.mul.x.vf acc vf4 vf9 acc) + (.mul.vf vf8 vf6 vf5) + (.add.mul.y.vf acc vf6 vf9 acc) + (.add.mul.z.vf acc vf7 vf9 acc) + (.add.mul.w.vf vf2 vf8 vf9 acc) + (.svf (&-> arg0 quad) vf2) + arg0 + ) + ) + +;; definition for function cos-rad +;; WARN: Unsupported inline assembly instruction kind - [mula.s f7, f7] +;; WARN: Unsupported inline assembly instruction kind - [madda.s f8, f1] +;; WARN: Unsupported inline assembly instruction kind - [madda.s f9, f3] +;; WARN: Unsupported inline assembly instruction kind - [madda.s f10, f4] +;; WARN: Unsupported inline assembly instruction kind - [madd.s f12, f11, f5] +(defun cos-rad ((arg0 float)) + (local-vars (f12-0 float)) + (let* ((f1-0 (* arg0 arg0)) + (f7-0 1.0) + (f8-0 -0.49998003) + (f3-0 (* f1-0 f1-0)) + (f9-0 0.041620404) + (f10-0 -0.0013636408) + (f4-0 (* f3-0 f1-0)) + (f5-0 (* f3-0 f3-0)) + (f11-0 0.000020170546) + ) + (.mula.s f7-0 f7-0) + (.madda.s f8-0 f1-0) + (.madda.s f9-0 f3-0) + (.madda.s f10-0 f4-0) + (.madd.s f12-0 f11-0 f5-0) + ) + f12-0 + ) + +;; definition for symbol *cos-poly-vec*, type vector +(define + *cos-poly-vec* + (new 'static 'vector + :x -0.49998003 + :y 0.041620404 + :z -0.0013636408 + :w 0.000020170546 + ) + ) + +;; definition for function vector-cos-rad! +;; WARN: Bad vector register dependency: vf2 +(defun vector-cos-rad! ((arg0 vector) (arg1 vector)) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf1 :class vf) + (vf2 :class vf) + (vf3 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf9 :class vf) + ) + (.lvf vf0 (new 'static 'vector :x 0.0 :y 0.0 :z 0.0 :w 1.0)) + (.lvf vf1 (&-> arg1 quad)) + (.sub.vf vf2 vf2 vf2) + (let ((v1-0 *cos-poly-vec*)) + (.lvf vf9 (&-> v1-0 quad)) + ) + (.mul.vf vf3 vf1 vf1) + (.add.w.vf acc vf2 vf0) + (.mul.vf vf4 vf3 vf3) + (.add.mul.x.vf acc vf3 vf9 acc) + (.mul.vf vf5 vf4 vf3) + (.add.mul.y.vf acc vf4 vf9 acc) + (.mul.vf vf6 vf4 vf4) + (.add.mul.z.vf acc vf5 vf9 acc) + (.add.mul.w.vf vf2 vf6 vf9 acc) + (.svf (&-> arg0 quad) vf2) + arg0 + ) + ) + +;; definition for function vector-sincos-rad! +;; WARN: Bad vector register dependency: vf14 +(defun vector-sincos-rad! ((arg0 vector) (arg1 vector) (arg2 vector)) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf1 :class vf) + (vf10 :class vf) + (vf11 :class vf) + (vf12 :class vf) + (vf13 :class vf) + (vf14 :class vf) + (vf2 :class vf) + (vf3 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + (vf8 :class vf) + (vf9 :class vf) + ) + (.lvf vf0 (new 'static 'vector :x 0.0 :y 0.0 :z 0.0 :w 1.0)) + (.lvf vf1 (&-> arg2 quad)) + (.sub.vf vf14 vf14 vf14) + (let ((v1-0 *sin-poly-vec2*)) + (.lvf vf11 (&-> v1-0 quad)) + ) + (.mul.vf vf2 vf1 vf1) + (let ((v1-1 *sin-poly-vec*)) + (.lvf vf10 (&-> v1-1 quad)) + ) + (let ((v1-2 *cos-poly-vec*)) + (.lvf vf13 (&-> v1-2 quad)) + ) + (.mul.x.vf acc vf1 vf11) + (.mul.vf vf3 vf2 vf1) + (.mul.vf vf4 vf2 vf2) + (.mul.vf vf5 vf3 vf2) + (.mul.vf vf6 vf3 vf3) + (.mul.vf vf7 vf4 vf3) + (.mul.vf vf8 vf4 vf4) + (.mul.vf vf9 vf5 vf4) + (.add.mul.x.vf acc vf3 vf10 acc) + (.add.mul.y.vf acc vf5 vf10 acc) + (.add.mul.z.vf acc vf7 vf10 acc) + (.add.mul.w.vf vf12 vf9 vf10 acc) + (.add.w.vf acc vf14 vf0) + (.add.mul.x.vf acc vf2 vf13 acc) + (.add.mul.y.vf acc vf4 vf13 acc) + (.add.mul.z.vf acc vf6 vf13 acc) + (.add.mul.w.vf vf14 vf8 vf13 acc) + (.svf (&-> arg0 quad) vf12) + (.svf (&-> arg1 quad) vf14) + 0 + ) + ) + +;; definition for function sincos-rad! +;; ERROR: function was not converted to expressions. Cannot decompile. + +;; definition for function sincos! +;; ERROR: function was not converted to expressions. Cannot decompile. + +;; definition for function vector-rad<-vector-deg! +;; INFO: Return type mismatch float vs none. +(defun vector-rad<-vector-deg! ((arg0 vector) (arg1 vector)) + (local-vars (v0-0 float) (v1-1 float) (v1-2 int) (v1-3 int)) + (rlet ((vf1 :class vf) + (vf2 :class vf) + ) + (let ((v1-0 #x38c90fda)) + (.lvf vf1 (&-> arg1 quad)) + (.ftoi.vf vf1 vf1) + (.mov vf2 v1-0) + ) + (.mov v1-1 vf1) + (.pw.sll v1-2 v1-1 16) + (.pw.sra v1-3 v1-2 16) + (.mov vf1 v1-3) + (.itof.vf vf1 vf1) + (.mul.x.vf vf1 vf1 vf2) + (.svf (&-> arg0 quad) vf1) + (.mov v0-0 vf1) + (none) + ) + ) + +;; definition for function vector-rad<-vector-deg/2! +;; INFO: Return type mismatch float vs int. +(defun vector-rad<-vector-deg/2! ((arg0 vector) (arg1 vector)) + (local-vars (v0-0 float) (v1-1 float) (v1-2 int) (v1-3 int)) + (rlet ((vf1 :class vf) + (vf2 :class vf) + ) + (let ((v1-0 #x38c90fda)) + (let ((a2-0 #x3f000000)) + (.lvf vf1 (&-> arg1 quad)) + (.mov vf2 a2-0) + ) + (.mul.x.vf vf1 vf1 vf2) + (.ftoi.vf vf1 vf1) + (.mov vf2 v1-0) + ) + (.mov v1-1 vf1) + (.pw.sll v1-2 v1-1 16) + (.pw.sra v1-3 v1-2 16) + (.mov vf1 v1-3) + (.itof.vf vf1 vf1) + (.mul.x.vf vf1 vf1 vf2) + (.svf (&-> arg0 quad) vf1) + (.mov v0-0 vf1) + (the-as int v0-0) + ) + ) + +;; definition for function vector-sincos! +(defun vector-sincos! ((arg0 vector) (arg1 vector) (arg2 vector)) + (let ((s4-0 (new 'stack-no-clear 'vector))) + (vector-rad<-vector-deg! s4-0 arg2) + (vector-sincos-rad! arg0 arg1 s4-0) + ) + ) + +;; definition for function tan-rad +(defun tan-rad ((arg0 float)) + (/ (sin arg0) (cos arg0)) + ) + +;; definition for function cos +(defun cos ((arg0 float)) + (sin (+ 16384.0 arg0)) + ) + +;; definition for function tan +(defun tan ((arg0 float)) + (/ (sin arg0) (cos arg0)) + ) + +;; definition for function atan0 +;; ERROR: function was not converted to expressions. Cannot decompile. + +;; definition for function atan-series-rad +;; WARN: Unsupported inline assembly instruction kind - [adda.s f0, f18] +;; WARN: Unsupported inline assembly instruction kind - [madda.s f2, f11] +;; WARN: Unsupported inline assembly instruction kind - [madda.s f4, f12] +;; WARN: Unsupported inline assembly instruction kind - [madda.s f5, f13] +;; WARN: Unsupported inline assembly instruction kind - [madda.s f6, f14] +;; WARN: Unsupported inline assembly instruction kind - [madda.s f7, f15] +;; WARN: Unsupported inline assembly instruction kind - [madda.s f8, f16] +;; WARN: Unsupported inline assembly instruction kind - [madd.s f18, f9, f17] +(defun atan-series-rad ((arg0 float)) + (local-vars (f18-1 float)) + (let* ((f1-0 (* arg0 arg0)) + (f10-0 0.99999934) + (f11-0 -0.33329856) + (f2-0 (* arg0 f1-0)) + (f3-0 (* f1-0 f1-0)) + (f12-0 0.19946536) + (f4-0 (* f2-0 f1-0)) + (f5-0 (* f3-0 f2-0)) + (f13-0 -0.13908534) + (f6-0 (* f4-0 f3-0)) + (f7-0 (* f5-0 f3-0)) + (f14-0 0.09642004) + (f8-0 (* f6-0 f3-0)) + (f9-0 (* f7-0 f3-0)) + (f15-0 -0.055909887) + (f18-0 0.7853982) + (f0-1 (* arg0 f10-0)) + (f16-0 0.02186123) + (f17-0 -0.004054058) + ) + (.adda.s f0-1 f18-0) + (.madda.s f2-0 f11-0) + (.madda.s f4-0 f12-0) + (.madda.s f5-0 f13-0) + (.madda.s f6-0 f14-0) + (.madda.s f7-0 f15-0) + (.madda.s f8-0 f16-0) + (.madd.s f18-1 f9-0 f17-0) + ) + f18-1 + ) + +;; definition for function atan-rad +(defun atan-rad ((arg0 float)) + (atan-series-rad (/ (+ -1.0 arg0) (+ 1.0 arg0))) + ) + +;; definition for function sign +(defun sign ((arg0 float)) + (cond + ((< 0.0 arg0) + 1.0 + ) + ((< arg0 0.0) + -1.0 + ) + (else + 0.0 + ) + ) + ) + +;; definition for function atan2-rad +(defun atan2-rad ((arg0 float) (arg1 float)) + (cond + ((= arg1 0.0) + (* 1.5707963 (sign arg0)) + ) + (else + (cond + ((and (< arg0 0.0) (< arg1 0.0)) + (let ((f30-1 MINUS_PI) + (f0-6 (/ arg0 arg1)) + ) + (+ f30-1 (atan-series-rad (/ (+ -1.0 f0-6) (+ 1.0 f0-6)))) + ) + ) + ((< arg0 0.0) + (let ((f0-14 (- (/ arg0 arg1)))) + (- (atan-series-rad (/ (+ -1.0 f0-14) (+ 1.0 f0-14)))) + ) + ) + ((< arg1 0.0) + (let ((f30-2 PI) + (f0-22 (- (/ arg0 arg1))) + ) + (- f30-2 (atan-series-rad (/ (+ -1.0 f0-22) (+ 1.0 f0-22)))) + ) + ) + (else + (let ((f0-28 (/ arg0 arg1))) + (atan-series-rad (/ (+ -1.0 f0-28) (+ 1.0 f0-28))) + ) + ) + ) + ) + ) + ) + +;; definition of type float-type +(deftype float-type (uint32) + () + :method-count-assert 9 + :size-assert #x4 + :flag-assert #x900000004 + ) + +;; definition for symbol exp-slead, type (pointer float) +(define + exp-slead + (new 'static 'array float 32 + 1.0 + 1.0218964 + 1.0442734 + 1.0671387 + 1.0905075 + 1.1143799 + 1.1387863 + 1.1637192 + 1.1892014 + 1.2152405 + 1.2418518 + 1.2690506 + 1.2968369 + 1.3252335 + 1.354248 + 1.3839035 + 1.4142075 + 1.4451752 + 1.4768219 + 1.5091629 + 1.5422058 + 1.5759735 + 1.6104889 + 1.645752 + 1.6817856 + 1.7186127 + 1.7562485 + 1.7947083 + 1.8340073 + 1.8741608 + 1.9151993 + 1.9571381 + ) + ) + +;; definition for symbol exp-strail, type (pointer float) +(define + exp-strail + (new 'static 'array float 32 + 0.0 + 0.0000007863494 + 0.00000040596257 + 0.0000017288019 + 0.00000022534104 + 0.0000068597833 + 0.0000023188388 + 0.0000056815315 + 0.0000057600223 + 0.0000068814647 + 0.000006005433 + 0.0000003590472 + 0.0000027016238 + 0.000003183687 + 0.000007500062 + 0.000006378546 + 0.000006103877 + 0.0000056360786 + 0.0000042465254 + 0.0000015247614 + 0.000005014861 + 0.000007334366 + 0.0000014403477 + 0.000003525029 + 0.000007247011 + 0.000006627224 + 0.0000036862523 + 0.00000082304996 + 0.0000008232258 + 0.0000068675085 + 0.000007281612 + 0.000006062652 + ) + ) + +;; definition for function exp +;; ERROR: function was not converted to expressions. Cannot decompile. + +;; definition for function atan +(defun atan ((arg0 float) (arg1 float)) + (cond + ((and (= arg1 0.0) (= arg0 0.0)) + 0.0 + ) + (else + (cond + ((and (< arg1 0.0) (< arg0 0.0)) + (+ -32768.0 (atan0 (- arg0) (- arg1))) + ) + ((< arg0 0.0) + (- (atan0 (- arg0) arg1)) + ) + ((< arg1 0.0) + (- 32768.0 (atan0 arg0 (- arg1))) + ) + (else + (atan0 arg0 arg1) + ) + ) + ) + ) + ) + +;; definition for function asin +(defun asin ((arg0 float)) + (let ((gp-0 #f)) + (let ((f0-0 0.0)) + ) + (when (< arg0 0.0) + (set! arg0 (- arg0)) + (set! gp-0 #t) + ) + (let ((f0-5 (cond + ((< 1.0 arg0) + 16383.996 + ) + (else + (let* ((f0-6 1.0) + (f1-2 arg0) + (f0-8 (sqrtf (- f0-6 (* f1-2 f1-2)))) + ) + (atan0 arg0 f0-8) + ) + ) + ) + ) + ) + (if gp-0 + (- f0-5) + f0-5 + ) + ) + ) + ) + +;; definition for function acos +(defun acos ((arg0 float)) + (- 16384.0 (asin arg0)) + ) + +;; definition for function acos-rad +(defun acos-rad ((arg0 float)) + (cond + ((>= arg0 0.0) + (let* ((f0-1 1.0) + (f1-1 arg0) + (f0-3 (sqrtf (- f0-1 (* f1-1 f1-1)))) + (f0-5 (/ (- f0-3 arg0) (+ f0-3 arg0))) + ) + (atan-series-rad f0-5) + ) + ) + (else + (let* ((f0-6 1.0) + (f1-6 arg0) + (f0-8 (sqrtf (- f0-6 (* f1-6 f1-6)))) + (f0-10 (/ (+ f0-8 arg0) (- f0-8 arg0))) + ) + (- PI (atan-series-rad f0-10)) + ) + ) + ) + ) + +;; definition for function sinerp +(defun sinerp ((arg0 float) (arg1 float) (arg2 float)) + (lerp arg0 arg1 (sin (* 16384.0 arg2))) + ) + +;; definition for function sinerp-clamp +(defun sinerp-clamp ((minimum float) (maximum float) (amount float)) + (cond + ((>= 0.0 amount) + minimum + ) + ((>= amount 1.0) + maximum + ) + (else + (sinerp minimum maximum amount) + ) + ) + ) + +;; definition for function coserp +(defun coserp ((minimum float) (maximum float) (amount float)) + (lerp minimum maximum (- 1.0 (cos (* 16384.0 amount)))) + ) + +;; definition for function coserp-clamp +(defun coserp-clamp ((minimum float) (maximum float) (amount float)) + (cond + ((>= 0.0 amount) + minimum + ) + ((>= amount 1.0) + maximum + ) + (else + (coserp minimum maximum amount) + ) + ) + ) + +;; definition for function coserp180 +(defun coserp180 ((minimum float) (maximum float) (amount float)) + (lerp minimum maximum (* 0.5 (- 1.0 (cos (* 32768.0 amount))))) + ) + +;; definition for function coserp180-clamp +(defun coserp180-clamp ((minimum float) (maximum float) (amount float)) + (cond + ((>= 0.0 amount) + minimum + ) + ((>= amount 1.0) + maximum + ) + (else + (coserp180 minimum maximum amount) + ) + ) + ) + +;; definition for function ease-in-out +(defun ease-in-out ((total int) (progress int)) + (local-vars (v1-0 int)) + (cond + ((>= progress total) + 1.0 + ) + ((<= progress 0) + 0.0 + ) + ((begin + (set! v1-0 (/ total 2)) + (< v1-0 progress) + ) + (let ((a0-1 (- progress total))) + (+ + 0.5 + (* + 0.5 + (sin (- 16384.0 (/ (* 16384.0 (the float a0-1)) (the float v1-0)))) + ) + ) + ) + ) + (else + (- 0.5 (* 0.5 (cos (/ (* 16384.0 (the float progress)) (the float v1-0))))) + ) + ) + ) + + + + diff --git a/test/offline/offline_test_main.cpp b/test/offline/offline_test_main.cpp index 799bd729ef..515957eaff 100644 --- a/test/offline/offline_test_main.cpp +++ b/test/offline/offline_test_main.cpp @@ -15,8 +15,8 @@ namespace { // list of object files to ignore during reference checks const std::unordered_set g_object_files_to_ignore_ref_checks = { - "pskernel", "transformq-h", "geometry", "trigonometry", "math-camera", "timer", - "texture", "ocean-tables", "ocean-frames", "time-of-day", "display"}; + "pskernel", "geometry", "math-camera", "timer", "texture", + "ocean-tables", "ocean-frames", "time-of-day", "display"}; const std::unordered_set g_object_files_to_ignore_decompiling = { // TODO - not implemented, if you want to ignore decompiling something currently, don't include @@ -49,6 +49,8 @@ const std::unordered_set expected_skip_in_decompiler = { // bounding-box "(method 9 bounding-box)", // handwritten asm loop "(method 14 bounding-box)", // handwritten asm loop + // trig + "exp", "atan0", "sincos!", "sincos-rad!", // matrix "(method 9 matrix)", // handwritten asm loop "matrix-axis-sin-cos!", "matrix-axis-sin-cos-vu!", @@ -97,6 +99,13 @@ const std::unordered_set skip_in_compiling = { "rand-vu-init", "rand-vu", "rand-vu-nostep", // random hardware "log2", // weird tricky int-as-float stuff + // trig + "sin-rad", // fpu acc + "cos-rad", // fpu acc + "atan-series-rad", // fpu acc + "vector-rad<-vector-deg!", // bad decisions on float vs int128 + "vector-rad<-vector-deg/2!", // bad decisions on float vs int128 + /// VECTOR-H "(method 3 vector)", // this function appears twice, which confuses the compiler. "vector-dot", // fpu acc