From a51536de8d9ca36b4bdfe3fa604fc485d8ee84d1 Mon Sep 17 00:00:00 2001 From: water111 <48171810+water111@users.noreply.github.com> Date: Fri, 29 Apr 2022 23:44:53 -0400 Subject: [PATCH] [graphics] tie generic (#1341) * [gtie] tie inst and proto functions * first chain input to generic ee looks good * m * works * ugh * add tie generic * rm debug print * rm generic ties from fr3 --- common/custom_data/Tfrag3Data.h | 2 +- common/dma/dma.h | 5 + decompiler/analysis/mips2c.cpp | 1 + decompiler/config/all-types.gc | 14 +- .../config/jak1_ntsc_black_label/hacks.jsonc | 20 +- .../jak1_ntsc_black_label/type_casts.jsonc | 5 + decompiler/level_extractor/extract_tie.cpp | 4 + game/CMakeLists.txt | 23 +- game/common/vu.h | 8 + .../foreground/Generic2_Build.cpp | 23 +- .../opengl_renderer/shaders/collision.vert | 2 +- game/kernel/kdgo.cpp | 5 +- game/mips2c/functions/generic_effect2.cpp | 1016 ++++++++ game/mips2c/functions/generic_tie.cpp | 2201 +++++++++++++++++ game/mips2c/functions/tie_methods.cpp | 1963 +++++++++++++++ game/mips2c/mips2c_private.h | 55 + game/mips2c/mips2c_table.cpp | 31 +- goal_src/engine/gfx/background.gc | 3 +- goal_src/engine/gfx/generic/generic-effect.gc | 40 +- goal_src/engine/gfx/generic/generic-h.gc | 2 +- goal_src/engine/gfx/generic/generic-tie.gc | 106 + goal_src/engine/gfx/tie/tie-methods.gc | 18 +- goal_src/engine/level/level.gc | 10 + goal_src/kernel/gkernel.gc | 4 +- .../engine/gfx/generic/generic-h_REF.gc | 2 +- .../engine/gfx/tie/tie-methods_REF.gc | 2 +- 26 files changed, 5513 insertions(+), 52 deletions(-) create mode 100644 game/mips2c/functions/generic_effect2.cpp create mode 100644 game/mips2c/functions/generic_tie.cpp create mode 100644 game/mips2c/functions/tie_methods.cpp diff --git a/common/custom_data/Tfrag3Data.h b/common/custom_data/Tfrag3Data.h index a22a1dbd1f..b40530e482 100644 --- a/common/custom_data/Tfrag3Data.h +++ b/common/custom_data/Tfrag3Data.h @@ -50,7 +50,7 @@ enum MemoryUsageCategory { NUM_CATEGORIES }; -constexpr int TFRAG3_VERSION = 15; +constexpr int TFRAG3_VERSION = 16; // These vertices should be uploaded to the GPU at load time and don't change struct PreloadedVertex { diff --git a/common/dma/dma.h b/common/dma/dma.h index 46a4823e13..fd79fa94e3 100644 --- a/common/dma/dma.h +++ b/common/dma/dma.h @@ -69,6 +69,11 @@ inline void emulate_dma(const void* source_base, void* dest_base, u32 tadr, u32 dest_offset += (1 + tag.qwc) * 16; tadr += 16 + tag.qwc * 16; break; + case DmaTag::Kind::NEXT: + memcpy(dst + dest_offset, src + tadr, (1 + tag.qwc) * 16); + dest_offset += (1 + tag.qwc) * 16; + tadr = tag.addr; + break; case DmaTag::Kind::REF: { // tte memcpy(dst + dest_offset, src + tadr, 16); diff --git a/decompiler/analysis/mips2c.cpp b/decompiler/analysis/mips2c.cpp index 5300630aa4..afa1014a73 100644 --- a/decompiler/analysis/mips2c.cpp +++ b/decompiler/analysis/mips2c.cpp @@ -1058,6 +1058,7 @@ Mips2C_Line handle_normal_instr(Mips2C_Output& output, case InstructionKind::DSLLV: case InstructionKind::PAND: case InstructionKind::PCEQB: + case InstructionKind::PPACW: return handle_generic_op3(i0, instr_str, {}); case InstructionKind::MULS: return handle_generic_op3(i0, instr_str, "muls"); diff --git a/decompiler/config/all-types.gc b/decompiler/config/all-types.gc index 0820408265..7c6bf4547f 100644 --- a/decompiler/config/all-types.gc +++ b/decompiler/config/all-types.gc @@ -6827,7 +6827,7 @@ (gifbuf-adr uint32 :offset-assert 68) (inbuf-adr uint32 :offset-assert 72) (fade-val uint32 :offset-assert 76) - (time-of-day-color uint32 :offset-assert 80) + (time-of-day-color rgba :offset-assert 80) (to-vu0-waits uint32 :offset-assert 84) (to-spr-waits uint32 :offset-assert 88) (from-spr-waits uint32 :offset-assert 92) @@ -16886,11 +16886,11 @@ ;; - Functions (define-extern generic-work-init (function generic-dma-foreground-sink none)) -(define-extern generic-upload-vu0 function) +(define-extern generic-upload-vu0 (function none)) (define-extern upload-vu0-program (function vu-function pointer none)) (define-extern generic-initialize-without-sink (function matrix vu-lights none)) -(define-extern generic-initialize function) -(define-extern generic-wrapup function) +(define-extern generic-initialize (function generic-dma-foreground-sink matrix vu-lights none)) +(define-extern generic-wrapup (function generic-dma-foreground-sink none)) (define-extern generic-dma-from-spr function) (define-extern generic-light-proc function) (define-extern generic-envmap-proc function) @@ -16967,11 +16967,11 @@ ;; - Functions (define-extern generic-tie-dma-to-spad function) -(define-extern generic-tie-dma-to-spad-sync function) +(define-extern generic-tie-dma-to-spad-sync (function object object none)) (define-extern generic-tie-decompress function) (define-extern generic-tie-upload-next function) (define-extern generic-tie-convert-proc function) -(define-extern generic-tie-convert function) +(define-extern generic-tie-convert (function none)) (define-extern generic-tie-display-stats function) (define-extern generic-tie-debug function) (define-extern generic-tie-execute (function generic-dma-foreground-sink dma-buffer basic none)) @@ -17416,7 +17416,7 @@ (define-extern tie-debug-between (function uint uint uint)) (define-extern tie-debug-one (function uint uint uint)) (define-extern walk-tie-generic-prototypes (function none)) -(define-extern draw-inline-array-instance-tie (function pointer drawable int dma-buffer none)) +(define-extern draw-inline-array-instance-tie (function pointer (inline-array instance-tie) int dma-buffer none)) (define-extern draw-inline-array-prototype-tie-generic-asm (function dma-buffer int prototype-array-tie none)) (define-extern draw-inline-array-prototype-tie-asm (function dma-buffer int prototype-array-tie none)) (define-extern draw-inline-array-prototype-tie-near-asm (function dma-buffer int prototype-array-tie none)) diff --git a/decompiler/config/jak1_ntsc_black_label/hacks.jsonc b/decompiler/config/jak1_ntsc_black_label/hacks.jsonc index 17244b1ac1..ef152a5e43 100644 --- a/decompiler/config/jak1_ntsc_black_label/hacks.jsonc +++ b/decompiler/config/jak1_ntsc_black_label/hacks.jsonc @@ -141,11 +141,8 @@ "generic-envmap-only-proc", "generic-no-light", "generic-no-light+envmap", - "generic-no-light-dproc", "generic-no-light-dproc-only", "generic-no-light-proc", - "generic-interp-dproc", - "generic-envmap-dproc", "generic-prepare-dma-single", "generic-prepare-dma-double", "generic-envmap-proc", @@ -163,11 +160,9 @@ "generic-merc-init-asm", // generic-tie - "generic-tie-convert", "generic-tie-convert-proc", "generic-tie-upload-next", "generic-tie-decompress", - "generic-tie-dma-to-spad-sync", // shadow-cpu "shadow-add-double-edges", @@ -200,8 +195,6 @@ // tie-methods "draw-inline-array-prototype-tie-near-asm", "draw-inline-array-prototype-tie-asm", - "draw-inline-array-prototype-tie-generic-asm", - "draw-inline-array-instance-tie", // sparticle-launcher "sp-init-fields!", @@ -613,7 +606,18 @@ "shadow-scissor-top", "shadow-scissor-edges", "shadow-calc-dual-verts", - "shadow-xform-verts" + "shadow-xform-verts", + + // generic tie + "draw-inline-array-instance-tie", + "generic-tie-dma-to-spad-sync", + "draw-inline-array-prototype-tie-generic-asm", + "generic-interp-dproc", + "generic-no-light-dproc", + "generic-envmap-dproc", + "generic-tie-convert" + + ], "mips2c_jump_table_functions": { diff --git a/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc b/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc index 1a42cef0c1..05137727f4 100644 --- a/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc +++ b/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc @@ -7778,5 +7778,10 @@ ], "(method 12 effect-control)": [["_stack_", 112, "res-tag"]], + + "generic-tie-execute": [ + [118, "v1", "terrain-context"], + [124, "v1", "terrain-context"] + ], "placeholder-do-not-add-below": [] } diff --git a/decompiler/level_extractor/extract_tie.cpp b/decompiler/level_extractor/extract_tie.cpp index 341510db37..9e072478b9 100644 --- a/decompiler/level_extractor/extract_tie.cpp +++ b/decompiler/level_extractor/extract_tie.cpp @@ -2034,6 +2034,10 @@ void add_vertices_and_static_draw(tfrag3::TieTree& tree, // loop over all prototypes for (auto& proto : protos) { + if (proto.uses_generic) { + // generic ties go through generic + continue; + } // bool using_wind = true; // hack, for testing bool using_wind = proto.stiffness != 0.f; diff --git a/game/CMakeLists.txt b/game/CMakeLists.txt index 9105737830..17d0af62ee 100644 --- a/game/CMakeLists.txt +++ b/game/CMakeLists.txt @@ -46,7 +46,9 @@ set(RUNTIME_SOURCE mips2c/functions/collide_probe.cpp mips2c/functions/draw_string.cpp mips2c/functions/generic_effect.cpp + mips2c/functions/generic_effect2.cpp mips2c/functions/generic_merc.cpp + mips2c/functions/generic_tie.cpp mips2c/functions/joint.cpp mips2c/functions/merc_blend_shape.cpp mips2c/functions/ocean.cpp @@ -59,6 +61,7 @@ set(RUNTIME_SOURCE mips2c/functions/test_func.cpp mips2c/functions/texture.cpp mips2c/functions/tfrag.cpp + mips2c/functions/tie_methods.cpp mips2c/functions/time_of_day.cpp overlord/dma.cpp overlord/fake_iso.cpp @@ -128,19 +131,19 @@ set(RUNTIME_SOURCE find_package(Git) function(write_svnrev_h) - set(GIT_SHORT_SHA "") - if (GIT_FOUND AND EXISTS ${CMAKE_SOURCE_DIR}/.git) - EXECUTE_PROCESS(WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD - OUTPUT_VARIABLE GIT_SHORT_SHA - OUTPUT_STRIP_TRAILING_WHITESPACE) + set(GIT_SHORT_SHA "") + if (GIT_FOUND AND EXISTS ${CMAKE_SOURCE_DIR}/.git) + EXECUTE_PROCESS(WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD + OUTPUT_VARIABLE GIT_SHORT_SHA + OUTPUT_STRIP_TRAILING_WHITESPACE) else() - set(GIT_SHORT_SHA "unk. rev.") - endif() - if(NOT GIT_SHORT_SHA) - set(GIT_SHORT_SHA "unk. rev.") + set(GIT_SHORT_SHA "unk. rev.") + endif() + if(NOT GIT_SHORT_SHA) + set(GIT_SHORT_SHA "unk. rev.") else() string(SUBSTRING ${GIT_SHORT_SHA} 0 6 GIT_SHORT_SHA) - endif() + endif() file(WRITE ${CMAKE_CURRENT_SOURCE_DIR}/kernel/svnrev.h "#define GIT_SHORT_SHA \"rev. ${GIT_SHORT_SHA}\"\n") endfunction() diff --git a/game/common/vu.h b/game/common/vu.h index c8b3946264..497056f9c8 100644 --- a/game/common/vu.h +++ b/game/common/vu.h @@ -528,6 +528,14 @@ struct alignas(16) Accumulator { } } + void msuba(Mask mask, const Vf& a, float b) { + for (int i = 0; i < 4; i++) { + if ((u64)mask & (1 << i)) { + data[i] -= a[i] * b; + } + } + } + u16 madd_flag(Mask mask, Vf& dest, const Vf& a, float b) { u16 result = 0; for (int i = 0; i < 4; i++) { diff --git a/game/graphics/opengl_renderer/foreground/Generic2_Build.cpp b/game/graphics/opengl_renderer/foreground/Generic2_Build.cpp index 10cce737d7..40562ce92a 100644 --- a/game/graphics/opengl_renderer/foreground/Generic2_Build.cpp +++ b/game/graphics/opengl_renderer/foreground/Generic2_Build.cpp @@ -108,16 +108,25 @@ void Generic2::determine_draw_modes() { u64 bonus_adgif_data[4]; memcpy(bonus_adgif_data, frag.header + (5 * 16), 4 * sizeof(u64)); - // ADGIF 5 - ASSERT((u8)bonus_adgif_data[1] == (u8)(GsRegisterAddress::TEST_1)); - u64 final_test = bonus_adgif_data[0]; - // ADGIF 6 - if ((u8)bonus_adgif_data[3] == (u8)(GsRegisterAddress::ALPHA_1)) { - final_alpha = bonus_adgif_data[2]; - } else { + u64 final_test; + if ((u8)bonus_adgif_data[1] == (u8)(GsRegisterAddress::ALPHA_1)) { + ASSERT((u8)bonus_adgif_data[1] == (u8)(GsRegisterAddress::ALPHA_1)); + final_alpha = bonus_adgif_data[0]; ASSERT((u8)bonus_adgif_data[3] == (u8)(GsRegisterAddress::TEST_1)); final_test = bonus_adgif_data[2]; + } else { + // ADGIF 5 + ASSERT((u8)bonus_adgif_data[1] == (u8)(GsRegisterAddress::TEST_1)); + final_test = bonus_adgif_data[0]; + + // ADGIF 6 + if ((u8)bonus_adgif_data[3] == (u8)(GsRegisterAddress::ALPHA_1)) { + final_alpha = bonus_adgif_data[2]; + } else { + ASSERT((u8)bonus_adgif_data[3] == (u8)(GsRegisterAddress::TEST_1)); + final_test = bonus_adgif_data[2]; + } } if (final_alpha) { diff --git a/game/graphics/opengl_renderer/shaders/collision.vert b/game/graphics/opengl_renderer/shaders/collision.vert index b95fc892f7..701697b691 100644 --- a/game/graphics/opengl_renderer/shaders/collision.vert +++ b/game/graphics/opengl_renderer/shaders/collision.vert @@ -58,7 +58,7 @@ void main() { // color if (mode == 0) { - fragment_color = vec4(0.4, 0.5, 0.5, 1); + fragment_color = vec4((normal_in + 1)*.5, 1); fragment_color.xyz *= (pow(cam_dot, 3) + 0.3); } else { fragment_color = vec4(0.0, 0.3, 0.3, 1); diff --git a/game/kernel/kdgo.cpp b/game/kernel/kdgo.cpp index 568f7b8d05..7c2e7d91dd 100644 --- a/game/kernel/kdgo.cpp +++ b/game/kernel/kdgo.cpp @@ -368,8 +368,9 @@ void load_and_link_dgo_from_c(const char* name, char objName[64]; strcpy(objName, (dgoObj + 4).cast().c()); // name from dgo object header - lg::debug("[link and exec] {:18s} {} {:6d} heap-use {:8d} {:8d}", objName, lastObjectLoaded, - objSize, kheapused(kglobalheap), kdebugheap.offset ? kheapused(kdebugheap) : 0); + lg::debug("[link and exec] {:18s} {} {:6d} heap-use {:8d} {:8d}: 0x{:x}", objName, + lastObjectLoaded, objSize, kheapused(kglobalheap), + kdebugheap.offset ? kheapused(kdebugheap) : 0, kglobalheap->current.offset); link_and_exec(obj, objName, objSize, heap, linkFlag, jump_from_c_to_goal); // link now! // inform IOP we are done diff --git a/game/mips2c/functions/generic_effect2.cpp b/game/mips2c/functions/generic_effect2.cpp new file mode 100644 index 0000000000..e6a30a1f40 --- /dev/null +++ b/game/mips2c/functions/generic_effect2.cpp @@ -0,0 +1,1016 @@ +//--------------------------MIPS2C--------------------- +#include "game/mips2c/mips2c_private.h" +#include "game/kernel/kscheme.h" +namespace Mips2C { + +// clang-format off +void vcallms48(ExecutionContext* c) { + // nop | mulx.xyzw vf13, vf09, vf31 + c->vfs[vf13].vf.mul(Mask::xyzw, c->vf_src(vf09).vf, c->vf_src(vf31).vf.x()); + // nop | subw.z vf21, vf21, vf00 + c->vfs[vf21].vf.sub(Mask::z, c->vf_src(vf21).vf, c->vf_src(vf00).vf.w()); + // nop | addy.x vf29, vf29, vf29 + c->vfs[vf29].vf.add(Mask::x, c->vf_src(vf29).vf, c->vf_src(vf29).vf.y()); + // nop | mulx.xyz vf08, vf08, vf30 + c->vfs[vf08].vf.mul(Mask::xyz, c->vf_src(vf08).vf, c->vf_src(vf30).vf.x()); + // nop | addw.xy vf05, vf05, vf31 + c->vfs[vf05].vf.add(Mask::xy, c->vf_src(vf05).vf, c->vf_src(vf31).vf.w()); + // nop | mul.xyz vf30, vf21, vf13 + c->vfs[vf30].vf.mul(Mask::xyz, c->vf_src(vf21).vf, c->vf_src(vf13).vf); + // nop | addz.x vf29, vf29, vf29 + c->vfs[vf29].vf.add(Mask::x, c->vf_src(vf29).vf, c->vf_src(vf29).vf.z()); + // nop | add.xyz vf08, vf08, vf16 + c->vfs[vf08].vf.add(Mask::xyz, c->vf_src(vf08).vf, c->vf_src(vf16).vf); + // move.xyzw vf28, vf27 | ftoi12.xy vf17, vf05 + c->vfs[vf17].vf.ftoi12(Mask::xy, c->vf_src(vf05).vf); c->vfs[vf28].vf.move(Mask::xyzw, c->vf_src(vf27).vf); + // move.xyzw vf02, vf22 | addy.x vf30, vf30, vf30 + c->vfs[vf30].vf.add(Mask::x, c->vf_src(vf30).vf, c->vf_src(vf30).vf.y()); c->vfs[vf02].vf.move(Mask::xyzw, c->vf_src(vf22).vf); + // rsqrt Q, vf31.z, vf29.x | mul.xyz vf06, vf06, Q + c->vfs[vf06].vf.mul(Mask::xyz, c->vf_src(vf06).vf, c->Q); c->Q = c->vf_src(vf31).vf.z() / std::sqrt(c->vf_src(vf29).vf.x()); + // nop | mul.xyz vf29, vf08, vf08 + c->vfs[vf29].vf.mul(Mask::xyz, c->vf_src(vf08).vf, c->vf_src(vf08).vf); + // nop | mulx.xyz vf01, vf21, vf28 + c->vfs[vf01].vf.mul(Mask::xyz, c->vf_src(vf21).vf, c->vf_src(vf28).vf.x()); + // nop | addz.x vf30, vf30, vf30 + c->vfs[vf30].vf.add(Mask::x, c->vf_src(vf30).vf, c->vf_src(vf30).vf.z()); + // nop | mulx.xyzw vf14, vf10, vf31 + c->vfs[vf14].vf.mul(Mask::xyzw, c->vf_src(vf10).vf, c->vf_src(vf31).vf.x()); + // nop | subw.z vf02, vf02, vf00 + c->vfs[vf02].vf.sub(Mask::z, c->vf_src(vf02).vf, c->vf_src(vf00).vf.w()); + // nop | addy.x vf29, vf29, vf29 + c->vfs[vf29].vf.add(Mask::x, c->vf_src(vf29).vf, c->vf_src(vf29).vf.y()); + // nop | mulx.xyz vf01, vf01, vf30 + c->vfs[vf01].vf.mul(Mask::xyz, c->vf_src(vf01).vf, c->vf_src(vf30).vf.x()); + // nop | addw.xy vf06, vf06, vf31 + c->vfs[vf06].vf.add(Mask::xy, c->vf_src(vf06).vf, c->vf_src(vf31).vf.w()); + // nop | mul.xyz vf30, vf02, vf14 + c->vfs[vf30].vf.mul(Mask::xyz, c->vf_src(vf02).vf, c->vf_src(vf14).vf); + // nop | addz.x vf29, vf29, vf29 + c->vfs[vf29].vf.add(Mask::x, c->vf_src(vf29).vf, c->vf_src(vf29).vf.z()); + // nop | add.xyz vf01, vf01, vf13 + c->vfs[vf01].vf.add(Mask::xyz, c->vf_src(vf01).vf, c->vf_src(vf13).vf); + // nop | ftoi12.xy vf18, vf06 + c->vfs[vf18].vf.ftoi12(Mask::xy, c->vf_src(vf06).vf); + // nop | addy.x vf30, vf30, vf30 + c->vfs[vf30].vf.add(Mask::x, c->vf_src(vf30).vf, c->vf_src(vf30).vf.y()); + // rsqrt Q, vf31.z, vf29.x | mul.xyz vf07, vf07, Q + c->vfs[vf07].vf.mul(Mask::xyz, c->vf_src(vf07).vf, c->Q); c->Q = c->vf_src(vf31).vf.z() / std::sqrt(c->vf_src(vf29).vf.x()); + // move.xyzw vf03, vf23 | mul.xyz vf29, vf01, vf01 + c->vfs[vf29].vf.mul(Mask::xyz, c->vf_src(vf01).vf, c->vf_src(vf01).vf); c->vfs[vf03].vf.move(Mask::xyzw, c->vf_src(vf23).vf); + // nop | muly.xyz vf02, vf02, vf28 + c->vfs[vf02].vf.mul(Mask::xyz, c->vf_src(vf02).vf, c->vf_src(vf28).vf.y()); + // nop | addz.x vf30, vf30, vf30 + c->vfs[vf30].vf.add(Mask::x, c->vf_src(vf30).vf, c->vf_src(vf30).vf.z()); + // nop | mulx.xyzw vf15, vf11, vf31 + c->vfs[vf15].vf.mul(Mask::xyzw, c->vf_src(vf11).vf, c->vf_src(vf31).vf.x()); + // nop | subw.z vf03, vf03, vf00 + c->vfs[vf03].vf.sub(Mask::z, c->vf_src(vf03).vf, c->vf_src(vf00).vf.w()); + // nop | addy.x vf29, vf29, vf29 + c->vfs[vf29].vf.add(Mask::x, c->vf_src(vf29).vf, c->vf_src(vf29).vf.y()); + // nop | mulx.xyz vf02, vf02, vf30 + c->vfs[vf02].vf.mul(Mask::xyz, c->vf_src(vf02).vf, c->vf_src(vf30).vf.x()); + // nop | addw.xy vf07, vf07, vf31 + c->vfs[vf07].vf.add(Mask::xy, c->vf_src(vf07).vf, c->vf_src(vf31).vf.w()); + // nop | mul.xyz vf30, vf03, vf15 + c->vfs[vf30].vf.mul(Mask::xyz, c->vf_src(vf03).vf, c->vf_src(vf15).vf); + // nop | addz.x vf29, vf29, vf29 + c->vfs[vf29].vf.add(Mask::x, c->vf_src(vf29).vf, c->vf_src(vf29).vf.z()); + // nop | add.xyz vf02, vf02, vf14 + c->vfs[vf02].vf.add(Mask::xyz, c->vf_src(vf02).vf, c->vf_src(vf14).vf); + // nop | ftoi12.xy vf19, vf07 + c->vfs[vf19].vf.ftoi12(Mask::xy, c->vf_src(vf07).vf); + // nop | addy.x vf30, vf30, vf30 + c->vfs[vf30].vf.add(Mask::x, c->vf_src(vf30).vf, c->vf_src(vf30).vf.y()); + // rsqrt Q, vf31.z, vf29.x | mul.xyz vf08, vf08, Q + c->vfs[vf08].vf.mul(Mask::xyz, c->vf_src(vf08).vf, c->Q); c->Q = c->vf_src(vf31).vf.z() / std::sqrt(c->vf_src(vf29).vf.x()); + // move.xyzw vf04, vf24 | mul.xyz vf29, vf02, vf02 + c->vfs[vf29].vf.mul(Mask::xyz, c->vf_src(vf02).vf, c->vf_src(vf02).vf); c->vfs[vf04].vf.move(Mask::xyzw, c->vf_src(vf24).vf); + // nop | mulz.xyz vf03, vf03, vf28 + c->vfs[vf03].vf.mul(Mask::xyz, c->vf_src(vf03).vf, c->vf_src(vf28).vf.z()); + // nop | addz.x vf30, vf30, vf30 + c->vfs[vf30].vf.add(Mask::x, c->vf_src(vf30).vf, c->vf_src(vf30).vf.z()); + // nop | mulx.xyzw vf16, vf12, vf31 + c->vfs[vf16].vf.mul(Mask::xyzw, c->vf_src(vf12).vf, c->vf_src(vf31).vf.x()); + // nop | subw.z vf04, vf04, vf00 + c->vfs[vf04].vf.sub(Mask::z, c->vf_src(vf04).vf, c->vf_src(vf00).vf.w()); + // nop | addy.x vf29, vf29, vf29 + c->vfs[vf29].vf.add(Mask::x, c->vf_src(vf29).vf, c->vf_src(vf29).vf.y()); + // nop | mulx.xyz vf03, vf03, vf30 + c->vfs[vf03].vf.mul(Mask::xyz, c->vf_src(vf03).vf, c->vf_src(vf30).vf.x()); + // nop | addw.xy vf08, vf08, vf31 + c->vfs[vf08].vf.add(Mask::xy, c->vf_src(vf08).vf, c->vf_src(vf31).vf.w()); + // nop | mul.xyz vf30, vf04, vf16 + c->vfs[vf30].vf.mul(Mask::xyz, c->vf_src(vf04).vf, c->vf_src(vf16).vf); + // nop | addz.x vf29, vf29, vf29 + c->vfs[vf29].vf.add(Mask::x, c->vf_src(vf29).vf, c->vf_src(vf29).vf.z()); + // nop | add.xyz vf03, vf03, vf15 + c->vfs[vf03].vf.add(Mask::xyz, c->vf_src(vf03).vf, c->vf_src(vf15).vf); + // nop | ftoi12.xy vf20, vf08 + c->vfs[vf20].vf.ftoi12(Mask::xy, c->vf_src(vf08).vf); + // nop | addy.x vf30, vf30, vf30 + c->vfs[vf30].vf.add(Mask::x, c->vf_src(vf30).vf, c->vf_src(vf30).vf.y()); + // rsqrt Q, vf31.z, vf29.x | mul.xyz vf05, vf01, Q + c->vfs[vf05].vf.mul(Mask::xyz, c->vf_src(vf01).vf, c->Q); c->Q = c->vf_src(vf31).vf.z() / std::sqrt(c->vf_src(vf29).vf.x()); + // move.xyzw vf06, vf02 | mul.xyz vf29, vf03, vf03 + c->vfs[vf29].vf.mul(Mask::xyz, c->vf_src(vf03).vf, c->vf_src(vf03).vf); c->vfs[vf06].vf.move(Mask::xyzw, c->vf_src(vf02).vf); + // move.xyzw vf07, vf03 | mulw.xyz vf08, vf04, vf28 :e + c->vfs[vf08].vf.mul(Mask::xyz, c->vf_src(vf04).vf, c->vf_src(vf28).vf.w()); c->vfs[vf07].vf.move(Mask::xyzw, c->vf_src(vf03).vf); + // nop | addz.x vf30, vf30, vf30 + c->vfs[vf30].vf.add(Mask::x, c->vf_src(vf30).vf, c->vf_src(vf30).vf.z()); + +} + +namespace generic_envmap_dproc { +struct Cache { + void* fake_scratchpad_data; // *fake-scratchpad-data* +} cache; + +u64 execute(void* ctxt) { + auto* c = (ExecutionContext*)ctxt; + bool bc = false; + u32 call_addr = 0; + // nop // sll r0, r0, 0 + get_fake_spad_addr(at, cache.fake_scratchpad_data, 0, c);// lui at, 28672 + c->lui(v1, 16256); // lui v1, 16256 + c->mtc1(f0, v1); // mtc1 f0, v1 + c->lwu(a1, 60, at); // lwu a1, 60(at) + // nop // sll r0, r0, 0 + c->lw(v1, 12048, at); // lw v1, 12048(at) + // nop // sll r0, r0, 0 + c->lw(a2, 4, a1); // lw a2, 4(a1) + c->mov64(a0, a2); // or a0, a2, r0 + c->lhu(a1, 20, a1); // lhu a1, 20(a1) + // nop // sll r0, r0, 0 + c->lwc1(f4, 24, a2); // lwc1 f4, 24(a2) + c->daddiu(a1, a1, -4); // daddiu a1, a1, -4 + c->lwc1(f3, 56, a2); // lwc1 f3, 56(a2) + // nop // sll r0, r0, 0 + c->lwc1(f2, 88, a2); // lwc1 f2, 88(a2) + // nop // sll r0, r0, 0 + c->lwc1(f1, 120, a2); // lwc1 f1, 120(a2) + // nop // sll r0, r0, 0 + c->lq(t2, 16, a2); // lq t2, 16(a2) + c->subs(f4, f4, f0); // sub.s f4, f4, f0 + c->lq(t3, 48, a2); // lq t3, 48(a2) + c->divs(f4, f0, f4); // div.s f4, f0, f4 + c->lq(t4, 80, a2); // lq t4, 80(a2) + // nop // sll r0, r0, 0 + c->lq(t5, 112, a2); // lq t5, 112(a2) + // nop // sll r0, r0, 0 + c->lqc2(vf31, 12016, at); // lqc2 vf31, 12016(at) + // nop // sll r0, r0, 0 + c->lq(t6, 0, a2); // lq t6, 0(a2) + // nop // sll r0, r0, 0 + c->lq(a3, 32, a2); // lq a3, 32(a2) + // nop // sll r0, r0, 0 + c->lq(t0, 64, a2); // lq t0, 64(a2) + // nop // sll r0, r0, 0 + c->lq(t1, 96, a2); // lq t1, 96(a2) + c->muls(f4, f4, f0); // mul.s f4, f4, f0 + c->mov128_vf_gpr(vf21, t2); // qmtc2.i vf21, t2 + c->subs(f3, f3, f0); // sub.s f3, f3, f0 + c->mov128_vf_gpr(vf22, t3); // qmtc2.ni vf22, t3 + c->divs(f3, f0, f3); // div.s f3, f0, f3 + c->mov128_vf_gpr(vf23, t4); // qmtc2.ni vf23, t4 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf24, t5); // qmtc2.ni vf24, t5 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf9, t6); // qmtc2.ni vf9, t6 + c->subs(f2, f2, f0); // sub.s f2, f2, f0 + c->mfc1(t2, f4); // mfc1 t2, f4 + c->subs(f1, f1, f0); // sub.s f1, f1, f0 + c->mov128_vf_gpr(vf10, a3); // qmtc2.ni vf10, a3 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf11, t0); // qmtc2.ni vf11, t0 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf12, t1); // qmtc2.ni vf12, t1 + c->muls(f3, f3, f0); // mul.s f3, f3, f0 + // nop // sll r0, r0, 0 + c->divs(f2, f0, f2); // div.s f2, f0, f2 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->mfc1(a3, f3); // mfc1 a3, f3 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->muls(f2, f2, f0); // mul.s f2, f2, f0 + // nop // sll r0, r0, 0 + c->divs(f1, f0, f1); // div.s f1, f0, f1 + // nop // sll r0, r0, 0 + c->pextlw(a3, a3, t2); // pextlw a3, a3, t2 + c->mfc1(r0, f31); // mfc1 r0, f31 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->mfc1(t0, f2); // mfc1 t0, f2 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->daddiu(a2, a2, 128); // daddiu a2, a2, 128 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->mfc1(t1, f1); // mfc1 t1, f1 + c->pextlw(t0, t1, t0); // pextlw t0, t1, t0 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pcpyld(a3, t0, a3); // pcpyld a3, t0, a3 + c->mfc1(r0, f31); // mfc1 r0, f31 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf27, a3); // qmtc2.ni vf27, a3 + // nop // sll r0, r0, 0 + // Unknown instr: vcallms 48 + vcallms48(c); + // nop // sll r0, r0, 0 + c->mfc1(r0, f31); // mfc1 r0, f31 + // nop // sll r0, r0, 0 + c->mfc1(r0, f31); // mfc1 r0, f31 + // nop // sll r0, r0, 0 + c->mfc1(r0, f31); // mfc1 r0, f31 + // nop // sll r0, r0, 0 + c->mfc1(r0, f31); // mfc1 r0, f31 + // nop // sll r0, r0, 0 + c->mfc1(r0, f31); // mfc1 r0, f31 + // nop // sll r0, r0, 0 + c->mfc1(r0, f31); // mfc1 r0, f31 + // nop // sll r0, r0, 0 + c->mfc1(r0, f31); // mfc1 r0, f31 + // nop // sll r0, r0, 0 + c->lwc1(f4, 24, a2); // lwc1 f4, 24(a2) + // nop // sll r0, r0, 0 + c->lwc1(f3, 56, a2); // lwc1 f3, 56(a2) + // nop // sll r0, r0, 0 + c->lwc1(f2, 88, a2); // lwc1 f2, 88(a2) + // nop // sll r0, r0, 0 + c->lwc1(f1, 120, a2); // lwc1 f1, 120(a2) + // nop // sll r0, r0, 0 + c->lq(a3, 16, a2); // lq a3, 16(a2) + c->subs(f4, f4, f0); // sub.s f4, f4, f0 + // nop // sll r0, r0, 0 + c->subs(f3, f3, f0); // sub.s f3, f3, f0 + // nop // sll r0, r0, 0 + c->subs(f2, f2, f0); // sub.s f2, f2, f0 + // nop // sll r0, r0, 0 + c->subs(f1, f1, f0); // sub.s f1, f1, f0 + // nop // sll r0, r0, 0 + c->divs(f4, f0, f4); // div.s f4, f0, f4 + c->lq(t0, 48, a2); // lq t0, 48(a2) + // nop // sll r0, r0, 0 + c->lq(t1, 80, a2); // lq t1, 80(a2) + // nop // sll r0, r0, 0 + c->lq(t2, 112, a2); // lq t2, 112(a2) + // nop // sll r0, r0, 0 + c->lq(t3, 0, a2); // lq t3, 0(a2) + // nop // sll r0, r0, 0 + c->lq(t4, 32, a2); // lq t4, 32(a2) + // nop // sll r0, r0, 0 + c->lq(t5, 64, a2); // lq t5, 64(a2) + // nop // sll r0, r0, 0 + c->lq(t6, 96, a2); // lq t6, 96(a2) + c->muls(f4, f4, f0); // mul.s f4, f4, f0 + // nop // sll r0, r0, 0 + c->divs(f3, f0, f3); // div.s f3, f0, f3 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->mfc1(t7, f4); // mfc1 t7, f4 + // nop // sll r0, r0, 0 + c->daddiu(a2, a2, 128); // daddiu a2, a2, 128 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->muls(f3, f3, f0); // mul.s f3, f3, f0 + // nop // sll r0, r0, 0 + c->divs(f2, f0, f2); // div.s f2, f0, f2 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->mfc1(t8, f3); // mfc1 t8, f3 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->muls(f2, f2, f0); // mul.s f2, f2, f0 + // nop // sll r0, r0, 0 + c->divs(f1, f0, f1); // div.s f1, f0, f1 + // nop // sll r0, r0, 0 + c->pextlw(t7, t8, t7); // pextlw t7, t8, t7 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->mfc1(t8, f2); // mfc1 t8, f2 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->mfc1(t9, f1); // mfc1 t9, f1 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf21, a3); // qmtc2.ni vf21, a3 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf9, t3); // qmtc2.ni vf9, t3 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf10, t4); // qmtc2.ni vf10, t4 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf11, t5); // qmtc2.ni vf11, t5 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf12, t6); // qmtc2.ni vf12, t6 + c->pextlw(a3, t9, t8); // pextlw a3, t9, t8 + // nop // sll r0, r0, 0 + c->pcpyld(a3, a3, t7); // pcpyld a3, a3, t7 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf22, t0); // qmtc2.ni vf22, t0 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf23, t1); // qmtc2.ni vf23, t1 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf24, t2); // qmtc2.ni vf24, t2 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf27, a3); // qmtc2.ni vf27, a3 + // nop // sll r0, r0, 0 + // Unknown instr: vcallms 48 + vcallms48(c); + // nop // sll r0, r0, 0 + c->mfc1(r0, f31); // mfc1 r0, f31 + // nop // sll r0, r0, 0 + c->mfc1(r0, f31); // mfc1 r0, f31 + // nop // sll r0, r0, 0 + c->mfc1(r0, f31); // mfc1 r0, f31 + // nop // sll r0, r0, 0 + c->mfc1(r0, f31); // mfc1 r0, f31 + // nop // sll r0, r0, 0 + c->mfc1(r0, f31); // mfc1 r0, f31 + // nop // sll r0, r0, 0 + c->mfc1(r0, f31); // mfc1 r0, f31 + // nop // sll r0, r0, 0 + c->mfc1(r0, f31); // mfc1 r0, f31 + // nop // sll r0, r0, 0 + c->lwc1(f1, 24, a2); // lwc1 f1, 24(a2) + c->subs(f1, f1, f0); // sub.s f1, f1, f0 + c->lwc1(f2, 56, a2); // lwc1 f2, 56(a2) + c->divs(f3, f0, f1); // div.s f3, f0, f1 + c->lwc1(f5, 88, a2); // lwc1 f5, 88(a2) + // nop // sll r0, r0, 0 + c->lwc1(f1, 120, a2); // lwc1 f1, 120(a2) + // nop // sll r0, r0, 0 + c->lq(a3, 16, a2); // lq a3, 16(a2) + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->subs(f4, f2, f0); // sub.s f4, f2, f0 + // nop // sll r0, r0, 0 + c->subs(f2, f5, f0); // sub.s f2, f5, f0 + // nop // sll r0, r0, 0 + c->subs(f1, f1, f0); // sub.s f1, f1, f0 + // nop // sll r0, r0, 0 + c->muls(f3, f3, f0); // mul.s f3, f3, f0 + c->lq(t0, 48, a2); // lq t0, 48(a2) + c->divs(f4, f0, f4); // div.s f4, f0, f4 + c->lq(t1, 80, a2); // lq t1, 80(a2) + // nop // sll r0, r0, 0 + c->lq(t2, 112, a2); // lq t2, 112(a2) + // nop // sll r0, r0, 0 + c->lq(t3, 0, a2); // lq t3, 0(a2) + // nop // sll r0, r0, 0 + c->lq(t4, 32, a2); // lq t4, 32(a2) + // nop // sll r0, r0, 0 + c->lq(t5, 64, a2); // lq t5, 64(a2) + // nop // sll r0, r0, 0 + c->lq(t6, 96, a2); // lq t6, 96(a2) + // nop // sll r0, r0, 0 + c->mfc1(t7, f3); // mfc1 t7, f3 + c->muls(f3, f4, f0); // mul.s f3, f4, f0 + // nop // sll r0, r0, 0 + c->divs(f2, f0, f2); // div.s f2, f0, f2 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->daddiu(a2, a2, 128); // daddiu a2, a2, 128 + // nop // sll r0, r0, 0 + c->mfc1(t8, f3); // mfc1 t8, f3 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->muls(f2, f2, f0); // mul.s f2, f2, f0 + // nop // sll r0, r0, 0 + c->divs(f1, f0, f1); // div.s f1, f0, f1 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->mfc1(t9, f2); // mfc1 t9, f2 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->pextlw(t7, t8, t7); // pextlw t7, t8, t7 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->mfc1(t8, f1); // mfc1 t8, f1 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->pextlw(t8, t8, t9); // pextlw t8, t8, t9 + // nop // sll r0, r0, 0 + c->pcpyld(t7, t8, t7); // pcpyld t7, t8, t7 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf21, a3); // qmtc2.ni vf21, a3 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf22, t0); // qmtc2.ni vf22, t0 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf23, t1); // qmtc2.ni vf23, t1 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf24, t2); // qmtc2.ni vf24, t2 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf9, t3); // qmtc2.ni vf9, t3 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf10, t4); // qmtc2.ni vf10, t4 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf11, t5); // qmtc2.ni vf11, t5 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf12, t6); // qmtc2.ni vf12, t6 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf27, t7); // qmtc2.ni vf27, t7 + // nop // sll r0, r0, 0 + c->mov128_gpr_vf(t1, vf17); // qmfc2.ni t1, vf17 + // nop // sll r0, r0, 0 + c->mov128_gpr_vf(t2, vf18); // qmfc2.ni t2, vf18 + // nop // sll r0, r0, 0 + c->mov128_gpr_vf(t0, vf19); // qmfc2.ni t0, vf19 + bc = ((s64)c->sgpr64(a1)) <= 0; // blez a1, L47 + c->mov128_gpr_vf(a3, vf20); // qmfc2.ni a3, vf20 + if (bc) {goto block_2;} // branch non-likely + + + block_1: + c->ppach(t1, r0, t1); // ppach t1, r0, t1 + // Unknown instr: vcallms 48 + vcallms48(c); + c->ppach(t2, r0, t2); // ppach t2, r0, t2 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->ppach(t0, r0, t0); // ppach t0, r0, t0 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->ppach(a3, r0, a3); // ppach a3, r0, a3 + c->mfc1(r0, f31); // mfc1 r0, f31 + // nop // sll r0, r0, 0 + c->sw(t1, 16, a0); // sw t1, 16(a0) + // nop // sll r0, r0, 0 + c->sw(t2, 48, a0); // sw t2, 48(a0) + // nop // sll r0, r0, 0 + c->sw(t0, 80, a0); // sw t0, 80(a0) + // nop // sll r0, r0, 0 + c->sw(a3, 112, a0); // sw a3, 112(a0) + // nop // sll r0, r0, 0 + c->lwc1(f4, 24, a2); // lwc1 f4, 24(a2) + // nop // sll r0, r0, 0 + c->lwc1(f3, 56, a2); // lwc1 f3, 56(a2) + // nop // sll r0, r0, 0 + c->lwc1(f2, 88, a2); // lwc1 f2, 88(a2) + // nop // sll r0, r0, 0 + c->lwc1(f1, 120, a2); // lwc1 f1, 120(a2) + // nop // sll r0, r0, 0 + c->lq(a3, 16, a2); // lq a3, 16(a2) + c->subs(f4, f4, f0); // sub.s f4, f4, f0 + c->sw(v1, 20, a0); // sw v1, 20(a0) + c->subs(f3, f3, f0); // sub.s f3, f3, f0 + c->sw(v1, 52, a0); // sw v1, 52(a0) + c->subs(f2, f2, f0); // sub.s f2, f2, f0 + c->sw(v1, 84, a0); // sw v1, 84(a0) + c->subs(f1, f1, f0); // sub.s f1, f1, f0 + c->sw(v1, 116, a0); // sw v1, 116(a0) + c->divs(f4, f0, f4); // div.s f4, f0, f4 + c->lq(t3, 48, a2); // lq t3, 48(a2) + // nop // sll r0, r0, 0 + c->lq(t4, 80, a2); // lq t4, 80(a2) + // nop // sll r0, r0, 0 + c->lq(t5, 112, a2); // lq t5, 112(a2) + // nop // sll r0, r0, 0 + c->lq(t6, 0, a2); // lq t6, 0(a2) + // nop // sll r0, r0, 0 + c->lq(t2, 32, a2); // lq t2, 32(a2) + // nop // sll r0, r0, 0 + c->lq(t0, 64, a2); // lq t0, 64(a2) + // nop // sll r0, r0, 0 + c->lq(t1, 96, a2); // lq t1, 96(a2) + c->daddiu(a1, a1, -4); // daddiu a1, a1, -4 + c->daddiu(a0, a0, 128); // daddiu a0, a0, 128 + c->muls(f4, f4, f0); // mul.s f4, f4, f0 + // nop // sll r0, r0, 0 + c->divs(f3, f0, f3); // div.s f3, f0, f3 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->mfc1(t7, f4); // mfc1 t7, f4 + // nop // sll r0, r0, 0 + c->daddiu(a2, a2, 128); // daddiu a2, a2, 128 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->muls(f3, f3, f0); // mul.s f3, f3, f0 + // nop // sll r0, r0, 0 + c->divs(f2, f0, f2); // div.s f2, f0, f2 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->mfc1(t8, f3); // mfc1 t8, f3 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->muls(f2, f2, f0); // mul.s f2, f2, f0 + // nop // sll r0, r0, 0 + c->divs(f1, f0, f1); // div.s f1, f0, f1 + // nop // sll r0, r0, 0 + c->pextlw(t7, t8, t7); // pextlw t7, t8, t7 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->mfc1(t8, f2); // mfc1 t8, f2 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->mfc1(t9, f1); // mfc1 t9, f1 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf21, a3); // qmtc2.ni vf21, a3 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf22, t3); // qmtc2.ni vf22, t3 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf23, t4); // qmtc2.ni vf23, t4 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf24, t5); // qmtc2.ni vf24, t5 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf9, t6); // qmtc2.ni vf9, t6 + c->pextlw(a3, t9, t8); // pextlw a3, t9, t8 + c->mov128_vf_gpr(vf10, t2); // qmtc2.ni vf10, t2 + c->pcpyld(a3, a3, t7); // pcpyld a3, a3, t7 + c->mov128_vf_gpr(vf11, t0); // qmtc2.ni vf11, t0 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf12, t1); // qmtc2.ni vf12, t1 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf27, a3); // qmtc2.ni vf27, a3 + // nop // sll r0, r0, 0 + c->mov128_gpr_vf(t1, vf17); // qmfc2.ni t1, vf17 + // nop // sll r0, r0, 0 + c->mov128_gpr_vf(t2, vf18); // qmfc2.ni t2, vf18 + // nop // sll r0, r0, 0 + c->mov128_gpr_vf(t0, vf19); // qmfc2.ni t0, vf19 + bc = ((s64)c->sgpr64(a1)) > 0; // bgtz a1, L46 + c->mov128_gpr_vf(a3, vf20); // qmfc2.ni a3, vf20 + if (bc) {goto block_1;} // branch non-likely + + + block_2: + c->ppach(a1, r0, t1); // ppach a1, r0, t1 + c->sw(v1, 20, a0); // sw v1, 20(a0) + c->ppach(a2, r0, t2); // ppach a2, r0, t2 + c->sw(v1, 52, a0); // sw v1, 52(a0) + c->ppach(t0, r0, t0); // ppach t0, r0, t0 + c->sw(a1, 16, a0); // sw a1, 16(a0) + c->ppach(a1, r0, a3); // ppach a1, r0, a3 + c->sw(a2, 48, a0); // sw a2, 48(a0) + // nop // sll r0, r0, 0 + c->sw(t0, 80, a0); // sw t0, 80(a0) + // nop // sll r0, r0, 0 + c->sw(a1, 112, a0); // sw a1, 112(a0) + // nop // sll r0, r0, 0 + c->sw(v1, 84, a0); // sw v1, 84(a0) + // nop // sll r0, r0, 0 + c->sw(v1, 116, a0); // sw v1, 116(a0) + c->gprs[v0].du64[0] = 0; // or v0, r0, r0 + //jr ra // jr ra + c->daddu(sp, sp, r0); // daddu sp, sp, r0 + goto end_of_function; // return + + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + end_of_function: + return c->gprs[v0].du64[0]; +} + +void link() { + cache.fake_scratchpad_data = intern_from_c("*fake-scratchpad-data*").c(); + gLinkedFunctionTable.reg("generic-envmap-dproc", execute, 256); +} + +} // namespace generic_envmap_dproc +} // namespace Mips2C + +//--------------------------MIPS2C--------------------- +#include "game/mips2c/mips2c_private.h" +#include "game/kernel/kscheme.h" +namespace Mips2C { +namespace generic_interp_dproc { +struct Cache { + void* fake_scratchpad_data; // *fake-scratchpad-data* +} cache; + +u64 execute(void* ctxt) { + auto* c = (ExecutionContext*)ctxt; + bool bc = false; + u32 call_addr = 0; + get_fake_spad_addr(at, cache.fake_scratchpad_data, 0, c);// lui at, 28672 + // nop // sll r0, r0, 0 + c->lw(v1, 80, at); // lw v1, 80(at) + // nop // sll r0, r0, 0 + c->lw(a0, 60, at); // lw a0, 60(at) + bc = c->sgpr64(v1) == 0; // beq v1, r0, L44 + // nop // sll r0, r0, 0 + if (bc) {goto block_7;} // branch non-likely + + // nop // sll r0, r0, 0 + c->lw(t0, 8, v1); // lw t0, 8(v1) + // nop // sll r0, r0, 0 + c->lw(a2, 4, a0); // lw a2, 4(a0) + // nop // sll r0, r0, 0 + c->lh(a0, 0, v1); // lh a0, 0(v1) + // nop // sll r0, r0, 0 + c->lh(a1, 2, v1); // lh a1, 2(v1) + bc = c->sgpr64(a0) != 0; // bne a0, r0, L44 + c->lh(a0, 4, v1); // lh a0, 4(v1) + if (bc) {goto block_7;} // branch non-likely + + c->dsll(t1, a0, 5); // dsll t1, a0, 5 + c->lh(a0, 12, v1); // lh a0, 12(v1) + c->daddiu(a3, a1, 7); // daddiu a3, a1, 7 + c->lh(a1, 14, v1); // lh a1, 14(v1) + bc = c->sgpr64(a1) == 0; // beq a1, r0, L44 + c->daddu(v1, t1, a2); // daddu v1, t1, a2 + if (bc) {goto block_7;} // branch non-likely + + c->pextlh(a0, a0, a0); // pextlh a0, a0, a0 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pextlw(a0, a0, a0); // pextlw a0, a0, a0 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pcpyld(a0, a0, a0); // pcpyld a0, a0, a0 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pextlh(a1, a1, a1); // pextlh a1, a1, a1 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pextlw(a1, a1, a1); // pextlw a1, a1, a1 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pcpyld(a1, a1, a1); // pcpyld a1, a1, a1 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pextlw(a2, a2, a2); // pextlw a2, a2, a2 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pcpyld(a2, a2, a2); // pcpyld a2, a2, a2 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->dsra(a3, a3, 3); // dsra a3, a3, 3 + // nop // sll r0, r0, 0 + c->dsll(a3, a3, 4); // dsll a3, a3, 4 + c->ld(t1, 0, t0); // ld t1, 0(t0) + c->daddu(a3, t0, a3); // daddu a3, t0, a3 + c->daddiu(t0, t0, 8); // daddiu t0, t0, 8 + c->pextlb(t1, r0, t1); // pextlb t1, r0, t1 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->psllh(t2, t1, 5); // psllh t2, t1, 5 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pextuh(t1, r0, t2); // pextuh t1, r0, t2 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pextlh(t2, r0, t2); // pextlh t2, r0, t2 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->paddw(t2, t2, a2); // paddw t2, t2, a2 + c->mfc1(r0, f31); // mfc1 r0, f31 + //beq r0, r0, L43 // beq r0, r0, L43 + c->pcpyud(t5, t2, r0); // pcpyud t5, t2, r0 + goto block_5; // branch always + + + block_4: + c->dsrl32(t5, t6, 0); // dsrl32 t5, t6, 0 + c->dsrl32(t4, t3, 0); // dsrl32 t4, t3, 0 + c->pextuh(t1, r0, t2); // pextuh t1, r0, t2 + c->sw(t6, 16, v1); // sw t6, 16(v1) + c->pextlh(t2, r0, t2); // pextlh t2, r0, t2 + c->sw(t5, 48, v1); // sw t5, 48(v1) + c->paddw(t2, t2, a2); // paddw t2, t2, a2 + c->sw(t3, 80, v1); // sw t3, 80(v1) + c->pcpyud(t5, t2, r0); // pcpyud t5, t2, r0 + c->sw(t4, 112, v1); // sw t4, 112(v1) + c->daddiu(t0, t0, 8); // daddiu t0, t0, 8 + c->daddiu(v1, v1, 128); // daddiu v1, v1, 128 + + block_5: + c->paddw(t1, t1, a2); // paddw t1, t1, a2 + c->lwu(t3, 16, t2); // lwu t3, 16(t2) + c->pcpyud(t6, t1, r0); // pcpyud t6, t1, r0 + c->lwu(t4, 16, t5); // lwu t4, 16(t5) + c->dsrl32(t8, t2, 0); // dsrl32 t8, t2, 0 + c->lwu(t2, 16, t1); // lwu t2, 16(t1) + c->dsrl32(t9, t5, 0); // dsrl32 t9, t5, 0 + c->lwu(t5, 16, t6); // lwu t5, 16(t6) + c->dsrl32(t7, t1, 0); // dsrl32 t7, t1, 0 + c->lwu(t1, 16, t8); // lwu t1, 16(t8) + c->dsrl32(t8, t6, 0); // dsrl32 t8, t6, 0 + c->lwu(t6, 16, t9); // lwu t6, 16(t9) + c->pextlw(t4, t4, t3); // pextlw t4, t4, t3 + c->lwu(t3, 16, t7); // lwu t3, 16(t7) + c->pextlw(t2, t5, t2); // pextlw t2, t5, t2 + c->lwu(t5, 16, t8); // lwu t5, 16(t8) + c->pcpyld(t2, t2, t4); // pcpyld t2, t2, t4 + c->lwu(t4, 16, v1); // lwu t4, 16(v1) + c->pextlw(t6, t6, t1); // pextlw t6, t6, t1 + c->lwu(t1, 48, v1); // lwu t1, 48(v1) + c->pextlw(t3, t5, t3); // pextlw t3, t5, t3 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pcpyld(t3, t3, t6); // pcpyld t3, t3, t6 + c->lwu(t5, 80, v1); // lwu t5, 80(v1) + c->pextlw(t1, t1, t4); // pextlw t1, t1, t4 + c->lwu(t4, 112, v1); // lwu t4, 112(v1) + c->pmulth(r0, t2, a1); // pmulth r0, t2, a1 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pextlw(t2, t4, t5); // pextlw t2, t4, t5 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pmaddh(r0, t3, a1); // pmaddh r0, t3, a1 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pcpyld(t1, t2, t1); // pcpyld t1, t2, t1 + c->ld(t2, 0, t0); // ld t2, 0(t0) + c->pmaddh(r0, t1, a0); // pmaddh r0, t1, a0 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pextlb(t1, r0, t2); // pextlb t1, r0, t2 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->psllh(t2, t1, 5); // psllh t2, t1, 5 + c->mfc1(r0, f31); // mfc1 r0, f31 + // Unknown instr: pmfhl.lw t3 + c->pmfhl_lw(t3); + c->mfc1(r0, f31); // mfc1 r0, f31 + // Unknown instr: pmfhl.uw t1 + c->pmfhl_uw(t1); + c->mfc1(r0, f31); // mfc1 r0, f31 + c->psraw(t3, t3, 8); // psraw t3, t3, 8 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->psraw(t1, t1, 8); // psraw t1, t1, 8 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pinteh(t6, t1, t3); // pinteh t6, t1, t3 + c->mfc1(r0, f31); // mfc1 r0, f31 + bc = c->sgpr64(t0) != c->sgpr64(a3); // bne t0, a3, L42 + c->pcpyud(t3, t6, r0); // pcpyud t3, t6, r0 + if (bc) {goto block_4;} // branch non-likely + + c->dsrl32(a0, t6, 0); // dsrl32 a0, t6, 0 + c->sw(t6, 16, v1); // sw t6, 16(v1) + c->dsrl32(a1, t3, 0); // dsrl32 a1, t3, 0 + c->sw(a0, 48, v1); // sw a0, 48(v1) + // nop // sll r0, r0, 0 + c->sw(t3, 80, v1); // sw t3, 80(v1) + // nop // sll r0, r0, 0 + c->sw(a1, 112, v1); // sw a1, 112(v1) + + block_7: + //jr ra // jr ra + c->daddu(sp, sp, r0); // daddu sp, sp, r0 + goto end_of_function; // return + + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + end_of_function: + return c->gprs[v0].du64[0]; +} + +void link() { + cache.fake_scratchpad_data = intern_from_c("*fake-scratchpad-data*").c(); + gLinkedFunctionTable.reg("generic-interp-dproc", execute, 128); +} + +} // namespace generic_interp_dproc +} // namespace Mips2C + +//--------------------------MIPS2C--------------------- +#include "game/mips2c/mips2c_private.h" +#include "game/kernel/kscheme.h" +namespace Mips2C { +namespace generic_no_light_dproc { +struct Cache { + void* fake_scratchpad_data; // *fake-scratchpad-data* +} cache; + +u64 execute(void* ctxt) { + auto* c = (ExecutionContext*)ctxt; + bool bc = false; + u32 call_addr = 0; + c->daddiu(sp, sp, -128); // daddiu sp, sp, -128 + c->sd(ra, 12432, at); // sd ra, 12432(at) + c->sq(s0, 12448, at); // sq s0, 12448(at) + c->sq(s1, 12464, at); // sq s1, 12464(at) + c->sq(s2, 12480, at); // sq s2, 12480(at) + c->sq(s3, 12496, at); // sq s3, 12496(at) + c->sq(s4, 12512, at); // sq s4, 12512(at) + c->sq(s5, 12528, at); // sq s5, 12528(at) + c->sq(gp, 12544, at); // sq gp, 12544(at) + get_fake_spad_addr(at, cache.fake_scratchpad_data, 0, c);// lui at, 28672 + // nop // sll r0, r0, 0 + c->lw(a1, 60, at); // lw a1, 60(at) + // nop // sll r0, r0, 0 + c->lw(a0, 52, at); // lw a0, 52(at) + // nop // sll r0, r0, 0 + c->lw(v1, 0, a1); // lw v1, 0(a1) + // nop // sll r0, r0, 0 + c->lw(a2, 4, a1); // lw a2, 4(a1) + c->daddiu(a0, a0, 3); // daddiu a0, a0, 3 + // nop // sll r0, r0, 0 + c->dsra(a0, a0, 2); // dsra a0, a0, 2 + // nop // sll r0, r0, 0 + c->dsll(a0, a0, 3); // dsll a0, a0, 3 + c->addiu(a3, r0, 255); // addiu a3, r0, 255 + c->lui(a1, -2); // lui a1, -2 + c->addiu(t1, r0, 256); // addiu t1, r0, 256 + c->ori(a1, a1, 65534); // ori a1, a1, 65534 + c->daddu(a0, v1, a0); // daddu a0, v1, a0 + c->pextlw(a1, a1, a1); // pextlw a1, a1, a1 + c->lw(t2, 20, at); // lw t2, 20(at) + c->pextlw(a1, a1, a1); // pextlw a1, a1, a1 + c->lw(t3, 24, at); // lw t3, 24(at) + c->pextlw(a2, a2, a2); // pextlw a2, a2, a2 + c->lw(t5, 28, at); // lw t5, 28(at) + c->pextlw(a2, a2, a2); // pextlw a2, a2, a2 + c->lw(t4, 32, at); // lw t4, 32(at) + c->pcpyh(a3, a3); // pcpyh a3, a3 + c->lw(t6, 36, at); // lw t6, 36(at) + c->pcpyld(a3, a3, a3); // pcpyld a3, a3, a3 + c->lq(t0, 12160, at); // lq t0, 12160(at) + c->pcpyh(t1, t1); // pcpyh t1, t1 + c->ld(t7, 0, v1); // ld t7, 0(v1) + c->pcpyld(t1, t1, t1); // pcpyld t1, t1, t1 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pextlh(t8, r0, t7); // pextlh t8, r0, t7 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pand(t7, t8, a3); // pand t7, t8, a3 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->psllw(t7, t7, 5); // psllw t7, t7, 5 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->daddiu(t2, t2, -48); // daddiu t2, t2, -48 + c->daddiu(t3, t3, -16); // daddiu t3, t3, -16 + c->daddiu(t4, t4, -16); // daddiu t4, t4, -16 + c->daddiu(t5, t5, -16); // daddiu t5, t5, -16 + //beq r0, r0, L34 // beq r0, r0, L34 + c->daddiu(t6, t6, -16); // daddiu t6, t6, -16 + goto block_3; // branch always + + // nop // sll r0, r0, 0 + + block_2: + c->pextlh(t8, r0, gp); // pextlh t8, r0, gp + c->sq(t7, 0, t2); // sq t7, 0(t2) + c->pand(t7, t8, a3); // pand t7, t8, a3 + c->sq(t9, 16, t2); // sq t9, 16(t2) + c->psllw(t7, t7, 5); // psllw t7, t7, 5 + c->sq(ra, 32, t2); // sq ra, 32(t2) + + block_3: + c->paddw(s3, t7, a2); // paddw s3, t7, a2 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->dsrl32(s2, s3, 0); // dsrl32 s2, s3, 0 + c->daddiu(t2, t2, 48); // daddiu t2, t2, 48 + c->pcpyud(s5, s3, r0); // pcpyud s5, s3, r0 + c->lq(t7, 0, s3); // lq t7, 0(s3) + c->dsrl32(s4, s5, 0); // dsrl32 s4, s5, 0 + c->daddiu(t3, t3, 16); // daddiu t3, t3, 16 + c->pand(t8, t8, t1); // pand t8, t8, t1 + c->lq(t9, 0, s2); // lq t9, 0(s2) + c->psraw(gp, t8, 8); // psraw gp, t8, 8 + c->lq(t8, 0, s5); // lq t8, 0(s5) + c->pextuw(s1, t9, t7); // pextuw s1, t9, t7 + c->lq(ra, 0, s4); // lq ra, 0(s4) + c->daddiu(t5, t5, 16); // daddiu t5, t5, 16 + c->daddiu(v1, v1, 8); // daddiu v1, v1, 8 + c->daddiu(t4, t4, 16); // daddiu t4, t4, 16 + c->daddiu(t6, t6, 16); // daddiu t6, t6, 16 + c->pextuw(s0, ra, t8); // pextuw s0, ra, t8 + c->lq(s3, 16, s3); // lq s3, 16(s3) + c->pcpyud(s1, s1, s0); // pcpyud s1, s1, s0 + c->lq(s2, 16, s2); // lq s2, 16(s2) + c->paddh(s0, s1, t0); // paddh s0, s1, t0 + c->lq(s1, 16, s5); // lq s1, 16(s5) + c->pand(s5, s0, a1); // pand s5, s0, a1 + c->lq(s0, 16, s4); // lq s0, 16(s4) + c->pextlw(s4, s2, s3); // pextlw s4, s2, s3 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pextuw(s3, s2, s3); // pextuw s3, s2, s3 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pextlw(s2, s0, s1); // pextlw s2, s0, s1 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pextuw(s0, s0, s1); // pextuw s0, s0, s1 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pcpyld(s1, s2, s4); // pcpyld s1, s2, s4 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pcpyud(s4, s4, s2); // pcpyud s4, s4, s2 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pcpyud(s3, s3, s0); // pcpyud s3, s3, s0 + c->sq(s4, 0, t4); // sq s4, 0(t4) + c->pand(s4, s1, a1); // pand s4, s1, a1 + c->sq(s3, 0, t3); // sq s3, 0(t3) + c->por(s4, s4, gp); // por s4, s4, gp + c->mfc1(r0, f31); // mfc1 r0, f31 + c->por(gp, s5, gp); // por gp, s5, gp + c->sq(s4, 0, t6); // sq s4, 0(t6) + c->prot3w(ra, ra); // prot3w ra, ra + c->sq(gp, 0, t5); // sq gp, 0(t5) + c->prot3w(t9, t9); // prot3w t9, t9 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pextuw(s5, t9, t7); // pextuw s5, t9, t7 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pcpyld(t9, t8, t9); // pcpyld t9, t8, t9 + c->ld(gp, 0, v1); // ld gp, 0(v1) + c->pcpyld(t7, s5, t7); // pcpyld t7, s5, t7 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pextuw(t8, ra, t8); // pextuw t8, ra, t8 + c->mfc1(r0, f31); // mfc1 r0, f31 + bc = c->sgpr64(v1) != c->sgpr64(a0); // bne v1, a0, L33 + c->pcpyld(ra, ra, t8); // pcpyld ra, ra, t8 + if (bc) {goto block_2;} // branch non-likely + + // nop // sll r0, r0, 0 + c->sq(t7, 0, t2); // sq t7, 0(t2) + // nop // sll r0, r0, 0 + c->sq(t9, 16, t2); // sq t9, 16(t2) + // nop // sll r0, r0, 0 + c->sq(ra, 32, t2); // sq ra, 32(t2) + c->gprs[v0].du64[0] = 0; // or v0, r0, r0 + c->ld(ra, 12432, at); // ld ra, 12432(at) + c->lq(gp, 12544, at); // lq gp, 12544(at) + c->lq(s5, 12528, at); // lq s5, 12528(at) + c->lq(s4, 12512, at); // lq s4, 12512(at) + c->lq(s3, 12496, at); // lq s3, 12496(at) + c->lq(s2, 12480, at); // lq s2, 12480(at) + c->lq(s1, 12464, at); // lq s1, 12464(at) + c->lq(s0, 12448, at); // lq s0, 12448(at) + //jr ra // jr ra + c->daddiu(sp, sp, 128); // daddiu sp, sp, 128 + goto end_of_function; // return + + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + end_of_function: + return c->gprs[v0].du64[0]; +} + +void link() { + cache.fake_scratchpad_data = intern_from_c("*fake-scratchpad-data*").c(); + gLinkedFunctionTable.reg("generic-no-light-dproc", execute, 256); +} + +} // namespace generic_no_light_dproc +} // namespace Mips2C + + diff --git a/game/mips2c/functions/generic_tie.cpp b/game/mips2c/functions/generic_tie.cpp new file mode 100644 index 0000000000..5f127d0a8c --- /dev/null +++ b/game/mips2c/functions/generic_tie.cpp @@ -0,0 +1,2201 @@ +// clang-format off +//--------------------------MIPS2C--------------------- +#include "game/mips2c/mips2c_private.h" +#include "game/kernel/kscheme.h" +namespace Mips2C { +namespace generic_tie_dma_to_spad_sync { +struct Cache { + void* fake_scratchpad_data; // *fake-scratchpad-data* +} cache; + +u64 execute(void* ctxt) { + auto* c = (ExecutionContext*)ctxt; + bool bc = false; + u32 call_addr = 0; + // nop // sll r0, r0, 0 + get_fake_spad_addr(at, cache.fake_scratchpad_data, 0, c);// lui at, 28672 + c->ori(a2, r0, 65535); // ori a2, r0, 65535 + c->lui(v1, 4096); // lui v1, 4096 + // nop // sll r0, r0, 0 + c->ori(v1, v1, 54272); // ori v1, v1, 54272 // SPR TO + c->and_(a2, a1, a2); // and a2, a1, a2 + /* + block_1: + c->lw(a3, 0, v1); // lw a3, 0(v1) + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->andi(a3, a3, 256); // andi a3, a3, 256 + // nop // sll r0, r0, 0 + bc = c->sgpr64(a3) == 0; // beq a3, r0, L90 + // nop // sll r0, r0, 0 + if (bc) {goto block_3;} // branch non-likely + + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->daddiu(a1, a1, 1); // daddiu a1, a1, 1 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + //beq r0, r0, L89 // beq r0, r0, L89 + // nop // sll r0, r0, 0 + goto block_1; // branch always + */ + + + block_3: + c->addiu(a3, r0, 324); // addiu a3, r0, 324 + // c->sw(a2, 128, v1); // sw a2, 128(v1) + u32 sadr = c->sgpr64(a2); + // c->sw(a0, 48, v1); // sw a0, 48(v1) + u32 tadr = c->sgpr64(a0); + // c->sw(r0, 32, v1); // sw r0, 32(v1) + // Unknown instr: sync.l + // c->sw(a3, 0, v1); // sw a3, 0(v1) + // same and hack as generic merc. + spad_to_dma_blerc_chain(cache.fake_scratchpad_data, sadr & 0x3fff, tadr); + + /* + block_4: + c->lw(a0, 0, v1); // lw a0, 0(v1) + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->andi(a0, a0, 256); // andi a0, a0, 256 + // nop // sll r0, r0, 0 + bc = c->sgpr64(a0) == 0; // beq a0, r0, L92 + // nop // sll r0, r0, 0 + if (bc) {goto block_6;} // branch non-likely + + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->daddiu(a1, a1, 1); // daddiu a1, a1, 1 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + //beq r0, r0, L91 // beq r0, r0, L91 + // nop // sll r0, r0, 0 + goto block_4; // branch always + */ + + + block_6: + c->gprs[v0].du64[0] = 0; // or v0, r0, r0 + //jr ra // jr ra + c->daddu(sp, sp, r0); // daddu sp, sp, r0 + goto end_of_function; // return + + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + end_of_function: + return c->gprs[v0].du64[0]; +} + +void link() { + cache.fake_scratchpad_data = intern_from_c("*fake-scratchpad-data*").c(); + gLinkedFunctionTable.reg("generic-tie-dma-to-spad-sync", execute, 128); +} + +} // namespace generic_tie_dma_to_spad_sync +} // namespace Mips2C + +//--------------------------MIPS2C--------------------- +#include "game/mips2c/mips2c_private.h" +#include "game/kernel/kscheme.h" +namespace Mips2C { + +namespace generic_prepare_dma_double { +extern u64 execute(void* ctxt); +} + +namespace generic_envmap_dproc { +extern u64 execute(void* ctxt); +} +namespace generic_interp_dproc { +extern u64 execute(void* ctxt); +} +namespace generic_no_light_dproc { +extern u64 execute(void* ctxt); +} + +namespace generic_tie_convert { +struct Cache { + void* fake_scratchpad_data; // *fake-scratchpad-data* +} cache; + +u16 vis[16]; + +u8 vu0_data_mem[1024 * 4]; + +void sq_buffer(Mask mask, const Vf& data, u32 qw) { + ASSERT(qw * 16 < sizeof(vu0_data_mem)); + for (int i = 0; i < 4; i++) { + if ((u64)mask & (1 << i)) { + memcpy(vu0_data_mem + qw * 16 + i * 4, data.data + i, 4); + } + } +} + +void lq_buffer(Mask mask, Vf& data, u32 qw) { + ASSERT(qw * 16 < sizeof(vu0_data_mem)); + for (int i = 0; i < 4; i++) { + if ((u64)mask & (1 << i)) { + memcpy(data.data + i, vu0_data_mem + qw * 16 + i * 4, 4); + } + } +} + + +void vcallms_104(ExecutionContext* c) { + // iaddi vi02, vi00, 0x0 | nop 104 + vis[vi02] = 0; + // iadd vi03, vi02, vi08 | nop 105 + vis[vi03] = vis[vi02] + vis[vi08]; + // iaddiu vi03, vi03, 0x10 | nop 106 + vis[vi03] = vis[vi03] + 0x10; /* 16 */ + // iadd vi01, vi03, vi09 | nop 107 + vis[vi01] = vis[vi03] + vis[vi09]; + // iadd vi01, vi01, vi09 | nop 108 + vis[vi01] = vis[vi01] + vis[vi09]; + // iaddiu vi01, vi01, 0x10 | nop 109 + vis[vi01] = vis[vi01] + 0x10; /* 16 */ + // iaddi vi10, vi00, 0x0 | nop 110 + vis[vi10] = 0; + // ior vi11, vi03, vi00 | nop 111 + vis[vi11] = vis[vi03]; + // ior vi12, vi01, vi00 | nop :e 112 + vis[vi12] = vis[vi01]; + // iadd vi13, vi01, vi08 | nop 113 + vis[vi13] = vis[vi01] + vis[vi08]; +} + +void vcallms_114(ExecutionContext* c) { + // nop | itof12.xyzw vf09, vf05 114 + c->vfs[vf09].vf.itof12(Mask::xyzw, c->vf_src(vf05).vf); + // nop | itof12.xyzw vf10, vf06 115 + c->vfs[vf10].vf.itof12(Mask::xyzw, c->vf_src(vf06).vf); + // nop | itof12.xyzw vf11, vf07 116 + c->vfs[vf11].vf.itof12(Mask::xyzw, c->vf_src(vf07).vf); + // nop | itof12.xyzw vf12, vf08 117 + c->vfs[vf12].vf.itof12(Mask::xyzw, c->vf_src(vf08).vf); + // sqi.xyzw vf09, vi01 | nop 118 + sq_buffer(Mask::xyzw, c->vf_src(vf09).vf, vis[vi01]++); + // sqi.xyzw vf10, vi01 | nop 119 + sq_buffer(Mask::xyzw, c->vf_src(vf10).vf, vis[vi01]++); + // sqi.xyzw vf11, vi01 | nop :e 120 + sq_buffer(Mask::xyzw, c->vf_src(vf11).vf, vis[vi01]++); + // sqi.xyzw vf12, vi01 | nop 121 + sq_buffer(Mask::xyzw, c->vf_src(vf12).vf, vis[vi01]++); +} + +void vcallms_122(ExecutionContext* c) { + // mr32.w vf17, vf13 | itof0.xyz vf09, vf01 122 + c->vfs[vf09].vf.itof0(Mask::xyz, c->vf_src(vf01).vf); c->vfs[vf17].vf.mr32(Mask::w, c->vf_src(vf13).vf); + // mr32.w vf18, vf14 | itof0.xyz vf10, vf02 123 + c->vfs[vf10].vf.itof0(Mask::xyz, c->vf_src(vf02).vf); c->vfs[vf18].vf.mr32(Mask::w, c->vf_src(vf14).vf); + // mr32.w vf19, vf15 | itof0.xyz vf11, vf03 124 + c->vfs[vf11].vf.itof0(Mask::xyz, c->vf_src(vf03).vf); c->vfs[vf19].vf.mr32(Mask::w, c->vf_src(vf15).vf); + // mr32.w vf20, vf16 | itof0.xyz vf12, vf04 125 + c->vfs[vf12].vf.itof0(Mask::xyz, c->vf_src(vf04).vf); c->vfs[vf20].vf.mr32(Mask::w, c->vf_src(vf16).vf); + // move.w vf09, vf17 | nop 126 + c->vfs[vf09].vf.move(Mask::w, c->vf_src(vf17).vf); + // move.w vf10, vf18 | nop 127 + c->vfs[vf10].vf.move(Mask::w, c->vf_src(vf18).vf); + // move.w vf11, vf19 | nop 128 + c->vfs[vf11].vf.move(Mask::w, c->vf_src(vf19).vf); + // move.w vf12, vf20 | nop 129 + c->vfs[vf12].vf.move(Mask::w, c->vf_src(vf20).vf); + // sqi.xyzw vf09, vi02 | nop 130 + sq_buffer(Mask::xyzw, c->vf_src(vf09).vf, vis[vi02]++); + // sqi.xyzw vf10, vi02 | nop 131 + sq_buffer(Mask::xyzw, c->vf_src(vf10).vf, vis[vi02]++); + // sqi.xyzw vf11, vi02 | nop :e 132 + sq_buffer(Mask::xyzw, c->vf_src(vf11).vf, vis[vi02]++); + // sqi.xyzw vf12, vi02 | nop 133 + sq_buffer(Mask::xyzw, c->vf_src(vf12).vf, vis[vi02]++); +} + +void vcallms_134(ExecutionContext* c) { + // mr32.w vf17, vf13 | itof0.xyz vf09, vf01 134 + c->vfs[vf09].vf.itof0(Mask::xyz, c->vf_src(vf01).vf); c->vfs[vf17].vf.mr32(Mask::w, c->vf_src(vf13).vf); + // mr32.w vf18, vf14 | itof0.xyz vf10, vf02 135 + c->vfs[vf10].vf.itof0(Mask::xyz, c->vf_src(vf02).vf); c->vfs[vf18].vf.mr32(Mask::w, c->vf_src(vf14).vf); + // nop | itof0.xyz vf11, vf03 136 + c->vfs[vf11].vf.itof0(Mask::xyz, c->vf_src(vf03).vf); + // nop | nop 137 + + // move.w vf09, vf17 | nop 138 + c->vfs[vf09].vf.move(Mask::w, c->vf_src(vf17).vf); + // move.w vf10, vf18 | nop 139 + c->vfs[vf10].vf.move(Mask::w, c->vf_src(vf18).vf); + // nop | nop 140 + + // iaddi vi03, vi03, 0x2 | nop 141 + vis[vi03] = vis[vi03] + 2; + // sqi.xyzw vf09, vi02 | nop 142 + sq_buffer(Mask::xyzw, c->vf_src(vf09).vf, vis[vi02]++); + // sq.xyzw vf10, -2(vi03) | nop :e 143 + sq_buffer(Mask::xyzw, c->vf_src(vf10).vf, vis[vi03] + -2); + // sq.xyzw vf11, -1(vi03) | nop 144 + sq_buffer(Mask::xyzw, c->vf_src(vf11).vf, vis[vi03] + -1); +} + +void vcallms_145(ExecutionContext* c) { + // mr32.w vf17, vf13 | itof0.xyz vf09, vf01 145 + c->vfs[vf09].vf.itof0(Mask::xyz, c->vf_src(vf01).vf); c->vfs[vf17].vf.mr32(Mask::w, c->vf_src(vf13).vf); + // mr32.w vf18, vf14 | itof0.xyz vf10, vf02 146 + c->vfs[vf10].vf.itof0(Mask::xyz, c->vf_src(vf02).vf); c->vfs[vf18].vf.mr32(Mask::w, c->vf_src(vf14).vf); + // mr32.w vf19, vf15 | itof0.xyz vf11, vf03 147 + c->vfs[vf11].vf.itof0(Mask::xyz, c->vf_src(vf03).vf); c->vfs[vf19].vf.mr32(Mask::w, c->vf_src(vf15).vf); + // nop | itof0.xyz vf12, vf04 148 + c->vfs[vf12].vf.itof0(Mask::xyz, c->vf_src(vf04).vf); + // move.w vf09, vf17 | nop 149 + c->vfs[vf09].vf.move(Mask::w, c->vf_src(vf17).vf); + // move.w vf10, vf18 | nop 150 + c->vfs[vf10].vf.move(Mask::w, c->vf_src(vf18).vf); + // move.w vf11, vf19 | nop 151 + c->vfs[vf11].vf.move(Mask::w, c->vf_src(vf19).vf); + // iaddi vi03, vi03, 0x2 | nop 152 + vis[vi03] = vis[vi03] + 2; + // sqi.xyzw vf09, vi02 | nop 153 + sq_buffer(Mask::xyzw, c->vf_src(vf09).vf, vis[vi02]++); + // sqi.xyzw vf10, vi02 | nop 154 + sq_buffer(Mask::xyzw, c->vf_src(vf10).vf, vis[vi02]++); + // sq.xyzw vf11, -2(vi03) | nop :e 155 + sq_buffer(Mask::xyzw, c->vf_src(vf11).vf, vis[vi03] + -2); + // sq.xyzw vf12, -1(vi03) | nop 156 + sq_buffer(Mask::xyzw, c->vf_src(vf12).vf, vis[vi03] + -1); +} + +void vcallms_157(ExecutionContext* c) { + // mr32.w vf17, vf13 | itof0.xyz vf09, vf01 157 + c->vfs[vf09].vf.itof0(Mask::xyz, c->vf_src(vf01).vf); c->vfs[vf17].vf.mr32(Mask::w, c->vf_src(vf13).vf); + // mr32.w vf18, vf14 | itof0.xyz vf10, vf02 158 + c->vfs[vf10].vf.itof0(Mask::xyz, c->vf_src(vf02).vf); c->vfs[vf18].vf.mr32(Mask::w, c->vf_src(vf14).vf); + // mr32.w vf19, vf15 | itof0.xyz vf11, vf03 159 + c->vfs[vf11].vf.itof0(Mask::xyz, c->vf_src(vf03).vf); c->vfs[vf19].vf.mr32(Mask::w, c->vf_src(vf15).vf); + // nop | nop 160 + + // move.w vf09, vf17 | nop 161 + c->vfs[vf09].vf.move(Mask::w, c->vf_src(vf17).vf); + // move.w vf10, vf18 | nop 162 + c->vfs[vf10].vf.move(Mask::w, c->vf_src(vf18).vf); + // move.w vf11, vf19 | nop 163 + c->vfs[vf11].vf.move(Mask::w, c->vf_src(vf19).vf); + // nop | nop 164 + + // sqi.xyzw vf09, vi02 | nop 165 + sq_buffer(Mask::xyzw, c->vf_src(vf09).vf, vis[vi02]++); + // sqi.xyzw vf10, vi02 | nop :e 166 + sq_buffer(Mask::xyzw, c->vf_src(vf10).vf, vis[vi02]++); + // sqi.xyzw vf11, vi02 | nop 167 + sq_buffer(Mask::xyzw, c->vf_src(vf11).vf, vis[vi02]++); +} + +void vcallms_168(ExecutionContext* c) { + // mr32.w vf17, vf13 | itof0.xyz vf09, vf01 168 + c->vfs[vf09].vf.itof0(Mask::xyz, c->vf_src(vf01).vf); c->vfs[vf17].vf.mr32(Mask::w, c->vf_src(vf13).vf); + // mr32.w vf19, vf14 | itof0.xyz vf10, vf02 169 + c->vfs[vf10].vf.itof0(Mask::xyz, c->vf_src(vf02).vf); c->vfs[vf19].vf.mr32(Mask::w, c->vf_src(vf14).vf); + // nop | itof0.xyz vf11, vf03 170 + c->vfs[vf11].vf.itof0(Mask::xyz, c->vf_src(vf03).vf); + // iaddi vi03, vi03, 0x4 | itof0.xyz vf12, vf04 171 + c->vfs[vf12].vf.itof0(Mask::xyz, c->vf_src(vf04).vf); vis[vi03] = vis[vi03] + 4; + // move.w vf09, vf17 | nop 172 + c->vfs[vf09].vf.move(Mask::w, c->vf_src(vf17).vf); + // move.w vf11, vf19 | nop 173 + c->vfs[vf11].vf.move(Mask::w, c->vf_src(vf19).vf); + // sq.xyz vf10, -3(vi03) | nop 174 + sq_buffer(Mask::xyz, c->vf_src(vf10).vf, vis[vi03] + -3); + // sq.xyz vf12, -1(vi03) | nop 175 + sq_buffer(Mask::xyz, c->vf_src(vf12).vf, vis[vi03] + -1); + // sq.xyzw vf09, -4(vi03) | nop :e 176 + sq_buffer(Mask::xyzw, c->vf_src(vf09).vf, vis[vi03] + -4); + // sq.xyzw vf11, -2(vi03) | nop 177 + sq_buffer(Mask::xyzw, c->vf_src(vf11).vf, vis[vi03] + -2); +} + +void vcallms_183(ExecutionContext* c); + +void vcallms_178(ExecutionContext* c) { + // ior vi02, vi10, vi00 | nop 178 + vis[vi02] = vis[vi10]; + // ior vi01, vi12, vi00 | nop 179 + vis[vi01] = vis[vi12]; + // lqi.xyzw vf05, vi02 | nop 180 + lq_buffer(Mask::xyzw, c->vfs[vf05].vf, vis[vi02]++); + // nop | nop 181 + + // nop | nop 182 + vcallms_183(c); +} + +void vcallms_183(ExecutionContext* c) { + // lqi.xyzw vf09, vi01 | mulaw.xyzw ACC, vf04, vf00 183 + c->acc.vf.mula(Mask::xyzw, c->vf_src(vf04).vf, c->vf_src(vf00).vf.w()); lq_buffer(Mask::xyzw, c->vfs[vf09].vf, vis[vi01]++); + // move.xyzw vf19, vf21 | maddax.xyzw ACC, vf01, vf05 184 + c->acc.vf.madda(Mask::xyzw, c->vfs[vf01].vf, c->vfs[vf05].vf.x()); c->vfs[vf19].vf.move(Mask::xyzw, c->vf_src(vf21).vf); + // move.xyzw vf16, vf22 | madday.xyzw ACC, vf02, vf05 185 + c->acc.vf.madda(Mask::xyzw, c->vfs[vf02].vf, c->vfs[vf05].vf.y()); c->vfs[vf16].vf.move(Mask::xyzw, c->vf_src(vf22).vf); + // move.xyzw vf20, vf23 | maddz.xyz vf13, vf03, vf05 186 + c->acc.vf.madd(Mask::xyz, c->vfs[vf13].vf, c->vf_src(vf03).vf, c->vf_src(vf05).vf.z()); c->vfs[vf20].vf.move(Mask::xyzw, c->vf_src(vf23).vf); + // lqi.xyzw vf06, vi02 | mulax.xyzw ACC, vf01, vf09 187 + c->acc.vf.mula(Mask::xyzw, c->vf_src(vf01).vf, c->vf_src(vf09).vf.x()); lq_buffer(Mask::xyzw, c->vfs[vf06].vf, vis[vi02]++); + // move.xyzw vf15, vf24 | madday.xyzw ACC, vf02, vf09 188 + c->acc.vf.madda(Mask::xyzw, c->vfs[vf02].vf, c->vfs[vf09].vf.y()); c->vfs[vf15].vf.move(Mask::xyzw, c->vf_src(vf24).vf); + // nop | maddz.xyzw vf17, vf03, vf09 189 + c->acc.vf.madd(Mask::xyzw, c->vfs[vf17].vf, c->vf_src(vf03).vf, c->vf_src(vf09).vf.z()); + // lqi.xyzw vf10, vi01 | mulaw.xyzw ACC, vf04, vf00 190 + c->acc.vf.mula(Mask::xyzw, c->vf_src(vf04).vf, c->vf_src(vf00).vf.w()); lq_buffer(Mask::xyzw, c->vfs[vf10].vf, vis[vi01]++); + // move.w vf13, vf05 | maddax.xyzw ACC, vf01, vf06 191 + c->acc.vf.madda(Mask::xyzw, c->vfs[vf01].vf, c->vfs[vf06].vf.x()); c->vfs[vf13].vf.move(Mask::w, c->vf_src(vf05).vf); + // nop | madday.xyzw ACC, vf02, vf06 192 + c->acc.vf.madda(Mask::xyzw, c->vfs[vf02].vf, c->vfs[vf06].vf.y()); + // nop | maddz.xyz vf14, vf03, vf06 193 + c->acc.vf.madd(Mask::xyz, c->vfs[vf14].vf, c->vf_src(vf03).vf, c->vf_src(vf06).vf.z()); + // lqi.xyzw vf07, vi02 | mulax.xyzw ACC, vf01, vf10 194 + c->acc.vf.mula(Mask::xyzw, c->vf_src(vf01).vf, c->vf_src(vf10).vf.x()); lq_buffer(Mask::xyzw, c->vfs[vf07].vf, vis[vi02]++); + // nop | madday.xyzw ACC, vf02, vf10 195 + c->acc.vf.madda(Mask::xyzw, c->vfs[vf02].vf, c->vfs[vf10].vf.y()); + // nop | maddz.xyzw vf18, vf03, vf10 196 + c->acc.vf.madd(Mask::xyzw, c->vfs[vf18].vf, c->vf_src(vf03).vf, c->vf_src(vf10).vf.z()); + // lqi.xyzw vf11, vi01 | mulaw.xyzw ACC, vf04, vf00 197 + c->acc.vf.mula(Mask::xyzw, c->vf_src(vf04).vf, c->vf_src(vf00).vf.w()); lq_buffer(Mask::xyzw, c->vfs[vf11].vf, vis[vi01]++); + // move.w vf14, vf06 | maddax.xyzw ACC, vf01, vf07 198 + c->acc.vf.madda(Mask::xyzw, c->vfs[vf01].vf, c->vfs[vf07].vf.x()); c->vfs[vf14].vf.move(Mask::w, c->vf_src(vf06).vf); + // nop | madday.xyzw ACC, vf02, vf07 199 + c->acc.vf.madda(Mask::xyzw, c->vfs[vf02].vf, c->vfs[vf07].vf.y()); + // nop | maddz.xyz vf24, vf03, vf07 200 + c->acc.vf.madd(Mask::xyz, c->vfs[vf24].vf, c->vf_src(vf03).vf, c->vf_src(vf07).vf.z()); + // lqi.xyzw vf08, vi02 | mulax.xyzw ACC, vf01, vf11 201 + c->acc.vf.mula(Mask::xyzw, c->vf_src(vf01).vf, c->vf_src(vf11).vf.x()); lq_buffer(Mask::xyzw, c->vfs[vf08].vf, vis[vi02]++); + // nop | madday.xyzw ACC, vf02, vf11 202 + c->acc.vf.madda(Mask::xyzw, c->vfs[vf02].vf, c->vfs[vf11].vf.y()); + // nop | maddz.xyzw vf21, vf03, vf11 203 + c->acc.vf.madd(Mask::xyzw, c->vfs[vf21].vf, c->vf_src(vf03).vf, c->vf_src(vf11).vf.z()); + // lqi.xyzw vf12, vi01 | mulaw.xyzw ACC, vf04, vf00 204 + c->acc.vf.mula(Mask::xyzw, c->vf_src(vf04).vf, c->vf_src(vf00).vf.w()); lq_buffer(Mask::xyzw, c->vfs[vf12].vf, vis[vi01]++); + // move.w vf24, vf07 | maddax.xyzw ACC, vf01, vf08 205 + c->acc.vf.madda(Mask::xyzw, c->vfs[vf01].vf, c->vfs[vf08].vf.x()); c->vfs[vf24].vf.move(Mask::w, c->vf_src(vf07).vf); + // nop | madday.xyzw ACC, vf02, vf08 206 + c->acc.vf.madda(Mask::xyzw, c->vfs[vf02].vf, c->vfs[vf08].vf.y()); + // nop | maddz.xyz vf22, vf03, vf08 207 + c->acc.vf.madd(Mask::xyz, c->vfs[vf22].vf, c->vf_src(vf03).vf, c->vf_src(vf08).vf.z()); + // lqi.xyzw vf05, vi02 | mulax.xyzw ACC, vf01, vf12 208 + c->acc.vf.mula(Mask::xyzw, c->vf_src(vf01).vf, c->vf_src(vf12).vf.x()); lq_buffer(Mask::xyzw, c->vfs[vf05].vf, vis[vi02]++); + // move.w vf22, vf08 | madday.xyzw ACC, vf02, vf12 :e 209 + c->acc.vf.madda(Mask::xyzw, c->vfs[vf02].vf, c->vfs[vf12].vf.y()); c->vfs[vf22].vf.move(Mask::w, c->vf_src(vf08).vf); + // nop | maddz.xyzw vf23, vf03, vf12 210 + c->acc.vf.madd(Mask::xyzw, c->vfs[vf23].vf, c->vf_src(vf03).vf, c->vf_src(vf12).vf.z()); +} + +void vcallms_211(ExecutionContext* c) { + // move.xyzw vf19, vf21 | nop 211 + c->vfs[vf19].vf.move(Mask::xyzw, c->vf_src(vf21).vf); + // move.xyzw vf16, vf22 | nop 212 + c->vfs[vf16].vf.move(Mask::xyzw, c->vf_src(vf22).vf); + // move.xyzw vf20, vf23 | nop :e 213 + c->vfs[vf20].vf.move(Mask::xyzw, c->vf_src(vf23).vf); + // move.xyzw vf15, vf24 | nop 214 + c->vfs[vf15].vf.move(Mask::xyzw, c->vf_src(vf24).vf); +} +void vcallms_221(ExecutionContext* c); + +void vcallms_215(ExecutionContext* c) { + // ior vi03, vi11, vi00 | nop 215 + vis[vi03] = vis[vi11]; + // ior vi01, vi13, vi00 | nop 216 + vis[vi01] = vis[vi13]; + // lqi.xyzw vf05, vi03 | nop 217 + lq_buffer(Mask::xyzw, c->vfs[vf05].vf, vis[vi03]++); + // lqi.xyzw vf25, vi03 | nop 218 + lq_buffer(Mask::xyzw, c->vfs[vf25].vf, vis[vi03]++); + // lqi.xyzw vf09, vi01 | nop 219 + lq_buffer(Mask::xyzw, c->vfs[vf09].vf, vis[vi01]++); + // nop | nop 220 + vcallms_221(c); +} + +void vcallms_221(ExecutionContext* c) { + // move.xyzw vf16, vf21 | mulax.xyz ACC, vf05, vf29 221 + c->acc.vf.mula(Mask::xyz, c->vf_src(vf05).vf, c->vf_src(vf29).vf.x()); c->vfs[vf16].vf.move(Mask::xyzw, c->vf_src(vf21).vf); + // nop | maddw.xyz vf30, vf25, vf00 222 + c->acc.vf.madd(Mask::xyz, c->vfs[vf30].vf, c->vf_src(vf25).vf, c->vf_src(vf00).vf.w()); + // nop | mulax.xyzw ACC, vf01, vf09 223 + c->acc.vf.mula(Mask::xyzw, c->vf_src(vf01).vf, c->vf_src(vf09).vf.x()); + // nop | madday.xyzw ACC, vf02, vf09 224 + c->acc.vf.madda(Mask::xyzw, c->vfs[vf02].vf, c->vfs[vf09].vf.y()); + // move.w vf13, vf05 | maddz.xyz vf17, vf03, vf09 225 + c->acc.vf.madd(Mask::xyz, c->vfs[vf17].vf, c->vf_src(vf03).vf, c->vf_src(vf09).vf.z()); c->vfs[vf13].vf.move(Mask::w, c->vf_src(vf05).vf); + // lqi.xyzw vf06, vi03 | mulaw.xyzw ACC, vf04, vf00 226 + c->acc.vf.mula(Mask::xyzw, c->vf_src(vf04).vf, c->vf_src(vf00).vf.w()); lq_buffer(Mask::xyzw, c->vfs[vf06].vf, vis[vi03]++); + // lqi.xyzw vf26, vi03 | maddax.xyzw ACC, vf01, vf30 227 + c->acc.vf.madda(Mask::xyzw, c->vfs[vf01].vf, c->vfs[vf30].vf.x()); lq_buffer(Mask::xyzw, c->vfs[vf26].vf, vis[vi03]++); + // lqi.xyzw vf10, vi01 | madday.xyzw ACC, vf02, vf30 228 + c->acc.vf.madda(Mask::xyzw, c->vfs[vf02].vf, c->vfs[vf30].vf.y()); lq_buffer(Mask::xyzw, c->vfs[vf10].vf, vis[vi01]++); + // nop | maddz.xyz vf13, vf03, vf30 229 + c->acc.vf.madd(Mask::xyz, c->vfs[vf13].vf, c->vf_src(vf03).vf, c->vf_src(vf30).vf.z()); + // nop | mulax.xyz ACC, vf06, vf29 230 + c->acc.vf.mula(Mask::xyz, c->vf_src(vf06).vf, c->vf_src(vf29).vf.x()); + // nop | maddw.xyz vf30, vf26, vf00 231 + c->acc.vf.madd(Mask::xyz, c->vfs[vf30].vf, c->vf_src(vf26).vf, c->vf_src(vf00).vf.w()); + // nop | mulax.xyzw ACC, vf01, vf10 232 + c->acc.vf.mula(Mask::xyzw, c->vf_src(vf01).vf, c->vf_src(vf10).vf.x()); + // nop | madday.xyzw ACC, vf02, vf10 233 + c->acc.vf.madda(Mask::xyzw, c->vfs[vf02].vf, c->vfs[vf10].vf.y()); + // move.w vf14, vf06 | maddz.xyz vf18, vf03, vf10 234 + c->acc.vf.madd(Mask::xyz, c->vfs[vf18].vf, c->vf_src(vf03).vf, c->vf_src(vf10).vf.z()); c->vfs[vf14].vf.move(Mask::w, c->vf_src(vf06).vf); + // lqi.xyzw vf07, vi03 | mulaw.xyzw ACC, vf04, vf00 235 + c->acc.vf.mula(Mask::xyzw, c->vf_src(vf04).vf, c->vf_src(vf00).vf.w()); lq_buffer(Mask::xyzw, c->vfs[vf07].vf, vis[vi03]++); + // lqi.xyzw vf27, vi03 | maddax.xyzw ACC, vf01, vf30 236 + c->acc.vf.madda(Mask::xyzw, c->vfs[vf01].vf, c->vfs[vf30].vf.x()); lq_buffer(Mask::xyzw, c->vfs[vf27].vf, vis[vi03]++); + // lqi.xyzw vf11, vi01 | madday.xyzw ACC, vf02, vf30 237 + c->acc.vf.madda(Mask::xyzw, c->vfs[vf02].vf, c->vfs[vf30].vf.y()); lq_buffer(Mask::xyzw, c->vfs[vf11].vf, vis[vi01]++); + // nop | maddz.xyz vf14, vf03, vf30 238 + c->acc.vf.madd(Mask::xyz, c->vfs[vf14].vf, c->vf_src(vf03).vf, c->vf_src(vf30).vf.z()); + // nop | mulax.xyz ACC, vf07, vf29 239 + c->acc.vf.mula(Mask::xyz, c->vf_src(vf07).vf, c->vf_src(vf29).vf.x()); + // nop | maddw.xyz vf30, vf27, vf00 240 + c->acc.vf.madd(Mask::xyz, c->vfs[vf30].vf, c->vf_src(vf27).vf, c->vf_src(vf00).vf.w()); + // nop | mulax.xyzw ACC, vf01, vf11 241 + c->acc.vf.mula(Mask::xyzw, c->vf_src(vf01).vf, c->vf_src(vf11).vf.x()); + // nop | madday.xyzw ACC, vf02, vf11 242 + c->acc.vf.madda(Mask::xyzw, c->vfs[vf02].vf, c->vfs[vf11].vf.y()); + // move.w vf15, vf07 | maddz.xyz vf19, vf03, vf11 243 + c->acc.vf.madd(Mask::xyz, c->vfs[vf19].vf, c->vf_src(vf03).vf, c->vf_src(vf11).vf.z()); c->vfs[vf15].vf.move(Mask::w, c->vf_src(vf07).vf); + // lqi.xyzw vf08, vi03 | mulaw.xyzw ACC, vf04, vf00 244 + c->acc.vf.mula(Mask::xyzw, c->vf_src(vf04).vf, c->vf_src(vf00).vf.w()); lq_buffer(Mask::xyzw, c->vfs[vf08].vf, vis[vi03]++); + // lqi.xyzw vf28, vi03 | maddax.xyzw ACC, vf01, vf30 245 + c->acc.vf.madda(Mask::xyzw, c->vfs[vf01].vf, c->vfs[vf30].vf.x()); lq_buffer(Mask::xyzw, c->vfs[vf28].vf, vis[vi03]++); + // lqi.xyzw vf12, vi01 | madday.xyzw ACC, vf02, vf30 246 + c->acc.vf.madda(Mask::xyzw, c->vfs[vf02].vf, c->vfs[vf30].vf.y()); lq_buffer(Mask::xyzw, c->vfs[vf12].vf, vis[vi01]++); + // nop | maddz.xyz vf15, vf03, vf30 247 + c->acc.vf.madd(Mask::xyz, c->vfs[vf15].vf, c->vf_src(vf03).vf, c->vf_src(vf30).vf.z()); + // nop | mulax.xyz ACC, vf08, vf29 248 + c->acc.vf.mula(Mask::xyz, c->vf_src(vf08).vf, c->vf_src(vf29).vf.x()); + // nop | maddw.xyz vf30, vf28, vf00 249 + c->acc.vf.madd(Mask::xyz, c->vfs[vf30].vf, c->vf_src(vf28).vf, c->vf_src(vf00).vf.w()); + // nop | mulax.xyzw ACC, vf01, vf12 250 + c->acc.vf.mula(Mask::xyzw, c->vf_src(vf01).vf, c->vf_src(vf12).vf.x()); + // nop | madday.xyzw ACC, vf02, vf12 251 + c->acc.vf.madda(Mask::xyzw, c->vfs[vf02].vf, c->vfs[vf12].vf.y()); + // move.w vf21, vf08 | maddz.xyz vf20, vf03, vf12 252 + c->acc.vf.madd(Mask::xyz, c->vfs[vf20].vf, c->vf_src(vf03).vf, c->vf_src(vf12).vf.z()); c->vfs[vf21].vf.move(Mask::w, c->vf_src(vf08).vf); + // lqi.xyzw vf05, vi03 | mulaw.xyzw ACC, vf04, vf00 253 + c->acc.vf.mula(Mask::xyzw, c->vf_src(vf04).vf, c->vf_src(vf00).vf.w()); lq_buffer(Mask::xyzw, c->vfs[vf05].vf, vis[vi03]++); + // lqi.xyzw vf25, vi03 | maddax.xyzw ACC, vf01, vf30 254 + c->acc.vf.madda(Mask::xyzw, c->vfs[vf01].vf, c->vfs[vf30].vf.x()); lq_buffer(Mask::xyzw, c->vfs[vf25].vf, vis[vi03]++); + // lqi.xyzw vf09, vi01 | madday.xyzw ACC, vf02, vf30 :e 255 + c->acc.vf.madda(Mask::xyzw, c->vfs[vf02].vf, c->vfs[vf30].vf.y()); lq_buffer(Mask::xyzw, c->vfs[vf09].vf, vis[vi01]++); + // nop | maddz.xyz vf21, vf03, vf30 256 + c->acc.vf.madd(Mask::xyz, c->vfs[vf21].vf, c->vf_src(vf03).vf, c->vf_src(vf30).vf.z()); +} + +void vcallms_257(ExecutionContext* c) { + // move.xyzw vf16, vf21 | nop :e 257 + c->vfs[vf16].vf.move(Mask::xyzw, c->vf_src(vf21).vf); + // nop | nop 258 +} + +void vcallms_264(ExecutionContext* c); +void vcallms_259(ExecutionContext* c) { + PROG_259: + // ior vi01, vi13, vi00 | nop 259 + vis[vi01] = vis[vi13]; + // lqi.xyzw vf09, vi01 | nop 260 + lq_buffer(Mask::xyzw, c->vfs[vf09].vf, vis[vi01]++); + // ior vi03, vi11, vi00 | nop 261 + vis[vi03] = vis[vi11]; + // lq.xyzw vf05, 1(vi03) | nop 262 + lq_buffer(Mask::xyzw, c->vfs[vf05].vf, vis[vi03] + 1); + // iaddi vi03, vi03, 0x2 | nop 263 + vis[vi03] = vis[vi03] + 2; + vcallms_264(c); +} + +void vcallms_264(ExecutionContext* c) { + PROG_264: + // move.xyzw vf15, vf21 | mulax.xyzw ACC, vf01, vf09 264 + c->acc.vf.mula(Mask::xyzw, c->vf_src(vf01).vf, c->vf_src(vf09).vf.x()); c->vfs[vf15].vf.move(Mask::xyzw, c->vf_src(vf21).vf); + // move.xyzw vf20, vf22 | madday.xyzw ACC, vf02, vf09 265 + c->acc.vf.madda(Mask::xyzw, c->vfs[vf02].vf, c->vfs[vf09].vf.y()); c->vfs[vf20].vf.move(Mask::xyzw, c->vf_src(vf22).vf); + // lq.w vf13, -2(vi03) | maddz.xyz vf17, vf03, vf09 266 + c->acc.vf.madd(Mask::xyz, c->vfs[vf17].vf, c->vf_src(vf03).vf, c->vf_src(vf09).vf.z()); lq_buffer(Mask::w, c->vfs[vf13].vf, vis[vi03] + -2); + // lqi.xyzw vf10, vi01 | mulaw.xyzw ACC, vf04, vf00 267 + c->acc.vf.mula(Mask::xyzw, c->vf_src(vf04).vf, c->vf_src(vf00).vf.w()); lq_buffer(Mask::xyzw, c->vfs[vf10].vf, vis[vi01]++); + // move.xyzw vf16, vf23 | maddax.xyzw ACC, vf01, vf05 268 + c->acc.vf.madda(Mask::xyzw, c->vfs[vf01].vf, c->vfs[vf05].vf.x()); c->vfs[vf16].vf.move(Mask::xyzw, c->vf_src(vf23).vf); + // lq.xyzw vf06, 1(vi03) | madday.xyzw ACC, vf02, vf05 269 + c->acc.vf.madda(Mask::xyzw, c->vfs[vf02].vf, c->vfs[vf05].vf.y()); lq_buffer(Mask::xyzw, c->vfs[vf06].vf, vis[vi03] + 1); + // iaddi vi03, vi03, 0x2 | maddz.xyz vf13, vf03, vf05 270 + c->acc.vf.madd(Mask::xyz, c->vfs[vf13].vf, c->vf_src(vf03).vf, c->vf_src(vf05).vf.z()); vis[vi03] = vis[vi03] + 2; + // nop | mulax.xyzw ACC, vf01, vf10 271 + c->acc.vf.mula(Mask::xyzw, c->vf_src(vf01).vf, c->vf_src(vf10).vf.x()); + // nop | madday.xyzw ACC, vf02, vf10 272 + c->acc.vf.madda(Mask::xyzw, c->vfs[vf02].vf, c->vfs[vf10].vf.y()); + // lq.w vf14, -2(vi03) | maddz.xyz vf18, vf03, vf10 273 + c->acc.vf.madd(Mask::xyz, c->vfs[vf18].vf, c->vf_src(vf03).vf, c->vf_src(vf10).vf.z()); lq_buffer(Mask::w, c->vfs[vf14].vf, vis[vi03] + -2); + // lqi.xyzw vf11, vi01 | mulaw.xyzw ACC, vf04, vf00 274 + c->acc.vf.mula(Mask::xyzw, c->vf_src(vf04).vf, c->vf_src(vf00).vf.w()); lq_buffer(Mask::xyzw, c->vfs[vf11].vf, vis[vi01]++); + // nop | maddax.xyzw ACC, vf01, vf06 275 + c->acc.vf.madda(Mask::xyzw, c->vfs[vf01].vf, c->vfs[vf06].vf.x()); + // lq.xyzw vf07, 1(vi03) | madday.xyzw ACC, vf02, vf06 276 + c->acc.vf.madda(Mask::xyzw, c->vfs[vf02].vf, c->vfs[vf06].vf.y()); lq_buffer(Mask::xyzw, c->vfs[vf07].vf, vis[vi03] + 1); + // iaddi vi03, vi03, 0x2 | maddz.xyz vf14, vf03, vf06 277 + c->acc.vf.madd(Mask::xyz, c->vfs[vf14].vf, c->vf_src(vf03).vf, c->vf_src(vf06).vf.z()); vis[vi03] = vis[vi03] + 2; + // nop | mulax.xyzw ACC, vf01, vf11 278 + c->acc.vf.mula(Mask::xyzw, c->vf_src(vf01).vf, c->vf_src(vf11).vf.x()); + // nop | madday.xyzw ACC, vf02, vf11 279 + c->acc.vf.madda(Mask::xyzw, c->vfs[vf02].vf, c->vfs[vf11].vf.y()); + // lq.w vf21, -2(vi03) | maddz.xyz vf19, vf03, vf11 280 + c->acc.vf.madd(Mask::xyz, c->vfs[vf19].vf, c->vf_src(vf03).vf, c->vf_src(vf11).vf.z()); lq_buffer(Mask::w, c->vfs[vf21].vf, vis[vi03] + -2); + // lqi.xyzw vf12, vi01 | mulaw.xyzw ACC, vf04, vf00 281 + c->acc.vf.mula(Mask::xyzw, c->vf_src(vf04).vf, c->vf_src(vf00).vf.w()); lq_buffer(Mask::xyzw, c->vfs[vf12].vf, vis[vi01]++); + // nop | maddax.xyzw ACC, vf01, vf07 282 + c->acc.vf.madda(Mask::xyzw, c->vfs[vf01].vf, c->vfs[vf07].vf.x()); + // lq.xyzw vf08, 1(vi03) | madday.xyzw ACC, vf02, vf07 283 + c->acc.vf.madda(Mask::xyzw, c->vfs[vf02].vf, c->vfs[vf07].vf.y()); lq_buffer(Mask::xyzw, c->vfs[vf08].vf, vis[vi03] + 1); + // iaddi vi03, vi03, 0x2 | maddz.xyz vf21, vf03, vf07 284 + c->acc.vf.madd(Mask::xyz, c->vfs[vf21].vf, c->vf_src(vf03).vf, c->vf_src(vf07).vf.z()); vis[vi03] = vis[vi03] + 2; + // nop | mulax.xyzw ACC, vf01, vf12 285 + c->acc.vf.mula(Mask::xyzw, c->vf_src(vf01).vf, c->vf_src(vf12).vf.x()); + // nop | madday.xyzw ACC, vf02, vf12 286 + c->acc.vf.madda(Mask::xyzw, c->vfs[vf02].vf, c->vfs[vf12].vf.y()); + // lq.w vf23, -2(vi03) | maddz.xyz vf22, vf03, vf12 287 + c->acc.vf.madd(Mask::xyz, c->vfs[vf22].vf, c->vf_src(vf03).vf, c->vf_src(vf12).vf.z()); lq_buffer(Mask::w, c->vfs[vf23].vf, vis[vi03] + -2); + // lqi.xyzw vf09, vi01 | mulaw.xyzw ACC, vf04, vf00 288 + c->acc.vf.mula(Mask::xyzw, c->vf_src(vf04).vf, c->vf_src(vf00).vf.w()); lq_buffer(Mask::xyzw, c->vfs[vf09].vf, vis[vi01]++); + // nop | maddax.xyzw ACC, vf01, vf08 289 + c->acc.vf.madda(Mask::xyzw, c->vfs[vf01].vf, c->vfs[vf08].vf.x()); + // lq.xyzw vf05, 1(vi03) | madday.xyzw ACC, vf02, vf08 :e 290 + c->acc.vf.madda(Mask::xyzw, c->vfs[vf02].vf, c->vfs[vf08].vf.y()); lq_buffer(Mask::xyzw, c->vfs[vf05].vf, vis[vi03] + 1); + // iaddi vi03, vi03, 0x2 | maddz.xyz vf23, vf03, vf08 291 + c->acc.vf.madd(Mask::xyz, c->vfs[vf23].vf, c->vf_src(vf03).vf, c->vf_src(vf08).vf.z()); vis[vi03] = vis[vi03] + 2; +} + +void vcallms_292(ExecutionContext* c) { + // move.xyzw vf15, vf21 | nop 292 + c->vfs[vf15].vf.move(Mask::xyzw, c->vf_src(vf21).vf); + // move.xyzw vf20, vf22 | nop :e 293 + c->vfs[vf20].vf.move(Mask::xyzw, c->vf_src(vf22).vf); + // move.xyzw vf16, vf23 | nop 294 + c->vfs[vf16].vf.move(Mask::xyzw, c->vf_src(vf23).vf); +} + +u64 execute(void* ctxt) { + auto* c = (ExecutionContext*)ctxt; + bool bc = false; + get_fake_spad_addr(at, cache.fake_scratchpad_data, 0, c);// lui at, 28672 + u32 call_addr = 0; + u32 madr, sadr, qwc; + c->daddiu(sp, sp, -128); // daddiu sp, sp, -128 + c->sd(ra, 384, at); // sd ra, 384(at) + c->sq(s0, 400, at); // sq s0, 400(at) + c->sq(s1, 416, at); // sq s1, 416(at) + c->sq(s2, 432, at); // sq s2, 432(at) + c->sq(s3, 448, at); // sq s3, 448(at) + c->sq(s4, 464, at); // sq s4, 464(at) + c->sq(s5, 480, at); // sq s5, 480(at) + c->sq(gp, 496, at); // sq gp, 496(at) + + block_1: + c->lui(v1, 4096); // lui v1, 4096 + get_fake_spad_addr(at, cache.fake_scratchpad_data, 0, c);// lui at, 28672 + c->ori(v1, v1, 54272); // ori v1, v1, 54272 + // nop // sll r0, r0, 0 + + /* + block_2: + c->lw(a0, 0, v1); // lw a0, 0(v1) + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->andi(a0, a0, 256); // andi a0, a0, 256 + // nop // sll r0, r0, 0 + bc = c->sgpr64(a0) == 0; // beq a0, r0, L11 + // nop // sll r0, r0, 0 + if (bc) {goto block_4;} // branch non-likely + + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->daddiu(gp, gp, 1); // daddiu gp, gp, 1 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + //beq r0, r0, L10 // beq r0, r0, L10 + // nop // sll r0, r0, 0 + goto block_2; // branch always + */ + + + block_4: + // nop // sll r0, r0, 0 + c->lw(v1, 724, at); // lw v1, 724(at) + // nop // sll r0, r0, 0 + c->lw(a2, 728, at); // lw a2, 728(at) + c->dsubu(a0, v1, r0); // dsubu a0, v1, r0 + c->lw(a1, 732, at); // lw a1, 732(at) + bc = c->sgpr64(a0) != 0; // bne a0, r0, L15 + c->daddiu(a0, at, 640); // daddiu a0, at, 640 + if (bc) {goto block_13;} // branch non-likely + + c->addiu(t0, a1, 16); // addiu t0, a1, 16 + c->lhu(a3, 0, a1); // lhu a3, 0(a1) + c->sll(t2, a3, 4); // sll t2, a3, 4 + c->lw(t1, 8, a1); // lw t1, 8(a1) + c->addiu(a2, at, 7632); // addiu a2, at, 7632 + c->addu(a1, t0, t2); // addu a1, t0, t2 + // nop // sll r0, r0, 0 + c->lq(t2, 0, t1); // lq t2, 0(t1) + // nop // sll r0, r0, 0 + c->lq(t3, 16, t1); // lq t3, 16(t1) + // nop // sll r0, r0, 0 + c->lq(t4, 32, t1); // lq t4, 32(t1) + // nop // sll r0, r0, 0 + c->lq(t5, 48, t1); // lq t5, 48(t1) + // nop // sll r0, r0, 0 + c->lq(t1, 64, t1); // lq t1, 64(t1) + // nop // sll r0, r0, 0 + c->sq(t2, 12064, at); // sq t2, 12064(at) + // nop // sll r0, r0, 0 + c->sq(t3, 12080, at); // sq t3, 12080(at) + // nop // sll r0, r0, 0 + c->sq(t4, 12096, at); // sq t4, 12096(at) + // nop // sll r0, r0, 0 + c->sq(t5, 12112, at); // sq t5, 12112(at) + // nop // sll r0, r0, 0 + c->sq(t1, 12128, at); // sq t1, 12128(at) + c->mov64(t1, a2); // or t1, a2, r0 + // nop // sll r0, r0, 0 + c->daddiu(t2, a3, -4); // daddiu t2, a3, -4 + c->mov64(t1, t1); // or t1, t1, r0 + bc = ((s64)c->sgpr64(t2)) < 0; // bltz t2, L13 + c->mov64(t0, t0); // or t0, t0, r0 + if (bc) {goto block_7;} // branch non-likely + + + block_6: + // nop // sll r0, r0, 0 + c->lq(t5, 0, t0); // lq t5, 0(t0) + // nop // sll r0, r0, 0 + c->lq(t2, 16, t0); // lq t2, 16(t0) + c->daddiu(a3, a3, -4); // daddiu a3, a3, -4 + c->lq(t3, 32, t0); // lq t3, 32(t0) + c->daddiu(t1, t1, 64); // daddiu t1, t1, 64 + c->lq(t4, 48, t0); // lq t4, 48(t0) + c->daddiu(t0, t0, 64); // daddiu t0, t0, 64 + c->sq(t5, -64, t1); // sq t5, -64(t1) + c->daddiu(t5, a3, -4); // daddiu t5, a3, -4 + c->sq(t2, -48, t1); // sq t2, -48(t1) + // nop // sll r0, r0, 0 + c->sq(t3, -32, t1); // sq t3, -32(t1) + bc = ((s64)c->sgpr64(t5)) >= 0; // bgez t5, L12 + c->sq(t4, -16, t1); // sq t4, -16(t1) + if (bc) {goto block_6;} // branch non-likely + + + block_7: + bc = c->sgpr64(a3) == 0; // beq a3, r0, L14 + c->lq(t2, 0, t0); // lq t2, 0(t0) + if (bc) {goto block_12;} // branch non-likely + + c->daddiu(t0, t0, 16); // daddiu t0, t0, 16 + c->daddiu(t1, t1, 16); // daddiu t1, t1, 16 + c->daddiu(a3, a3, -1); // daddiu a3, a3, -1 + c->sq(t2, -16, t1); // sq t2, -16(t1) + bc = c->sgpr64(a3) == 0; // beq a3, r0, L14 + c->lq(t2, 0, t0); // lq t2, 0(t0) + if (bc) {goto block_12;} // branch non-likely + + c->daddiu(t0, t0, 16); // daddiu t0, t0, 16 + c->daddiu(t1, t1, 16); // daddiu t1, t1, 16 + c->daddiu(a3, a3, -1); // daddiu a3, a3, -1 + c->sq(t2, -16, t1); // sq t2, -16(t1) + bc = c->sgpr64(a3) == 0; // beq a3, r0, L14 + c->lq(t2, 0, t0); // lq t2, 0(t0) + if (bc) {goto block_12;} // branch non-likely + + c->daddiu(t0, t0, 16); // daddiu t0, t0, 16 + c->daddiu(t1, t1, 16); // daddiu t1, t1, 16 + c->daddiu(a3, a3, -1); // daddiu a3, a3, -1 + c->sq(t2, -16, t1); // sq t2, -16(t1) + bc = c->sgpr64(a3) == 0; // beq a3, r0, L14 + c->lq(t2, 0, t0); // lq t2, 0(t0) + if (bc) {goto block_12;} // branch non-likely + + c->daddiu(t0, t0, 16); // daddiu t0, t0, 16 + c->daddiu(t0, t1, 16); // daddiu t0, t1, 16 + c->daddiu(a3, a3, -1); // daddiu a3, a3, -1 + c->sq(t2, -16, t0); // sq t2, -16(t0) + + block_12: + c->gprs[a3].du64[0] = 0; // or a3, r0, r0 + //beq r0, r0, L16 // beq r0, r0, L16 + c->sw(a2, 640, at); // sw a2, 640(at) + goto block_15; // branch always + + + block_13: + c->daddiu(a3, v1, -1); // daddiu a3, v1, -1 + // nop // sll r0, r0, 0 + bc = c->sgpr64(a3) != 0; // bne a3, r0, L17 + c->mov64(t2, a2); // or t2, a2, r0 + if (bc) {goto block_16;} // branch non-likely + + // nop // sll r0, r0, 0 + c->daddiu(a1, a1, 528); // daddiu a1, a1, 528 + // nop // sll r0, r0, 0 + + block_15: + c->addiu(a2, a1, 16); // addiu a2, a1, 16 + c->lhu(a3, 0, a1); // lhu a3, 0(a1) + c->sll(t0, a3, 4); // sll t0, a3, 4 + c->lwu(t1, 28, a2); // lwu t1, 28(a2) + c->sll(t2, t1, 2); // sll t2, t1, 2 + c->lwu(a3, 12, a1); // lwu a3, 12(a1) + c->addu(t1, t2, t1); // addu t1, t2, t1 + c->lwu(a1, 8, a1); // lwu a1, 8(a1) + c->addu(t0, a2, t0); // addu t0, a2, t0 + c->sw(a3, 48, a0); // sw a3, 48(a0) + c->sll(a3, t1, 4); // sll a3, t1, 4 + c->sw(a1, 52, a0); // sw a1, 52(a0) + c->daddiu(a1, t0, 16); // daddiu a1, t0, 16 + c->lhu(t0, 0, t0); // lhu t0, 0(t0) + c->daddu(a3, a2, a3); // daddu a3, a2, a3 + c->sw(a2, 4, a0); // sw a2, 4(a0) + c->sll(a2, t0, 4); // sll a2, t0, 4 + c->sw(a3, 8, a0); // sw a3, 8(a0) + c->daddu(a2, a1, a2); // daddu a2, a1, a2 + c->sw(a1, 12, a0); // sw a1, 12(a0) + c->daddiu(a1, a2, 16); // daddiu a1, a2, 16 + c->lhu(a2, 0, a2); // lhu a2, 0(a2) + c->sll(t2, a2, 4); // sll t2, a2, 4 + c->lhu(a2, 14, a1); // lhu a2, 14(a1) + c->daddiu(a3, a1, 32); // daddiu a3, a1, 32 + c->lhu(t0, 10, a1); // lhu t0, 10(a1) + c->daddu(t0, t0, a1); // daddu t0, t0, a1 + c->lhu(t1, 12, a1); // lhu t1, 12(a1) + c->daddu(t1, t1, a1); // daddu t1, t1, a1 + c->lhu(t3, 0, a1); // lhu t3, 0(a1) + c->daddu(t2, a1, t2); // daddu t2, a1, t2 + c->sw(a1, 16, a0); // sw a1, 16(a0) + c->daddiu(t2, t2, 16); // daddiu t2, t2, 16 + c->sw(a3, 20, a0); // sw a3, 20(a0) + c->daddu(a1, a2, a1); // daddu a1, a2, a1 + c->sw(t1, 28, a0); // sw t1, 28(a0) + // nop // sll r0, r0, 0 + c->sw(a1, 32, a0); // sw a1, 32(a0) + //beq r0, r0, L17 // beq r0, r0, L17 + c->sw(t0, 24, a0); // sw t0, 24(a0) + goto block_16; // branch always + + + block_16: + c->daddiu(a1, t2, 16); // daddiu a1, t2, 16 + c->lwu(a3, 12, t2); // lwu a3, 12(t2) + c->daddiu(a2, a1, 112); // daddiu a2, a1, 112 + c->sw(a3, 44, a0); // sw a3, 44(a0) + // nop // sll r0, r0, 0 + c->lhu(a3, -16, a2); // lhu a3, -16(a2) + // nop // sll r0, r0, 0 + c->sw(a1, 36, a0); // sw a1, 36(a0) + // nop // sll r0, r0, 0 + c->sw(a2, 40, a0); // sw a2, 40(a0) + // nop // sll r0, r0, 0 + c->sw(v1, 56, a0); // sw v1, 56(a0) + // nop // sll r0, r0, 0 + c->lw(v1, 744, at); // lw v1, 744(at) + // nop // sll r0, r0, 0 + c->lw(a0, 76, at); // lw a0, 76(at) + c->dsubu(v1, a0, v1); // dsubu v1, a0, v1 + // nop // sll r0, r0, 0 + bc = ((s64)c->sgpr64(v1)) >= 0; // bgez v1, L51 + // nop // sll r0, r0, 0 + if (bc) {goto block_70;} // branch non-likely + + get_fake_spad_addr(at, cache.fake_scratchpad_data, 0, c);// lui at, 28672 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->lw(v1, 684, at); // lw v1, 684(at) + c->lui(a1, 1); // lui a1, 1 + c->lw(a0, 688, at); // lw a0, 688(at) + c->dsubu(a1, v1, a1); // dsubu a1, v1, a1 + c->lw(a2, 692, at); // lw a2, 692(at) + bc = ((s64)c->sgpr64(a1)) > 0; // bgtz a1, L19 + c->lw(a1, 728, at); // lw a1, 728(at) + if (bc) {goto block_23;} // branch non-likely + + bc = c->sgpr64(a2) != 0; // bne a2, r0, L18 + c->lw(v1, 732, at); // lw v1, 732(at) + if (bc) {goto block_21;} // branch non-likely + + c->xori(a1, v1, 3248); // xori a1, v1, 3248 + c->mov64(v1, a0); // or v1, a0, r0 + c->daddiu(a3, a1, 2880); // daddiu a3, a1, 2880 + c->sw(a1, 732, at); // sw a1, 732(at) + c->xori(a2, a3, 7264); // xori a2, a3, 7264 + c->sw(a3, 728, at); // sw a3, 728(at) + c->addiu(a3, r0, 0); // addiu a3, r0, 0 + c->daddu(a1, a1, r0); // daddu a1, a1, r0 + c->andi(a2, a2, 65535); // andi a2, a2, 65535 + c->sw(a3, 724, at); // sw a3, 724(at) + bc = c->sgpr64(a0) != 0; // bne a0, r0, L20 + c->sw(a2, 736, at); // sw a2, 736(at) + if (bc) {goto block_24;} // branch non-likely + + c->addiu(v1, r0, 1); // addiu v1, r0, 1 + // nop // sll r0, r0, 0 + //beq r0, r0, L21 // beq r0, r0, L21 + c->sw(v1, 740, at); // sw v1, 740(at) + goto block_25; // branch always + + + block_21: + c->xori(a1, v1, 3248); // xori a1, v1, 3248 + c->mov64(v1, a0); // or v1, a0, r0 + c->daddiu(a3, a1, 2880); // daddiu a3, a1, 2880 + c->sw(a1, 732, at); // sw a1, 732(at) + c->xori(a2, a3, 7264); // xori a2, a3, 7264 + c->sw(a3, 728, at); // sw a3, 728(at) + c->addiu(a3, r0, 1); // addiu a3, r0, 1 + c->daddiu(a1, a1, 528); // daddiu a1, a1, 528 + c->andi(a2, a2, 65535); // andi a2, a2, 65535 + c->sw(a3, 724, at); // sw a3, 724(at) + bc = c->sgpr64(a0) != 0; // bne a0, r0, L20 + c->sw(a2, 736, at); // sw a2, 736(at) + if (bc) {goto block_24;} // branch non-likely + + c->addiu(v1, r0, 1); // addiu v1, r0, 1 + // nop // sll r0, r0, 0 + //beq r0, r0, L21 // beq r0, r0, L21 + c->sw(v1, 740, at); // sw v1, 740(at) + goto block_25; // branch always + + + block_23: + c->mov64(v1, v1); // or v1, v1, r0 + c->lw(a2, 736, at); // lw a2, 736(at) + c->addiu(a0, r0, 2); // addiu a0, r0, 2 + // nop // sll r0, r0, 0 + c->xor_(a1, a1, a2); // xor a1, a1, a2 + c->sw(a0, 724, at); // sw a0, 724(at) + //beq r0, r0, L20 // beq r0, r0, L20 + c->sw(a1, 728, at); // sw a1, 728(at) + goto block_24; // branch always + + + block_24: + get_fake_spad_addr(at, cache.fake_scratchpad_data, 0, c);// lui at, 28672 + c->ori(a2, r0, 65535); // ori a2, r0, 65535 + c->lui(a0, 4096); // lui a0, 4096 + // nop // sll r0, r0, 0 + c->ori(a0, a0, 54272); // ori a0, a0, 54272 + c->and_(a1, a1, a2); // and a1, a1, a2 + c->addiu(a2, r0, 324); // addiu a2, r0, 324 + { + // spr to + u32 sadr = c->sgpr64(a1); + u32 tadr = c->sgpr64(v1); + spad_to_dma_blerc_chain(cache.fake_scratchpad_data, sadr & 0x3fff, tadr); + } +// c->sw(a1, 128, a0); // sw a1, 128(a0) +// c->sw(v1, 48, a0); // sw v1, 48(a0) +// c->sw(r0, 32, a0); // sw r0, 32(a0) +// c->sw(a2, 0, a0); // sw a2, 0(a0) + + block_25: + // nop // sll r0, r0, 0 + c->gprs[v1].du64[0] = 0; // or v1, r0, r0 + get_fake_spad_addr(at, cache.fake_scratchpad_data, 0, c);// lui at, 28672 + c->daddiu(t2, at, 640); // daddiu t2, at, 640 + c->lw(a0, 716, at); // lw a0, 716(at) + // nop // sll r0, r0, 0 + c->lw(a1, 56, t2); // lw a1, 56(t2) + // nop // sll r0, r0, 0 + c->lw(v1, 4, t2); // lw v1, 4(t2) + // nop // sll r0, r0, 0 + c->lw(v1, 8, t2); // lw v1, 8(t2) + // nop // sll r0, r0, 0 + c->lw(t3, 12, t2); // lw t3, 12(t2) + // nop // sll r0, r0, 0 + c->lw(t1, 16, t2); // lw t1, 16(t2) + // nop // sll r0, r0, 0 + c->lw(v1, 32, t2); // lw v1, 32(t2) + // nop // sll r0, r0, 0 + c->lw(t5, 20, t2); // lw t5, 20(t2) + // nop // sll r0, r0, 0 + c->lw(t6, 24, t2); // lw t6, 24(t2) + // nop // sll r0, r0, 0 + c->lw(t4, 28, t2); // lw t4, 28(t2) + // nop // sll r0, r0, 0 + c->lw(a3, 36, t2); // lw a3, 36(t2) + // nop // sll r0, r0, 0 + c->lw(v1, 40, t2); // lw v1, 40(t2) + // nop // sll r0, r0, 0 + c->lw(t0, 0, t2); // lw t0, 0(t2) + // nop // sll r0, r0, 0 + c->lhu(a2, 20, t1); // lhu a2, 20(t1) + // nop // sll r0, r0, 0 + c->lhu(t8, 18, t1); // lhu t8, 18(t1) + c->daddiu(a2, a1, -2); // daddiu a2, a1, -2 + c->lbu(a1, 2, t1); // lbu a1, 2(t1) + bc = c->sgpr64(a2) == 0; // beq a2, r0, L38 + c->lbu(a2, 3, t1); // lbu a2, 3(t1) + if (bc) {goto block_52;} // branch non-likely + + c->daddu(t7, t8, t8); // daddu t7, t8, t8 + c->addiu(t9, r0, -16); // addiu t9, r0, -16 + c->daddiu(ra, t7, 15); // daddiu ra, t7, 15 + c->daddiu(t7, a0, 32); // daddiu t7, a0, 32 + c->and_(t9, ra, t9); // and t9, ra, t9 + c->lq(ra, 16, t1); // lq ra, 16(t1) + c->daddu(t9, t7, t9); // daddu t9, t7, t9 + c->sq(ra, 16, a0); // sq ra, 16(a0) + c->dsll(ra, t8, 5); // dsll ra, t8, 5 + c->sw(t7, 0, a0); // sw t7, 0(a0) + c->daddu(ra, t9, ra); // daddu ra, t9, ra + c->sw(t9, 4, a0); // sw t9, 4(a0) + c->daddiu(t8, t8, 7); // daddiu t8, t8, 7 + c->sw(ra, 8, a0); // sw ra, 8(a0) + c->dsra(t9, t8, 3); // dsra t9, t8, 3 + // nop // sll r0, r0, 0 + c->addiu(t8, r0, 2); // addiu t8, r0, 2 + // nop // sll r0, r0, 0 + c->mult3(s3, t8, t9); // mult3 s3, t8, t9 + c->mov64(ra, t6); // or ra, t6, r0 + c->mov64(t6, t8); // or t6, t8, r0 + c->mov64(t7, t7); // or t7, t7, r0 + c->addiu(t8, r0, 513); // addiu t8, r0, 513 + c->addiu(t9, r0, 257); // addiu t9, r0, 257 + c->dsll(s1, t8, 18); // dsll s1, t8, 18 + c->dsll(s2, t9, 16); // dsll s2, t9, 16 + c->or_(t8, t8, s1); // or t8, t8, s1 + c->or_(t9, t9, s2); // or t9, t9, s2 + c->dsll32(s1, t8, 4); // dsll32 s1, t8, 4 + c->dsll32(s2, t9, 0); // dsll32 s2, t9, 0 + c->or_(t8, t8, s1); // or t8, t8, s1 + c->or_(t9, t9, s2); // or t9, t9, s2 + c->pcpyld(t8, t8, t8); // pcpyld t8, t8, t8 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pcpyld(t9, t9, t9); // pcpyld t9, t9, t9 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->daddu(s3, s3, ra); // daddu s3, s3, ra + c->mfc1(r0, f31); // mfc1 r0, f31 + c->lhu(s2, 0, ra); // lhu s2, 0(ra) + c->daddu(ra, ra, t6); // daddu ra, ra, t6 + // nop // sll r0, r0, 0 + c->mov64(t5, t5); // or t5, t5, r0 + // nop // sll r0, r0, 0 + c->pextlb(s2, s2, s2); // pextlb s2, s2, s2 + //beq r0, r0, L23 // beq r0, r0, L23 + c->pextlb(s1, s2, s2); // pextlb s1, s2, s2 + goto block_28; // branch always + + + block_27: + c->daddiu(t5, t5, 16); // daddiu t5, t5, 16 + // nop // sll r0, r0, 0 + c->daddu(ra, ra, t6); // daddu ra, ra, t6 + c->daddiu(t7, t7, 32); // daddiu t7, t7, 32 + c->pextlb(s1, s1, s1); // pextlb s1, s1, s1 + c->sq(s2, -16, t7); // sq s2, -16(t7) + + block_28: + c->pextlb(s2, s1, s1); // pextlb s2, s1, s1 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pand(s2, s2, t8); // pand s2, s2, t8 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pceqb(s1, s2, t8); // pceqb s1, s2, t8 + c->lq(s2, 0, t5); // lq s2, 0(t5) + c->pand(v0, s1, t9); // pand v0, s1, t9 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pextlb(s1, v0, s2); // pextlb s1, v0, s2 + c->lhu(s0, 0, ra); // lhu s0, 0(ra) + c->pextub(s2, v0, s2); // pextub s2, v0, s2 + c->sq(s1, 0, t7); // sq s1, 0(t7) + bc = c->sgpr64(ra) != c->sgpr64(s3); // bne ra, s3, L22 + c->pextlb(s1, s0, s0); // pextlb s1, s0, s0 + if (bc) {goto block_27;} // branch non-likely + + // nop // sll r0, r0, 0 + c->sq(s2, 16, t7); // sq s2, 16(t7) + c->gprs[t5].du64[0] = 0; // or t5, r0, r0 + bc = c->sgpr64(a2) == 0; // beq a2, r0, L24 + // nop // sll r0, r0, 0 + if (bc) {goto block_31;} // branch non-likely + + c->daddiu(t6, a2, 7); // daddiu t6, a2, 7 + c->daddiu(t5, at, 700); // daddiu t5, at, 700 + // nop // sll r0, r0, 0 + c->lw(t2, 32, t2); // lw t2, 32(t2) + c->sra(t6, t6, 3); // sra t6, t6, 3 + c->sh(r0, 0, t5); // sh r0, 0(t5) + // nop // sll r0, r0, 0 + c->sh(a1, 4, t5); // sh a1, 4(t5) + // nop // sll r0, r0, 0 + c->sh(a2, 2, t5); // sh a2, 2(t5) + // nop // sll r0, r0, 0 + c->sw(t2, 8, t5); // sw t2, 8(t5) + // nop // sll r0, r0, 0 + c->sw(t5, 80, at); // sw t5, 80(at) + //beq r0, r0, L25 // beq r0, r0, L25 + // nop // sll r0, r0, 0 + goto block_32; // branch always + + + block_31: + // nop // sll r0, r0, 0 + c->sw(r0, 80, at); // sw r0, 80(at) + // nop // sll r0, r0, 0 + + block_32: + c->daddu(t5, a1, a2); // daddu t5, a1, a2 + c->mov64(t2, t4); // or t2, t4, r0 + c->daddiu(t4, t5, 3); // daddiu t4, t5, 3 + vis[vi09] = c->gpr_src(a2).du16[0]; // ctc2.i vi9, a2 + c->sra(t5, t4, 2); // sra t5, t4, 2 + c->lq(t4, 0, t2); // lq t4, 0(t2) + c->sll(t5, t5, 4); // sll t5, t5, 4 + c->daddiu(t2, t2, 16); // daddiu t2, t2, 16 + c->pextub(t7, t4, r0); // pextub t7, t4, r0 + vis[vi08] = c->gpr_src(a1).du16[0]; // ctc2.i vi8, a1 + c->pextlb(t6, t4, r0); // pextlb t6, t4, r0 + vis[vi09] = c->gpr_src(a2).du16[0]; // ctc2.i vi9, a2 + c->daddu(t4, t2, t5); // daddu t4, t2, t5 + // Unknown instr: vcallms 104 + vcallms_104(c); + + block_33: + c->pextuh(t5, t7, r0); // pextuh t5, t7, r0 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pextlh(t7, t7, r0); // pextlh t7, t7, r0 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pextuh(t8, t6, r0); // pextuh t8, t6, r0 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pextlh(t6, t6, r0); // pextlh t6, t6, r0 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->psraw(t9, t6, 19); // psraw t9, t6, 19 + c->lq(t6, 0, t2); // lq t6, 0(t2) + c->psraw(t8, t8, 19); // psraw t8, t8, 19 + c->mov128_vf_gpr(vf5, t9); // qmtc2.ni vf5, t9 + c->psraw(t7, t7, 19); // psraw t7, t7, 19 + c->mov128_vf_gpr(vf6, t8); // qmtc2.ni vf6, t8 + c->psraw(t5, t5, 19); // psraw t5, t5, 19 + c->mov128_vf_gpr(vf7, t7); // qmtc2.ni vf7, t7 + c->pextub(t7, t6, r0); // pextub t7, t6, r0 + c->mov128_vf_gpr(vf8, t5); // qmtc2.ni vf8, t5 + c->pextlb(t6, t6, r0); // pextlb t6, t6, r0 + c->mfc1(r0, f31); // mfc1 r0, f31 + // nop // sll r0, r0, 0 + // Unknown instr: vcallms 114 + vcallms_114(c); + bc = c->sgpr64(t2) != c->sgpr64(t4); // bne t2, t4, L26 + c->daddiu(t2, t2, 16); // daddiu t2, t2, 16 + if (bc) {goto block_33;} // branch non-likely + + // nop // sll r0, r0, 0 + c->mov64(t2, t3); // or t2, t3, r0 + bc = c->sgpr64(a1) == 0; // beq a1, r0, L34 + c->daddiu(t4, a1, -4); // daddiu t4, a1, -4 + if (bc) {goto block_48;} // branch non-likely + + bc = ((s64)c->sgpr64(t4)) <= 0; // blez t4, L29 + // nop // sll r0, r0, 0 + if (bc) {goto block_39;} // branch non-likely + + c->mov64(t2, t3); // or t2, t3, r0 + c->ld(t5, 0, t3); // ld t5, 0(t3) + c->daddiu(t4, a1, -8); // daddiu t4, a1, -8 + c->ld(t6, 16, t3); // ld t6, 16(t3) + c->pextlh(t7, t5, r0); // pextlh t7, t5, r0 + c->ld(t5, 32, t3); // ld t5, 32(t3) + c->pextlh(ra, t6, r0); // pextlh ra, t6, r0 + c->ld(t6, 48, t3); // ld t6, 48(t3) + c->pextlh(t8, t5, r0); // pextlh t8, t5, r0 + c->lwu(t5, 8, t3); // lwu t5, 8(t3) + c->pextlh(t9, t6, r0); // pextlh t9, t6, r0 + c->lwu(t6, 24, t3); // lwu t6, 24(t3) + c->psraw(s3, t7, 10); // psraw s3, t7, 10 + c->lwu(t7, 40, t3); // lwu t7, 40(t3) + c->psraw(ra, ra, 10); // psraw ra, ra, 10 + c->lwu(t3, 56, t3); // lwu t3, 56(t3) + c->psraw(t8, t8, 10); // psraw t8, t8, 10 + c->mov128_vf_gpr(vf1, s3); // qmtc2.ni vf1, s3 + c->psraw(t9, t9, 10); // psraw t9, t9, 10 + c->mov128_vf_gpr(vf2, ra); // qmtc2.ni vf2, ra + c->daddiu(t2, t2, 64); // daddiu t2, t2, 64 + c->mov128_vf_gpr(vf3, t8); // qmtc2.ni vf3, t8 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf4, t9); // qmtc2.ni vf4, t9 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf13, t5); // qmtc2.ni vf13, t5 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf14, t6); // qmtc2.ni vf14, t6 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf15, t7); // qmtc2.ni vf15, t7 + bc = ((s64)c->sgpr64(t4)) <= 0; // blez t4, L28 + c->mov128_vf_gpr(vf16, t3); // qmtc2.ni vf16, t3 + if (bc) {goto block_38;} // branch non-likely + + + block_37: + // Unknown instr: vcallms 122 + vcallms_122(c); + c->ld(t3, 0, t2); // ld t3, 0(t2) + c->daddiu(t4, t4, -4); // daddiu t4, t4, -4 + c->ld(t5, 16, t2); // ld t5, 16(t2) + c->pextlh(t8, t3, r0); // pextlh t8, t3, r0 + c->ld(t3, 32, t2); // ld t3, 32(t2) + c->pextlh(t9, t5, r0); // pextlh t9, t5, r0 + c->ld(t5, 48, t2); // ld t5, 48(t2) + c->pextlh(t6, t3, r0); // pextlh t6, t3, r0 + c->lwu(t3, 8, t2); // lwu t3, 8(t2) + c->pextlh(t7, t5, r0); // pextlh t7, t5, r0 + c->lwu(t5, 24, t2); // lwu t5, 24(t2) + c->psraw(ra, t8, 10); // psraw ra, t8, 10 + c->lwu(t8, 40, t2); // lwu t8, 40(t2) + c->psraw(t9, t9, 10); // psraw t9, t9, 10 + c->lwu(s3, 56, t2); // lwu s3, 56(t2) + c->psraw(t6, t6, 10); // psraw t6, t6, 10 + c->mov128_vf_gpr(vf1, ra); // qmtc2.ni vf1, ra + c->psraw(t7, t7, 10); // psraw t7, t7, 10 + c->mov128_vf_gpr(vf2, t9); // qmtc2.ni vf2, t9 + c->daddiu(t2, t2, 64); // daddiu t2, t2, 64 + c->mov128_vf_gpr(vf3, t6); // qmtc2.ni vf3, t6 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf4, t7); // qmtc2.ni vf4, t7 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf13, t3); // qmtc2.ni vf13, t3 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf14, t5); // qmtc2.ni vf14, t5 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf15, t8); // qmtc2.ni vf15, t8 + bc = ((s64)c->sgpr64(t4)) > 0; // bgtz t4, L27 + c->mov128_vf_gpr(vf16, s3); // qmtc2.ni vf16, s3 + if (bc) {goto block_37;} // branch non-likely + + + block_38: + // Unknown instr: vcallms 122 + vcallms_122(c); + // nop // sll r0, r0, 0 + + block_39: + bc = c->sgpr64(a2) == 0; // beq a2, r0, L33 + c->andi(t3, a1, 3); // andi t3, a1, 3 + if (bc) {goto block_47;} // branch non-likely + + bc = c->sgpr64(t3) == 0; // beq t3, r0, L33 + c->daddiu(t3, t3, -1); // daddiu t3, t3, -1 + if (bc) {goto block_47;} // branch non-likely + + bc = c->sgpr64(t3) == 0; // beq t3, r0, L30 + c->daddiu(t3, t3, -1); // daddiu t3, t3, -1 + if (bc) {goto block_44;} // branch non-likely + + bc = c->sgpr64(t3) == 0; // beq t3, r0, L31 + c->daddiu(t3, t3, -1); // daddiu t3, t3, -1 + if (bc) {goto block_45;} // branch non-likely + + //beq r0, r0, L32 // beq r0, r0, L32 + // nop // sll r0, r0, 0 + goto block_46; // branch always + + + block_44: + // nop // sll r0, r0, 0 + c->ld(t3, 0, t2); // ld t3, 0(t2) + // nop // sll r0, r0, 0 + c->ld(t4, 16, t2); // ld t4, 16(t2) + c->pextlh(t3, t3, r0); // pextlh t3, t3, r0 + c->ld(t6, 24, t2); // ld t6, 24(t2) + c->pextlh(t4, t4, r0); // pextlh t4, t4, r0 + c->lwu(t5, 8, t2); // lwu t5, 8(t2) + c->pextlh(t6, t6, r0); // pextlh t6, t6, r0 + c->lwu(t7, 32, t2); // lwu t7, 32(t2) + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->psraw(t3, t3, 10); // psraw t3, t3, 10 + c->mov128_vf_gpr(vf13, t5); // qmtc2.ni vf13, t5 + c->psraw(t4, t4, 10); // psraw t4, t4, 10 + c->mov128_vf_gpr(vf14, t7); // qmtc2.ni vf14, t7 + c->psraw(t5, t6, 10); // psraw t5, t6, 10 + c->mov128_vf_gpr(vf1, t3); // qmtc2.ni vf1, t3 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf2, t4); // qmtc2.ni vf2, t4 + c->daddiu(t2, t2, 40); // daddiu t2, t2, 40 + c->mov128_vf_gpr(vf3, t5); // qmtc2.ni vf3, t5 + //beq r0, r0, L34 // beq r0, r0, L34 + // Unknown instr: vcallms 134 + vcallms_134(c); + goto block_48; // branch always + + + block_45: + // nop // sll r0, r0, 0 + c->ld(t4, 0, t2); // ld t4, 0(t2) + // nop // sll r0, r0, 0 + c->ld(t3, 16, t2); // ld t3, 16(t2) + c->pextlh(t8, t4, r0); // pextlh t8, t4, r0 + c->ld(t5, 32, t2); // ld t5, 32(t2) + c->pextlh(t4, t3, r0); // pextlh t4, t3, r0 + c->ld(t3, 40, t2); // ld t3, 40(t2) + c->pextlh(t5, t5, r0); // pextlh t5, t5, r0 + c->lwu(t6, 8, t2); // lwu t6, 8(t2) + c->pextlh(t7, t3, r0); // pextlh t7, t3, r0 + c->lwu(t3, 24, t2); // lwu t3, 24(t2) + c->psraw(t9, t8, 10); // psraw t9, t8, 10 + c->lwu(t8, 48, t2); // lwu t8, 48(t2) + c->psraw(t4, t4, 10); // psraw t4, t4, 10 + c->mov128_vf_gpr(vf13, t6); // qmtc2.ni vf13, t6 + c->psraw(t5, t5, 10); // psraw t5, t5, 10 + c->mov128_vf_gpr(vf1, t9); // qmtc2.ni vf1, t9 + c->psraw(t6, t7, 10); // psraw t6, t7, 10 + c->mov128_vf_gpr(vf2, t4); // qmtc2.ni vf2, t4 + c->daddiu(t2, t2, 56); // daddiu t2, t2, 56 + c->mov128_vf_gpr(vf3, t5); // qmtc2.ni vf3, t5 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf4, t6); // qmtc2.ni vf4, t6 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf14, t3); // qmtc2.ni vf14, t3 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf15, t8); // qmtc2.ni vf15, t8 + //beq r0, r0, L34 // beq r0, r0, L34 + // Unknown instr: vcallms 145 + vcallms_145(c); + goto block_48; // branch always + + + block_46: + // nop // sll r0, r0, 0 + c->ld(t4, 0, t2); // ld t4, 0(t2) + // nop // sll r0, r0, 0 + c->ld(t3, 16, t2); // ld t3, 16(t2) + c->pextlh(t7, t4, r0); // pextlh t7, t4, r0 + c->ld(t4, 32, t2); // ld t4, 32(t2) + c->pextlh(t5, t3, r0); // pextlh t5, t3, r0 + c->lwu(t3, 8, t2); // lwu t3, 8(t2) + c->pextlh(t6, t4, r0); // pextlh t6, t4, r0 + c->lwu(t4, 24, t2); // lwu t4, 24(t2) + c->psraw(t7, t7, 10); // psraw t7, t7, 10 + c->lwu(t8, 40, t2); // lwu t8, 40(t2) + c->psraw(t5, t5, 10); // psraw t5, t5, 10 + c->mov128_vf_gpr(vf13, t3); // qmtc2.ni vf13, t3 + c->psraw(t3, t6, 10); // psraw t3, t6, 10 + c->mov128_vf_gpr(vf1, t7); // qmtc2.ni vf1, t7 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf2, t5); // qmtc2.ni vf2, t5 + c->daddiu(t2, t2, 48); // daddiu t2, t2, 48 + c->mov128_vf_gpr(vf3, t3); // qmtc2.ni vf3, t3 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf14, t4); // qmtc2.ni vf14, t4 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf15, t8); // qmtc2.ni vf15, t8 + //beq r0, r0, L34 // beq r0, r0, L34 + // Unknown instr: vcallms 157 + vcallms_157(c); + goto block_48; // branch always + + + block_47: + // nop // sll r0, r0, 0 + c->ld(t3, 0, t2); // ld t3, 0(t2) + // nop // sll r0, r0, 0 + c->ld(t4, 16, t2); // ld t4, 16(t2) + c->pextlh(t7, t3, r0); // pextlh t7, t3, r0 + c->ld(t3, 32, t2); // ld t3, 32(t2) + c->pextlh(t8, t4, r0); // pextlh t8, t4, r0 + c->ld(t4, 48, t2); // ld t4, 48(t2) + c->pextlh(t5, t3, r0); // pextlh t5, t3, r0 + c->lwu(t3, 8, t2); // lwu t3, 8(t2) + c->pextlh(t6, t4, r0); // pextlh t6, t4, r0 + c->lwu(t4, 24, t2); // lwu t4, 24(t2) + c->psraw(t9, t7, 10); // psraw t9, t7, 10 + c->lwu(t7, 40, t2); // lwu t7, 40(t2) + c->psraw(t8, t8, 10); // psraw t8, t8, 10 + c->lwu(ra, 56, t2); // lwu ra, 56(t2) + c->psraw(t5, t5, 10); // psraw t5, t5, 10 + c->mov128_vf_gpr(vf1, t9); // qmtc2.ni vf1, t9 + c->psraw(t6, t6, 10); // psraw t6, t6, 10 + c->mov128_vf_gpr(vf2, t8); // qmtc2.ni vf2, t8 + c->daddiu(t2, t2, 64); // daddiu t2, t2, 64 + c->mov128_vf_gpr(vf3, t5); // qmtc2.ni vf3, t5 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf4, t6); // qmtc2.ni vf4, t6 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf13, t3); // qmtc2.ni vf13, t3 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf14, t4); // qmtc2.ni vf14, t4 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf15, t7); // qmtc2.ni vf15, t7 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf16, ra); // qmtc2.ni vf16, ra + bc = c->sgpr64(a2) == 0; // beq a2, r0, L37 + // Unknown instr: vcallms 122 + vcallms_122(c); + if (bc) {goto block_51;} // branch non-likely + + + block_48: + // nop // sll r0, r0, 0 + c->ld(t4, 0, t2); // ld t4, 0(t2) + c->daddiu(t3, a2, -2); // daddiu t3, a2, -2 + c->ld(t5, 8, t2); // ld t5, 8(t2) + c->pextlh(t4, t4, r0); // pextlh t4, t4, r0 + c->ld(t6, 24, t2); // ld t6, 24(t2) + c->pextlh(t5, t5, r0); // pextlh t5, t5, r0 + c->ld(t7, 32, t2); // ld t7, 32(t2) + c->pextlh(t6, t6, r0); // pextlh t6, t6, r0 + c->lwu(t8, 16, t2); // lwu t8, 16(t2) + c->pextlh(t7, t7, r0); // pextlh t7, t7, r0 + c->lwu(t9, 40, t2); // lwu t9, 40(t2) + c->psraw(t4, t4, 10); // psraw t4, t4, 10 + c->mov128_vf_gpr(vf13, t8); // qmtc2.ni vf13, t8 + c->psraw(t5, t5, 10); // psraw t5, t5, 10 + c->mov128_vf_gpr(vf14, t9); // qmtc2.ni vf14, t9 + c->psraw(t6, t6, 10); // psraw t6, t6, 10 + c->mov128_vf_gpr(vf1, t4); // qmtc2.ni vf1, t4 + c->psraw(t4, t7, 10); // psraw t4, t7, 10 + c->mov128_vf_gpr(vf2, t5); // qmtc2.ni vf2, t5 + c->daddiu(t2, t2, 48); // daddiu t2, t2, 48 + c->mov128_vf_gpr(vf3, t6); // qmtc2.ni vf3, t6 + bc = ((s64)c->sgpr64(t3)) <= 0; // blez t3, L36 + c->mov128_vf_gpr(vf4, t4); // qmtc2.ni vf4, t4 + if (bc) {goto block_50;} // branch non-likely + + + block_49: + // Unknown instr: vcallms 168 + vcallms_168(c); + c->ld(t4, 0, t2); // ld t4, 0(t2) + c->daddiu(t3, t3, -2); // daddiu t3, t3, -2 + c->ld(t5, 8, t2); // ld t5, 8(t2) + c->pextlh(t4, t4, r0); // pextlh t4, t4, r0 + c->ld(t6, 24, t2); // ld t6, 24(t2) + c->pextlh(t5, t5, r0); // pextlh t5, t5, r0 + c->ld(t7, 32, t2); // ld t7, 32(t2) + c->pextlh(t6, t6, r0); // pextlh t6, t6, r0 + c->lwu(t8, 16, t2); // lwu t8, 16(t2) + c->pextlh(t7, t7, r0); // pextlh t7, t7, r0 + c->lwu(t9, 40, t2); // lwu t9, 40(t2) + c->psraw(t4, t4, 10); // psraw t4, t4, 10 + c->mov128_vf_gpr(vf13, t8); // qmtc2.ni vf13, t8 + c->psraw(t5, t5, 10); // psraw t5, t5, 10 + c->mov128_vf_gpr(vf14, t9); // qmtc2.ni vf14, t9 + c->psraw(t6, t6, 10); // psraw t6, t6, 10 + c->mov128_vf_gpr(vf1, t4); // qmtc2.ni vf1, t4 + c->psraw(t4, t7, 10); // psraw t4, t7, 10 + c->mov128_vf_gpr(vf2, t5); // qmtc2.ni vf2, t5 + c->daddiu(t2, t2, 48); // daddiu t2, t2, 48 + c->mov128_vf_gpr(vf3, t6); // qmtc2.ni vf3, t6 + bc = ((s64)c->sgpr64(t3)) > 0; // bgtz t3, L35 + c->mov128_vf_gpr(vf4, t4); // qmtc2.ni vf4, t4 + if (bc) {goto block_49;} // branch non-likely + + + block_50: + // Unknown instr: vcallms 168 + vcallms_168(c); + // nop // sll r0, r0, 0 + + block_51: + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + + block_52: + c->mov64(t3, a1); // or t3, a1, r0 + c->lw(t6, 80, a3); // lw t6, 80(a3) + c->mov64(t4, v1); // or t4, v1, r0 + c->lw(t1, 4, t1); // lw t1, 4(t1) + c->daddiu(t5, at, 12048); // daddiu t5, at, 12048 + c->sw(t6, 92, at); // sw t6, 92(at) + c->pextlb(t2, r0, t1); // pextlb t2, r0, t1 + c->lq(t1, 0, a3); // lq t1, 0(a3) + c->pextlh(t7, t6, t6); // pextlh t7, t6, t6 + c->lq(t6, 16, a3); // lq t6, 16(a3) + c->pextlh(t8, t7, t7); // pextlh t8, t7, t7 + c->lq(t7, 32, a3); // lq t7, 32(a3) + c->pmulth(r0, t2, t8); // pmulth r0, t2, t8 + c->lq(t2, 48, a3); // lq t2, 48(a3) + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf1, t1); // qmtc2.ni vf1, t1 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf2, t6); // qmtc2.ni vf2, t6 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf3, t7); // qmtc2.ni vf3, t7 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf4, t2); // qmtc2.ni vf4, t2 + // Unknown instr: vcallms 178 + vcallms_178(c); + c->mov64(t1, t0); // or t1, t0, r0 + c->pextlw(t2, t1, t1); // pextlw t2, t1, t1 + c->lw(t1, 4, a0); // lw t1, 4(a0) + c->pcpyld(t2, t2, t2); // pcpyld t2, t2, t2 + c->lw(t8, 96, at); // lw t8, 96(at) + c->pmfhl_lh(t7); // pmfhl.lh t7 + c->lw(t6, 84, a3); // lw t6, 84(a3) + c->pextlb(t8, r0, t8); // pextlb t8, r0, t8 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->psrlh(t7, t7, 7); // psrlh t7, t7, 7 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pmulth(r0, t7, t8); // pmulth r0, t7, t8 + c->mfc1(r0, f31); // mfc1 r0, f31 + bc = c->sgpr64(t6) != 0; // bne t6, r0, L39 + c->mfc1(r0, f31); // mfc1 r0, f31 + if (bc) {goto block_54;} // branch non-likely + + // nop // sll r0, r0, 0 + c->addiu(t6, r0, 8); // addiu t6, r0, 8 + //beq r0, r0, L40 // beq r0, r0, L40 + c->sh(t6, 11984, at); // sh t6, 11984(at) + goto block_55; // branch always + + + block_54: + // nop // sll r0, r0, 0 + c->addiu(t6, r0, 6); // addiu t6, r0, 6 + // nop // sll r0, r0, 0 + c->sh(t6, 11984, at); // sh t6, 11984(at) + + block_55: + c->pmfhl_lh(t6); // pmfhl.lh t6 + c->mfc1(r0, f31); // mfc1 r0, f31 + // nop // sll r0, r0, 0 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->psrlh(t6, t6, 7); // psrlh t6, t6, 7 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->ppacb(t6, r0, t6); // ppacb t6, r0, t6 + c->mfc1(r0, f31); // mfc1 r0, f31 + // nop // sll r0, r0, 0 + c->lw(t7, 0, t4); // lw t7, 0(t4) + c->daddiu(t4, t4, 4); // daddiu t4, t4, 4 + c->sw(t6, 0, t5); // sw t6, 0(t5) + c->pextlb(t7, r0, t7); // pextlb t7, r0, t7 + c->sw(t6, 4, t5); // sw t6, 4(t5) + c->pextlh(t7, r0, t7); // pextlh t7, r0, t7 + c->sw(t6, 8, t5); // sw t6, 8(t5) + c->psllw(t7, t7, 2); // psllw t7, t7, 2 + c->sw(t6, 12, t5); // sw t6, 12(t5) + c->paddw(t9, t7, t2); // paddw t9, t7, t2 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->dsrl32(s3, t9, 0); // dsrl32 s3, t9, 0 + c->mov128_gpr_vf(t7, vf17); // qmfc2.ni t7, vf17 + c->pcpyud(t5, t9, r0); // pcpyud t5, t9, r0 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->dsrl32(t6, t5, 0); // dsrl32 t6, t5, 0 + c->mov128_gpr_vf(ra, vf13); // qmfc2.ni ra, vf13 + // nop // sll r0, r0, 0 + c->mfc1(r0, f31); // mfc1 r0, f31 + // nop // sll r0, r0, 0 + c->mfc1(r0, f31); // mfc1 r0, f31 + // nop // sll r0, r0, 0 + c->mfc1(r0, f31); // mfc1 r0, f31 + // nop // sll r0, r0, 0 + c->mfc1(r0, f31); // mfc1 r0, f31 + // nop // sll r0, r0, 0 + c->mfc1(r0, f31); // mfc1 r0, f31 + // nop // sll r0, r0, 0 + c->mfc1(r0, f31); // mfc1 r0, f31 + // nop // sll r0, r0, 0 + c->mov128_gpr_vf(t8, vf14); // qmfc2.ni t8, vf14 + // nop // sll r0, r0, 0 + c->lwu(t9, 0, t9); // lwu t9, 0(t9) + // nop // sll r0, r0, 0 + c->lwu(s3, 0, s3); // lwu s3, 0(s3) + // nop // sll r0, r0, 0 + c->lwu(t5, 0, t5); // lwu t5, 0(t5) + // nop // sll r0, r0, 0 + c->mov128_gpr_vf(s0, vf18); // qmfc2.ni s0, vf18 + // nop // sll r0, r0, 0 + c->lwu(t6, 0, t6); // lwu t6, 0(t6) + // nop // sll r0, r0, 0 + c->sq(ra, 0, t1); // sq ra, 0(t1) + c->daddiu(t3, t3, -4); // daddiu t3, t3, -4 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + bc = ((s64)c->sgpr64(t3)) <= 0; // blez t3, L42 + // nop // sll r0, r0, 0 + if (bc) {goto block_57;} // branch non-likely + + + block_56: + // Unknown instr: vcallms 183 + vcallms_183(c); + c->sq(t7, 16, t1); // sq t7, 16(t1) + // nop // sll r0, r0, 0 + c->sw(t9, 28, t1); // sw t9, 28(t1) + // nop // sll r0, r0, 0 + c->sq(t8, 32, t1); // sq t8, 32(t1) + // nop // sll r0, r0, 0 + c->sq(s0, 48, t1); // sq s0, 48(t1) + // nop // sll r0, r0, 0 + c->sw(s3, 60, t1); // sw s3, 60(t1) + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->mfc1(r0, f31); // mfc1 r0, f31 + // nop // sll r0, r0, 0 + c->lw(t8, 0, t4); // lw t8, 0(t4) + c->daddiu(t4, t4, 4); // daddiu t4, t4, 4 + c->mov128_gpr_vf(t7, vf19); // qmfc2.ni t7, vf19 + c->pextlb(t9, r0, t8); // pextlb t9, r0, t8 + c->mov128_gpr_vf(t8, vf20); // qmfc2.ni t8, vf20 + c->pextlh(t9, r0, t9); // pextlh t9, r0, t9 + c->mov128_gpr_vf(s3, vf15); // qmfc2.ni s3, vf15 + c->psllw(ra, t9, 2); // psllw ra, t9, 2 + c->mov128_gpr_vf(t9, vf16); // qmfc2.ni t9, vf16 + c->paddw(s0, ra, t2); // paddw s0, ra, t2 + c->sq(t7, 80, t1); // sq t7, 80(t1) + c->dsrl32(v0, s0, 0); // dsrl32 v0, s0, 0 + c->mov128_gpr_vf(t7, vf17); // qmfc2.ni t7, vf17 + c->pcpyud(ra, s0, r0); // pcpyud ra, s0, r0 + c->sq(s3, 64, t1); // sq s3, 64(t1) + c->dsrl32(s2, ra, 0); // dsrl32 s2, ra, 0 + c->mov128_gpr_vf(s1, vf13); // qmfc2.ni s1, vf13 + // nop // sll r0, r0, 0 + c->sq(t8, 112, t1); // sq t8, 112(t1) + // nop // sll r0, r0, 0 + c->sw(t5, 92, t1); // sw t5, 92(t1) + // nop // sll r0, r0, 0 + c->sw(t6, 124, t1); // sw t6, 124(t1) + // nop // sll r0, r0, 0 + c->sq(t9, 96, t1); // sq t9, 96(t1) + // nop // sll r0, r0, 0 + c->lwu(t9, 0, s0); // lwu t9, 0(s0) + // nop // sll r0, r0, 0 + c->lwu(s3, 0, v0); // lwu s3, 0(v0) + // nop // sll r0, r0, 0 + c->mov128_gpr_vf(t8, vf14); // qmfc2.ni t8, vf14 + c->daddiu(t1, t1, 128); // daddiu t1, t1, 128 + c->mov128_gpr_vf(s0, vf18); // qmfc2.ni s0, vf18 + c->daddiu(t3, t3, -4); // daddiu t3, t3, -4 + c->lwu(t5, 0, ra); // lwu t5, 0(ra) + // nop // sll r0, r0, 0 + c->sq(s1, 0, t1); // sq s1, 0(t1) + bc = ((s64)c->sgpr64(t3)) > 0; // bgtz t3, L41 + c->lwu(t6, 0, s2); // lwu t6, 0(s2) + if (bc) {goto block_56;} // branch non-likely + + + block_57: + // Unknown instr: vcallms 211 + vcallms_211(c); + c->sq(t7, 16, t1); // sq t7, 16(t1) + // nop // sll r0, r0, 0 + c->sw(t9, 28, t1); // sw t9, 28(t1) + // nop // sll r0, r0, 0 + c->sq(t8, 32, t1); // sq t8, 32(t1) + // nop // sll r0, r0, 0 + c->sq(s0, 48, t1); // sq s0, 48(t1) + // nop // sll r0, r0, 0 + c->sw(s3, 60, t1); // sw s3, 60(t1) + // nop // sll r0, r0, 0 + // nop // vnop + // nop // sll r0, r0, 0 + c->sqc2(vf19, 80, t1); // sqc2 vf19, 80(t1) + // nop // sll r0, r0, 0 + c->sqc2(vf15, 64, t1); // sqc2 vf15, 64(t1) + // nop // sll r0, r0, 0 + c->sqc2(vf16, 96, t1); // sqc2 vf16, 96(t1) + // nop // sll r0, r0, 0 + c->sqc2(vf20, 112, t1); // sqc2 vf20, 112(t1) + // nop // sll r0, r0, 0 + c->sw(t5, 92, t1); // sw t5, 92(t1) + // nop // sll r0, r0, 0 + c->sw(t6, 124, t1); // sw t6, 124(t1) + bc = c->sgpr64(a2) == 0; // beq a2, r0, L48 + // nop // sll r0, r0, 0 + if (bc) {goto block_65;} // branch non-likely + + c->mov64(t1, t0); // or t1, t0, r0 + c->lqc2(vf29, 64, a3); // lqc2 vf29, 64(a3) + c->mov64(t0, v1); // or t0, v1, r0 + c->lwc1(f0, 72, a3); // lwc1 f0, 72(a3) + c->daddiu(t0, a1, 3); // daddiu t0, a1, 3 + c->lwc1(f2, 76, a3); // lwc1 f2, 76(a3) + c->addiu(a3, r0, -4); // addiu a3, r0, -4 + // nop // sll r0, r0, 0 + c->cvtws(f0, f0); // cvt.w.s f0, f0 + c->and_(a3, t0, a3); // and a3, t0, a3 + c->cvtws(f2, f2); // cvt.w.s f2, f2 + c->lw(t2, 4, a0); // lw t2, 4(a0) + c->mfc1(a0, f0); // mfc1 a0, f0 + c->mov64(t0, a2); // or t0, a2, r0 + c->mfc1(t3, f2); // mfc1 t3, f2 + c->dsll(a2, a1, 5); // dsll a2, a1, 5 + c->dsra(a1, t3, 1); // dsra a1, t3, 1 + c->daddu(a3, v1, a3); // daddu a3, v1, a3 + bc = c->sgpr64(a1) == 0; // beq a1, r0, L45 + c->daddu(a2, t2, a2); // daddu a2, t2, a2 + if (bc) {goto block_62;} // branch non-likely + + c->pcpyh(v1, a0); // pcpyh v1, a0 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pcpyld(v1, v1, v1); // pcpyld v1, v1, v1 + c->sh(v1, 712, at); // sh v1, 712(at) + c->pcpyh(a0, a1); // pcpyh a0, a1 + c->sh(a0, 714, at); // sh a0, 714(at) + c->pcpyld(a0, a0, a0); // pcpyld a0, a0, a0 + c->ldr(s5, 0, a3); // ldr s5, 0(a3) + c->pextlw(a1, t1, t1); // pextlw a1, t1, t1 + c->ldl(s5, 7, a3); // ldl s5, 7(a3) + c->pcpyld(a1, a1, a1); // pcpyld a1, a1, a1 + c->ldr(s4, 8, a3); // ldr s4, 8(a3) + c->pextlb(t2, r0, s5); // pextlb t2, r0, s5 + c->ldl(s4, 15, a3); // ldl s4, 15(a3) + c->pextuh(t1, r0, t2); // pextuh t1, r0, t2 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pextlh(t3, r0, t2); // pextlh t3, r0, t2 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pextlb(t4, r0, s4); // pextlb t4, r0, s4 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pextuh(t2, r0, t4); // pextuh t2, r0, t4 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pextlh(t5, r0, t4); // pextlh t5, r0, t4 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->psllw(t3, t3, 2); // psllw t3, t3, 2 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->psllw(t4, t1, 2); // psllw t4, t1, 2 + // Unknown instr: vcallms 215 + vcallms_215(c); + + c->psllw(t6, t5, 2); // psllw t6, t5, 2 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->psllw(t5, t2, 2); // psllw t5, t2, 2 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->paddw(t1, t3, a1); // paddw t1, t3, a1 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->paddw(t4, t4, a1); // paddw t4, t4, a1 + c->lwu(t3, 0, t1); // lwu t3, 0(t1) + c->paddw(t2, t6, a1); // paddw t2, t6, a1 + c->lwu(t9, 0, t4); // lwu t9, 0(t4) + c->paddw(t5, t5, a1); // paddw t5, t5, a1 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->dsrl32(s4, t1, 0); // dsrl32 s4, t1, 0 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->dsrl32(s3, t4, 0); // dsrl32 s3, t4, 0 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->dsrl32(ra, t2, 0); // dsrl32 ra, t2, 0 + c->daddiu(a2, a2, -128); // daddiu a2, a2, -128 + c->dsrl32(t8, t5, 0); // dsrl32 t8, t5, 0 + c->daddiu(a3, a3, 16); // daddiu a3, a3, 16 + c->pcpyud(t7, t1, r0); // pcpyud t7, t1, r0 + c->lwu(s5, 0, t2); // lwu s5, 0(t2) + c->pcpyud(t6, t4, r0); // pcpyud t6, t4, r0 + c->lwu(s2, 0, t5); // lwu s2, 0(t5) + c->pcpyud(t4, t2, r0); // pcpyud t4, t2, r0 + c->lwu(s4, 0, s4); // lwu s4, 0(s4) + c->pcpyud(t5, t5, r0); // pcpyud t5, t5, r0 + c->lwu(s3, 0, s3); // lwu s3, 0(s3) + c->pextlw(t9, t9, t3); // pextlw t9, t9, t3 + c->lwu(ra, 0, ra); // lwu ra, 0(ra) + c->pextlw(t3, s2, s5); // pextlw t3, s2, s5 + c->lwu(s2, 0, t8); // lwu s2, 0(t8) + c->pextlw(s5, s3, s4); // pextlw s5, s3, s4 + c->lwu(t8, 0, t7); // lwu t8, 0(t7) + c->pextlw(t7, s2, ra); // pextlw t7, s2, ra + c->lwu(ra, 0, t6); // lwu ra, 0(t6) + c->pextlb(t6, r0, t9); // pextlb t6, r0, t9 + c->lwu(t9, 0, t4); // lwu t9, 0(t4) + c->pextlb(t4, r0, s5); // pextlb t4, r0, s5 + c->lwu(s5, 0, t5); // lwu s5, 0(t5) + c->pextlw(ra, ra, t8); // pextlw ra, ra, t8 + c->mov128_gpr_vf(t5, vf17); // qmfc2.ni t5, vf17 + c->pextlw(t8, s5, t9); // pextlw t8, s5, t9 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pextlb(t9, r0, ra); // pextlb t9, r0, ra + c->mfc1(r0, f31); // mfc1 r0, f31 + c->paddh(t9, t4, t9); // paddh t9, t4, t9 + c->mov128_gpr_vf(t4, vf13); // qmfc2.ni t4, vf13 + c->pmulth(r0, t9, a0); // pmulth r0, t9, a0 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pextlb(t3, r0, t3); // pextlb t3, r0, t3 + c->sq(t5, 144, a2); // sq t5, 144(a2) + c->pmaddh(r0, t6, v1); // pmaddh r0, t6, v1 + c->sq(t4, 128, a2); // sq t4, 128(a2) + c->pextlb(t5, r0, t7); // pextlb t5, r0, t7 + c->ldr(t1, 0, a3); // ldr t1, 0(a3) + c->pextlb(t7, r0, t8); // pextlb t7, r0, t8 + c->ldl(t1, 7, a3); // ldl t1, 7(a3) + c->pmfhl_lh(t6); // pmfhl.lh t6 + c->mov128_gpr_vf(t4, vf18); // qmfc2.ni t4, vf18 + c->paddh(t5, t5, t7); // paddh t5, t5, t7 + c->ldr(t2, 8, a3); // ldr t2, 8(a3) + c->psrlh(t6, t6, 8); // psrlh t6, t6, 8 + c->ldl(t2, 15, a3); // ldl t2, 15(a3) + c->ppacb(t6, r0, t6); // ppacb t6, r0, t6 + c->sq(t4, 176, a2); // sq t4, 176(a2) + c->dsrl32(t4, t6, 0); // dsrl32 t4, t6, 0 + c->daddiu(t0, t0, -4); // daddiu t0, t0, -4 + c->pmulth(r0, t5, a0); // pmulth r0, t5, a0 + c->mov128_gpr_vf(t5, vf14); // qmfc2.ni t5, vf14 + c->pextlb(t1, r0, t1); // pextlb t1, r0, t1 + c->sw(t6, 156, a2); // sw t6, 156(a2) + c->pmaddh(r0, t3, v1); // pmaddh r0, t3, v1 + c->sw(t4, 188, a2); // sw t4, 188(a2) + c->pextlb(t3, r0, t2); // pextlb t3, r0, t2 + c->sq(t5, 160, a2); // sq t5, 160(a2) + c->pextuh(t2, r0, t1); // pextuh t2, r0, t1 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pmfhl_lh(t6); // pmfhl.lh t6 + c->mov128_gpr_vf(t5, vf19); // qmfc2.ni t5, vf19 + c->pextlh(t4, r0, t1); // pextlh t4, r0, t1 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->psrlh(t1, t6, 8); // psrlh t1, t6, 8 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->ppacb(t6, r0, t1); // ppacb t6, r0, t1 + c->sq(t5, 208, a2); // sq t5, 208(a2) + c->dsrl32(t1, t6, 0); // dsrl32 t1, t6, 0 + c->sw(t6, 220, a2); // sw t6, 220(a2) + c->pextuh(t5, r0, t3); // pextuh t5, r0, t3 + c->mov128_gpr_vf(t6, vf15); // qmfc2.ni t6, vf15 + c->pextlh(t7, r0, t3); // pextlh t7, r0, t3 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->psllw(t3, t4, 2); // psllw t3, t4, 2 + c->sq(t6, 192, a2); // sq t6, 192(a2) + c->psllw(t4, t2, 2); // psllw t4, t2, 2 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->psllw(t6, t7, 2); // psllw t6, t7, 2 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->psllw(t5, t5, 2); // psllw t5, t5, 2 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->paddw(s5, t3, a1); // paddw s5, t3, a1 + c->mov128_gpr_vf(t2, vf20); // qmfc2.ni t2, vf20 + c->paddw(t4, t4, a1); // paddw t4, t4, a1 + c->lwu(t3, 0, s5); // lwu t3, 0(s5) + c->paddw(s4, t6, a1); // paddw s4, t6, a1 + c->lwu(t9, 0, t4); // lwu t9, 0(t4) + bc = ((s64)c->sgpr64(t0)) <= 0; // blez t0, L44 + c->paddw(t5, t5, a1); // paddw t5, t5, a1 + if (bc) {goto block_61;} // branch non-likely + + + block_60: + c->dsrl32(s3, s5, 0); // dsrl32 s3, s5, 0 + // Unknown instr: vcallms 221 + vcallms_221(c); + + c->dsrl32(s0, t4, 0); // dsrl32 s0, t4, 0 + c->dsrl32(s2, s4, 0); // dsrl32 s2, s4, 0 + c->dsrl32(t8, t5, 0); // dsrl32 t8, t5, 0 + c->daddiu(a2, a2, 128); // daddiu a2, a2, 128 + c->pcpyud(t7, s5, r0); // pcpyud t7, s5, r0 + c->lwu(ra, 0, s4); // lwu ra, 0(s4) + c->pcpyud(t6, t4, r0); // pcpyud t6, t4, r0 + c->lwu(s1, 0, t5); // lwu s1, 0(t5) + c->pcpyud(t4, s4, r0); // pcpyud t4, s4, r0 + c->lwu(s3, 0, s3); // lwu s3, 0(s3) + c->pcpyud(t5, t5, r0); // pcpyud t5, t5, r0 + c->lwu(s0, 0, s0); // lwu s0, 0(s0) + c->pextlw(t9, t9, t3); // pextlw t9, t9, t3 + c->lwu(s2, 0, s2); // lwu s2, 0(s2) + c->pextlw(t3, s1, ra); // pextlw t3, s1, ra + c->lwu(s1, 0, t8); // lwu s1, 0(t8) + c->pextlw(ra, s0, s3); // pextlw ra, s0, s3 + c->lwu(t8, 0, t7); // lwu t8, 0(t7) + c->pextlw(t7, s1, s2); // pextlw t7, s1, s2 + c->lwu(s3, 0, t6); // lwu s3, 0(t6) + c->pextlb(t6, r0, t9); // pextlb t6, r0, t9 + c->lwu(t9, 0, t4); // lwu t9, 0(t4) + c->pextlb(t4, r0, ra); // pextlb t4, r0, ra + c->lwu(t5, 0, t5); // lwu t5, 0(t5) + c->pextlw(t8, s3, t8); // pextlw t8, s3, t8 + c->sq(t2, 112, a2); // sq t2, 112(a2) + c->pextlw(t2, t5, t9); // pextlw t2, t5, t9 + c->mov128_gpr_vf(t5, vf17); // qmfc2.ni t5, vf17 + c->pextlb(t8, r0, t8); // pextlb t8, r0, t8 + c->sw(t1, 124, a2); // sw t1, 124(a2) + c->paddh(t1, t4, t8); // paddh t1, t4, t8 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pmulth(r0, t1, a0); // pmulth r0, t1, a0 + c->mov128_gpr_vf(t4, vf13); // qmfc2.ni t4, vf13 + c->pextlb(t1, r0, t3); // pextlb t1, r0, t3 + c->sq(t5, 144, a2); // sq t5, 144(a2) + c->pmaddh(r0, t6, v1); // pmaddh r0, t6, v1 + c->ldr(s5, 16, a3); // ldr s5, 16(a3) + c->pextlb(t3, r0, t7); // pextlb t3, r0, t7 + c->sq(t4, 128, a2); // sq t4, 128(a2) + c->pextlb(t2, r0, t2); // pextlb t2, r0, t2 + c->ldl(s5, 23, a3); // ldl s5, 23(a3) + c->pmfhl_lh(t4); // pmfhl.lh t4 + c->ldr(s4, 24, a3); // ldr s4, 24(a3) + c->paddh(t2, t3, t2); // paddh t2, t3, t2 + c->mov128_gpr_vf(t5, vf18); // qmfc2.ni t5, vf18 + c->psrlh(t3, t4, 8); // psrlh t3, t4, 8 + c->ldl(s4, 31, a3); // ldl s4, 31(a3) + c->ppacb(t3, r0, t3); // ppacb t3, r0, t3 + c->sq(t5, 176, a2); // sq t5, 176(a2) + c->dsrl32(t5, t3, 0); // dsrl32 t5, t3, 0 + c->daddiu(t0, t0, -4); // daddiu t0, t0, -4 + c->pmulth(r0, t2, a0); // pmulth r0, t2, a0 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pextlb(t4, r0, s5); // pextlb t4, r0, s5 + c->mov128_gpr_vf(t6, vf14); // qmfc2.ni t6, vf14 + c->pmaddh(r0, t1, v1); // pmaddh r0, t1, v1 + c->sw(t3, 156, a2); // sw t3, 156(a2) + c->pextlb(t3, r0, s4); // pextlb t3, r0, s4 + c->sw(t5, 188, a2); // sw t5, 188(a2) + c->pextuh(t2, r0, t4); // pextuh t2, r0, t4 + c->sq(t6, 160, a2); // sq t6, 160(a2) + c->pmfhl_lh(t6); // pmfhl.lh t6 + c->mov128_gpr_vf(t1, vf16); // qmfc2.ni t1, vf16 + c->pextlh(t4, r0, t4); // pextlh t4, r0, t4 + c->mov128_gpr_vf(t5, vf19); // qmfc2.ni t5, vf19 + c->psrlh(t6, t6, 8); // psrlh t6, t6, 8 + c->sq(t1, 96, a2); // sq t1, 96(a2) + c->ppacb(t6, r0, t6); // ppacb t6, r0, t6 + c->sq(t5, 208, a2); // sq t5, 208(a2) + c->dsrl32(t1, t6, 0); // dsrl32 t1, t6, 0 + c->daddiu(a3, a3, 16); // daddiu a3, a3, 16 + c->pextuh(t5, r0, t3); // pextuh t5, r0, t3 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pextlh(t7, r0, t3); // pextlh t7, r0, t3 + c->mov128_gpr_vf(t8, vf15); // qmfc2.ni t8, vf15 + c->psllw(t3, t4, 2); // psllw t3, t4, 2 + c->sw(t6, 220, a2); // sw t6, 220(a2) + c->psllw(t4, t2, 2); // psllw t4, t2, 2 + c->sq(t8, 192, a2); // sq t8, 192(a2) + c->psllw(t6, t7, 2); // psllw t6, t7, 2 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->psllw(t5, t5, 2); // psllw t5, t5, 2 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->paddw(s5, t3, a1); // paddw s5, t3, a1 + c->mov128_gpr_vf(t2, vf20); // qmfc2.ni t2, vf20 + c->paddw(t4, t4, a1); // paddw t4, t4, a1 + c->lwu(t3, 0, s5); // lwu t3, 0(s5) + c->paddw(s4, t6, a1); // paddw s4, t6, a1 + c->lwu(t9, 0, t4); // lwu t9, 0(t4) + bc = ((s64)c->sgpr64(t0)) > 0; // bgtz t0, L43 + c->paddw(t5, t5, a1); // paddw t5, t5, a1 + if (bc) {goto block_60;} // branch non-likely + + + block_61: + // nop // sll r0, r0, 0 + // Unknown instr: vcallms 257 + vcallms_257(c); + + // nop // sll r0, r0, 0 + c->sq(t2, 240, a2); // sq t2, 240(a2) + // nop // sll r0, r0, 0 + c->mov128_gpr_vf(v1, vf16); // qmfc2.i v1, vf16 + // nop // sll r0, r0, 0 + c->sw(t1, 252, a2); // sw t1, 252(a2) + //beq r0, r0, L48 // beq r0, r0, L48 + c->sq(v1, 224, a2); // sq v1, 224(a2) + goto block_65; // branch always + + + block_62: + // Unknown instr: vcallms 259 + vcallms_259(c); + + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->sh(a0, 712, at); // sh a0, 712(at) + // nop // sll r0, r0, 0 + c->sh(a1, 714, at); // sh a1, 714(at) + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->lbu(v1, 0, a3); // lbu v1, 0(a3) + // nop // sll r0, r0, 0 + c->lbu(a0, 4, a3); // lbu a0, 4(a3) + // nop // sll r0, r0, 0 + c->lbu(a1, 8, a3); // lbu a1, 8(a3) + c->dsll(v1, v1, 2); // dsll v1, v1, 2 + c->lbu(t2, 12, a3); // lbu t2, 12(a3) + c->dsll(a0, a0, 2); // dsll a0, a0, 2 + // nop // sll r0, r0, 0 + c->dsll(t3, a1, 2); // dsll t3, a1, 2 + // nop // sll r0, r0, 0 + c->dsll(t4, t2, 2); // dsll t4, t2, 2 + c->mov128_gpr_vf(t2, vf17); // qmfc2.i t2, vf17 + c->daddu(s5, v1, t1); // daddu s5, v1, t1 + c->daddiu(v1, a3, 16); // daddiu v1, a3, 16 + c->daddu(a1, a0, t1); // daddu a1, a0, t1 + // nop // sll r0, r0, 0 + c->daddu(s4, t3, t1); // daddu s4, t3, t1 + // nop // sll r0, r0, 0 + c->daddu(a0, t4, t1); // daddu a0, t4, t1 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->mov128_gpr_vf(t7, vf13); // qmfc2.ni t7, vf13 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->mov128_gpr_vf(a3, vf18); // qmfc2.ni a3, vf18 + // nop // sll r0, r0, 0 + c->lwu(t6, 0, s5); // lwu t6, 0(s5) + // nop // sll r0, r0, 0 + c->lwu(t3, 0, a1); // lwu t3, 0(a1) + // nop // sll r0, r0, 0 + c->lwu(t4, 0, s4); // lwu t4, 0(s4) + // nop // sll r0, r0, 0 + c->mov128_gpr_vf(t5, vf14); // qmfc2.ni t5, vf14 + // nop // sll r0, r0, 0 + c->lwu(a0, 0, a0); // lwu a0, 0(a0) + c->daddiu(a1, t0, -4); // daddiu a1, t0, -4 + c->sq(t7, 0, a2); // sq t7, 0(a2) + // nop // sll r0, r0, 0 + c->mov128_gpr_vf(t0, vf19); // qmfc2.ni t0, vf19 + // nop // sll r0, r0, 0 + c->sq(t2, 16, a2); // sq t2, 16(a2) + // nop // sll r0, r0, 0 + c->sw(t6, 28, a2); // sw t6, 28(a2) + bc = ((s64)c->sgpr64(a1)) <= 0; // blez a1, L47 + c->sq(a3, 48, a2); // sq a3, 48(a2) + if (bc) {goto block_64;} // branch non-likely + + + block_63: + // Unknown instr: vcallms 264 + vcallms_264(c); + + c->sw(t3, 60, a2); // sw t3, 60(a2) + // nop // sll r0, r0, 0 + c->sq(t5, 32, a2); // sq t5, 32(a2) + // nop // sll r0, r0, 0 + c->sq(t0, 80, a2); // sq t0, 80(a2) + // nop // sll r0, r0, 0 + c->sw(t4, 92, a2); // sw t4, 92(a2) + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->lbu(a3, 0, v1); // lbu a3, 0(v1) + // nop // sll r0, r0, 0 + c->lbu(t0, 4, v1); // lbu t0, 4(v1) + // nop // sll r0, r0, 0 + c->lbu(t2, 8, v1); // lbu t2, 8(v1) + c->dsll(t3, a3, 2); // dsll t3, a3, 2 + c->lbu(a3, 12, v1); // lbu a3, 12(v1) + c->dsll(t6, t0, 2); // dsll t6, t0, 2 + c->mov128_gpr_vf(t0, vf15); // qmfc2.i t0, vf15 + c->dsll(t4, t2, 2); // dsll t4, t2, 2 + c->mov128_gpr_vf(t2, vf20); // qmfc2.ni t2, vf20 + c->dsll(t5, a3, 2); // dsll t5, a3, 2 + c->mov128_gpr_vf(a3, vf17); // qmfc2.ni a3, vf17 + c->daddu(s5, t3, t1); // daddu s5, t3, t1 + c->daddiu(v1, v1, 16); // daddiu v1, v1, 16 + c->daddu(t3, t6, t1); // daddu t3, t6, t1 + c->mov128_gpr_vf(t6, vf16); // qmfc2.ni t6, vf16 + c->daddu(s4, t4, t1); // daddu s4, t4, t1 + c->sq(t0, 64, a2); // sq t0, 64(a2) + c->daddu(t0, t5, t1); // daddu t0, t5, t1 + c->sq(t2, 112, a2); // sq t2, 112(a2) + // nop // sll r0, r0, 0 + c->mov128_gpr_vf(t2, vf13); // qmfc2.ni t2, vf13 + // nop // sll r0, r0, 0 + c->sw(a0, 124, a2); // sw a0, 124(a2) + // nop // sll r0, r0, 0 + c->sq(t6, 96, a2); // sq t6, 96(a2) + // nop // sll r0, r0, 0 + c->mov128_gpr_vf(t6, vf18); // qmfc2.ni t6, vf18 + // nop // sll r0, r0, 0 + c->lwu(t7, 0, s5); // lwu t7, 0(s5) + // nop // sll r0, r0, 0 + c->lwu(t3, 0, t3); // lwu t3, 0(t3) + // nop // sll r0, r0, 0 + c->lwu(t4, 0, s4); // lwu t4, 0(s4) + // nop // sll r0, r0, 0 + c->mov128_gpr_vf(t5, vf14); // qmfc2.ni t5, vf14 + c->daddiu(a2, a2, 128); // daddiu a2, a2, 128 + c->lwu(a0, 0, t0); // lwu a0, 0(t0) + c->daddiu(a1, a1, -4); // daddiu a1, a1, -4 + c->sq(t2, 0, a2); // sq t2, 0(a2) + // nop // sll r0, r0, 0 + c->mov128_gpr_vf(t0, vf19); // qmfc2.ni t0, vf19 + // nop // sll r0, r0, 0 + c->sq(a3, 16, a2); // sq a3, 16(a2) + // nop // sll r0, r0, 0 + c->sw(t7, 28, a2); // sw t7, 28(a2) + bc = ((s64)c->sgpr64(a1)) > 0; // bgtz a1, L46 + c->sq(t6, 48, a2); // sq t6, 48(a2) + if (bc) {goto block_63;} // branch non-likely + + + block_64: + // nop // sll r0, r0, 0 + // Unknown instr: vcallms 292 + vcallms_292(c); + + // nop // sll r0, r0, 0 + c->sw(t3, 60, a2); // sw t3, 60(a2) + // nop // sll r0, r0, 0 + c->sq(t5, 32, a2); // sq t5, 32(a2) + // nop // sll r0, r0, 0 + c->sq(t0, 80, a2); // sq t0, 80(a2) + // nop // sll r0, r0, 0 + c->sw(t4, 92, a2); // sw t4, 92(a2) + // nop // sll r0, r0, 0 + c->mov128_gpr_vf(v1, vf15); // qmfc2.i v1, vf15 + // nop // sll r0, r0, 0 + c->mov128_gpr_vf(a1, vf20); // qmfc2.ni a1, vf20 + // nop // sll r0, r0, 0 + c->mov128_gpr_vf(a3, vf16); // qmfc2.ni a3, vf16 + // nop // sll r0, r0, 0 + c->sq(v1, 64, a2); // sq v1, 64(a2) + // nop // sll r0, r0, 0 + c->sq(a1, 112, a2); // sq a1, 112(a2) + // nop // sll r0, r0, 0 + c->sw(a0, 124, a2); // sw a0, 124(a2) + // nop // sll r0, r0, 0 + c->sq(a3, 96, a2); // sq a3, 96(a2) + + block_65: + c->gprs[v1].du64[0] = 0; // or v1, r0, r0 + c->lw(v1, 644, at); // lw v1, 644(at) + c->lw(a0, 716, at); // lw a0, 716(at) + c->daddiu(a1, at, 12064); // daddiu a1, at, 12064 + c->sw(v1, 64, at); // sw v1, 64(at) + c->sw(a0, 60, at); // sw a0, 60(at) + c->sw(a1, 68, at); // sw a1, 68(at) + c->sw(r0, 72, at); // sw r0, 72(at) + c->lw(v1, 748, at); // lw v1, 748(at) + call_addr = c->gprs[v1].du32[0]; // function call: + // Unknown instr: sllv v0, ra, r0 + // c->jalr(call_addr); // jalr ra, v1 + generic_prepare_dma_double::execute(c); + c->lw(v1, 752, at); // lw v1, 752(at) + call_addr = c->gprs[v1].du32[0]; // function call: + // Unknown instr: sllv v0, ra, r0 + // c->jalr(call_addr); // jalr ra, v1 + generic_envmap_dproc::execute(c); + c->lw(v1, 756, at); // lw v1, 756(at) + call_addr = c->gprs[v1].du32[0]; // function call: + // Unknown instr: sllv v0, ra, r0 + // c->jalr(call_addr); // jalr ra, v1 + generic_interp_dproc::execute(c); + c->lw(v1, 760, at); // lw v1, 760(at) + call_addr = c->gprs[v1].du32[0]; // function call: + // Unknown instr: sllv v0, ra, r0 + // c->jalr(call_addr); // jalr ra, v1 + generic_no_light_dproc::execute(c); + c->lw(v1, 40, at); // lw v1, 40(at) + c->lw(a0, 56, at); // lw a0, 56(at) + c->mov64(a3, v1); // or a3, v1, r0 + // nop // sll r0, r0, 0 + get_fake_spad_addr(at, cache.fake_scratchpad_data, 0, c);// lui at, 28672 + c->lui(a2, 4096); // lui a2, 4096 + c->lwu(a1, 76, at); // lwu a1, 76(at) + c->ori(a2, a2, 53248); // ori a2, a2, 53248 + // c->lw(t1, 0, a2); // lw t1, 0(a2) + // nop // sll r0, r0, 0 + c->daddiu(t0, at, 108); // daddiu t0, at, 108 + c->andi(a3, a3, 16383); // andi a3, a3, 16383 + c->andi(t1, t1, 256); // andi t1, t1, 256 + // nop // sll r0, r0, 0 + bc = true; // c->sgpr64(t1) == 0; // beq t1, r0, L50 + // nop // sll r0, r0, 0 + if (bc) {goto block_69;} // branch non-likely + + c->mov64(t1, a2); // or t1, a2, r0 + // nop // sll r0, r0, 0 + + block_67: + c->lw(t2, 0, t0); // lw t2, 0(t0) + // nop // sll r0, r0, 0 + c->lw(t3, 0, t1); // lw t3, 0(t1) + // nop // sll r0, r0, 0 + c->andi(t3, t3, 256); // andi t3, t3, 256 + c->daddiu(t2, t2, 1); // daddiu t2, t2, 1 + bc = c->sgpr64(t3) != 0; // bne t3, r0, L49 + c->sw(t2, 0, t0); // sw t2, 0(t0) + if (bc) {goto block_67;} // branch non-likely + + c->gprs[t0].du64[0] = 0; // or t0, r0, r0 + + block_69: + c->dsll(t0, a0, 4); // dsll t0, a0, 4 + // c->sw(a3, 128, a2); // sw a3, 128(a2) + sadr = c->sgpr64(a3); + // nop // sll r0, r0, 0 + // c->sw(a1, 16, a2); // sw a1, 16(a2) + madr = c->sgpr64(a1); + c->addiu(a3, r0, 256); // addiu a3, r0, 256 + // c->sw(a0, 32, a2); // sw a0, 32(a2) + qwc = c->sgpr64(a0); + c->daddu(a0, a1, t0); // daddu a0, a1, t0 + // c->sw(a3, 0, a2); // sw a3, 0(a2) + spad_from_dma_no_sadr_off(cache.fake_scratchpad_data, madr, sadr, qwc); + // nop // sll r0, r0, 0 + c->sw(a0, 76, at); // sw a0, 76(at) + c->gprs[a0].du64[0] = 0; // or a0, r0, r0 + c->xori(v1, v1, 4608); // xori v1, v1, 4608 + c->sw(v1, 40, at); // sw v1, 40(at) + // nop // sll r0, r0, 0 + c->lw(v1, 740, at); // lw v1, 740(at) + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + bc = c->sgpr64(v1) == 0; // beq v1, r0, L9 + // nop // sll r0, r0, 0 + if (bc) {goto block_1;} // branch non-likely + + + block_70: + c->gprs[v0].du64[0] = 0; // or v0, r0, r0 + c->ld(ra, 384, at); // ld ra, 384(at) + c->lq(gp, 496, at); // lq gp, 496(at) + c->lq(s5, 480, at); // lq s5, 480(at) + c->lq(s4, 464, at); // lq s4, 464(at) + c->lq(s3, 448, at); // lq s3, 448(at) + c->lq(s2, 432, at); // lq s2, 432(at) + c->lq(s1, 416, at); // lq s1, 416(at) + c->lq(s0, 400, at); // lq s0, 400(at) + //jr ra // jr ra + c->daddiu(sp, sp, 128); // daddiu sp, sp, 128 + goto end_of_function; // return + + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + end_of_function: + return c->gprs[v0].du64[0]; +} + +void link() { + cache.fake_scratchpad_data = intern_from_c("*fake-scratchpad-data*").c(); + gLinkedFunctionTable.reg("generic-tie-convert", execute, 256); +} + +} // namespace generic_tie_convert +} // namespace Mips2C + diff --git a/game/mips2c/functions/tie_methods.cpp b/game/mips2c/functions/tie_methods.cpp new file mode 100644 index 0000000000..ce0ecaf34d --- /dev/null +++ b/game/mips2c/functions/tie_methods.cpp @@ -0,0 +1,1963 @@ + +//--------------------------MIPS2C--------------------- +#include "game/mips2c/mips2c_private.h" +#include "game/kernel/kscheme.h" +namespace Mips2C { +namespace draw_inline_array_instance_tie { +struct Cache { + void* fake_scratchpad_data; // *fake-scratchpad-data* + void* instance_tie_work_copy; // *instance-tie-work-copy* + void* wind_work; // *wind-work* + void* math_camera; // *math-camera* +} cache; + +Vf background_vu0_data[16]; + +u16 vcallms_42(ExecutionContext* c) { + // TODO + // lq.xyzw vf16, 0(vi00) | nop + c->vfs[vf16].vf = background_vu0_data[0]; + // lq.xyzw vf17, 1(vi00) | nop + c->vfs[vf17].vf = background_vu0_data[1]; + // lq.xyzw vf18, 2(vi00) | nop + c->vfs[vf18].vf = background_vu0_data[2]; + // lq.xyzw vf19, 3(vi00) | nop + c->vfs[vf19].vf = background_vu0_data[3]; + // lq.xyzw vf28, 8(vi00) | mulax.xyzw ACC, vf16, vf02 + c->vfs[vf28].vf = background_vu0_data[8]; + c->acc.vf.mula(Mask::xyzw, c->vfs[vf16].vf, c->vfs[vf02].vf.x()); + + // lq.xyzw vf29, 9(vi00) | madday.xyzw ACC, vf17, vf02 + c->vfs[vf29].vf = background_vu0_data[9]; + c->acc.vf.madda(Mask::xyzw, c->vfs[vf17].vf, c->vfs[vf02].vf.y()); + + // lq.xyzw vf30, 10(vi00) | maddaz.xyzw ACC, vf18, vf02 + c->vfs[vf30].vf = background_vu0_data[10]; + c->acc.vf.madda(Mask::xyzw, c->vfs[vf18].vf, c->vfs[vf02].vf.z()); + + // lq.xyzw vf31, 11(vi00) | msubaw.xyzw ACC, vf19, vf00 + c->vfs[vf31].vf = background_vu0_data[11]; + c->acc.vf.msuba(Mask::xyzw, c->vfs[vf19].vf, 1.f); + + // lq.xyzw vf24, 4(vi00) | maddw.xyzw vf04, vf01, vf02 + c->vfs[vf24].vf = background_vu0_data[4]; + u16 vi01 = + c->acc.vf.madd_flag(Mask::xyzw, c->vfs[vf04].vf, c->vfs[vf01].vf, c->vfs[vf02].vf.w()) & 0xf0; + + // lq.xyzw vf25, 5(vi00) | mulax.xyzw ACC, vf28, vf02 + c->vfs[vf25].vf = background_vu0_data[5]; + c->acc.vf.mula(Mask::xyzw, c->vfs[vf28].vf, c->vfs[vf02].vf.x()); + // lq.xyzw vf26, 6(vi00) | madday.xyzw ACC, vf29, vf02 + c->vfs[vf26].vf = background_vu0_data[6]; + c->acc.vf.madda(Mask::xyzw, c->vfs[vf29].vf, c->vfs[vf02].vf.y()); + // lq.xyzw vf27, 7(vi00) | maddaz.xyzw ACC, vf30, vf02 + c->vfs[vf27].vf = background_vu0_data[7]; + c->acc.vf.madda(Mask::xyzw, c->vfs[vf30].vf, c->vfs[vf02].vf.z()); + // fmand vi01, vi02 | maddw.xyzw vf05, vf31, vf00 + c->acc.vf.madd(Mask::xyzw, c->vfs[vf05].vf, c->vfs[vf31].vf, 1.f); + // nop | mulax.xyzw ACC, vf24, vf02 + c->acc.vf.mula(Mask::xyzw, c->vfs[vf24].vf, c->vfs[vf02].vf.x()); + // nop | madday.xyzw ACC, vf25, vf02 + c->acc.vf.madda(Mask::xyzw, c->vfs[vf25].vf, c->vfs[vf02].vf.y()); + // nop | maddaz.xyzw ACC, vf26, vf02 :e + c->acc.vf.madda(Mask::xyzw, c->vfs[vf26].vf, c->vfs[vf02].vf.z()); + // nop | maddw.xyzw vf06, vf27, vf00 + c->acc.vf.madd(Mask::xyzw, c->vfs[vf06].vf, c->vfs[vf27].vf, 1.f); + + return vi01; +} + +void vcallms_29(ExecutionContext* c) { + // lq.xyzw vf24, 4(vi00) | nop + c->vfs[vf24].vf = background_vu0_data[4]; + // lq.xyzw vf25, 5(vi00) | nop + c->vfs[vf25].vf = background_vu0_data[5]; + // lq.xyzw vf26, 6(vi00) | nop :e + c->vfs[vf26].vf = background_vu0_data[6]; + // lq.xyzw vf27, 7(vi00) | nop + c->vfs[vf27].vf = background_vu0_data[7]; +} + +/*! + * Set up the VU0 context like it would be for background. See background-upload-vu0 in + * background.gc for more details. + */ +void init_background(ExecutionContext* c) { + // this first part is GOAL to init VU1 vf registers from the math camera. + + // lw v1, *math-camera*(s7) + c->load_symbol(v1, cache.math_camera); + // lqc2 vf16, 860(v1) + c->lqc2(vf16, 860, v1); + // lqc2 vf17, 876(v1) + c->lqc2(vf17, 876, v1); + // lqc2 vf18, 892(v1) + c->lqc2(vf18, 892, v1); + // lqc2 vf19, 908(v1) + c->lqc2(vf19, 908, v1); + // lqc2 vf20, 988(v1) + c->lqc2(vf20, 988, v1); + // lqc2 vf21, 1004(v1) + c->lqc2(vf21, 1004, v1); + // lqc2 vf22, 1020(v1) + c->lqc2(vf22, 1020, v1); + // lqc2 vf23, 1036(v1) + c->lqc2(vf23, 1036, v1); + // lqc2 vf24, 364(v1) + c->lqc2(vf24, 364, v1); + // lqc2 vf25, 380(v1) + c->lqc2(vf25, 380, v1); + // lqc2 vf26, 396(v1) + c->lqc2(vf26, 396, v1); + // lqc2 vf27, 412(v1) + c->lqc2(vf27, 412, v1); + // lqc2 vf28, 572(v1) + c->lqc2(vf28, 572, v1); + // lqc2 vf29, 588(v1) + c->lqc2(vf29, 588, v1); + // lqc2 vf30, 604(v1) + c->lqc2(vf30, 604, v1); + // lqc2 vf31, 620(v1) + c->lqc2(vf31, 620, v1); + // lqc2 vf31, 620(v1) + c->lqc2(vf31, 620, v1); + + // dump them in VU0 data memory for fast access later. + // sq.xyzw vf24, 4(vi00) | maxw.xyzw vf01, vf00, vf00 + c->vfs[vf01].vf.fill(1.f); + background_vu0_data[4] = c->vfs[vf24].vf; + // sq.xyzw vf25, 5(vi00) | nop + background_vu0_data[5] = c->vfs[vf25].vf; + // sq.xyzw vf26, 6(vi00) | nop + background_vu0_data[6] = c->vfs[vf26].vf; + // sq.xyzw vf27, 7(vi00) | nop + background_vu0_data[7] = c->vfs[vf27].vf; + // sq.xyzw vf16, 0(vi00) | mulz.xyzw vf24, vf01, vf24 + background_vu0_data[0] = c->vfs[vf16].vf; + c->vfs[vf24].vf.mul(Mask::xyzw, c->vfs[vf01].vf, c->vfs[vf24].vf.z()); + // sq.xyzw vf17, 1(vi00) | mulz.xyzw vf25, vf01, vf25 + background_vu0_data[1] = c->vfs[vf17].vf; + c->vfs[vf25].vf.mul(Mask::xyzw, c->vfs[vf01].vf, c->vfs[vf25].vf.z()); + // sq.xyzw vf18, 2(vi00) | mulz.xyzw vf26, vf01, vf26 + background_vu0_data[2] = c->vfs[vf18].vf; + c->vfs[vf26].vf.mul(Mask::xyzw, c->vfs[vf01].vf, c->vfs[vf26].vf.z()); + // sq.xyzw vf19, 3(vi00) | mulz.xyzw vf27, vf01, vf27 + background_vu0_data[3] = c->vfs[vf19].vf; + c->vfs[vf27].vf.mul(Mask::xyzw, c->vfs[vf01].vf, c->vfs[vf27].vf.z()); + // sq.xyzw vf24, 12(vi00) | nop + background_vu0_data[12] = c->vfs[vf24].vf; + // sq.xyzw vf25, 13(vi00) | nop + background_vu0_data[13] = c->vfs[vf25].vf; + // sq.xyzw vf26, 14(vi00) | nop + background_vu0_data[14] = c->vfs[vf26].vf; + // sq.xyzw vf27, 15(vi00) | nop + background_vu0_data[15] = c->vfs[vf27].vf; + // sq.xyzw vf28, 8(vi00) | nop + background_vu0_data[8] = c->vfs[vf28].vf; + // sq.xyzw vf29, 9(vi00) | nop + background_vu0_data[9] = c->vfs[vf29].vf; + // sq.xyzw vf30, 10(vi00) | nop + background_vu0_data[10] = c->vfs[vf30].vf; + // sq.xyzw vf31, 11(vi00) | nop :e + background_vu0_data[11] = c->vfs[vf31].vf; + // iaddiu vi02, vi00, 0xf0 | nop +} + +// clang-format off +u64 execute(void* ctxt) { + auto* c = (ExecutionContext*)ctxt; + init_background(c); + bool bc = false; + u16 vi01 = 0; + + u32 madr, sadr, qwc; + u32 call_addr = 0; + c->daddiu(sp, sp, -128); // daddiu sp, sp, -128 + c->sd(ra, 0, sp); // sd ra, 0(sp) + c->sq(s0, 16, sp); // sq s0, 16(sp) + c->sq(s1, 32, sp); // sq s1, 32(sp) + c->sq(s2, 48, sp); // sq s2, 48(sp) + c->sq(s3, 64, sp); // sq s3, 64(sp) + c->sq(s4, 80, sp); // sq s4, 80(sp) + c->sq(s5, 96, sp); // sq s5, 96(sp) + c->sq(gp, 112, sp); // sq gp, 112(sp) + get_fake_spad_addr(t4, cache.fake_scratchpad_data, 0, c);// lui t4, 28672 + c->lw(v1, 4, a3); // lw v1, 4(a3) + c->lui(t1, 4096); // lui t1, 4096 + c->lui(t2, 4096); // lui t2, 4096 + // sync.l + // cache dxwbin v1, 0 + // sync.l + // cache dxwbin v1, 1 + // sync.l + c->load_symbol(t0, cache.instance_tie_work_copy); // lw t0, *instance-tie-work-copy*(s7) + c->ori(t1, t1, 54272); // ori t1, t1, 54272 SPR TO + c->sw(a3, 396, t0); // sw a3, 396(t0) + c->ori(a3, t2, 53248); // ori a3, t2, 53248 SPR FROM + c->load_symbol(t5, cache.wind_work); // lw t5, *wind-work*(s7) + c->lw(t6, 0, a0); // lw t6, 0(a0) + c->ori(t2, t4, 16); // ori t2, t4, 16 + c->vmax_bc(DEST::xyzw, BC::w, vf1, vf0, vf0); // vmaxw.xyzw vf1, vf0, vf0 + c->addiu(t3, a1, -4); // addiu t3, a1, -4 + c->ori(a1, t4, 4112); // ori a1, t4, 4112 + c->sw(t1, 400, t0); // sw t1, 400(t0) + c->addiu(t9, r0, 0); // addiu t9, r0, 0 + c->sw(a3, 404, t0); // sw a3, 404(t0) + c->mov64(t8, a1); // or t8, a1, r0 + c->sw(t5, 408, t0); // sw t5, 408(t0) + // nop // sll r0, r0, 0 + c->lqc2(vf3, 64, t0); // lqc2 vf3, 64(t0) + // nop // sll r0, r0, 0 + c->sw(r0, 432, t0); // sw r0, 432(t0) + + block_1: + bc = c->sgpr64(t6) != 0; // bne t6, r0, L139 + // nop // sll r0, r0, 0 + if (bc) {goto block_4;} // branch non-likely + + c->addiu(a0, a0, 4); // addiu a0, a0, 4 + c->addiu(t3, t3, 2048); // addiu t3, t3, 2048 + c->daddiu(a2, a2, -32); // daddiu a2, a2, -32 + c->lw(t6, 0, a0); // lw t6, 0(a0) + bc = ((s64)c->sgpr64(a2)) <= 0; // blez a2, L177 + // nop // sll r0, r0, 0 + if (bc) {goto block_70;} // branch non-likely + + //beq r0, r0, L138 // beq r0, r0, L138 + // nop // sll r0, r0, 0 + goto block_1; // branch always + + + block_4: + /* Wait for SPR TO to be free. + c->lw(t4, 0, t1); // lw t4, 0(t1) + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->andi(t4, t4, 256); // andi t4, t4, 256 + // nop // sll r0, r0, 0 + bc = c->sgpr64(t4) != 0; // bne t4, r0, L139 + // nop // sll r0, r0, 0 + if (bc) {goto block_4;} // branch non-likely + */ + + // c->sw(t3, 16, t1); // sw t3, 16(t1) + madr = c->sgpr64(t3); + c->xori(t4, t2, 2048); // xori t4, t2, 2048 + // c->sw(t4, 128, t1); // sw t4, 128(t1) + sadr = c->sgpr64(t4); + c->addiu(t4, r0, 128); // addiu t4, r0, 128 + // c->sw(t4, 32, t1); // sw t4, 32(t1) + qwc = c->sgpr64(t4); + c->addiu(t4, r0, 256); // addiu t4, r0, 256 + // c->sw(t4, 0, t1); // sw t4, 0(t1) + spad_to_dma(cache.fake_scratchpad_data, madr, sadr, qwc); + // nop // sll r0, r0, 0 + + block_6: + c->mov64(ra, a0); // or ra, a0, r0 + c->xori(t2, t2, 2048); // xori t2, t2, 2048 + c->daddiu(a0, a0, 4); // daddiu a0, a0, 4 + c->mov64(t7, a0); // or t7, a0, r0 + c->mov64(t4, t2); // or t4, t2, r0 + c->daddiu(t6, a2, -32); // daddiu t6, a2, -32 + bc = ((s64)c->sgpr64(t6)) > 0; // bgtz t6, L142 + c->lw(t6, 0, a0); // lw t6, 0(a0) + if (bc) {goto block_11;} // branch non-likely + + //beq r0, r0, L145 // beq r0, r0, L145 + // nop // sll r0, r0, 0 + goto block_15; // branch always + + // nop // sll r0, r0, 0 + c->lw(v1, 400, r0); // lw v1, 400(r0) + + block_9: + c->daddiu(a2, a2, -32); // daddiu a2, a2, -32 + c->addiu(a0, a0, 4); // addiu a0, a0, 4 + bc = ((s64)c->sgpr64(a2)) <= 0; // blez a2, L145 + c->lw(t6, 0, a0); // lw t6, 0(a0) + if (bc) {goto block_15;} // branch non-likely + + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + + block_11: + bc = c->sgpr64(t6) == 0; // beq t6, r0, L141 + c->addiu(t3, t3, 2048); // addiu t3, t3, 2048 + if (bc) {goto block_9;} // branch non-likely + + /* Wait on DMA TO + block_12: + c->lw(t6, 0, t1); // lw t6, 0(t1) + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->andi(t6, t6, 256); // andi t6, t6, 256 + // nop // sll r0, r0, 0 + bc = c->sgpr64(t6) == 0; // beq t6, r0, L144 + // nop // sll r0, r0, 0 + if (bc) {goto block_14;} // branch non-likely + + // nop // sll r0, r0, 0 + c->lw(t6, 444, t0); // lw t6, 444(t0) + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->daddiu(t6, t6, 1); // daddiu t6, t6, 1 + // nop // sll r0, r0, 0 + c->sw(t6, 444, t0); // sw t6, 444(t0) + //beq r0, r0, L143 // beq r0, r0, L143 + // nop // sll r0, r0, 0 + goto block_12; // branch always + */ + + + block_14: + // c->sw(t3, 16, t1); // sw t3, 16(t1) + madr = c->sgpr64(t3); + c->xori(t6, t2, 2048); // xori t6, t2, 2048 + // c->sw(t6, 128, t1); // sw t6, 128(t1) + sadr = c->sgpr64(t6); + c->addiu(t6, r0, 128); // addiu t6, r0, 128 + // c->sw(t6, 32, t1); // sw t6, 32(t1) + qwc = c->sgpr64(t6); + c->addiu(t6, r0, 256); // addiu t6, r0, 256 + //beq r0, r0, L146 // beq r0, r0, L146 + // c->sw(t6, 0, t1); // sw t6, 0(t1) + spad_to_dma(cache.fake_scratchpad_data, madr, sadr, qwc); + goto block_17; // branch always + + + block_15: + /* + c->lw(t6, 0, t1); // lw t6, 0(t1) + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->andi(t6, t6, 256); // andi t6, t6, 256 + // nop // sll r0, r0, 0 + bc = c->sgpr64(t6) == 0; // beq t6, r0, L146 + // nop // sll r0, r0, 0 + if (bc) {goto block_17;} // branch non-likely + + // nop // sll r0, r0, 0 + c->lw(t6, 444, t0); // lw t6, 444(t0) + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->daddiu(t6, t6, 1); // daddiu t6, t6, 1 + // nop // sll r0, r0, 0 + c->sw(t6, 444, t0); // sw t6, 444(t0) + //beq r0, r0, L145 // beq r0, r0, L145 + // nop // sll r0, r0, 0 + goto block_15; // branch always + */ + + + block_17: + c->lb(t6, 0, ra); // lb t6, 0(ra) + c->addiu(ra, ra, 1); // addiu ra, ra, 1 + // nop // sll r0, r0, 0 + c->sw(ra, 412, t0); // sw ra, 412(t0) + bc = c->sgpr64(t6) != 0; // bne t6, r0, L147 + c->sw(t7, 416, t0); // sw t7, 416(t0) + if (bc) {goto block_19;} // branch non-likely + + c->daddiu(a2, a2, -8); // daddiu a2, a2, -8 + c->addiu(t4, t4, 512); // addiu t4, t4, 512 + //beq r0, r0, L173 // beq r0, r0, L173 + // nop // sll r0, r0, 0 + goto block_62; // branch always + + + block_19: + c->addiu(t7, r0, 128); // addiu t7, r0, 128 + c->lqc2(vf2, 16, t4); // lqc2 vf2, 16(t4) + + block_20: + c->daddiu(ra, t9, -246); // daddiu ra, t9, -246 + // nop // sll r0, r0, 0 + bc = ((s64)c->sgpr64(ra)) <= 0; // blez ra, L151 + // vcallms 42 + vi01 = vcallms_42(c); + if (bc) {goto block_24;} // branch non-likely + + /* + block_21: + c->lw(t8, 0, a3); // lw t8, 0(a3) + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->andi(t8, t8, 256); // andi t8, t8, 256 + // nop // sll r0, r0, 0 + bc = c->sgpr64(t8) == 0; // beq t8, r0, L150 + // nop // sll r0, r0, 0 + if (bc) {goto block_23;} // branch non-likely + + // nop // sll r0, r0, 0 + c->lw(t8, 440, t0); // lw t8, 440(t0) + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->daddiu(t8, t8, 1); // daddiu t8, t8, 1 + // nop // sll r0, r0, 0 + c->sw(t8, 440, t0); // sw t8, 440(t0) + //beq r0, r0, L149 // beq r0, r0, L149 + // nop // sll r0, r0, 0 + goto block_21; // branch always + */ + + + block_23: + // c->sw(a1, 128, a3); // sw a1, 128(a3) + sadr = c->sgpr64(a1); + c->xori(a1, a1, 12288); // xori a1, a1, 12288 + // c->sw(v1, 16, a3); // sw v1, 16(a3) + madr = c->sgpr64(v1); + c->sll(t8, t9, 4); // sll t8, t9, 4 + c->addu(v1, v1, t8); // addu v1, v1, t8 + c->mov64(t8, a1); // or t8, a1, r0 + // c->sw(t9, 32, a3); // sw t9, 32(a3) + qwc = c->sgpr64(t9); + c->addiu(t9, r0, 256); // addiu t9, r0, 256 + // c->sw(t9, 0, a3); // sw t9, 0(a3) + spad_from_dma(cache.fake_scratchpad_data, madr, sadr, qwc); + c->addiu(t9, r0, 0); // addiu t9, r0, 0 + + block_24: + // nop // sll r0, r0, 0 + c->lw(ra, 12, t4); // lw ra, 12(t4) + c->and_(gp, t6, t7); // and gp, t6, t7 + c->ld(s5, 56, t4); // ld s5, 56(t4) + bc = c->sgpr64(gp) == 0; // beq gp, r0, L172 + c->ld(s2, 32, t4); // ld s2, 32(t4) + if (bc) {goto block_61;} // branch non-likely + + c->sll(gp, t9, 4); // sll gp, t9, 4 + c->ld(s4, 40, t4); // ld s4, 40(t4) + c->pextlh(s3, s5, r0); // pextlh s3, s5, r0 + c->ld(s5, 48, t4); // ld s5, 48(t4) + c->psraw(s3, s3, 10); // psraw s3, s3, 10 + c->lq(s1, 28, ra); // lq s1, 28(ra) + c->pextlh(s2, s2, r0); // pextlh s2, s2, r0 + c->lq(s0, 44, ra); // lq s0, 44(ra) + c->psraw(s2, s2, 16); // psraw s2, s2, 16 + c->mov128_vf_gpr(vf14, s1); // qmtc2.ni vf14, s1 + c->pextlh(s4, s4, r0); // pextlh s4, s4, r0 + c->mov128_vf_gpr(vf15, s0); // qmtc2.ni vf15, s0 + c->psraw(s4, s4, 16); // psraw s4, s4, 16 + c->mov128_vf_gpr(vf13, s3); // qmtc2.ni vf13, s3 + c->pextlh(s5, s5, r0); // pextlh s5, s5, r0 + c->mov128_vf_gpr(vf10, s2); // qmtc2.ni vf10, s2 + c->psraw(s3, s5, 16); // psraw s3, s5, 16 + c->lhu(s2, 62, t4); // lhu s2, 62(t4) + c->addu(gp, gp, v1); // addu gp, gp, v1 + c->mov128_vf_gpr(vf11, s4); // qmtc2.ni vf11, s4 + c->dsll(s5, s2, 4); // dsll s5, s2, 4 + c->mov128_vf_gpr(vf12, s3); // qmtc2.ni vf12, s3 + c->daddu(s4, s2, t5); // daddu s4, s2, t5 + c->lw(s2, 408, t0); // lw s2, 408(t0) + c->andi(s4, s4, 63); // andi s4, s4, 63 + c->lw(s3, 384, t0); // lw s3, 384(t0) + c->sll(s1, s4, 4); // sll s1, s4, 4 + c->lw(s4, 4, ra); // lw s4, 4(ra) + c->daddu(s5, s3, s5); // daddu s5, s3, s5 + c->addu(s3, s1, s2); // addu s3, s1, s2 + c->andi(s1, s4, 1); // andi s1, s4, 1 + c->andi(s4, s4, 2); // andi s4, s4, 2 + bc = c->sgpr64(s1) != 0; // bne s1, r0, L172 + c->gprs[s1].du64[0] = vi01; // cfc2.ni s1, vi1 + if (bc) {goto block_61;} // branch non-likely + + c->vitof0(DEST::xyzw, vf13, vf13); // vitof0.xyzw vf13, vf13 + c->lw(t5, 1324, s2); // lw t5, 1324(s2) + bc = c->sgpr64(s1) != 0; // bne s1, r0, L172 + c->lqc2(vf25, 112, t0); // lqc2 vf25, 112(t0) + if (bc) {goto block_61;} // branch non-likely + + // nop // sll r0, r0, 0 + c->lqc2(vf16, 16, t0); // lqc2 vf16, 16(t0) + // nop // sll r0, r0, 0 + c->lqc2(vf17, 32, t0); // lqc2 vf17, 32(t0) + c->vmula_bc(DEST::xyzw, BC::z, vf1, vf6); // vmulaz.xyzw acc, vf1, vf6 + c->sw(gp, 196, t0); // sw gp, 196(t0) + c->vmsub_bc(DEST::xyzw, BC::w, vf8, vf1, vf2); // vmsubw.xyzw vf8, vf1, vf2 + c->sw(gp, 276, t0); // sw gp, 276(t0) + c->vadd(DEST::xyz, vf5, vf0, vf0); // vadd.xyz vf5, vf0, vf0 + // nop // sll r0, r0, 0 + c->vadd(DEST::xyz, vf13, vf13, vf2); // vadd.xyz vf13, vf13, vf2 + // nop // sll r0, r0, 0 + // Unknown instr: vmula.xyzw acc, vf1, vf1 + c->vmula(DEST::xyzw, vf1, vf1); + // nop // sll r0, r0, 0 + c->vsub(DEST::xyzw, vf14, vf8, vf14); // vsub.xyzw vf14, vf8, vf14 + // nop // sll r0, r0, 0 + c->vadd_bc(DEST::w, BC::w, vf5, vf5, vf17); // vaddw.w vf5, vf5, vf17 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->lqc2(vf30, 80, t0); // lqc2 vf30, 80(t0) + c->vmini(DEST::xyzw, vf25, vf8, vf25); // vmini.xyzw vf25, vf8, vf25 + // nop // sll r0, r0, 0 + // Unknown instr: vmsub.xyz vf15, vf14, vf15 + c->vmsub(DEST::xyz, vf15, vf14, vf15); + // nop // sll r0, r0, 0 + c->vmini_bc(DEST::w, BC::y, vf5, vf5, vf16); // vminiy.w vf5, vf5, vf16 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->lqc2(vf24, 128, t0); // lqc2 vf24, 128(t0) + // nop // sll r0, r0, 0 + c->sqc2(vf25, 112, t0); // sqc2 vf25, 112(t0) + c->vmini(DEST::xyz, vf15, vf15, vf1); // vmini.xyz vf15, vf15, vf1 + // nop // sll r0, r0, 0 + c->vmax_bc(DEST::w, BC::x, vf5, vf5, vf16); // vmaxx.w vf5, vf5, vf16 + // nop // sll r0, r0, 0 + c->vsub_bc(DEST::xyzw, BC::z, vf16, vf8, vf16); // vsubz.xyzw vf16, vf8, vf16 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->lqc2(vf25, 144, t0); // lqc2 vf25, 144(t0) + // nop // sll r0, r0, 0 + c->lqc2(vf26, 160, t0); // lqc2 vf26, 160(t0) + // nop // sll r0, r0, 0 + c->lqc2(vf27, 176, t0); // lqc2 vf27, 176(t0) + c->vmula_bc(DEST::xyzw, BC::x, vf24, vf2); // vmulax.xyzw acc, vf24, vf2 + // nop // sll r0, r0, 0 + c->vmadda_bc(DEST::xyzw, BC::y, vf25, vf2); // vmadday.xyzw acc, vf25, vf2 + // nop // sll r0, r0, 0 + c->vmadda_bc(DEST::xyzw, BC::z, vf26, vf2); // vmaddaz.xyzw acc, vf26, vf2 + // nop // sll r0, r0, 0 + c->vmsuba_bc(DEST::xyzw, BC::w, vf27, vf0); // vmsubaw.xyzw acc, vf27, vf0 + // nop // sll r0, r0, 0 + c->vmsub_bc(DEST::xyzw, BC::w, vf24, vf1, vf2); // vmsubw.xyzw vf24, vf1, vf2 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->mov128_gpr_vf(s2, vf16); // qmfc2.i s2, vf16 + c->vmul_bc(DEST::xyzw, BC::w, vf28, vf15, vf30); // vmulw.xyzw vf28, vf15, vf30 + // nop // sll r0, r0, 0 + c->vmul_bc(DEST::xyzw, BC::w, vf29, vf15, vf30); // vmulw.xyzw vf29, vf15, vf30 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->lqc2(vf19, 0, t0); // lqc2 vf19, 0(t0) + c->vitof12(DEST::xyzw, vf10, vf10); // vitof12.xyzw vf10, vf10 + // nop // sll r0, r0, 0 + c->pcgtw(s1, r0, s2); // pcgtw s1, r0, s2 + c->mov128_gpr_vf(s0, vf24); // qmfc2.i s0, vf24 + c->vmul_bc(DEST::xyzw, BC::x, vf28, vf1, vf28); // vmulx.xyzw vf28, vf1, vf28 + // nop // sll r0, r0, 0 + c->vmul_bc(DEST::xyzw, BC::z, vf29, vf1, vf29); // vmulz.xyzw vf29, vf1, vf29 + c->lw(s2, 56, ra); // lw s2, 56(ra) + c->pcgtw(s0, r0, s0); // pcgtw s0, r0, s0 + c->sqc2(vf5, 80, t8); // sqc2 vf5, 80(t8) + c->ppach(s0, r0, s0); // ppach s0, r0, s0 + c->sw(s4, 80, t8); // sw s4, 80(t8) + c->or_(s1, s0, s1); // or s1, s0, s1 + c->sqc2(vf14, 96, t0); // sqc2 vf14, 96(t0) + c->ppacb(s1, r0, s1); // ppacb s1, r0, s1 + c->mfc1(r0, f31); // mfc1 r0, f31 + bc = c->sgpr64(s2) == 0; // beq s2, r0, L153 + c->sw(s1, 84, t8); // sw s1, 84(t8) + if (bc) {goto block_33;} // branch non-likely + + c->vftoi0(DEST::zw, vf28, vf28); // vftoi0.zw vf28, vf28 + c->ld(s1, 8, s5); // ld s1, 8(s5) + c->vftoi0(DEST::zw, vf29, vf29); // vftoi0.zw vf29, vf29 + c->ld(s2, 0, s5); // ld s2, 0(s5) + c->pextlw(s1, r0, s1); // pextlw s1, r0, s1 + c->lqc2(vf16, 12, s3); // lqc2 vf16, 12(s3) + c->pextlw(s3, r0, s2); // pextlw s3, r0, s2 + c->mov128_vf_gpr(vf18, s1); // qmtc2.i vf18, s1 + // nop // sll r0, r0, 0 + c->mov128_vf_gpr(vf17, s3); // qmtc2.i vf17, s3 + // Unknown instr: vmula.xyzw acc, vf16, vf1 + c->vmula(DEST::xyzw, vf16, vf1); + // nop // sll r0, r0, 0 + c->vmsuba_bc(DEST::xyzw, BC::x, vf18, vf19); // vmsubax.xyzw acc, vf18, vf19 + // nop // sll r0, r0, 0 + c->vmsub_bc(DEST::xyzw, BC::y, vf16, vf17, vf19); // vmsuby.xyzw vf16, vf17, vf19 + // nop // sll r0, r0, 0 + c->vsub_bc(DEST::x, BC::x, vf28, vf30, vf15); // vsubx.x vf28, vf30, vf15 + // nop // sll r0, r0, 0 + c->vsub_bc(DEST::x, BC::z, vf29, vf1, vf15); // vsubz.x vf29, vf1, vf15 + // nop // sll r0, r0, 0 + c->vitof0(DEST::zw, vf28, vf28); // vitof0.zw vf28, vf28 + // nop // sll r0, r0, 0 + c->vmula_bc(DEST::xyzw, BC::z, vf16, vf19); // vmulaz.xyzw acc, vf16, vf19 + // nop // sll r0, r0, 0 + c->vmadd(DEST::xyzw, vf18, vf1, vf18); // vmadd.xyzw vf18, vf1, vf18 + // nop // sll r0, r0, 0 + c->vitof0(DEST::zw, vf29, vf29); // vitof0.zw vf29, vf29 + // nop // sll r0, r0, 0 + c->vadd_bc(DEST::y, BC::y, vf28, vf0, vf0); // vaddy.y vf28, vf0, vf0 + // nop // sll r0, r0, 0 + c->vadd_bc(DEST::y, BC::y, vf29, vf0, vf0); // vaddy.y vf29, vf0, vf0 + // nop // sll r0, r0, 0 + c->vmula_bc(DEST::xyzw, BC::z, vf18, vf19); // vmulaz.xyzw acc, vf18, vf19 + // nop // sll r0, r0, 0 + c->vmadd(DEST::xyzw, vf17, vf17, vf1); // vmadd.xyzw vf17, vf17, vf1 + // nop // sll r0, r0, 0 + c->vitof12(DEST::xyzw, vf11, vf11); // vitof12.xyzw vf11, vf11 + // nop // sll r0, r0, 0 + c->vitof12(DEST::xyzw, vf12, vf12); // vitof12.xyzw vf12, vf12 + // nop // sll r0, r0, 0 + c->vsub_bc(DEST::w, BC::w, vf28, vf30, vf28); // vsubw.w vf28, vf30, vf28 + // nop // sll r0, r0, 0 + c->vmini_bc(DEST::xyzw, BC::w, vf17, vf17, vf0); // vminiw.xyzw vf17, vf17, vf0 + // nop // sll r0, r0, 0 + c->vsub_bc(DEST::w, BC::w, vf29, vf30, vf29); // vsubw.w vf29, vf30, vf29 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->mov128_gpr_vf(s3, vf18); // qmfc2.i s3, vf18 + c->vmax_bc(DEST::xyzw, BC::w, vf27, vf17, vf19); // vmaxw.xyzw vf27, vf17, vf19 + // nop // sll r0, r0, 0 + c->ppacw(s3, r0, s3); // ppacw s3, r0, s3 + c->mfc1(r0, f31); // mfc1 r0, f31 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->vmul_bc(DEST::xyzw, BC::w, vf27, vf27, vf15); // vmulw.xyzw vf27, vf27, vf15 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->vmula_bc(DEST::yw, BC::x, vf0, vf0); // vmulax.yw acc, vf0, vf0 + // nop // sll r0, r0, 0 + c->vmula_bc(DEST::xz, BC::y, vf27, vf10); // vmulay.xz acc, vf27, vf10 + // nop // sll r0, r0, 0 + c->vmadd(DEST::xyzw, vf10, vf1, vf10); // vmadd.xyzw vf10, vf1, vf10 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->mov128_gpr_vf(s2, vf27); // qmfc2.i s2, vf27 + c->vmula_bc(DEST::yw, BC::x, vf0, vf0); // vmulax.yw acc, vf0, vf0 + c->lw(s1, 436, t0); // lw s1, 436(t0) + c->vmula_bc(DEST::xz, BC::y, vf27, vf11); // vmulay.xz acc, vf27, vf11 + // nop // sll r0, r0, 0 + c->vmadd(DEST::xyzw, vf11, vf1, vf11); // vmadd.xyzw vf11, vf1, vf11 + // nop // sll r0, r0, 0 + bc = c->sgpr64(s1) != c->sgpr64(s7); // bne s1, s7, L152 + c->ppacw(s2, r0, s2); // ppacw s2, r0, s2 + if (bc) {goto block_31;} // branch non-likely + + c->vmula_bc(DEST::yw, BC::x, vf0, vf0); // vmulax.yw acc, vf0, vf0 + c->sd(s3, 8, s5); // sd s3, 8(s5) + c->vmula_bc(DEST::xz, BC::y, vf27, vf12); // vmulay.xz acc, vf27, vf12 + c->sd(s2, 0, s5); // sd s2, 0(s5) + bc = c->sgpr64(s4) != 0; // bne s4, r0, L164 + c->vmadd(DEST::xyzw, vf12, vf1, vf12); // vmadd.xyzw vf12, vf1, vf12 + if (bc) {goto block_49;} // branch non-likely + + //beq r0, r0, L154 // beq r0, r0, L154 + // nop // sll r0, r0, 0 + goto block_34; // branch always + + + block_31: + c->vmula_bc(DEST::yw, BC::x, vf0, vf0); // vmulax.yw acc, vf0, vf0 + // nop // sll r0, r0, 0 + c->vmula_bc(DEST::xz, BC::y, vf27, vf12); // vmulay.xz acc, vf27, vf12 + // nop // sll r0, r0, 0 + bc = c->sgpr64(s4) != 0; // bne s4, r0, L164 + c->vmadd(DEST::xyzw, vf12, vf1, vf12); // vmadd.xyzw vf12, vf1, vf12 + if (bc) {goto block_49;} // branch non-likely + + //beq r0, r0, L154 // beq r0, r0, L154 + // nop // sll r0, r0, 0 + goto block_34; // branch always + + + block_33: + c->vftoi0(DEST::zw, vf28, vf28); // vftoi0.zw vf28, vf28 + // nop // sll r0, r0, 0 + c->vftoi0(DEST::zw, vf29, vf29); // vftoi0.zw vf29, vf29 + // nop // sll r0, r0, 0 + c->vsub_bc(DEST::x, BC::x, vf28, vf30, vf15); // vsubx.x vf28, vf30, vf15 + // nop // sll r0, r0, 0 + c->vsub_bc(DEST::x, BC::z, vf29, vf1, vf15); // vsubz.x vf29, vf1, vf15 + // nop // sll r0, r0, 0 + c->vitof0(DEST::zw, vf28, vf28); // vitof0.zw vf28, vf28 + // nop // sll r0, r0, 0 + c->vitof0(DEST::zw, vf29, vf29); // vitof0.zw vf29, vf29 + // nop // sll r0, r0, 0 + c->vadd_bc(DEST::y, BC::y, vf28, vf0, vf0); // vaddy.y vf28, vf0, vf0 + // nop // sll r0, r0, 0 + c->vadd_bc(DEST::y, BC::y, vf29, vf0, vf0); // vaddy.y vf29, vf0, vf0 + // nop // sll r0, r0, 0 + c->vsub_bc(DEST::w, BC::w, vf28, vf30, vf28); // vsubw.w vf28, vf30, vf28 + // nop // sll r0, r0, 0 + c->vsub_bc(DEST::w, BC::w, vf29, vf30, vf29); // vsubw.w vf29, vf30, vf29 + // nop // sll r0, r0, 0 + c->vitof12(DEST::xyzw, vf11, vf11); // vitof12.xyzw vf11, vf11 + // nop // sll r0, r0, 0 + bc = c->sgpr64(s4) != 0; // bne s4, r0, L164 + c->vitof12(DEST::xyzw, vf12, vf12); // vitof12.xyzw vf12, vf12 + if (bc) {goto block_49;} // branch non-likely + + + block_34: + // nop // sll r0, r0, 0 + c->lw(s5, 84, t8); // lw s5, 84(t8) + // nop // sll r0, r0, 0 + c->lw(s4, 108, t0); // lw s4, 108(t0) + c->addiu(t9, t9, 6); // addiu t9, t9, 6 + c->lw(s3, 104, t0); // lw s3, 104(t0) + bc = c->sgpr64(s5) != 0; // bne s5, r0, L158 + c->vsub_bc(DEST::w, BC::w, vf10, vf10, vf10); // vsubw.w vf10, vf10, vf10 + if (bc) {goto block_41;} // branch non-likely + + bc = ((s64)c->sgpr64(s4)) > 0; // bgtz s4, L156 + // nop // sll r0, r0, 0 + if (bc) {goto block_39;} // branch non-likely + + bc = ((s64)c->sgpr64(s3)) > 0; // bgtz s3, L155 + // nop // sll r0, r0, 0 + if (bc) {goto block_38;} // branch non-likely + + // nop // sll r0, r0, 0 + c->lh(s4, 78, ra); // lh s4, 78(ra) + // nop // sll r0, r0, 0 + c->lw(s5, 64, ra); // lw s5, 64(ra) + c->daddiu(s4, s4, 1); // daddiu s4, s4, 1 + c->sqc2(vf28, 64, t8); // sqc2 vf28, 64(t8) + c->vmula_bc(DEST::xyzw, BC::x, vf20, vf10); // vmulax.xyzw acc, vf20, vf10 + c->addiu(gp, gp, 96); // addiu gp, gp, 96 + c->vmadda_bc(DEST::xyzw, BC::y, vf21, vf10); // vmadday.xyzw acc, vf21, vf10 + c->sw(gp, 64, ra); // sw gp, 64(ra) + c->vmadd_bc(DEST::xyzw, BC::z, vf10, vf22, vf10); // vmaddz.xyzw vf10, vf22, vf10 + c->sh(s4, 78, ra); // sh s4, 78(ra) + c->vmula_bc(DEST::xyzw, BC::x, vf20, vf11); // vmulax.xyzw acc, vf20, vf11 + c->lbu(s4, 109, ra); // lbu s4, 109(ra) + c->vmadda_bc(DEST::xyzw, BC::y, vf21, vf11); // vmadday.xyzw acc, vf21, vf11 + c->lhu(gp, 118, ra); // lhu gp, 118(ra) + c->vmadd_bc(DEST::xyzw, BC::z, vf11, vf22, vf11); // vmaddz.xyzw vf11, vf22, vf11 + c->lbu(s3, 113, ra); // lbu s3, 113(ra) + //beq r0, r0, L157 // beq r0, r0, L157 + // nop // sll r0, r0, 0 + goto block_40; // branch always + + + block_38: + // nop // sll r0, r0, 0 + c->lh(s4, 80, ra); // lh s4, 80(ra) + // nop // sll r0, r0, 0 + c->lw(s5, 68, ra); // lw s5, 68(ra) + c->daddiu(s4, s4, 1); // daddiu s4, s4, 1 + c->sqc2(vf29, 64, t8); // sqc2 vf29, 64(t8) + c->vmula_bc(DEST::xyzw, BC::x, vf20, vf10); // vmulax.xyzw acc, vf20, vf10 + c->addiu(gp, gp, 96); // addiu gp, gp, 96 + c->vmadda_bc(DEST::xyzw, BC::y, vf21, vf10); // vmadday.xyzw acc, vf21, vf10 + c->sw(gp, 68, ra); // sw gp, 68(ra) + c->vmadd_bc(DEST::xyzw, BC::z, vf10, vf22, vf10); // vmaddz.xyzw vf10, vf22, vf10 + c->sh(s4, 80, ra); // sh s4, 80(ra) + c->vmula_bc(DEST::xyzw, BC::x, vf20, vf11); // vmulax.xyzw acc, vf20, vf11 + c->lbu(s4, 110, ra); // lbu s4, 110(ra) + c->vmadda_bc(DEST::xyzw, BC::y, vf21, vf11); // vmadday.xyzw acc, vf21, vf11 + c->lhu(gp, 120, ra); // lhu gp, 120(ra) + c->vmadd_bc(DEST::xyzw, BC::z, vf11, vf22, vf11); // vmaddz.xyzw vf11, vf22, vf11 + c->lbu(s3, 114, ra); // lbu s3, 114(ra) + //beq r0, r0, L157 // beq r0, r0, L157 + // nop // sll r0, r0, 0 + goto block_40; // branch always + + + block_39: + // nop // sll r0, r0, 0 + c->lh(s4, 82, ra); // lh s4, 82(ra) + // nop // sll r0, r0, 0 + c->lw(s5, 72, ra); // lw s5, 72(ra) + c->daddiu(s4, s4, 1); // daddiu s4, s4, 1 + c->sqc2(vf30, 64, t8); // sqc2 vf30, 64(t8) + c->vmula_bc(DEST::xyzw, BC::x, vf20, vf10); // vmulax.xyzw acc, vf20, vf10 + c->addiu(gp, gp, 96); // addiu gp, gp, 96 + c->vmadda_bc(DEST::xyzw, BC::y, vf21, vf10); // vmadday.xyzw acc, vf21, vf10 + c->sw(gp, 72, ra); // sw gp, 72(ra) + c->vmadd_bc(DEST::xyzw, BC::z, vf10, vf22, vf10); // vmaddz.xyzw vf10, vf22, vf10 + c->sh(s4, 82, ra); // sh s4, 82(ra) + c->vmula_bc(DEST::xyzw, BC::x, vf20, vf11); // vmulax.xyzw acc, vf20, vf11 + c->lbu(s4, 111, ra); // lbu s4, 111(ra) + c->vmadda_bc(DEST::xyzw, BC::y, vf21, vf11); // vmadday.xyzw acc, vf21, vf11 + c->lhu(gp, 122, ra); // lhu gp, 122(ra) + c->vmadd_bc(DEST::xyzw, BC::z, vf11, vf22, vf11); // vmaddz.xyzw vf11, vf22, vf11 + c->lbu(s3, 115, ra); // lbu s3, 115(ra) + + block_40: + c->vmula_bc(DEST::xyzw, BC::x, vf20, vf12); // vmulax.xyzw acc, vf20, vf12 + c->lq(s2, 224, t0); // lq s2, 224(t0) + c->vmadda_bc(DEST::xyzw, BC::y, vf21, vf12); // vmadday.xyzw acc, vf21, vf12 + c->lq(s1, 240, t0); // lq s1, 240(t0) + c->vmadd_bc(DEST::xyzw, BC::z, vf12, vf22, vf12); // vmaddz.xyzw vf12, vf22, vf12 + c->dsll(gp, gp, 4); // dsll gp, gp, 4 + c->vmula_bc(DEST::xyzw, BC::x, vf20, vf13); // vmulax.xyzw acc, vf20, vf13 + c->daddu(s3, s3, ra); // daddu s3, s3, ra + c->vmadda_bc(DEST::xyzw, BC::y, vf21, vf13); // vmadday.xyzw acc, vf21, vf13 + // nop // sll r0, r0, 0 + c->vmadda_bc(DEST::xyzw, BC::z, vf22, vf13); // vmaddaz.xyzw acc, vf22, vf13 + // nop // sll r0, r0, 0 + c->vmadd_bc(DEST::xyzw, BC::w, vf13, vf23, vf0); // vmaddw.xyzw vf13, vf23, vf0 + // nop // sll r0, r0, 0 + c->sqc2(vf10, 0, t8); // sqc2 vf10, 0(t8) + // nop // sll r0, r0, 0 + c->sqc2(vf11, 16, t8); // sqc2 vf11, 16(t8) + c->movz(s2, s1, s5); // movz s2, s1, s5 + c->sqc2(vf12, 32, t8); // sqc2 vf12, 32(t8) + c->daddiu(t8, t8, 96); // daddiu t8, t8, 96 + //beq r0, r0, L159 // beq r0, r0, L159 + c->sqc2(vf13, -48, t8); // sqc2 vf13, -48(t8) + goto block_42; // branch always + + + block_41: + // nop // sll r0, r0, 0 + c->lqc2(vf24, 320, t0); // lqc2 vf24, 320(t0) + // nop // sll r0, r0, 0 + c->lqc2(vf25, 336, t0); // lqc2 vf25, 336(t0) + // nop // sll r0, r0, 0 + c->lqc2(vf26, 352, t0); // lqc2 vf26, 352(t0) + // nop // sll r0, r0, 0 + c->lqc2(vf27, 368, t0); // lqc2 vf27, 368(t0) + // nop // sll r0, r0, 0 + c->lh(s4, 76, ra); // lh s4, 76(ra) + // nop // sll r0, r0, 0 + c->lw(s5, 60, ra); // lw s5, 60(ra) + c->daddiu(s4, s4, 1); // daddiu s4, s4, 1 + c->sqc2(vf28, 64, t8); // sqc2 vf28, 64(t8) + c->vmula_bc(DEST::xyzw, BC::x, vf24, vf10); // vmulax.xyzw acc, vf24, vf10 + c->addiu(gp, gp, 96); // addiu gp, gp, 96 + c->vmadda_bc(DEST::xyzw, BC::y, vf25, vf10); // vmadday.xyzw acc, vf25, vf10 + c->sw(gp, 60, ra); // sw gp, 60(ra) + c->vmadd_bc(DEST::xyzw, BC::z, vf10, vf26, vf10); // vmaddz.xyzw vf10, vf26, vf10 + c->sh(s4, 76, ra); // sh s4, 76(ra) + c->vmula_bc(DEST::xyzw, BC::x, vf24, vf11); // vmulax.xyzw acc, vf24, vf11 + c->lbu(s4, 108, ra); // lbu s4, 108(ra) + c->vmadda_bc(DEST::xyzw, BC::y, vf25, vf11); // vmadday.xyzw acc, vf25, vf11 + c->lhu(gp, 116, ra); // lhu gp, 116(ra) + c->vmadd_bc(DEST::xyzw, BC::z, vf11, vf26, vf11); // vmaddz.xyzw vf11, vf26, vf11 + c->lbu(s3, 112, ra); // lbu s3, 112(ra) + c->vmula_bc(DEST::xyzw, BC::x, vf24, vf12); // vmulax.xyzw acc, vf24, vf12 + c->lq(s2, 224, t0); // lq s2, 224(t0) + c->vmadda_bc(DEST::xyzw, BC::y, vf25, vf12); // vmadday.xyzw acc, vf25, vf12 + c->lq(s1, 240, t0); // lq s1, 240(t0) + c->vmadd_bc(DEST::xyzw, BC::z, vf12, vf26, vf12); // vmaddz.xyzw vf12, vf26, vf12 + c->dsll(gp, gp, 4); // dsll gp, gp, 4 + c->vmula_bc(DEST::xyzw, BC::x, vf24, vf13); // vmulax.xyzw acc, vf24, vf13 + c->daddu(s3, s3, ra); // daddu s3, s3, ra + c->vmadda_bc(DEST::xyzw, BC::y, vf25, vf13); // vmadday.xyzw acc, vf25, vf13 + // nop // sll r0, r0, 0 + c->vmadda_bc(DEST::xyzw, BC::z, vf26, vf13); // vmaddaz.xyzw acc, vf26, vf13 + // nop // sll r0, r0, 0 + c->vmadd_bc(DEST::xyzw, BC::w, vf13, vf27, vf0); // vmaddw.xyzw vf13, vf27, vf0 + // nop // sll r0, r0, 0 + c->sqc2(vf10, 0, t8); // sqc2 vf10, 0(t8) + // nop // sll r0, r0, 0 + c->sqc2(vf11, 16, t8); // sqc2 vf11, 16(t8) + // nop // sll r0, r0, 0 + c->sqc2(vf12, 32, t8); // sqc2 vf12, 32(t8) + c->movz(s2, s1, s5); // movz s2, s1, s5 + c->sqc2(vf13, 48, t8); // sqc2 vf13, 48(t8) + c->daddiu(t8, t8, 96); // daddiu t8, t8, 96 + + block_42: + // nop // sll r0, r0, 0 + c->lw(ra, 8, t4); // lw ra, 8(t4) + // nop // sll r0, r0, 0 + c->sq(s2, 256, t0); // sq s2, 256(t0) + // nop // sll r0, r0, 0 + c->lbu(s2, 144, s3); // lbu s2, 144(s3) + c->addu(s1, gp, ra); // addu s1, gp, ra + c->sw(s5, 260, t0); // sw s5, 260(t0) + c->daddiu(t9, t9, 3); // daddiu t9, t9, 3 + c->sw(s1, 212, t0); // sw s1, 212(t0) + c->sll(s1, s2, 2); // sll s1, s2, 2 + c->sh(s2, 208, t0); // sh s2, 208(t0) + c->sll(s2, s2, 4); // sll s2, s2, 4 + c->sb(s1, 222, t0); // sb s1, 222(t0) + c->daddu(gp, gp, s2); // daddu gp, gp, s2 + c->lq(s2, 192, t0); // lq s2, 192(t0) + c->daddiu(s5, s5, 48); // daddiu s5, s5, 48 + c->lq(s1, 208, t0); // lq s1, 208(t0) + c->daddiu(t8, t8, 48); // daddiu t8, t8, 48 + c->lq(s0, 256, t0); // lq s0, 256(t0) + c->daddiu(s3, s3, 1); // daddiu s3, s3, 1 + c->sq(s2, -48, t8); // sq s2, -48(t8) + c->daddiu(s4, s4, -1); // daddiu s4, s4, -1 + c->sq(s1, -32, t8); // sq s1, -32(t8) + bc = ((s64)c->sgpr64(s4)) <= 0; // blez s4, L172 + c->sq(s0, -16, t8); // sq s0, -16(t8) + if (bc) {goto block_61;} // branch non-likely + + + block_43: + c->daddiu(s2, t9, -252); // daddiu s2, t9, -252 + // nop // sll r0, r0, 0 + bc = ((s64)c->sgpr64(s2)) <= 0; // blez s2, L163 + // nop // sll r0, r0, 0 + if (bc) {goto block_47;} // branch non-likely + + /* + block_44: + c->lw(t8, 0, a3); // lw t8, 0(a3) + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->andi(t8, t8, 256); // andi t8, t8, 256 + // nop // sll r0, r0, 0 + bc = c->sgpr64(t8) == 0; // beq t8, r0, L162 + // nop // sll r0, r0, 0 + if (bc) {goto block_46;} // branch non-likely + + // nop // sll r0, r0, 0 + c->lw(t8, 440, t0); // lw t8, 440(t0) + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->daddiu(t8, t8, 1); // daddiu t8, t8, 1 + // nop // sll r0, r0, 0 + c->sw(t8, 440, t0); // sw t8, 440(t0) + //beq r0, r0, L161 // beq r0, r0, L161 + // nop // sll r0, r0, 0 + goto block_44; // branch always + */ + + + block_46: + // c->sw(a1, 128, a3); // sw a1, 128(a3) + sadr = c->sgpr64(a1); + c->xori(a1, a1, 12288); // xori a1, a1, 12288 + // c->sw(v1, 16, a3); // sw v1, 16(a3) + madr = c->sgpr64(v1); + c->sll(t8, t9, 4); // sll t8, t9, 4 + c->addu(v1, v1, t8); // addu v1, v1, t8 + c->mov64(t8, a1); // or t8, a1, r0 + // c->sw(t9, 32, a3); // sw t9, 32(a3) + qwc = c->sgpr64(t9); + c->addiu(t9, r0, 256); // addiu t9, r0, 256 + // c->sw(t9, 0, a3); // sw t9, 0(a3) + spad_from_dma(cache.fake_scratchpad_data, madr, sadr, qwc); + c->addiu(t9, r0, 0); // addiu t9, r0, 0 + + block_47: + // nop // sll r0, r0, 0 + c->lbu(s2, 144, s3); // lbu s2, 144(s3) + c->addu(s1, gp, ra); // addu s1, gp, ra + c->sw(s5, 260, t0); // sw s5, 260(t0) + c->daddiu(t9, t9, 3); // daddiu t9, t9, 3 + c->sw(s1, 212, t0); // sw s1, 212(t0) + c->sll(s1, s2, 2); // sll s1, s2, 2 + c->sh(s2, 208, t0); // sh s2, 208(t0) + c->sll(s2, s2, 4); // sll s2, s2, 4 + c->sb(s1, 222, t0); // sb s1, 222(t0) + c->daddu(gp, gp, s2); // daddu gp, gp, s2 + c->lq(s2, 192, t0); // lq s2, 192(t0) + c->daddiu(s5, s5, 48); // daddiu s5, s5, 48 + c->lq(s1, 208, t0); // lq s1, 208(t0) + c->daddiu(t8, t8, 48); // daddiu t8, t8, 48 + c->lq(s0, 256, t0); // lq s0, 256(t0) + c->daddiu(s3, s3, 1); // daddiu s3, s3, 1 + c->sq(s2, -48, t8); // sq s2, -48(t8) + c->daddiu(s4, s4, -1); // daddiu s4, s4, -1 + c->sq(s1, -32, t8); // sq s1, -32(t8) + bc = ((s64)c->sgpr64(s4)) > 0; // bgtz s4, L160 + c->sq(s0, -16, t8); // sq s0, -16(t8) + if (bc) {goto block_43;} // branch non-likely + + //beq r0, r0, L172 // beq r0, r0, L172 + // nop // sll r0, r0, 0 + goto block_61; // branch always + + + block_49: + c->vmul(DEST::xyz, vf16, vf6, vf6); // vmul.xyz vf16, vf6, vf6 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->lqc2(vf9, 124, ra); // lqc2 vf9, 124(ra) + c->vsub_bc(DEST::w, BC::w, vf10, vf10, vf10); // vsubw.w vf10, vf10, vf10 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->vadda_bc(DEST::x, BC::y, vf16, vf16); // vadday.x acc, vf16, vf16 + // nop // sll r0, r0, 0 + c->vmadd_bc(DEST::x, BC::z, vf16, vf1, vf16); // vmaddz.x vf16, vf1, vf16 + // nop // sll r0, r0, 0 + c->vsqrt(vf16, BC::x); // vsqrt Q, vf16.x + // nop // sll r0, r0, 0 + c->vmula_bc(DEST::xyzw, BC::y, vf1, vf9); // vmulay.xyzw acc, vf1, vf9 + // nop // sll r0, r0, 0 + c->vmadda_bc(DEST::xyzw, BC::w, vf1, vf2); // vmaddaw.xyzw acc, vf1, vf2 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->vwaitq(); // vwaitq + // Unknown instr: vmsubq.xyzw vf16, vf1, Q + c->vmsubq(DEST::xyzw, vf16, vf1); + // nop // sll r0, r0, 0 + c->vmul_bc(DEST::xyzw, BC::x, vf16, vf16, vf9); // vmulx.xyzw vf16, vf16, vf9 + // nop // sll r0, r0, 0 + c->vmax_bc(DEST::x, BC::x, vf16, vf16, vf0); // vmaxx.x vf16, vf16, vf0 + // nop // sll r0, r0, 0 + c->vmini_bc(DEST::x, BC::y, vf16, vf16, vf3); // vminiy.x vf16, vf16, vf3 + // nop // sll r0, r0, 0 + c->vftoi0(DEST::xyzw, vf16, vf16); // vftoi0.xyzw vf16, vf16 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->mov128_gpr_vf(s5, vf16); // qmfc2.i s5, vf16 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->andi(s5, s5, 255); // andi s5, s5, 255 + // nop // sll r0, r0, 0 + bc = c->sgpr64(s5) == 0; // beq s5, r0, L154 + // nop // sll r0, r0, 0 + if (bc) {goto block_34;} // branch non-likely + + // Unknown instr: vcallms 29 + vcallms_29(c); + c->sw(s4, 432, t0); // sw s4, 432(t0) + // nop // sll r0, r0, 0 + c->lw(s4, 108, t0); // lw s4, 108(t0) + c->addiu(t9, t9, 6); // addiu t9, t9, 6 + c->lw(s3, 104, t0); // lw s3, 104(t0) + // nop // sll r0, r0, 0 + c->sw(s5, 80, t8); // sw s5, 80(t8) + bc = ((s64)c->sgpr64(s4)) > 0; // bgtz s4, L166 + // nop // sll r0, r0, 0 + if (bc) {goto block_54;} // branch non-likely + + bc = ((s64)c->sgpr64(s3)) > 0; // bgtz s3, L165 + // nop // sll r0, r0, 0 + if (bc) {goto block_53;} // branch non-likely + + // nop // sll r0, r0, 0 + c->lh(s4, 86, ra); // lh s4, 86(ra) + // nop // sll r0, r0, 0 + c->lw(s5, 96, ra); // lw s5, 96(ra) + c->daddiu(s4, s4, 1); // daddiu s4, s4, 1 + c->sqc2(vf28, 64, t8); // sqc2 vf28, 64(t8) + c->vmula_bc(DEST::xyzw, BC::x, vf24, vf10); // vmulax.xyzw acc, vf24, vf10 + c->addiu(gp, gp, 96); // addiu gp, gp, 96 + c->vmadda_bc(DEST::xyzw, BC::y, vf25, vf10); // vmadday.xyzw acc, vf25, vf10 + c->sw(gp, 96, ra); // sw gp, 96(ra) + c->vmadd_bc(DEST::xyzw, BC::z, vf10, vf26, vf10); // vmaddz.xyzw vf10, vf26, vf10 + c->sh(s4, 86, ra); // sh s4, 86(ra) + c->vmula_bc(DEST::xyzw, BC::x, vf24, vf11); // vmulax.xyzw acc, vf24, vf11 + c->lbu(s3, 109, ra); // lbu s3, 109(ra) + c->vmadda_bc(DEST::xyzw, BC::y, vf25, vf11); // vmadday.xyzw acc, vf25, vf11 + c->lhu(gp, 118, ra); // lhu gp, 118(ra) + c->vmadd_bc(DEST::xyzw, BC::z, vf11, vf26, vf11); // vmaddz.xyzw vf11, vf26, vf11 + c->lbu(s4, 113, ra); // lbu s4, 113(ra) + //beq r0, r0, L167 // beq r0, r0, L167 + // nop // sll r0, r0, 0 + goto block_55; // branch always + + + block_53: + // nop // sll r0, r0, 0 + c->lh(s4, 88, ra); // lh s4, 88(ra) + // nop // sll r0, r0, 0 + c->lw(s5, 100, ra); // lw s5, 100(ra) + c->daddiu(s4, s4, 1); // daddiu s4, s4, 1 + c->sqc2(vf29, 64, t8); // sqc2 vf29, 64(t8) + c->vmula_bc(DEST::xyzw, BC::x, vf24, vf10); // vmulax.xyzw acc, vf24, vf10 + c->addiu(gp, gp, 96); // addiu gp, gp, 96 + c->vmadda_bc(DEST::xyzw, BC::y, vf25, vf10); // vmadday.xyzw acc, vf25, vf10 + c->sw(gp, 100, ra); // sw gp, 100(ra) + c->vmadd_bc(DEST::xyzw, BC::z, vf10, vf26, vf10); // vmaddz.xyzw vf10, vf26, vf10 + c->sh(s4, 88, ra); // sh s4, 88(ra) + c->vmula_bc(DEST::xyzw, BC::x, vf24, vf11); // vmulax.xyzw acc, vf24, vf11 + c->lbu(s3, 110, ra); // lbu s3, 110(ra) + c->vmadda_bc(DEST::xyzw, BC::y, vf25, vf11); // vmadday.xyzw acc, vf25, vf11 + c->lhu(gp, 120, ra); // lhu gp, 120(ra) + c->vmadd_bc(DEST::xyzw, BC::z, vf11, vf26, vf11); // vmaddz.xyzw vf11, vf26, vf11 + c->lbu(s4, 114, ra); // lbu s4, 114(ra) + //beq r0, r0, L167 // beq r0, r0, L167 + // nop // sll r0, r0, 0 + goto block_55; // branch always + + + block_54: + // nop // sll r0, r0, 0 + c->lh(s4, 90, ra); // lh s4, 90(ra) + // nop // sll r0, r0, 0 + c->lw(s5, 104, ra); // lw s5, 104(ra) + c->daddiu(s4, s4, 1); // daddiu s4, s4, 1 + c->sqc2(vf30, 64, t8); // sqc2 vf30, 64(t8) + c->vmula_bc(DEST::xyzw, BC::x, vf24, vf10); // vmulax.xyzw acc, vf24, vf10 + c->addiu(gp, gp, 96); // addiu gp, gp, 96 + c->vmadda_bc(DEST::xyzw, BC::y, vf25, vf10); // vmadday.xyzw acc, vf25, vf10 + c->sw(gp, 104, ra); // sw gp, 104(ra) + c->vmadd_bc(DEST::xyzw, BC::z, vf10, vf26, vf10); // vmaddz.xyzw vf10, vf26, vf10 + c->sh(s4, 90, ra); // sh s4, 90(ra) + c->vmula_bc(DEST::xyzw, BC::x, vf24, vf11); // vmulax.xyzw acc, vf24, vf11 + c->lbu(s3, 111, ra); // lbu s3, 111(ra) + c->vmadda_bc(DEST::xyzw, BC::y, vf25, vf11); // vmadday.xyzw acc, vf25, vf11 + c->lhu(gp, 122, ra); // lhu gp, 122(ra) + c->vmadd_bc(DEST::xyzw, BC::z, vf11, vf26, vf11); // vmaddz.xyzw vf11, vf26, vf11 + c->lbu(s4, 115, ra); // lbu s4, 115(ra) + + block_55: + c->vmula_bc(DEST::xyzw, BC::x, vf24, vf12); // vmulax.xyzw acc, vf24, vf12 + c->dsll(gp, gp, 4); // dsll gp, gp, 4 + c->vmadda_bc(DEST::xyzw, BC::y, vf25, vf12); // vmadday.xyzw acc, vf25, vf12 + c->daddu(s4, s4, ra); // daddu s4, s4, ra + c->vmadd_bc(DEST::xyzw, BC::z, vf12, vf26, vf12); // vmaddz.xyzw vf12, vf26, vf12 + // nop // sll r0, r0, 0 + c->vmula_bc(DEST::xyzw, BC::x, vf24, vf13); // vmulax.xyzw acc, vf24, vf13 + // nop // sll r0, r0, 0 + c->vmadda_bc(DEST::xyzw, BC::y, vf25, vf13); // vmadday.xyzw acc, vf25, vf13 + // nop // sll r0, r0, 0 + c->vmadda_bc(DEST::xyzw, BC::z, vf26, vf13); // vmaddaz.xyzw acc, vf26, vf13 + // nop // sll r0, r0, 0 + c->vmadd_bc(DEST::xyzw, BC::w, vf13, vf27, vf0); // vmaddw.xyzw vf13, vf27, vf0 + // nop // sll r0, r0, 0 + c->sqc2(vf10, 0, t8); // sqc2 vf10, 0(t8) + // nop // sll r0, r0, 0 + c->sqc2(vf11, 16, t8); // sqc2 vf11, 16(t8) + // nop // sll r0, r0, 0 + c->sqc2(vf12, 32, t8); // sqc2 vf12, 32(t8) + // nop // sll r0, r0, 0 + c->sqc2(vf13, 48, t8); // sqc2 vf13, 48(t8) + c->daddiu(t8, t8, 96); // daddiu t8, t8, 96 + // nop // sll r0, r0, 0 + c->lw(ra, 8, t4); // lw ra, 8(t4) + // nop // sll r0, r0, 0 + c->lbu(s2, 144, s4); // lbu s2, 144(s4) + c->addu(s1, gp, ra); // addu s1, gp, ra + c->sw(s5, 284, t0); // sw s5, 284(t0) + c->daddiu(t9, t9, 3); // daddiu t9, t9, 3 + c->sw(s1, 292, t0); // sw s1, 292(t0) + c->sll(s1, s2, 4); // sll s1, s2, 4 + c->sh(s2, 288, t0); // sh s2, 288(t0) + c->daddu(gp, gp, s1); // daddu gp, gp, s1 + c->lq(s2, 272, t0); // lq s2, 272(t0) + c->daddiu(s5, s5, 48); // daddiu s5, s5, 48 + c->lq(s1, 288, t0); // lq s1, 288(t0) + c->daddiu(t8, t8, 48); // daddiu t8, t8, 48 + c->lq(s0, 304, t0); // lq s0, 304(t0) + c->daddiu(s4, s4, 1); // daddiu s4, s4, 1 + c->sq(s2, -48, t8); // sq s2, -48(t8) + c->daddiu(s3, s3, -1); // daddiu s3, s3, -1 + c->sq(s1, -32, t8); // sq s1, -32(t8) + bc = ((s64)c->sgpr64(s3)) <= 0; // blez s3, L172 + c->sq(s0, -16, t8); // sq s0, -16(t8) + if (bc) {goto block_61;} // branch non-likely + + + block_56: + c->daddiu(s2, t9, -252); // daddiu s2, t9, -252 + // nop // sll r0, r0, 0 + bc = ((s64)c->sgpr64(s2)) <= 0; // blez s2, L171 + // nop // sll r0, r0, 0 + if (bc) {goto block_60;} // branch non-likely + + /* + block_57: + c->lw(t8, 0, a3); // lw t8, 0(a3) + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->andi(t8, t8, 256); // andi t8, t8, 256 + // nop // sll r0, r0, 0 + bc = c->sgpr64(t8) == 0; // beq t8, r0, L170 + // nop // sll r0, r0, 0 + if (bc) {goto block_59;} // branch non-likely + + // nop // sll r0, r0, 0 + c->lw(t8, 440, t0); // lw t8, 440(t0) + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->daddiu(t8, t8, 1); // daddiu t8, t8, 1 + // nop // sll r0, r0, 0 + c->sw(t8, 440, t0); // sw t8, 440(t0) + //beq r0, r0, L169 // beq r0, r0, L169 + // nop // sll r0, r0, 0 + goto block_57; // branch always + */ + + + block_59: + // c->sw(a1, 128, a3); // sw a1, 128(a3) + sadr = c->sgpr64(a1); + c->xori(a1, a1, 12288); // xori a1, a1, 12288 + // c->sw(v1, 16, a3); // sw v1, 16(a3) + madr = c->sgpr64(v1); + c->sll(t8, t9, 4); // sll t8, t9, 4 + c->addu(v1, v1, t8); // addu v1, v1, t8 + c->mov64(t8, a1); // or t8, a1, r0 + // c->sw(t9, 32, a3); // sw t9, 32(a3) + qwc = c->sgpr64(t9); + c->addiu(t9, r0, 256); // addiu t9, r0, 256 + // c->sw(t9, 0, a3); // sw t9, 0(a3) + spad_from_dma(cache.fake_scratchpad_data, madr, sadr, qwc); + c->addiu(t9, r0, 0); // addiu t9, r0, 0 + + block_60: + // nop // sll r0, r0, 0 + c->lbu(s2, 144, s4); // lbu s2, 144(s4) + c->addu(s1, gp, ra); // addu s1, gp, ra + c->sw(s5, 284, t0); // sw s5, 284(t0) + c->daddiu(t9, t9, 3); // daddiu t9, t9, 3 + c->sw(s1, 292, t0); // sw s1, 292(t0) + c->sll(s1, s2, 4); // sll s1, s2, 4 + c->sh(s2, 288, t0); // sh s2, 288(t0) + c->daddu(gp, gp, s1); // daddu gp, gp, s1 + c->lq(s2, 272, t0); // lq s2, 272(t0) + c->daddiu(s5, s5, 48); // daddiu s5, s5, 48 + c->lq(s1, 288, t0); // lq s1, 288(t0) + c->daddiu(t8, t8, 48); // daddiu t8, t8, 48 + c->lq(s0, 304, t0); // lq s0, 304(t0) + c->daddiu(s4, s4, 1); // daddiu s4, s4, 1 + c->sq(s2, -48, t8); // sq s2, -48(t8) + c->daddiu(s3, s3, -1); // daddiu s3, s3, -1 + c->sq(s1, -32, t8); // sq s1, -32(t8) + bc = ((s64)c->sgpr64(s3)) > 0; // bgtz s3, L168 + c->sq(s0, -16, t8); // sq s0, -16(t8) + if (bc) {goto block_56;} // branch non-likely + + + block_61: + c->addiu(a2, a2, -1); // addiu a2, a2, -1 + c->srl(t7, t7, 1); // srl t7, t7, 1 + c->daddiu(t4, t4, 64); // daddiu t4, t4, 64 + // nop // sll r0, r0, 0 + bc = c->sgpr64(t7) != 0; // bne t7, r0, L148 + c->lqc2(vf2, 16, t4); // lqc2 vf2, 16(t4) + if (bc) {goto block_20;} // branch non-likely + + + block_62: + // nop // sll r0, r0, 0 + c->lw(ra, 412, t0); // lw ra, 412(t0) + // nop // sll r0, r0, 0 + c->lw(t7, 416, t0); // lw t7, 416(t0) + bc = c->sgpr64(ra) != c->sgpr64(t7); // bne ra, t7, L146 + // nop // sll r0, r0, 0 + if (bc) {goto block_17;} // branch non-likely + + bc = ((s64)c->sgpr64(a2)) > 0; // bgtz a2, L140 + // nop // sll r0, r0, 0 + if (bc) {goto block_6;} // branch non-likely + + bc = c->sgpr64(t9) == 0; // beq t9, r0, L176 + // nop // sll r0, r0, 0 + if (bc) {goto block_68;} // branch non-likely + + /* + block_65: + c->lw(a0, 0, a3); // lw a0, 0(a3) + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->andi(a0, a0, 256); // andi a0, a0, 256 + // nop // sll r0, r0, 0 + bc = c->sgpr64(a0) == 0; // beq a0, r0, L175 + // nop // sll r0, r0, 0 + if (bc) {goto block_67;} // branch non-likely + + // nop // sll r0, r0, 0 + c->lw(a0, 440, t0); // lw a0, 440(t0) + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->daddiu(a0, a0, 1); // daddiu a0, a0, 1 + // nop // sll r0, r0, 0 + c->sw(a0, 440, t0); // sw a0, 440(t0) + //beq r0, r0, L174 // beq r0, r0, L174 + // nop // sll r0, r0, 0 + goto block_65; // branch always + */ + + + block_67: + // c->sw(a1, 128, a3); // sw a1, 128(a3) + sadr = c->sgpr64(a1); + c->xori(a0, a1, 12288); // xori a0, a1, 12288 + // c->sw(v1, 16, a3); // sw v1, 16(a3) + madr = c->sgpr64(v1); + c->sll(a1, t9, 4); // sll a1, t9, 4 + c->addu(v1, v1, a1); // addu v1, v1, a1 + c->mov64(a0, a0); // or a0, a0, r0 + // c->sw(t9, 32, a3); // sw t9, 32(a3) + qwc = c->sgpr64(t9); + c->addiu(a0, r0, 256); // addiu a0, r0, 256 + // c->sw(a0, 0, a3); // sw a0, 0(a3) + spad_from_dma(cache.fake_scratchpad_data, madr, sadr, qwc); + c->addiu(a0, r0, 0); // addiu a0, r0, 0 + + block_68: + /* + c->lw(a0, 0, a3); // lw a0, 0(a3) + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->andi(a0, a0, 256); // andi a0, a0, 256 + // nop // sll r0, r0, 0 + bc = c->sgpr64(a0) == 0; // beq a0, r0, L177 + // nop // sll r0, r0, 0 + if (bc) {goto block_70;} // branch non-likely + + // nop // sll r0, r0, 0 + c->lw(a0, 440, t0); // lw a0, 440(t0) + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->daddiu(a0, a0, 1); // daddiu a0, a0, 1 + // nop // sll r0, r0, 0 + c->sw(a0, 440, t0); // sw a0, 440(t0) + //beq r0, r0, L176 // beq r0, r0, L176 + // nop // sll r0, r0, 0 + goto block_68; // branch always + */ + + + block_70: + c->lw(a0, 396, t0); // lw a0, 396(t0) + // nop // sll r0, r0, 0 + c->sw(v1, 4, a0); // sw v1, 4(a0) + // nop // sll r0, r0, 0 + c->gprs[v0].du64[0] = 0; // or v0, r0, r0 + c->ld(ra, 0, sp); // ld ra, 0(sp) + c->lq(gp, 112, sp); // lq gp, 112(sp) + c->lq(s5, 96, sp); // lq s5, 96(sp) + c->lq(s4, 80, sp); // lq s4, 80(sp) + c->lq(s3, 64, sp); // lq s3, 64(sp) + c->lq(s2, 48, sp); // lq s2, 48(sp) + c->lq(s1, 32, sp); // lq s1, 32(sp) + c->lq(s0, 16, sp); // lq s0, 16(sp) + //jr ra // jr ra + c->daddiu(sp, sp, 128); // daddiu sp, sp, 128 + goto end_of_function; // return + + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + end_of_function: + return c->gprs[v0].du64[0]; +} + +void link() { + cache.fake_scratchpad_data = intern_from_c("*fake-scratchpad-data*").c(); + cache.instance_tie_work_copy = intern_from_c("*instance-tie-work-copy*").c(); + cache.wind_work = intern_from_c("*wind-work*").c(); + cache.math_camera = intern_from_c("*math-camera*").c(); + gLinkedFunctionTable.reg("draw-inline-array-instance-tie", execute, 512); +} + +} // namespace draw_inline_array_instance_tie +} // namespace Mips2C + + +//--------------------------MIPS2C--------------------- +#include "game/mips2c/mips2c_private.h" +#include "game/kernel/kscheme.h" +namespace Mips2C { +namespace draw_inline_array_prototype_tie_generic_asm { +struct Cache { + void* fake_scratchpad_data; // *fake-scratchpad-data* + void* prototype_tie_work; // *prototype-tie-work* +} cache; + +void block29_call(ExecutionContext* c) { + bool bc; + u32 sadr, madr, qwc; + block_29: + c->addiu(t6, t6, 32); // addiu t6, t6, 32 + c->sw(t5, 232, t0); // sw t5, 232(t0) + + block_30: + c->addiu(t7, a0, 4); // addiu t7, a0, 4 + c->addiu(t8, r0, 255); // addiu t8, r0, 255 + c->dsubu(t8, t8, t7); // dsubu t8, t8, t7 + c->lw(t7, 0, t6); // lw t7, 0(t6) + bc = ((s64)c->sgpr64(t8)) >= 0; // bgez t8, L131 + c->lhu(t8, 30, t6); // lhu t8, 30(t6) + if (bc) {goto block_34;} // branch non-likely + + /* + block_31: + c->lw(a1, 0, t1); // lw a1, 0(t1) + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->andi(a1, a1, 256); // andi a1, a1, 256 + // nop // sll r0, r0, 0 + bc = c->sgpr64(a1) == 0; // beq a1, r0, L130 + // nop // sll r0, r0, 0 + if (bc) {goto block_33;} // branch non-likely + + // nop // sll r0, r0, 0 + c->lw(a1, 284, t0); // lw a1, 284(t0) + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->daddiu(a1, a1, 1); // daddiu a1, a1, 1 + // nop // sll r0, r0, 0 + c->sw(a1, 284, t0); // sw a1, 284(t0) + //beq r0, r0, L129 // beq r0, r0, L129 + // nop // sll r0, r0, 0 + goto block_31; // branch always + */ + + + block_33: + // c->sw(t2, 128, t1); // sw t2, 128(t1) + sadr = c->sgpr64(t2); + c->xori(t2, t2, 4096); // xori t2, t2, 4096 + // c->sw(v1, 16, t1); // sw v1, 16(t1) + madr = c->sgpr64(v1); + c->sll(a1, a0, 4); // sll a1, a0, 4 + c->addu(v1, v1, a1); // addu v1, v1, a1 + c->mov64(a1, t2); // or a1, t2, r0 + // c->sw(a0, 32, t1); // sw a0, 32(t1) + qwc = c->sgpr64(a0); + c->addiu(a0, r0, 256); // addiu a0, r0, 256 + // c->sw(a0, 0, t1); // sw a0, 0(t1) + spad_from_dma(cache.fake_scratchpad_data, madr, sadr, qwc); + c->addiu(a0, r0, 0); // addiu a0, r0, 0 + + block_34: + // nop // sll r0, r0, 0 + c->lhu(t9, 28, t6); // lhu t9, 28(t6) + c->daddu(t8, t8, t9); // daddu t8, t8, t9 + c->lw(t9, 4, t6); // lw t9, 4(t6) + c->daddiu(a0, a0, 4); // daddiu a0, a0, 4 + c->lhu(gp, 32, t6); // lhu gp, 32(t6) + c->sll(s5, a0, 4); // sll s5, a0, 4 + c->sw(t7, 212, t0); // sw t7, 212(t0) + c->daddu(t7, s5, v1); // daddu t7, s5, v1 + c->sh(t8, 208, t0); // sh t8, 208(t0) + // nop // sll r0, r0, 0 + c->sw(t7, 220, t0); // sw t7, 220(t0) + // nop // sll r0, r0, 0 + c->sw(a2, 260, t0); // sw a2, 260(t0) + // nop // sll r0, r0, 0 + c->sw(t9, 228, t0); // sw t9, 228(t0) + // nop // sll r0, r0, 0 + c->sh(gp, 224, t0); // sh gp, 224(t0) + // nop // sll r0, r0, 0 + c->lw(t7, 48, t6); // lw t7, 48(t6) + // nop // sll r0, r0, 0 + c->lhu(t8, 52, t6); // lhu t8, 52(t6) + // nop // sll r0, r0, 0 + c->sw(t7, 244, t0); // sw t7, 244(t0) + // nop // sll r0, r0, 0 + c->sh(t8, 240, t0); // sh t8, 240(t0) + // nop // sll r0, r0, 0 + c->lq(t7, 208, t0); // lq t7, 208(t0) + // nop // sll r0, r0, 0 + c->lq(t8, 224, t0); // lq t8, 224(t0) + // nop // sll r0, r0, 0 + c->lq(t9, 240, t0); // lq t9, 240(t0) + // nop // sll r0, r0, 0 + c->lq(gp, 256, t0); // lq gp, 256(t0) + // nop // sll r0, r0, 0 + c->sq(t7, 0, a1); // sq t7, 0(a1) + c->daddiu(t5, t5, -1); // daddiu t5, t5, -1 + c->sq(t8, 16, a1); // sq t8, 16(a1) + c->daddiu(a2, a2, 48); // daddiu a2, a2, 48 + c->sq(t9, 32, a1); // sq t9, 32(a1) + c->sq(gp, 48, a1); // sq gp, 48(a1) + c->daddiu(a1, a1, 64); // daddiu a1, a1, 64 + bc = ((s64)c->sgpr64(t5)) > 0; // bgtz t5, L128 + c->daddiu(t6, t6, 64); // daddiu t6, t6, 64 + if (bc) {goto block_30;} // branch non-likely + + //jr ra // jr ra + // nop // sll r0, r0, 0 +} + +u64 execute(void* ctxt) { + auto* c = (ExecutionContext*)ctxt; + bool bc = false; + u32 call_addr = 0; + u32 madr, sadr, qwc; + c->daddiu(sp, sp, -112); // daddiu sp, sp, -112 + c->sd(ra, 0, sp); // sd ra, 0(sp) + c->sq(s1, 16, sp); // sq s1, 16(sp) + c->sq(s2, 32, sp); // sq s2, 32(sp) + c->sq(s3, 48, sp); // sq s3, 48(sp) + c->sq(s4, 64, sp); // sq s4, 64(sp) + c->sq(s5, 80, sp); // sq s5, 80(sp) + c->sq(gp, 96, sp); // sq gp, 96(sp) + // nop // sll r0, r0, 0 + get_fake_spad_addr(a3, cache.fake_scratchpad_data, 0, c);// lui a3, 28672 + c->lw(v1, 4, a0); // lw v1, 4(a0) + c->lui(t1, 4096); // lui t1, 4096 + c->lui(t2, 4096); // lui t2, 4096 + // sync.l + // cache dxwbin v1, 0 + // sync.l + // cache dxwbin v1, 1 + // sync.l + c->load_symbol(t0, cache.prototype_tie_work); // lw t0, *prototype-tie-work*(s7) + c->ori(t1, t1, 53248); // ori t1, t1, 53248 + c->ori(t4, t2, 54272); // ori t4, t2, 54272 SPR TO + c->ori(t3, a3, 16); // ori t3, a3, 16 + c->ori(t2, a3, 2064); // ori t2, a3, 2064 + c->sw(a0, 10260, a3); // sw a0, 10260(a3) + c->daddiu(t7, a1, -1); // daddiu t7, a1, -1 + // nop // sll r0, r0, 0 + c->lw(t6, 12, a2); // lw t6, 12(a2) + c->addiu(a0, r0, 0); // addiu a0, r0, 0 + c->mov64(a1, t2); // or a1, t2, r0 + + block_1: + // nop // sll r0, r0, 0 + c->lq(t5, 92, t6); // lq t5, 92(t6) + c->daddiu(t8, a2, 4); // daddiu t8, a2, 4 + c->sw(t7, 10256, a3); // sw t7, 10256(a3) + c->dsrl32(a2, t5, 0); // dsrl32 a2, t5, 0 + c->sw(t8, 280, t0); // sw t8, 280(t0) + c->pcpyud(t7, t5, t5); // pcpyud t7, t5, t5 + c->lw(t9, 140, t6); // lw t9, 140(t6) + c->or_(t7, a2, t7); // or t7, a2, t7 + c->lw(a2, 108, t6); // lw a2, 108(t6) + bc = c->sgpr64(t7) == 0; // beq t7, r0, L126 + c->lw(t8, 4, a3); // lw t8, 4(a3) + if (bc) {goto block_27;} // branch non-likely + + // nop // sll r0, r0, 0 + c->lq(t7, 12, t6); // lq t7, 12(t6) + // nop // sll r0, r0, 0 + c->sq(t5, 10272, a3); // sq t5, 10272(a3) + // nop // sll r0, r0, 0 + c->sw(a2, 10304, a3); // sw a2, 10304(a3) + // nop // sll r0, r0, 0 + c->sq(t7, 10288, a3); // sq t7, 10288(a3) + // nop // sll r0, r0, 0 + c->ld(a2, 272, t0); // ld a2, 272(t0) + // nop // sll r0, r0, 0 + c->lw(t7, 4, t9); // lw t7, 4(t9) + c->daddiu(ra, t9, 12); // daddiu ra, t9, 12 + c->lq(t5, 1852, t8); // lq t5, 1852(t8) + c->sra(t9, t7, 2); // sra t9, t7, 2 + // nop // sll r0, r0, 0 + c->addu(t9, t9, a0); // addu t9, t9, a0 + c->addiu(gp, r0, 221); // addiu gp, r0, 221 + c->dsubu(t9, gp, t9); // dsubu t9, gp, t9 + // nop // sll r0, r0, 0 + bc = ((s64)c->sgpr64(t9)) >= 0; // bgez t9, L114 + // nop // sll r0, r0, 0 + if (bc) {goto block_6;} // branch non-likely + + /* + block_3: + c->lw(a1, 0, t1); // lw a1, 0(t1) + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->andi(a1, a1, 256); // andi a1, a1, 256 + // nop // sll r0, r0, 0 + bc = c->sgpr64(a1) == 0; // beq a1, r0, L113 + // nop // sll r0, r0, 0 + if (bc) {goto block_5;} // branch non-likely + + // nop // sll r0, r0, 0 + c->lw(a1, 284, t0); // lw a1, 284(t0) + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->daddiu(a1, a1, 1); // daddiu a1, a1, 1 + // nop // sll r0, r0, 0 + c->sw(a1, 284, t0); // sw a1, 284(t0) + //beq r0, r0, L112 // beq r0, r0, L112 + // nop // sll r0, r0, 0 + goto block_3; // branch always + */ + + + block_5: + // c->sw(t2, 128, t1); // sw t2, 128(t1) + sadr = c->sgpr64(t2); + c->xori(t2, t2, 4096); // xori t2, t2, 4096 + // c->sw(v1, 16, t1); // sw v1, 16(t1) + madr = c->sgpr64(v1); + c->sll(a1, a0, 4); // sll a1, a0, 4 + c->addu(v1, v1, a1); // addu v1, v1, a1 + c->mov64(a1, t2); // or a1, t2, r0 + // c->sw(a0, 32, t1); // sw a0, 32(t1) + qwc = c->sgpr64(a0); + c->addiu(a0, r0, 256); // addiu a0, r0, 256 + // c->sw(a0, 0, t1); // sw a0, 0(t1) + spad_from_dma(cache.fake_scratchpad_data, madr, sadr, qwc); + c->addiu(a0, r0, 0); // addiu a0, r0, 0 + + block_6: + c->addiu(t7, t7, 31); // addiu t7, t7, 31 + c->lw(t6, 132, t6); // lw t6, 132(t6) + c->sra(t7, t7, 5); // sra t7, t7, 5 + c->addiu(a0, a0, 1); // addiu a0, a0, 1 + c->sll(t7, t7, 3); // sll t7, t7, 3 + c->sw(t6, 200, t0); // sw t6, 200(t0) + c->addu(a0, a0, t7); // addu a0, a0, t7 + c->sh(t7, 192, t0); // sh t7, 192(t0) + c->sll(t9, t7, 2); // sll t9, t7, 2 + c->lq(t6, 1868, t8); // lq t6, 1868(t8) + // nop // sll r0, r0, 0 + c->lq(gp, 192, t0); // lq gp, 192(t0) + // nop // sll r0, r0, 0 + c->lq(t7, 1884, t8); // lq t7, 1884(t8) + // nop // sll r0, r0, 0 + c->sq(gp, 0, a1); // sq gp, 0(a1) + c->addiu(a1, a1, 16); // addiu a1, a1, 16 + c->lq(t8, 1900, t8); // lq t8, 1900(t8) + + /* + block_7: + c->lw(gp, 0, t4); // lw gp, 0(t4) + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->andi(gp, gp, 256); // andi gp, gp, 256 + // nop // sll r0, r0, 0 + bc = c->sgpr64(gp) == 0; // beq gp, r0, L116 + // nop // sll r0, r0, 0 + if (bc) {goto block_9;} // branch non-likely + + // nop // sll r0, r0, 0 + c->lw(gp, 288, t0); // lw gp, 288(t0) + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->daddiu(gp, gp, 1); // daddiu gp, gp, 1 + // nop // sll r0, r0, 0 + c->sw(gp, 288, t0); // sw gp, 288(t0) + //beq r0, r0, L115 // beq r0, r0, L115 + // nop // sll r0, r0, 0 + goto block_7; // branch always + */ + + + block_9: + // c->sw(ra, 16, t4); // sw ra, 16(t4) + madr = c->sgpr64(ra); + c->daddiu(t9, t9, -32); // daddiu t9, t9, -32 + // c->sw(t3, 128, t4); // sw t3, 128(t4) + sadr = c->sgpr64(t3); + c->addiu(gp, r0, 64); // addiu gp, r0, 64 + // c->sw(gp, 32, t4); // sw gp, 32(t4) + qwc = c->sgpr64(gp); + c->addiu(gp, r0, 256); // addiu gp, r0, 256 + // c->sw(gp, 0, t4); // sw gp, 0(t4) + spad_to_dma(cache.fake_scratchpad_data, madr, sadr, qwc); + c->daddiu(ra, ra, 1024); // daddiu ra, ra, 1024 + + block_10: + c->mov64(s5, t3); // or s5, t3, r0 + c->xori(t3, t3, 1024); // xori t3, t3, 1024 + bc = ((s64)c->sgpr64(t9)) <= 0; // blez t9, L120 + c->daddiu(t9, t9, -32); // daddiu t9, t9, -32 + if (bc) {goto block_14;} // branch non-likely + + /* + block_11: + c->lw(gp, 0, t4); // lw gp, 0(t4) + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->andi(gp, gp, 256); // andi gp, gp, 256 + // nop // sll r0, r0, 0 + bc = c->sgpr64(gp) == 0; // beq gp, r0, L119 + // nop // sll r0, r0, 0 + if (bc) {goto block_13;} // branch non-likely + + // nop // sll r0, r0, 0 + c->lw(gp, 288, t0); // lw gp, 288(t0) + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->daddiu(gp, gp, 1); // daddiu gp, gp, 1 + // nop // sll r0, r0, 0 + c->sw(gp, 288, t0); // sw gp, 288(t0) + //beq r0, r0, L118 // beq r0, r0, L118 + // nop // sll r0, r0, 0 + goto block_11; // branch always + */ + + + block_13: + // c->sw(ra, 16, t4); // sw ra, 16(t4) + madr = c->sgpr64(ra); + // nop // sll r0, r0, 0 + // c->sw(t3, 128, t4); // sw t3, 128(t4) + sadr = c->sgpr64(t3); + c->addiu(gp, r0, 64); // addiu gp, r0, 64 + // c->sw(gp, 32, t4); // sw gp, 32(t4) + qwc = c->sgpr64(gp); + c->addiu(gp, r0, 256); // addiu gp, r0, 256 + // c->sw(gp, 0, t4); // sw gp, 0(t4) + spad_to_dma(cache.fake_scratchpad_data, madr, sadr, qwc); + c->daddiu(ra, ra, 1024); // daddiu ra, ra, 1024 + //beq r0, r0, L121 // beq r0, r0, L121 + // nop // sll r0, r0, 0 + goto block_16; // branch always + + + block_14: + /* + c->lw(gp, 0, t4); // lw gp, 0(t4) + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->andi(gp, gp, 256); // andi gp, gp, 256 + // nop // sll r0, r0, 0 + bc = c->sgpr64(gp) == 0; // beq gp, r0, L121 + // nop // sll r0, r0, 0 + if (bc) {goto block_16;} // branch non-likely + + // nop // sll r0, r0, 0 + c->lw(gp, 288, t0); // lw gp, 288(t0) + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->daddiu(gp, gp, 1); // daddiu gp, gp, 1 + // nop // sll r0, r0, 0 + c->sw(gp, 288, t0); // sw gp, 288(t0) + //beq r0, r0, L120 // beq r0, r0, L120 + // nop // sll r0, r0, 0 + goto block_14; // branch always + */ + + + block_16: + c->addiu(gp, a1, 128); // addiu gp, a1, 128 + c->lq(s2, 12, s5); // lq s2, 12(s5) + // nop // sll r0, r0, 0 + c->lq(s4, 28, s5); // lq s4, 28(s5) + c->pextlb(s3, r0, s2); // pextlb s3, r0, s2 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pextub(s2, r0, s2); // pextub s2, r0, s2 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pmulth(r0, s3, t5); // pmulth r0, s3, t5 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pextlb(s3, r0, s4); // pextlb s3, r0, s4 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pmaddh(r0, s2, t6); // pmaddh r0, s2, t6 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pextub(s4, r0, s4); // pextub s4, r0, s4 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pmaddh(r0, s3, t7); // pmaddh r0, s3, t7 + c->lq(s3, 44, s5); // lq s3, 44(s5) + c->addiu(s5, s5, 32); // addiu s5, s5, 32 + // nop // sll r0, r0, 0 + c->pmaddh(r0, s4, t8); // pmaddh r0, s4, t8 + c->lq(s4, 28, s5); // lq s4, 28(s5) + c->pextlb(s2, r0, s3); // pextlb s2, r0, s3 + c->mfc1(r0, f31); // mfc1 r0, f31 + + block_17: + c->pextub(s3, r0, s3); // pextub s3, r0, s3 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pmfhl_lh(s1); // pmfhl.lh s1 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pmulth(r0, s2, t5); // pmulth r0, s2, t5 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->psrlh(s2, s1, 6); // psrlh s2, s1, 6 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pcpyud(s1, s2, s2); // pcpyud s1, s2, s2 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->paddh(s2, s1, s2); // paddh s2, s1, s2 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pminh(s2, s2, a2); // pminh s2, s2, a2 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->ppacb(s1, r0, s2); // ppacb s1, r0, s2 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pextlb(s2, r0, s4); // pextlb s2, r0, s4 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pmaddh(r0, s3, t6); // pmaddh r0, s3, t6 + c->sw(s1, 0, a1); // sw s1, 0(a1) + c->pextub(s4, r0, s4); // pextub s4, r0, s4 + c->mfc1(r0, f31); // mfc1 r0, f31 + c->pmaddh(r0, s2, t7); // pmaddh r0, s2, t7 + c->lq(s3, 44, s5); // lq s3, 44(s5) + c->addiu(s5, s5, 32); // addiu s5, s5, 32 + c->addiu(a1, a1, 4); // addiu a1, a1, 4 + c->pmaddh(r0, s4, t8); // pmaddh r0, s4, t8 + c->lq(s4, 28, s5); // lq s4, 28(s5) + bc = c->sgpr64(a1) != c->sgpr64(gp); // bne a1, gp, L122 + c->pextlb(s2, r0, s3); // pextlb s2, r0, s3 + if (bc) {goto block_17;} // branch non-likely + + bc = ((s64)c->sgpr64(t9)) >= 0; // bgez t9, L117 + // nop // sll r0, r0, 0 + if (bc) {goto block_10;} // branch non-likely + + // nop // sll r0, r0, 0 + c->lw(a2, 10272, a3); // lw a2, 10272(a3) + // nop // sll r0, r0, 0 + c->lw(t6, 10292, a3); // lw t6, 10292(a3) + bc = c->sgpr64(a2) == 0; // beq a2, r0, L123 + c->lbu(t5, 10305, a3); // lbu t5, 10305(a3) + if (bc) {goto block_21;} // branch non-likely + + // Unknown instr: bgezal r0, L127 + block29_call(c); + // nop // sll r0, r0, 0 + + + + block_21: + // nop // sll r0, r0, 0 + c->lw(a2, 10276, a3); // lw a2, 10276(a3) + // nop // sll r0, r0, 0 + c->lw(t6, 10292, a3); // lw t6, 10292(a3) + bc = c->sgpr64(a2) == 0; // beq a2, r0, L124 + c->lbu(t5, 10305, a3); // lbu t5, 10305(a3) + if (bc) {goto block_23;} // branch non-likely + + // Unknown instr: bgezal r0, L127 + // nop // sll r0, r0, 0 + block29_call(c); + + + block_23: + // nop // sll r0, r0, 0 + c->lw(a2, 10280, a3); // lw a2, 10280(a3) + // nop // sll r0, r0, 0 + c->lw(t6, 10296, a3); // lw t6, 10296(a3) + bc = c->sgpr64(a2) == 0; // beq a2, r0, L125 + c->lbu(t5, 10306, a3); // lbu t5, 10306(a3) + if (bc) {goto block_25;} // branch non-likely + + // Unknown instr: bgezal r0, L127 + // nop // sll r0, r0, 0 + block29_call(c); + + + block_25: + // nop // sll r0, r0, 0 + c->lw(a2, 10284, a3); // lw a2, 10284(a3) + // nop // sll r0, r0, 0 + c->lw(t6, 10300, a3); // lw t6, 10300(a3) + bc = c->sgpr64(a2) == 0; // beq a2, r0, L126 + c->lbu(t5, 10307, a3); // lbu t5, 10307(a3) + if (bc) {goto block_27;} // branch non-likely + + // Unknown instr: bgezal r0, L127 + // nop // sll r0, r0, 0 + block29_call(c); + + + block_27: + // nop // sll r0, r0, 0 + c->lw(a2, 280, t0); // lw a2, 280(t0) + // nop // sll r0, r0, 0 + c->lw(t5, 10256, a3); // lw t5, 10256(a3) + // nop // sll r0, r0, 0 + c->lw(t6, 12, a2); // lw t6, 12(a2) + // nop // sll r0, r0, 0 + c->sw(r0, -56, a1); // sw r0, -56(a1) + bc = c->sgpr64(t5) != 0; // bne t5, r0, L111 + c->daddiu(t7, t5, -1); // daddiu t7, t5, -1 + if (bc) {goto block_1;} // branch non-likely + + //beq r0, r0, L132 // beq r0, r0, L132 + c->sw(r0, -52, a1); // sw r0, -52(a1) + goto block_36; // branch always + + + ASSERT(false); + + block_36: + bc = c->sgpr64(a0) == 0; // beq a0, r0, L135 + // nop // sll r0, r0, 0 + if (bc) {goto block_40;} // branch non-likely + + /* + block_37: + c->lw(a1, 0, t1); // lw a1, 0(t1) + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->andi(a1, a1, 256); // andi a1, a1, 256 + // nop // sll r0, r0, 0 + bc = c->sgpr64(a1) == 0; // beq a1, r0, L134 + // nop // sll r0, r0, 0 + if (bc) {goto block_39;} // branch non-likely + + // nop // sll r0, r0, 0 + c->lw(a1, 284, t0); // lw a1, 284(t0) + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->daddiu(a1, a1, 1); // daddiu a1, a1, 1 + // nop // sll r0, r0, 0 + c->sw(a1, 284, t0); // sw a1, 284(t0) + //beq r0, r0, L133 // beq r0, r0, L133 + // nop // sll r0, r0, 0 + goto block_37; // branch always + */ + + + block_39: + // c->sw(t2, 128, t1); // sw t2, 128(t1) + sadr = c->sgpr64(t2); + // nop // sll r0, r0, 0 + // c->sw(v1, 16, t1); // sw v1, 16(t1) + madr = c->sgpr64(v1); + c->sll(a1, a0, 4); // sll a1, a0, 4 + c->addu(v1, v1, a1); // addu v1, v1, a1 + // nop // sll r0, r0, 0 + // c->sw(a0, 32, t1); // sw a0, 32(t1) + qwc = c->sgpr64(a0); + c->addiu(a0, r0, 256); // addiu a0, r0, 256 + // c->sw(a0, 0, t1); // sw a0, 0(t1) + spad_from_dma(cache.fake_scratchpad_data, madr, sadr, qwc); + // nop // sll r0, r0, 0 + + block_40: + /* + c->lw(a0, 0, t1); // lw a0, 0(t1) + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->andi(a0, a0, 256); // andi a0, a0, 256 + // nop // sll r0, r0, 0 + bc = c->sgpr64(a0) == 0; // beq a0, r0, L136 + // nop // sll r0, r0, 0 + if (bc) {goto block_42;} // branch non-likely + + // nop // sll r0, r0, 0 + c->lw(a0, 284, t0); // lw a0, 284(t0) + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + c->daddiu(a0, a0, 1); // daddiu a0, a0, 1 + // nop // sll r0, r0, 0 + c->sw(a0, 284, t0); // sw a0, 284(t0) + //beq r0, r0, L135 // beq r0, r0, L135 + // nop // sll r0, r0, 0 + goto block_40; // branch always + */ + + + block_42: + c->lw(a0, 10260, a3); // lw a0, 10260(a3) + // nop // sll r0, r0, 0 + c->sw(v1, 4, a0); // sw v1, 4(a0) + // nop // sll r0, r0, 0 + c->gprs[v0].du64[0] = 0; // or v0, r0, r0 + c->ld(ra, 0, sp); // ld ra, 0(sp) + c->lq(gp, 96, sp); // lq gp, 96(sp) + c->lq(s5, 80, sp); // lq s5, 80(sp) + c->lq(s4, 64, sp); // lq s4, 64(sp) + c->lq(s3, 48, sp); // lq s3, 48(sp) + c->lq(s2, 32, sp); // lq s2, 32(sp) + c->lq(s1, 16, sp); // lq s1, 16(sp) + //jr ra // jr ra + c->daddiu(sp, sp, 112); // daddiu sp, sp, 112 + goto end_of_function; // return + + // nop // sll r0, r0, 0 + // nop // sll r0, r0, 0 + end_of_function: + return c->gprs[v0].du64[0]; +} + +void link() { + cache.fake_scratchpad_data = intern_from_c("*fake-scratchpad-data*").c(); + cache.prototype_tie_work = intern_from_c("*prototype-tie-work*").c(); + gLinkedFunctionTable.reg("draw-inline-array-prototype-tie-generic-asm", execute, 256); +} + +} // namespace draw_inline_array_prototype_tie_generic_asm +} // namespace Mips2C diff --git a/game/mips2c/mips2c_private.h b/game/mips2c/mips2c_private.h index d0a678146a..3e25960b95 100644 --- a/game/mips2c/mips2c_private.h +++ b/game/mips2c/mips2c_private.h @@ -475,6 +475,15 @@ struct ExecutionContext { } } + void ppacw(int rd, int rs, int rt) { + auto s = gpr_src(rs); + auto t = gpr_src(rt); + gprs[rd].du32[0] = t.du32[0]; + gprs[rd].du32[1] = t.du32[2]; + gprs[rd].du32[2] = s.du32[0]; + gprs[rd].du32[3] = s.du32[2]; + } + void ppach(int rd, int rs, int rt) { auto s = gpr_src(rs); auto t = gpr_src(rt); @@ -713,6 +722,20 @@ struct ExecutionContext { gprs[dest].du16[7] = hi.du16[6]; } + void pmfhl_uw(int dest) { + gprs[dest].du32[0] = lo.du32[1]; + gprs[dest].du32[1] = hi.du32[1]; + gprs[dest].du32[2] = lo.du32[3]; + gprs[dest].du32[3] = hi.du32[3]; + } + + void pmfhl_lw(int dest) { + gprs[dest].du32[0] = lo.du32[0]; + gprs[dest].du32[1] = hi.du32[0]; + gprs[dest].du32[2] = lo.du32[2]; + gprs[dest].du32[3] = hi.du32[2]; + } + void vsub_bc(DEST mask, BC bc, int dest, int src0, int src1) { auto s0 = vf_src(src0); auto s1 = vf_src(src1); @@ -801,6 +824,17 @@ struct ExecutionContext { } } + void vmula(DEST mask, int src0, int src1) { + auto s0 = vf_src(src0); + auto s1 = vf_src(src1); + + for (int i = 0; i < 4; i++) { + if ((u64)mask & (1 << i)) { + acc.f[i] = s0.f[i] * s1.f[i]; + } + } + } + void vadda_bc(DEST mask, BC bc, int src0, int src1) { auto s0 = vf_src(src0); auto s1 = vf_src(src1); @@ -878,6 +912,27 @@ struct ExecutionContext { } } + void vmsub(DEST mask, int dst, int src0, int src1) { + auto s0 = vf_src(src0); + auto s1 = vf_src(src1); + + for (int i = 0; i < 4; i++) { + if ((u64)mask & (1 << i)) { + vfs[dst].f[i] = acc.f[i] - s0.f[i] * s1.f[i]; + } + } + } + + void vmsubq(DEST mask, int dst, int src0) { + auto s0 = vf_src(src0); + + for (int i = 0; i < 4; i++) { + if ((u64)mask & (1 << i)) { + vfs[dst].f[i] = acc.f[i] - s0.f[i] * Q; + } + } + } + void vdiv(int src0, BC bc0, int src1, BC bc1) { Q = vf_src(src0).f[(int)bc0] / vf_src(src1).f[(int)bc1]; } diff --git a/game/mips2c/mips2c_table.cpp b/game/mips2c/mips2c_table.cpp index 9bacb966d6..e0b4c7f154 100644 --- a/game/mips2c/mips2c_table.cpp +++ b/game/mips2c/mips2c_table.cpp @@ -320,6 +320,29 @@ extern void link(); namespace shadow_xform_verts { extern void link(); } +namespace draw_inline_array_instance_tie { +extern void link(); +} +namespace draw_inline_array_prototype_tie_generic_asm { +extern void link(); +} + +namespace generic_tie_dma_to_spad_sync { +extern void link(); +} +namespace generic_envmap_dproc { +extern void link(); +} +namespace generic_interp_dproc { +extern void link(); +} +namespace generic_no_light_dproc { +extern void link(); +} + +namespace generic_tie_convert { +extern void link(); +} LinkedFunctionTable gLinkedFunctionTable; Rng gRng; std::unordered_map> gMips2CLinkCallbacks = { @@ -361,7 +384,8 @@ std::unordered_map> gMips2CLinkCallbacks = high_speed_reject::link}}, {"generic-effect", {generic_prepare_dma_double::link, generic_light_proc::link, generic_envmap_proc::link, - generic_prepare_dma_single::link}}, + generic_prepare_dma_single::link, generic_envmap_dproc::link, generic_interp_dproc::link, + generic_no_light_dproc::link}}, {"ripple", {ripple_execute_init::link, ripple_create_wave_table::link, ripple_apply_wave_table::link, ripple_matrix_scale::link}}, @@ -373,7 +397,10 @@ std::unordered_map> gMips2CLinkCallbacks = shadow_find_double_edges::link, shadow_find_facing_double_tris::link, shadow_find_single_edges::link, shadow_find_facing_single_tris::link, shadow_init_vars::link, shadow_scissor_top::link, shadow_scissor_edges::link, shadow_calc_dual_verts::link, - shadow_xform_verts::link}}}; + shadow_xform_verts::link}}, + {"tie-methods", + {draw_inline_array_instance_tie::link, draw_inline_array_prototype_tie_generic_asm::link}}, + {"generic-tie", {generic_tie_dma_to_spad_sync::link, generic_tie_convert::link}}}; void LinkedFunctionTable::reg(const std::string& name, u64 (*exec)(void*), u32 stack_size) { const auto& it = m_executes.insert({name, {exec, Ptr()}}); diff --git a/goal_src/engine/gfx/background.gc b/goal_src/engine/gfx/background.gc index 1123f746c4..ad33f123b2 100644 --- a/goal_src/engine/gfx/background.gc +++ b/goal_src/engine/gfx/background.gc @@ -507,7 +507,7 @@ (new 'static 'rgba :r #x80 :g #x20 :b #x60 :a #x80) ) ) - #| + ;; TIE Generic (dotimes (gp-2 (-> *background-work* tie-tree-count)) (when (nonzero? (-> *background-work* tie-generic gp-2)) @@ -533,7 +533,6 @@ ) ) ) - |# ) ) diff --git a/goal_src/engine/gfx/generic/generic-effect.gc b/goal_src/engine/gfx/generic/generic-effect.gc index e2698781c5..d660c9e78c 100644 --- a/goal_src/engine/gfx/generic/generic-effect.gc +++ b/goal_src/engine/gfx/generic/generic-effect.gc @@ -104,6 +104,14 @@ ) (defun upload-vu0-program ((func vu-function) (wait-ptr pointer)) + "Upload and block until done. + Generating the DMA is highly optimized." + (none) + ) + +(defun generic-upload-vu0 () + "Start upload, but don't sync yet. + Generating the DMA chain is not as optimized." (none) ) @@ -137,11 +145,35 @@ (none) ) +(defun generic-initialize ((arg0 generic-dma-foreground-sink) (arg1 matrix) (arg2 vu-lights)) + (generic-work-init arg0) + (generic-upload-vu0) + ;;(let ((a2-1 (+ #x2e20 (the-as int #x70000000))) + (let ((a2-1 (-> (scratchpad-object terrain-context) work foreground generic-work fx-buf work consts matrix)) + (v1-1 (-> arg1 vector 0 quad)) + (a0-2 (-> arg1 vector 1 quad)) + (a1-1 (-> arg1 vector 2 quad)) + (a3-0 (-> arg1 vector 3 quad)) + ) + (set! (-> a2-1 vector 0 quad) v1-1) + (set! (-> a2-1 vector 1 quad) a0-2) + (set! (-> a2-1 vector 2 quad) a1-1) + (set! (-> a2-1 vector 3 quad) a3-0) + ) + (if arg2 + (quad-copy! (the-as pointer (-> (scratchpad-object terrain-context) work foreground generic-work fx-buf work lights)) (the-as pointer arg2) 7) + ) + 0 + (none) + ) + +(defun generic-wrapup ((arg0 generic-dma-foreground-sink)) + (set! (-> arg0 state gifbuf-adr) (-> (scratchpad-object terrain-context) work foreground generic-work saves gifbuf-adr)) + (set! (-> arg0 state inbuf-adr) (-> (scratchpad-object terrain-context) work foreground generic-work saves inbuf-adr)) + (none) + ) + (def-mips2c generic-prepare-dma-single function) - - (def-mips2c generic-prepare-dma-double function) - (def-mips2c generic-light-proc function) - (def-mips2c generic-envmap-proc function) \ No newline at end of file diff --git a/goal_src/engine/gfx/generic/generic-h.gc b/goal_src/engine/gfx/generic/generic-h.gc index dae6f0510a..33f533ab16 100644 --- a/goal_src/engine/gfx/generic/generic-h.gc +++ b/goal_src/engine/gfx/generic/generic-h.gc @@ -166,7 +166,7 @@ (gifbuf-adr uint32 :offset-assert 68) (inbuf-adr uint32 :offset-assert 72) (fade-val uint32 :offset-assert 76) - (time-of-day-color uint32 :offset-assert 80) + (time-of-day-color rgba :offset-assert 80) (to-vu0-waits uint32 :offset-assert 84) (to-spr-waits uint32 :offset-assert 88) (from-spr-waits uint32 :offset-assert 92) diff --git a/goal_src/engine/gfx/generic/generic-tie.gc b/goal_src/engine/gfx/generic/generic-tie.gc index a8360fff2f..71f3023a42 100644 --- a/goal_src/engine/gfx/generic/generic-tie.gc +++ b/goal_src/engine/gfx/generic/generic-tie.gc @@ -5,3 +5,109 @@ ;; name in dgo: generic-tie ;; dgos: GAME, ENGINE +(define *generic-tie* #t) + +(def-mips2c generic-tie-dma-to-spad-sync (function object object none)) +(def-mips2c generic-envmap-dproc function) +(def-mips2c generic-interp-dproc function) +(def-mips2c generic-no-light-dproc function) +(def-mips2c generic-tie-convert (function none)) + + +(defun generic-tie-execute ((arg0 generic-dma-foreground-sink) (arg1 dma-buffer) (arg2 basic)) + ;; (local-vars (v1-28 uint128) (v1-29 uint128) (v1-30 uint128) (a0-33 int) (a0-35 int)) + ;; (rlet ((vf1 :class vf)) + (when (logtest? *vu1-enable-user* (vu1-renderer-mask generic)) + (when *generic-tie* + (if *debug-segment* + (add-frame + (-> *display* frames (-> *display* on-screen) frame profile-bar 0) + 'draw + (new 'static 'rgba :r #x40 :b #x40 :a #x80) + ) + ) + (reset! (-> *perf-stats* data 2)) + + (when (nonzero? arg2) + (let ((s4-0 (-> arg1 base))) + (set! (-> (scratchpad-object terrain-context) work foreground generic-work saves basep) (the-as uint (-> arg1 base))) + (generic-initialize arg0 (-> *math-camera* perspective) *default-lights*) + (generic-tie-dma-to-spad-sync arg2 (-> (scratchpad-object terrain-context) work foreground generic-work in-buf tie input-a)) + ; (let ((v1-24 (+ 716 (the-as int #x70000000)))) + + ;; set up tie memory layout. + (let ((v1-24 (-> (scratchpad-object terrain-context) work foreground generic-work in-buf tie shadow))) + (set! (-> v1-24 end-of-chain) (the-as uint 0)) + (set! (-> v1-24 tie-type) 0) + (set! (-> v1-24 out-buf) *gsf-buffer*) + (set! (-> v1-24 ptr-buf) (the-as uint (+ 768 (scratchpad-object int)))) + (set! (-> v1-24 ptr-inst) (the-as uint (+ 3648 (scratchpad-object int)))) + (set! (-> v1-24 inst-xor) 4640) + (set! (-> v1-24 write-limit) (the-as uint (&+ (-> arg1 end) -65536))) + ) + ;;(let ((v1-26 (+ 748 (the-as int #x70000000)))) + (let ((v1-26 (-> (scratchpad-object terrain-context) work foreground generic-work in-buf tie shadow calls))) + (set! (-> v1-26 generic-prepare-dma-double) generic-prepare-dma-double) + (set! (-> v1-26 generic-envmap-dproc) generic-envmap-dproc) ;; todo + (set! (-> v1-26 generic-interp-dproc) generic-interp-dproc) ;; todo + (set! (-> v1-26 generic-no-light-dproc) generic-no-light-dproc) ;; todo + ) + + (set! (-> (scratchpad-object terrain-context) work foreground generic-work saves time-of-day-color r) + (the int (-> *time-of-day-context* current-sun env-color x))) + (set! (-> (scratchpad-object terrain-context) work foreground generic-work saves time-of-day-color g) + (the int (-> *time-of-day-context* current-sun env-color y))) + (set! (-> (scratchpad-object terrain-context) work foreground generic-work saves time-of-day-color b) + (the int (-> *time-of-day-context* current-sun env-color z))) + (set! (-> (scratchpad-object terrain-context) work foreground generic-work saves time-of-day-color a) + (the int (-> *time-of-day-context* current-sun env-color w))) + + ; (let ((v1-27 *time-of-day-context*)) + ; (let ((a0-26 (+ 16 (the-as int #x70000000)))) + ; (.lvf vf1 (&-> v1-27 current-sun env-color quad)) + ; (.ftoi.vf vf1 vf1) + ; (.mov v1-28 vf1) + ; (.ppach v1-29 (the-as uint128 0) v1-28) + ; (.ppacb v1-30 r0 (the-as int v1-29)) + ; (set! (-> a0-26 foreground generic-work saves time-of-day-color) (the-as uint v1-30)) + ; ) + ; ) + (generic-tie-convert) + (set! (-> arg1 base) + (the-as pointer (-> (scratchpad-object terrain-context) work foreground generic-work saves basep)) + ) + (generic-wrapup arg0) + (set! (-> (scratchpad-object terrain-context) work foreground generic-work fx-buf work consts mscal-tag) + (logior (logand (-> (scratchpad-object terrain-context) work foreground generic-work fx-buf work consts mscal-tag) + -65536 + ) + 6 + ) + ) + ; (dma-sync (the-as pointer #x1000d000) 0 0) + (let ((v1-37 *dma-mem-usage*)) + (when (nonzero? v1-37) + (set! (-> v1-37 length) (max 18 (-> v1-37 length))) + (set! (-> v1-37 data 17 name) "tie-generic") + (+! (-> v1-37 data 17 count) 1) + (+! (-> v1-37 data 17 used) (&- (-> arg1 base) (the-as uint s4-0))) + (set! (-> v1-37 data 17 total) (-> v1-37 data 17 used)) + ) + ) + ) + ) + (read! (-> *perf-stats* data 2)) + (if *debug-segment* + (add-frame + (-> *display* frames (-> *display* on-screen) frame profile-bar 0) + 'draw + (new 'static 'rgba :r #xd2 :g #xd2 :b #x50 :a #x80) + ) + ) + ) + 0 + ) + 0 + (none) + ;) + ) \ No newline at end of file diff --git a/goal_src/engine/gfx/tie/tie-methods.gc b/goal_src/engine/gfx/tie/tie-methods.gc index cb9cf0fe55..57581d93e5 100644 --- a/goal_src/engine/gfx/tie/tie-methods.gc +++ b/goal_src/engine/gfx/tie/tie-methods.gc @@ -5,6 +5,9 @@ ;; name in dgo: tie-methods ;; dgos: GAME, ENGINE +(def-mips2c draw-inline-array-instance-tie (function pointer (inline-array instance-tie) int dma-buffer none)) +(def-mips2c draw-inline-array-prototype-tie-generic-asm (function dma-buffer int prototype-array-tie none)) + (defun tie-init-buffers ((arg0 dma-buffer)) "Initialize the TIE buckets. Note: the buffer passed in here is _not_ used. @@ -296,7 +299,11 @@ ;; (let ((s4-0 (+ (-> arg0 length) -1))) ;; number of arrays of draw-nodes (depth of the BVH tree, not counting instance leaves) - ;; perform draw node culling. TODO + ;; perform draw node culling. + ;; Note: It's okay to skip this. The visible list right now will just be the occlusion string + ;; The PC renderer won't see this (and has its own version of culling that's plenty fast) + ;; The instance drawing will end up looking at too many instances, but this is fine - it + ;; should reject those, and it plenty fast. #| (when (nonzero? s4-0) (dotimes (s3-0 s4-0) @@ -363,7 +370,10 @@ (reset! (-> *perf-stats* data 9)) ;; DRAW! - ;;(draw-inline-array-instance-tie s0-0 s1-0 sv-16 s3-1) + ;; note: this is a bit wasteful because we only care about generic ties. + ;; non-generics are drawn fully in C++, but we're computing unused stuff here. + ;; This ends up being so fast it's probably not worth worrying about yet. + (with-profiler "tie-instance" (draw-inline-array-instance-tie s0-0 s1-0 sv-16 s3-1)) ;; finish perf stats (read! (-> *perf-stats* data 9)) (update-wait-stats (-> *perf-stats* data 9) (the-as uint 0) @@ -398,8 +408,10 @@ (set! (-> *prototype-tie-work* generic-wait-from-spr) (the-as uint 0)) (set! (-> *instance-tie-work* first-generic-prototype) (the-as uint (-> s3-1 base))) + ;; hack, I expect this to overwrite this. + (set! (-> (the (pointer uint64) (-> s3-1 base))) #xdeadbeefdeadbeef) (reset! (-> *perf-stats* data 10)) - ;;(draw-inline-array-prototype-tie-generic-asm s3-1 s5-1 s4-1) + (with-profiler "tie-generic-protos" (draw-inline-array-prototype-tie-generic-asm s3-1 s5-1 s4-1)) (read! (-> *perf-stats* data 10)) (update-wait-stats (-> *perf-stats* data 10) (the-as uint 0) (-> *prototype-tie-work* generic-wait-to-spr) diff --git a/goal_src/engine/level/level.gc b/goal_src/engine/level/level.gc index 95757856b8..a446c54faa 100644 --- a/goal_src/engine/level/level.gc +++ b/goal_src/engine/level/level.gc @@ -755,6 +755,16 @@ (when (< current-login-pos (-> s1-2 length)) (set! sv-16 (-> s1-2 array-data (the-as uint current-login-pos))) (set! sv-32 0) + (when (!= (-> sv-16 envmap-fade-far) 0.0) + (format 0 "proto: ~A: ~f ~f~%" (-> sv-16 name) (-> sv-16 envmap-rfade) (-> sv-16 envmap-fade-far)) + (format 0 " d: ~`vector`P~%" (-> sv-16 dists)) + (format 0 " d: ~`vector`P~%" (-> sv-16 rdists)) + ;(set! (-> sv-16 dists x) 1.) + ;(set! (-> sv-16 dists y) 100000000.) + (*! (-> sv-16 envmap-fade-far) 10000.) + + ) + (while (< sv-32 4) (let ((a0-28 (-> sv-16 geometry sv-32))) ;;(load-dbg " login geom: ~A~%" a0-28) diff --git a/goal_src/kernel/gkernel.gc b/goal_src/kernel/gkernel.gc index 2d5cbf47ac..59a04aeaea 100644 --- a/goal_src/kernel/gkernel.gc +++ b/goal_src/kernel/gkernel.gc @@ -121,9 +121,9 @@ (PC_PORT ;; make sure the scratchpad is 16kb aligned, and make it 32 kB so we can big stacks on it. - (let* ((mem (new 'global 'array 'uint8 (* (+ 16 32) 1024))) + (let* ((mem (new 'global 'array 'uint8 (* 128 1024))) ) - (define *fake-scratchpad-data* (the pointer (align-n mem (* 16 1024)))) + (define *fake-scratchpad-data* (the pointer (align-n mem (* 64 1024)))) ) ;; We will move stacks on the scratchpad to here. diff --git a/test/decompiler/reference/engine/gfx/generic/generic-h_REF.gc b/test/decompiler/reference/engine/gfx/generic/generic-h_REF.gc index cf50dc7962..b3ce6e59fc 100644 --- a/test/decompiler/reference/engine/gfx/generic/generic-h_REF.gc +++ b/test/decompiler/reference/engine/gfx/generic/generic-h_REF.gc @@ -281,7 +281,7 @@ (gifbuf-adr uint32 :offset-assert 68) (inbuf-adr uint32 :offset-assert 72) (fade-val uint32 :offset-assert 76) - (time-of-day-color uint32 :offset-assert 80) + (time-of-day-color rgba :offset-assert 80) (to-vu0-waits uint32 :offset-assert 84) (to-spr-waits uint32 :offset-assert 88) (from-spr-waits uint32 :offset-assert 92) diff --git a/test/decompiler/reference/engine/gfx/tie/tie-methods_REF.gc b/test/decompiler/reference/engine/gfx/tie/tie-methods_REF.gc index 05364a1195..4f20b69213 100644 --- a/test/decompiler/reference/engine/gfx/tie/tie-methods_REF.gc +++ b/test/decompiler/reference/engine/gfx/tie/tie-methods_REF.gc @@ -391,7 +391,7 @@ (let ((t9-2 draw-inline-array-instance-tie) (a3-1 s3-1) ) - (t9-2 s0-0 (the-as drawable s1-0) sv-16 a3-1) + (t9-2 s0-0 s1-0 sv-16 a3-1) ) (let ((v1-35 (-> *perf-stats* data 9))) (b! (zero? (-> v1-35 ctrl)) cfg-14 :delay (nop!))