[decompiler] Working toward bsp (#717)

* clean up

* before int to float stuff

* before trying to eliminate the separate read and write maps

* partial fix for register issues

* add missing include
This commit is contained in:
water111
2021-07-25 15:30:37 -04:00
committed by GitHub
parent 38c97481e7
commit 2b6684aa5c
76 changed files with 5695 additions and 514 deletions
+26
View File
@@ -304,4 +304,30 @@ bool Arguments::only_contains_named(const std::unordered_set<std::string>& names
return true;
}
namespace {
std::string escape_string(const std::string& in) {
std::string result;
result.reserve(in.size());
for (char c : in) {
if (c == '"') {
result.push_back('\\');
result.push_back('"');
} else {
result.push_back(c);
}
}
return result;
}
} // namespace
std::string StringObject::print() const {
return "\"" + escape_string(data) + "\"";
}
std::string StringObject::inspect() const {
return "[string] \"" + escape_string(data) + "\"\n";
}
} // namespace goos
+2 -3
View File
@@ -416,9 +416,8 @@ class StringObject : public HeapObject {
return obj;
}
std::string print() const override { return "\"" + data + "\""; }
std::string inspect() const override { return "[string] \"" + data + "\"\n"; }
std::string print() const override;
std::string inspect() const override;
~StringObject() override = default;
};
+76 -4
View File
@@ -1,6 +1,7 @@
#include "common/util/assert.h"
#include <algorithm>
#include <stdexcept>
#include <optional>
#include "common/common_types.h"
#include "InstructionParser.h"
@@ -46,14 +47,24 @@ InstructionParser::InstructionParser() {
InstructionKind::MFLO1, InstructionKind::SYNCL, InstructionKind::PCPYUD,
InstructionKind::PEXTUW, InstructionKind::POR, InstructionKind::VMOVE,
InstructionKind::VSUB, InstructionKind::LQC2, InstructionKind::SQC2,
InstructionKind::MULAS, InstructionKind::MADDAS}) {
InstructionKind::MULAS, InstructionKind::MADDAS, InstructionKind::QMTC2,
InstructionKind::QMFC2, InstructionKind::VITOF0, InstructionKind::VFTOI0,
InstructionKind::PSLLW, InstructionKind::PSRAW}) {
auto& info = gOpcodeInfo[int(i)];
if (info.defined) {
m_opcode_name_lookup[info.name] = int(i);
added++;
}
}
assert(added == int(m_opcode_name_lookup.size()));
for (auto i : {InstructionKind::VMUL_BC}) {
auto& info = gOpcodeInfo[int(i)];
if (info.defined) {
m_opcode_name_broadcast_lookup[info.name] = int(i);
added++;
}
}
assert(added == int(m_opcode_name_lookup.size()) + int(m_opcode_name_broadcast_lookup.size()));
}
namespace {
@@ -89,6 +100,18 @@ std::string get_instr_name(std::string& instr) {
}
}
auto name = instr.substr(0, i);
// qmXc2.i should not grab the i.
if (name == "qmtc2.i") {
name = "qmtc2"; // strip .i
i -= 2; // leave the i for the next step.
}
if (name == "qmfc2.i") {
name = "qmfc2"; // strip .i
i -= 2; // leave the i for the next step.
}
if (i == instr.length()) {
instr.clear();
} else {
@@ -220,14 +243,34 @@ Instruction InstructionParser::parse_single_instruction(
std::string str,
const std::vector<DecompilerLabel>& labels) {
auto name = get_instr_name(str);
std::optional<int> op_idx;
auto lookup = m_opcode_name_lookup.find(name);
if (lookup == m_opcode_name_lookup.end()) {
// it might be a VU with broadcast.
if (!name.empty() && name.front() == 'v') {
char last_char = name.back();
if (last_char == 'x' || last_char == 'y' || last_char == 'z' || last_char == 'w') {
str.insert(str.begin(), ' ');
str.insert(str.begin(), last_char);
name.pop_back();
auto bc_lookup = m_opcode_name_broadcast_lookup.find(name);
if (bc_lookup != m_opcode_name_broadcast_lookup.end()) {
op_idx = bc_lookup->second;
}
}
}
} else {
op_idx = lookup->second;
}
if (!op_idx) {
throw std::runtime_error("InstructionParser cannot handle opcode " + name);
}
Instruction instr;
instr.kind = InstructionKind(lookup->second);
auto& info = gOpcodeInfo[lookup->second];
instr.kind = InstructionKind(*op_idx);
auto& info = gOpcodeInfo[*op_idx];
for (u8 i = 0; i < info.step_count; i++) {
auto& step = info.steps[i];
switch (step.decode) {
@@ -333,7 +376,36 @@ Instruction InstructionParser::parse_single_instruction(
break;
}
case DecodeType::IL: {
auto thing = get_until_space(str);
if (thing == "i") {
instr.il = 1;
} else if (thing == "ni") {
instr.il = 0;
} else {
printf("Bad interlock specification. Got %s\n", thing.c_str());
assert(false);
}
} break;
case DecodeType::BC: {
auto thing = get_until_space(str);
if (thing == "x") {
instr.cop2_bc = 0;
} else if (thing == "y") {
instr.cop2_bc = 1;
} else if (thing == "z") {
instr.cop2_bc = 2;
} else if (thing == "w") {
instr.cop2_bc = 3;
} else {
printf("Bad broadcast. Got %s\n", thing.c_str());
assert(false);
}
} break;
default:
printf("missing DecodeType: %d\n", (int)step.decode);
assert(false);
}
}
+1
View File
@@ -26,5 +26,6 @@ class InstructionParser {
private:
std::unordered_map<std::string, int> m_opcode_name_lookup;
std::unordered_map<std::string, int> m_opcode_name_broadcast_lookup;
};
} // namespace decompiler
+56 -48
View File
@@ -253,16 +253,16 @@ void init_opcode_info() {
.dst(FT::RD, DT::COP0); // Move to System Control Coprocessor
def(IK::MFC0, "mfc0")
.dst_gpr(FT::RT)
.src(FT::RD, DT::COP0); // Move from System Control Coprocessor
def(IK::MTDAB, "mtdab").src_gpr(FT::RT); // Move to Data Address Breakpoint Register
def(IK::MTDABM, "mtdabm").src_gpr(FT::RT); // Move to Data Address Breakpoint Mask Register
drd(def(IK::MFHI, "mfhi")); // Move from HI Register
drd(def(IK::MFLO, "mflo")); // Move from LO Register
def(IK::MTLO1, "mtlo1").src_gpr(FT::RS); // Move to LO1 Register
drd(def(IK::MFLO1, "mflo1")); // Move from LO1 Register
drd(def(IK::PMFHL_UW, "pmfhl.uw")); // Parallel Move From HI/LO Register
drd(def(IK::PMFHL_LW, "pmfhl.lw"));
drd(def(IK::PMFHL_LH, "pmfhl.lh"));
.src(FT::RD, DT::COP0); // Move from System Control Coprocessor
def(IK::MTDAB, "mtdab").src_gpr(FT::RT); // Move to Data Address Breakpoint Register
def(IK::MTDABM, "mtdabm").src_gpr(FT::RT); // Move to Data Address Breakpoint Mask Register
drd(def(IK::MFHI, "mfhi")); // Move from HI Register
drd(def(IK::MFLO, "mflo")); // Move from LO Register
def(IK::MTLO1, "mtlo1").src_gpr(FT::RS); // Move to LO1 Register
drd(def(IK::MFLO1, "mflo1")); // Move from LO1 Register
drd(def(IK::PMFHL_UW, "pmfhl.uw").gpr128()); // Parallel Move From HI/LO Register
drd(def(IK::PMFHL_LW, "pmfhl.lw").gpr128());
drd(def(IK::PMFHL_LH, "pmfhl.lh").gpr128());
def(IK::MFPC, "mfpc").dst_gpr(FT::RT).src(FT::PCR, DT::PCR); // Move from Performance Counter
def(IK::MTPC, "mtpc").src_gpr(FT::RT).dst(FT::PCR, DT::PCR); // Move to Performance Counter
@@ -279,45 +279,48 @@ void init_opcode_info() {
def(IK::ERET, "eret"); // Exception Return
def(IK::EI, "ei"); // Enable Interrupt
drd_srs_srt(def(IK::PPACB, "ppacb")); // Parallel Pack to Byte
drd_srs_srt(def(IK::PPACH, "ppach")); // Parallel Pack to Halfword
drd_srs_srt(def(IK::PPACW, "ppacw")); // Parallel Pack to Word
drd_srs_srt(def(IK::PADDH, "paddh")); // Parallel Add Halfword
drd_srs_srt(def(IK::PADDW, "paddw")); // Parallel Add Word
drd_srs_srt(def(IK::PSUBW, "psubw")); // Parallel Subtract Word
drd_srs_srt(def(IK::PMINH, "pminh")); // Parallel Minimize Halfword
drd_srs_srt(def(IK::PMINW, "pminw")); // Parallel Minimize Word
drd_srs_srt(def(IK::PMAXH, "pmaxh")); // Parallel Maximize Halfword
drd_srs_srt(def(IK::PMAXW, "pmaxw")); // Parallel Maximize Word
drd_srs_srt(def(IK::PEXTLB, "pextlb")); // Parallel Extend Lower from Byte
drd_srs_srt(def(IK::PEXTLH, "pextlh")); // Parallel Extend Lower from Halfword
drd_srs_srt(def(IK::PEXTLW, "pextlw")); // Parallel Extend Lower from Word
drd_srs_srt(def(IK::PCGTW, "pcgtw")); // Parallel Compare for Greater Than Word
drd_srs_srt(def(IK::PCEQB, "pceqb")); // Parallel Compare for Equal Byte
drd_srs_srt(def(IK::PCEQW, "pceqw")); // Parallel Compare for Equal Word
drd_srs_srt(def(IK::PEXTUB, "pextub")); // Parallel Extend Upper from Byte
drd_srs_srt(def(IK::PEXTUH, "pextuh")); // Parallel Extend Upper from Halfword
drd_srs_srt(def(IK::PEXTUW, "pextuw")); // Parallel Extend Upper from Word
drd_srs_srt(def(IK::PCPYUD, "pcpyud")); // Parallel Copy Upper Doubleword
drd_srs_srt(def(IK::PCPYLD, "pcpyld")); // Parallel Copy Lower Doubleword
drd_srs_srt(def(IK::PMADDH, "pmaddh")); // Parallel Multiply-Add Halfword
drd_srs_srt(def(IK::PMULTH, "pmulth")); // Parallel Multiply Halfword
drd_srs_srt(def(IK::PEXEW, "pexew")); // Parallel Exchange Even Word
drd_srs_srt(def(IK::PINTEH, "pinteh")); // Parallel Interleave Even Halfword
drd_srs_srt(def(IK::PAND, "pand")); // Parallel And
drd_srs_srt(def(IK::POR, "por")); // Parallel Or
drd_srs_srt(def(IK::PNOR, "pnor")); // Parallel Not Or
drd_srs_srt(def(IK::PPACB, "ppacb").gpr128()); // Parallel Pack to Byte
drd_srs_srt(def(IK::PPACH, "ppach").gpr128()); // Parallel Pack to Halfword
drd_srs_srt(def(IK::PPACW, "ppacw").gpr128()); // Parallel Pack to Word
drd_srs_srt(def(IK::PADDH, "paddh").gpr128()); // Parallel Add Halfword
drd_srs_srt(def(IK::PADDW, "paddw").gpr128()); // Parallel Add Word
drd_srs_srt(def(IK::PSUBW, "psubw").gpr128()); // Parallel Subtract Word
drd_srs_srt(def(IK::PMINH, "pminh").gpr128()); // Parallel Minimize Halfword
drd_srs_srt(def(IK::PMINW, "pminw").gpr128()); // Parallel Minimize Word
drd_srs_srt(def(IK::PMAXH, "pmaxh").gpr128()); // Parallel Maximize Halfword
drd_srs_srt(def(IK::PMAXW, "pmaxw").gpr128()); // Parallel Maximize Word
drd_srs_srt(def(IK::PEXTLB, "pextlb").gpr128()); // Parallel Extend Lower from Byte
drd_srs_srt(def(IK::PEXTLH, "pextlh").gpr128()); // Parallel Extend Lower from Halfword
drd_srs_srt(def(IK::PEXTLW, "pextlw").gpr128()); // Parallel Extend Lower from Word
drd_srs_srt(def(IK::PCGTW, "pcgtw").gpr128()); // Parallel Compare for Greater Than Word
drd_srs_srt(def(IK::PCEQB, "pceqb").gpr128()); // Parallel Compare for Equal Byte
drd_srs_srt(def(IK::PCEQW, "pceqw").gpr128()); // Parallel Compare for Equal Word
drd_srs_srt(def(IK::PEXTUB, "pextub").gpr128()); // Parallel Extend Upper from Byte
drd_srs_srt(def(IK::PEXTUH, "pextuh").gpr128()); // Parallel Extend Upper from Halfword
drd_srs_srt(def(IK::PEXTUW, "pextuw").gpr128()); // Parallel Extend Upper from Word
drd_srs_srt(def(IK::PCPYUD, "pcpyud").gpr128()); // Parallel Copy Upper Doubleword
drd_srs_srt(def(IK::PCPYLD, "pcpyld").gpr128()); // Parallel Copy Lower Doubleword
drd_srs_srt(def(IK::PMADDH, "pmaddh").gpr128()); // Parallel Multiply-Add Halfword
drd_srs_srt(def(IK::PMULTH, "pmulth").gpr128()); // Parallel Multiply Halfword
drd_srs_srt(def(IK::PEXEW, "pexew").gpr128()); // Parallel Exchange Even Word
drd_srs_srt(def(IK::PINTEH, "pinteh").gpr128()); // Parallel Interleave Even Halfword
drd_srs_srt(def(IK::PAND, "pand").gpr128()); // Parallel And
drd_srs_srt(def(IK::POR, "por").gpr128()); // Parallel Or
drd_srs_srt(def(IK::PNOR, "pnor").gpr128()); // Parallel Not Or
drd_srt_ssa(def(IK::PSLLW, "psllw")); // Parallel Shift Left Logical Word
drd_srt_ssa(def(IK::PSLLH, "psllh")); // Parallel Shift Left Logical Halfword
drd_srt_ssa(def(IK::PSRAW, "psraw")); // Parallel Shift Right Arithmetic Word
drd_srt_ssa(def(IK::PSRAH, "psrah")); // Parallel Shift Right Arithmetic Halfword
drd_srt_ssa(def(IK::PSRLH, "psrlh")); // Parallel Shift Right Logical Halfword
drd_srt_ssa(def(IK::PSLLW, "psllw").gpr128()); // Parallel Shift Left Logical Word
drd_srt_ssa(def(IK::PSLLH, "psllh").gpr128()); // Parallel Shift Left Logical Halfword
drd_srt_ssa(def(IK::PSRAW, "psraw").gpr128()); // Parallel Shift Right Arithmetic Word
drd_srt_ssa(def(IK::PSRAH, "psrah").gpr128()); // Parallel Shift Right Arithmetic Halfword
drd_srt_ssa(def(IK::PSRLH, "psrlh").gpr128()); // Parallel Shift Right Logical Halfword
def(IK::PLZCW, "plzcw").dst_gpr(FT::RD).src_gpr(FT::RS); // Parallel Leading Zero Count Word
def(IK::PABSW, "pabsw").dst_gpr(FT::RD).src_gpr(FT::RT); // Parallel Absolute Word
def(IK::PROT3W, "prot3w").dst_gpr(FT::RD).src_gpr(FT::RT); // Parallel Rotate 3 Word
def(IK::PCPYH, "pcpyh").dst_gpr(FT::RD).src_gpr(FT::RT); // Parallel Copy Halfword
def(IK::PLZCW, "plzcw")
.dst_gpr(FT::RD)
.src_gpr(FT::RS)
.gpr128(); // Parallel Leading Zero Count Word
def(IK::PABSW, "pabsw").dst_gpr(FT::RD).src_gpr(FT::RT).gpr128(); // Parallel Absolute Word
def(IK::PROT3W, "prot3w").dst_gpr(FT::RD).src_gpr(FT::RT).gpr128(); // Parallel Rotate 3 Word
def(IK::PCPYH, "pcpyh").dst_gpr(FT::RD).src_gpr(FT::RT).gpr128(); // Parallel Copy Halfword
// COP1
@@ -436,7 +439,7 @@ void init_opcode_info() {
def(IK::VIADDI, "viaddi").dst_vi(FT::FT).src_vi(FT::FS).src(FT::IMM5, DT::IMM);
def(IK::QMFC2, "qmfc2").src(FT::IL, DT::IL).dst_gpr(FT::RT).src_vf(FT::FS);
def(IK::QMTC2, "qmtc2").src(FT::IL, DT::IL).src_gpr(FT::RT).dst_vf(FT::FS);
def(IK::QMTC2, "qmtc2").src(FT::IL, DT::IL).dst_vf(FT::FS).src_gpr(FT::RT);
def(IK::VSQRT, "vsqrt").dst(FT::ZERO, DT::VU_Q).src_vf(FT::FT).src(FT::FT_F, DT::VF_F);
def(IK::VRXOR, "vrxor").src(FT::BC, DT::BC).src_vf(FT::FS);
def(IK::VRNEXT, "vrnext").src(FT::DEST, DT::DEST).dst_vf(FT::FT);
@@ -518,4 +521,9 @@ OpcodeInfo& OpcodeInfo::dst_vf(FieldType field) {
OpcodeInfo& OpcodeInfo::dst_vi(FieldType field) {
return dst(field, DT::VI);
}
OpcodeInfo& OpcodeInfo::gpr128() {
gpr_128 = true;
return *this;
}
} // namespace decompiler
+3
View File
@@ -335,6 +335,7 @@ struct OpcodeInfo {
bool is_store = false;
bool is_load = false;
bool has_delay_slot = false;
bool gpr_128 = false; // does it requires 128-bit registers?
void step(DecodeStep& s);
@@ -350,6 +351,8 @@ struct OpcodeInfo {
OpcodeInfo& dst_vf(FieldType field);
OpcodeInfo& dst_vi(FieldType field);
OpcodeInfo& gpr128();
uint8_t step_count = 0;
DecodeStep steps[MAX_DECODE_STEPS];
};
+5 -1
View File
@@ -538,6 +538,10 @@ bool ControlFlowGraph::is_until_loop(CfgVtx* b1, CfgVtx* b2) {
if (!b1 || !b2)
return false;
if (b2->end_branch.asm_branch) {
return false;
}
// check next and prev
if (b1->next != b2)
return false;
@@ -790,7 +794,7 @@ bool ControlFlowGraph::find_until1_loop() {
bool found = false;
for_each_top_level_vtx([&](CfgVtx* vtx) {
if (vtx->succ_branch == vtx && vtx->succ_ft) {
if (vtx->succ_branch == vtx && vtx->succ_ft && !vtx->end_branch.asm_branch) {
auto loop = alloc<UntilLoop_single>();
loop->block = vtx;
loop->pred = vtx->pred;
+4 -13
View File
@@ -117,6 +117,10 @@ goos::Object Env::get_variable_name_with_cast(const RegisterAccess& access) cons
}
}
std::string Env::get_variable_name(const RegisterAccess& access) const {
return get_variable_and_cast(access).name;
}
VariableWithCast Env::get_variable_and_cast(const RegisterAccess& access) const {
if (access.reg().get_kind() == Reg::FPR || access.reg().get_kind() == Reg::GPR) {
auto& var_info = m_var_names.lookup(access.reg(), access.idx(), access.mode());
@@ -250,19 +254,6 @@ std::optional<TypeSpec> Env::get_user_cast_for_access(const RegisterAccess& acce
return {};
}
std::string Env::get_variable_name(const RegisterAccess& access) const {
if (access.reg().get_kind() == Reg::FPR || access.reg().get_kind() == Reg::GPR) {
std::string lookup_name = m_var_names.lookup(access.reg(), access.idx(), access.mode()).name();
auto remapped = m_var_remap.find(lookup_name);
if (remapped != m_var_remap.end()) {
lookup_name = remapped->second;
}
return lookup_name;
} else {
throw std::runtime_error("Cannot store a variable in this reg");
}
}
/*!
* Get the type of the variable currently in the register.
* NOTE: this is _NOT_ the most specific type known to the decompiler, but instead the type
+7 -4
View File
@@ -583,7 +583,7 @@ void SimpleExpressionElement::update_from_stack_gpr_to_fpr(const Env& env,
// set ourself to identity.
m_expr = src.as_expr();
if (src_type.typespec() == TypeSpec("float")) {
if (env.dts->ts.tc(TypeSpec("float"), src_type.typespec())) {
// got a float as an input, we can convert it to an FPR with no effect.
for (auto x : src_fes) {
result->push_back(x);
@@ -884,7 +884,7 @@ void SimpleExpressionElement::update_from_stack_add_i(const Env& env,
result->push_back(pool.alloc_element<DerefElement>(args.at(0), rd_ok.addr_of, tokens));
return;
} else {
throw std::runtime_error("Failed to match product_with_constant inline array access.");
throw std::runtime_error("Failed to match product_with_constant inline array access 1.");
}
}
} else if (arg0_type.kind == TP_Type::Kind::PRODUCT_WITH_CONSTANT &&
@@ -914,7 +914,9 @@ void SimpleExpressionElement::update_from_stack_add_i(const Env& env,
{Matcher::op(GenericOpMatcher::fixed(FixedOperatorKind::MULTIPLICATION),
{Matcher::any(0), Matcher::integer(rd_in.stride)}),
Matcher::op(GenericOpMatcher::fixed(FixedOperatorKind::MULTIPLICATION),
{Matcher::integer(rd_in.stride), Matcher::any(0)})});
{Matcher::match_or({Matcher::cast("uint", Matcher::integer(rd_in.stride)),
Matcher::integer(rd_in.stride)}),
Matcher::any(0)})});
auto match_result = match(arg0_matcher, args.at(0));
if (match_result.matched) {
bool used_index = false;
@@ -932,7 +934,8 @@ void SimpleExpressionElement::update_from_stack_add_i(const Env& env,
result->push_back(pool.alloc_element<DerefElement>(args.at(1), rd_ok.addr_of, tokens));
return;
} else {
throw std::runtime_error("Failed to match product_with_constant inline array access.");
lg::error("Bad is {}\n", args.at(0)->to_string(env));
throw std::runtime_error("Failed to match product_with_constant inline array access 2.");
}
}
}
+5 -1
View File
@@ -12,6 +12,10 @@ const std::map<InstructionKind, OpenGOALAsm::Function> MIPS_ASM_TO_OPEN_GOAL_FUN
{InstructionKind::PSRAW, {".pw.sra", {}}},
{InstructionKind::PSUBW, {".psubw", {}}},
{InstructionKind::POR, {".por", {}}},
{InstructionKind::PNOR, {".pnor", {}}},
{InstructionKind::PAND, {".pand", {}}},
{InstructionKind::PEXTUW, {".pextuw", {}}},
{InstructionKind::PEXTLW, {".pextlw", {}}},
{InstructionKind::PCPYLD, {".pcpyld", {}}},
@@ -174,7 +178,7 @@ std::vector<goos::Object> OpenGOALAsm::get_args(const std::vector<DecompilerLabe
if (v.has_value()) {
// Normal register / constant args
args.push_back(v.value().to_form(env));
args.push_back(v.value().to_form(env, RegisterAccess::Print::AS_VARIABLE_NO_CAST));
} else if (atom.kind == InstructionAtom::AtomKind::VF_FIELD) {
// Handle FTF/FSF operations
if (func.allows_modifier(MOD::FTF) && func.allows_modifier(MOD::FSF)) {
+2 -1
View File
@@ -541,7 +541,8 @@ std::unique_ptr<AtomicOp> convert_mfc1_1(const Instruction& i0, int idx) {
}
std::unique_ptr<AtomicOp> convert_lw_1(const Instruction& i0, int idx) {
if (i0.get_dst(0).is_reg(rra()) || i0.get_dst(0).is_reg(make_gpr(Reg::AT))) {
if (i0.get_dst(0).is_reg(rra()) ||
(i0.get_dst(0).is_reg(make_gpr(Reg::AT)) && !i0.get_src(1).is_reg(rs7()))) {
return std::make_unique<AsmOp>(i0, idx);
}
if (i0.get_dst(0).is_reg(rr0()) && i0.get_src(0).is_imm(2) && i0.get_src(1).is_reg(rr0())) {
+100
View File
@@ -916,6 +916,104 @@ std::unordered_map<RegId, UseDefInfo, RegId::hash> SSA::get_use_def_info(
return result;
}
namespace {
VariableNames::VarInfo* try_lookup_read(VariableNames* in, RegId var_id) {
auto kv = in->read_vars.find(var_id.reg);
if (kv != in->read_vars.end()) {
if ((int)kv->second.size() > var_id.id) {
auto& entry = kv->second.at(var_id.id);
if (entry.initialized) {
return &entry;
}
}
}
return nullptr;
}
VariableNames::VarInfo* try_lookup_write(VariableNames* in, RegId var_id) {
auto kv = in->write_vars.find(var_id.reg);
if (kv != in->write_vars.end()) {
if ((int)kv->second.size() > var_id.id) {
auto& entry = kv->second.at(var_id.id);
if (entry.initialized) {
return &entry;
}
}
}
return nullptr;
}
bool is_128bit(const TP_Type& type, const DecompilerTypeSystem& dts) {
if (dts.ts.tc(TypeSpec("uint128"), type.typespec())) {
return true;
}
if (dts.ts.tc(TypeSpec("int128"), type.typespec())) {
return true;
}
if (type.kind == TP_Type::Kind::PCPYUD_BITFIELD) {
return true;
}
if (type.kind == TP_Type::Kind::PCPYUD_BITFIELD_AND) {
return true;
}
return false;
}
void promote_register_class(const Function& func,
VariableNames* result,
const DecompilerTypeSystem& dts) {
enum class PromotionType { PROMOTE_64, PROMOTE_128 };
std::unordered_map<RegId, PromotionType, RegId::hash> promote_map;
// here we loop through ops and find cases where we need to adjust types.
auto& ao = func.ir2.atomic_ops;
for (size_t op_idx = 0; op_idx < ao->ops.size() - 1; op_idx++) {
auto* op = ao->ops.at(op_idx).get();
auto op_as_asm = dynamic_cast<AsmOp*>(op);
if (op_as_asm) {
auto& instr = op_as_asm->instruction();
if (gOpcodeInfo[(int)instr.kind].gpr_128) {
for (auto& reg : op_as_asm->write_regs()) {
if (reg.get_kind() == Reg::GPR) {
auto& info = result->lookup(reg, op_idx, AccessMode::WRITE);
promote_map[info.reg_id] = PromotionType::PROMOTE_128;
}
}
for (auto& reg : op_as_asm->read_regs()) {
if (reg.get_kind() == Reg::GPR) {
auto& info = result->lookup(reg, op_idx, AccessMode::READ);
promote_map[info.reg_id] = PromotionType::PROMOTE_128;
}
}
}
}
}
for (const auto& promotion : promote_map) {
// fmt::print("Promote {} to {}\n", promotion.first.print(), "uint128");
// first reads:
auto read_info = try_lookup_read(result, promotion.first);
auto write_info = try_lookup_write(result, promotion.first);
assert(read_info || write_info);
if (read_info && !is_128bit(read_info->type, dts)) {
read_info->type = TP_Type::make_from_ts("uint128");
}
if (write_info && !is_128bit(write_info->type, dts)) {
write_info->type = TP_Type::make_from_ts("uint128");
}
}
}
} // namespace
std::optional<VariableNames> run_variable_renaming(const Function& function,
const RegUsageInfo& rui,
const FunctionAtomicOps& ops,
@@ -1001,6 +1099,8 @@ std::optional<VariableNames> run_variable_renaming(const Function& function,
//
auto result = ssa.get_vars();
result.use_def_info = ssa.get_use_def_info(ssa_mapping);
promote_register_class(function, &result, dts);
return result;
} else {
return std::nullopt;
+199 -160
View File
@@ -118,7 +118,7 @@
;; - Unknowns
;;(define-extern quad-copy! UNKNOWN)
(define-extern quad-copy! (function pointer pointer int none))
;; ----------------------
@@ -531,6 +531,7 @@
;; merc1 61
;; generic1 62
(bucket-65 65)
(sprite 66)
;; debug spheres? 67
(debug-draw0 67)
;; debug text 68
@@ -1837,8 +1838,8 @@
:size-assert #x28
:flag-assert #xb00000028
(:methods
(TODO-RENAME-HUGE-9 (_type_ vector) none 9)
(TODO-RENAME-10 (_type_ vector vector) float 10)
(debug-draw (_type_ vector) none 9)
(ray-capsule-intersect (_type_ vector vector) float 10)
)
)
@@ -1852,8 +1853,8 @@
:size-assert #x28
:flag-assert #xb00000028
(:methods
(TODO-RENAME-HUGE-9 (_type_ vector) none 9)
(TODO-RENAME-10 (_type_ vector vector) float 10)
(debug-draw (_type_ vector) none 9)
(ray-flat-cyl-intersect (_type_ vector vector) float 10)
)
)
@@ -4897,7 +4898,7 @@
(declare-type entity-links structure)
(deftype level-group (basic)
((length int32 :offset-assert 4)
(log-in-level level :offset-assert 8)
(log-in-level-bsp bsp-header :offset-assert 8)
(loading-level level :offset-assert 12)
(entity-link entity-links :offset-assert 16) ;; not sure what's going on here
(border? basic :offset-assert 20)
@@ -5846,12 +5847,12 @@
:flag-assert #x1200000020
(:methods
(login (_type_) _type_ 9) ;; probably login or init.
(draw (_type_ drawable display-frame) int 10) ;; display-frame is from the method inspect tool
(dummy-11 (_type_ int) none 11) ; int - length
(dummy-12 (_type_ int) none 12) ; int - length
(dummy-13 (_type_ int) none 13) ; int - length
(dummy-14 () none 14)
(dummy-15 (_type_) none 15)
(draw (_type_ drawable display-frame) none 10) ;; display-frame is from the method inspect tool
(dummy-11 (_type_ int object) none 11) ; int - length, collision related
(dummy-12 (_type_ int object) none 12) ; int - length, collision related
(dummy-13 (_type_ int object) none 13) ; int - length, collision related
(dummy-14 (_type_) none 14)
(dummy-15 (_type_ object object) none 15) ;; something debugging
(dummy-16 (_type_ object object) object 16)
(dummy-17 (_type_ sphere int ambient-list) none 17)
)
@@ -11529,12 +11530,13 @@
(to-spr-waits uint32 :offset-assert 44)
(from-spr-waits uint32 :offset-assert 48)
)
:pack-me
:method-count-assert 14
:size-assert #x34
:flag-assert #xe00000034
(:methods
(dummy-9 (_type_) none 9)
(dummy-10 (_type_) none 10)
(print-to-stream (_type_ string basic) none 10)
(reset! (_type_) none 11)
(read! (_type_) none 12)
(update-wait-stats (_type_ uint uint uint) none 13)
@@ -11579,9 +11581,9 @@
(pat pointer :offset-assert 44)
(pat-length int32 :offset-assert 48)
;; not sure what this is
(unk-data-0 pointer :offset-assert 52)
(unk-data-0-len int32 :offset-assert 56)
;; some osrt of texture remapping info
(texture-remap-table (pointer uint64) :offset-assert 52)
(texture-remap-table-len int32 :offset-assert 56)
(unk-data-1 pointer :offset-assert 60)
(unk-data-1-len int32 :offset-assert 64)
@@ -11596,10 +11598,11 @@
(nodes (inline-array bsp-node) :offset-assert 120)
(level level :offset-assert 124)
(unk-data-2 uint32 5 :offset-assert 128)
(current-leaf-idx uint16 :offset-assert 128)
(unk-data-2 uint16 9 :offset-assert 130)
(boxes box8s-array :offset-assert 148)
(unk-data-3 uint32 :offset-assert 152)
(current-bsp-back-flags uint32 :offset-assert 152)
(ambients drawable-inline-array-ambient :offset-assert 156)
(unk-data-4 float :offset-assert 160)
(unk-data-5 float :offset-assert 164)
@@ -12589,7 +12592,7 @@
(far float 4 :offset-assert 60)
)
(:methods
(new (symbol type float float) _type_)
(new (symbol type meters meters) _type_)
)
:method-count-assert 9
:size-assert #x4c
@@ -12959,9 +12962,9 @@
;; - Types
(deftype sprite-vec-data-2d (structure)
((x-y-z-sx vector :inline :offset-assert 0)
(flag-rot-sy vector :inline :offset-assert 16)
(r-g-b-a vector :inline :offset-assert 32)
((x-y-z-sx vector :inline :offset-assert 0 :score -10)
(flag-rot-sy vector :inline :offset-assert 16 :score -10)
(r-g-b-a vector :inline :offset-assert 32 :score -10)
(x float :offset 0)
(y float :offset 4)
(z float :offset 8)
@@ -12986,13 +12989,16 @@
)
(deftype sprite-array-2d (basic)
((num-sprites uint32 2 :offset-assert 4)
(num-valid uint32 2 :offset-assert 12)
((num-sprites int32 2 :offset-assert 4)
(num-valid int32 2 :offset-assert 12)
(vec-data uint32 :offset-assert 20)
(adgif-data uint32 :offset-assert 24)
(pad uint128 4 :offset-assert 32)
(data uint128 1 :offset-assert 96)
)
(:methods
(new (symbol type int int) _type_ 0)
)
:method-count-assert 9
:size-assert #x70
:flag-assert #x900000070
@@ -13025,12 +13031,15 @@
)
(deftype sprite-array-3d (basic)
((num-sprites uint32 2 :offset-assert 4)
(num-valid uint32 2 :offset-assert 12)
((num-sprites int32 2 :offset-assert 4)
(num-valid int32 2 :offset-assert 12)
(vec-data uint32 :offset-assert 20)
(adgif-data uint32 :offset-assert 24)
(data uint128 1 :offset-assert 32)
)
(:methods
(new (symbol type int int) _type_ 0)
)
:method-count-assert 9
:size-assert #x30
:flag-assert #x900000030
@@ -14697,7 +14706,7 @@
(define-extern ray-circle-intersect (function vector vector vector float float))
(define-extern ray-cylinder-intersect (function vector vector vector vector float float vector float))
(define-extern ray-plane-intersect (function vector vector vector vector vector vector vector float))
(define-extern ray-triangle-intersect (function vector)) ;; NOTE - didn't bother to check input args
(define-extern ray-triangle-intersect (function vector vector float matrix vector vector float))
(define-extern collide-do-primitives (function float)) ;; NOTE - didn't bother to check input args
(define-extern moving-sphere-sphere-intersect (function vector vector vector vector float))
(define-extern moving-sphere-moving-sphere-intersect (function vector vector vector vector float))
@@ -14724,7 +14733,7 @@
(define-extern create-interpolated-joint-animation-frame (function joint-control int process-drawable int))
(define-extern mem-size (function basic symbol int int))
(define-extern jacc-mem-usage (function pointer memory-usage-block int int))
(define-extern joint-anim-inspect-elt (function joint-anim float int))
(define-extern joint-anim-inspect-elt (function joint-anim float joint-anim))
(define-extern joint-anim-login (function joint-anim-drawable joint-anim-drawable))
(define-extern joint-control-channel-eval (function joint-control-channel float))
(define-extern joint-control-channel-eval! (function joint-control-channel (function joint-control-channel float float float) float))
@@ -14795,10 +14804,10 @@
;; - Functions
(define-extern print-cl-stat function)
(define-extern clear-cl-stat function)
(define-extern mem-usage-bsp-tree (function bsp-header (inline-array bsp-node) memory-usage-block int none))
(define-extern bsp-camera-asm function)
(define-extern print-cl-stat (function cl-stat string none))
(define-extern clear-cl-stat (function cl-stat none))
(define-extern mem-usage-bsp-tree (function bsp-header bsp-node memory-usage-block int none))
(define-extern bsp-camera-asm (function bsp-header vector none))
(define-extern print-collide-stats (function none))
;; - Unknowns
@@ -14814,13 +14823,32 @@
;; - Functions
(define-extern perf-stat-bucket->string function)
(define-extern print-tr-stat function)
(define-extern clear-tr-stat function)
(defenum perf-stat-bucket
(all-code 0)
(mercneric 1)
(tie-generic 2)
(background 3)
(drawable 4)
(tfrag 5)
(tfrag-near 6)
(inst-shrub 7)
(proto-shrub 8)
(inst-tie 9)
(proto-tie-g 10)
(proto-tie 11)
(proto-tie-n 12)
(bones 13)
(nav 14)
(collide 15)
(camera 16))
(define-extern perf-stat-bucket->string (function perf-stat-bucket string))
(define-extern print-tr-stat (function tr-stat string string none))
(define-extern clear-tr-stat (function tr-stat none))
(define-extern print-terrain-stats (function none))
(define-extern update-subdivide-settings! function)
(define-extern set-tfrag-dists! function)
(define-extern start-perf-stat-collection (function engine display-frame int int none))
(define-extern update-subdivide-settings! (function subdivide-settings math-camera int none))
(define-extern set-tfrag-dists! (function (pointer float) none))
(define-extern start-perf-stat-collection (function none))
(define-extern end-perf-stat-collection (function none))
(define-extern print-perf-stats (function none))
@@ -14829,17 +14857,17 @@
(define-extern *subdivide-settings* subdivide-settings)
(define-extern *tfrag-work* tfrag-work) ;; unknown type
(define-extern *perf-stats* perf-stat-array) ;; unknown type
;;(define-extern *merc-global-stats* object) ;; unknown type
;;(define-extern *stat-string-tfrag-near* object) ;; unknown type
;;(define-extern *stat-string-tfrag* object) ;; unknown type
;;(define-extern *stat-string-total* object) ;; unknown type
(define-extern *merc-global-stats* merc-global-stats)
(define-extern *stat-string-tfrag-near* string)
(define-extern *stat-string-tfrag* string) ;; unknown type
(define-extern *stat-string-total* string) ;; unknown type
(define-extern *terrain-context* terrain-context) ;; unknown type
;;(define-extern GSH_ENABLE object) ;; unknown type
;;(define-extern GSH_BUCKET object) ;; unknown type
;;(define-extern GSH_WHICH_STAT object) ;; unknown type
;;(define-extern GSH_MAX_DISPLAY object) ;; unknown type
;;(define-extern GSH_TIME object) ;; unknown type
;;(define-extern *gomi-stats-hack* object) ;; unknown type
(define-extern GSH_ENABLE symbol) ;; unknown type
(define-extern GSH_BUCKET bucket-id) ;; unknown type
(define-extern GSH_WHICH_STAT int) ;; unknown type
(define-extern GSH_MAX_DISPLAY basic) ;; unknown type
(define-extern GSH_TIME int) ;; unknown type
(define-extern *gomi-stats-hack* (inline-array perf-stat)) ;; unknown type
;; ----------------------
@@ -14850,104 +14878,115 @@
;; - Types
; (deftype sprite-header (structure)
; ((header UNKNOWN 1 :offset-assert 0)
; (num-sprites int32 :offset-assert 0)
; )
; :method-count-assert 9
; :size-assert #x10
; :flag-assert #x900000010
; )
(deftype sprite-header (structure)
(
(header qword 1 :inline :offset-assert 0)
(num-sprites int32 :offset 0)
)
:method-count-assert 9
:size-assert #x10
:flag-assert #x900000010
)
; (deftype sprite-hvdf-data (structure)
; ((data UNKNOWN 76 :offset-assert 0)
; )
; :method-count-assert 9
; :size-assert #x4c0
; :flag-assert #x9000004c0
; )
(deftype sprite-hvdf-data (structure)
((data qword 76 :inline :offset-assert 0)
)
:method-count-assert 9
:size-assert #x4c0
:flag-assert #x9000004c0
)
; (deftype sprite-hvdf-control (structure)
; ((alloc UNKNOWN 76 :offset-assert 0)
; )
; :method-count-assert 9
; :size-assert #x4c
; :flag-assert #x90000004c
; )
(deftype sprite-hvdf-control (structure)
((alloc int8 76 :offset-assert 0)
)
:method-count-assert 9
:size-assert #x4c
:flag-assert #x90000004c
)
; (deftype sprite-aux-list (basic)
; ((num-entries int32 :offset-assert 4)
; (entry int32 :offset-assert 8)
; (data UNKNOWN 1 :offset-assert 12)
; )
; :method-count-assert 9
; :size-assert #x10
; :flag-assert #x900000010
; )
(deftype sprite-aux-list (basic)
((num-entries int32 :offset-assert 4)
(entry int32 :offset-assert 8)
(data sprite-vec-data-2d 1 :offset-assert 12) ;; likely 4-bytes each
)
(:methods
(new (symbol type int) _type_ 0)
)
:method-count-assert 9
:size-assert #x10
:flag-assert #x900000010
)
; (deftype sprite-frame-data (structure)
; ((data UNKNOWN 41 :offset-assert 0)
; (cdata UNKNOWN 16 :offset-assert 0)
; (fdata UNKNOWN 25 :offset-assert 256)
; (xy-array UNKNOWN 8 :offset-assert 0)
; (st-array UNKNOWN 4 :offset-assert 128)
; (xyz-array UNKNOWN 4 :offset-assert 192)
; (hmge-scale vector :inline :offset-assert 256)
; (consts vector :inline :offset-assert 272)
; (pfog0 float :offset-assert 272)
; (deg-to-rad float :offset-assert 276)
; (min-scale float :offset-assert 280)
; (inv-area float :offset-assert 284)
; (adgif-giftag qword :inline :offset-assert 288)
; (sprite-2d-giftag qword :inline :offset-assert 304)
; (sprite-2d-giftag-2 qword :inline :offset-assert 320)
; (sincos-01 vector :inline :offset-assert 336)
; (sincos-23 vector :inline :offset-assert 352)
; (sincos-45 vector :inline :offset-assert 368)
; (sincos-67 vector :inline :offset-assert 384)
; (sincos-89 vector :inline :offset-assert 400)
; (basis-x vector :inline :offset-assert 416)
; (basis-y vector :inline :offset-assert 432)
; (sprite-3d-giftag qword :inline :offset-assert 448)
; (screen-shader adgif-shader :inline :offset-assert 464)
; (clipped-giftag qword :inline :offset-assert 544)
; (inv-hmge-scale vector :inline :offset-assert 560)
; (stq-offset vector :inline :offset-assert 576)
; (stq-scale vector :inline :offset-assert 592)
; (rgba-plain qword :inline :offset-assert 608)
; (warp-giftag qword :inline :offset-assert 624)
; (fog-clamp vector :inline :offset-assert 640)
; (fog-min float :offset-assert 640)
; (fog-max float :offset-assert 644)
; (max-scale float :offset-assert 648)
; )
; :method-count-assert 9
; :size-assert #x290
; :flag-assert #x900000290
; )
(deftype sprite-frame-data (structure)
(
;(data UNKNOWN 41 :offset-assert 0)
(cdata vector 16 :inline :offset-assert 0)
;(fdata UNKNOWN 25 :offset-assert 256)
;(xy-array UNKNOWN 8 :offset-assert 0)
;(st-array UNKNOWN 4 :offset-assert 128)
;(xyz-array UNKNOWN 4 :offset-assert 192)
(hmge-scale vector :inline :offset 256)
(consts vector :inline :offset-assert 272 :score -100.)
(pfog0 float :offset 272)
(deg-to-rad float :offset 276)
(min-scale float :offset 280)
(inv-area float :offset 284)
;(adgif-giftag qword :inline :offset-assert 288)
(adgif-giftag gs-gif-tag :inline :offset-assert 288)
(sprite-2d-giftag gs-gif-tag :inline :offset-assert 304)
(sprite-2d-giftag-2 gs-gif-tag :inline :offset-assert 320)
;;(sprite-2d-giftag qword :inline :offset-assert 304)
;;(sprite-2d-giftag-2 qword :inline :offset-assert 320)
(sincos-01 vector :inline :offset-assert 336)
(sincos-23 vector :inline :offset-assert 352)
(sincos-45 vector :inline :offset-assert 368)
(sincos-67 vector :inline :offset-assert 384)
(sincos-89 vector :inline :offset-assert 400)
(basis-x vector :inline :offset-assert 416)
(basis-y vector :inline :offset-assert 432)
;;(sprite-3d-giftag qword :inline :offset-assert 448)
(sprite-3d-giftag gs-gif-tag :inline :offset-assert 448)
(screen-shader adgif-shader :inline :offset-assert 464)
;;(clipped-giftag qword :inline :offset-assert 544)
(clipped-giftag gs-gif-tag :inline :offset-assert 544)
(inv-hmge-scale vector :inline :offset-assert 560)
(stq-offset vector :inline :offset-assert 576)
(stq-scale vector :inline :offset-assert 592)
(rgba-plain qword :inline :offset-assert 608)
;;(warp-giftag qword :inline :offset-assert 624)
(warp-giftag gs-gif-tag :inline :offset-assert 624)
(fog-clamp vector :inline :offset-assert 640)
(fog-min float :offset 640)
(fog-max float :offset 644)
(max-scale float :offset 648)
)
:method-count-assert 9
:size-assert #x290
:flag-assert #x900000290
)
;; - Functions
(define-extern sprite-init-distorter function)
(define-extern sprite-draw-distorters function)
(define-extern sprite-add-frame-data function)
(define-extern sprite-add-matrix-data function)
(define-extern sprite-add-3d-all function)
(define-extern sprite-add-2d-all function)
(define-extern sprite-add-shadow-all function)
(define-extern sprite-add-shadow-chunk function)
(define-extern sprite-setup-header function)
(define-extern sprite-add-3d-chunk function)
(define-extern sprite-add-2d-chunk function)
(define-extern sprite-setup-frame-data function)
(define-extern clear-sprite-aux-list function)
(define-extern add-to-sprite-aux-list function)
(define-extern sprite-set-3d-quaternion! function)
(define-extern sprite-get-3d-quaternion! function)
(define-extern sprite-init-distorter (function dma-buffer uint none))
(define-extern sprite-draw-distorters (function dma-buffer none))
(define-extern sprite-add-frame-data (function dma-buffer uint none))
(define-extern sprite-add-matrix-data (function dma-buffer uint none))
(define-extern sprite-add-3d-all (function sprite-array-3d dma-buffer int none))
(define-extern sprite-add-2d-all (function sprite-array-2d dma-buffer int none))
(define-extern sprite-add-shadow-all (function fake-shadow-buffer dma-buffer none))
(define-extern sprite-add-shadow-chunk (function fake-shadow-buffer int int dma-buffer none))
(define-extern sprite-setup-header (function sprite-header int none))
(define-extern sprite-add-3d-chunk (function sprite-array-3d int int dma-buffer none))
(define-extern sprite-add-2d-chunk (function sprite-array-2d int int dma-buffer int none))
(define-extern sprite-setup-frame-data (function sprite-frame-data int none))
(define-extern clear-sprite-aux-list (function none))
(define-extern add-to-sprite-aux-list function) ;; it's a callback.
(define-extern sprite-set-3d-quaternion! (function sprite-vec-data-3d quaternion quaternion))
(define-extern sprite-get-3d-quaternion! (function quaternion sprite-vec-data-3d quaternion))
(define-extern sprite-draw (function display none))
(define-extern sprite-allocate-user-hvdf function)
(define-extern sprite-release-user-hvdf function)
(define-extern sprite-get-user-hvdf function)
(define-extern sprite-allocate-user-hvdf (function int))
(define-extern sprite-release-user-hvdf (function int none))
(define-extern sprite-get-user-hvdf (function int qword))
;; - Symbols
@@ -14955,12 +14994,12 @@
;; - Unknowns
;;(define-extern *sprite-hvdf-data* object) ;; unknown type
;;(define-extern *sprite-hvdf-control* object) ;; unknown type
;;(define-extern sprite-vu1-block object) ;; unknown type
;;(define-extern *sprite-array-3d* object) ;; unknown type
;;(define-extern *sprite-array-2d* object) ;; unknown type
;;(define-extern *sprite-aux-list* object) ;; unknown type
(define-extern *sprite-hvdf-data* sprite-hvdf-data) ;; unknown type
(define-extern *sprite-hvdf-control* sprite-hvdf-control) ;; unknown type
(define-extern sprite-vu1-block vu-function) ;; unknown type
(define-extern *sprite-array-3d* sprite-array-3d) ;; unknown type
(define-extern *sprite-array-2d* sprite-array-2d) ;; unknown type
(define-extern *sprite-aux-list* sprite-aux-list)
;; ----------------------
@@ -14971,23 +15010,23 @@
;; - Types
; (deftype sprite-distorter-sine-tables (basic)
; ((aspx float :offset-assert 4)
; (aspy float :offset-assert 8)
; (entry UNKNOWN 128 :offset-assert 16)
; (ientry UNKNOWN 9 :offset-assert 2064)
; (giftag qword :inline :offset-assert 2208)
; (color qword :inline :offset-assert 2224)
; )
; :method-count-assert 9
; :size-assert #x8c0
; :flag-assert #x9000008c0
; )
(deftype sprite-distorter-sine-tables (basic)
((aspx float :offset-assert 4)
(aspy float :offset-assert 8)
(entry vector 128 :inline :offset-assert 16)
(ientry qword 9 :inline :offset-assert 2064)
(giftag gs-gif-tag :inline :offset-assert 2208) ;; was qword
(color qword :inline :offset-assert 2224)
)
:method-count-assert 9
:size-assert #x8c0
:flag-assert #x9000008c0
)
;; - Unknowns
;;(define-extern *sprite-distorter-sine-tables* object) ;; unknown type
;;(define-extern sprite-distort-vu1-block object) ;; unknown type
(define-extern *sprite-distorter-sine-tables* sprite-distorter-sine-tables)
(define-extern sprite-distort-vu1-block vu-function)
;; ----------------------
@@ -18015,7 +18054,7 @@
(define-extern move-camera-from-pad function)
(define-extern update-view-planes function)
(define-extern update-visible function)
(define-extern update-visible (function math-camera none))
(define-extern set-point function)
(define-extern plane-from-points function)
(define-extern update-camera (function none))
@@ -18026,7 +18065,7 @@
;;(define-extern *timer-value* object) ;; unknown type
;;(define-extern *start-pos* object) ;; unknown type
;;(define-extern *save-camera-inv-rot* object) ;; unknown type
;;(define-extern *update-leaf-when-outside-bsp* object) ;; unknown type
(define-extern *update-leaf-when-outside-bsp* symbol)
;; ----------------------
@@ -107,8 +107,6 @@
// collide-func
"moving-sphere-triangle-intersect", // P: weird branching
"collide-do-primitives", // P: asm branching
"ray-triangle-intersect", // F: asm branching
"ray-cylinder-intersect", // F: asm branching
// joint
"calc-animation-from-spr", // F: asm branching
@@ -119,11 +117,6 @@
"clear-frame-accumulator", // F: asm branching
"cspace<-parented-transformq-joint!",
// bsp
"level-remap-texture", // BUG: probably missing branch case?
"bsp-camera-asm", // F: asm branching
"sprite-draw-distorters",
// merc-blend-shape
"setup-blerc-chains-for-one-fragment", // F: asm branching
"blerc-execute", // F: asm branching
@@ -494,7 +487,9 @@
" textures ~192H~5DK ~280Htextures~456H~5DK~%": 2,
" entity ~192H~5DK~%": 2,
" misc ~192H~5DK ~280Hsprite~456H~5DK~%": 2,
"ERROR: <asg> ~A in spool anim loop for ~A ~D, but not loaded.~": 3
"ERROR: <asg> ~A in spool anim loop for ~A ~D, but not loaded.~": 3,
"~0k~5d/~d ~6d/~d ~6d/~d ": 6,
"~0k~s~%": 1
},
"blocks_ending_in_asm_branch": {
@@ -536,6 +531,14 @@
"(method 11 perf-stat)": [0],
"(method 20 actor-link-info)": [2],
"(method 21 actor-link-info)": [2],
"raw-ray-sphere-intersect": [0, 1, 2, 3, 4, 5]
"raw-ray-sphere-intersect": [0, 1, 2, 3, 4, 5],
"ray-cylinder-intersect": [0, 1, 2, 3, 4, 5],
"ray-triangle-intersect": [0, 1, 2, 3, 4],
"bsp-camera-asm": [1, 2, 3],
"level-remap-texture": [2, 3, 4, 5, 6],
"start-perf-stat-collection": [26],
"end-perf-stat-collection": [0],
"sprite-draw-distorters": [4, 5]
}
}
@@ -497,12 +497,18 @@
"cam-update-h": [["L2", "bfloat", true]],
"collide-func": [["L41", "float", true], ["L40", "float", true]],
"collide-func": [
["L41", "float", true],
["L40", "float", true]
],
"cylinder": [
["L27", "float", true],
["L54", "vector", true],
["L60", "float", true]
["L60", "float", true],
["L57", "vector", true],
["L56", "vector", true],
["L53", "vector", true]
],
"debug-sphere": [["L10", "debug-sphere-table", true]],
@@ -1201,7 +1207,7 @@
["L78", "rgba", true],
["L79", "rgba", true]
],
"loader": [
["L279", "float", true],
["L283", "float", true],
@@ -1211,7 +1217,7 @@
["L281", "float", true],
["L278", "float", true]
],
"yakow": [
["L150", "float", true],
["L162", "float", true],
@@ -1226,9 +1232,48 @@
["L152", "float", true],
["L149", "float", true]
],
"farmer": [
["L50", "float", true]
"farmer": [["L50", "float", true]],
"bsp": [
["L54", "rgba", true],
["L85", "rgba", true],
["L86", "rgba", true],
["L55", "rgba", true],
["L53", "uint64", true],
["L56", "uint64", true]
],
"subdivide": [
["L129", "float", true],
["L128", "float", true],
["L114", "rgba", true],
["L113", "uint64", true]
],
"sprite": [
["L93", "uint64", true],
["L92", "uint64", true],
["L83", "uint64", true],
["L90", "uint64", true],
["L91", "uint64", true],
["L84", "uint64", true],
["L89", "uint64", true],
["L88", "uint64", true],
["L86", "uint64", true],
["L82", "uint64", true],
["L94", "uint64", true],
["L87", "uint64", true],
["L85", "uint64", true]
],
"sprite-distort": [
["L42", "uint64", true],
["L39", "uint64", true],
["L41", "uint64", true],
["L40", "uint64", true],
["L37", "uint64", true],
["L38", "uint64", true]
],
// please do not add things after this entry! git is dumb.
@@ -1079,7 +1079,7 @@
[196, "s4", "pointer"],
[[203, 210], "s4", "game-save-tag"]
],
"drawable-load": [
[17, "s5", "drawable"],
[18, "s5", "drawable"],
@@ -1101,7 +1101,7 @@
],
"(method 13 art-group)": [[16, "s3", "art-joint-anim"]],
"(method 14 art-group)": [[16, "s3", "art-joint-anim"]],
"(method 9 external-art-control)": [
[171, "s4", "external-art-buffer"],
[172, "s4", "external-art-buffer"],
@@ -1109,7 +1109,7 @@
[177, "s4", "external-art-buffer"],
[183, "s4", "external-art-buffer"],
[190, "s4", "external-art-buffer"],
[233, "s4", "spool-anim"],
[240, "s4", "spool-anim"],
[243, "s4", "spool-anim"],
@@ -1118,16 +1118,14 @@
[253, "s4", "spool-anim"],
[257, "s4", "spool-anim"]
],
"(method 10 external-art-control)": [
[18, "v1", "spool-anim"]
],
"(method 10 external-art-control)": [[18, "v1", "spool-anim"]],
"(method 16 external-art-control)": [
[37, "a0", "process"],
[17, "s5", "process-drawable"]
],
"ja-play-spooled-anim": [
[154, "a0", "process"],
[286, "s2", "art-joint-anim"],
@@ -1137,7 +1135,7 @@
[320, "s2", "art-joint-anim"],
[324, "s2", "art-joint-anim"]
],
"(method 11 external-art-control)": [
[127, "a0", "process"],
[151, "a0", "process"],
@@ -1241,24 +1239,24 @@
"blackout": [[[20, 24], "v1", "dma-packet"]],
"(method 10 external-art-control)": [[18, "v1", "pointer"]],
"(method 15 load-state)": [
[31, "t9", "(function int)"],
[291, "s5", "entity-actor"],
[370, "s3", "process-drawable"]
],
"yakow-default-event-handler": [
[27, "a0", "collide-shape"],
[32, "a0", "collide-shape"]
],
"(method 11 yakow)": [
[184, "v1", "vector"],
[186, "v1", "vector"],
[189, "v1", "vector"]
],
"yakow-post": [
[114, "a0", "collide-shape-moving"],
[130, "a0", "collide-shape-moving"]
@@ -1269,5 +1267,98 @@
[36, "v1", "uint"]
],
"(method 10 bsp-header)": [
[[51, 61], "a0", "(pointer uint128)"],
[[51, 61], "a1", "(pointer uint128)"],
[133, "v1", "terrain-bsp"],
[141, "v1", "terrain-bsp"],
[148, "v1", "terrain-bsp"],
[5, "a0", "terrain-bsp"],
[8, "a0", "terrain-bsp"]
],
"(method 15 bsp-header)": [
[5, "a0", "terrain-bsp"],
[8, "a0", "terrain-bsp"]
],
"bsp-camera-asm": [
[[4, 14], "a1", "bsp-node"],
[[0, 9], "v1", "bsp-node"],
[[12, 16], "v1", "bsp-node"]
],
"level-remap-texture": [
[15, "t0", "(pointer int32)"],
[21, "t0", "(pointer int32)"],
[19, "t0", "(pointer uint64)"],
[12, "v1", "int"]
],
"sprite-add-matrix-data": [
[[5, 15], "a2", "dma-packet"],
[[24, 29], "a1", "matrix"],
[[47, 57], "a2", "dma-packet"],
[[60, 97], "a1", "matrix"],
[[116, 129], "a1", "vector"]
],
"sprite-add-frame-data": [[[8, 16], "a0", "dma-packet"]],
"sprite-add-2d-chunk": [
[[12, 20], "a0", "dma-packet"],
[[45, 52], "a0", "dma-packet"],
[[69, 76], "a0", "dma-packet"],
[[80, 87], "v1", "dma-packet"]
],
"sprite-add-3d-chunk": [
[[11, 19], "a0", "dma-packet"],
[[44, 51], "a0", "dma-packet"],
[[68, 75], "a0", "dma-packet"],
[[79, 87], "v1", "dma-packet"]
],
"sprite-add-shadow-chunk": [
[[11, 19], "a0", "dma-packet"],
[[37, 44], "a0", "dma-packet"],
[[49, 77], "a0", "(inline-array vector)"],
[[93, 100], "a0", "dma-packet"],
[[105, 121], "s1", "adgif-shader"],
[[130, 138], "v1", "dma-packet"]
],
"sprite-draw": [
[[33, 37], "a0", "dma-packet"],
[[43, 46], "a0", "gs-gif-tag"],
[51, "a0", "(pointer gs-test)"],
[53, "a0", "(pointer gs-reg64)"],
[55, "a0", "(pointer gs-clamp)"],
[57, "a0", "(pointer gs-reg64)"],
[[78, 87], "a0", "dma-packet"],
[[92, 97], "a0", "dma-packet"],
[[125, 129], "a0", "dma-packet"],
[[143, 146], "v1", "dma-packet"]
],
"sprite-init-distorter": [
[59, "a3", "uint"],
[[3, 7], "a2", "dma-packet"],
[[13, 16], "a2", "gs-gif-tag"],
[21, "a2", "(pointer gs-zbuf)"],
[23, "a2", "(pointer gs-reg64)"],
[29, "a2", "(pointer gs-tex0)"],
[31, "a2", "(pointer gs-reg64)"],
[33, "a2", "(pointer gs-tex1)"],
[35, "a2", "(pointer gs-reg64)"],
[36, "a2", "(pointer gs-miptbp)"],
[38, "a2", "(pointer gs-reg64)"],
[45, "a2", "(pointer gs-clamp)"],
[47, "a2", "(pointer gs-reg64)"],
[49, "a2", "(pointer gs-alpha)"],
[51, "a2", "(pointer gs-reg64)"],
[[62, 67], "a1", "dma-packet"]
],
"placeholder-do-not-add-below": []
}
@@ -2485,6 +2485,68 @@
"args": ["ray-origin", "ray-dir", "sph-origin", "radius"]
},
"ray-circle-intersect": {
"args": ["ray-origin", "ray-dir", "circle-origin", "radius"]
},
"ray-cylinder-intersect": {
"args": [
"ray-origin",
"ray-dir",
"cyl-origin",
"cyl-axis",
"cyl-rad",
"cyl-len"
]
},
"(method 10 cylinder)": {
"args": ["obj", "probe-origin", "probe-dir"],
"vars": {
"f30-0": "result",
"f0-5": "u-origin-sph",
"s4-0": "end-pt",
"f0-8": "u-end-sphere"
}
},
"(method 10 cylinder-flat)": {
"args": ["obj", "probe-origin", "probe-dir"],
"vars": {
"f30-0": "result",
"f0-5": "u-origin-circle",
"s5-0": "end-pt",
"f0-8": "u-end-circle"
}
},
"ray-arbitrary-circle-intersect": {
"args": [
"probe-origin",
"probe-dir",
"circle-origin",
"circle-normal",
"radius"
]
},
"print-tr-stat": {
"args": ["stat", "name", "dest"]
},
"update-subdivide-settings!": {
"args": ["settings", "math-cam", "idx"]
},
"start-perf-stat-collection": {
"vars": {
"v1-2": "frame-idx",
"v1-5": "bucket",
"a0-2": "which-stat",
"a0-7": "stat-idx"
}
},
"ja-play-spooled-anim": {
"vars": {
"sv-16": "spool-part",
@@ -2493,5 +2555,195 @@
}
},
"sprite-setup-header": {
"args": ["hdr", "num-sprites"]
},
"(method 0 sprite-aux-list)": {
"args": ["allocation", "type-to-make", "size"]
},
"sprite-setup-frame-data": {
"args": ["data", "tbp-offset"]
},
"(method 0 sprite-array-2d)": {
"args": ["allocation", "type-to-make", "group-0-size", "group-1-size"],
"vars": {
"v1-0": "sprite-count",
"s4-0": "vec-data-size",
"a2-3": "adgif-data-size"
}
},
"(method 0 sprite-array-3d)": {
"args": ["allocation", "type-to-make", "group-0-size", "group-1-size"],
"vars": {
"v1-0": "sprite-count",
"s4-0": "vec-data-size",
"a2-3": "adgif-data-size"
}
},
"sprite-set-3d-quaternion": {
"args": ["data", "quat"]
},
"sprite-get-3d-quaternion": {
"args": ["data", "quat"]
},
"sprite-add-matrix-data": {
"args": ["dma-buff", "matrix-mode"],
"vars": {
"v1-0": "count",
"a2-1": ["pkt1", "dma-packet"],
"a1-2": ["mtx", "matrix"],
"a2-9": ["pkt2", "dma-packet"],
"a1-11": "mtx2",
"a1-20": "hvdf-idx"
}
},
"sprite-add-frame-data": {
"args": ["dma-buff", "tbp-offset"],
"vars": {
"a0-1": ["pkt", "dma-packet"]
}
},
"sprite-add-2d-chunk": {
"args": [
"sprites",
"start-sprite-idx",
"num-sprites",
"dma-buff",
"mscal-addr"
],
"vars": {
"a0-1": ["pkt1", "dma-packet"],
"s1-0": "qwc-pkt1",
"a1-7": "qwc-pkt2",
"a0-5": ["pkt2", "dma-packet"],
"a1-11": "qwc-pkt3",
"a0-7": ["pkt3", "dma-packet"],
"v1-7": ["pkt4", "dma-packet"]
}
},
"sprite-add-2d-all": {
"args": ["sprites", "dma-buff", "group-idx"],
"vars": {
"s4-0": "current-sprite-idx",
"s2-0": "remaining-sprites",
"s3-0": "mscal-addr"
}
},
"sprite-add-3d-chunk": {
"args": ["sprites", "start-sprite-idx", "num-sprites", "dma-buff"],
"vars": {
"a0-1": ["pkt1", "dma-packet"],
"s2-0": "qwc-pkt1",
"a1-7": "qwc-pkt2",
"a0-5": ["pkt2", "dma-packet"],
"a1-11": "qwc-pkt3",
"a0-7": ["pkt3", "dma-packet"],
"v1-7": ["pkt4", "dma-packet"]
}
},
"sprite-add-3d-all": {
"args": ["sprites", "dma-buff", "group-idx"],
"vars": {
"s4-0": "current-sprite-idx",
"s3-0": "remaining-sprites"
}
},
"sprite-add-shadow-chunk": {
"args": ["shadow-buff", "start-idx", "num-sprites", "dma-buff"],
"vars": {
"s2-0": "pkt1-qwc",
"a0-1": ["pkt1", "dma-packet"],
"a1-7": "pkt2-qwc",
"a0-5": ["pkt2", "dma-packet"],
"v1-5": "sprite-idx",
"a0-7": "dma-vec-data",
"a1-14": "in-vec-data",
"a1-5": "pkt3-qwc",
"a0-11": ["pkt3", "dma-packet"],
"s2-1": "si",
"s1-0": "dma-adgif-data",
"s0-0": "in-adgif-data",
"v1-21": ["pkt4", "dma-packet"]
}
},
"sprite-add-shadow-all": {
"args": ["shadow-buff", "dma-buff"],
"vars": {
"s4-0": "current-shadow",
"s3-0": "remaining-shadows"
}
},
"sprite-draw": {
"args": "disp",
"vars": {
"gp-0": "dma-mem-begin",
"s4-0": "dma-buff",
"s5-0": "dma-bucket-begin",
"a0-9": ["pkt1", "dma-packet"],
"a0-11": ["giftag", "gs-gif-tag"],
"a0-17": ["pkt2", "dma-packet"],
"a0-19": ["pkt3", "dma-packet"],
"a0-26": ["pkt4", "dma-packet"],
"v1-26": ["pkt5", "dma-packet"],
"v1-31": "mem-use"
}
},
"mem-usage-bsp-tree": {
"args": ["header", "node", "mem-use", "flags"]
},
"(method 8 bsp-header)": {
"args": ["obj", "mem-use", "flags"]
},
"(method 10 bsp-header)": {
"args": ["obj", "other-draw", "disp-frame"],
"vars": {
"s4-0": "lev",
"a2-3": "vis-list-qwc",
"v1-15": "vis-list-qwc2",
"a0-9": ["vis-list-spad", "(pointer uint128)"],
"a1-5": ["vis-list-lev", "(pointer uint128)"],
"a2-4": "current-qw"
}
},
"bsp-camera-asm": {
"args": ["bsp-hdr", "camera-pos"],
"vars": {
"v1-0": ["next-node", "bsp-node"],
"a1-1": "real-node"
}
},
"level-remap-texture": {
"args": ["tex-id"],
"vars": {
"v1-1":"bsp-hdr",
"a3-0": "table-size",
"v1-2": ["table-data-start", "(pointer uint64)"],
"t0-0":"table-data-ptr",
"a1-1":"mask1",
"a2-1":"masked-tex-id",
"a3-2":"table-data-end",
"t0-3":"midpoint",
"t1-1":"diff"
}
},
"aaaaaaaaaaaaaaaaaaaaaaa": {}
}
+5
View File
@@ -414,6 +414,11 @@ int DecompilerTypeSystem::get_format_arg_count(const std::string& str) const {
continue;
}
// ~0k
if (i + 1 < str.length() && (str.at(i) == '0') && str.at(i + 1) == 'k') {
continue;
}
// ~2j
if (i + 1 < str.length() && (str.at(i) == '2') && str.at(i + 1) == 'j') {
continue;
+2
View File
@@ -100,3 +100,5 @@
(defun-extern debug-set-camera-pos-rot! vector matrix int)
)
(define-extern camera-line (function vector vector vector none))
+15 -15
View File
@@ -17,7 +17,7 @@
(draw (-> obj data s4-0) (-> obj data s4-0) arg1)
)
)
0
(none)
)
;; definition for method 16 of type drawable-tree-collide-fragment
@@ -33,8 +33,8 @@
(defmethod
dummy-11
drawable-tree-collide-fragment
((obj drawable-tree-collide-fragment) (arg0 int))
(dummy-11 (-> obj data 0) (-> obj length))
((obj drawable-tree-collide-fragment) (arg0 int) (arg1 object))
(dummy-11 (-> obj data 0) (-> obj length) arg1)
(let ((v0-1 0))
)
(none)
@@ -45,8 +45,8 @@
(defmethod
dummy-12
drawable-tree-collide-fragment
((obj drawable-tree-collide-fragment) (arg0 int))
(dummy-12 (-> obj data 0) (-> obj length))
((obj drawable-tree-collide-fragment) (arg0 int) (arg1 object))
(dummy-12 (-> obj data 0) (-> obj length) arg1)
(let ((v0-1 0))
)
(none)
@@ -57,8 +57,8 @@
(defmethod
dummy-13
drawable-tree-collide-fragment
((obj drawable-tree-collide-fragment) (arg0 int))
(dummy-13 (-> obj data 0) (-> obj length))
((obj drawable-tree-collide-fragment) (arg0 int) (arg1 object))
(dummy-13 (-> obj data 0) (-> obj length) arg1)
(let ((v0-1 0))
)
(none)
@@ -126,7 +126,7 @@
;; definition for method 10 of type collide-fragment
(defmethod draw collide-fragment ((obj collide-fragment) (arg0 drawable) (arg1 display-frame))
0
(none)
)
;; definition for method 10 of type drawable-inline-array-collide-fragment
@@ -138,7 +138,7 @@
)
)
)
0
(none)
)
;; definition for method 11 of type drawable-inline-array-collide-fragment
@@ -146,8 +146,8 @@
(defmethod
dummy-11
drawable-inline-array-collide-fragment
((obj drawable-inline-array-collide-fragment) (arg0 int))
(dummy-11 (the-as collide-fragment (-> obj data)) (-> obj length))
((obj drawable-inline-array-collide-fragment) (arg0 int) (arg1 object))
(dummy-11 (the-as collide-fragment (-> obj data)) (-> obj length) arg1)
(none)
)
@@ -156,8 +156,8 @@
(defmethod
dummy-12
drawable-inline-array-collide-fragment
((obj drawable-inline-array-collide-fragment) (arg0 int))
(dummy-12 (the-as collide-fragment (-> obj data)) (-> obj length))
((obj drawable-inline-array-collide-fragment) (arg0 int) (arg1 object))
(dummy-12 (the-as collide-fragment (-> obj data)) (-> obj length) arg1)
(none)
)
@@ -166,8 +166,8 @@
(defmethod
dummy-13
drawable-inline-array-collide-fragment
((obj drawable-inline-array-collide-fragment) (arg0 int))
(dummy-13 (the-as collide-fragment (-> obj data)) (-> obj length))
((obj drawable-inline-array-collide-fragment) (arg0 int) (arg1 object))
(dummy-13 (the-as collide-fragment (-> obj data)) (-> obj length) arg1)
(none)
)
+165
View File
@@ -214,3 +214,168 @@
(pc-port-do-raw-ray-sphere-intersect radius vf1 vf2)
)
)
(defun ray-circle-intersect ((ray-origin vector) (ray-dir vector) (circle-origin vector) (radius float))
"Intersect ray with circle. Circle is on the y plane and this throws out the y components
of ray-origin, circle-origin, and ray-dir"
(rlet ((vf0 :class vf)
(vf1 :class vf)
(vf2 :class vf)
)
(init-vf0-vector)
(.lvf vf1 (&-> ray-origin quad))
(.mov.vf vf1 vf0 :mask #b10)
(.lvf vf2 (&-> circle-origin quad))
(.mov.vf vf2 vf0 :mask #b10)
(.sub.vf vf1 vf1 vf2)
(.lvf vf2 (&-> ray-dir quad))
(.mov.vf vf2 vf0 :mask #b10)
;;(raw-ray-sphere-intersect radius)
(pc-port-do-raw-ray-sphere-intersect radius vf1 vf2)
)
)
(defun ray-cylinder-intersect ((ray-origin vector) (ray-dir vector) (cyl-origin vector) (cyl-axis vector) (cyl-rad float) (cyl-len float) (pt-out vector))
"Intersect with a cylinder.
Currently this is untested."
(local-vars
(v0-1 float)
(v1-0 int)
(v1-2 int)
(a0-1 int)
(a0-2 int)
(a0-4 int)
(a0-5 int)
)
(rlet ((vf1 :class vf)
(vf10 :class vf)
(vf11 :class vf)
(vf12 :class vf)
(vf13 :class vf)
(vf14 :class vf)
(vf15 :class vf)
(vf16 :class vf)
(vf17 :class vf)
(vf18 :class vf)
(vf19 :class vf)
(vf2 :class vf)
(vf20 :class vf)
(vf21 :class vf)
)
(.lvf vf10 (&-> ray-origin quad))
(.lvf vf12 (&-> cyl-origin quad))
(.sub.vf vf15 vf10 vf12)
(.lvf vf11 (&-> ray-dir quad))
(.lvf vf13 (&-> cyl-axis quad))
(.mov vf14 cyl-len)
(.mul.vf vf16 vf15 vf13)
(.mul.vf vf17 vf11 vf13)
(.add.x.vf vf16 vf16 vf16 :mask #b10)
(.add.x.vf vf17 vf17 vf17 :mask #b10)
(.add.z.vf vf16 vf16 vf16 :mask #b10)
(.add.z.vf vf17 vf17 vf17 :mask #b10)
(.mul.y.vf vf1 vf13 vf16)
(.add.vf vf18 vf17 vf16)
(.sub.x.vf vf19 vf16 vf14)
(.mul.y.vf vf2 vf13 vf17)
(.mov v1-0 vf16)
(.sub.x.vf vf20 vf18 vf14)
(.mov a0-1 vf18)
(let ((v1-1 (logand v1-0 (the-as uint a0-1))))
(.sub.vf vf1 vf15 vf1)
(b! (< v1-1 0) cfg-6 :delay (.sub.vf vf2 vf11 vf2))
)
(.mov v1-2 vf19)
(.mov a0-2 vf20)
(b! (>= (the-as int (logior v1-2 (the-as uint a0-2))) 0) cfg-6 :delay (nop!))
;;(let ((v1-4 (raw-ray-sphere-intersect cyl-rad)))
(let ((v1-4 (pc-port-do-raw-ray-sphere-intersect cyl-rad vf1 vf2)))
(b! (< (the-as int v1-4) 0) cfg-6 :delay (.mov vf21 v1-4))
(.mul.x.vf vf17 vf17 vf21)
(.add.vf vf16 vf16 vf17)
(.mul.y.vf vf13 vf13 vf16)
(.sub.x.vf vf19 vf16 vf14)
(.mov a0-4 vf16)
(b!
(< (the-as int a0-4) 0)
cfg-6
:delay
(.add.vf vf12 vf12 vf13 :mask #b111)
)
(.mov a0-5 vf19)
(b! (>= (the-as int a0-5) 0) cfg-6 :delay (.svf (&-> pt-out quad) vf12))
(b! #t cfg-7 :delay (set! v0-1 v1-4))
)
(label cfg-6)
(set! v0-1 -100000000.0)
(label cfg-7)
v0-1
)
)
(defun ray-plane-intersect ((arg0 vector) (arg1 vector) (arg2 vector) (arg3 vector) (arg4 vector) (arg5 vector) (arg6 vector))
"Unused."
(local-vars (v1-0 float) (v1-1 float) (a2-1 float))
(rlet ((acc :class vf)
(Q :class vf)
(vf0 :class vf)
(vf1 :class vf)
(vf2 :class vf)
(vf3 :class vf)
(vf4 :class vf)
(vf5 :class vf)
(vf6 :class vf)
(vf7 :class vf)
(vf8 :class vf)
(vf9 :class vf)
)
(init-vf0-vector)
(.lvf vf3 (&-> arg5 quad))
(.lvf vf1 (&-> arg4 quad))
(.lvf vf2 (&-> arg6 quad))
(.sub.vf vf1 vf3 vf1)
(.sub.vf vf2 vf3 vf2)
(.lvf vf6 (&-> arg2 quad))
(.lvf vf7 (&-> arg3 quad))
(.sub.vf vf8 vf3 vf6)
(.outer.product.vf vf4 vf2 vf1)
(.mul.vf vf8 vf8 vf4)
(.mul.vf vf9 vf7 vf4)
(.mul.vf vf5 vf4 vf4)
(.add.y.vf vf8 vf8 vf8 :mask #b1)
(.add.y.vf vf9 vf9 vf9 :mask #b1)
(.add.y.vf vf5 vf5 vf5 :mask #b1)
(.add.z.vf vf8 vf8 vf8 :mask #b1)
(.add.z.vf vf9 vf9 vf9 :mask #b1)
(.add.z.vf vf5 vf5 vf5 :mask #b1)
(.mov v1-0 vf9)
(.mov a2-1 vf8)
(.isqrt.vf Q vf0 vf5 :fsf #b11 :ftf #b0)
(let ((f1-0 a2-1)
(f2-0 v1-0)
)
(cond
((!= f2-0 0.0)
(let ((f1-1 (/ f1-0 f2-0)))
(.mov.vf vf4 vf0 :mask #b1000)
(.wait.vf)
(.mul.vf vf4 vf4 Q :mask #b111)
(let ((v0-0 f1-1))
(.mov vf8 v0-0)
(.svf (&-> arg1 quad) vf4)
(.mul.x.vf acc vf7 vf8)
(.add.mul.w.vf vf7 vf6 vf0 acc :mask #b111)
(.svf (&-> arg0 quad) vf7)
(.mov v1-1 vf7)
v0-0
)
)
)
(else
-100000000.0
)
)
)
)
)
+4 -1
View File
@@ -112,7 +112,9 @@
(entity-links 64) ;; or ambient links, its messed up
(joint 65)
(joint-anim-compressed 66)
;;
(joint-anim-compressed-control 67)
(joint-anim-fixed 68)
(joint-anim-frame 69)
(art-group 70)
(art-mesh-anim 71)
(art-mesh-geo 72)
@@ -125,6 +127,7 @@
(texture 79)
(string 80)
(array 81)
(sprite 82)
;;
(debug-dma 84) ;; maybe
(sky-dma 85) ;; maybe
+2 -1
View File
@@ -45,12 +45,13 @@
(to-spr-waits uint32 :offset-assert 44)
(from-spr-waits uint32 :offset-assert 48)
)
:pack-me
:method-count-assert 14
:size-assert #x34
:flag-assert #xe00000034
(:methods
(dummy-9 (_type_) none 9)
(dummy-10 (_type_) none 10)
(print-to-stream (_type_ string basic) none 10)
(reset! (_type_) none 11)
(read! (_type_) none 12)
(update-wait-stats (_type_ uint uint uint) none 13)
+1
View File
@@ -246,6 +246,7 @@
;; merc1 61
;; generic1 62
(bucket-65 65)
(sprite 66)
;; debug spheres? 67
(debug-draw0 67)
;; debug text 68
+1
View File
@@ -29,4 +29,5 @@
(defmethod draw drawable-tree-actor ((obj _type_) (arg0 drawable) (arg1 display-frame))
0
(none)
)
@@ -33,6 +33,7 @@
(defmethod draw drawable-tree-ambient ((obj _type_) (arg0 drawable) (arg1 display-frame))
0
(none)
)
(defmethod dummy-16 drawable-tree-ambient ((obj drawable-tree-ambient) (arg0 object) (arg1 object))
+8 -7
View File
@@ -18,12 +18,12 @@
:flag-assert #x1200000020
(:methods
(login (_type_) _type_ 9) ;; probably login or init.
(draw (_type_ drawable display-frame) int 10) ;; display-frame is from the method inspect tool
(dummy-11 (_type_ int) none 11) ; int - length
(dummy-12 (_type_ int) none 12) ; int - length
(dummy-13 (_type_ int) none 13) ; int - length
(dummy-14 () none 14) ;; related to culling?
(dummy-15 (_type_) none 15)
(draw (_type_ drawable display-frame) none 10) ;; display-frame is from the method inspect tool
(dummy-11 (_type_ int object) none 11) ; int - length
(dummy-12 (_type_ int object) none 12) ; int - length
(dummy-13 (_type_ int object) none 13) ; int - length
(dummy-14 (_type_) none 14) ;; related to culling?
(dummy-15 (_type_ object object) none 15)
(dummy-16 (_type_ object object) object 16)
(dummy-17 (_type_ sphere int ambient-list) none 17)
)
@@ -38,4 +38,5 @@
)
(declare-type process-drawable process)
(define-extern process-drawable-art-error (state string process-drawable))
(define-extern process-drawable-art-error (state string process-drawable))
(define-extern foreground-engine-execute (function engine display-frame int int none))
@@ -16,15 +16,15 @@
)
(defmethod draw drawable-inline-array ((obj drawable-inline-array) (arg0 drawable) (arg1 display-frame))
0
(none)
)
(defmethod dummy-14 drawable-inline-array ()
(defmethod dummy-14 drawable-inline-array ((obj drawable-inline-array))
0
(none)
)
(defmethod dummy-15 drawable-inline-array ((obj drawable-inline-array))
(defmethod dummy-15 drawable-inline-array ((obj drawable-inline-array) (arg0 object) (arg1 object))
0
(none)
)
+335 -2
View File
@@ -5,5 +5,338 @@
;; name in dgo: cylinder
;; dgos: GAME, ENGINE
;; TODO - done but depends on collide-func functions (asm related).
;; TODO - also will need manual cleanup around `vector-dot` being inlined
;; Note: "cylinder" refers to a capsule, "cylinder-flat" refers to a real cylinder with end caps.
(defmethod ray-capsule-intersect cylinder ((obj cylinder) (probe-origin vector) (probe-dir vector))
"Intersect a ray with a capsule."
(let ((t2-0 (new 'stack-no-clear 'vector))
(end-pt (new 'stack-no-clear 'vector))
)
;; first intersect with the cylinder part.
(let ((result (ray-cylinder-intersect
probe-origin
probe-dir
(-> obj origin)
(-> obj axis)
(-> obj radius)
(-> obj length)
t2-0
)
)
)
;; next, intersect with the sphere at the origin.
(let ((u-origin-sph (ray-sphere-intersect
probe-origin
probe-dir
(-> obj origin)
(-> obj radius)
)
)
)
;; if that was closer, we went through both the sphere and the wall, and we want the sphere.
(if (and (>= u-origin-sph 0.0) (or (< result 0.0) (< u-origin-sph result)))
(set! result u-origin-sph)
)
)
;; compute the location of the other end's sphere's origin
(vector+float*! end-pt (-> obj origin) (-> obj axis) (-> obj length))
;; intersect that
(let ((u-end-sphere (ray-sphere-intersect probe-origin probe-dir end-pt (-> obj radius))))
;; and pick it if it's closer.
(if (and (>= u-end-sphere 0.0) (or (< result 0.0) (< u-end-sphere result)))
(set! result u-end-sphere)
)
)
result
)
)
)
;; This is used to hold vertices for debug-drawing cylinders.
(deftype cylinder-verts (structure)
((vert vector 24 :inline :offset-assert 0)
)
:method-count-assert 9
:size-assert #x180
:flag-assert #x900000180
)
(defmethod debug-draw cylinder ((obj cylinder) (arg0 vector))
"Debug draw a cylinder. This is slow and ugly"
(local-vars
(sv-896 matrix)
(sv-912 int)
(sv-928 (function vector vector vector float vector))
(sv-944 vector)
(sv-960 vector)
(sv-976 vector)
(sv-992 (function vector vector vector float vector))
(sv-1008 vector)
(sv-1024 vector)
(sv-1040 vector)
(sv-1056 (function vector vector vector float vector))
(sv-1072 vector)
(sv-1088 vector)
(sv-1104 vector)
(sv-1120 (function vector vector vector float vector))
(sv-1136 vector)
(sv-1152 vector)
(sv-1168 vector)
)
(rlet ((vf0 :class vf)
(vf4 :class vf)
(vf5 :class vf)
(vf6 :class vf)
)
(init-vf0-vector)
(let ((s1-0 (new 'stack-no-clear 'vector))
(s0-0 (new 'stack-no-clear 'vector))
)
(if (< 0.999 (fabs (-> obj axis y)))
(vector-cross! s1-0 (-> obj axis) (new 'static 'vector :z 1.0))
(vector-cross! s1-0 (-> obj axis) (new 'static 'vector :y 1.0))
)
(vector-normalize! s1-0 (-> obj radius))
(vector-float*! s0-0 (-> obj axis) (* 0.125 (-> obj length)))
(let ((s5-0 (new 'stack-no-clear 'cylinder-verts))
(s4-0 (new 'stack-no-clear 'cylinder-verts))
(s3-0 (new 'stack-no-clear 'matrix))
)
(matrix-axis-angle! s3-0 (-> obj axis) 4096.0)
(set! sv-896 (new 'stack-no-clear 'matrix))
(vector-matrix*! (the-as vector sv-896) (-> obj origin) s3-0)
(let ((v1-5 (-> s3-0 vector 3)))
(.lvf vf4 (&-> (-> obj origin) quad))
(.lvf vf5 (&-> sv-896 vector 0 quad))
(.mov.vf vf6 vf0 :mask #b1000)
(.sub.vf vf6 vf4 vf5 :mask #b111)
(.svf (&-> v1-5 quad) vf6)
)
(set! sv-912 0)
(while (< sv-912 8)
(vector+! (-> s5-0 vert (+ sv-912 8)) (-> obj origin) s1-0)
(vector+float*!
(-> s5-0 vert (+ sv-912 8))
(-> s5-0 vert (+ sv-912 8))
s0-0
(the float sv-912)
)
(set! sv-912 (+ sv-912 1))
)
(dotimes (s0-1 8)
(set! sv-928 vector+float*!)
(set! sv-944 (-> s5-0 vert s0-1))
(set! sv-960 (-> obj origin))
(set! sv-976 s1-0)
(let ((a3-1 (cos (* 2048.0 (the float (- 7 s0-1))))))
(sv-928 sv-944 sv-960 sv-976 a3-1)
)
(set! sv-992 vector+float*!)
(set! sv-1008 (-> s5-0 vert s0-1))
(set! sv-1024 (-> s5-0 vert s0-1))
(set! sv-1040 (-> obj axis))
(let
((a3-2 (* (- (-> obj radius)) (sin (* 2048.0 (the float (- 7 s0-1)))))))
(sv-992 sv-1008 sv-1024 sv-1040 a3-2)
)
(set! sv-1056 vector+float*!)
(set! sv-1072 (-> s5-0 vert (+ s0-1 16)))
(set! sv-1088 (-> obj origin))
(set! sv-1104 s1-0)
(let ((a3-3 (cos (* 2048.0 (the float s0-1)))))
(sv-1056 sv-1072 sv-1088 sv-1104 a3-3)
)
(set! sv-1120 vector+float*!)
(set! sv-1136 (-> s5-0 vert (+ s0-1 16)))
(set! sv-1152 (-> s5-0 vert (+ s0-1 16)))
(set! sv-1168 (-> obj axis))
(let ((a3-4 (+ (-> obj length)
(* (-> obj radius) (sin (* 2048.0 (the float s0-1))))
)
)
)
(sv-1120 sv-1136 sv-1152 sv-1168 a3-4)
)
)
(dotimes (s2-1 16)
(dotimes (s1-1 24)
(vector-matrix*! (-> s4-0 vert s1-1) (-> s5-0 vert s1-1) s3-0)
(camera-line (-> s5-0 vert s1-1) (-> s4-0 vert s1-1) arg0)
(if (nonzero? s1-1)
(camera-line (-> s5-0 vert s1-1) (-> s5-0 vert (+ s1-1 -1)) arg0)
)
)
(let ((v1-77 s5-0))
(set! s5-0 s4-0)
(set! s4-0 v1-77)
)
)
)
)
0
(none)
)
)
(defun ray-arbitrary-circle-intersect ((probe-origin vector) (probe-dir vector) (circle-origin vector) (circle-normal vector) (radius float))
"Intersect a ray with a non-axis-aligned circle."
(let* ((v1-1 (vector-! (new 'stack-no-clear 'vector) circle-origin probe-origin)) ;; circle -> probe offset
(f0-2 (/ (vector-dot v1-1 circle-normal) (vector-dot probe-dir circle-normal)))
)
(cond
((or (< 1.0 f0-2) (< f0-2 0.0))
-100000000.0
)
((let ((a0-7 (new 'stack-no-clear 'vector)))
(vector-float*! a0-7 probe-dir f0-2)
(vector-! a0-7 a0-7 v1-1)
(< (vector-dot a0-7 a0-7) (* radius radius))
)
f0-2
)
(else
-100000000.0
)
)
)
)
(defmethod ray-flat-cyl-intersect cylinder-flat ((obj cylinder-flat) (probe-origin vector) (probe-dir vector))
"Intersect with a real cylinder."
(let ((gp-0 (new 'stack-no-clear 'vector))
(end-pt (new 'stack-no-clear 'vector))
)
0.0
0.0
;; walls
(let ((result (ray-cylinder-intersect
probe-origin
probe-dir
(-> obj origin)
(-> obj axis)
(-> obj radius)
(-> obj length)
gp-0
)
)
)
;; one end cap
(let ((u-origin-circle (ray-arbitrary-circle-intersect
probe-origin
probe-dir
(-> obj origin)
(-> obj axis)
(-> obj radius)
)
)
)
(when (and (>= u-origin-circle 0.0) (or (< result 0.0) (< u-origin-circle result)))
(set! result u-origin-circle)
(set! (-> gp-0 quad) (-> obj origin quad))
)
)
;; get other end cap
(vector+float*! end-pt (-> obj origin) (-> obj axis) (-> obj length))
(let ((u-end-circle (ray-arbitrary-circle-intersect
probe-origin
probe-dir
end-pt
(-> obj axis)
(-> obj radius)
)
)
)
(when (and (>= u-end-circle 0.0) (or (< result 0.0) (< u-end-circle result)))
(set! result u-end-circle)
(set! (-> gp-0 quad) (-> end-pt quad))
)
)
result
)
)
)
;; debug draw for cylinder flat.
(deftype cylinder-flat-verts (structure)
((vert vector 10 :inline :offset-assert 0)
)
:method-count-assert 9
:size-assert #xa0
:flag-assert #x9000000a0
)
(defmethod debug-draw cylinder-flat ((obj cylinder-flat) (arg0 vector))
(local-vars (sv-448 vector) (sv-464 int))
(rlet ((vf0 :class vf)
(vf4 :class vf)
(vf5 :class vf)
(vf6 :class vf)
)
(init-vf0-vector)
(let ((s1-0 (new 'stack-no-clear 'vector))
(s0-0 (new 'stack-no-clear 'vector))
)
(if (< 0.999 (fabs (-> obj axis y)))
(vector-cross! s1-0 (-> obj axis) (new 'static 'vector :z 1.0))
(vector-cross! s1-0 (-> obj axis) (new 'static 'vector :y 1.0))
)
(vector-normalize! s1-0 (-> obj radius))
(vector-float*! s0-0 (-> obj axis) (* 0.14285715 (-> obj length)))
(let ((s5-0 (new 'stack-no-clear 'cylinder-flat-verts))
(s4-0 (new 'stack-no-clear 'cylinder-flat-verts))
(s3-0 (new 'stack-no-clear 'matrix))
)
(matrix-axis-angle! s3-0 (-> obj axis) 4096.0)
(set! sv-448 (new 'stack-no-clear 'vector))
(vector-matrix*! sv-448 (-> obj origin) s3-0)
(let ((v1-5 (-> s3-0 vector 3)))
(.lvf vf4 (&-> (-> obj origin) quad))
(.lvf vf5 (&-> sv-448 quad))
(.mov.vf vf6 vf0 :mask #b1000)
(.sub.vf vf6 vf4 vf5 :mask #b111)
(.svf (&-> v1-5 quad) vf6)
)
(set! sv-464 0)
(while (< sv-464 8)
(vector+! (-> s5-0 vert (+ sv-464 1)) (-> obj origin) s1-0)
(vector+float*!
(-> s5-0 vert (+ sv-464 1))
(-> s5-0 vert (+ sv-464 1))
s0-0
(the float sv-464)
)
(set! sv-464 (+ sv-464 1))
)
(set! (-> s5-0 vert 0 quad) (-> obj origin quad))
(vector+float*!
(-> s5-0 vert 9)
(-> obj origin)
(-> obj axis)
(-> obj length)
)
(dotimes (s2-1 16)
(dotimes (s1-1 10)
(vector-matrix*! (-> s4-0 vert s1-1) (-> s5-0 vert s1-1) s3-0)
(camera-line (-> s5-0 vert s1-1) (-> s4-0 vert s1-1) arg0)
(if (nonzero? s1-1)
(camera-line (-> s5-0 vert s1-1) (-> s5-0 vert (+ s1-1 -1)) arg0)
)
)
(let ((v1-43 s5-0))
(set! s5-0 s4-0)
(set! s4-0 v1-43)
)
)
)
)
0
(none)
)
)
+13 -4
View File
@@ -34,13 +34,16 @@
)
(deftype sprite-array-2d (basic)
((num-sprites uint32 2 :offset-assert 4)
(num-valid uint32 2 :offset-assert 12)
((num-sprites int32 2 :offset-assert 4)
(num-valid int32 2 :offset-assert 12)
(vec-data uint32 :offset-assert 20)
(adgif-data uint32 :offset-assert 24)
(pad uint128 4 :offset-assert 32)
(data uint128 1 :offset-assert 96)
)
(:methods
(new (symbol type int int) _type_ 0)
)
:method-count-assert 9
:size-assert #x70
:flag-assert #x900000070
@@ -73,13 +76,19 @@
)
(deftype sprite-array-3d (basic)
((num-sprites uint32 2 :offset-assert 4)
(num-valid uint32 2 :offset-assert 12)
((num-sprites int32 2 :offset-assert 4)
(num-valid int32 2 :offset-assert 12)
(vec-data uint32 :offset-assert 20)
(adgif-data uint32 :offset-assert 24)
(data uint128 1 :offset-assert 32)
)
(:methods
(new (symbol type int int) _type_ 0)
)
:method-count-assert 9
:size-assert #x30
:flag-assert #x900000030
)
(define-extern sprite-init-distorter (function dma-buffer uint none))
(define-extern sprite-draw-distorters (function dma-buffer none))
(define-extern sprite-vu1-block vu-function)
File diff suppressed because it is too large Load Diff
+2
View File
@@ -3318,3 +3318,5 @@
(define *texture-pool* (new 'global 'texture-pool))
(define-extern *shadow-middot-texture* texture)
+4 -2
View File
@@ -15,11 +15,11 @@
:size-assert #x4c
:flag-assert #x90000004c
(:methods
(new (symbol type float float) _type_ 0)
(new (symbol type meters meters) _type_ 0)
)
)
(defmethod new subdivide-settings ((allocation symbol) (type-to-make type) (arg0 float) (arg1 float))
(defmethod new subdivide-settings ((allocation symbol) (type-to-make type) (arg0 meters) (arg1 meters))
(let ((v0-0 (object-new allocation type-to-make (the-as int (-> type-to-make size)))))
(dotimes (v1-2 3)
(set! (-> v0-0 close v1-2) arg0)
@@ -192,3 +192,5 @@
(define *terrain-stats* (new 'global 'terrain-stats))
(define *collide-stats* (new 'global 'collide-stats))
(define-extern *subdivide-settings* subdivide-settings)
(define-extern update-subdivide-settings! (function subdivide-settings math-camera int none))
+415 -1
View File
@@ -5,5 +5,419 @@
;; name in dgo: subdivide
;; dgos: GAME, ENGINE
;; This file mainly contains statistics stuff for the background renderers.
;; And the mysterious "gomi stats hack", abbreviated GSH.
(define *subdivide-settings* (new 'global 'subdivide-settings (meters 30.0) (meters 70.0)))
(define *merc-global-stats* (new 'global 'merc-global-stats))
(defun clear-tr-stat ((arg0 tr-stat))
(set! (-> arg0 groups) (the-as uint 0))
(set! (-> arg0 fragments) (the-as uint 0))
(set! (-> arg0 tris) (the-as uint 0))
(set! (-> arg0 dverts) (the-as uint 0))
(set! (-> arg0 instances) (the-as uint 0))
0
(none)
)
;; These contain the groups/frags/tris/dverts/insts statistics.
(define *stat-string-tfrag* (new 'global 'string 128 (the-as string #f)))
(define *stat-string-tfrag-near* (new 'global 'string 128 (the-as string #f)))
(define *stat-string-total* (new 'global 'string 128 (the-as string #f)))
(defun-debug print-tr-stat ((stat tr-stat) (name string) (dest string))
"Print the statistics for stat to dest and to the screen. Also add them to the total stats"
(clear dest)
(when (nonzero? (+ (+ (+ (+ (-> stat groups) (-> stat fragments)) (-> stat tris)) (-> stat dverts)) (-> stat instances)))
(format dest "~0k~4d ~5d ~6d ~6d"
(-> stat groups)
(-> stat fragments)
(-> stat tris)
(-> stat dverts)
)
(format dest "~0k ~7f ~5d ~s"
(/ (* 2.0 (the float (-> stat tris))) (the float (- (-> stat dverts) (-> stat tris))))
(-> stat instances)
name
)
;; print to the screen
(format *stdcon* "~S~%" dest)
;; update total
(+! (-> *terrain-stats* total groups) (-> stat groups))
(+! (-> *terrain-stats* total fragments) (-> stat fragments))
(+! (-> *terrain-stats* total tris) (-> stat tris))
(+! (-> *terrain-stats* total dverts) (-> stat dverts))
(+! (-> *terrain-stats* total instances) (-> stat instances))
)
(none)
)
(defun-debug print-terrain-stats ()
"Print all terrain statistics"
;; make our own profile thing.
(if *debug-segment*
(add-frame (-> *display* frames (-> *display* on-screen) frame profile-bar 0)
'draw
(new 'static 'rgba :r #x40 :b #x40 :a #x80)
)
)
;; print level memory stats
(dotimes (gp-0 (-> *level* length))
(let ((s5-0 (-> *level* level gp-0)))
(when (= (-> s5-0 status) 'active)
(dummy-14 s5-0 #f)
(format *stdcon* "~0k~D ~A ~,,2fK + textures~%"
(-> s5-0 index)
(-> s5-0 name)
(* 0.0009765625 (the float (-> s5-0 mem-usage)))
)
)
)
)
;; print all stats
(format *stdcon* "~0k~%grps frags tris dverts strip insts~%")
(print-tr-stat (-> *terrain-stats* pris) "pris" *temp-string*)
(print-tr-stat (-> *merc-global-stats* merc) "merc" *temp-string*)
(print-tr-stat (-> *merc-global-stats* mercneric) "mercneric" *temp-string*)
(print-tr-stat (-> *terrain-stats* tie-near) "tie-near" *temp-string*)
(print-tr-stat (-> *terrain-stats* tie) "tie" *temp-string*)
(print-tr-stat (-> *terrain-stats* tie-generic) "tie-generic" *temp-string*)
(print-tr-stat (-> *terrain-stats* shrub-near) "shrub-near" *temp-string*)
(print-tr-stat (-> *terrain-stats* shrub) "shrub" *temp-string*)
(print-tr-stat (-> *terrain-stats* tfrag-near) "tfrag-near" *stat-string-tfrag-near*)
(print-tr-stat (-> *terrain-stats* tfrag) "tfrag" *stat-string-tfrag*)
(print-tr-stat (-> *terrain-stats* trans-tfrag) "trans-tfrag" *temp-string*)
(print-tr-stat (-> *terrain-stats* trans-tfrag-near) "trans-tfrag-near" *temp-string*)
(print-tr-stat (-> *terrain-stats* trans-pris) "trans-pris" *temp-string*)
(print-tr-stat (-> *terrain-stats* billboard) "billboard" *temp-string*)
(print-tr-stat (-> *terrain-stats* trans-shrub) "trans-shrub" *temp-string*)
(print-tr-stat (-> *terrain-stats* ocean-mid) "ocean-mid" *temp-string*)
(print-tr-stat (-> *terrain-stats* ocean-near) "ocean-near" *temp-string*)
(format *stdcon* "~0k---------------------------------------------------------------~%")
(print-tr-stat (-> *terrain-stats* total) "total" *stat-string-total*)
(clear-tr-stat (-> *terrain-stats* pris))
(clear-tr-stat (-> *merc-global-stats* merc))
(clear-tr-stat (-> *merc-global-stats* mercneric))
(clear-tr-stat (-> *terrain-stats* shrub-near))
(clear-tr-stat (-> *terrain-stats* tie-near))
(clear-tr-stat (-> *terrain-stats* tie))
(clear-tr-stat (-> *terrain-stats* tie-generic))
(clear-tr-stat (-> *terrain-stats* shrub))
(clear-tr-stat (-> *terrain-stats* tfrag-near))
(clear-tr-stat (-> *terrain-stats* tfrag))
(clear-tr-stat (-> *terrain-stats* trans-tfrag))
(clear-tr-stat (-> *terrain-stats* trans-tfrag-near))
(clear-tr-stat (-> *terrain-stats* trans-pris))
(clear-tr-stat (-> *terrain-stats* billboard))
(clear-tr-stat (-> *terrain-stats* trans-shrub))
(clear-tr-stat (-> *terrain-stats* ocean-mid))
(clear-tr-stat (-> *terrain-stats* ocean-near))
(clear-tr-stat (-> *terrain-stats* total))
(if *debug-segment*
(add-frame
(-> *display* frames (-> *display* on-screen) frame profile-bar 0)
'draw
(new 'static 'rgba :b #xff :a #x80)
)
)
0
(none)
)
(defun update-subdivide-settings! ((settings subdivide-settings) (math-cam math-camera) (idx int))
"Change the subdivide settings."
(set! (-> settings meters 0) (-> settings far idx))
(set! (-> settings meters 4) (-> settings close idx))
(let ((f0-3 (* 0.14285715 (- (-> settings meters 0) (-> settings meters 4)))))
(set! (-> settings meters 3) (+ (-> settings meters 4) (* 0.5 f0-3)))
(set! (-> settings meters 2) (+ (-> settings meters 3) f0-3))
(set! (-> settings meters 1) (+ (-> settings meters 2) (* 2.0 f0-3)))
)
(let ((f0-7 (/ (-> math-cam inv-hmge-scale w) (-> math-cam d))))
(dotimes (v1-5 5)
(set! (-> settings dist v1-5) (* f0-7 (-> settings meters v1-5)))
)
)
(set! (-> *tfrag-work* frag-dists x) (- (-> settings meters 0)))
(set! (-> *tfrag-work* frag-dists y) (- (-> settings meters 1)))
(set! (-> *tfrag-work* frag-dists z) (- (-> settings meters 2)))
(set! (-> *tfrag-work* frag-dists w) (- (-> settings meters 4)))
0
(none)
)
(define *subdivide-settings* (new 'global 'subdivide-settings (meters 30.0) (meters 70.0)))
(defun set-tfrag-dists! ((arg0 (pointer float)))
"TODO - better type for arg0?"
(let ((f2-0 (-> *subdivide-settings* dist 0))
(f1-0 (-> *subdivide-settings* dist 1))
(f0-0 (-> *subdivide-settings* dist 2))
)
(set! (-> arg0 3) f2-0)
(set! (-> arg0 7) f1-0)
(let ((f4-1 (/ 1.0 (- f2-0 f1-0)))
(f3-2 (/ 1.0 (- f1-0 f0-0)))
)
(set! (-> arg0 1) (- f4-1))
(set! (-> arg0 5) (- f3-2))
(set! (-> arg0 0) (* 0.5 f4-1))
(set! (-> arg0 4) (* 0.5 f3-2))
(let ((f2-1 (* f2-0 f4-1))
(f5-7 (* f1-0 f3-2))
)
(set! (-> arg0 9) f2-1)
(set! (-> arg0 13) f5-7)
)
(set! (-> arg0 8) (* (* -0.5 f4-1) f1-0))
(set! (-> arg0 12) (* (* -0.5 f3-2) f0-0))
)
)
(none)
)
(define *terrain-context* (new 'global 'terrain-context))
;; oops, this runs even when not debugging and ends up on global.
(define *perf-stats* (new 'debug 'perf-stat-array 17))
(defmethod print-to-stream perf-stat ((obj perf-stat) (arg0 string) (arg1 basic))
"Print performance info to a stream. But the stream is ignored and it is
printed to the screen."
(format *stdcon* "~3d ~8d ~8d ~6d ~6d"
(-> obj count)
(-> obj cycles)
(-> obj instructions)
(-> obj icache)
(-> obj dcache)
)
(format *stdcon* " ~2d ~2d ~2d"
(-> obj to-vu0-waits)
(-> obj to-spr-waits)
(-> obj from-spr-waits)
)
(format *stdcon* " ~s~%" arg0)
(none)
)
(defenum perf-stat-bucket
(all-code 0)
(mercneric 1)
(tie-generic 2)
(background 3)
(drawable 4)
(tfrag 5)
(tfrag-near 6)
(inst-shrub 7)
(proto-shrub 8)
(inst-tie 9)
(proto-tie-g 10)
(proto-tie 11)
(proto-tie-n 12)
(bones 13)
(nav 14)
(collide 15)
(camera 16))
(defun-debug perf-stat-bucket->string ((arg0 perf-stat-bucket))
(case arg0
(((perf-stat-bucket camera)) "camera")
(((perf-stat-bucket collide)) "collide")
(((perf-stat-bucket nav)) "nav")
(((perf-stat-bucket bones)) "bones")
(((perf-stat-bucket proto-tie-n)) "proto-tie-n")
(((perf-stat-bucket proto-tie)) "proto-tie")
(((perf-stat-bucket proto-tie-g)) "proto-tie-g")
(((perf-stat-bucket inst-tie)) "inst-tie")
(((perf-stat-bucket proto-shrub)) "proto-shrub")
(((perf-stat-bucket inst-shrub)) "inst-shrub")
(((perf-stat-bucket tfrag-near)) "tfrag-near")
(((perf-stat-bucket tfrag)) "tfrag")
(((perf-stat-bucket drawable)) "drawable")
(((perf-stat-bucket background)) "background")
(((perf-stat-bucket tie-generic)) "tie-generic")
(((perf-stat-bucket mercneric)) "mercneric")
(((perf-stat-bucket all-code)) "all-code")
(else "*unknown*")
)
)
;; Set up for the GOMI STATS HACK
(define GSH_ENABLE #f)
(define GSH_BUCKET (the-as bucket-id 3))
(define GSH_WHICH_STAT 1)
(define GSH_MAX_DISPLAY (the-as basic #f))
(define GSH_TIME 64)
(define *gomi-stats-hack* (the-as (inline-array perf-stat) (malloc 'debug (* 52 (+ GSH_TIME 1)))))
(defun-debug start-perf-stat-collection ()
(let ((frame-idx (+ (-> *perf-stats* data 0 frame-number) 1)))
(set! (-> *perf-stats* data 0 frame-number) frame-idx)
(let ((gp-0 (mod frame-idx (the-as uint 34))))
(when GSH_ENABLE
(let ((bucket GSH_BUCKET))
(let ((which-stat GSH_WHICH_STAT))
(set! gp-0 (the-as uint (+ (* bucket 2) (the-as uint which-stat))))
)
(when GSH_MAX_DISPLAY
(let ((stat-idx (logand (-> *perf-stats* data 0 frame-number) (+ GSH_TIME -1))))
(set! (-> *gomi-stats-hack* stat-idx cycles)
(-> *perf-stats* data (the-as int bucket) cycles)
)
(set! (-> *gomi-stats-hack* stat-idx instructions)
(-> *perf-stats* data (the-as int bucket) instructions)
)
(set! (-> *gomi-stats-hack* stat-idx icache)
(-> *perf-stats* data (the-as int bucket) icache)
)
(set! (-> *gomi-stats-hack* stat-idx dcache)
(-> *perf-stats* data (the-as int bucket) dcache)
)
(when (zero? stat-idx)
(set! (-> *gomi-stats-hack* GSH_TIME cycles) (the-as uint 0))
(set! (-> *gomi-stats-hack* GSH_TIME instructions) (the-as uint 0))
(set! (-> *gomi-stats-hack* GSH_TIME icache) (the-as uint 0))
(set! (-> *gomi-stats-hack* GSH_TIME dcache) (the-as uint 0))
(dotimes (v1-22 GSH_TIME)
(if (< (-> *gomi-stats-hack* GSH_TIME cycles) (-> *gomi-stats-hack* v1-22 cycles))
(set! (-> *gomi-stats-hack* GSH_TIME cycles)
(-> *gomi-stats-hack* v1-22 cycles)
)
)
(if (< (-> *gomi-stats-hack* GSH_TIME instructions) (-> *gomi-stats-hack* v1-22 instructions))
(set! (-> *gomi-stats-hack* GSH_TIME instructions)
(-> *gomi-stats-hack* v1-22 instructions)
)
)
(if (< (-> *gomi-stats-hack* GSH_TIME icache) (-> *gomi-stats-hack* v1-22 icache))
(set! (-> *gomi-stats-hack* GSH_TIME icache)
(-> *gomi-stats-hack* v1-22 icache)
)
)
(if (< (-> *gomi-stats-hack* GSH_TIME dcache) (-> *gomi-stats-hack* v1-22 dcache))
(set! (-> *gomi-stats-hack* GSH_TIME dcache)
(-> *gomi-stats-hack* v1-22 dcache)
)
)
)
)
)
(format *stdcon* "~%")
(print-to-stream (-> *gomi-stats-hack* GSH_TIME) "max-value" *stdcon*)
)
)
)
(dotimes (v1-27 17)
(set! (-> *perf-stats* data v1-27 count) (the-as uint 0))
(cond
((!= v1-27 (shr gp-0 1))
(set! (-> *perf-stats* data v1-27 ctrl) (the-as uint 0))
0
)
(else
(let ((a1-63 (logand gp-0 1))
(a0-64 (the-as uint #x80004010))
)
(cond
((zero? a1-63)
(set! a0-64 (the-as uint (+ #x60020 (the-as int a0-64))))
)
((= a1-63 1)
(set! a0-64 (the-as uint (+ #x300c0 (the-as int a0-64))))
)
)
(set! (-> *perf-stats* data v1-27 select) a1-63)
(set! (-> *perf-stats* data v1-27 ctrl) a0-64)
)
(set! (-> *perf-stats* data v1-27 accum0) (the-as uint 0))
(set! (-> *perf-stats* data v1-27 accum1) (the-as uint 0))
(set! (-> *perf-stats* data v1-27 to-vu0-waits) (the-as uint 0))
(set! (-> *perf-stats* data v1-27 to-spr-waits) (the-as uint 0))
(set! (-> *perf-stats* data v1-27 from-spr-waits) (the-as uint 0))
0
)
)
)
)
)
(let* ((v1-31 (-> *perf-stats* data))
(a0-76 (-> v1-31 0 ctrl))
)
(+! (-> v1-31 0 count) 1)
(b! (zero? a0-76) cfg-28)
#|
(.mtc0 Perf r0-0)
(.sync.l)
(.sync.p)
(.mtpc pcr0 r0-0)
(.mtpc pcr1 r0-0)
(.sync.l)
(.sync.p)
(.mtc0 Perf a0-76)
|#
)
(.sync.l)
(.sync.p)
(label cfg-28)
0
0
(none)
)
(defun-debug end-perf-stat-collection ()
(local-vars (r0-0 none) (a0-1 int) (a0-3 int))
(let ((v1-1 (-> *perf-stats* data)))
(b! (zero? (-> v1-1 0 ctrl)) cfg-2)
;;(.mtc0 Perf r0-0)
(.sync.l)
(.sync.p)
;;(.mfpc a0-1 pcr0)
(+! (-> v1-1 0 accum0) (the-as uint a0-1))
;;(.mfpc a0-3 pcr1)
(+! (-> v1-1 0 accum1) (the-as uint a0-3))
)
(label cfg-2)
0
(dotimes (v1-3 17)
(when (nonzero? (-> *perf-stats* data v1-3 ctrl))
(let ((a2-0 (-> *perf-stats* data v1-3 select))
(a1-8 (-> *perf-stats* data v1-3 accum0))
(a0-15 (-> *perf-stats* data v1-3 accum1))
)
(cond
((zero? a2-0)
(set! (-> *perf-stats* data v1-3 cycles) a1-8)
(set! (-> *perf-stats* data v1-3 instructions) a0-15)
)
((= a2-0 1)
(set! (-> *perf-stats* data v1-3 icache) a1-8)
(set! (-> *perf-stats* data v1-3 dcache) a0-15)
)
)
)
)
)
0
(none)
)
(defun-debug print-perf-stats ()
(format *stdcon* "~0k~%count cycles instr icache dcache vu0/to/from~%")
(dotimes (gp-0 17)
(if (nonzero? (-> *perf-stats* data gp-0 count))
(print-to-stream
(-> *perf-stats* data gp-0)
(perf-stat-bucket->string (the-as perf-stat-bucket gp-0))
*stdcon*
)
)
)
0
(none)
)
+2
View File
@@ -251,3 +251,5 @@
:size-assert #x37fc
:flag-assert #x9000037fc
)
(define-extern *tfrag-work* tfrag-work)
+55 -38
View File
@@ -5,55 +5,65 @@
;; name in dgo: bsp-h
;; dgos: GAME, ENGINE
;; The level's layout is stored in a BSP.
;; There is a bsp-header that contains the actual nodes
;; as well as lists of entities and other stuff found in the level.
;; As a result, it is more than just a BSP.
;; The final file in the level DGO is the BSP, and is the largest file.
;; Each level has . There is a bsp-header, and a list of bsp-nodes.
;; The bsp-nodes make up a tree. Each node has a plane and two child nodes.
;; The bsp-header also contains (or references) all of the static level information.
;; The file containing the bsp-header is called the "bt" and is loaded in a special
;; way because that allows it to use all of the remaining level heap memory.
;; This file is very large (>8 MB), and always the last file in a level DGO.
;; In the game, all of these bsp-header files have -vis after their name
;; I believe this means that this is a version of a level that has an associated vis file
;; for precomputed visibility.
(declare-type entity-camera basic)
;; a node in the bsp tree
(deftype bsp-node (structure)
((front int32 :offset-assert 0)
(back int32 :offset-assert 4)
(front-flags uint32 :offset-assert 8)
(back-flags uint32 :offset-assert 12)
(plane vector :inline :offset-assert 16)
((front int32 :offset-assert 0) ;; if > 0, is a pointer to another bsp-node
(back int32 :offset-assert 4) ;; if > 0, is a pointer to another bsp-node
(front-flags uint32 :offset-assert 8) ;; ?
(back-flags uint32 :offset-assert 12) ;; ?
(plane vector :inline :offset-assert 16) ;; the partitioning plane
)
:method-count-assert 9
:size-assert #x20
:flag-assert #x900000020
)
;; This is the object stored first in the level bt (-vis)
;; It is also a drawable, and drawing it will draw the level.
(deftype bsp-header (drawable)
((info file-info :offset 4)
(all-visible-list (pointer uint16) :offset-assert 32)
(visible-list-length int32 :offset-assert 36)
(drawable-trees drawable-tree-array :offset-assert 40)
(pat pointer :offset-assert 44)
(pat-length int32 :offset-assert 48)
(unk-data-0 pointer :offset-assert 52)
(unk-data-0-len int32 :offset-assert 56)
(unk-data-1 pointer :offset-assert 60)
(unk-data-1-len int32 :offset-assert 64)
(unk-zero-0 basic :offset-assert 68)
(name symbol :offset-assert 72)
(nickname symbol :offset-assert 76)
(vis-info level-vis-info 8 :offset-assert 80)
(actors drawable-inline-array-actor :offset-assert 112)
(cameras (array entity-camera) :offset-assert 116)
(nodes (inline-array bsp-node) :offset-assert 120)
(level level :offset-assert 124)
(unk-data-2 uint32 5 :offset-assert 128)
(boxes box8s-array :offset-assert 148)
(unk-data-3 uint32 :offset-assert 152)
(ambients drawable-inline-array-ambient :offset-assert 156)
(unk-data-4 float :offset-assert 160)
(unk-data-5 float :offset-assert 164)
(adgifs adgif-shader-array :offset-assert 168)
(unk-data-6 pointer :offset-assert 172)
(unk-data-7 pointer :offset-assert 176)
(unk-data-8 uint32 55 :offset-assert 180)
((info file-info :offset 4)
(all-visible-list (pointer uint16) :offset-assert 32)
(visible-list-length int32 :offset-assert 36)
(drawable-trees drawable-tree-array :offset-assert 40)
(pat pointer :offset-assert 44)
(pat-length int32 :offset-assert 48)
(texture-remap-table (pointer uint64) :offset-assert 52)
(texture-remap-table-len int32 :offset-assert 56)
(unk-data-1 pointer :offset-assert 60)
(unk-data-1-len int32 :offset-assert 64)
(unk-zero-0 basic :offset-assert 68)
(name symbol :offset-assert 72)
(nickname symbol :offset-assert 76)
(vis-info level-vis-info 8 :offset-assert 80)
(actors drawable-inline-array-actor :offset-assert 112)
(cameras (array entity-camera) :offset-assert 116)
(nodes (inline-array bsp-node) :offset-assert 120)
(level level :offset-assert 124)
(current-leaf-idx uint16 :offset-assert 128)
(unk-data-2 uint16 9 :offset-assert 130)
(boxes box8s-array :offset-assert 148)
(current-bsp-back-flags uint32 :offset-assert 152)
(ambients drawable-inline-array-ambient :offset-assert 156)
(unk-data-4 float :offset-assert 160)
(unk-data-5 float :offset-assert 164)
(adgifs adgif-shader-array :offset-assert 168)
(unk-data-6 pointer :offset-assert 172)
(unk-data-7 pointer :offset-assert 176)
(unk-data-8 uint32 55 :offset-assert 180)
)
:method-count-assert 20
:size-assert #x190
@@ -66,6 +76,7 @@
)
;; seems to be unused?
;; In practice, a normal bsp-header is a game-level.
(deftype game-level (basic)
((master-bsp basic :offset-assert 4)
)
@@ -102,6 +113,7 @@
)
(defun-debug inspect-bsp-tree ((arg0 bsp-header) (arg1 bsp-node))
"Recursively print all nodes in a bsp tree. This makes a huge mess"
(cond
((zero? arg1)
)
@@ -127,6 +139,7 @@
(define-extern map-bsp-tree (function (function bsp-node none) bsp-header bsp-node none))
(defun map-bsp-tree ((arg0 (function bsp-node none)) (arg1 bsp-header) (arg2 bsp-node))
"Recursively apply arg0 to all nodes in the bsp tree"
(cond
((zero? arg2)
)
@@ -169,3 +182,7 @@
:size-assert #x80
:flag-assert #x900000080
)
;; offsets of stuff in the scratchpad during bsp draw.
(defconstant TERRAIN_BSP_SCRATCHPAD #x0)
(defconstant VISIBLE_LIST_SCRATCHPAD #x38b0)
+650
View File
@@ -5,3 +5,653 @@
;; name in dgo: bsp
;; dgos: GAME, ENGINE
;;;;;;;;;;;;;;;
;; memory use
;;;;;;;;;;;;;;;
(defun-recursive mem-usage-bsp-tree none ((header bsp-header) (node bsp-node) (mem-use memory-usage-block) (flags int))
"Update the given mem-use for the memory used by the tree structure itself"
(cond
((zero? node)
)
(else
(+! (-> mem-use data 58 count) 1)
(let ((v1-3 32))
(+! (-> mem-use data 58 used) v1-3)
(+! (-> mem-use data 58 total) (logand -16 (+ v1-3 15)))
)
(if (> (-> node front) 0)
(mem-usage-bsp-tree header (the-as bsp-node (-> node front)) mem-use flags)
)
(if (> (-> node back) 0)
(mem-usage-bsp-tree header (the-as bsp-node (-> node back)) mem-use flags)
)
)
)
(none)
)
(defmethod mem-usage bsp-header ((obj bsp-header) (mem-use memory-usage-block) (flags int))
"Update the memory usage info for this bsp-header.
This will visit all the stuff in the level data."
;; start off by setting the current bsp
(set! (-> mem-use work-bsp) obj)
;; this seems slightly wrong, we count the file-info toward array.
(when (nonzero? (-> obj info))
(set! (-> mem-use length) (max 82 (-> mem-use length)))
(set! (-> mem-use data 81 name) "array")
(+! (-> mem-use data 81 count) 1)
(let ((v1-8 (asize-of (-> obj info))))
(+! (-> mem-use data 81 used) v1-8)
(+! (-> mem-use data 81 total) (logand -16 (+ v1-8 15)))
)
)
;; measure the drawable trees.
(if (nonzero? (-> obj drawable-trees))
(mem-usage (-> obj drawable-trees) mem-use flags)
)
;; add stuff
(set! (-> mem-use length) (max 63 (-> mem-use length)))
(set! (-> mem-use data 43 name) "entity")
(set! (-> mem-use data 44 name) "camera")
(set! (-> mem-use data 62 name) "pat")
(set! (-> mem-use data 58 name) "bsp-node")
(set! (-> mem-use length) (max 57 (-> mem-use length)))
;; add the bsp-header itself
(set! (-> mem-use data 56 name) "bsp-main")
(+! (-> mem-use data 56 count) 1)
(let ((v1-27 400))
(+! (-> mem-use data 56 used) v1-27)
(+! (-> mem-use data 56 total) (logand -16 (+ v1-27 15)))
)
;; add the visible list
(set! (-> mem-use length) (max 60 (-> mem-use length)))
(set! (-> mem-use data 59 name) "bsp-leaf-vis-self")
(+! (-> mem-use data 59 count) 1)
(let ((v1-36 (-> obj visible-list-length)))
(+! (-> mem-use data 59 used) v1-36)
(+! (-> mem-use data 59 total) (logand -16 (+ v1-36 15)))
)
;; add the unk-data-0
(set! (-> mem-use length) (max 58 (-> mem-use length)))
(set! (-> mem-use data 57 name) "bsp-misc")
(+! (-> mem-use data 57 count) 1)
(let ((v1-46 (* (-> obj texture-remap-table-len) 8)))
(+! (-> mem-use data 57 used) v1-46)
(+! (-> mem-use data 57 total) (logand -16 (+ v1-46 15)))
)
;; add the unk-data-1
(set! (-> mem-use length) (max 58 (-> mem-use length)))
(set! (-> mem-use data 57 name) "bsp-misc")
(+! (-> mem-use data 57 count) 1)
(let ((v1-56 (* (-> obj unk-data-1-len) 4)))
(+! (-> mem-use data 57 used) v1-56)
(+! (-> mem-use data 57 total) (logand -16 (+ v1-56 15)))
)
;; add unk-zero-0
(when (nonzero? (-> obj unk-zero-0))
(set! (-> mem-use length) (max 58 (-> mem-use length)))
(set! (-> mem-use data 57 name) "bsp-misc")
(+! (-> mem-use data 57 count) 1)
(let ((v1-68 (asize-of (-> obj unk-zero-0))))
(+! (-> mem-use data 57 used) v1-68)
(+! (-> mem-use data 57 total) (logand -16 (+ v1-68 15)))
)
)
;; add adgifs
(when (nonzero? (-> obj adgifs))
(set! (-> mem-use length) (max 58 (-> mem-use length)))
(set! (-> mem-use data 57 name) "bsp-misc")
(+! (-> mem-use data 57 count) 1)
(let ((v1-80 (asize-of (-> obj adgifs))))
(+! (-> mem-use data 57 used) v1-80)
(+! (-> mem-use data 57 total) (logand -16 (+ v1-80 15)))
)
)
;; add boxes
(when (nonzero? (-> obj boxes))
(set! (-> mem-use length) (max 58 (-> mem-use length)))
(set! (-> mem-use data 57 name) "bsp-misc")
(+! (-> mem-use data 57 count) 1)
(let ((v1-92 (asize-of (-> obj boxes))))
(+! (-> mem-use data 57 used) v1-92)
(+! (-> mem-use data 57 total) (logand -16 (+ v1-92 15)))
)
;; add unk-data-7 (reloated to boxes?)
(when (nonzero? (-> obj unk-data-7))
(set! (-> mem-use length) (max 58 (-> mem-use length)))
(set! (-> mem-use data 57 name) "bsp-misc")
(+! (-> mem-use data 57 count) 1)
(let ((v1-105 (* (-> obj boxes length) 2)))
(+! (-> mem-use data 57 used) v1-105)
(+! (-> mem-use data 57 total) (logand -16 (+ v1-105 15)))
)
)
)
;; add unk-data-6
(when (nonzero? (-> obj unk-data-6))
(set! (-> mem-use length) (max 58 (-> mem-use length)))
(set! (-> mem-use data 57 name) "bsp-misc")
(+! (-> mem-use data 57 count) 1)
;; add actors
(let ((v1-118 (* (-> obj actors length) 4)))
(+! (-> mem-use data 57 used) v1-118)
(+! (-> mem-use data 57 total) (logand -16 (+ v1-118 15)))
)
)
;; add pat
(+! (-> mem-use data 62 count) (-> obj pat-length))
(let ((v1-125 (* (-> obj pat-length) 4)))
(+! (-> mem-use data 62 used) v1-125)
(+! (-> mem-use data 62 total) (logand -16 (+ v1-125 15)))
)
;; add cameras
(let ((s3-0 (-> obj cameras)))
(when (nonzero? s3-0)
(dotimes (s2-0 (-> s3-0 length))
(mem-usage (-> s3-0 s2-0) mem-use (logior flags 256))
)
)
)
;; add the tree itself
(mem-usage-bsp-tree obj (the-as bsp-node (-> obj nodes)) mem-use flags)
obj
)
(defmethod login bsp-header ((obj bsp-header))
"Main login for a level"
;; login our drawables
(if (nonzero? (-> obj drawable-trees))
(login (-> obj drawable-trees))
)
;; login our shaders
(when (nonzero? (-> obj adgifs))
(let ((s5-0 (-> obj adgifs)))
(dotimes (s4-0 (-> s5-0 length))
(adgif-shader-login-no-remap (-> s5-0 data s4-0))
)
)
)
obj
)
(define *test-shrub* 0) ;; unused.
(defmethod draw bsp-header ((obj bsp-header) (other-draw drawable) (disp-frame display-frame))
"Draw the level"
(local-vars (a3-4 uint128) (a3-5 uint128) (r0 uint128))
(set! r0 (the-as uint128 0))
(let ((lev (-> obj level)))
;; set up some stuff in the scratchpad
(set! (-> (scratchpad-object terrain-bsp :offset TERRAIN_BSP_SCRATCHPAD) lev-index) (-> lev index))
(set! (-> (scratchpad-object terrain-bsp :offset TERRAIN_BSP_SCRATCHPAD) mood) (-> lev mood))
;; update the subdivision settings
(if *artist-use-menu-subdiv*
(update-subdivide-settings! *subdivide-settings* *math-camera* 3)
(update-subdivide-settings! *subdivide-settings* *math-camera* (-> lev index))
)
;; at this point we are no longer adding textures, so we can mark the end of the
;; textures with interrupts to get rendering VIF interrupts for profiling.
(add-irq-to-tex-buckets! lev)
;; upload the visible list to the scratchpad.
;; this goes at the end of the scratchpad.
(let ((vis-list-qwc (/ (+ (-> obj visible-list-length) 15) 16)))
(dma-send-to-spr-no-flush
(scratchpad-object uint :offset VISIBLE_LIST_SCRATCHPAD)
(the-as uint (-> lev vis-bits))
(the-as uint vis-list-qwc)
#f
)
)
)
;; this is a race condition with the previous DMA transfer.
;; probably the DMA wins though.
;; this messes with the visibility bits to invert what was just uploaded
(when *artist-flip-visible*
(let ((vis-list-qwc2 (/ (+ (-> obj visible-list-length) 15) 16))
(vis-list-spad (scratchpad-object (pointer uint128) :offset VISIBLE_LIST_SCRATCHPAD))
(vis-list-lev (the-as (pointer uint128) (-> obj all-visible-list)))
)
;; iterate through all qw's in the visible list.
(dotimes (current-qw vis-list-qwc2)
;; invert the stuff in the spad list
(let ((a3-3 (-> vis-list-spad current-qw)))
;; note: this isn't great x86 code, but it's probably fine.
(.pnor a3-4 a3-3 r0)
)
;; and with the all visible list so we don't
;; accidentally turn on the vis bit for something that
;; doesn't exist.
(let ((t0-2 (-> vis-list-lev current-qw)))
(.pand a3-5 a3-4 t0-2)
)
(set! (-> vis-list-spad current-qw) a3-5)
)
)
)
;; set up the math camera registers
(let ((at-0 *math-camera*))
(with-vf (vf16 vf17 vf18 vf19 vf20 vf21 vf22 vf23 vf24 vf25 vf26 vf27 vf28 vf29 vf30 vf31)
:rw 'write
(.lvf vf16 (&-> at-0 plane 0))
(.lvf vf17 (&-> at-0 plane 1))
(.lvf vf18 (&-> at-0 plane 2))
(.lvf vf19 (&-> at-0 plane 3))
(.lvf vf20 (&-> at-0 shrub-mat vector 0 quad))
(.lvf vf21 (&-> at-0 shrub-mat vector 1 quad))
(.lvf vf22 (&-> at-0 shrub-mat vector 2 quad))
(.lvf vf23 (&-> at-0 shrub-mat vector 3 quad))
(.lvf vf24 (&-> at-0 camera-rot vector 0 quad))
(.lvf vf25 (&-> at-0 camera-rot vector 1 quad))
(.lvf vf26 (&-> at-0 camera-rot vector 2 quad))
(.lvf vf27 (&-> at-0 camera-rot vector 3 quad))
(.lvf vf28 (&-> at-0 camera-temp vector 0 quad))
(.lvf vf29 (&-> at-0 camera-temp vector 1 quad))
(.lvf vf30 (&-> at-0 camera-temp vector 2 quad))
(.lvf vf31 (&-> at-0 camera-temp vector 3 quad))
)
)
;; draw the drawables!
;; start a profile bar.
(when (nonzero? (-> obj drawable-trees))
(if *debug-segment*
(add-frame (-> *display* frames (-> *display* on-screen) frame profile-bar 0)
'draw
(new 'static 'rgba :r #x40 :b #x40 :a #x80)
)
)
;; draw!
(let ((a1-7 (-> obj drawable-trees)))
(draw a1-7 a1-7 disp-frame)
)
;; end a profile bar
(if *debug-segment*
(add-frame (-> *display* frames (-> *display* on-screen) frame profile-bar 0)
'draw
(new 'static 'rgba :r #x80 :g #xc0 :a #x80)
)
)
)
;; run the foreground system
(let ((s5-1 (-> *display* frames (-> *display* on-screen) frame)))
;; 0
(foreground-engine-execute
(-> obj level foreground-draw-engine 0)
s5-1
(-> (scratchpad-object terrain-bsp :offset TERRAIN_BSP_SCRATCHPAD) lev-index)
0
)
;; 1
(foreground-engine-execute
(-> obj level foreground-draw-engine 1)
s5-1
(-> (scratchpad-object terrain-bsp :offset TERRAIN_BSP_SCRATCHPAD) lev-index)
1
)
;; 2
(foreground-engine-execute
(-> obj level foreground-draw-engine 2)
s5-1
(-> (scratchpad-object terrain-bsp :offset TERRAIN_BSP_SCRATCHPAD) lev-index)
2
)
)
(none)
)
(defmethod dummy-15 bsp-header ((obj bsp-header) (arg0 object) (arg1 object))
"This is some sort of debugging thing. It calls dummy-15 on the drawables
with the scratchpad and vfs set up."
(let ((s4-0 (-> obj level)))
;; set up some stuff in the scratchpad
(set! (-> (scratchpad-object terrain-bsp :offset TERRAIN_BSP_SCRATCHPAD) lev-index) (-> s4-0 index))
(set! (-> (scratchpad-object terrain-bsp :offset TERRAIN_BSP_SCRATCHPAD) mood) (-> s4-0 mood))
(add-irq-to-tex-buckets! s4-0)
(let ((a2-1 (/ (+ (-> obj visible-list-length) 15) 16)))
(dma-send-to-spr-no-flush
(scratchpad-object uint :offset VISIBLE_LIST_SCRATCHPAD)
(the-as uint (-> s4-0 vis-bits))
(the-as uint a2-1)
#f
)
)
)
(let ((at-0 *math-camera*))
(with-vf (vf16 vf17 vf18 vf19 vf20 vf21 vf22 vf23 vf24 vf25 vf26 vf27 vf28 vf29 vf30 vf31)
:rw 'write
(.lvf vf16 (&-> at-0 plane 0))
(.lvf vf17 (&-> at-0 plane 1))
(.lvf vf18 (&-> at-0 plane 2))
(.lvf vf19 (&-> at-0 plane 3))
(.lvf vf20 (&-> at-0 shrub-mat vector 0 quad))
(.lvf vf21 (&-> at-0 shrub-mat vector 1 quad))
(.lvf vf22 (&-> at-0 shrub-mat vector 2 quad))
(.lvf vf23 (&-> at-0 shrub-mat vector 3 quad))
(.lvf vf24 (&-> at-0 camera-rot vector 0 quad))
(.lvf vf25 (&-> at-0 camera-rot vector 1 quad))
(.lvf vf26 (&-> at-0 camera-rot vector 2 quad))
(.lvf vf27 (&-> at-0 camera-rot vector 3 quad))
(.lvf vf28 (&-> at-0 camera-temp vector 0 quad))
(.lvf vf29 (&-> at-0 camera-temp vector 1 quad))
(.lvf vf30 (&-> at-0 camera-temp vector 2 quad))
(.lvf vf31 (&-> at-0 camera-temp vector 3 quad))
)
)
(when (nonzero? (-> obj drawable-trees))
(if *debug-segment*
(add-frame (-> *display* frames (-> *display* on-screen) frame profile-bar 0)
'draw
(new 'static 'rgba :r #x40 :b #x40 :a #x80)
)
)
(let ((a1-3 (-> obj drawable-trees)))
(dummy-15 a1-3 a1-3 arg1)
)
(if *debug-segment*
(add-frame (-> *display* frames (-> *display* on-screen) frame profile-bar 0)
'draw
(new 'static 'rgba :r #x80 :g #xc0 :a #x80)
)
)
)
(none)
)
(defmethod dummy-14 bsp-header ((obj bsp-header))
"Also some sort of debug thing.
Calls dummy-14 on children with visible list and vfs set up
but no terrain-bsp"
(let ((v1-0 (-> obj level))
(a2-0 (/ (+ (-> obj visible-list-length) 15) 16))
)
(dma-send-to-spr-no-flush
(scratchpad-object uint :offset VISIBLE_LIST_SCRATCHPAD)
(the-as uint (-> v1-0 vis-bits))
(the-as uint a2-0)
#f
)
)
(let ((at-0 *math-camera*))
(with-vf (vf16 vf17 vf18 vf19 vf20 vf21 vf22 vf23 vf24 vf25 vf26 vf27 vf28 vf29 vf30 vf31)
:rw 'write
(.lvf vf16 (&-> at-0 plane 0))
(.lvf vf17 (&-> at-0 plane 1))
(.lvf vf18 (&-> at-0 plane 2))
(.lvf vf19 (&-> at-0 plane 3))
(.lvf vf20 (&-> at-0 shrub-mat vector 0 quad))
(.lvf vf21 (&-> at-0 shrub-mat vector 1 quad))
(.lvf vf22 (&-> at-0 shrub-mat vector 2 quad))
(.lvf vf23 (&-> at-0 shrub-mat vector 3 quad))
(.lvf vf24 (&-> at-0 camera-rot vector 0 quad))
(.lvf vf25 (&-> at-0 camera-rot vector 1 quad))
(.lvf vf26 (&-> at-0 camera-rot vector 2 quad))
(.lvf vf27 (&-> at-0 camera-rot vector 3 quad))
(.lvf vf28 (&-> at-0 camera-temp vector 0 quad))
(.lvf vf29 (&-> at-0 camera-temp vector 1 quad))
(.lvf vf30 (&-> at-0 camera-temp vector 2 quad))
(.lvf vf31 (&-> at-0 camera-temp vector 3 quad))
)
)
(if (nonzero? (-> obj drawable-trees))
(dummy-14 (-> obj drawable-trees))
)
(none)
)
(defun bsp-camera-asm ((bsp-hdr bsp-header) (camera-pos vector))
"Look up the camera position in the bsp tree.
The result is stored in the bsp-hdr current-leaf-idx"
(local-vars (v1-1 int) (real-node bsp-node))
(rlet ((vf1 :class vf)
(vf2 :class vf)
)
(nop!)
;; next-node contains the node (or child) that we will check next.
(let ((next-node (the-as bsp-node (-> bsp-hdr nodes))))
;; vf1 = camera position always
(.lvf vf1 (&-> camera-pos quad))
;; top of loop that traverses the tree
(label cfg-1)
;; branch if twe got a child
(b! (< (the-as int next-node) 0) cfg-4 :delay (set! real-node next-node))
;; load the plane
(.lvf vf2 (&-> real-node plane quad))
;; elementwise multiply xyz
(.mul.vf vf2 vf2 vf1 :mask #b111)
;; then horizontal sum, putting result in y.
(.add.x.vf vf2 vf2 vf2 :mask #b10)
(.add.z.vf vf2 vf2 vf2 :mask #b10)
(.sub.w.vf vf2 vf2 vf2 :mask #b10)
;; move the result into v1-1.
;; the sign bit of float y is now the sign bit of the int v1-1
(.mov v1-1 vf2)
(let ((a2-0 (-> real-node front-flags)))
;; branch to loop top, if we haven't gotten to the bottom
(b! (>= (the-as int v1-1) 0)
cfg-1
;; in the dealy slot, advance the node
:delay (set! next-node (the-as bsp-node (-> real-node front)))
)
;; otherwise, we are on the back side.
(set! a2-0 (-> real-node back-flags))
(b! #t cfg-1 :delay (set! next-node (the-as bsp-node (-> real-node back))))
;; here we got a child.
(label cfg-4)
(set! (-> bsp-hdr current-leaf-idx) (the-as uint next-node))
;; back flags is a bit confusing name.
;; it's actually the flags for whatever side we are on of the
;; lowest node.
(set! (-> bsp-hdr current-bsp-back-flags) a2-0)
)
)
0
(none)
)
)
;;;;;;;;;;;;;;;
;; Collision
;;;;;;;;;;;;;;;
(defmethod dummy-11 bsp-header ((obj bsp-header) (arg0 int) (arg1 object))
(+! (-> *collide-stats* calls) 1)
(let ((s4-0 (-> obj drawable-trees)))
(dotimes (s3-0 (-> s4-0 length))
(dummy-11 (-> s4-0 data s3-0) arg0 arg1)
)
)
(none)
)
(defmethod dummy-12 bsp-header ((obj bsp-header) (arg0 int) (arg1 object))
(+! (-> *collide-stats* calls) 1)
(let ((s4-0 (-> obj drawable-trees)))
(dotimes (s3-0 (-> s4-0 length))
(dummy-12 (-> s4-0 data s3-0) arg0 arg1)
)
)
(none)
)
(defmethod dummy-13 bsp-header ((obj bsp-header) (arg0 int) (arg1 object))
(+! (-> *collide-stats* calls) 1)
(let ((s4-0 (-> obj drawable-trees)))
(dotimes (s3-0 (-> s4-0 length))
(dummy-13 (-> s4-0 data s3-0) arg0 arg1)
)
)
(none)
)
(defmethod dummy-17 bsp-header ((obj bsp-header) (arg0 sphere) (arg1 int) (arg2 ambient-list))
(let ((s3-0 (-> obj drawable-trees)))
(dotimes (s2-0 (-> s3-0 length))
(dummy-17 (-> s3-0 data s2-0) arg0 arg1 arg2)
)
)
(none)
)
(defun clear-cl-stat ((arg0 cl-stat))
"Reset stats"
(set! (-> arg0 fragments) (the-as uint 0))
(set! (-> arg0 tris) (the-as uint 0))
(set! (-> arg0 output) (the-as uint 0))
0
(none)
)
(defun print-cl-stat ((arg0 cl-stat) (arg1 string))
"Print stats for arg1"
(when (nonzero? (+ (-> arg0 fragments) (-> arg0 tris)))
(format
*stdcon*
"~0k~5d/~d ~6d/~d ~6d/~d "
(-> arg0 fragments)
(/ (-> arg0 fragments) (-> *collide-stats* calls))
(-> arg0 tris)
(/ (-> arg0 tris) (-> *collide-stats* calls))
(-> arg0 output)
(/ (-> arg0 output) (-> *collide-stats* calls))
)
(format *stdcon* "~0k~s~%" arg1)
(+! (-> *collide-stats* total fragments) (-> arg0 fragments))
(+! (-> *collide-stats* total tris) (-> arg0 tris))
(+! (-> *collide-stats* total output) (-> arg0 output))
)
(none)
)
(defun print-collide-stats ()
"Print and reset collide stats for this frame"
;; for some unknown reason, we profile this.
(if *debug-segment*
(add-frame (-> *display* frames (-> *display* on-screen) frame profile-bar 0)
'draw
(new 'static 'rgba :r #x40 :b #x40 :a #x80)
)
)
(format *stdcon* "~0k frags tris output~%")
(print-cl-stat (-> *collide-stats* other) "other")
(format *stdcon* "~0k---------------------------------------------------------------~%")
(print-cl-stat (-> *collide-stats* total) "total")
(format *stdcon* "~0kcalls = ~d~%" (-> *collide-stats* calls))
;; figure out how long we spent in each
(let ((gp-0 (stopwatch-elapsed-ticks (-> *collide-stats* total-target)))
(s4-0 (stopwatch-elapsed-ticks (-> *collide-stats* target-cache-fill)))
(s5-0 (stopwatch-elapsed-ticks (-> *collide-stats* target-ray-poly)))
)
(format *stdcon* "~0ktotal-target ~D~%" gp-0)
;; these can divide by zero if it doesn't run.
(format *stdcon* "~0ktarget-cache-fill ~D ~0,,2f%~%"
s4-0
(/ (* 100.0 (the float s4-0)) (the float gp-0))
)
(format *stdcon* "~0ktarget-ray-poly ~D ~0,,2f%~%"
s5-0
(/ (* 100.0 (the float s5-0)) (the float gp-0))
)
)
;; reset
(clear-cl-stat (-> *collide-stats* other))
(clear-cl-stat (-> *collide-stats* total))
(set! *collide-nodes* 0)
(set! (-> *collide-stats* calls) (the-as uint 0))
(stopwatch-init (-> *collide-stats* total-target))
(stopwatch-init (-> *collide-stats* target-cache-fill))
(stopwatch-init (-> *collide-stats* target-ray-poly))
(if *debug-segment*
(add-frame (-> *display* frames (-> *display* on-screen) frame profile-bar 0)
'draw
(new 'static 'rgba :b #xff :a #x80)
)
)
0
(none)
)
(defun level-remap-texture ((tex-id texture-id))
"Levels can request textures to be remapped during login"
(let ((bsp-hdr (-> *level* log-in-level-bsp)))
(when bsp-hdr
(let* ((table-size (-> bsp-hdr texture-remap-table-len)) ;; in 64-bit entries
(table-data-start (-> bsp-hdr texture-remap-table))
(table-data-ptr table-data-start)
(mask1 (the-as uint #xfffffff8)) ;; mask for table entry addresses
(masked-tex-id (logand (the-as uint #xffffff00) tex-id)) ;; bits of tex-id we care about
(table-data-end (&+ table-data-ptr (* table-size 8)))
)
;; top of binary search
(label cfg-2)
;; if we didn't find anything, quit
(b! (= table-data-start table-data-end) cfg-8)
;; find the middle entry.
(let ((midpoint (logand (/ (+ (the-as int table-data-start) (the-as int table-data-end)) 2)
mask1
)
)
)
;; how did we do?
(let ((diff (- (-> (the-as (pointer int32) midpoint) 0) (the-as int masked-tex-id))))
(b! (zero? diff) cfg-7)
(b! (< diff 0) cfg-6 :delay (nop!))
)
;; in the lower section
(b! #t cfg-2
:delay
(set! table-data-end (the-as (pointer uint64) midpoint))
)
;; in the upper section (not including the midpoint)
(label cfg-6)
(b! #t cfg-2
:delay
(set! table-data-start (the-as (pointer uint64) (+ (the-as int midpoint) 8)))
)
;; exact match
(label cfg-7)
;; not sure what this logior with 20 is about.
(set! tex-id
(the-as texture-id (logior (-> (the-as (pointer int32) midpoint) 1) 20))
)
)
)
(label cfg-8)
0
)
)
(the-as texture-id tex-id)
)
+16 -16
View File
@@ -176,25 +176,25 @@
;; don't belong to any level, for example to render Jak.
(declare-type entity-links structure)
(deftype level-group (basic)
((length int32 :offset-assert 4)
(log-in-level level :offset-assert 8) ;; level currently logging in
(loading-level level :offset-assert 12) ;; currently loading
(entity-link entity-links :offset-assert 16) ;; not sure what's going on here
(border? basic :offset-assert 20)
(vis? basic :offset-assert 24)
(want-level basic :offset-assert 28)
(receiving-level basic :offset-assert 32)
(load-commands pair :offset-assert 36)
(play? symbol :offset-assert 40)
((length int32 :offset-assert 4)
(log-in-level-bsp bsp-header :offset-assert 8) ;; level currently logging in
(loading-level level :offset-assert 12) ;; currently loading
(entity-link entity-links :offset-assert 16) ;; not sure what's going on here
(border? basic :offset-assert 20)
(vis? basic :offset-assert 24)
(want-level basic :offset-assert 28)
(receiving-level basic :offset-assert 32)
(load-commands pair :offset-assert 36)
(play? symbol :offset-assert 40)
;; there's something? from 40 -> 96.
(_hack-pad uint8 :offset 90)
(level0 level :inline :offset-assert 96)
(level1 level :inline :offset-assert 2704)
(level-default level :inline :offset-assert 5312)
(level0 level :inline :offset-assert 96)
(level1 level :inline :offset-assert 2704)
(level-default level :inline :offset-assert 5312)
;; this actually went earlier,
(level level 3 :inline :offset 96)
(level level 3 :inline :offset 96)
;; and this one too. why another one?
(data level 3 :score -1 :inline :offset 96)
(data level 3 :score -1 :inline :offset 96)
(pad uint32)
)
:method-count-assert 27
@@ -232,7 +232,7 @@
(set! *level*
(new 'static 'level-group
:length 2
:log-in-level #f
:log-in-level-bsp #f
:loading-level #f
:entity-link #f
:border? #f
+8 -8
View File
@@ -456,7 +456,7 @@
(set! loading-level (-> obj heap))
(set! (-> *level* loading-level) obj)
(set! (-> *level* log-in-level) #f)
(set! (-> *level* log-in-level-bsp) #f)
(set! (-> obj nickname) #f)
(set! (-> obj bsp) #f)
(set! (-> obj entity) #f)
@@ -487,7 +487,7 @@
(set! (-> *texture-pool* allocate-func) texture-page-default-allocate)
(cond
((-> obj bsp)
(set! (-> *level* log-in-level) (the-as level (-> obj bsp)))
(set! (-> *level* log-in-level-bsp) (-> obj bsp))
;; TODO
;;(login-level-textures *texture-pool* obj (-> obj bsp unk-data-1-len) (the-as (pointer texture-id) (-> obj bsp unk-data-1)))
(let ((bsp (-> obj bsp)))
@@ -702,7 +702,7 @@
(set! (-> loaded-level status) 'loaded)
(set! loading-level global)
(set! (-> *level* loading-level) (-> *level* level-default))
(set! (-> *level* log-in-level) #f)
(set! (-> *level* log-in-level-bsp) #f)
0
;;(.mfc0 v1-154 Count)
;;(- v1-154 initial-timer)
@@ -717,10 +717,10 @@
(('loaded)
(protect (loading-level
(-> *level* loading-level)
(-> *level* log-in-level)
(-> *level* log-in-level-bsp)
)
(set! loading-level (-> obj heap))
(set! (-> *level* log-in-level) (the-as level (-> obj bsp)))
(set! (-> *level* log-in-level-bsp) (-> obj bsp))
(set! (-> *level* loading-level) obj)
;; (dummy-18 (-> obj bsp)) TODO
(set! (-> obj status) 'alive)
@@ -767,8 +767,8 @@
)
)
)
(if (= (-> *level* log-in-level) (-> obj bsp))
(set! (-> *level* log-in-level) #f)
(if (= (-> *level* log-in-level-bsp) (-> obj bsp))
(set! (-> *level* log-in-level-bsp) #f)
)
obj
)
@@ -852,7 +852,7 @@
(when (= (-> *level* loading-level) obj)
(set! loading-level global)
(set! (-> *level* loading-level) (-> *level* level-default))
(set! (-> *level* log-in-level) #f)
(set! (-> *level* log-in-level-bsp) #f)
)
)
obj
+8 -7
View File
@@ -411,6 +411,7 @@
(set! (-> box8s-array heap-base) 32)
;; This is really a capsule - a cylinder with spheres at both end
(deftype cylinder (structure)
((origin vector :inline :offset-assert 0)
(axis vector :inline :offset-assert 16)
@@ -421,12 +422,12 @@
:size-assert #x28
:flag-assert #xb00000028
(:methods
(TODO-RENAME-HUGE-9 (_type_ vector) none 9)
(TODO-RENAME-10 (_type_ vector vector) float 10)
)
(debug-draw (_type_ vector) none 9)
(ray-capsule-intersect (_type_ vector vector) float 10)
)
)
;; definition of type cylinder-flat
;; This is a normal cylinder.
(deftype cylinder-flat (structure)
((origin vector :inline :offset-assert 0)
(axis vector :inline :offset-assert 16)
@@ -437,9 +438,9 @@
:size-assert #x28
:flag-assert #xb00000028
(:methods
(TODO-RENAME-HUGE-9 (_type_ vector) none 9)
(TODO-RENAME-10 (_type_ vector vector) float 10)
)
(debug-draw (_type_ vector) none 9)
(ray-flat-cyl-intersect (_type_ vector vector) float 10)
)
)
(deftype vertical-planes (structure)
+1 -1
View File
@@ -1070,7 +1070,7 @@
(defun quad-copy! ((dst pointer) (src pointer) (qwc int))
"Optimized memory copy. The original is pretty clever, but this isn't."
(qmem-copy<-! dst src (* qwc 16))
0
(none)
)
(defun-recursive fact int ((x int))
+5
View File
@@ -589,3 +589,8 @@
`(rlet ((sp :reg rsp :reset-here #t :type pointer))
,@body)
)
(defmacro scratchpad-object (type &key (offset 0))
"Access an object on the scratchpad."
`(the-as ,type (&+ *fake-scratchpad-data* ,offset))
)
+4
View File
@@ -122,6 +122,10 @@
;; it might be possible to also throw them on the *dram-stack*, but they might depend on these
;; not overlapping. We can spare the 16k of memory.
(define *fake-scratchpad-stack* (new 'global 'array 'uint8 (* 16 1024)))
;; similar thing for the scratchpad data.
;; in
(define *fake-scratchpad-data* (new 'global 'array 'uint8 (* 16 1024)))
)
+3
View File
@@ -465,6 +465,9 @@ class Compiler {
Val* compile_asm_ppach(const goos::Object& form, const goos::Object& rest, Env* env);
Val* compile_asm_psubw(const goos::Object& form, const goos::Object& rest, Env* env);
Val* compile_asm_xorp(const goos::Object& form, const goos::Object& rest, Env* env);
Val* compile_asm_por(const goos::Object& form, const goos::Object& rest, Env* env);
Val* compile_asm_pnor(const goos::Object& form, const goos::Object& rest, Env* env);
Val* compile_asm_pand(const goos::Object& form, const goos::Object& rest, Env* env);
// Atoms
+18
View File
@@ -1536,6 +1536,15 @@ std::string IR_Int128Math3Asm::print() {
case Kind::PSUBW:
function = ".psubw";
break;
case Kind::POR:
function = ".por";
break;
case Kind::PXOR:
function = ".pxor";
break;
case Kind::PAND:
function = ".pand";
break;
default:
assert(false);
}
@@ -1583,6 +1592,15 @@ void IR_Int128Math3Asm::do_codegen(emitter::ObjectGenerator* gen,
// psubW on mips is psubD on x86...
gen->add_instr(IGen::vpsubd(dst, src1, src2), irec);
break;
case Kind::POR:
gen->add_instr(IGen::parallel_bitwise_or(dst, src2, src1), irec);
break;
case Kind::PXOR:
gen->add_instr(IGen::parallel_bitwise_xor(dst, src2, src1), irec);
break;
case Kind::PAND:
gen->add_instr(IGen::parallel_bitwise_and(dst, src2, src1), irec);
break;
default:
assert(false);
}
+1 -1
View File
@@ -562,7 +562,7 @@ class IR_VFMath3Asm : public IR_Asm {
class IR_Int128Math3Asm : public IR_Asm {
public:
// these are MIPS names, not x86 names.
enum class Kind { PEXTLW, PEXTUW, PCPYUD, PCPYLD, PCEQW, PSUBW };
enum class Kind { PEXTLW, PEXTUW, PCPYUD, PCPYLD, PCEQW, PSUBW, POR, PXOR, PAND };
IR_Int128Math3Asm(bool use_color,
const RegVal* dst,
const RegVal* src1,
+52
View File
@@ -634,6 +634,58 @@ Val* Compiler::compile_asm_pw_sra(const goos::Object& form, const goos::Object&
return compile_asm_int128_math2_imm_u8(form, rest, IR_Int128Math2Asm::Kind::PW_SRA, env);
}
Val* Compiler::compile_asm_por(const goos::Object& form, const goos::Object& rest, Env* env) {
return compile_asm_int128_math3(form, rest, IR_Int128Math3Asm::Kind::POR, env);
}
bool ireg_is_128_ok(const IRegister& ireg) {
return ireg.reg_class == RegClass::VECTOR_FLOAT || ireg.reg_class == RegClass::INT_128;
}
Val* Compiler::compile_asm_pnor(const goos::Object& form, const goos::Object& rest, Env* env) {
auto args = get_va(form, rest);
va_check(form, args, {{}, {}, {}}, {});
auto dest = compile_error_guard(args.unnamed.at(0), env)->to_reg(env);
auto src1 = compile_error_guard(args.unnamed.at(1), env)->to_reg(env); // rs
auto src2 = compile_error_guard(args.unnamed.at(2), env)->to_reg(env); // rt
auto temp = env->make_ireg(TypeSpec("uint128"), RegClass::INT_128);
if (!ireg_is_128_ok(dest->ireg())) {
throw_compiler_error(args.unnamed.at(0), "bad destination register kind");
}
if (!ireg_is_128_ok(src1->ireg())) {
throw_compiler_error(args.unnamed.at(1), "bad src1 register kind");
}
if (!ireg_is_128_ok(src2->ireg())) {
throw_compiler_error(args.unnamed.at(2), "bad src2 register kind");
}
if (!dest->settable()) {
throw_compiler_error(form, "Cannot set destination");
}
// A NOR is equivalent to an inverted input AND
// Use the destination register and a temp register.
// There is also no PNOT instruction, so the easiest way to is to XOR with an all-ones register
// Remember - we do not want to mutate the source registers!
// How do we create an all-ones-register? Compare it with itself
env->emit_ir<IR_Int128Math3Asm>(true, temp, temp, temp, IR_Int128Math3Asm::Kind::PCEQW);
// Then NOT the first input, store in destination
env->emit_ir<IR_Int128Math3Asm>(true, dest, temp, src1, IR_Int128Math3Asm::Kind::PXOR);
// NOT the second input, we not longer require the all-ones-register
env->emit_ir<IR_Int128Math3Asm>(true, temp, temp, src2, IR_Int128Math3Asm::Kind::PXOR);
// Preform the AND aka NOR
env->emit_ir<IR_Int128Math3Asm>(true, dest, dest, temp, IR_Int128Math3Asm::Kind::PAND);
return get_none();
}
Val* Compiler::compile_asm_pand(const goos::Object& form, const goos::Object& rest, Env* env) {
return compile_asm_int128_math3(form, rest, IR_Int128Math3Asm::Kind::PAND, env);
}
Val* Compiler::compile_asm_pextlw(const goos::Object& form, const goos::Object& rest, Env* env) {
return compile_asm_int128_math3(form, rest, IR_Int128Math3Asm::Kind::PEXTLW, env);
}
+4
View File
@@ -104,6 +104,10 @@ const std::unordered_map<
{".ppach", &Compiler::compile_asm_ppach},
{".psubw", &Compiler::compile_asm_psubw},
{".por", &Compiler::compile_asm_por},
{".pnor", &Compiler::compile_asm_pnor},
{".pand", &Compiler::compile_asm_pand},
// BLOCK FORMS
{"top-level", &Compiler::compile_top_level},
{"begin", &Compiler::compile_begin},
+36 -5
View File
@@ -1,8 +1,5 @@
#pragma once
#ifndef JAK_IGEN_H
#define JAK_IGEN_H
#include "common/util/assert.h"
#include "Register.h"
#include "Instruction.h"
@@ -2555,7 +2552,41 @@ class IGen {
instr.set(Imm(1, imm));
return instr;
}
static Instruction parallel_bitwise_or(Register dst, Register src0, Register src1) {
assert(dst.is_xmm());
assert(src0.is_xmm());
assert(src1.is_xmm());
// VEX.128.66.0F.WIG EB /r VPOR xmm1, xmm2, xmm3/m128
// reg, vex, r/m
Instruction instr(0xEB);
instr.set_vex_modrm_and_rex(dst.hw_id(), src1.hw_id(), VEX3::LeadingBytes::P_0F, src0.hw_id(),
false, VexPrefix::P_66);
return instr;
}
static Instruction parallel_bitwise_xor(Register dst, Register src0, Register src1) {
assert(dst.is_xmm());
assert(src0.is_xmm());
assert(src1.is_xmm());
// VEX.128.66.0F.WIG EF /r VPXOR xmm1, xmm2, xmm3/m128
// reg, vex, r/m
Instruction instr(0xEF);
instr.set_vex_modrm_and_rex(dst.hw_id(), src1.hw_id(), VEX3::LeadingBytes::P_0F, src0.hw_id(),
false, VexPrefix::P_66);
return instr;
}
static Instruction parallel_bitwise_and(Register dst, Register src0, Register src1) {
assert(dst.is_xmm());
assert(src0.is_xmm());
assert(src1.is_xmm());
// VEX.128.66.0F.WIG DB /r VPAND xmm1, xmm2, xmm3/m128
// reg, vex, r/m
Instruction instr(0xDB);
instr.set_vex_modrm_and_rex(dst.hw_id(), src1.hw_id(), VEX3::LeadingBytes::P_0F, src0.hw_id(),
false, VexPrefix::P_66);
return instr;
}
};
} // namespace emitter
#endif // JAK_IGEN_H
+1
View File
@@ -24,6 +24,7 @@ add_executable(goalc-test
${CMAKE_CURRENT_LIST_DIR}/decompiler/test_FormBeforeExpressions.cpp
${CMAKE_CURRENT_LIST_DIR}/decompiler/test_FormExpressionBuild.cpp
${CMAKE_CURRENT_LIST_DIR}/decompiler/test_FormExpressionBuild2.cpp
${CMAKE_CURRENT_LIST_DIR}/decompiler/test_FormExpressionBuild3.cpp
${CMAKE_CURRENT_LIST_DIR}/decompiler/test_FormExpressionBuildLong.cpp
${CMAKE_CURRENT_LIST_DIR}/decompiler/test_InstructionDecode.cpp
${CMAKE_CURRENT_LIST_DIR}/decompiler/test_InstructionParser.cpp
+5
View File
@@ -8,6 +8,7 @@
#include "decompiler/analysis/final_output.h"
#include "decompiler/analysis/stack_spill.h"
#include "decompiler/analysis/insert_lets.h"
#include "decompiler/analysis/inline_asm_rewrite.h"
#include "decompiler/util/config_parsers.h"
#include "common/goos/PrettyPrinter.h"
#include "common/util/json_util.h"
@@ -219,6 +220,10 @@ std::unique_ptr<FormRegressionTest::TestData> FormRegressionTest::make_function(
if (!success) {
return nullptr;
}
rewrite_inline_asm_instructions(test->func.ir2.top_form, *test->func.ir2.form_pool,
test->func, *dts);
// move variables into lets.
insert_lets(test->func, test->func.ir2.env, *test->func.ir2.form_pool,
test->func.ir2.top_form);
@@ -10,6 +10,7 @@
)
;; definition for method 10 of type drawable-tree-collide-fragment
;; INFO: Return type mismatch int vs none.
(defmethod
draw
drawable-tree-collide-fragment
@@ -20,6 +21,7 @@
)
)
0
(none)
)
;; definition for method 16 of type drawable-tree-collide-fragment
@@ -35,8 +37,8 @@
(defmethod
dummy-11
drawable-tree-collide-fragment
((obj drawable-tree-collide-fragment) (arg0 int))
(dummy-11 (-> obj data 0) (-> obj length))
((obj drawable-tree-collide-fragment) (arg0 int) (arg1 object))
(dummy-11 (-> obj data 0) (-> obj length) arg1)
0
(none)
)
@@ -46,8 +48,8 @@
(defmethod
dummy-12
drawable-tree-collide-fragment
((obj drawable-tree-collide-fragment) (arg0 int))
(dummy-12 (-> obj data 0) (-> obj length))
((obj drawable-tree-collide-fragment) (arg0 int) (arg1 object))
(dummy-12 (-> obj data 0) (-> obj length) arg1)
0
(none)
)
@@ -57,8 +59,8 @@
(defmethod
dummy-13
drawable-tree-collide-fragment
((obj drawable-tree-collide-fragment) (arg0 int))
(dummy-13 (-> obj data 0) (-> obj length))
((obj drawable-tree-collide-fragment) (arg0 int) (arg1 object))
(dummy-13 (-> obj data 0) (-> obj length) arg1)
0
(none)
)
@@ -109,14 +111,17 @@
)
;; definition for method 10 of type collide-fragment
;; INFO: Return type mismatch int vs none.
(defmethod
draw
collide-fragment
((obj collide-fragment) (arg0 drawable) (arg1 display-frame))
0
(none)
)
;; definition for method 10 of type drawable-inline-array-collide-fragment
;; INFO: Return type mismatch int vs none.
(defmethod
draw
drawable-inline-array-collide-fragment
@@ -132,6 +137,7 @@
)
)
0
(none)
)
;; definition for method 11 of type drawable-inline-array-collide-fragment
@@ -139,8 +145,8 @@
(defmethod
dummy-11
drawable-inline-array-collide-fragment
((obj drawable-inline-array-collide-fragment) (arg0 int))
(dummy-11 (the-as collide-fragment (-> obj data)) (-> obj length))
((obj drawable-inline-array-collide-fragment) (arg0 int) (arg1 object))
(dummy-11 (the-as collide-fragment (-> obj data)) (-> obj length) arg1)
0
(none)
)
@@ -150,8 +156,8 @@
(defmethod
dummy-12
drawable-inline-array-collide-fragment
((obj drawable-inline-array-collide-fragment) (arg0 int))
(dummy-12 (the-as collide-fragment (-> obj data)) (-> obj length))
((obj drawable-inline-array-collide-fragment) (arg0 int) (arg1 object))
(dummy-12 (the-as collide-fragment (-> obj data)) (-> obj length) arg1)
0
(none)
)
@@ -161,8 +167,8 @@
(defmethod
dummy-13
drawable-inline-array-collide-fragment
((obj drawable-inline-array-collide-fragment) (arg0 int))
(dummy-13 (the-as collide-fragment (-> obj data)) (-> obj length))
((obj drawable-inline-array-collide-fragment) (arg0 int) (arg1 object))
(dummy-13 (the-as collide-fragment (-> obj data)) (-> obj length) arg1)
0
(none)
)
@@ -635,7 +635,7 @@
(set! (-> tag-addr 0) tag)
)
(cond
((type-type? tag-type uinteger)
((type-type? (the-as type tag-type) uinteger)
(case (-> tag elt-type size)
((1)
(set! default (the-as uint128 (-> (the-as (pointer uint8) data))))
@@ -654,7 +654,7 @@
)
)
)
((type-type? tag-type integer)
((type-type? (the-as type tag-type) integer)
(case (-> tag elt-type size)
((1)
(set! default (the-as uint128 (-> (the-as (pointer int8) data))))
@@ -673,7 +673,7 @@
)
)
)
((type-type? tag-type float)
((type-type? (the-as type tag-type) float)
(set!
default
(the-as uint128 (the int (-> (the-as (pointer float) data))))
@@ -719,10 +719,10 @@
(set! (-> tag-addr 0) tag)
)
(cond
((type-type? tag-type float)
((type-type? (the-as type tag-type) float)
(set! default (-> (the-as (pointer float) data)))
)
((type-type? tag-type uinteger)
((type-type? (the-as type tag-type) uinteger)
(case (-> tag elt-type size)
((1)
(set! v1-8 (-> (the-as (pointer uint8) data)))
@@ -742,7 +742,7 @@
)
(set! default (the float v1-8))
)
((type-type? tag-type integer)
((type-type? (the-as type tag-type) integer)
(case (-> tag elt-type size)
((1)
(set! v1-11 (-> (the-as (pointer int8) data)))
@@ -61,12 +61,13 @@
(to-spr-waits uint32 :offset-assert 44)
(from-spr-waits uint32 :offset-assert 48)
)
:pack-me
:method-count-assert 14
:size-assert #x34
:flag-assert #xe00000034
(:methods
(dummy-9 (_type_) none 9)
(dummy-10 (_type_) none 10)
(print-to-stream (_type_ string basic) none 10)
(reset! (_type_) none 11)
(read! (_type_) none 12)
(update-wait-stats (_type_ uint uint uint) none 13)
@@ -38,9 +38,11 @@
)
;; definition for method 10 of type drawable-tree-actor
;; INFO: Return type mismatch int vs none.
(defmethod
draw
drawable-tree-actor
((obj drawable-tree-actor) (arg0 drawable) (arg1 display-frame))
0
(none)
)
@@ -41,11 +41,13 @@
)
;; definition for method 10 of type drawable-tree-ambient
;; INFO: Return type mismatch int vs none.
(defmethod
draw
drawable-tree-ambient
((obj drawable-tree-ambient) (arg0 drawable) (arg1 display-frame))
0
(none)
)
;; definition for method 16 of type drawable-tree-ambient
@@ -11,12 +11,12 @@
:flag-assert #x1200000020
(:methods
(login (_type_) _type_ 9)
(draw (_type_ drawable display-frame) int 10)
(dummy-11 (_type_ int) none 11)
(dummy-12 (_type_ int) none 12)
(dummy-13 (_type_ int) none 13)
(dummy-14 () none 14)
(dummy-15 (_type_) none 15)
(draw (_type_ drawable display-frame) none 10)
(dummy-11 (_type_ int object) none 11)
(dummy-12 (_type_ int object) none 12)
(dummy-13 (_type_ int object) none 13)
(dummy-14 (_type_) none 14)
(dummy-15 (_type_ object object) none 15)
(dummy-16 (_type_ object object) object 16)
(dummy-17 (_type_ sphere int ambient-list) none 17)
)
@@ -12,23 +12,28 @@
)
;; definition for method 10 of type drawable-inline-array
;; INFO: Return type mismatch int vs none.
(defmethod
draw
drawable-inline-array
((obj drawable-inline-array) (arg0 drawable) (arg1 display-frame))
0
(none)
)
;; definition for method 14 of type drawable-inline-array
;; INFO: Return type mismatch int vs none.
(defmethod dummy-14 drawable-inline-array ()
(defmethod dummy-14 drawable-inline-array ((obj drawable-inline-array))
0
(none)
)
;; definition for method 15 of type drawable-inline-array
;; INFO: Return type mismatch int vs none.
(defmethod dummy-15 drawable-inline-array ((obj drawable-inline-array))
(defmethod
dummy-15
drawable-inline-array
((obj drawable-inline-array) (arg0 object) (arg1 object))
0
(none)
)
@@ -0,0 +1,384 @@
;;-*-Lisp-*-
(in-package goal)
;; definition for method 10 of type cylinder
(defmethod
ray-capsule-intersect
cylinder
((obj cylinder) (probe-origin vector) (probe-dir vector))
(let ((t2-0 (new 'stack-no-clear 'vector))
(end-pt (new 'stack-no-clear 'vector))
)
0.0
0.0
(let
((result
(ray-cylinder-intersect
probe-origin
probe-dir
(-> obj origin)
(-> obj axis)
(-> obj radius)
(-> obj length)
t2-0
)
)
)
(let
((u-origin-sph
(ray-sphere-intersect
probe-origin
probe-dir
(-> obj origin)
(-> obj radius)
)
)
)
(if (and (>= u-origin-sph 0.0) (or (< result 0.0) (< u-origin-sph result)))
(set! result u-origin-sph)
)
)
(vector+float*! end-pt (-> obj origin) (-> obj axis) (-> obj length))
(let
((u-end-sphere
(ray-sphere-intersect probe-origin probe-dir end-pt (-> obj radius))
)
)
(if (and (>= u-end-sphere 0.0) (or (< result 0.0) (< u-end-sphere result)))
(set! result u-end-sphere)
)
)
result
)
)
)
;; definition of type cylinder-verts
(deftype cylinder-verts (structure)
((vert vector 24 :inline :offset-assert 0)
)
:method-count-assert 9
:size-assert #x180
:flag-assert #x900000180
)
;; definition for method 3 of type cylinder-verts
(defmethod inspect cylinder-verts ((obj cylinder-verts))
(format #t "[~8x] ~A~%" obj 'cylinder-verts)
(format #t "~Tvert[24] @ #x~X~%" (-> obj vert))
obj
)
;; definition for method 9 of type cylinder
;; INFO: Return type mismatch int vs none.
;; Used lq/sq
(defmethod debug-draw cylinder ((obj cylinder) (arg0 vector))
(local-vars
(sv-896 matrix)
(sv-912 int)
(sv-928 (function vector vector vector float vector))
(sv-944 vector)
(sv-960 vector)
(sv-976 vector)
(sv-992 (function vector vector vector float vector))
(sv-1008 vector)
(sv-1024 vector)
(sv-1040 vector)
(sv-1056 (function vector vector vector float vector))
(sv-1072 vector)
(sv-1088 vector)
(sv-1104 vector)
(sv-1120 (function vector vector vector float vector))
(sv-1136 vector)
(sv-1152 vector)
(sv-1168 vector)
)
(rlet ((vf0 :class vf)
(vf4 :class vf)
(vf5 :class vf)
(vf6 :class vf)
)
(init-vf0-vector)
(let ((s1-0 (new 'stack-no-clear 'vector))
(s0-0 (new 'stack-no-clear 'vector))
)
(if (< 0.999 (fabs (-> obj axis y)))
(vector-cross! s1-0 (-> obj axis) (new 'static 'vector :z 1.0))
(vector-cross! s1-0 (-> obj axis) (new 'static 'vector :y 1.0))
)
(vector-normalize! s1-0 (-> obj radius))
(vector-float*! s0-0 (-> obj axis) (* 0.125 (-> obj length)))
(let ((s5-0 (new 'stack-no-clear 'cylinder-verts))
(s4-0 (new 'stack-no-clear 'cylinder-verts))
(s3-0 (new 'stack-no-clear 'matrix))
)
(matrix-axis-angle! s3-0 (-> obj axis) 4096.0)
(set! sv-896 (new 'stack-no-clear 'matrix))
(vector-matrix*! (the-as vector sv-896) (-> obj origin) s3-0)
(let ((v1-5 (-> s3-0 vector 3)))
(.lvf vf4 (&-> (-> obj origin) quad))
(.lvf vf5 (&-> sv-896 vector 0 quad))
(.mov.vf vf6 vf0 :mask #b1000)
(.sub.vf vf6 vf4 vf5 :mask #b111)
(.svf (&-> v1-5 quad) vf6)
)
(set! sv-912 0)
(while (< sv-912 8)
(vector+! (-> s5-0 vert (+ sv-912 8)) (-> obj origin) s1-0)
(vector+float*!
(-> s5-0 vert (+ sv-912 8))
(-> s5-0 vert (+ sv-912 8))
s0-0
(the float sv-912)
)
(set! sv-912 (+ sv-912 1))
)
(dotimes (s0-1 8)
(set! sv-928 vector+float*!)
(set! sv-944 (-> s5-0 vert s0-1))
(set! sv-960 (-> obj origin))
(set! sv-976 s1-0)
(let ((a3-1 (cos (* 2048.0 (the float (- 7 s0-1))))))
(sv-928 sv-944 sv-960 sv-976 a3-1)
)
(set! sv-992 vector+float*!)
(set! sv-1008 (-> s5-0 vert s0-1))
(set! sv-1024 (-> s5-0 vert s0-1))
(set! sv-1040 (-> obj axis))
(let
((a3-2 (* (- (-> obj radius)) (sin (* 2048.0 (the float (- 7 s0-1)))))))
(sv-992 sv-1008 sv-1024 sv-1040 a3-2)
)
(set! sv-1056 vector+float*!)
(set! sv-1072 (-> s5-0 vert (+ s0-1 16)))
(set! sv-1088 (-> obj origin))
(set! sv-1104 s1-0)
(let ((a3-3 (cos (* 2048.0 (the float s0-1)))))
(sv-1056 sv-1072 sv-1088 sv-1104 a3-3)
)
(set! sv-1120 vector+float*!)
(set! sv-1136 (-> s5-0 vert (+ s0-1 16)))
(set! sv-1152 (-> s5-0 vert (+ s0-1 16)))
(set! sv-1168 (-> obj axis))
(let
((a3-4
(+
(-> obj length)
(* (-> obj radius) (sin (* 2048.0 (the float s0-1))))
)
)
)
(sv-1120 sv-1136 sv-1152 sv-1168 a3-4)
)
)
(dotimes (s2-1 16)
(dotimes (s1-1 24)
(vector-matrix*! (-> s4-0 vert s1-1) (-> s5-0 vert s1-1) s3-0)
(camera-line (-> s5-0 vert s1-1) (-> s4-0 vert s1-1) arg0)
(if (nonzero? s1-1)
(camera-line (-> s5-0 vert s1-1) (-> s5-0 vert (+ s1-1 -1)) arg0)
)
)
(let ((v1-77 s5-0))
(set! s5-0 s4-0)
(set! s4-0 v1-77)
)
)
)
)
0
(none)
)
)
;; definition for function ray-arbitrary-circle-intersect
(defun
ray-arbitrary-circle-intersect
((probe-origin vector)
(probe-dir vector)
(circle-origin vector)
(circle-normal vector)
(radius float)
)
(let*
((v1-1 (vector-! (new 'stack-no-clear 'vector) circle-origin probe-origin))
(f0-2
(/ (vector-dot v1-1 circle-normal) (vector-dot probe-dir circle-normal))
)
)
(cond
((or (< 1.0 f0-2) (< f0-2 0.0))
-100000000.0
)
((let ((a0-7 (new 'stack-no-clear 'vector)))
(vector-float*! a0-7 probe-dir f0-2)
(vector-! a0-7 a0-7 v1-1)
(< (vector-dot a0-7 a0-7) (* radius radius))
)
f0-2
)
(else
-100000000.0
)
)
)
)
;; definition for method 10 of type cylinder-flat
;; Used lq/sq
(defmethod
ray-flat-cyl-intersect
cylinder-flat
((obj cylinder-flat) (probe-origin vector) (probe-dir vector))
(let ((gp-0 (new 'stack-no-clear 'vector))
(end-pt (new 'stack-no-clear 'vector))
)
0.0
0.0
(let
((result
(ray-cylinder-intersect
probe-origin
probe-dir
(-> obj origin)
(-> obj axis)
(-> obj radius)
(-> obj length)
gp-0
)
)
)
(let
((u-origin-circle
(ray-arbitrary-circle-intersect
probe-origin
probe-dir
(-> obj origin)
(-> obj axis)
(-> obj radius)
)
)
)
(when
(and
(>= u-origin-circle 0.0)
(or (< result 0.0) (< u-origin-circle result))
)
(set! result u-origin-circle)
(set! (-> gp-0 quad) (-> obj origin quad))
)
)
(vector+float*! end-pt (-> obj origin) (-> obj axis) (-> obj length))
(let
((u-end-circle
(ray-arbitrary-circle-intersect
probe-origin
probe-dir
end-pt
(-> obj axis)
(-> obj radius)
)
)
)
(when
(and (>= u-end-circle 0.0) (or (< result 0.0) (< u-end-circle result)))
(set! result u-end-circle)
(set! (-> gp-0 quad) (-> end-pt quad))
)
)
result
)
)
)
;; definition of type cylinder-flat-verts
(deftype cylinder-flat-verts (structure)
((vert vector 10 :inline :offset-assert 0)
)
:method-count-assert 9
:size-assert #xa0
:flag-assert #x9000000a0
)
;; definition for method 3 of type cylinder-flat-verts
(defmethod inspect cylinder-flat-verts ((obj cylinder-flat-verts))
(format #t "[~8x] ~A~%" obj 'cylinder-flat-verts)
(format #t "~Tvert[10] @ #x~X~%" (-> obj vert))
obj
)
;; definition for method 9 of type cylinder-flat
;; INFO: Return type mismatch int vs none.
;; Used lq/sq
(defmethod debug-draw cylinder-flat ((obj cylinder-flat) (arg0 vector))
(local-vars (sv-448 vector) (sv-464 int))
(rlet ((vf0 :class vf)
(vf4 :class vf)
(vf5 :class vf)
(vf6 :class vf)
)
(init-vf0-vector)
(let ((s1-0 (new 'stack-no-clear 'vector))
(s0-0 (new 'stack-no-clear 'vector))
)
(if (< 0.999 (fabs (-> obj axis y)))
(vector-cross! s1-0 (-> obj axis) (new 'static 'vector :z 1.0))
(vector-cross! s1-0 (-> obj axis) (new 'static 'vector :y 1.0))
)
(vector-normalize! s1-0 (-> obj radius))
(vector-float*! s0-0 (-> obj axis) (* 0.14285715 (-> obj length)))
(let ((s5-0 (new 'stack-no-clear 'cylinder-flat-verts))
(s4-0 (new 'stack-no-clear 'cylinder-flat-verts))
(s3-0 (new 'stack-no-clear 'matrix))
)
(matrix-axis-angle! s3-0 (-> obj axis) 4096.0)
(set! sv-448 (new 'stack-no-clear 'vector))
(vector-matrix*! sv-448 (-> obj origin) s3-0)
(let ((v1-5 (-> s3-0 vector 3)))
(.lvf vf4 (&-> (-> obj origin) quad))
(.lvf vf5 (&-> sv-448 quad))
(.mov.vf vf6 vf0 :mask #b1000)
(.sub.vf vf6 vf4 vf5 :mask #b111)
(.svf (&-> v1-5 quad) vf6)
)
(set! sv-464 0)
(while (< sv-464 8)
(vector+! (-> s5-0 vert (+ sv-464 1)) (-> obj origin) s1-0)
(vector+float*!
(-> s5-0 vert (+ sv-464 1))
(-> s5-0 vert (+ sv-464 1))
s0-0
(the float sv-464)
)
(set! sv-464 (+ sv-464 1))
)
(set! (-> s5-0 vert 0 quad) (-> obj origin quad))
(vector+float*!
(-> s5-0 vert 9)
(-> obj origin)
(-> obj axis)
(-> obj length)
)
(dotimes (s2-1 16)
(dotimes (s1-1 10)
(vector-matrix*! (-> s4-0 vert s1-1) (-> s5-0 vert s1-1) s3-0)
(camera-line (-> s5-0 vert s1-1) (-> s4-0 vert s1-1) arg0)
(if (nonzero? s1-1)
(camera-line (-> s5-0 vert s1-1) (-> s5-0 vert (+ s1-1 -1)) arg0)
)
)
(let ((v1-43 s5-0))
(set! s5-0 s4-0)
(set! s4-0 v1-43)
)
)
)
)
0
(none)
)
)
@@ -32,33 +32,33 @@
;; definition for method 3 of type sprite-vec-data-2d
(defmethod inspect sprite-vec-data-2d ((obj sprite-vec-data-2d))
(format #t "[~8x] ~A~%" obj 'sprite-vec-data-2d)
(format #t "~Tx-y-z-sx: #<vector @ #x~X>~%" (-> obj x-y-z-sx))
(format #t "~Tflag-rot-sy: #<vector @ #x~X>~%" (-> obj flag-rot-sy))
(format #t "~Tr-g-b-a: #<vector @ #x~X>~%" (-> obj r-g-b-a))
(format #t "~Tx: ~f~%" (-> obj x-y-z-sx x))
(format #t "~Ty: ~f~%" (-> obj x-y-z-sx y))
(format #t "~Tz: ~f~%" (-> obj x-y-z-sx z))
(format #t "~Tsx: ~f~%" (-> obj x-y-z-sx w))
(format #t "~Tsy: ~f~%" (-> obj flag-rot-sy w))
(format #t "~Trot: ~f~%" (-> obj flag-rot-sy z))
(format #t "~Tflag: ~D~%" (-> obj flag-rot-sy x))
(format #t "~Tmatrix: ~D~%" (-> obj flag-rot-sy y))
(format #t "~Twarp-turns: ~D~%" (-> obj flag-rot-sy x))
(format #t "~Tr: ~f~%" (-> obj r-g-b-a x))
(format #t "~Tg: ~f~%" (-> obj r-g-b-a y))
(format #t "~Tb: ~f~%" (-> obj r-g-b-a z))
(format #t "~Ta: ~f~%" (-> obj r-g-b-a w))
(format #t "~Ttrans: #<vector3s @ #x~X>~%" (-> obj x-y-z-sx))
(format #t "~Tcolor: #<rgbaf @ #x~X>~%" (-> obj r-g-b-a))
(format #t "~Tdata[1] @ #x~X~%" (-> obj x-y-z-sx))
(format #t "~Tdata64[6] @ #x~X~%" (-> obj x-y-z-sx))
(format #t "~Tx-y-z-sx: #<vector @ #x~X>~%" (&-> obj x))
(format #t "~Tflag-rot-sy: #<vector @ #x~X>~%" (&-> obj flag))
(format #t "~Tr-g-b-a: #<vector @ #x~X>~%" (&-> obj r))
(format #t "~Tx: ~f~%" (-> obj x))
(format #t "~Ty: ~f~%" (-> obj y))
(format #t "~Tz: ~f~%" (-> obj z))
(format #t "~Tsx: ~f~%" (-> obj sx))
(format #t "~Tsy: ~f~%" (-> obj sy))
(format #t "~Trot: ~f~%" (-> obj rot))
(format #t "~Tflag: ~D~%" (-> obj flag))
(format #t "~Tmatrix: ~D~%" (-> obj matrix))
(format #t "~Twarp-turns: ~D~%" (-> obj flag))
(format #t "~Tr: ~f~%" (-> obj r))
(format #t "~Tg: ~f~%" (-> obj g))
(format #t "~Tb: ~f~%" (-> obj b))
(format #t "~Ta: ~f~%" (-> obj a))
(format #t "~Ttrans: #<vector3s @ #x~X>~%" (&-> obj x))
(format #t "~Tcolor: #<rgbaf @ #x~X>~%" (&-> obj r))
(format #t "~Tdata[1] @ #x~X~%" (&-> obj x))
(format #t "~Tdata64[6] @ #x~X~%" (&-> obj x))
obj
)
;; definition of type sprite-array-2d
(deftype sprite-array-2d (basic)
((num-sprites uint32 2 :offset-assert 4)
(num-valid uint32 2 :offset-assert 12)
((num-sprites int32 2 :offset-assert 4)
(num-valid int32 2 :offset-assert 12)
(vec-data uint32 :offset-assert 20)
(adgif-data uint32 :offset-assert 24)
(pad uint128 4 :offset-assert 32)
@@ -67,6 +67,9 @@
:method-count-assert 9
:size-assert #x70
:flag-assert #x900000070
(:methods
(new (symbol type int int) _type_ 0)
)
)
;; definition for method 3 of type sprite-array-2d
@@ -135,8 +138,8 @@
;; definition of type sprite-array-3d
(deftype sprite-array-3d (basic)
((num-sprites uint32 2 :offset-assert 4)
(num-valid uint32 2 :offset-assert 12)
((num-sprites int32 2 :offset-assert 4)
(num-valid int32 2 :offset-assert 12)
(vec-data uint32 :offset-assert 20)
(adgif-data uint32 :offset-assert 24)
(data uint128 1 :offset-assert 32)
@@ -144,6 +147,9 @@
:method-count-assert 9
:size-assert #x30
:flag-assert #x900000030
(:methods
(new (symbol type int int) _type_ 0)
)
)
;; definition for method 3 of type sprite-array-3d
@@ -3200,11 +3200,11 @@
;; WARN: Unsupported inline assembly instruction kind - [subu a3, t0, a3]
(defun adgif-shader<-texture-with-update! ((arg0 adgif-shader) (arg1 texture))
(local-vars
(v1-11 int)
(v1-11 uint128)
(v1-12 int)
(a3-4 int)
(a3-4 uint128)
(a3-5 int)
(a3-9 int)
(a3-9 uint128)
(a3-10 int)
(a3-13 int)
(a3-22 uint)
@@ -3232,17 +3232,17 @@
(v1-8 (-> arg1 width 0))
(t1-6 (logior (logior t1-4 a3-2) (shl v1-8 14)))
)
(let ((v1-10 (-> arg1 wu)))
(.plzcw v1-11 v1-10)
(let ((v1-10 (the-as uint128 (-> arg1 wu))))
(.plzcw v1-11 (the-as uint v1-10))
)
(let ((t0-0 30))
(.subu v1-12 t0-0 v1-11)
(let ((a3-3 (-> arg1 hu))
(.subu v1-12 t0-0 (the-as int v1-11))
(let ((a3-3 (the-as uint128 (-> arg1 hu)))
(v1-13 (shl v1-12 26))
)
(.plzcw a3-4 a3-3)
(.plzcw a3-4 (the-as uint a3-3))
(let ((t1-7 (logior t1-6 v1-13)))
(.subu a3-5 t0-0 a3-4)
(.subu a3-5 t0-0 (the-as int a3-4))
(let* ((a3-6 (shl a3-5 30))
(v1-14 1)
(t1-9 (logior (logior t1-7 a3-6) (shl v1-14 34)))
@@ -3252,18 +3252,18 @@
(v1-19 (shl 1 61))
(f0-3 (the int f0-2))
(t1-12 (logior t1-11 v1-19))
(v1-20 f0-3)
(v1-20 (the-as uint128 f0-3))
)
(set! (-> arg0 tex0) (the-as gs-tex0 t1-12))
(.plzcw a3-9 v1-20)
(.subu a3-10 t0-0 a3-9)
(.plzcw a3-9 (the-as int v1-20))
(.subu a3-10 t0-0 (the-as int a3-9))
(let ((t0-2 (+ (-> arg1 mip-shift) -1)))
(nop!)
(b! (zero? t0-2) cfg-2)
)
(let* ((t0-3 (+ a3-10 -4))
(a3-11 (* a3-10 16))
(t0-4 (sar v1-20 t0-3))
(t0-4 (sar (the-as int v1-20) t0-3))
(a3-12 (+ a3-11 -175))
(t0-5 (logand t0-4 15))
)
@@ -3273,7 +3273,7 @@
(label cfg-2)
(let* ((t0-6 (+ a3-10 -5))
(a3-14 (* a3-10 32))
(t0-7 (sar v1-20 t0-6))
(t0-7 (sar (the-as int v1-20) t0-6))
(a3-15 (+ a3-14 -350))
(t0-8 (logand t0-7 31))
)
@@ -12,7 +12,7 @@
:size-assert #x4c
:flag-assert #x90000004c
(:methods
(new (symbol type float float) _type_ 0)
(new (symbol type meters meters) _type_ 0)
)
)
@@ -30,7 +30,7 @@
(defmethod
new
subdivide-settings
((allocation symbol) (type-to-make type) (arg0 float) (arg1 float))
((allocation symbol) (type-to-make type) (arg0 meters) (arg1 meters))
(let
((v0-0
(object-new allocation type-to-make (the-as int (-> type-to-make size)))
@@ -0,0 +1,540 @@
;;-*-Lisp-*-
(in-package goal)
;; definition for symbol *merc-global-stats*, type merc-global-stats
(define *merc-global-stats* (new 'global 'merc-global-stats))
;; definition for function clear-tr-stat
;; INFO: Return type mismatch int vs none.
(defun clear-tr-stat ((arg0 tr-stat))
(set! (-> arg0 groups) (the-as uint 0))
(set! (-> arg0 fragments) (the-as uint 0))
(set! (-> arg0 tris) (the-as uint 0))
(set! (-> arg0 dverts) (the-as uint 0))
(set! (-> arg0 instances) (the-as uint 0))
0
(none)
)
;; definition for symbol *stat-string-tfrag*, type string
(define *stat-string-tfrag* (new 'global 'string 128 (the-as string #f)))
;; definition for symbol *stat-string-tfrag-near*, type string
(define *stat-string-tfrag-near* (new 'global 'string 128 (the-as string #f)))
;; definition for symbol *stat-string-total*, type string
(define *stat-string-total* (new 'global 'string 128 (the-as string #f)))
;; definition (debug) for function print-tr-stat
;; INFO: Return type mismatch uint vs none.
(defun-debug print-tr-stat ((stat tr-stat) (name string) (dest string))
(clear dest)
(when
(nonzero?
(+
(+
(+ (+ (-> stat groups) (-> stat fragments)) (-> stat tris))
(-> stat dverts)
)
(-> stat instances)
)
)
(format
dest
"~0k~4d ~5d ~6d ~6d"
(-> stat groups)
(-> stat fragments)
(-> stat tris)
(-> stat dverts)
)
(format
dest
"~0k ~7f ~5d ~s"
(/
(* 2.0 (the float (-> stat tris)))
(the float (- (-> stat dverts) (-> stat tris)))
)
(-> stat instances)
name
)
(format *stdcon* "~S~%" dest)
(+! (-> *terrain-stats* total groups) (-> stat groups))
(+! (-> *terrain-stats* total fragments) (-> stat fragments))
(+! (-> *terrain-stats* total tris) (-> stat tris))
(+! (-> *terrain-stats* total dverts) (-> stat dverts))
(+! (-> *terrain-stats* total instances) (-> stat instances))
)
(none)
)
;; definition (debug) for function print-terrain-stats
;; INFO: Return type mismatch int vs none.
(defun-debug print-terrain-stats ()
(if *debug-segment*
(add-frame
(-> *display* frames (-> *display* on-screen) frame profile-bar 0)
'draw
(new 'static 'rgba :r #x40 :b #x40 :a #x80)
)
)
(dotimes (gp-0 (-> *level* length))
(let ((s5-0 (-> *level* level gp-0)))
(when (= (-> s5-0 status) 'active)
(dummy-14 s5-0 #f)
(format
*stdcon*
"~0k~D ~A ~,,2fK + textures~%"
(-> s5-0 index)
(-> s5-0 name)
(* 0.0009765625 (the float (-> s5-0 mem-usage)))
)
)
)
)
(format *stdcon* "~0k~%grps frags tris dverts strip insts~%")
(print-tr-stat (-> *terrain-stats* pris) "pris" *temp-string*)
(print-tr-stat (-> *merc-global-stats* merc) "merc" *temp-string*)
(print-tr-stat (-> *merc-global-stats* mercneric) "mercneric" *temp-string*)
(print-tr-stat (-> *terrain-stats* tie-near) "tie-near" *temp-string*)
(print-tr-stat (-> *terrain-stats* tie) "tie" *temp-string*)
(print-tr-stat (-> *terrain-stats* tie-generic) "tie-generic" *temp-string*)
(print-tr-stat (-> *terrain-stats* shrub-near) "shrub-near" *temp-string*)
(print-tr-stat (-> *terrain-stats* shrub) "shrub" *temp-string*)
(print-tr-stat
(-> *terrain-stats* tfrag-near)
"tfrag-near"
*stat-string-tfrag-near*
)
(print-tr-stat (-> *terrain-stats* tfrag) "tfrag" *stat-string-tfrag*)
(print-tr-stat (-> *terrain-stats* trans-tfrag) "trans-tfrag" *temp-string*)
(print-tr-stat
(-> *terrain-stats* trans-tfrag-near)
"trans-tfrag-near"
*temp-string*
)
(print-tr-stat (-> *terrain-stats* trans-pris) "trans-pris" *temp-string*)
(print-tr-stat (-> *terrain-stats* billboard) "billboard" *temp-string*)
(print-tr-stat (-> *terrain-stats* trans-shrub) "trans-shrub" *temp-string*)
(print-tr-stat (-> *terrain-stats* ocean-mid) "ocean-mid" *temp-string*)
(print-tr-stat (-> *terrain-stats* ocean-near) "ocean-near" *temp-string*)
(format
*stdcon*
"~0k---------------------------------------------------------------~%"
)
(print-tr-stat (-> *terrain-stats* total) "total" *stat-string-total*)
(clear-tr-stat (-> *terrain-stats* pris))
(clear-tr-stat (-> *merc-global-stats* merc))
(clear-tr-stat (-> *merc-global-stats* mercneric))
(clear-tr-stat (-> *terrain-stats* shrub-near))
(clear-tr-stat (-> *terrain-stats* tie-near))
(clear-tr-stat (-> *terrain-stats* tie))
(clear-tr-stat (-> *terrain-stats* tie-generic))
(clear-tr-stat (-> *terrain-stats* shrub))
(clear-tr-stat (-> *terrain-stats* tfrag-near))
(clear-tr-stat (-> *terrain-stats* tfrag))
(clear-tr-stat (-> *terrain-stats* trans-tfrag))
(clear-tr-stat (-> *terrain-stats* trans-tfrag-near))
(clear-tr-stat (-> *terrain-stats* trans-pris))
(clear-tr-stat (-> *terrain-stats* billboard))
(clear-tr-stat (-> *terrain-stats* trans-shrub))
(clear-tr-stat (-> *terrain-stats* ocean-mid))
(clear-tr-stat (-> *terrain-stats* ocean-near))
(clear-tr-stat (-> *terrain-stats* total))
(if *debug-segment*
(add-frame
(-> *display* frames (-> *display* on-screen) frame profile-bar 0)
'draw
(new 'static 'rgba :b #xff :a #x80)
)
)
0
(none)
)
;; definition for function update-subdivide-settings!
;; INFO: Return type mismatch int vs none.
(defun
update-subdivide-settings!
((settings subdivide-settings) (math-cam math-camera) (idx int))
(set! (-> settings meters 0) (-> settings far idx))
(set! (-> settings meters 4) (-> settings close idx))
(let ((f0-3 (* 0.14285715 (- (-> settings meters 0) (-> settings meters 4)))))
(set! (-> settings meters 3) (+ (-> settings meters 4) (* 0.5 f0-3)))
(set! (-> settings meters 2) (+ (-> settings meters 3) f0-3))
(set! (-> settings meters 1) (+ (-> settings meters 2) (* 2.0 f0-3)))
)
(let ((f0-7 (/ (-> math-cam inv-hmge-scale w) (-> math-cam d))))
(dotimes (v1-5 5)
(set! (-> settings dist v1-5) (* f0-7 (-> settings meters v1-5)))
)
)
(set! (-> *tfrag-work* frag-dists x) (- (-> settings meters 0)))
(set! (-> *tfrag-work* frag-dists y) (- (-> settings meters 1)))
(set! (-> *tfrag-work* frag-dists z) (- (-> settings meters 2)))
(set! (-> *tfrag-work* frag-dists w) (- (-> settings meters 4)))
0
(none)
)
;; definition for symbol *subdivide-settings*, type subdivide-settings
(define
*subdivide-settings*
(new 'global 'subdivide-settings (meters 30.0) (meters 70.0))
)
;; definition for function set-tfrag-dists!
;; INFO: Return type mismatch (pointer float) vs none.
(defun set-tfrag-dists! ((arg0 (pointer float)))
(let ((f2-0 (-> *subdivide-settings* dist 0))
(f1-0 (-> *subdivide-settings* dist 1))
(f0-0 (-> *subdivide-settings* dist 2))
)
(set! (-> arg0 3) f2-0)
(set! (-> arg0 7) f1-0)
(let ((f4-1 (/ 1.0 (- f2-0 f1-0)))
(f3-2 (/ 1.0 (- f1-0 f0-0)))
)
(set! (-> arg0 1) (- f4-1))
(set! (-> arg0 5) (- f3-2))
(set! (-> arg0 0) (* 0.5 f4-1))
(set! (-> arg0 4) (* 0.5 f3-2))
(let ((f2-1 (* f2-0 f4-1))
(f5-7 (* f1-0 f3-2))
)
(set! (-> arg0 9) f2-1)
(set! (-> arg0 13) f5-7)
)
(set! (-> arg0 8) (* (* -0.5 f4-1) f1-0))
(set! (-> arg0 12) (* (* -0.5 f3-2) f0-0))
)
)
(none)
)
;; definition for symbol *terrain-context*, type terrain-context
(define *terrain-context* (new 'global 'terrain-context))
;; definition for symbol *perf-stats*, type perf-stat-array
(define *perf-stats* (new 'debug 'perf-stat-array 17))
;; definition for method 10 of type perf-stat
;; INFO: Return type mismatch perf-stat vs none.
(defmethod print-to-stream perf-stat ((obj perf-stat) (arg0 string) (arg1 basic))
(format
*stdcon*
"~3d ~8d ~8d ~6d ~6d"
(-> obj count)
(-> obj cycles)
(-> obj instructions)
(-> obj icache)
(-> obj dcache)
)
(format
*stdcon*
" ~2d ~2d ~2d"
(-> obj to-vu0-waits)
(-> obj to-spr-waits)
(-> obj from-spr-waits)
)
(format *stdcon* " ~s~%" arg0)
(none)
)
;; definition (debug) for function perf-stat-bucket->string
(defun-debug perf-stat-bucket->string ((arg0 perf-stat-bucket))
(case arg0
(((perf-stat-bucket camera))
"camera"
)
(((perf-stat-bucket collide))
"collide"
)
(((perf-stat-bucket nav))
"nav"
)
(((perf-stat-bucket bones))
"bones"
)
(((perf-stat-bucket proto-tie-n))
"proto-tie-n"
)
(((perf-stat-bucket proto-tie))
"proto-tie"
)
(((perf-stat-bucket proto-tie-g))
"proto-tie-g"
)
(((perf-stat-bucket inst-tie))
"inst-tie"
)
(((perf-stat-bucket proto-shrub))
"proto-shrub"
)
(((perf-stat-bucket inst-shrub))
"inst-shrub"
)
(((perf-stat-bucket tfrag-near))
"tfrag-near"
)
(((perf-stat-bucket tfrag))
"tfrag"
)
(((perf-stat-bucket drawable))
"drawable"
)
(((perf-stat-bucket background))
"background"
)
(((perf-stat-bucket tie-generic))
"tie-generic"
)
(((perf-stat-bucket mercneric))
"mercneric"
)
(((perf-stat-bucket all-code))
"all-code"
)
(else
"*unknown*"
)
)
)
;; definition for symbol GSH_ENABLE, type symbol
(define GSH_ENABLE #f)
;; definition for symbol GSH_BUCKET, type bucket-id
(define GSH_BUCKET (the-as bucket-id 3))
;; definition for symbol GSH_WHICH_STAT, type int
(define GSH_WHICH_STAT 1)
;; definition for symbol GSH_MAX_DISPLAY, type basic
(define GSH_MAX_DISPLAY (the-as basic #f))
;; definition for symbol GSH_TIME, type int
(define GSH_TIME 64)
;; definition for symbol *gomi-stats-hack*, type (inline-array perf-stat)
(define
*gomi-stats-hack*
(the-as (inline-array perf-stat) (malloc 'debug (* 52 (+ GSH_TIME 1))))
)
;; definition (debug) for function start-perf-stat-collection
;; INFO: Return type mismatch int vs none.
;; WARN: Unsupported inline assembly instruction kind - [mtc0 Perf, r0]
;; WARN: Unsupported inline assembly instruction kind - [sync.l]
;; WARN: Unsupported inline assembly instruction kind - [sync.p]
;; WARN: Unsupported inline assembly instruction kind - [mtpc pcr0, r0]
;; WARN: Unsupported inline assembly instruction kind - [mtpc pcr1, r0]
;; WARN: Unsupported inline assembly instruction kind - [sync.l]
;; WARN: Unsupported inline assembly instruction kind - [sync.p]
;; WARN: Unsupported inline assembly instruction kind - [mtc0 Perf, a0]
;; WARN: Unsupported inline assembly instruction kind - [sync.l]
;; WARN: Unsupported inline assembly instruction kind - [sync.p]
(defun-debug start-perf-stat-collection ()
(local-vars (r0-0 none))
(let ((frame-idx (+ (-> *perf-stats* data 0 frame-number) 1)))
(set! (-> *perf-stats* data 0 frame-number) frame-idx)
(let ((gp-0 (mod frame-idx (the-as uint 34))))
(when GSH_ENABLE
(let ((bucket GSH_BUCKET))
(let ((which-stat GSH_WHICH_STAT))
(set! gp-0 (+ (* bucket 2) (the-as uint which-stat)))
)
(when GSH_MAX_DISPLAY
(let
((stat-idx
(logand (-> *perf-stats* data 0 frame-number) (+ GSH_TIME -1))
)
)
(set!
(-> *gomi-stats-hack* stat-idx cycles)
(-> *perf-stats* data (the-as int bucket) cycles)
)
(set!
(-> *gomi-stats-hack* stat-idx instructions)
(-> *perf-stats* data (the-as int bucket) instructions)
)
(set!
(-> *gomi-stats-hack* stat-idx icache)
(-> *perf-stats* data (the-as int bucket) icache)
)
(set!
(-> *gomi-stats-hack* stat-idx dcache)
(-> *perf-stats* data (the-as int bucket) dcache)
)
(when (zero? stat-idx)
(set! (-> *gomi-stats-hack* GSH_TIME cycles) (the-as uint 0))
(set! (-> *gomi-stats-hack* GSH_TIME instructions) (the-as uint 0))
(set! (-> *gomi-stats-hack* GSH_TIME icache) (the-as uint 0))
(set! (-> *gomi-stats-hack* GSH_TIME dcache) (the-as uint 0))
(dotimes (v1-22 GSH_TIME)
(if
(<
(-> *gomi-stats-hack* GSH_TIME cycles)
(-> *gomi-stats-hack* v1-22 cycles)
)
(set!
(-> *gomi-stats-hack* GSH_TIME cycles)
(-> *gomi-stats-hack* v1-22 cycles)
)
)
(if
(<
(-> *gomi-stats-hack* GSH_TIME instructions)
(-> *gomi-stats-hack* v1-22 instructions)
)
(set!
(-> *gomi-stats-hack* GSH_TIME instructions)
(-> *gomi-stats-hack* v1-22 instructions)
)
)
(if
(<
(-> *gomi-stats-hack* GSH_TIME icache)
(-> *gomi-stats-hack* v1-22 icache)
)
(set!
(-> *gomi-stats-hack* GSH_TIME icache)
(-> *gomi-stats-hack* v1-22 icache)
)
)
(if
(<
(-> *gomi-stats-hack* GSH_TIME dcache)
(-> *gomi-stats-hack* v1-22 dcache)
)
(set!
(-> *gomi-stats-hack* GSH_TIME dcache)
(-> *gomi-stats-hack* v1-22 dcache)
)
)
)
)
)
(format *stdcon* "~%")
(print-to-stream (-> *gomi-stats-hack* GSH_TIME) "max-value" *stdcon*)
)
)
)
(dotimes (v1-27 17)
(set! (-> *perf-stats* data v1-27 count) (the-as uint 0))
(cond
((!= v1-27 (shr gp-0 1))
(set! (-> *perf-stats* data v1-27 ctrl) (the-as uint 0))
0
)
(else
(let ((a1-63 (logand gp-0 1))
(a0-64 (the-as uint #x80004010))
)
(cond
((zero? a1-63)
(set! a0-64 (+ #x60020 (the-as int a0-64)))
)
((= a1-63 1)
(set! a0-64 (+ #x300c0 (the-as int a0-64)))
)
)
(set! (-> *perf-stats* data v1-27 select) a1-63)
(set! (-> *perf-stats* data v1-27 ctrl) a0-64)
)
(set! (-> *perf-stats* data v1-27 accum0) (the-as uint 0))
(set! (-> *perf-stats* data v1-27 accum1) (the-as uint 0))
(set! (-> *perf-stats* data v1-27 to-vu0-waits) (the-as uint 0))
(set! (-> *perf-stats* data v1-27 to-spr-waits) (the-as uint 0))
(set! (-> *perf-stats* data v1-27 from-spr-waits) (the-as uint 0))
0
)
)
)
)
)
(let* ((v1-31 (-> *perf-stats* data))
(a0-76 (-> v1-31 0 ctrl))
)
(+! (-> v1-31 0 count) 1)
(b! (zero? a0-76) cfg-28)
(.mtc0 Perf r0-0)
(.sync.l)
(.sync.p)
(.mtpc pcr0 r0-0)
(.mtpc pcr1 r0-0)
(.sync.l)
(.sync.p)
(.mtc0 Perf a0-76)
)
(.sync.l)
(.sync.p)
(label cfg-28)
0
0
(none)
)
;; definition (debug) for function end-perf-stat-collection
;; INFO: Return type mismatch int vs none.
;; WARN: Unsupported inline assembly instruction kind - [mtc0 Perf, r0]
;; WARN: Unsupported inline assembly instruction kind - [sync.l]
;; WARN: Unsupported inline assembly instruction kind - [sync.p]
;; WARN: Unsupported inline assembly instruction kind - [mfpc a0, pcr0]
;; WARN: Unsupported inline assembly instruction kind - [mfpc a0, pcr1]
(defun-debug end-perf-stat-collection ()
(local-vars (r0-0 none) (a0-1 int) (a0-3 int))
(let ((v1-1 (-> *perf-stats* data)))
(b! (zero? (-> v1-1 0 ctrl)) cfg-2)
(.mtc0 Perf r0-0)
(.sync.l)
(.sync.p)
(.mfpc a0-1 pcr0)
(+! (-> v1-1 0 accum0) (the-as uint a0-1))
(.mfpc a0-3 pcr1)
(+! (-> v1-1 0 accum1) (the-as uint a0-3))
)
(label cfg-2)
0
(dotimes (v1-3 17)
(when (nonzero? (-> *perf-stats* data v1-3 ctrl))
(let ((a2-0 (-> *perf-stats* data v1-3 select))
(a1-8 (-> *perf-stats* data v1-3 accum0))
(a0-15 (-> *perf-stats* data v1-3 accum1))
)
(cond
((zero? a2-0)
(set! (-> *perf-stats* data v1-3 cycles) a1-8)
(set! (-> *perf-stats* data v1-3 instructions) a0-15)
)
((= a2-0 1)
(set! (-> *perf-stats* data v1-3 icache) a1-8)
(set! (-> *perf-stats* data v1-3 dcache) a0-15)
)
)
)
)
)
0
(none)
)
;; definition (debug) for function print-perf-stats
;; INFO: Return type mismatch int vs none.
(defun-debug print-perf-stats ()
(format *stdcon* "~0k~%count cycles instr icache dcache vu0/to/from~%")
(dotimes (gp-0 17)
(if (nonzero? (-> *perf-stats* data gp-0 count))
(print-to-stream
(-> *perf-stats* data gp-0)
(perf-stat-bucket->string (the-as perf-stat-bucket gp-0))
*stdcon*
)
)
)
0
(none)
)
@@ -27,34 +27,35 @@
;; definition of type bsp-header
(deftype bsp-header (drawable)
((info file-info :offset 4)
(all-visible-list (pointer uint16) :offset-assert 32)
(visible-list-length int32 :offset-assert 36)
(drawable-trees drawable-tree-array :offset-assert 40)
(pat pointer :offset-assert 44)
(pat-length int32 :offset-assert 48)
(unk-data-0 pointer :offset-assert 52)
(unk-data-0-len int32 :offset-assert 56)
(unk-data-1 pointer :offset-assert 60)
(unk-data-1-len int32 :offset-assert 64)
(unk-zero-0 basic :offset-assert 68)
(name symbol :offset-assert 72)
(nickname symbol :offset-assert 76)
(vis-info level-vis-info 8 :offset-assert 80)
(actors drawable-inline-array-actor :offset-assert 112)
(cameras (array entity-camera) :offset-assert 116)
(nodes (inline-array bsp-node) :offset-assert 120)
(level level :offset-assert 124)
(unk-data-2 uint32 5 :offset-assert 128)
(boxes box8s-array :offset-assert 148)
(unk-data-3 uint32 :offset-assert 152)
(ambients drawable-inline-array-ambient :offset-assert 156)
(unk-data-4 float :offset-assert 160)
(unk-data-5 float :offset-assert 164)
(adgifs adgif-shader-array :offset-assert 168)
(unk-data-6 pointer :offset-assert 172)
(unk-data-7 pointer :offset-assert 176)
(unk-data-8 uint32 55 :offset-assert 180)
((info file-info :offset 4)
(all-visible-list (pointer uint16) :offset-assert 32)
(visible-list-length int32 :offset-assert 36)
(drawable-trees drawable-tree-array :offset-assert 40)
(pat pointer :offset-assert 44)
(pat-length int32 :offset-assert 48)
(texture-remap-table (pointer uint64) :offset-assert 52)
(texture-remap-table-len int32 :offset-assert 56)
(unk-data-1 pointer :offset-assert 60)
(unk-data-1-len int32 :offset-assert 64)
(unk-zero-0 basic :offset-assert 68)
(name symbol :offset-assert 72)
(nickname symbol :offset-assert 76)
(vis-info level-vis-info 8 :offset-assert 80)
(actors drawable-inline-array-actor :offset-assert 112)
(cameras (array entity-camera) :offset-assert 116)
(nodes (inline-array bsp-node) :offset-assert 120)
(level level :offset-assert 124)
(current-leaf-idx uint16 :offset-assert 128)
(unk-data-2 uint16 9 :offset-assert 130)
(boxes box8s-array :offset-assert 148)
(current-bsp-back-flags uint32 :offset-assert 152)
(ambients drawable-inline-array-ambient :offset-assert 156)
(unk-data-4 float :offset-assert 160)
(unk-data-5 float :offset-assert 164)
(adgifs adgif-shader-array :offset-assert 168)
(unk-data-6 pointer :offset-assert 172)
(unk-data-7 pointer :offset-assert 176)
(unk-data-8 uint32 55 :offset-assert 180)
)
:method-count-assert 20
:size-assert #x190
@@ -0,0 +1,653 @@
;;-*-Lisp-*-
(in-package goal)
;; definition for function mem-usage-bsp-tree
;; INFO: Return type mismatch bsp-header vs none.
(defun
mem-usage-bsp-tree
((header bsp-header) (node bsp-node) (mem-use memory-usage-block) (flags int))
(cond
((zero? node)
)
(else
(+! (-> mem-use data 58 count) 1)
(let ((v1-3 32))
(+! (-> mem-use data 58 used) v1-3)
(+! (-> mem-use data 58 total) (logand -16 (+ v1-3 15)))
)
(if (> (-> node front) 0)
(mem-usage-bsp-tree header (the-as bsp-node (-> node front)) mem-use flags)
)
(if (> (-> node back) 0)
(mem-usage-bsp-tree header (the-as bsp-node (-> node back)) mem-use flags)
)
)
)
(none)
)
;; definition for method 8 of type bsp-header
(defmethod
mem-usage
bsp-header
((obj bsp-header) (mem-use memory-usage-block) (flags int))
(set! (-> mem-use work-bsp) obj)
(when (nonzero? (-> obj info))
(set! (-> mem-use length) (max 82 (-> mem-use length)))
(set! (-> mem-use data 81 name) "array")
(+! (-> mem-use data 81 count) 1)
(let ((v1-8 (asize-of (-> obj info))))
(+! (-> mem-use data 81 used) v1-8)
(+! (-> mem-use data 81 total) (logand -16 (+ v1-8 15)))
)
)
(if (nonzero? (-> obj drawable-trees))
(mem-usage (-> obj drawable-trees) mem-use flags)
)
(set! (-> mem-use length) (max 63 (-> mem-use length)))
(set! (-> mem-use data 43 name) "entity")
(set! (-> mem-use data 44 name) "camera")
(set! (-> mem-use data 62 name) "pat")
(set! (-> mem-use data 58 name) "bsp-node")
(set! (-> mem-use length) (max 57 (-> mem-use length)))
(set! (-> mem-use data 56 name) "bsp-main")
(+! (-> mem-use data 56 count) 1)
(let ((v1-27 400))
(+! (-> mem-use data 56 used) v1-27)
(+! (-> mem-use data 56 total) (logand -16 (+ v1-27 15)))
)
(set! (-> mem-use length) (max 60 (-> mem-use length)))
(set! (-> mem-use data 59 name) "bsp-leaf-vis-self")
(+! (-> mem-use data 59 count) 1)
(let ((v1-36 (-> obj visible-list-length)))
(+! (-> mem-use data 59 used) v1-36)
(+! (-> mem-use data 59 total) (logand -16 (+ v1-36 15)))
)
(set! (-> mem-use length) (max 58 (-> mem-use length)))
(set! (-> mem-use data 57 name) "bsp-misc")
(+! (-> mem-use data 57 count) 1)
(let ((v1-46 (* (-> obj texture-remap-table-len) 8)))
(+! (-> mem-use data 57 used) v1-46)
(+! (-> mem-use data 57 total) (logand -16 (+ v1-46 15)))
)
(set! (-> mem-use length) (max 58 (-> mem-use length)))
(set! (-> mem-use data 57 name) "bsp-misc")
(+! (-> mem-use data 57 count) 1)
(let ((v1-56 (* (-> obj unk-data-1-len) 4)))
(+! (-> mem-use data 57 used) v1-56)
(+! (-> mem-use data 57 total) (logand -16 (+ v1-56 15)))
)
(when (nonzero? (-> obj unk-zero-0))
(set! (-> mem-use length) (max 58 (-> mem-use length)))
(set! (-> mem-use data 57 name) "bsp-misc")
(+! (-> mem-use data 57 count) 1)
(let ((v1-68 (asize-of (-> obj unk-zero-0))))
(+! (-> mem-use data 57 used) v1-68)
(+! (-> mem-use data 57 total) (logand -16 (+ v1-68 15)))
)
)
(when (nonzero? (-> obj adgifs))
(set! (-> mem-use length) (max 58 (-> mem-use length)))
(set! (-> mem-use data 57 name) "bsp-misc")
(+! (-> mem-use data 57 count) 1)
(let ((v1-80 (asize-of (-> obj adgifs))))
(+! (-> mem-use data 57 used) v1-80)
(+! (-> mem-use data 57 total) (logand -16 (+ v1-80 15)))
)
)
(when (nonzero? (-> obj boxes))
(set! (-> mem-use length) (max 58 (-> mem-use length)))
(set! (-> mem-use data 57 name) "bsp-misc")
(+! (-> mem-use data 57 count) 1)
(let ((v1-92 (asize-of (-> obj boxes))))
(+! (-> mem-use data 57 used) v1-92)
(+! (-> mem-use data 57 total) (logand -16 (+ v1-92 15)))
)
(when (nonzero? (-> obj unk-data-7))
(set! (-> mem-use length) (max 58 (-> mem-use length)))
(set! (-> mem-use data 57 name) "bsp-misc")
(+! (-> mem-use data 57 count) 1)
(let ((v1-105 (* (-> obj boxes length) 2)))
(+! (-> mem-use data 57 used) v1-105)
(+! (-> mem-use data 57 total) (logand -16 (+ v1-105 15)))
)
)
)
(when (nonzero? (-> obj unk-data-6))
(set! (-> mem-use length) (max 58 (-> mem-use length)))
(set! (-> mem-use data 57 name) "bsp-misc")
(+! (-> mem-use data 57 count) 1)
(let ((v1-118 (* (-> obj actors length) 4)))
(+! (-> mem-use data 57 used) v1-118)
(+! (-> mem-use data 57 total) (logand -16 (+ v1-118 15)))
)
)
(+! (-> mem-use data 62 count) (-> obj pat-length))
(let ((v1-125 (* (-> obj pat-length) 4)))
(+! (-> mem-use data 62 used) v1-125)
(+! (-> mem-use data 62 total) (logand -16 (+ v1-125 15)))
)
(let ((s3-0 (-> obj cameras)))
(when (nonzero? s3-0)
(dotimes (s2-0 (-> s3-0 length))
(mem-usage (-> s3-0 s2-0) mem-use (logior flags 256))
)
)
)
(mem-usage-bsp-tree obj (the-as bsp-node (-> obj nodes)) mem-use flags)
obj
)
;; definition for method 9 of type bsp-header
(defmethod login bsp-header ((obj bsp-header))
(if (nonzero? (-> obj drawable-trees))
(login (-> obj drawable-trees))
)
(when (nonzero? (-> obj adgifs))
(let ((s5-0 (-> obj adgifs)))
(dotimes (s4-0 (-> s5-0 length))
(adgif-shader-login-no-remap (-> s5-0 data s4-0))
)
)
)
obj
)
;; definition for symbol *test-shrub*, type int
(define *test-shrub* 0)
;; definition for method 10 of type bsp-header
;; Used lq/sq
(defmethod
draw
bsp-header
((obj bsp-header) (other-draw drawable) (disp-frame display-frame))
(local-vars (r0-0 uint128) (a3-4 uint128) (a3-5 uint128))
(rlet ((vf16 :class vf)
(vf17 :class vf)
(vf18 :class vf)
(vf19 :class vf)
(vf20 :class vf)
(vf21 :class vf)
(vf22 :class vf)
(vf23 :class vf)
(vf24 :class vf)
(vf25 :class vf)
(vf26 :class vf)
(vf27 :class vf)
(vf28 :class vf)
(vf29 :class vf)
(vf30 :class vf)
(vf31 :class vf)
)
(let ((lev (-> obj level)))
(set! (-> (the-as terrain-bsp #x70000000) lev-index) (-> lev index))
(set! (-> (the-as terrain-bsp #x70000000) mood) (-> lev mood))
(if *artist-use-menu-subdiv*
(update-subdivide-settings! *subdivide-settings* *math-camera* 3)
(update-subdivide-settings!
*subdivide-settings*
*math-camera*
(-> lev index)
)
)
(add-irq-to-tex-buckets! lev)
(let ((vis-list-qwc (/ (+ (-> obj visible-list-length) 15) 16)))
(dma-send-to-spr-no-flush
(the-as uint (+ #x38b0 #x70000000))
(the-as uint (-> lev vis-bits))
(the-as uint vis-list-qwc)
#f
)
)
)
(when *artist-flip-visible*
(let ((vis-list-qwc2 (/ (+ (-> obj visible-list-length) 15) 16))
(vis-list-spad (the-as (pointer uint128) (+ #x38b0 #x70000000)))
(vis-list-lev (the-as (pointer uint128) (-> obj all-visible-list)))
)
(dotimes (current-qw vis-list-qwc2)
(let ((a3-3 (-> vis-list-spad current-qw)))
(.pnor a3-4 a3-3 r0-0)
)
(let ((t0-2 (-> vis-list-lev current-qw)))
(.pand a3-5 a3-4 t0-2)
)
(set! (-> vis-list-spad current-qw) a3-5)
)
)
)
(let ((at-0 *math-camera*))
(.lvf vf16 (&-> at-0 plane 0))
(.lvf vf17 (&-> at-0 plane 1))
(.lvf vf18 (&-> at-0 plane 2))
(.lvf vf19 (&-> at-0 plane 3))
(.lvf vf20 (&-> at-0 shrub-mat vector 0 quad))
(.lvf vf21 (&-> at-0 shrub-mat vector 1 quad))
(.lvf vf22 (&-> at-0 shrub-mat vector 2 quad))
(.lvf vf23 (&-> at-0 shrub-mat vector 3 quad))
(.lvf vf24 (&-> at-0 camera-rot vector 0 quad))
(.lvf vf25 (&-> at-0 camera-rot vector 1 quad))
(.lvf vf26 (&-> at-0 camera-rot vector 2 quad))
(.lvf vf27 (&-> at-0 camera-rot vector 3 quad))
(.lvf vf28 (&-> at-0 camera-temp vector 0 quad))
(.lvf vf29 (&-> at-0 camera-temp vector 1 quad))
(.lvf vf30 (&-> at-0 camera-temp vector 2 quad))
(.lvf vf31 (&-> at-0 camera-temp vector 3 quad))
)
(when (nonzero? (-> obj drawable-trees))
(if *debug-segment*
(add-frame
(-> *display* frames (-> *display* on-screen) frame profile-bar 0)
'draw
(new 'static 'rgba :r #x40 :b #x40 :a #x80)
)
)
(let ((a1-7 (-> obj drawable-trees)))
(draw a1-7 a1-7 disp-frame)
)
(if *debug-segment*
(add-frame
(-> *display* frames (-> *display* on-screen) frame profile-bar 0)
'draw
(new 'static 'rgba :r #x80 :g #xc0 :a #x80)
)
)
)
(let ((s5-1 (-> *display* frames (-> *display* on-screen) frame)))
(foreground-engine-execute
(-> obj level foreground-draw-engine 0)
s5-1
(-> (the-as terrain-bsp #x70000000) lev-index)
0
)
(foreground-engine-execute
(-> obj level foreground-draw-engine 1)
s5-1
(-> (the-as terrain-bsp #x70000000) lev-index)
1
)
(foreground-engine-execute
(-> obj level foreground-draw-engine 2)
s5-1
(-> (the-as terrain-bsp #x70000000) lev-index)
2
)
)
(none)
)
)
;; definition for method 15 of type bsp-header
;; INFO: Return type mismatch profile-frame vs none.
(defmethod dummy-15 bsp-header ((obj bsp-header) (arg0 object) (arg1 object))
(rlet ((vf16 :class vf)
(vf17 :class vf)
(vf18 :class vf)
(vf19 :class vf)
(vf20 :class vf)
(vf21 :class vf)
(vf22 :class vf)
(vf23 :class vf)
(vf24 :class vf)
(vf25 :class vf)
(vf26 :class vf)
(vf27 :class vf)
(vf28 :class vf)
(vf29 :class vf)
(vf30 :class vf)
(vf31 :class vf)
)
(let ((s4-0 (-> obj level)))
(set! (-> (the-as terrain-bsp #x70000000) lev-index) (-> s4-0 index))
(set! (-> (the-as terrain-bsp #x70000000) mood) (-> s4-0 mood))
(add-irq-to-tex-buckets! s4-0)
(let ((a2-1 (/ (+ (-> obj visible-list-length) 15) 16)))
(dma-send-to-spr-no-flush
(the-as uint (+ #x38b0 #x70000000))
(the-as uint (-> s4-0 vis-bits))
(the-as uint a2-1)
#f
)
)
)
(let ((at-0 *math-camera*))
(.lvf vf16 (&-> at-0 plane 0))
(.lvf vf17 (&-> at-0 plane 1))
(.lvf vf18 (&-> at-0 plane 2))
(.lvf vf19 (&-> at-0 plane 3))
(.lvf vf20 (&-> at-0 shrub-mat vector 0 quad))
(.lvf vf21 (&-> at-0 shrub-mat vector 1 quad))
(.lvf vf22 (&-> at-0 shrub-mat vector 2 quad))
(.lvf vf23 (&-> at-0 shrub-mat vector 3 quad))
(.lvf vf24 (&-> at-0 camera-rot vector 0 quad))
(.lvf vf25 (&-> at-0 camera-rot vector 1 quad))
(.lvf vf26 (&-> at-0 camera-rot vector 2 quad))
(.lvf vf27 (&-> at-0 camera-rot vector 3 quad))
(.lvf vf28 (&-> at-0 camera-temp vector 0 quad))
(.lvf vf29 (&-> at-0 camera-temp vector 1 quad))
(.lvf vf30 (&-> at-0 camera-temp vector 2 quad))
(.lvf vf31 (&-> at-0 camera-temp vector 3 quad))
)
(when (nonzero? (-> obj drawable-trees))
(if *debug-segment*
(add-frame
(-> *display* frames (-> *display* on-screen) frame profile-bar 0)
'draw
(new 'static 'rgba :r #x40 :b #x40 :a #x80)
)
)
(let ((a1-3 (-> obj drawable-trees)))
(dummy-15 a1-3 a1-3 arg1)
)
(if *debug-segment*
(add-frame
(-> *display* frames (-> *display* on-screen) frame profile-bar 0)
'draw
(new 'static 'rgba :r #x80 :g #xc0 :a #x80)
)
)
)
(none)
)
)
;; definition for method 14 of type bsp-header
(defmethod dummy-14 bsp-header ((obj bsp-header))
(rlet ((vf16 :class vf)
(vf17 :class vf)
(vf18 :class vf)
(vf19 :class vf)
(vf20 :class vf)
(vf21 :class vf)
(vf22 :class vf)
(vf23 :class vf)
(vf24 :class vf)
(vf25 :class vf)
(vf26 :class vf)
(vf27 :class vf)
(vf28 :class vf)
(vf29 :class vf)
(vf30 :class vf)
(vf31 :class vf)
)
(let ((v1-0 (-> obj level))
(a2-0 (/ (+ (-> obj visible-list-length) 15) 16))
)
(dma-send-to-spr-no-flush
(the-as uint (+ #x38b0 #x70000000))
(the-as uint (-> v1-0 vis-bits))
(the-as uint a2-0)
#f
)
)
(let ((at-0 *math-camera*))
(.lvf vf16 (&-> at-0 plane 0))
(.lvf vf17 (&-> at-0 plane 1))
(.lvf vf18 (&-> at-0 plane 2))
(.lvf vf19 (&-> at-0 plane 3))
(.lvf vf20 (&-> at-0 shrub-mat vector 0 quad))
(.lvf vf21 (&-> at-0 shrub-mat vector 1 quad))
(.lvf vf22 (&-> at-0 shrub-mat vector 2 quad))
(.lvf vf23 (&-> at-0 shrub-mat vector 3 quad))
(.lvf vf24 (&-> at-0 camera-rot vector 0 quad))
(.lvf vf25 (&-> at-0 camera-rot vector 1 quad))
(.lvf vf26 (&-> at-0 camera-rot vector 2 quad))
(.lvf vf27 (&-> at-0 camera-rot vector 3 quad))
(.lvf vf28 (&-> at-0 camera-temp vector 0 quad))
(.lvf vf29 (&-> at-0 camera-temp vector 1 quad))
(.lvf vf30 (&-> at-0 camera-temp vector 2 quad))
(.lvf vf31 (&-> at-0 camera-temp vector 3 quad))
)
(if (nonzero? (-> obj drawable-trees))
(dummy-14 (-> obj drawable-trees))
)
(none)
)
)
;; definition for function bsp-camera-asm
;; INFO: Return type mismatch int vs none.
;; WARN: Function may read a register that is not set: a2
(defun bsp-camera-asm ((bsp-hdr bsp-header) (camera-pos vector))
(local-vars (v1-1 float) (real-node bsp-node))
(rlet ((vf1 :class vf)
(vf2 :class vf)
)
(nop!)
(let ((next-node (the-as bsp-node (-> bsp-hdr nodes))))
(.lvf vf1 (&-> camera-pos quad))
(label cfg-1)
(b! (< (the-as int next-node) 0) cfg-4 :delay (set! real-node next-node))
(.lvf vf2 (&-> real-node plane quad))
(.mul.vf vf2 vf2 vf1 :mask #b111)
(.add.x.vf vf2 vf2 vf2 :mask #b10)
(.add.z.vf vf2 vf2 vf2 :mask #b10)
(.sub.w.vf vf2 vf2 vf2 :mask #b10)
(.mov v1-1 vf2)
(let ((a2-0 (-> real-node front-flags)))
(b!
(>= (the-as int v1-1) 0)
cfg-1
:delay
(set! next-node (the-as bsp-node (-> real-node front)))
)
(set! a2-0 (-> real-node back-flags))
(b! #t cfg-1 :delay (set! next-node (the-as bsp-node (-> real-node back))))
(label cfg-4)
(set! (-> bsp-hdr current-leaf-idx) (the-as uint next-node))
(set! (-> bsp-hdr current-bsp-back-flags) a2-0)
)
)
0
(none)
)
)
;; definition for method 11 of type bsp-header
;; INFO: Return type mismatch symbol vs none.
(defmethod dummy-11 bsp-header ((obj bsp-header) (arg0 int) (arg1 object))
(+! (-> *collide-stats* calls) 1)
(let ((s4-0 (-> obj drawable-trees)))
(dotimes (s3-0 (-> s4-0 length))
(dummy-11 (-> s4-0 data s3-0) arg0 arg1)
)
)
(none)
)
;; definition for method 12 of type bsp-header
;; INFO: Return type mismatch symbol vs none.
(defmethod dummy-12 bsp-header ((obj bsp-header) (arg0 int) (arg1 object))
(+! (-> *collide-stats* calls) 1)
(let ((s4-0 (-> obj drawable-trees)))
(dotimes (s3-0 (-> s4-0 length))
(dummy-12 (-> s4-0 data s3-0) arg0 arg1)
)
)
(none)
)
;; definition for method 13 of type bsp-header
;; INFO: Return type mismatch symbol vs none.
(defmethod dummy-13 bsp-header ((obj bsp-header) (arg0 int) (arg1 object))
(+! (-> *collide-stats* calls) 1)
(let ((s4-0 (-> obj drawable-trees)))
(dotimes (s3-0 (-> s4-0 length))
(dummy-13 (-> s4-0 data s3-0) arg0 arg1)
)
)
(none)
)
;; definition for method 17 of type bsp-header
;; INFO: Return type mismatch symbol vs none.
(defmethod
dummy-17
bsp-header
((obj bsp-header) (arg0 sphere) (arg1 int) (arg2 ambient-list))
(let ((s3-0 (-> obj drawable-trees)))
(dotimes (s2-0 (-> s3-0 length))
(dummy-17 (-> s3-0 data s2-0) arg0 arg1 arg2)
)
)
(none)
)
;; definition for function clear-cl-stat
;; INFO: Return type mismatch int vs none.
(defun clear-cl-stat ((arg0 cl-stat))
(set! (-> arg0 fragments) (the-as uint 0))
(set! (-> arg0 tris) (the-as uint 0))
(set! (-> arg0 output) (the-as uint 0))
0
(none)
)
;; definition for function print-cl-stat
;; INFO: Return type mismatch uint vs none.
(defun print-cl-stat ((arg0 cl-stat) (arg1 string))
(when (nonzero? (+ (-> arg0 fragments) (-> arg0 tris)))
(format
*stdcon*
"~0k~5d/~d ~6d/~d ~6d/~d "
(-> arg0 fragments)
(/ (-> arg0 fragments) (-> *collide-stats* calls))
(-> arg0 tris)
(/ (-> arg0 tris) (-> *collide-stats* calls))
(-> arg0 output)
(/ (-> arg0 output) (-> *collide-stats* calls))
)
(format *stdcon* "~0k~s~%" arg1)
(+! (-> *collide-stats* total fragments) (-> arg0 fragments))
(+! (-> *collide-stats* total tris) (-> arg0 tris))
(+! (-> *collide-stats* total output) (-> arg0 output))
)
(none)
)
;; definition for function print-collide-stats
;; INFO: Return type mismatch int vs none.
(defun print-collide-stats ()
(if *debug-segment*
(add-frame
(-> *display* frames (-> *display* on-screen) frame profile-bar 0)
'draw
(new 'static 'rgba :r #x40 :b #x40 :a #x80)
)
)
(format *stdcon* "~0k frags tris output~%")
(print-cl-stat (-> *collide-stats* other) "other")
(format
*stdcon*
"~0k---------------------------------------------------------------~%"
)
(print-cl-stat (-> *collide-stats* total) "total")
(format *stdcon* "~0kcalls = ~d~%" (-> *collide-stats* calls))
(let ((gp-0 (stopwatch-elapsed-ticks (-> *collide-stats* total-target)))
(s4-0 (stopwatch-elapsed-ticks (-> *collide-stats* target-cache-fill)))
(s5-0 (stopwatch-elapsed-ticks (-> *collide-stats* target-ray-poly)))
)
(format *stdcon* "~0ktotal-target ~D~%" gp-0)
(format
*stdcon*
"~0ktarget-cache-fill ~D ~0,,2f%~%"
s4-0
(/ (* 100.0 (the float s4-0)) (the float gp-0))
)
(format
*stdcon*
"~0ktarget-ray-poly ~D ~0,,2f%~%"
s5-0
(/ (* 100.0 (the float s5-0)) (the float gp-0))
)
)
(clear-cl-stat (-> *collide-stats* other))
(clear-cl-stat (-> *collide-stats* total))
(set! *collide-nodes* 0)
(set! (-> *collide-stats* calls) (the-as uint 0))
(stopwatch-init (-> *collide-stats* total-target))
(stopwatch-init (-> *collide-stats* target-cache-fill))
(stopwatch-init (-> *collide-stats* target-ray-poly))
(if *debug-segment*
(add-frame
(-> *display* frames (-> *display* on-screen) frame profile-bar 0)
'draw
(new 'static 'rgba :b #xff :a #x80)
)
)
0
(none)
)
;; definition for function level-remap-texture
;; INFO: Return type mismatch int vs texture-id.
(defun level-remap-texture ((tex-id texture-id))
(let ((bsp-hdr (-> *level* log-in-level-bsp)))
(when bsp-hdr
(let* ((table-size (-> bsp-hdr texture-remap-table-len))
(table-data-start (-> bsp-hdr texture-remap-table))
(table-data-ptr table-data-start)
(mask1 (the-as uint #xfffffff8))
(masked-tex-id (logand (the-as uint #xffffff00) tex-id))
(table-data-end (&+ table-data-ptr (* table-size 8)))
)
(label cfg-2)
(b! (= (the-as object table-data-start) table-data-end) cfg-8)
(let
((midpoint
(the-as
object
(logand
(/
(the-as
int
(+ (the-as int table-data-start) (the-as int table-data-end))
)
2
)
mask1
)
)
)
)
(let
((diff
(- (-> (the-as (pointer int32) midpoint) 0) (the-as int masked-tex-id))
)
)
(b! (zero? diff) cfg-7)
(b! (< diff 0) cfg-6 :delay (nop!))
)
(b!
#t
cfg-2
:delay
(set!
table-data-end
(the-as (pointer uint64) (the-as (pointer uint64) midpoint))
)
)
(label cfg-6)
(b!
#t
cfg-2
:delay
(set!
table-data-start
(the-as (pointer uint64) (+ (the-as int midpoint) 8))
)
)
(label cfg-7)
(set!
tex-id
(the-as texture-id (logior (-> (the-as (pointer int32) midpoint) 1) 20))
)
)
)
(label cfg-8)
0
)
)
(the-as texture-id tex-id)
)
@@ -268,23 +268,23 @@
;; definition of type level-group
(deftype level-group (basic)
((length int32 :offset-assert 4)
(log-in-level level :offset-assert 8)
(loading-level level :offset-assert 12)
(entity-link entity-links :offset-assert 16)
(border? basic :offset-assert 20)
(vis? basic :offset-assert 24)
(want-level basic :offset-assert 28)
(receiving-level basic :offset-assert 32)
(load-commands pair :offset-assert 36)
(play? symbol :offset-assert 40)
(_hack-pad uint8 :offset 90)
(level0 level :inline :offset-assert 96)
(level1 level :inline :offset-assert 2704)
(level-default level :inline :offset-assert 5312)
(level level 3 :inline :offset 96)
(data level 3 :inline :offset 96)
(pad uint32 :offset-assert 7920)
((length int32 :offset-assert 4)
(log-in-level-bsp bsp-header :offset-assert 8)
(loading-level level :offset-assert 12)
(entity-link entity-links :offset-assert 16)
(border? basic :offset-assert 20)
(vis? basic :offset-assert 24)
(want-level basic :offset-assert 28)
(receiving-level basic :offset-assert 32)
(load-commands pair :offset-assert 36)
(play? symbol :offset-assert 40)
(_hack-pad uint8 :offset 90)
(level0 level :inline :offset-assert 96)
(level1 level :inline :offset-assert 2704)
(level-default level :inline :offset-assert 5312)
(level level 3 :inline :offset 96)
(data level 3 :inline :offset 96)
(pad uint32 :offset-assert 7920)
)
:method-count-assert 27
:size-assert #x1ef4
@@ -336,7 +336,7 @@
*level*
(new 'static 'level-group
:length 2
:log-in-level #f
:log-in-level-bsp #f
:loading-level #f
:entity-link #f
:border? #f
@@ -396,7 +396,7 @@
;; definition for function vector-rad<-vector-deg!
;; INFO: Return type mismatch float vs none.
(defun vector-rad<-vector-deg! ((arg0 vector) (arg1 vector))
(local-vars (v0-0 float) (v1-1 float) (v1-2 int) (v1-3 int))
(local-vars (v0-0 float) (v1-1 uint128) (v1-2 uint128) (v1-3 uint128))
(rlet ((vf1 :class vf)
(vf2 :class vf)
)
@@ -420,7 +420,7 @@
;; definition for function vector-rad<-vector-deg/2!
;; INFO: Return type mismatch float vs int.
(defun vector-rad<-vector-deg/2! ((arg0 vector) (arg1 vector))
(local-vars (v0-0 float) (v1-1 float) (v1-2 int) (v1-3 int))
(local-vars (v0-0 float) (v1-1 uint128) (v1-2 uint128) (v1-3 uint128))
(rlet ((vf1 :class vf)
(vf2 :class vf)
)
@@ -682,8 +682,8 @@
:size-assert #x28
:flag-assert #xb00000028
(:methods
(TODO-RENAME-HUGE-9 (_type_ vector) none 9)
(TODO-RENAME-10 (_type_ vector vector) float 10)
(debug-draw (_type_ vector) none 9)
(ray-capsule-intersect (_type_ vector vector) float 10)
)
)
@@ -708,8 +708,8 @@
:size-assert #x28
:flag-assert #xb00000028
(:methods
(TODO-RENAME-HUGE-9 (_type_ vector) none 9)
(TODO-RENAME-10 (_type_ vector vector) float 10)
(debug-draw (_type_ vector) none 9)
(ray-flat-cyl-intersect (_type_ vector vector) float 10)
)
)
@@ -997,7 +997,7 @@
;; definition for function vector-degi
;; Used lq/sq
(defun vector-degi ((arg0 vector) (arg1 vector))
(local-vars (v1-0 float) (v1-1 int))
(local-vars (v1-0 uint128) (v1-1 uint128))
(rlet ((vf1 :class vf))
(.lvf vf1 (&-> arg1 quad))
(.ftoi.vf vf1 vf1)
@@ -1025,7 +1025,7 @@
;; definition for function vector-degmod
(defun vector-degmod ((arg0 vector) (arg1 vector))
(local-vars (v1-0 float) (v1-1 int) (v1-2 int))
(local-vars (v1-0 uint128) (v1-1 uint128) (v1-2 uint128))
(rlet ((vf1 :class vf))
(.lvf vf1 (&-> arg1 quad))
(.ftoi.vf vf1 vf1)
@@ -1044,12 +1044,12 @@
(defun vector-deg-diff ((arg0 vector) (arg1 vector) (arg2 vector))
(local-vars
(v0-0 float)
(v1-0 float)
(v1-1 int)
(v1-2 int)
(v1-3 int)
(a1-1 float)
(a1-2 int)
(v1-0 uint128)
(v1-1 uint128)
(v1-2 uint128)
(v1-3 uint128)
(a1-1 uint128)
(a1-2 uint128)
)
(rlet ((vf1 :class vf)
(vf2 :class vf)
@@ -0,0 +1,56 @@
#include "gtest/gtest.h"
#include "FormRegressionTest.h"
using namespace decompiler;
// vector-rad<-vector-deg/2!
TEST_F(FormRegressionTest, VectorDegToVectorRad) {
std::string func =
"sll r0, r0, 0\n"
" lui v1, 14537\n"
" ori v1, v1, 4058\n"
" lui a2, 16128\n"
" lqc2 vf1, 0(a1)\n"
" qmtc2.i vf2, a2\n"
" vmulx.xyzw vf1, vf1, vf2\n"
" vftoi0.xyzw vf1, vf1\n"
" qmtc2.i vf2, v1\n"
" qmfc2.i v1, vf1\n"
" psllw v1, v1, 16\n"
" psraw v1, v1, 16\n"
" qmtc2.i vf1, v1\n"
" vitof0.xyzw vf1, vf1\n"
" vmulx.xyzw vf1, vf1, vf2\n"
" sqc2 vf1, 0(a0)\n"
" qmfc2.i v0, vf1\n"
" jr ra\n"
" daddu sp, sp, r0";
std::string type = "(function vector vector none)";
std::string expected =
"(defun test-function ((arg0 vector) (arg1 vector))\n"
" (local-vars (v0-0 float) (v1-1 uint128) (v1-2 uint128) (v1-3 uint128))\n"
" (rlet ((vf1 :class vf)\n"
" (vf2 :class vf)\n"
" )\n"
" (let ((v1-0 #x38c90fda))\n"
" (let ((a2-0 #x3f000000))\n"
" (.lvf vf1 (&-> arg1 quad))\n"
" (.mov vf2 a2-0)\n"
" )\n"
" (.mul.x.vf vf1 vf1 vf2)\n"
" (.ftoi.vf vf1 vf1)\n"
" (.mov vf2 v1-0)\n"
" )\n"
" (.mov v1-1 vf1)\n"
" (.pw.sll v1-2 v1-1 16)\n"
" (.pw.sra v1-3 v1-2 16)\n"
" (.mov vf1 v1-3)\n"
" (.itof.vf vf1 vf1)\n"
" (.mul.x.vf vf1 vf1 vf2)\n"
" (.svf (&-> arg0 quad) vf1)\n"
" (.mov v0-0 vf1)\n"
" (none)\n"
" )\n"
" )";
test_final_function(func, type, expected);
}
+17 -1
View File
@@ -41,11 +41,27 @@ TEST(DecompilerInstructionParser, ProgramLabels) {
EXPECT_EQ(result.print(), program);
}
TEST(DecompilerInstructionParser, VU) {
TEST(DecompilerInstructionParser, VuMask) {
InstructionParser parser;
std::string program =
" vmove.xy vf1, vf2\n"
" vsub.yw vf1, vf2, vf25\n";
auto result = parser.parse_program(program);
EXPECT_EQ(result.print(), program);
}
TEST(DecompilerInstructionParser, VuMoves) {
InstructionParser parser;
std::string program =
" qmtc2.i vf2, a2\n"
" qmfc2.i v0, vf1\n";
auto result = parser.parse_program(program);
EXPECT_EQ(result.print(), program);
}
TEST(DecompilerInstructionParser, VuBroadcast) {
InstructionParser parser;
std::string program = " vmuly.xyw vf1, vf1, vf2\n";
auto result = parser.parse_program(program);
EXPECT_EQ(result.print(), program);
}
@@ -0,0 +1,51 @@
(let ((v1 (new 'stack 'array 'uint8 16))
(v2 (new 'stack 'array 'uint8 16))
(v3 (new 'stack 'array 'uint8 16))
)
;; initialize stack arrays
(dotimes (i 16)
(set! (-> v1 i) i)
(set! (-> v2 i) (+ i 3))
)
(let ((v1-quad (-> (the (pointer uint128) v1)))
(v2-quad (-> (the (pointer uint128) v2)))
(v3-quad (the uint128 0))
)
(.por v3-quad v1-quad v2-quad)
;;(print128 v1-quad) (format #t "~%")
;;(print128 v2-quad) (format #t "~%")
(print128 v3-quad) (format #t "~%")
(.pnor v3-quad v1-quad v2-quad)
;;(print128 v1-quad) (format #t "~%")
;;(print128 v2-quad) (format #t "~%")
(print128 v3-quad) (format #t "~%")
(.pand v3-quad v1-quad v2-quad)
;;(print128 v1-quad) (format #t "~%")
;;(print128 v2-quad) (format #t "~%")
(print128 v3-quad) (format #t "~%~%")
(format #t "#x")
(countdown (i 16)
(format #t "~02x" (logand #xff (logior (-> v1 i) (-> v2 i))))
)
(format #t "~%")
(format #t "#x")
(countdown (i 16)
(format #t "~02x" (logand #xff (lognor (-> v1 i) (-> v2 i))))
)
(format #t "~%")
(format #t "#x")
(countdown (i 16)
(format #t "~02x" (logand #xff (logand (-> v1 i) (-> v2 i))))
)
(format #t "~%")
)
)
+11
View File
@@ -805,6 +805,17 @@ TEST_F(WithGameTests, RaySphere) {
"Got -100000000.0000\n0\n"});
}
TEST_F(WithGameTests, PandPorPnor) {
runner.run_static_test(env, testCategory, "test-pand-por-pnor.gc",
{"#x1f1f1d0f0f0f0d0b0f0f0d0707070503\n"
"#xe0e0e2f0f0f0f2f4f0f0f2f8f8f8fafc\n"
"#x0200000c0a0808080200000402000000\n"
"\n"
"#x1f1f1d0f0f0f0d0b0f0f0d0707070503\n"
"#xe0e0e2f0f0f0f2f4f0f0f2f8f8f8fafc\n"
"#x0200000c0a0808080200000402000000\n0\n"});
}
TEST(TypeConsistency, TypeConsistency) {
Compiler compiler;
compiler.enable_throw_on_redefines();
+9 -9
View File
@@ -100,11 +100,9 @@ const std::unordered_set<std::string> g_functions_to_skip_compiling = {
"rand-vu-nostep", // random hardware
// trig
"sin-rad", // fpu acc
"cos-rad", // fpu acc
"atan-series-rad", // fpu acc
"vector-rad<-vector-deg!", // bad decisions on float vs int128
"vector-rad<-vector-deg/2!", // bad decisions on float vs int128
"sin-rad", // fpu acc
"cos-rad", // fpu acc
"atan-series-rad", // fpu acc
/// VECTOR-H
"(method 3 vector)", // this function appears twice, which confuses the compiler.
@@ -121,10 +119,6 @@ const std::unordered_set<std::string> g_functions_to_skip_compiling = {
// display-h
"put-draw-env",
// vector
// bad decisions on float vs int128
"vector-degf", "vector-degmod", "vector-deg-diff", "vector-degi",
// geometry
"calculate-basis-functions-vector!", // asm requiring manual rewrite
"curve-evaluate!", // asm requiring manual rewrite
@@ -153,6 +147,12 @@ const std::unordered_set<std::string> g_functions_to_skip_compiling = {
// aligner - return-from-thread, currently not supported
"(method 9 align-control)",
// stat collection
"start-perf-stat-collection", "end-perf-stat-collection",
// float to int
"(method 10 bsp-header)",
// loader - decompiler bug with detecting handle macros
"(method 10 external-art-buffer)"};
+45
View File
@@ -521,4 +521,49 @@ TEST(EmitterAVX, VPSUBD) {
tester.emit(IGen::vpsubd(XMM0 + 13, XMM0 + 13, XMM0 + 13));
EXPECT_EQ(tester.dump_to_hex_string(true),
"C5E1FADBC4C161FADDC591FADBC4C111FADDC561FAEBC44161FAEDC511FAEBC44111FAED");
}
TEST(EmitterAVX, VPOR) {
CodeTester tester;
tester.init_code_buffer(1024);
tester.emit(IGen::parallel_bitwise_or(XMM0 + 3, XMM0 + 3, XMM0 + 3));
tester.emit(IGen::parallel_bitwise_or(XMM0 + 3, XMM0 + 3, XMM0 + 13));
tester.emit(IGen::parallel_bitwise_or(XMM0 + 3, XMM0 + 13, XMM0 + 3));
tester.emit(IGen::parallel_bitwise_or(XMM0 + 3, XMM0 + 13, XMM0 + 13));
tester.emit(IGen::parallel_bitwise_or(XMM0 + 13, XMM0 + 3, XMM0 + 3));
tester.emit(IGen::parallel_bitwise_or(XMM0 + 13, XMM0 + 3, XMM0 + 13));
tester.emit(IGen::parallel_bitwise_or(XMM0 + 13, XMM0 + 13, XMM0 + 3));
tester.emit(IGen::parallel_bitwise_or(XMM0 + 13, XMM0 + 13, XMM0 + 13));
EXPECT_EQ(tester.dump_to_hex_string(true),
"C5E1EBDBC4C161EBDDC591EBDBC4C111EBDDC561EBEBC44161EBEDC511EBEBC44111EBED");
}
TEST(EmitterAVX, VPXOR) {
CodeTester tester;
tester.init_code_buffer(1024);
tester.emit(IGen::parallel_bitwise_xor(XMM0 + 3, XMM0 + 3, XMM0 + 3));
tester.emit(IGen::parallel_bitwise_xor(XMM0 + 3, XMM0 + 3, XMM0 + 13));
tester.emit(IGen::parallel_bitwise_xor(XMM0 + 3, XMM0 + 13, XMM0 + 3));
tester.emit(IGen::parallel_bitwise_xor(XMM0 + 3, XMM0 + 13, XMM0 + 13));
tester.emit(IGen::parallel_bitwise_xor(XMM0 + 13, XMM0 + 3, XMM0 + 3));
tester.emit(IGen::parallel_bitwise_xor(XMM0 + 13, XMM0 + 3, XMM0 + 13));
tester.emit(IGen::parallel_bitwise_xor(XMM0 + 13, XMM0 + 13, XMM0 + 3));
tester.emit(IGen::parallel_bitwise_xor(XMM0 + 13, XMM0 + 13, XMM0 + 13));
EXPECT_EQ(tester.dump_to_hex_string(true),
"C5E1EFDBC4C161EFDDC591EFDBC4C111EFDDC561EFEBC44161EFEDC511EFEBC44111EFED");
}
TEST(EmitterAVX, VPAND) {
CodeTester tester;
tester.init_code_buffer(1024);
tester.emit(IGen::parallel_bitwise_and(XMM0 + 3, XMM0 + 3, XMM0 + 3));
tester.emit(IGen::parallel_bitwise_and(XMM0 + 3, XMM0 + 3, XMM0 + 13));
tester.emit(IGen::parallel_bitwise_and(XMM0 + 3, XMM0 + 13, XMM0 + 3));
tester.emit(IGen::parallel_bitwise_and(XMM0 + 3, XMM0 + 13, XMM0 + 13));
tester.emit(IGen::parallel_bitwise_and(XMM0 + 13, XMM0 + 3, XMM0 + 3));
tester.emit(IGen::parallel_bitwise_and(XMM0 + 13, XMM0 + 3, XMM0 + 13));
tester.emit(IGen::parallel_bitwise_and(XMM0 + 13, XMM0 + 13, XMM0 + 3));
tester.emit(IGen::parallel_bitwise_and(XMM0 + 13, XMM0 + 13, XMM0 + 13));
EXPECT_EQ(tester.dump_to_hex_string(true),
"C5E1DBDBC4C161DBDDC591DBDBC4C111DBDDC561DBEBC44161DBEDC511DBEBC44111DBED");
}
+3
View File
@@ -1102,6 +1102,8 @@ TEST(GoosObject, String) {
Object obj2 = StringObject::make_new("test2");
Object obj3 = StringObject::make_new("test1");
Object obj4 = StringObject::make_new("test-with\"quote");
EXPECT_TRUE(obj1.is_string());
EXPECT_TRUE(obj1 == obj3);
@@ -1112,6 +1114,7 @@ TEST(GoosObject, String) {
EXPECT_EQ(obj1.print(), "\"test1\"");
EXPECT_EQ(obj1.inspect(), "[string] \"test1\"\n");
EXPECT_EQ(obj4.print(), "\"test-with\\\"quote\"");
}
/*!