diff --git a/decompiler/IR2/Form.cpp b/decompiler/IR2/Form.cpp index 8a6dc29c23..3717754ce6 100644 --- a/decompiler/IR2/Form.cpp +++ b/decompiler/IR2/Form.cpp @@ -821,8 +821,8 @@ CondWithElseElement::CondWithElseElement(std::vector _entries, Form* _els goos::Object CondWithElseElement::to_form_internal(const Env& env) const { // for now we only turn it into an if statement if both cases won't require a begin at the top // level. I think it is more common to write these as a two-case cond instead of an if with begin. - if (entries.size() == 1 && entries.front().body->is_single_element() && - else_ir->is_single_element()) { + if (entries.size() == 1 && entries.front().body->is_reasonable_for_if() && + else_ir->is_reasonable_for_if()) { std::vector list; list.push_back(pretty_print::to_symbol("if")); list.push_back(entries.front().condition->to_form_as_condition(env)); @@ -1126,7 +1126,7 @@ CondNoElseElement::CondNoElseElement(std::vector _entries) : entries(std: } goos::Object CondNoElseElement::to_form_internal(const Env& env) const { - if (entries.size() == 1 && entries.front().body->is_single_element()) { + if (entries.size() == 1 && entries.front().body->is_reasonable_for_if()) { // print as an if statement if we can put the body in a single form. std::vector list; list.push_back(pretty_print::to_symbol("if")); diff --git a/decompiler/IR2/Form.h b/decompiler/IR2/Form.h index e1d653f929..e0f6f4e4cc 100644 --- a/decompiler/IR2/Form.h +++ b/decompiler/IR2/Form.h @@ -33,6 +33,14 @@ class FormElement { virtual void get_modified_regs(RegSet& regs) const = 0; virtual bool active() const; + // is this element reasonable to put directly in an if? + // of course it's possible to put whatever you want, but it looks weird to do something like + // (if (condition?) + // + // + // ) + virtual bool allow_in_if() const { return true; } + std::string to_string(const Env& env) const; bool has_side_effects(); @@ -489,6 +497,7 @@ class ConditionElement : public FormElement { FormPool& pool, const std::vector& source_forms, const std::vector& types); + bool allow_in_if() const override { return false; } private: IR2_Condition::Kind m_kind; @@ -621,6 +630,7 @@ class CondWithElseElement : public FormElement { void collect_vars(RegAccessSet& vars, bool recursive) const override; void push_to_stack(const Env& env, FormPool& pool, FormStack& stack) override; void get_modified_regs(RegSet& regs) const override; + bool allow_in_if() const override { return false; } }; /*! @@ -673,6 +683,7 @@ class WhileElement : public FormElement { void collect_vars(RegAccessSet& vars, bool recursive) const override; void push_to_stack(const Env& env, FormPool& pool, FormStack& stack) override; void get_modified_regs(RegSet& regs) const override; + bool allow_in_if() const override { return false; } Form* condition = nullptr; Form* body = nullptr; bool cleaned = false; @@ -692,6 +703,7 @@ class UntilElement : public FormElement { void collect_vars(RegAccessSet& vars, bool recursive) const override; void push_to_stack(const Env& env, FormPool& pool, FormStack& stack) override; void get_modified_regs(RegSet& regs) const override; + bool allow_in_if() const override { return false; } Form* condition = nullptr; Form* body = nullptr; }; @@ -764,6 +776,7 @@ class CondNoElseElement : public FormElement { FormStack& stack, std::vector* result, bool allow_side_effects) override; + bool allow_in_if() const override { return false; } }; /*! @@ -1247,6 +1260,7 @@ class LetElement : public FormElement { void get_modified_regs(RegSet& regs) const override; Form* body() { return m_body; } void set_body(Form* new_body); + bool allow_in_if() const override { return false; } struct Entry { RegisterAccess dest; @@ -1274,6 +1288,7 @@ class DoTimesElement : public FormElement { void apply_form(const std::function& f) override; void collect_vars(RegAccessSet& vars, bool recursive) const override; void get_modified_regs(RegSet& regs) const override; + bool allow_in_if() const override { return false; } private: RegisterAccess m_var_init, m_var_check, m_var_inc; @@ -1421,12 +1436,51 @@ class Form { return nullptr; } + FormElement* try_as_single_active_element() const { + int active_count = 0; + FormElement* result = nullptr; + for (auto& elt : m_elements) { + if (elt->active()) { + active_count++; + result = elt; + } + } + if (active_count == 1) { + return result; + } else { + return nullptr; + } + } + template T* try_as_element() const { return dynamic_cast(try_as_single_element()); } bool is_single_element() const { return m_elements.size() == 1; } + bool is_single_active_element() const { + int active_count = 0; + for (auto& elt : m_elements) { + if (elt->active()) { + active_count++; + } + } + return active_count == 1; + } + + bool is_reasonable_for_if() const { + int active_count = 0; + for (auto& elt : m_elements) { + if (elt->active()) { + if (!elt->allow_in_if()) { + return false; + } + active_count++; + } + } + return active_count == 1; + } + FormElement* operator[](int idx) { return m_elements.at(idx); } FormElement*& at(int idx) { return m_elements.at(idx); } const FormElement* operator[](int idx) const { return m_elements.at(idx); } diff --git a/decompiler/IR2/GenericElementMatcher.cpp b/decompiler/IR2/GenericElementMatcher.cpp index 1e11e03261..7cb8e4708f 100644 --- a/decompiler/IR2/GenericElementMatcher.cpp +++ b/decompiler/IR2/GenericElementMatcher.cpp @@ -105,6 +105,20 @@ Matcher Matcher::if_with_else(const Matcher& condition, return m; } +Matcher Matcher::if_no_else(const Matcher& condition, const Matcher& true_case) { + Matcher m; + m.m_kind = Kind::IF_NO_ELSE; + m.m_sub_matchers = {condition, true_case}; + return m; +} + +Matcher Matcher::or_expression(const std::vector& elts) { + Matcher m; + m.m_kind = Kind::SC_OR; + m.m_sub_matchers = elts; + return m; +} + Matcher Matcher::deref(const Matcher& root, bool is_addr_of, const std::vector& tokens) { @@ -148,7 +162,7 @@ bool Matcher::do_match(Form* input, MatchResult::Maps* maps_out) const { bool got = false; RegisterAccess result; - auto as_simple_atom = dynamic_cast(input->try_as_single_element()); + auto as_simple_atom = dynamic_cast(input->try_as_single_active_element()); if (as_simple_atom) { if (as_simple_atom->atom().is_var()) { got = true; @@ -156,7 +170,7 @@ bool Matcher::do_match(Form* input, MatchResult::Maps* maps_out) const { } } - auto as_expr = dynamic_cast(input->try_as_single_element()); + auto as_expr = dynamic_cast(input->try_as_single_active_element()); if (as_expr && as_expr->expr().is_identity()) { auto atom = as_expr->expr().get_arg(0); if (atom.is_var()) { @@ -180,7 +194,7 @@ bool Matcher::do_match(Form* input, MatchResult::Maps* maps_out) const { bool got = false; int result; - auto as_simple_atom = dynamic_cast(input->try_as_single_element()); + auto as_simple_atom = dynamic_cast(input->try_as_single_active_element()); if (as_simple_atom) { if (as_simple_atom->atom().is_label()) { got = true; @@ -188,7 +202,7 @@ bool Matcher::do_match(Form* input, MatchResult::Maps* maps_out) const { } } - auto as_expr = dynamic_cast(input->try_as_single_element()); + auto as_expr = dynamic_cast(input->try_as_single_active_element()); if (as_expr && as_expr->expr().is_identity()) { auto atom = as_expr->expr().get_arg(0); if (atom.is_label()) { @@ -208,7 +222,7 @@ bool Matcher::do_match(Form* input, MatchResult::Maps* maps_out) const { } break; case Kind::GENERIC_OP: { - auto as_generic = dynamic_cast(input->try_as_single_element()); + auto as_generic = dynamic_cast(input->try_as_single_active_element()); if (as_generic) { if (!m_gen_op_matcher->do_match(as_generic->op(), maps_out)) { return false; @@ -229,7 +243,7 @@ bool Matcher::do_match(Form* input, MatchResult::Maps* maps_out) const { } break; case Kind::GENERIC_OP_WITH_REST: { - auto as_generic = dynamic_cast(input->try_as_single_element()); + auto as_generic = dynamic_cast(input->try_as_single_active_element()); if (as_generic) { if (!m_gen_op_matcher->do_match(as_generic->op(), maps_out)) { return false; @@ -271,7 +285,7 @@ bool Matcher::do_match(Form* input, MatchResult::Maps* maps_out) const { } break; case Kind::CAST: { - auto as_cast = dynamic_cast(input->try_as_single_element()); + auto as_cast = dynamic_cast(input->try_as_single_active_element()); if (as_cast) { if (as_cast->type().print() == m_str) { return m_sub_matchers.at(0).do_match(as_cast->source(), maps_out); @@ -281,7 +295,7 @@ bool Matcher::do_match(Form* input, MatchResult::Maps* maps_out) const { } break; case Kind::INT: { - auto as_simple_atom = dynamic_cast(input->try_as_single_element()); + auto as_simple_atom = dynamic_cast(input->try_as_single_active_element()); if (as_simple_atom) { if (as_simple_atom->atom().is_int()) { if (!m_int_match.has_value()) { @@ -291,7 +305,7 @@ bool Matcher::do_match(Form* input, MatchResult::Maps* maps_out) const { } } - auto as_expr = dynamic_cast(input->try_as_single_element()); + auto as_expr = dynamic_cast(input->try_as_single_active_element()); if (as_expr && as_expr->expr().is_identity()) { auto atom = as_expr->expr().get_arg(0); if (atom.is_int()) { @@ -306,7 +320,7 @@ bool Matcher::do_match(Form* input, MatchResult::Maps* maps_out) const { } break; case Kind::ANY_INT: { - auto as_simple_atom = dynamic_cast(input->try_as_single_element()); + auto as_simple_atom = dynamic_cast(input->try_as_single_active_element()); if (as_simple_atom) { if (as_simple_atom->atom().is_int()) { if (m_int_out_id != -1) { @@ -316,7 +330,7 @@ bool Matcher::do_match(Form* input, MatchResult::Maps* maps_out) const { } } - auto as_expr = dynamic_cast(input->try_as_single_element()); + auto as_expr = dynamic_cast(input->try_as_single_active_element()); if (as_expr && as_expr->expr().is_identity()) { auto atom = as_expr->expr().get_arg(0); if (atom.is_int()) { @@ -331,7 +345,7 @@ bool Matcher::do_match(Form* input, MatchResult::Maps* maps_out) const { } break; case Kind::ANY_QUOTED_SYMBOL: { - auto as_simple_atom = dynamic_cast(input->try_as_single_element()); + auto as_simple_atom = dynamic_cast(input->try_as_single_active_element()); if (as_simple_atom) { if (as_simple_atom->atom().is_sym_ptr()) { if (m_string_out_id != -1) { @@ -341,7 +355,7 @@ bool Matcher::do_match(Form* input, MatchResult::Maps* maps_out) const { } } - auto as_expr = dynamic_cast(input->try_as_single_element()); + auto as_expr = dynamic_cast(input->try_as_single_active_element()); if (as_expr && as_expr->expr().is_identity()) { auto atom = as_expr->expr().get_arg(0); if (atom.is_sym_ptr()) { @@ -355,7 +369,7 @@ bool Matcher::do_match(Form* input, MatchResult::Maps* maps_out) const { } case Kind::ANY_SYMBOL: { - auto as_simple_atom = dynamic_cast(input->try_as_single_element()); + auto as_simple_atom = dynamic_cast(input->try_as_single_active_element()); if (as_simple_atom) { if (as_simple_atom->atom().is_sym_val()) { if (m_string_out_id != -1) { @@ -365,7 +379,7 @@ bool Matcher::do_match(Form* input, MatchResult::Maps* maps_out) const { } } - auto as_expr = dynamic_cast(input->try_as_single_element()); + auto as_expr = dynamic_cast(input->try_as_single_active_element()); if (as_expr && as_expr->expr().is_identity()) { auto atom = as_expr->expr().get_arg(0); if (atom.is_sym_val()) { @@ -379,14 +393,14 @@ bool Matcher::do_match(Form* input, MatchResult::Maps* maps_out) const { } case Kind::SYMBOL: { - auto as_simple_atom = dynamic_cast(input->try_as_single_element()); + auto as_simple_atom = dynamic_cast(input->try_as_single_active_element()); if (as_simple_atom) { if (as_simple_atom->atom().is_sym_val()) { return as_simple_atom->atom().get_str() == m_str; } } - auto as_expr = dynamic_cast(input->try_as_single_element()); + auto as_expr = dynamic_cast(input->try_as_single_active_element()); if (as_expr && as_expr->expr().is_identity()) { auto atom = as_expr->expr().get_arg(0); if (atom.is_sym_val()) { @@ -397,7 +411,7 @@ bool Matcher::do_match(Form* input, MatchResult::Maps* maps_out) const { } case Kind::DEREF_OP: { - auto as_deref = dynamic_cast(input->try_as_single_element()); + auto as_deref = dynamic_cast(input->try_as_single_active_element()); if (as_deref) { if (as_deref->is_addr_of() != m_deref_is_addr_of) { return false; @@ -419,7 +433,7 @@ bool Matcher::do_match(Form* input, MatchResult::Maps* maps_out) const { } case Kind::SET: { - auto as_set = dynamic_cast(input->try_as_single_element()); + auto as_set = dynamic_cast(input->try_as_single_active_element()); if (!as_set) { return false; } @@ -435,7 +449,7 @@ bool Matcher::do_match(Form* input, MatchResult::Maps* maps_out) const { } break; case Kind::IF_WITH_ELSE: { - auto as_cond = dynamic_cast(input->try_as_single_element()); + auto as_cond = dynamic_cast(input->try_as_single_active_element()); if (!as_cond) { return false; } @@ -458,8 +472,47 @@ bool Matcher::do_match(Form* input, MatchResult::Maps* maps_out) const { return true; } break; + case Kind::IF_NO_ELSE: { + auto as_cond = dynamic_cast(input->try_as_single_active_element()); + if (!as_cond) { + return false; + } + + if (as_cond->entries.size() != 1) { + return false; + } + + if (!m_sub_matchers.at(0).do_match(as_cond->entries.front().condition, maps_out)) { + return false; + } + + if (!m_sub_matchers.at(1).do_match(as_cond->entries.front().body, maps_out)) { + return false; + } + + return true; + } break; + + case Kind::SC_OR: { + auto as_sc = dynamic_cast(input->try_as_single_active_element()); + if (!as_sc || as_sc->kind != ShortCircuitElement::OR) { + return false; + } + if (as_sc->entries.size() != m_sub_matchers.size()) { + return false; + } + + for (size_t i = 0; i < m_sub_matchers.size(); i++) { + if (!m_sub_matchers.at(i).do_match(as_sc->entries.at(i).condition, maps_out)) { + return false; + } + } + + return true; + } break; + case Kind::WHILE_LOOP: { - auto as_while = dynamic_cast(input->try_as_single_element()); + auto as_while = dynamic_cast(input->try_as_single_active_element()); if (!as_while) { return false; } diff --git a/decompiler/IR2/GenericElementMatcher.h b/decompiler/IR2/GenericElementMatcher.h index 2eec692497..73d28cfe26 100644 --- a/decompiler/IR2/GenericElementMatcher.h +++ b/decompiler/IR2/GenericElementMatcher.h @@ -45,8 +45,10 @@ class Matcher { static Matcher if_with_else(const Matcher& condition, const Matcher& true_case, const Matcher& false_case); + static Matcher if_no_else(const Matcher& condition, const Matcher& true_case); static Matcher while_loop(const Matcher& condition, const Matcher& body); static Matcher any_constant_token(int match_id = -1); + static Matcher or_expression(const std::vector& elts); enum class Kind { ANY_REG, // matching any register @@ -64,8 +66,10 @@ class Matcher { ANY_LABEL, SYMBOL, IF_WITH_ELSE, + IF_NO_ELSE, WHILE_LOOP, ANY_CONSTANT_TOKEN, + SC_OR, INVALID }; diff --git a/decompiler/analysis/final_output.cpp b/decompiler/analysis/final_output.cpp index 5ae638202c..220c1124ad 100644 --- a/decompiler/analysis/final_output.cpp +++ b/decompiler/analysis/final_output.cpp @@ -219,6 +219,19 @@ std::string write_from_top_level(const Function& top_level, // (set! sym-val ) auto define_symbol_matcher = Matcher::set(Matcher::any_symbol(0), Matcher::any(1)); + // define-perm + // (if (or (not ) (zero? )) + // (set! ) + // ) + auto define_perm_matcher = Matcher::if_no_else( + Matcher::op(GenericOpMatcher::condition(IR2_Condition::Kind::TRUTHY), + {Matcher::or_expression( + {Matcher::op(GenericOpMatcher::condition(IR2_Condition::Kind::FALSE), + {Matcher::any_symbol(0)}), + Matcher::op(GenericOpMatcher::condition(IR2_Condition::Kind::ZERO), + {Matcher::any_symbol(1)})})}), + Matcher::set(Matcher::any_symbol(2), Matcher::any(3))); + for (auto& x : forms) { bool something_matched = false; Form f; @@ -308,6 +321,26 @@ std::string write_from_top_level(const Function& top_level, } } + if (!something_matched) { + auto define_perm_match_result = match(define_perm_matcher, &f); + if (define_perm_match_result.matched && + define_perm_match_result.maps.strings.at(0) == + define_perm_match_result.maps.strings.at(1) && + define_perm_match_result.maps.strings.at(0) == + define_perm_match_result.maps.strings.at(2)) { + something_matched = true; + auto sym_name = define_perm_match_result.maps.strings.at(0); + auto symbol_type = dts.lookup_symbol_type(sym_name); + + result += fmt::format(";; definition (perm) for symbol {}, type {}\n", sym_name, + symbol_type.print()); + result += pretty_print::to_string(pretty_print::build_list( + fmt::format("define-perm {} {}", sym_name, symbol_type.print()), + define_perm_match_result.maps.forms.at(3)->to_form(env))); + result += "\n\n"; + } + } + if (!something_matched) { result += ";; failed to figure out what this is:\n"; result += pretty_print::to_string(x->to_form(env)); diff --git a/goal_src/engine/game/main-h.gc b/goal_src/engine/game/main-h.gc index 4981ecbf59..c3d855adf9 100644 --- a/goal_src/engine/game/main-h.gc +++ b/goal_src/engine/game/main-h.gc @@ -91,16 +91,8 @@ (define *subdivide-draw-mode* 0) (define *ocean-subdivide-draw-mode* 0) -;; this is a bit of a trick. -;; I believe *dproc* is the display process. -;; if it is already created and this file is reloaded, we don't want to write over it. -;; so we only set it to #f if we think it hasn't been set before. -(define-extern *dproc* process) -(when (or (not *dproc*) - (zero? *dproc*)) - ;; no dproc, safe to write over it. - (set! *dproc* #f) - ) +;; don't overwrite the dproc if we're reloading this file. +(define-perm *dproc* process #f) (define *run* #f) (define *teleport* #f) diff --git a/test/decompiler/reference/all_forward_declarations.gc b/test/decompiler/reference/all_forward_declarations.gc index 703109df15..7670d14ef2 100644 --- a/test/decompiler/reference/all_forward_declarations.gc +++ b/test/decompiler/reference/all_forward_declarations.gc @@ -551,5 +551,5 @@ (define-extern *target* target) (declare-type sidekick basic) -(define-extern *sidekick* basic) +(define-extern *sidekick* sidekick) diff --git a/test/decompiler/reference/engine/dma/dma-disasm_REF.gc b/test/decompiler/reference/engine/dma/dma-disasm_REF.gc index 363a5f34eb..264a6e296b 100644 --- a/test/decompiler/reference/engine/dma/dma-disasm_REF.gc +++ b/test/decompiler/reference/engine/dma/dma-disasm_REF.gc @@ -721,174 +721,189 @@ ) (disasm-dma-tag current-tag stream-2) ) - (if end-condition - (empty-form) - (cond - ((or - (= (-> current-tag id) (dma-tag-id ref)) - (= (-> current-tag id) (dma-tag-id refs)) - (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) - ) + (cond + (end-condition + ) + (else + (cond + ((or + (= (-> current-tag id) (dma-tag-id ref)) + (= (-> current-tag id) (dma-tag-id refs)) + (zero? (-> current-tag id)) ) - ) - (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 + (set! addr (-> current-tag addr)) + (set! qwc (the-as int (-> current-tag qwc))) + (when 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 (pointer uint64) data-2) 1)) - (the-as int (+ (shl (the-as int qwc) 2) 2)) + (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 uint data-2) + ) + (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 - uint - (shl (the-as int (+ (the-as uint qwc) (the-as uint 1))) 4) + (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-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 + (set! + data-2 + (the-as + dma-packet + (+ + (the-as uint data-2) (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))) + uint + (shl (the-as int (+ (the-as uint qwc) (the-as uint 1))) 4) ) ) ) ) - ((= (-> 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-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) ) - (let ((v1-123 call-depth)) - (cond - ((zero? v1-123) - (set! data-2 (the-as dma-packet ra-1)) - (let ((v1-125 data-2)) + ) + (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) ) - ((= v1-123 1) - (set! data-2 (the-as dma-packet ra-2)) - (let ((v1-127 data-2)) + ) + (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! end-condition #t) + (set! ra-2 (&+ addr qwc)) + (let ((v1-111 (the-as (pointer uint64) ra-2))) + ) ) ) ) - (set! call-depth (+ call-depth -1)) - (let ((v1-131 call-depth)) + ((= (-> 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) + ((= (-> 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) ) - (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) ) - ) - (else - (format stream-2 "ERROR: Unknown DMA TAG command.~%") - (set! end-condition 'error) ) ) ) @@ -914,4 +929,3 @@ ) ) - diff --git a/test/decompiler/reference/engine/game/main-h_REF.gc b/test/decompiler/reference/engine/game/main-h_REF.gc index f413d8dd9d..f243f10742 100644 --- a/test/decompiler/reference/engine/game/main-h_REF.gc +++ b/test/decompiler/reference/engine/game/main-h_REF.gc @@ -256,10 +256,8 @@ ;; definition for symbol *ocean-subdivide-draw-mode*, type int (define *ocean-subdivide-draw-mode* 0) -;; failed to figure out what this is: -(when (or (not *dproc*) (zero? *dproc*)) - (set! *dproc* #f) - ) +;; definition (perm) for symbol *dproc*, type process +(define-perm *dproc* process #f) ;; definition for symbol *run*, type symbol (define *run* #f) @@ -330,7 +328,3 @@ ;; failed to figure out what this is: (let ((v0-2 0)) ) - - - - diff --git a/test/decompiler/reference/engine/gfx/font-h_REF.gc b/test/decompiler/reference/engine/gfx/font-h_REF.gc index 7a5828af21..8e6d89cc8b 100644 --- a/test/decompiler/reference/engine/gfx/font-h_REF.gc +++ b/test/decompiler/reference/engine/gfx/font-h_REF.gc @@ -209,12 +209,16 @@ (set! (-> v1-3 origin x) (the float x)) (set! (-> v1-3 origin y) (the float y)) ) - (if (= z 0.0) - (let ((v1-4 obj)) - (set! (-> v1-4 origin z) (-> *math-camera* isometric data 14)) + (cond + ((= z 0.0) + (let ((v1-4 obj)) + (set! (-> v1-4 origin z) (-> *math-camera* isometric data 14)) + ) ) - (let ((v1-5 obj)) - (set! (-> v1-5 origin z) z) + (else + (let ((v1-5 obj)) + (set! (-> v1-5 origin z) z) + ) ) ) (let ((v1-6 obj)) @@ -792,6 +796,3 @@ ;; failed to figure out what this is: (let ((v0-4 0)) ) - - - diff --git a/test/decompiler/reference/engine/load/file-io_REF.gc b/test/decompiler/reference/engine/load/file-io_REF.gc index e1e07671d2..f3c8665e74 100644 --- a/test/decompiler/reference/engine/load/file-io_REF.gc +++ b/test/decompiler/reference/engine/load/file-io_REF.gc @@ -153,24 +153,28 @@ (defun file-info-correct-version? ((info file-info) (kind file-kind) (version-override int)) - (let* ((expected-version (if (zero? version-override) - (let ((v1-0 kind)) - (cond - ((or - (= v1-0 (file-kind tpage)) - (= v1-0 (file-kind dir-tpage)) + (let* ((expected-version (cond + ((zero? version-override) + (let ((v1-0 kind)) + (cond + ((or + (= v1-0 (file-kind tpage)) + (= v1-0 (file-kind dir-tpage)) + ) + 7 + ) + ((zero? v1-0) + 30 + ) + ((= v1-0 (file-kind art-group)) + 6 ) - 7 - ) - ((zero? v1-0) - 30 - ) - ((= v1-0 (file-kind art-group)) - 6 ) ) ) - version-override + (else + version-override + ) ) ) (v1-1 kind) @@ -215,4 +219,3 @@ ) ) ) - diff --git a/test/decompiler/reference/engine/math/euler_REF.gc b/test/decompiler/reference/engine/math/euler_REF.gc index 98f13a7f44..1fbddbb185 100644 --- a/test/decompiler/reference/engine/math/euler_REF.gc +++ b/test/decompiler/reference/engine/math/euler_REF.gc @@ -18,7 +18,7 @@ (matrix-identity! arg0) (let ((s5-0 (new 'stack-no-clear 'vector))) (set! (-> s5-0 quad) (-> arg1 quad)) - (if (= (logand (the int (-> s5-0 w)) 1) 1) + (when (= (logand (the int (-> s5-0 w)) 1) 1) (let ((f0-2 (-> s5-0 x))) (set! (-> s5-0 x) (-> s5-0 z)) (set! (-> s5-0 z) f0-2) @@ -238,220 +238,224 @@ (s2-0 (-> EulNext (+ s3-0 v1-4))) (s1-0 (-> EulNext (+ (- 1 v1-4) s3-0))) ) - (if (= (logand (sar arg2 1) 1) 1) - (let* - ((f0-0 - (-> - (the-as - (pointer float) - (+ (+ (shl s2-0 2) (shl s3-0 4)) (the-as int arg1)) + (cond + ((= (logand (sar arg2 1) 1) 1) + (let* + ((f0-0 + (-> + (the-as + (pointer float) + (+ (+ (shl s2-0 2) (shl s3-0 4)) (the-as int arg1)) + ) ) ) + (f0-2 (* f0-0 f0-0)) + (f1-0 + (-> + (the-as + (pointer float) + (+ (+ (shl s1-0 2) (shl s3-0 4)) (the-as int arg1)) + ) + ) + ) + (f30-0 (sqrtf (+ f0-2 (* f1-0 f1-0)))) ) - (f0-2 (* f0-0 f0-0)) - (f1-0 - (-> - (the-as - (pointer float) - (+ (+ (shl s1-0 2) (shl s3-0 4)) (the-as int arg1)) - ) - ) - ) - (f30-0 (sqrtf (+ f0-2 (* f1-0 f1-0)))) - ) - (cond - ((< 0.00001 f30-0) - (set! - (-> arg0 x) - (atan - (-> - (the-as - (pointer float) - (+ (+ (shl s2-0 2) (shl s3-0 4)) (the-as int arg1)) - ) - ) - (-> - (the-as - (pointer float) - (+ (+ (shl s1-0 2) (shl s3-0 4)) (the-as int arg1)) - ) - ) - ) - ) - (set! - (-> arg0 y) - (atan - f30-0 - (-> - (the-as - (pointer float) - (+ (+ (shl s3-0 2) (shl s3-0 4)) (the-as int arg1)) - ) - ) - ) - ) - (set! - (-> arg0 z) - (atan - (-> - (the-as - (pointer float) - (+ (+ (shl s3-0 2) (shl s2-0 4)) (the-as int arg1)) - ) - ) - (- + (cond + ((< 0.00001 f30-0) + (set! + (-> arg0 x) + (atan (-> (the-as (pointer float) - (+ (+ (shl s3-0 2) (shl s1-0 4)) (the-as int arg1)) + (+ (+ (shl s2-0 2) (shl s3-0 4)) (the-as int arg1)) + ) + ) + (-> + (the-as + (pointer float) + (+ (+ (shl s1-0 2) (shl s3-0 4)) (the-as int arg1)) + ) + ) + ) + ) + (set! + (-> arg0 y) + (atan + f30-0 + (-> + (the-as + (pointer float) + (+ (+ (shl s3-0 2) (shl s3-0 4)) (the-as int arg1)) + ) + ) + ) + ) + (set! + (-> arg0 z) + (atan + (-> + (the-as + (pointer float) + (+ (+ (shl s3-0 2) (shl s2-0 4)) (the-as int arg1)) + ) + ) + (- + (-> + (the-as + (pointer float) + (+ (+ (shl s3-0 2) (shl s1-0 4)) (the-as int arg1)) + ) ) ) ) ) ) - ) - (else - (set! - (-> arg0 x) - (atan - (- + (else + (set! + (-> arg0 x) + (atan + (- + (-> + (the-as + (pointer float) + (+ (+ (shl s1-0 2) (shl s2-0 4)) (the-as int arg1)) + ) + ) + ) (-> (the-as (pointer float) - (+ (+ (shl s1-0 2) (shl s2-0 4)) (the-as int arg1)) + (+ (+ (shl s2-0 2) (shl s2-0 4)) (the-as int arg1)) ) ) ) - (-> - (the-as - (pointer float) - (+ (+ (shl s2-0 2) (shl s2-0 4)) (the-as int arg1)) + ) + (set! + (-> arg0 y) + (atan + f30-0 + (-> + (the-as + (pointer float) + (+ (+ (shl s3-0 2) (shl s3-0 4)) (the-as int arg1)) + ) ) ) ) + (set! (-> arg0 z) 0.0) ) - (set! - (-> arg0 y) - (atan - f30-0 - (-> - (the-as - (pointer float) - (+ (+ (shl s3-0 2) (shl s3-0 4)) (the-as int arg1)) - ) - ) - ) - ) - (set! (-> arg0 z) 0.0) ) ) ) - (let* - ((f0-21 - (-> - (the-as - (pointer float) - (+ (+ (shl s3-0 2) (shl s3-0 4)) (the-as int arg1)) - ) - ) - ) - (f0-23 (* f0-21 f0-21)) - (f1-3 - (-> - (the-as - (pointer float) - (+ (+ (shl s3-0 2) (shl s2-0 4)) (the-as int arg1)) - ) - ) - ) - (f30-1 (sqrtf (+ f0-23 (* f1-3 f1-3)))) - ) - (cond - ((< 0.00001 f30-1) - (set! - (-> arg0 x) - (atan - (-> - (the-as - (pointer float) - (+ (+ (shl s2-0 2) (shl s1-0 4)) (the-as int arg1)) - ) - ) - (-> - (the-as - (pointer float) - (+ (+ (shl s1-0 2) (shl s1-0 4)) (the-as int arg1)) - ) + (else + (let* + ((f0-21 + (-> + (the-as + (pointer float) + (+ (+ (shl s3-0 2) (shl s3-0 4)) (the-as int arg1)) ) ) ) - (set! - (-> arg0 y) - (atan - (- + (f0-23 (* f0-21 f0-21)) + (f1-3 + (-> + (the-as + (pointer float) + (+ (+ (shl s3-0 2) (shl s2-0 4)) (the-as int arg1)) + ) + ) + ) + (f30-1 (sqrtf (+ f0-23 (* f1-3 f1-3)))) + ) + (cond + ((< 0.00001 f30-1) + (set! + (-> arg0 x) + (atan (-> (the-as (pointer float) - (+ (+ (shl s3-0 2) (shl s1-0 4)) (the-as int arg1)) + (+ (+ (shl s2-0 2) (shl s1-0 4)) (the-as int arg1)) ) ) - ) - f30-1 - ) - ) - (set! - (-> arg0 z) - (atan - (-> - (the-as - (pointer float) - (+ (+ (shl s3-0 2) (shl s2-0 4)) (the-as int arg1)) - ) - ) - (-> - (the-as - (pointer float) - (+ (+ (shl s3-0 2) (shl s3-0 4)) (the-as int arg1)) - ) - ) - ) - ) - ) - (else - (set! - (-> arg0 x) - (atan - (- (-> (the-as (pointer float) - (+ (+ (shl s1-0 2) (shl s2-0 4)) (the-as int arg1)) + (+ (+ (shl s1-0 2) (shl s1-0 4)) (the-as int arg1)) ) ) ) - (-> - (the-as - (pointer float) - (+ (+ (shl s2-0 2) (shl s2-0 4)) (the-as int arg1)) + ) + (set! + (-> arg0 y) + (atan + (- + (-> + (the-as + (pointer float) + (+ (+ (shl s3-0 2) (shl s1-0 4)) (the-as int arg1)) + ) + ) ) + f30-1 ) ) - ) - (set! - (-> arg0 y) - (atan - (- + (set! + (-> arg0 z) + (atan (-> (the-as (pointer float) - (+ (+ (shl s3-0 2) (shl s1-0 4)) (the-as int arg1)) + (+ (+ (shl s3-0 2) (shl s2-0 4)) (the-as int arg1)) + ) + ) + (-> + (the-as + (pointer float) + (+ (+ (shl s3-0 2) (shl s3-0 4)) (the-as int arg1)) ) ) ) - f30-1 ) ) - (set! (-> arg0 z) 0.0) + (else + (set! + (-> arg0 x) + (atan + (- + (-> + (the-as + (pointer float) + (+ (+ (shl s1-0 2) (shl s2-0 4)) (the-as int arg1)) + ) + ) + ) + (-> + (the-as + (pointer float) + (+ (+ (shl s2-0 2) (shl s2-0 4)) (the-as int arg1)) + ) + ) + ) + ) + (set! + (-> arg0 y) + (atan + (- + (-> + (the-as + (pointer float) + (+ (+ (shl s3-0 2) (shl s1-0 4)) (the-as int arg1)) + ) + ) + ) + f30-1 + ) + ) + (set! (-> arg0 z) 0.0) + ) ) ) ) @@ -462,7 +466,7 @@ (set! (-> arg0 y) (- (-> arg0 y))) (set! (-> arg0 z) (- (-> arg0 z))) ) - (if (= (logand arg2 1) 1) + (when (= (logand arg2 1) 1) (let ((f0-49 (-> arg0 x))) (set! (-> arg0 x) (-> arg0 z)) (set! (-> arg0 z) f0-49) @@ -489,7 +493,3 @@ ) arg0 ) - - - - diff --git a/test/decompiler/reference/engine/math/quaternion_REF.gc b/test/decompiler/reference/engine/math/quaternion_REF.gc index bc89a255ff..3d6310cc36 100644 --- a/test/decompiler/reference/engine/math/quaternion_REF.gc +++ b/test/decompiler/reference/engine/math/quaternion_REF.gc @@ -455,134 +455,138 @@ ;; definition for function matrix->quaternion (defun matrix->quaternion ((arg0 quaternion) (arg1 matrix)) (let ((f0-2 (+ (+ (-> arg1 data 0) (-> arg1 data 5)) (-> arg1 data 10)))) - (if (< 0.0 f0-2) - (let ((f0-4 (sqrtf (+ 1.0 f0-2)))) - (set! (-> arg0 w) (* 0.5 f0-4)) - (let ((f0-5 (/ 0.5 f0-4))) - (set! (-> arg0 x) (* f0-5 (- (-> arg1 data 6) (-> arg1 data 9)))) - (set! (-> arg0 y) (* f0-5 (- (-> arg1 data 8) (-> arg1 data 2)))) - (set! (-> arg0 z) (* f0-5 (- (-> arg1 data 1) (-> arg1 data 4)))) + (cond + ((< 0.0 f0-2) + (let ((f0-4 (sqrtf (+ 1.0 f0-2)))) + (set! (-> arg0 w) (* 0.5 f0-4)) + (let ((f0-5 (/ 0.5 f0-4))) + (set! (-> arg0 x) (* f0-5 (- (-> arg1 data 6) (-> arg1 data 9)))) + (set! (-> arg0 y) (* f0-5 (- (-> arg1 data 8) (-> arg1 data 2)))) + (set! (-> arg0 z) (* f0-5 (- (-> arg1 data 1) (-> arg1 data 4)))) + ) ) ) - (let ((a2-0 0) - (a3-0 1) - (v1-1 2) + (else + (let ((a2-0 0) + (a3-0 1) + (v1-1 2) + ) + (when (< (-> arg1 data 0) (-> arg1 data 5)) + (set! a2-0 1) + (set! a3-0 2) + (set! v1-1 0) + ) + (when + (< + (-> + (the-as + (pointer float) + (+ (+ (shl a2-0 2) (shl a2-0 4)) (the-as int arg1)) + ) + ) + (-> arg1 data 10) + ) + (set! a2-0 2) + (set! a3-0 0) + (set! v1-1 1) + ) + (let + ((f0-12 + (sqrtf + (+ + (- + 1.0 + (+ + (-> + (the-as + (pointer float) + (+ (+ (shl a3-0 2) (shl a3-0 4)) (the-as int arg1)) + ) + ) + (-> + (the-as + (pointer float) + (+ (+ (shl v1-1 2) (shl v1-1 4)) (the-as int arg1)) + ) + ) + ) + ) + (-> + (the-as + (pointer float) + (+ (+ (shl a2-0 2) (shl a2-0 4)) (the-as int arg1)) + ) + ) + ) ) - (when (< (-> arg1 data 0) (-> arg1 data 5)) - (set! a2-0 1) - (set! a3-0 2) - (set! v1-1 0) - ) - (when - (< - (-> - (the-as - (pointer float) - (+ (+ (shl a2-0 2) (shl a2-0 4)) (the-as int arg1)) ) ) - (-> arg1 data 10) - ) - (set! a2-0 2) - (set! a3-0 0) - (set! v1-1 1) - ) - (let - ((f0-12 - (sqrtf - (+ - (- - 1.0 - (+ - (-> - (the-as - (pointer float) - (+ (+ (shl a3-0 2) (shl a3-0 4)) (the-as int arg1)) - ) - ) - (-> - (the-as - (pointer float) - (+ (+ (shl v1-1 2) (shl v1-1 4)) (the-as int arg1)) - ) - ) + (set! + (-> (the-as (pointer float) (+ (shl a2-0 2) (the-as int arg0)))) + (* 0.5 f0-12) + ) + (if (!= f0-12 0.0) + (set! f0-12 (/ 0.5 f0-12)) + ) + (set! + (-> arg0 w) + (* + (- + (-> + (the-as + (pointer float) + (+ (+ (shl v1-1 2) (shl a3-0 4)) (the-as int arg1)) ) ) (-> (the-as (pointer float) - (+ (+ (shl a2-0 2) (shl a2-0 4)) (the-as int arg1)) + (+ (+ (shl a3-0 2) (shl v1-1 4)) (the-as int arg1)) ) ) ) + f0-12 ) ) - ) - (set! - (-> (the-as (pointer float) (+ (shl a2-0 2) (the-as int arg0)))) - (* 0.5 f0-12) - ) - (if (!= f0-12 0.0) - (set! f0-12 (/ 0.5 f0-12)) - ) - (set! - (-> arg0 w) - (* - (- - (-> - (the-as - (pointer float) - (+ (+ (shl v1-1 2) (shl a3-0 4)) (the-as int arg1)) - ) - ) - (-> - (the-as - (pointer float) - (+ (+ (shl a3-0 2) (shl v1-1 4)) (the-as int arg1)) + (set! + (-> (the-as (pointer float) (+ (shl a3-0 2) (the-as int arg0)))) + (* + (+ + (-> + (the-as + (pointer float) + (+ (+ (shl a3-0 2) (shl a2-0 4)) (the-as int arg1)) + ) + ) + (-> + (the-as + (pointer float) + (+ (+ (shl a2-0 2) (shl a3-0 4)) (the-as int arg1)) + ) ) ) + f0-12 ) - f0-12 ) - ) - (set! - (-> (the-as (pointer float) (+ (shl a3-0 2) (the-as int arg0)))) - (* - (+ - (-> - (the-as - (pointer float) - (+ (+ (shl a3-0 2) (shl a2-0 4)) (the-as int arg1)) - ) - ) - (-> - (the-as - (pointer float) - (+ (+ (shl a2-0 2) (shl a3-0 4)) (the-as int arg1)) + (set! + (-> (the-as (pointer float) (+ (shl v1-1 2) (the-as int arg0)))) + (* + (+ + (-> + (the-as + (pointer float) + (+ (+ (shl v1-1 2) (shl a2-0 4)) (the-as int arg1)) + ) + ) + (-> + (the-as + (pointer float) + (+ (+ (shl a2-0 2) (shl v1-1 4)) (the-as int arg1)) + ) ) ) + f0-12 ) - f0-12 - ) - ) - (set! - (-> (the-as (pointer float) (+ (shl v1-1 2) (the-as int arg0)))) - (* - (+ - (-> - (the-as - (pointer float) - (+ (+ (shl v1-1 2) (shl a2-0 4)) (the-as int arg1)) - ) - ) - (-> - (the-as - (pointer float) - (+ (+ (shl a2-0 2) (shl v1-1 4)) (the-as int arg1)) - ) - ) - ) - f0-12 ) ) ) @@ -1162,7 +1166,3 @@ (vector-y-angle s5-0) ) ) - - - - diff --git a/test/decompiler/reference/engine/math/vector_REF.gc b/test/decompiler/reference/engine/math/vector_REF.gc index d801bf8292..31cd3a4594 100644 --- a/test/decompiler/reference/engine/math/vector_REF.gc +++ b/test/decompiler/reference/engine/math/vector_REF.gc @@ -312,7 +312,7 @@ (let ((x-diff (- (-> target x) (-> vec x))) (z-diff (- (-> target z) (-> vec z))) ) - (if (or (!= x-diff 0.0) (!= z-diff 0.0)) + (when (or (!= x-diff 0.0) (!= z-diff 0.0)) (let* ((x-step (* x-diff alpha)) (z-step (* z-diff alpha)) (step-len (sqrtf (+ (* x-step x-step) (* z-step z-step)))) @@ -342,7 +342,7 @@ (let ((y-diff (- (-> target y) (-> vec y))) (z-diff (- (-> target z) (-> vec z))) ) - (if (or (!= y-diff 0.0) (!= z-diff 0.0)) + (when (or (!= y-diff 0.0) (!= z-diff 0.0)) (let* ((y-step (* y-diff alpha)) (z-step (* z-diff alpha)) (step-len (sqrtf (+ (* y-step y-step) (* z-step z-step)))) @@ -373,7 +373,7 @@ (y-diff (- (-> target y) (-> vec y))) (z-diff (- (-> target z) (-> vec z))) ) - (if (or (!= x-diff 0.0) (!= y-diff 0.0) (!= z-diff 0.0)) + (when (or (!= x-diff 0.0) (!= y-diff 0.0) (!= z-diff 0.0)) (let* ((x-step (* x-diff alpha)) (y-step (* y-diff alpha)) (z-step (* z-diff alpha)) @@ -408,20 +408,24 @@ seek-with-smooth ((value float) (target float) (max-step float) (alpha float) (deadband float)) (let ((diff (- target value))) - (if (>= deadband (fabs diff)) - target - (let ((step (* diff alpha))) - (let ((min-step (- max-step))) - (cond - ((< step min-step) - (set! step min-step) - ) - ((< max-step step) - (set! step max-step) + (cond + ((>= deadband (fabs diff)) + target + ) + (else + (let ((step (* diff alpha))) + (let ((min-step (- max-step))) + (cond + ((< step min-step) + (set! step min-step) + ) + ((< max-step step) + (set! step max-step) + ) ) ) + (+ step value) ) - (+ step value) ) ) ) @@ -790,12 +794,16 @@ ;; Used lq/sq (defun vector-normalize-copy! ((arg0 vector) (arg1 vector) (arg2 float)) (let ((f0-0 (vector-length arg1))) - (if (= f0-0 0.0) - (set! (-> arg0 quad) (-> arg1 quad)) - (let ((v1-1 (/ arg2 f0-0))) - (set! (-> arg0 x) (* (-> arg1 x) v1-1)) - (set! (-> arg0 y) (* (-> arg1 y) v1-1)) - (set! (-> arg0 z) (* (-> arg1 z) v1-1)) + (cond + ((= f0-0 0.0) + (set! (-> arg0 quad) (-> arg1 quad)) + ) + (else + (let ((v1-1 (/ arg2 f0-0))) + (set! (-> arg0 x) (* (-> arg1 x) v1-1)) + (set! (-> arg0 y) (* (-> arg1 y) v1-1)) + (set! (-> arg0 z) (* (-> arg1 z) v1-1)) + ) ) ) ) @@ -806,7 +814,7 @@ ;; definition for function vector-xz-normalize! (defun vector-xz-normalize! ((arg0 vector) (arg1 float)) (let ((f0-0 (vector-xz-length arg0))) - (if (!= f0-0 0.0) + (when (!= f0-0 0.0) (let ((v1-1 (/ arg1 f0-0))) (set! (-> arg0 x) (* (-> arg0 x) v1-1)) (set! (-> arg0 z) (* (-> arg0 z) v1-1)) @@ -1228,7 +1236,3 @@ ) (vector-normalize! arg0 (rand-vu-float-range 0.0 arg1)) ) - - - - diff --git a/test/decompiler/reference/engine/target/target-h_REF.gc b/test/decompiler/reference/engine/target/target-h_REF.gc index 6a024dabf4..bc0f739c24 100644 --- a/test/decompiler/reference/engine/target/target-h_REF.gc +++ b/test/decompiler/reference/engine/target/target-h_REF.gc @@ -69,10 +69,8 @@ obj ) -;; failed to figure out what this is: -(when (or (not *target*) (zero? *target*)) - (set! *target* #f) - ) +;; definition (perm) for symbol *target*, type target +(define-perm *target* target #f) ;; definition of type sidekick (deftype sidekick (process-drawable) @@ -99,15 +97,9 @@ obj ) -;; failed to figure out what this is: -(when (or (not *sidekick*) (zero? *sidekick*)) - (set! *sidekick* #f) - ) +;; definition (perm) for symbol *sidekick*, type sidekick +(define-perm *sidekick* sidekick #f) ;; failed to figure out what this is: (let ((v0-2 0)) ) - - - - diff --git a/test/decompiler/reference/engine/util/sync-info_REF.gc b/test/decompiler/reference/engine/util/sync-info_REF.gc index 875567ce6c..7ae0c7a770 100644 --- a/test/decompiler/reference/engine/util/sync-info_REF.gc +++ b/test/decompiler/reference/engine/util/sync-info_REF.gc @@ -521,14 +521,17 @@ (defmethod dummy-12 delayed-rand-vector ((obj delayed-rand-vector)) (rlet ((vf0 :class vf)) (.lvf vf0 (new 'static 'vector :x 0.0 :y 0.0 :z 0.0 :w 1.0)) - (if - (>= - (the-as int (- (-> *display* base-frame-counter) (-> obj start-time))) - (-> obj timer) + (cond + ((>= + (the-as int (- (-> *display* base-frame-counter) (-> obj start-time))) + (-> obj timer) + ) + ((method-of-type delayed-rand-vector dummy-10) obj) ) - ((method-of-type delayed-rand-vector dummy-10) obj) - (let ((v1-5 (-> obj value))) - (.svf (&-> v1-5 quad) vf0) + (else + (let ((v1-5 (-> obj value))) + (.svf (&-> v1-5 quad) vf0) + ) ) ) (-> obj value) @@ -649,7 +652,7 @@ (.svf (&-> a1-4 quad) vf6) ) (let ((f0-2 (vector-length (-> obj vel)))) - (if (< (-> obj max-vel) f0-2) + (when (< (-> obj max-vel) f0-2) (let ((v1-6 (-> obj vel))) (let ((a0-8 (-> obj vel)) (f0-3 (/ (-> obj max-vel) f0-2)) @@ -704,7 +707,3 @@ (-> obj value) ) ) - - - - diff --git a/test/decompiler/reference/kernel/gcommon_REF.gc b/test/decompiler/reference/kernel/gcommon_REF.gc index f8227dd735..9bd6ac91ef 100644 --- a/test/decompiler/reference/kernel/gcommon_REF.gc +++ b/test/decompiler/reference/kernel/gcommon_REF.gc @@ -625,108 +625,110 @@ ;; Used lq/sq (defmethod print array ((obj array)) (format #t "#(") - (if (type-type? (-> obj content-type) integer) - (let ((content-type-sym (-> obj content-type symbol))) - (cond - ((= content-type-sym 'int32) - (dotimes (s5-0 (-> obj length)) - (format #t (if (zero? s5-0) - "~D" - " ~D" - ) - (-> (the-as (array int32) obj) s5-0) - ) - ) - ) - ((= content-type-sym 'uint32) - (dotimes (s5-1 (-> obj length)) - (format #t (if (zero? s5-1) - "~D" - " ~D" - ) - (-> (the-as (array uint32) obj) s5-1) - ) - ) - ) - ((= content-type-sym 'int64) - (dotimes (s5-2 (-> obj length)) - (format #t (if (zero? s5-2) - "~D" - " ~D" - ) - (-> (the-as (array int64) obj) s5-2) - ) - ) - ) - ((= content-type-sym 'uint64) - (dotimes (s5-3 (-> obj length)) - (format #t (if (zero? s5-3) - "#x~X" - " #x~X" - ) - (-> (the-as (array uint64) obj) s5-3) - ) - ) - ) - ((= content-type-sym 'int8) - (dotimes (s5-4 (-> obj length)) - (format #t (if (zero? s5-4) - "~D" - " ~D" - ) - (-> (the-as (array int8) obj) s5-4) - ) - ) - ) - ((= content-type-sym 'uint8) - (dotimes (s5-5 (-> obj length)) - (format #t (if (zero? s5-5) - "~D" - " ~D" - ) - (-> (the-as (array uint8) obj) s5-5) - ) - ) - ) - ((= content-type-sym 'int16) - (dotimes (s5-6 (-> obj length)) - (format #t (if (zero? s5-6) - "~D" - " ~D" - ) - (-> (the-as (array int16) obj) s5-6) - ) - ) - ) - ((= content-type-sym 'uint16) - (dotimes (s5-7 (-> obj length)) - (format #t (if (zero? s5-7) - "~D" - " ~D" - ) - (-> (the-as (array uint16) obj) s5-7) - ) - ) - ) - (else - (cond - ((or (= content-type-sym 'uint128) (= content-type-sym 'int128)) - (dotimes (s5-8 (-> obj length)) - (format #t (if (zero? s5-8) - "#x~X" - " #x~X" - ) - (-> (the-as (array uint128) obj) s5-8) - ) + (cond + ((type-type? (-> obj content-type) integer) + (let ((content-type-sym (-> obj content-type symbol))) + (cond + ((= content-type-sym 'int32) + (dotimes (s5-0 (-> obj length)) + (format #t (if (zero? s5-0) + "~D" + " ~D" + ) + (-> (the-as (array int32) obj) s5-0) ) ) - (else - (dotimes (s5-9 (-> obj length)) - (format #t (if (zero? s5-9) - "~D" - " ~D" - ) - (-> (the-as (array int32) obj) s5-9) + ) + ((= content-type-sym 'uint32) + (dotimes (s5-1 (-> obj length)) + (format #t (if (zero? s5-1) + "~D" + " ~D" + ) + (-> (the-as (array uint32) obj) s5-1) + ) + ) + ) + ((= content-type-sym 'int64) + (dotimes (s5-2 (-> obj length)) + (format #t (if (zero? s5-2) + "~D" + " ~D" + ) + (-> (the-as (array int64) obj) s5-2) + ) + ) + ) + ((= content-type-sym 'uint64) + (dotimes (s5-3 (-> obj length)) + (format #t (if (zero? s5-3) + "#x~X" + " #x~X" + ) + (-> (the-as (array uint64) obj) s5-3) + ) + ) + ) + ((= content-type-sym 'int8) + (dotimes (s5-4 (-> obj length)) + (format #t (if (zero? s5-4) + "~D" + " ~D" + ) + (-> (the-as (array int8) obj) s5-4) + ) + ) + ) + ((= content-type-sym 'uint8) + (dotimes (s5-5 (-> obj length)) + (format #t (if (zero? s5-5) + "~D" + " ~D" + ) + (-> (the-as (array uint8) obj) s5-5) + ) + ) + ) + ((= content-type-sym 'int16) + (dotimes (s5-6 (-> obj length)) + (format #t (if (zero? s5-6) + "~D" + " ~D" + ) + (-> (the-as (array int16) obj) s5-6) + ) + ) + ) + ((= content-type-sym 'uint16) + (dotimes (s5-7 (-> obj length)) + (format #t (if (zero? s5-7) + "~D" + " ~D" + ) + (-> (the-as (array uint16) obj) s5-7) + ) + ) + ) + (else + (cond + ((or (= content-type-sym 'uint128) (= content-type-sym 'int128)) + (dotimes (s5-8 (-> obj length)) + (format #t (if (zero? s5-8) + "#x~X" + " #x~X" + ) + (-> (the-as (array uint128) obj) s5-8) + ) + ) + ) + (else + (dotimes (s5-9 (-> obj length)) + (format #t (if (zero? s5-9) + "~D" + " ~D" + ) + (-> (the-as (array int32) obj) s5-9) + ) ) ) ) @@ -734,20 +736,22 @@ ) ) ) - (cond - ((= (-> obj content-type) float) - (dotimes (s5-10 (-> obj length)) - (if (zero? s5-10) - (format #t "~f" (-> (the-as (array float) obj) s5-10)) - (format #t " ~f" (-> (the-as (array float) obj) s5-10)) + (else + (cond + ((= (-> obj content-type) float) + (dotimes (s5-10 (-> obj length)) + (if (zero? s5-10) + (format #t "~f" (-> (the-as (array float) obj) s5-10)) + (format #t " ~f" (-> (the-as (array float) obj) s5-10)) + ) ) ) - ) - (else - (dotimes (s5-11 (-> obj length)) - (if (zero? s5-11) - (format #t "~A" (-> (the-as (array basic) obj) s5-11)) - (format #t " ~A" (-> (the-as (array basic) obj) s5-11)) + (else + (dotimes (s5-11 (-> obj length)) + (if (zero? s5-11) + (format #t "~A" (-> (the-as (array basic) obj) s5-11)) + (format #t " ~A" (-> (the-as (array basic) obj) s5-11)) + ) ) ) ) @@ -765,79 +769,83 @@ (format #t "~Tlength: ~D~%" (-> obj length)) (format #t "~Tcontent-type: ~A~%" (-> obj content-type)) (format #t "~Tdata[~D]: @ #x~X~%" (-> obj allocated-length) (-> obj data)) - (if (type-type? (-> obj content-type) integer) - (let ((content-type-sym (-> obj content-type symbol))) - (cond - ((= content-type-sym 'int32) - (dotimes (s5-0 (-> obj length)) - (format #t "~T [~D] ~D~%" s5-0 (-> (the-as (array int32) obj) s5-0)) + (cond + ((type-type? (-> obj content-type) integer) + (let ((content-type-sym (-> obj content-type symbol))) + (cond + ((= content-type-sym 'int32) + (dotimes (s5-0 (-> obj length)) + (format #t "~T [~D] ~D~%" s5-0 (-> (the-as (array int32) obj) s5-0)) + ) ) - ) - ((= content-type-sym 'uint32) - (dotimes (s5-1 (-> obj length)) - (format #t "~T [~D] ~D~%" s5-1 (-> (the-as (array uint32) obj) s5-1)) + ((= content-type-sym 'uint32) + (dotimes (s5-1 (-> obj length)) + (format #t "~T [~D] ~D~%" s5-1 (-> (the-as (array uint32) obj) s5-1)) + ) ) - ) - ((= content-type-sym 'int64) - (dotimes (s5-2 (-> obj length)) - (format #t "~T [~D] ~D~%" s5-2 (-> (the-as (array int64) obj) s5-2)) + ((= content-type-sym 'int64) + (dotimes (s5-2 (-> obj length)) + (format #t "~T [~D] ~D~%" s5-2 (-> (the-as (array int64) obj) s5-2)) + ) ) - ) - ((= content-type-sym 'uint64) - (dotimes (s5-3 (-> obj length)) - (format #t "~T [~D] #x~X~%" s5-3 (-> (the-as (array uint64) obj) s5-3)) + ((= content-type-sym 'uint64) + (dotimes (s5-3 (-> obj length)) + (format #t "~T [~D] #x~X~%" s5-3 (-> (the-as (array uint64) obj) s5-3)) + ) ) - ) - ((= content-type-sym 'int8) - (dotimes (s5-4 (-> obj length)) - (format #t "~T [~D] ~D~%" s5-4 (-> (the-as (array int8) obj) s5-4)) + ((= content-type-sym 'int8) + (dotimes (s5-4 (-> obj length)) + (format #t "~T [~D] ~D~%" s5-4 (-> (the-as (array int8) obj) s5-4)) + ) ) - ) - ((= content-type-sym 'uint8) - (dotimes (s5-5 (-> obj length)) - (format #t "~T [~D] ~D~%" s5-5 (-> (the-as (array int8) obj) s5-5)) + ((= content-type-sym 'uint8) + (dotimes (s5-5 (-> obj length)) + (format #t "~T [~D] ~D~%" s5-5 (-> (the-as (array int8) obj) s5-5)) + ) ) - ) - ((= content-type-sym 'int16) - (dotimes (s5-6 (-> obj length)) - (format #t "~T [~D] ~D~%" s5-6 (-> (the-as (array int16) obj) s5-6)) + ((= content-type-sym 'int16) + (dotimes (s5-6 (-> obj length)) + (format #t "~T [~D] ~D~%" s5-6 (-> (the-as (array int16) obj) s5-6)) + ) ) - ) - ((= content-type-sym 'uint16) - (dotimes (s5-7 (-> obj length)) - (format #t "~T [~D] ~D~%" s5-7 (-> (the-as (array uint16) obj) s5-7)) + ((= content-type-sym 'uint16) + (dotimes (s5-7 (-> obj length)) + (format #t "~T [~D] ~D~%" s5-7 (-> (the-as (array uint16) obj) s5-7)) + ) ) - ) - (else - (cond - ((or (= content-type-sym 'int128) (= content-type-sym 'uint128)) - (dotimes (s5-8 (-> obj length)) - (format - #t - "~T [~D] #x~X~%" - s5-8 - (-> (the-as (array uint128) obj) s5-8) + (else + (cond + ((or (= content-type-sym 'int128) (= content-type-sym 'uint128)) + (dotimes (s5-8 (-> obj length)) + (format + #t + "~T [~D] #x~X~%" + s5-8 + (-> (the-as (array uint128) obj) s5-8) + ) ) ) - ) - (else - (dotimes (s5-9 (-> obj length)) - (format #t "~T [~D] ~D~%" s5-9 (-> (the-as (array int32) obj) s5-9)) + (else + (dotimes (s5-9 (-> obj length)) + (format #t "~T [~D] ~D~%" s5-9 (-> (the-as (array int32) obj) s5-9)) + ) ) ) ) ) ) ) - (cond - ((= (-> obj content-type) float) - (dotimes (s5-10 (-> obj length)) - (format #t "~T [~D] ~f~%" s5-10 (-> (the-as (array float) obj) s5-10)) + (else + (cond + ((= (-> obj content-type) float) + (dotimes (s5-10 (-> obj length)) + (format #t "~T [~D] ~f~%" s5-10 (-> (the-as (array float) obj) s5-10)) + ) ) - ) - (else - (dotimes (s5-11 (-> obj length)) - (format #t "~T [~D] ~A~%" s5-11 (-> (the-as (array basic) obj) s5-11)) + (else + (dotimes (s5-11 (-> obj length)) + (format #t "~T [~D] ~A~%" s5-11 (-> (the-as (array basic) obj) s5-11)) + ) ) ) ) @@ -1291,4 +1299,3 @@ ;; failed to figure out what this is: (let ((v0-3 0)) ) - diff --git a/test/decompiler/reference/kernel/gkernel-h_REF.gc b/test/decompiler/reference/kernel/gkernel-h_REF.gc index ec5e7d3293..8e200812f7 100644 --- a/test/decompiler/reference/kernel/gkernel-h_REF.gc +++ b/test/decompiler/reference/kernel/gkernel-h_REF.gc @@ -289,26 +289,30 @@ ;; WARN: Unsupported inline assembly instruction kind - [sllv a2, v1, r0] (defmethod print handle ((obj handle)) (local-vars (r0-0 none) (a2-0 int) (a2-2 (pointer process)) (s7-0 none)) - (if (nonzero? obj) - (let ((t9-0 format) - (a0-1 #t) - (a1-0 "#") - (v1-0 obj) - ) - (.subu a2-0 v1-0 s7-0) - (t9-0 a0-1 a1-0 (and (nonzero? a2-0) (begin - (.sllv a2-2 v1-0 r0-0) - (let ((a3-0 (-> a2-2 0))) - (if (= (-> v1-0 pid) (-> a3-0 pid)) - a3-0 + (cond + ((nonzero? obj) + (let ((t9-0 format) + (a0-1 #t) + (a1-0 "#") + (v1-0 obj) + ) + (.subu a2-0 v1-0 s7-0) + (t9-0 a0-1 a1-0 (and (nonzero? a2-0) (begin + (.sllv a2-2 v1-0 r0-0) + (let ((a3-0 (-> a2-2 0))) + (if (= (-> v1-0 pid) (-> a3-0 pid)) + a3-0 + ) ) ) - ) - ) - (-> obj pid) + ) + (-> obj pid) + ) ) ) - (format #t "#") + (else + (format #t "#") + ) ) obj ) @@ -370,5 +374,3 @@ ;; failed to figure out what this is: (let ((v0-11 0)) ) - - diff --git a/test/decompiler/reference/kernel/gkernel_REF.gc b/test/decompiler/reference/kernel/gkernel_REF.gc index f52cea62a2..5de7134b29 100644 --- a/test/decompiler/reference/kernel/gkernel_REF.gc +++ b/test/decompiler/reference/kernel/gkernel_REF.gc @@ -157,30 +157,34 @@ (arg2 int) (arg3 pointer) ) - (let ((obj (the-as cpu-thread (if (-> arg0 top-thread) - (&+ arg3 -7164) - (let - ((v1-2 - (logand - -16 - (the-as int (&+ (-> arg0 heap-cur) 15)) - ) - ) - ) - (set! - (-> arg0 heap-cur) - (the-as - pointer - (+ - (+ - v1-2 - (the-as int (-> type-to-make size)) + (let ((obj (the-as cpu-thread (cond + ((-> arg0 top-thread) + (&+ arg3 -7164) + ) + (else + (let + ((v1-2 + (logand + -16 + (the-as int (&+ (-> arg0 heap-cur) 15)) ) - arg2 ) ) + (set! + (-> arg0 heap-cur) + (the-as + pointer + (+ + (+ + v1-2 + (the-as int (-> type-to-make size)) + ) + arg2 + ) + ) + ) + (+ v1-2 4) ) - (+ v1-2 4) ) ) ) @@ -209,7 +213,7 @@ ;; definition for function remove-exit (defun remove-exit () (local-vars (pp process)) - (if (-> pp stack-frame-top) + (when (-> pp stack-frame-top) (let ((v0-0 (-> pp stack-frame-top next))) (set! (-> pp stack-frame-top) v0-0) v0-0 @@ -591,7 +595,7 @@ (!= obj *debug-dead-pool*) ) (set! s4-0 (get-process *debug-dead-pool* arg0 arg1)) - (if (the-as process s4-0) + (when (the-as process s4-0) (let ((t9-1 format) (a0-2 0) (a1-2 @@ -720,26 +724,30 @@ gap-size dead-pool-heap ((obj dead-pool-heap) (arg0 dead-pool-heap-rec)) - (if (-> arg0 process) - (let - ((v1-3 - (&+ - (&+ (the-as pointer (-> arg0 process)) (-> process size)) - (-> arg0 process allocated-length) + (cond + ((-> arg0 process) + (let + ((v1-3 + (&+ + (&+ (the-as pointer (-> arg0 process)) (-> process size)) + (-> arg0 process allocated-length) + ) ) ) - ) - (if (-> arg0 next) - (&- (the-as pointer (-> arg0 next process)) (the-as uint v1-3)) - (&- (-> obj heap top) (the-as uint (&+ v1-3 4))) + (if (-> arg0 next) + (&- (the-as pointer (-> arg0 next process)) (the-as uint v1-3)) + (&- (-> obj heap top) (the-as uint (&+ v1-3 4))) + ) ) ) - (if (-> arg0 next) - (&- - (the-as pointer (-> arg0 next process)) - (the-as uint (&+ (-> obj heap base) 4)) + (else + (if (-> arg0 next) + (&- + (the-as pointer (-> arg0 next process)) + (the-as uint (&+ (-> obj heap base) 4)) + ) + (&- (-> obj heap top) (the-as uint (-> obj heap base))) ) - (&- (-> obj heap top) (the-as uint (-> obj heap base))) ) ) ) @@ -973,7 +981,7 @@ ) (when (= (-> obj first-shrink) s5-1) (set! (-> obj first-shrink) (the-as dead-pool-heap-rec (-> s5-1 1))) - (when (not (-> obj first-shrink process)) + (if (not (-> obj first-shrink process)) (set! (-> obj first-shrink) #f) ) ) @@ -993,7 +1001,7 @@ ;; definition for method 17 of type dead-pool-heap (defmethod shrink-heap dead-pool-heap ((obj dead-pool-heap) (arg0 process)) - (if arg0 + (when arg0 (let ((s5-0 (-> arg0 ppointer))) (when (not @@ -1058,7 +1066,7 @@ ) ) (let ((s4-1 (-> obj first-gap))) - (if (-> s4-1 next) + (when (-> s4-1 next) (let ((s3-0 (-> s4-1 next process)) (s2-0 (gap-size obj s4-1)) ) @@ -1101,7 +1109,7 @@ ) (when (= (-> obj first-shrink) s4-0) (set! (-> obj first-shrink) (-> s4-0 prev)) - (when (not (-> obj first-shrink process)) + (if (not (-> obj first-shrink process)) (set! (-> obj first-shrink) #f) ) ) @@ -1323,7 +1331,7 @@ (defun search-process-tree ((arg0 process-tree) (arg1 (function process-tree object))) - (if (zero? (logand (-> arg0 mask) (process-mask process-tree))) + (when (zero? (logand (-> arg0 mask) (process-mask process-tree))) (if (arg1 arg0) (return arg0) ) @@ -1562,7 +1570,7 @@ ;; definition for function change-parent (defun change-parent ((arg0 process-tree) (arg1 process-tree)) (let ((a2-0 (-> arg0 parent))) - (if a2-0 + (when a2-0 (let* ((v1-2 (-> a2-0 0 child)) (a3-0 v1-2) ) @@ -1601,9 +1609,9 @@ ;; definition for function change-brother (defun change-brother ((arg0 process-tree) (arg1 process-tree)) - (if (and arg0 (!= (-> arg0 brother) arg1) (!= arg0 arg1)) + (when (and arg0 (!= (-> arg0 brother) arg1) (!= arg0 arg1)) (let ((a2-1 (-> arg0 parent))) - (if a2-1 + (when a2-1 (let ((t0-0 (-> a2-1 0 child)) (a3-1 (the-as (pointer process-tree) #f)) (v1-4 (the-as (pointer process-tree) #f)) @@ -1651,11 +1659,15 @@ ) (set! t0-0 (-> t0-0 0 brother)) ) - (if (or (not a3-1) (not v1-4)) - (return 0) - (if (= a3-1 a2-1) - (set! (-> a3-1 4) (the-as process-tree (-> arg0 brother))) - (set! (-> a3-1 3) (the-as process-tree (-> arg0 brother))) + (cond + ((or (not a3-1) (not v1-4)) + (return 0) + ) + (else + (if (= a3-1 a2-1) + (set! (-> a3-1 4) (the-as process-tree (-> arg0 brother))) + (set! (-> a3-1 3) (the-as process-tree (-> arg0 brother))) + ) ) ) (cond @@ -1741,13 +1753,9 @@ (set! (-> obj event-hook) #f) (set! (-> obj state) #f) (set! (-> obj next-state) #f) - (cond - ((nonzero? (logand (-> arg0 mask) (process-mask process-tree))) - (set! (-> obj entity) #f) - ) - (else - (set! (-> obj entity) (-> (the-as process arg0) entity)) - ) + (if (nonzero? (logand (-> arg0 mask) (process-mask process-tree))) + (set! (-> obj entity) #f) + (set! (-> obj entity) (-> (the-as process arg0) entity)) ) (set! (-> obj connection-list next1) #f) (set! (-> obj connection-list prev1) #f) @@ -2004,4 +2012,3 @@ (set! *default-pool* a0-63) (gp-5 a0-63 *active-pool*) ) - diff --git a/test/decompiler/reference/kernel/gstate_REF.gc b/test/decompiler/reference/kernel/gstate_REF.gc index c8b549775a..cb808a4e44 100644 --- a/test/decompiler/reference/kernel/gstate_REF.gc +++ b/test/decompiler/reference/kernel/gstate_REF.gc @@ -106,13 +106,9 @@ (set! (-> pp mask) (logand (lognot (process-mask going)) (-> pp mask))) (let ((s0-2 (-> pp state))) (set! (-> pp event-hook) (-> s0-2 event)) - (cond - ((-> s0-2 exit) - (set! (-> pp stack-frame-top) s0-2) - ) - (else - (set! (-> pp stack-frame-top) #f) - ) + (if (-> s0-2 exit) + (set! (-> pp stack-frame-top) s0-2) + (set! (-> pp stack-frame-top) #f) ) (set! (-> pp post-hook) (-> s0-2 post)) (set! (-> pp trans-hook) (-> s0-2 trans)) @@ -139,7 +135,7 @@ (else (set! (-> pp trans-hook) #f) (set-to-run (-> pp main-thread) enter-state arg0 arg1 arg2 arg3 arg4 arg5) - (if (!= (-> pp top-thread name) 'post) + (when (!= (-> pp top-thread name) 'post) (let ((v0-2 (the-as object return-from-thread))) (.sw (the-as (function none) v0-2) 0 sp-0) v0-2 @@ -151,7 +147,7 @@ ;; definition for function send-event-function (defun send-event-function ((arg0 process) (arg1 event-message-block)) - (if (and arg0 (!= (-> arg0 type) process-tree) (-> arg0 event-hook)) + (when (and arg0 (!= (-> arg0 type) process-tree) (-> arg0 event-hook)) (let ((gp-0 pp)) (let ((s6-1 arg0)) ) @@ -181,4 +177,3 @@ ) (the-as symbol #f) ) - diff --git a/test/decompiler/reference/kernel/gstring_REF.gc b/test/decompiler/reference/kernel/gstring_REF.gc index 2c5efdcd60..cd56bfb4a8 100644 --- a/test/decompiler/reference/kernel/gstring_REF.gc +++ b/test/decompiler/reference/kernel/gstring_REF.gc @@ -39,30 +39,34 @@ new string ((allocation symbol) (type-to-make type) (arg0 int) (arg1 string)) - (if arg1 - (let* ((s2-1 (max ((method-of-type string length) arg1) arg0)) - (a0-4 - (object-new - allocation - type-to-make - (+ (+ s2-1 1) (the-as int (-> type-to-make size))) + (cond + (arg1 + (let* ((s2-1 (max ((method-of-type string length) arg1) arg0)) + (a0-4 + (object-new + allocation + type-to-make + (+ (+ s2-1 1) (the-as int (-> type-to-make size))) + ) ) ) - ) - (set! (-> a0-4 allocated-length) s2-1) - (copy-string<-string a0-4 arg1) + (set! (-> a0-4 allocated-length) s2-1) + (copy-string<-string a0-4 arg1) + ) ) - (let - ((v0-2 - (object-new - allocation - type-to-make - (+ (+ arg0 1) (the-as int (-> type-to-make size))) + (else + (let + ((v0-2 + (object-new + allocation + type-to-make + (+ (+ arg0 1) (the-as int (-> type-to-make size))) + ) ) ) + (set! (-> v0-2 allocated-length) arg0) + v0-2 ) - (set! (-> v0-2 allocated-length) arg0) - v0-2 ) ) ) @@ -562,35 +566,38 @@ (>= (the-as uint 102) (-> next-char-2 0)) ) ) - (if - (and - (>= (-> next-char-2 0) (the-as uint 65)) - (>= (the-as uint 70) (-> next-char-2 0)) - ) - (set! - result - (the-as - int - (+ (+ (-> 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)) + (cond + ((and + (>= (-> next-char-2 0) (the-as uint 65)) + (>= (the-as uint 70) (-> next-char-2 0)) ) (set! result (the-as int - (+ (+ (-> next-char-2 0) -87) (the-as uint (shl result 4))) + (+ (+ (-> next-char-2 0) -55) (the-as uint (shl result 4))) ) ) - (set! - result - (the-as - int - (+ (+ (-> next-char-2 0) -48) (the-as uint (shl result 4))) + ) + (else + (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))) + ) ) ) ) @@ -687,20 +694,24 @@ (first-flag string) (second-flag string) ) - (if (string-get-arg!! *string-tmp-str* in) - (cond - ((or - (string= *string-tmp-str* first-flag) - (string= *string-tmp-str* second-flag) + (cond + ((string-get-arg!! *string-tmp-str* in) + (cond + ((or + (string= *string-tmp-str* first-flag) + (string= *string-tmp-str* second-flag) + ) + (set! (-> result 0) (string= *string-tmp-str* first-flag)) + #t + ) + (else + #f ) - (set! (-> result 0) (string= *string-tmp-str* first-flag)) - #t - ) - (else - #f ) ) - #f + (else + #f + ) ) ) @@ -718,5 +729,3 @@ ;; definition for symbol *temp-string*, type string (define *temp-string* (new 'global 'string 256 (the-as string #f))) - - diff --git a/test/decompiler/test_FormExpressionBuildLong.cpp b/test/decompiler/test_FormExpressionBuildLong.cpp index 29652a75bf..aa2cacae36 100644 --- a/test/decompiler/test_FormExpressionBuildLong.cpp +++ b/test/decompiler/test_FormExpressionBuildLong.cpp @@ -539,110 +539,110 @@ TEST_F(FormRegressionTest, ExprArrayMethod2) { std::string expected = "(begin\n" " (format #t \"#(\")\n" - " (if\n" - " (type-type? (-> arg0 content-type) integer)\n" - " (let\n" - " ((v1-1 (-> arg0 content-type symbol)))\n" - " (cond\n" - " ((= v1-1 (quote int32))\n" - " (dotimes\n" - " (s5-0 (-> arg0 length))\n" - " (format\n" - " #t\n" - " (if (zero? s5-0) \"~D\" \" ~D\")\n" - " (-> (the-as (array int32) arg0) s5-0)\n" + " (cond\n" + " ((type-type? (-> arg0 content-type) integer)\n" + " (let ((v1-1 (-> arg0 content-type symbol)))\n" + " (cond\n" + " ((= v1-1 (quote int32))\n" + " (dotimes (s5-0 (-> arg0 length))\n" + " (format #t (if (zero? s5-0)\n" + " \"~D\"\n" + " \" ~D\"\n" + " )\n" + " (-> (the-as (array int32) arg0) s5-0)\n" + " )\n" " )\n" " )\n" - " )\n" - " ((= v1-1 (quote uint32))\n" - " (dotimes\n" - " (s5-1 (-> arg0 length))\n" - " (format\n" - " #t\n" - " (if (zero? s5-1) \"~D\" \" ~D\")\n" - " (-> (the-as (array uint32) arg0) s5-1)\n" + " ((= v1-1 (quote uint32))\n" + " (dotimes (s5-1 (-> arg0 length))\n" + " (format #t (if (zero? s5-1)\n" + " \"~D\"\n" + " \" ~D\"\n" + " )\n" + " (-> (the-as (array uint32) arg0) s5-1)\n" + " )\n" " )\n" " )\n" - " )\n" - " ((= v1-1 (quote int64))\n" - " (dotimes\n" - " (s5-2 (-> arg0 length))\n" - " (format\n" - " #t\n" - " (if (zero? s5-2) \"~D\" \" ~D\")\n" - " (-> (the-as (array int64) arg0) s5-2)\n" + " ((= v1-1 (quote int64))\n" + " (dotimes (s5-2 (-> arg0 length))\n" + " (format #t (if (zero? s5-2)\n" + " \"~D\"\n" + " \" ~D\"\n" + " )\n" + " (-> (the-as (array int64) arg0) s5-2)\n" + " )\n" " )\n" " )\n" - " )\n" - " ((= v1-1 (quote uint64))\n" - " (dotimes\n" - " (s5-3 (-> arg0 length))\n" - " (format\n" - " #t\n" - " (if (zero? s5-3) \"#x~X\" \" #x~X\")\n" - " (-> (the-as (array uint64) arg0) s5-3)\n" + " ((= v1-1 (quote uint64))\n" + " (dotimes (s5-3 (-> arg0 length))\n" + " (format #t (if (zero? s5-3)\n" + " \"#x~X\"\n" + " \" #x~X\"\n" + " )\n" + " (-> (the-as (array uint64) arg0) s5-3)\n" + " )\n" " )\n" " )\n" - " )\n" - " ((= v1-1 (quote int8))\n" - " (dotimes\n" - " (s5-4 (-> arg0 length))\n" - " (format\n" - " #t\n" - " (if (zero? s5-4) \"~D\" \" ~D\")\n" - " (-> (the-as (array int8) arg0) s5-4)\n" + " ((= v1-1 (quote int8))\n" + " (dotimes (s5-4 (-> arg0 length))\n" + " (format #t (if (zero? s5-4)\n" + " \"~D\"\n" + " \" ~D\"\n" + " )\n" + " (-> (the-as (array int8) arg0) s5-4)\n" + " )\n" " )\n" " )\n" - " )\n" - " ((= v1-1 (quote uint8))\n" - " (dotimes\n" - " (s5-5 (-> arg0 length))\n" - " (format\n" - " #t\n" - " (if (zero? s5-5) \"~D\" \" ~D\")\n" - " (-> (the-as (array uint8) arg0) s5-5)\n" + " ((= v1-1 (quote uint8))\n" + " (dotimes (s5-5 (-> arg0 length))\n" + " (format #t (if (zero? s5-5)\n" + " \"~D\"\n" + " \" ~D\"\n" + " )\n" + " (-> (the-as (array uint8) arg0) s5-5)\n" + " )\n" " )\n" " )\n" - " )\n" - " ((= v1-1 (quote int16))\n" - " (dotimes\n" - " (s5-6 (-> arg0 length))\n" - " (format\n" - " #t\n" - " (if (zero? s5-6) \"~D\" \" ~D\")\n" - " (-> (the-as (array int16) arg0) s5-6)\n" + " ((= v1-1 (quote int16))\n" + " (dotimes (s5-6 (-> arg0 length))\n" + " (format #t (if (zero? s5-6)\n" + " \"~D\"\n" + " \" ~D\"\n" + " )\n" + " (-> (the-as (array int16) arg0) s5-6)\n" + " )\n" " )\n" " )\n" - " )\n" - " ((= v1-1 (quote uint16))\n" - " (dotimes\n" - " (s5-7 (-> arg0 length))\n" - " (format\n" - " #t\n" - " (if (zero? s5-7) \"~D\" \" ~D\")\n" - " (-> (the-as (array uint16) arg0) s5-7)\n" + " ((= v1-1 (quote uint16))\n" + " (dotimes (s5-7 (-> arg0 length))\n" + " (format #t (if (zero? s5-7)\n" + " \"~D\"\n" + " \" ~D\"\n" + " )\n" + " (-> (the-as (array uint16) arg0) s5-7)\n" + " )\n" " )\n" " )\n" - " )\n" - " (else\n" - " (cond\n" - " ((or (= v1-1 (quote uint128)) (= v1-1 (quote int128)))\n" - " (dotimes (s5-8 (-> arg0 length))\n" - " (format #t (if (zero? s5-8)\n" - " \"#x~X\"\n" - " \" #x~X\"\n" - " )\n" - " (-> (the-as (array uint128) arg0) s5-8)\n" + " (else\n" + " (cond\n" + " ((or (= v1-1 (quote uint128)) (= v1-1 (quote int128)))\n" + " (dotimes (s5-8 (-> arg0 length))\n" + " (format #t (if (zero? s5-8)\n" + " \"#x~X\"\n" + " \" #x~X\"\n" + " )\n" + " (-> (the-as (array uint128) arg0) s5-8)\n" + " )\n" " )\n" " )\n" - " )" - " (else\n" - " (dotimes\n" - " (s5-9 (-> arg0 length))\n" - " (format\n" - " #t\n" - " (if (zero? s5-9) \"~D\" \" ~D\")\n" - " (-> (the-as (array int32) arg0) s5-9)\n" + " (else\n" + " (dotimes (s5-9 (-> arg0 length))\n" + " (format #t (if (zero? s5-9)\n" + " \"~D\"\n" + " \" ~D\"\n" + " )\n" + " (-> (the-as (array int32) arg0) s5-9)\n" + " )\n" " )\n" " )\n" " )\n" @@ -650,24 +650,22 @@ TEST_F(FormRegressionTest, ExprArrayMethod2) { " )\n" " )\n" " )\n" - " (cond\n" - " ((= (-> arg0 content-type) float)\n" - " (dotimes\n" - " (s5-10 (-> arg0 length))\n" - " (if\n" - " (zero? s5-10)\n" - " (format #t \"~f\" (-> (the-as (array float) arg0) s5-10))\n" - " (format #t \" ~f\" (-> (the-as (array float) arg0) s5-10))\n" + " (else\n" + " (cond\n" + " ((= (-> arg0 content-type) float)\n" + " (dotimes (s5-10 (-> arg0 length))\n" + " (if (zero? s5-10)\n" + " (format #t \"~f\" (-> (the-as (array float) arg0) s5-10))\n" + " (format #t \" ~f\" (-> (the-as (array float) arg0) s5-10))\n" + " )\n" " )\n" " )\n" - " )\n" - " (else\n" - " (dotimes\n" - " (s5-11 (-> arg0 length))\n" - " (if\n" - " (zero? s5-11)\n" - " (format #t \"~A\" (-> (the-as (array basic) arg0) s5-11))\n" - " (format #t \" ~A\" (-> (the-as (array basic) arg0) s5-11))\n" + " (else\n" + " (dotimes (s5-11 (-> arg0 length))\n" + " (if (zero? s5-11)\n" + " (format #t \"~A\" (-> (the-as (array basic) arg0) s5-11))\n" + " (format #t \" ~A\" (-> (the-as (array basic) arg0) s5-11))\n" + " )\n" " )\n" " )\n" " )\n" @@ -1164,92 +1162,88 @@ TEST_F(FormRegressionTest, ExprArrayMethod3) { " (format #t \"~Tlength: ~D~%\" (-> arg0 length))\n" " (format #t \" ~Tcontent-type: ~A~%\" (-> arg0 content-type))\n" " (format #t \"~Tdata[~D]: @ #x~X~%\" (-> arg0 allocated-length) (-> arg0 data))\n" - " (if\n" - " (type-type? (-> arg0 content-type) integer)\n" - " (let\n" - " ((v1-1 (-> arg0 content-type symbol)))\n" - " (cond\n" - " ((= v1-1 (quote int32))\n" - " (dotimes\n" - " (s5-0 (-> arg0 length))\n" - " (format #t \"~T [~D] ~D~%\" s5-0 (-> (the-as (array int32) arg0) s5-0))\n" + " (cond\n" + " ((type-type? (-> arg0 content-type) integer)\n" + " (let ((v1-1 (-> arg0 content-type symbol)))\n" + " (cond\n" + " ((= v1-1 (quote int32))\n" + " (dotimes (s5-0 (-> arg0 length))\n" + " (format #t \"~T [~D] ~D~%\" s5-0 (-> (the-as (array int32) arg0) s5-0))\n" + " )\n" " )\n" - " )\n" - " ((= v1-1 (quote uint32))\n" - " (dotimes\n" - " (s5-1 (-> arg0 length))\n" - " (format #t \"~T [~D] ~D~%\" s5-1 (-> (the-as (array uint32) arg0) s5-1))\n" + " ((= v1-1 (quote uint32))\n" + " (dotimes (s5-1 (-> arg0 length))\n" + " (format #t \"~T [~D] ~D~%\" s5-1 (-> (the-as (array uint32) arg0) s5-1))\n" + " )\n" " )\n" - " )\n" - " ((= v1-1 (quote int64))\n" - " (dotimes\n" - " (s5-2 (-> arg0 length))\n" - " (format #t \"~T [~D] ~D~%\" s5-2 (-> (the-as (array int64) arg0) s5-2))\n" + " ((= v1-1 (quote int64))\n" + " (dotimes (s5-2 (-> arg0 length))\n" + " (format #t \"~T [~D] ~D~%\" s5-2 (-> (the-as (array int64) arg0) s5-2))\n" + " )\n" " )\n" - " )\n" - " ((= v1-1 (quote uint64))\n" - " (dotimes\n" - " (s5-3 (-> arg0 length))\n" - " (format #t \"~T [~D] #x~X~%\" s5-3 (-> (the-as (array uint64) arg0) s5-3))\n" + " ((= v1-1 (quote uint64))\n" + " (dotimes (s5-3 (-> arg0 length))\n" + " (format\n" + " #t\n" + " \"~T [~D] #x~X~%\"\n" + " s5-3\n" + " (-> (the-as (array uint64) arg0) s5-3)\n" + " )\n" + " )\n" " )\n" - " )\n" - " ((= v1-1 (quote int8))\n" - " (dotimes\n" - " (s5-4 (-> arg0 length))\n" - " (format #t \"~T [~D] ~D~%\" s5-4 (-> (the-as (array int8) arg0) s5-4))\n" + " ((= v1-1 (quote int8))\n" + " (dotimes (s5-4 (-> arg0 length))\n" + " (format #t \"~T [~D] ~D~%\" s5-4 (-> (the-as (array int8) arg0) s5-4))\n" + " )\n" " )\n" - " )\n" - " ((= v1-1 (quote uint8))\n" - " (dotimes\n" - " (s5-5 (-> arg0 length))\n" - " (format #t \"~T [~D] ~D~%\" s5-5 (-> (the-as (array int8) arg0) s5-5))\n" + " ((= v1-1 (quote uint8))\n" + " (dotimes (s5-5 (-> arg0 length))\n" + " (format #t \"~T [~D] ~D~%\" s5-5 (-> (the-as (array int8) arg0) s5-5))\n" + " )\n" " )\n" - " )\n" - " ((= v1-1 (quote int16))\n" - " (dotimes\n" - " (s5-6 (-> arg0 length))\n" - " (format #t \"~T [~D] ~D~%\" s5-6 (-> (the-as (array int16) arg0) s5-6))\n" + " ((= v1-1 (quote int16))\n" + " (dotimes (s5-6 (-> arg0 length))\n" + " (format #t \"~T [~D] ~D~%\" s5-6 (-> (the-as (array int16) arg0) s5-6))\n" + " )\n" " )\n" - " )\n" - " ((= v1-1 (quote uint16))\n" - " (dotimes\n" - " (s5-7 (-> arg0 length))\n" - " (format #t \"~T [~D] ~D~%\" s5-7 (-> (the-as (array uint16) arg0) s5-7))\n" + " ((= v1-1 (quote uint16))\n" + " (dotimes (s5-7 (-> arg0 length))\n" + " (format #t \"~T [~D] ~D~%\" s5-7 (-> (the-as (array uint16) arg0) s5-7))\n" + " )\n" " )\n" - " )\n" - " (else\n" - " (cond\n" - " ((or (= v1-1 (quote int128)) (= v1-1 (quote uint128)))\n" - " (dotimes (s5-8 (-> arg0 length))\n" - " (format\n" - " #t\n" - " \"~T [~D] #x~X~%\"\n" - " s5-8\n" - " (-> (the-as (array uint128) arg0) s5-8)\n" + " (else\n" + " (cond\n" + " ((or (= v1-1 (quote int128)) (= v1-1 (quote uint128)))\n" + " (dotimes (s5-8 (-> arg0 length))\n" + " (format\n" + " #t\n" + " \"~T [~D] #x~X~%\"\n" + " s5-8\n" + " (-> (the-as (array uint128) arg0) s5-8)\n" + " )\n" " )\n" " )\n" - " )" - " (else\n" - " (dotimes\n" - " (s5-9 (-> arg0 length))\n" - " (format #t \"~T [~D] ~D~%\" s5-9 (-> (the-as (array int32) arg0) s5-9))\n" + " (else\n" + " (dotimes (s5-9 (-> arg0 length))\n" + " (format #t \"~T [~D] ~D~%\" s5-9 (-> (the-as (array int32) arg0) s5-9))\n" + " )\n" " )\n" " )\n" " )\n" " )\n" " )\n" " )\n" - " (cond\n" - " ((= (-> arg0 content-type) float)\n" - " (dotimes\n" - " (s5-10 (-> arg0 length))\n" - " (format #t \"~T [~D] ~f~%\" s5-10 (-> (the-as (array float) arg0) s5-10))\n" + " (else\n" + " (cond\n" + " ((= (-> arg0 content-type) float)\n" + " (dotimes (s5-10 (-> arg0 length))\n" + " (format #t \"~T [~D] ~f~%\" s5-10 (-> (the-as (array float) arg0) s5-10))\n" + " )\n" " )\n" - " )\n" - " (else\n" - " (dotimes\n" - " (s5-11 (-> arg0 length))\n" - " (format #t \"~T [~D] ~A~%\" s5-11 (-> (the-as (array basic) arg0) s5-11))\n" + " (else\n" + " (dotimes (s5-11 (-> arg0 length))\n" + " (format #t \"~T [~D] ~A~%\" s5-11 (-> (the-as (array basic) arg0) s5-11))\n" + " )\n" " )\n" " )\n" " )\n" @@ -2373,27 +2367,30 @@ TEST_F(FormRegressionTest, ExprStringToInt) { " (>= (the-as uint 102) (-> a0-3 0))\n" " )\n" " )\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 97))\n" - " (>= (the-as uint 102) (-> a0-3 0))\n" + " (cond\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) -87) (the-as uint (shl v0-0 4))))\n" + " (the-as int (+ (+ (-> a0-3 0) -55) (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" + " (else\n" + " (if\n" + " (and\n" + " (>= (-> a0-3 0) (the-as uint 97))\n" + " (>= (the-as uint 102) (-> a0-3 0))\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" " )\n" diff --git a/test/decompiler/test_gkernel_decomp.cpp b/test/decompiler/test_gkernel_decomp.cpp index a6bb328330..8b2773db42 100644 --- a/test/decompiler/test_gkernel_decomp.cpp +++ b/test/decompiler/test_gkernel_decomp.cpp @@ -335,24 +335,28 @@ TEST_F(FormRegressionTest, ExprMethod0Thread) { " daddu sp, sp, r0"; std::string type = "(function symbol type process symbol int pointer cpu-thread)"; std::string expected = - "(let ((obj (the-as cpu-thread (if (-> arg2 top-thread)\n" - " (&+ arg5 -7164)\n" - " (let\n" - " ((v1-2\n" - " (logand\n" - " -16\n" - " (the-as int (&+ (-> arg2 heap-cur) 15))\n" + "(let ((obj (the-as cpu-thread (cond\n" + " ((-> arg2 top-thread)\n" + " (&+ arg5 -7164)\n" + " )\n" + " (else\n" + " (let\n" + " ((v1-2\n" + " (logand\n" + " -16\n" + " (the-as int (&+ (-> arg2 heap-cur) 15))\n" + " )\n" " )\n" " )\n" - " )\n" - " (set!\n" - " (-> arg2 heap-cur)\n" - " (the-as\n" - " pointer\n" - " (+ (+ v1-2 (the-as int (-> arg1 size))) arg4)\n" + " (set!\n" + " (-> arg2 heap-cur)\n" + " (the-as\n" + " pointer\n" + " (+ (+ v1-2 (the-as int (-> arg1 size))) arg4)\n" + " )\n" " )\n" + " (+ v1-2 4)\n" " )\n" - " (+ v1-2 4)\n" " )\n" " )\n" " )\n" @@ -407,10 +411,8 @@ TEST_F(FormRegressionTest, RemoveExit) { " daddu sp, sp, r0"; std::string type = "(function stack-frame)"; std::string expected = - "(if\n" - " (-> pp stack-frame-top)\n" - " (let\n" - " ((v0-0 (-> pp stack-frame-top next)))\n" + "(when (-> pp stack-frame-top)\n" + " (let ((v0-0 (-> pp stack-frame-top next)))\n" " (set! (-> pp stack-frame-top) v0-0)\n" " v0-0\n" " )\n" @@ -1079,7 +1081,7 @@ TEST_F(FormRegressionTest, ExprMethod14DeadPool) { " (!= arg0 *debug-dead-pool*)\n" " )\n" " (set! s4-0 (get-process *debug-dead-pool* arg1 arg2))\n" - " (if (the-as process s4-0)\n" + " (when (the-as process s4-0)\n" " (let ((t9-1 format)\n" " (a0-2 0)\n" " (a1-2\n" @@ -1402,26 +1404,30 @@ TEST_F(FormRegressionTest, ExprMethod21DeadPoolHeap) { " daddu sp, sp, r0"; std::string type = "(function dead-pool-heap dead-pool-heap-rec int)"; std::string expected = - "(if (-> arg1 process)\n" - " (let\n" - " ((v1-3\n" - " (&+\n" - " (&+ (the-as pointer (-> arg1 process)) (-> process size))\n" - " (-> arg1 process allocated-length)\n" + "(cond\n" + " ((-> arg1 process)\n" + " (let\n" + " ((v1-3\n" + " (&+\n" + " (&+ (the-as pointer (-> arg1 process)) (-> process size))\n" + " (-> arg1 process allocated-length)\n" + " )\n" " )\n" " )\n" - " )\n" - " (if (-> arg1 next)\n" - " (&- (the-as pointer (-> arg1 next process)) (the-as uint v1-3))\n" - " (&- (-> arg0 heap top) (the-as uint (&+ v1-3 4)))\n" + " (if (-> arg1 next)\n" + " (&- (the-as pointer (-> arg1 next process)) (the-as uint v1-3))\n" + " (&- (-> arg0 heap top) (the-as uint (&+ v1-3 4)))\n" + " )\n" " )\n" " )\n" - " (if (-> arg1 next)\n" - " (&-\n" - " (the-as pointer (-> arg1 next process))\n" - " (the-as uint (&+ (-> arg0 heap base) 4))\n" + " (else\n" + " (if (-> arg1 next)\n" + " (&-\n" + " (the-as pointer (-> arg1 next process))\n" + " (the-as uint (&+ (-> arg0 heap base) 4))\n" + " )\n" + " (&- (-> arg0 heap top) (the-as uint (-> arg0 heap base)))\n" " )\n" - " (&- (-> arg0 heap top) (the-as uint (-> arg0 heap base)))\n" " )\n" " )"; test_with_expr(func, type, expected, false, "", {}, @@ -2235,7 +2241,7 @@ TEST_F(FormRegressionTest, ExprMethod15DeadPoolHeap) { " )\n" " (when (= (-> arg0 first-shrink) s5-1)\n" " (set! (-> arg0 first-shrink) (the-as dead-pool-heap-rec (-> s5-1 1)))\n" - " (when (not (-> arg0 first-shrink process))\n" + " (if (not (-> arg0 first-shrink process))\n" " (set! (-> arg0 first-shrink) #f)\n" " )\n" " )\n" @@ -2348,38 +2354,33 @@ TEST_F(FormRegressionTest, ExprMethod17DeadPoolHeap) { // NOTE - this has bad types. std::string expected = "(begin\n" - " (if arg1 (let ((s5-0 (-> arg1 ppointer)))\n" - " (when\n" - " (not\n" - " (or\n" - " (nonzero? (logand (-> arg1 mask) (process-mask heap-shrunk)))\n" - " (and (not (-> arg1 next-state)) (not (-> arg1 state)))\n" - " )\n" - " )\n" - " (set!\n" - " (-> arg1 allocated-length)\n" - " (&- (-> arg1 heap-cur) (the-as uint (-> arg1 stack)))\n" - " )\n" - " (set!\n" - " (-> arg1 heap-top)\n" - " (&-> arg1 stack (-> arg1 allocated-length))\n" - " )\n" - " (if\n" - " (<\n" - " (the-as int arg1)\n" - " (the-as int (gap-location arg0 (-> arg0 first-gap)))\n" - " )\n" - " (set! (-> arg0 first-gap) (find-gap arg0 (the-as dead-pool-heap-rec s5-0)))\n" - " )\n" - " (set! (-> arg1 mask) (logior (-> arg1 mask) (process-mask heap-shrunk)))\n" - " )\n" - " (if (= (-> arg0 first-shrink) s5-0)\n" - " (set!\n" - " (-> arg0 first-shrink)\n" - " (the-as dead-pool-heap-rec (-> s5-0 2))\n" - " )\n" - " )\n" - " )\n" + " (when arg1\n" + " (let ((s5-0 (-> arg1 ppointer)))\n" + " (when\n" + " (not\n" + " (or\n" + " (nonzero? (logand (-> arg1 mask) (process-mask heap-shrunk)))\n" + " (and (not (-> arg1 next-state)) (not (-> arg1 state)))\n" + " )\n" + " )\n" + " (set!\n" + " (-> arg1 allocated-length)\n" + " (&- (-> arg1 heap-cur) (the-as uint (-> arg1 stack)))\n" + " )\n" + " (set! (-> arg1 heap-top) (&-> arg1 stack (-> arg1 allocated-length)))\n" + " (if\n" + " (< (the-as int arg1) (the-as int (gap-location arg0 (-> arg0 first-gap))))\n" + " (set!\n" + " (-> arg0 first-gap)\n" + " (find-gap arg0 (the-as dead-pool-heap-rec s5-0))\n" + " )\n" + " )\n" + " (set! (-> arg1 mask) (logior (-> arg1 mask) (process-mask heap-shrunk)))\n" + " )\n" + " (if (= (-> arg0 first-shrink) s5-0)\n" + " (set! (-> arg0 first-shrink) (the-as dead-pool-heap-rec (-> s5-0 2)))\n" + " )\n" + " )\n" " )\n" " arg0\n" " )"; @@ -2578,46 +2579,49 @@ TEST_F(FormRegressionTest, ExprMethod16DeadPoolHeap) { std::string expected = "(begin\n" - " (let*\n" - " ((s4-0 (memory-free arg0))\n" - " (v1-2 (memory-total arg0))\n" - " (f0-2 (/ (the float s4-0) (the float v1-2)))\n" - " )\n" + " (let* ((s4-0 (memory-free arg0))\n" + " (v1-2 (memory-total arg0))\n" + " (f0-2 (/ (the float s4-0) (the float v1-2)))\n" + " )\n" " (cond\n" " ((< f0-2 (l.f L346))\n" " (set! arg1 1000)\n" - " (if\n" - " (and *debug-segment* (-> *kernel-context* low-memory-message))\n" + " (if (and *debug-segment* (-> *kernel-context* low-memory-message))\n" " (format *stdcon* \"~3LLow Actor Memory~%~0L\" a2-0)\n" " )\n" " )\n" - " ((< f0-2 (l.f L347)) (set! arg1 (shl arg1 2)))\n" - " ((< f0-2 (l.f L348)) (set! arg1 (shl arg1 1)))\n" + " ((< f0-2 (l.f L347))\n" + " (set! arg1 (shl arg1 2))\n" + " )\n" + " ((< f0-2 (l.f L348))\n" + " (set! arg1 (shl arg1 1))\n" + " )\n" " )\n" " )\n" " (set! (-> arg0 compact-count-targ) (the-as uint arg1))\n" " (set! (-> arg0 compact-count) (the-as uint 0))\n" - " (while\n" - " (nonzero? arg1)\n" + " (while (nonzero? arg1)\n" " (+! arg1 -1)\n" - " (let\n" - " ((v1-13 (-> arg0 first-shrink)))\n" - " (when\n" - " (not v1-13)\n" + " (let ((v1-13 (-> arg0 first-shrink)))\n" + " (when (not v1-13)\n" " (set! v1-13 (-> arg0 alive-list next))\n" " (set! (-> arg0 first-shrink) v1-13)\n" " )\n" - " (if v1-13 (shrink-heap arg0 (-> v1-13 process)))\n" + " (if v1-13\n" + " (shrink-heap arg0 (-> v1-13 process))\n" + " )\n" " )\n" - " (let\n" - " ((s4-1 (-> arg0 first-gap)))\n" - " (if\n" - " (-> s4-1 next)\n" - " (let\n" - " ((s3-0 (-> s4-1 next process)) (s2-0 (gap-size arg0 s4-1)))\n" - " (when\n" - " (nonzero? s2-0)\n" - " (when (< s2-0 0) (break!) (let ((v1-20 0))))\n" + " (let ((s4-1 (-> arg0 first-gap)))\n" + " (when (-> s4-1 next)\n" + " (let ((s3-0 (-> s4-1 next process))\n" + " (s2-0 (gap-size arg0 s4-1))\n" + " )\n" + " (when (nonzero? s2-0)\n" + " (when (< s2-0 0)\n" + " (break!)\n" + " (let ((v1-20 0))\n" + " )\n" + " )\n" " (shrink-heap arg0 s3-0)\n" " (relocate s3-0 (- s2-0))\n" " (set! (-> arg0 first-gap) (find-gap arg0 s4-1))\n" @@ -2627,7 +2631,8 @@ TEST_F(FormRegressionTest, ExprMethod16DeadPoolHeap) { " )\n" " )\n" " )\n" - " (let ((v0-8 0)))\n" + " (let ((v0-8 0))\n" + " )\n" " (none)\n" " )"; test_with_expr(func, type, expected, false, "", {{"L296", "~3LLow Actor Memory~%~0L"}}); @@ -2778,13 +2783,10 @@ TEST_F(FormRegressionTest, ExprMethod18DeadPoolHeap) { std::string type = "(function dead-pool-heap int none)"; std::string expected = "(begin\n" - " (while\n" - " (nonzero? arg1)\n" + " (while (nonzero? arg1)\n" " (+! arg1 -1)\n" - " (let\n" - " ((s4-0 (-> arg0 alive-list next)))\n" - " (when\n" - " s4-0\n" + " (let ((s4-0 (-> arg0 alive-list next)))\n" + " (when s4-0\n" " (if\n" " (or\n" " (= (-> arg0 first-gap) s4-0)\n" @@ -2795,27 +2797,24 @@ TEST_F(FormRegressionTest, ExprMethod18DeadPoolHeap) { " )\n" " (set! (-> arg0 first-gap) (-> s4-0 prev))\n" " )\n" - " (when\n" - " (= (-> arg0 first-shrink) s4-0)\n" + " (when (= (-> arg0 first-shrink) s4-0)\n" " (set! (-> arg0 first-shrink) (-> s4-0 prev))\n" - " (when\n" - " (not (-> arg0 first-shrink process))\n" + " (if (not (-> arg0 first-shrink process))\n" " (set! (-> arg0 first-shrink) #f)\n" " )\n" " )\n" " (set! (-> s4-0 prev next) (-> s4-0 next))\n" - " (if\n" - " (-> s4-0 next)\n" + " (if (-> s4-0 next)\n" " (set! (-> s4-0 next prev) (-> s4-0 prev))\n" " (set! (-> arg0 alive-list prev) (-> s4-0 prev))\n" " )\n" - " (let\n" - " ((a1-3 (-> arg0 alive-list prev)))\n" - " (let\n" - " ((v1-19 (-> a1-3 next)))\n" + " (let ((a1-3 (-> arg0 alive-list prev)))\n" + " (let ((v1-19 (-> a1-3 next)))\n" " (set! (-> a1-3 next) s4-0)\n" " (set! (-> s4-0 next) v1-19)\n" - " (if v1-19 (set! (-> v1-19 prev) s4-0))\n" + " (if v1-19\n" + " (set! (-> v1-19 prev) s4-0)\n" + " )\n" " )\n" " (set! (-> s4-0 prev) a1-3)\n" " (set! (-> arg0 alive-list prev) s4-0)\n" @@ -2830,7 +2829,8 @@ TEST_F(FormRegressionTest, ExprMethod18DeadPoolHeap) { " )\n" " )\n" " )\n" - " (let ((v0-4 0)))\n" + " (let ((v0-4 0))\n" + " )\n" " (none)\n" " )"; test_with_expr(func, type, expected); diff --git a/test/offline/offline_test_main.cpp b/test/offline/offline_test_main.cpp index f7f37ff39a..799bd729ef 100644 --- a/test/offline/offline_test_main.cpp +++ b/test/offline/offline_test_main.cpp @@ -470,8 +470,8 @@ TEST_F(OfflineDecompilation, Reference) { if (g_dump_mode) { if (reference != src) { - fmt::print("----------------- {}\n", file.first); - fmt::print("{}\n", src); + file_util::create_dir_if_needed("./failures"); + file_util::write_text_file("./failures/" + file.first + "_REF.gc", src); EXPECT_TRUE(false); } } else {