mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-13 02:08:49 +12:00
New bitsets (experimental)
This commit is contained in:
parent
71441819e5
commit
46735d6b3d
20 changed files with 802 additions and 361 deletions
|
@ -11,9 +11,30 @@ const ppu_decoder<ppu_itype> s_ppu_itype;
|
|||
const ppu_decoder<ppu_iname> s_ppu_iname;
|
||||
|
||||
template<>
|
||||
void fmt_class_string<bitset_t<ppu_attr>::raw_type>::format(std::string& out, u64 arg)
|
||||
void fmt_class_string<ppu_attr>::format(std::string& out, u64 arg)
|
||||
{
|
||||
out += "[UNIMPLEMENTED]";
|
||||
format_enum(out, arg, [](ppu_attr value)
|
||||
{
|
||||
switch (value)
|
||||
{
|
||||
case ppu_attr::known_addr: return "known_addr";
|
||||
case ppu_attr::known_size: return "known_size";
|
||||
case ppu_attr::no_return: return "no_return";
|
||||
case ppu_attr::no_size: return "no_size";
|
||||
case ppu_attr::uses_r0: return "uses_r0";
|
||||
case ppu_attr::entry_point: return "entry_point";
|
||||
case ppu_attr::complex_stack: return "complex_stack";
|
||||
case ppu_attr::__bitset_enum_max: break;
|
||||
}
|
||||
|
||||
return unknown;
|
||||
});
|
||||
}
|
||||
|
||||
template<>
|
||||
void fmt_class_string<bs_t<ppu_attr>>::format(std::string& out, u64 arg)
|
||||
{
|
||||
format_bitset(out, arg, "[", ",", "]", &fmt_class_string<ppu_attr>::format);
|
||||
}
|
||||
|
||||
void ppu_validate(const std::string& fname, const std::vector<ppu_function>& funcs, u32 reloc)
|
||||
|
@ -377,7 +398,7 @@ std::vector<ppu_function> ppu_analyse(const std::vector<std::pair<u32, u32>>& se
|
|||
{
|
||||
for (auto it = funcs.lower_bound(addr), end = funcs.end(); it != end; it++)
|
||||
{
|
||||
if (it->second.attr & ppu_attr::known_addr)
|
||||
if (test(it->second.attr, ppu_attr::known_addr))
|
||||
{
|
||||
return it->first;
|
||||
}
|
||||
|
@ -682,7 +703,7 @@ std::vector<ppu_function> ppu_analyse(const std::vector<std::pair<u32, u32>>& se
|
|||
}
|
||||
|
||||
// Get function limit
|
||||
const u32 func_end = std::min<u32>(get_limit(func.addr + 1), func.attr & ppu_attr::known_size ? func.addr + func.size : end);
|
||||
const u32 func_end = std::min<u32>(get_limit(func.addr + 1), test(func.attr, ppu_attr::known_size) ? func.addr + func.size : end);
|
||||
|
||||
// Block analysis workload
|
||||
std::vector<std::reference_wrapper<std::pair<const u32, u32>>> block_queue;
|
||||
|
@ -715,7 +736,7 @@ std::vector<ppu_function> ppu_analyse(const std::vector<std::pair<u32, u32>>& se
|
|||
}
|
||||
|
||||
// TODO: lower priority?
|
||||
if (func.attr & ppu_attr::no_size)
|
||||
if (test(func.attr, ppu_attr::no_size))
|
||||
{
|
||||
// Get next function
|
||||
const auto _next = funcs.lower_bound(func.blocks.crbegin()->first + 1);
|
||||
|
@ -777,12 +798,12 @@ std::vector<ppu_function> ppu_analyse(const std::vector<std::pair<u32, u32>>& se
|
|||
}
|
||||
|
||||
// Add next block if necessary
|
||||
if ((is_call && !pfunc->attr.test(ppu_attr::no_return)) || (type == ppu_itype::BC && (op.bo & 0x14) != 0x14))
|
||||
if ((is_call && !test(pfunc->attr, ppu_attr::no_return)) || (type == ppu_itype::BC && (op.bo & 0x14) != 0x14))
|
||||
{
|
||||
add_block(_ptr.addr());
|
||||
}
|
||||
|
||||
if (op.lk && (target == iaddr || pfunc->attr.test(ppu_attr::no_return)))
|
||||
if (op.lk && (target == iaddr || test(pfunc->attr, ppu_attr::no_return)))
|
||||
{
|
||||
// Nothing
|
||||
}
|
||||
|
@ -843,11 +864,12 @@ std::vector<ppu_function> ppu_analyse(const std::vector<std::pair<u32, u32>>& se
|
|||
if (jt_addr != jt_end && _ptr.addr() == jt_addr)
|
||||
{
|
||||
// Acknowledge jumptable detection failure
|
||||
if (!func.attr.test_and_set(ppu_attr::no_size))
|
||||
if (!test(func.attr, ppu_attr::no_size))
|
||||
{
|
||||
LOG_WARNING(PPU, "[0x%x] Jump table not found! 0x%x-0x%x", func.addr, jt_addr, jt_end);
|
||||
}
|
||||
|
||||
func.attr += ppu_attr::no_size;
|
||||
add_block(iaddr);
|
||||
block_queue.clear();
|
||||
}
|
||||
|
@ -871,7 +893,7 @@ std::vector<ppu_function> ppu_analyse(const std::vector<std::pair<u32, u32>>& se
|
|||
}
|
||||
|
||||
// Finalization: determine function size
|
||||
if (!func.attr.test(ppu_attr::known_size))
|
||||
if (!test(func.attr, ppu_attr::known_size))
|
||||
{
|
||||
const auto last = func.blocks.crbegin();
|
||||
|
||||
|
@ -937,7 +959,7 @@ std::vector<ppu_function> ppu_analyse(const std::vector<std::pair<u32, u32>>& se
|
|||
}
|
||||
|
||||
// Finalization: decrease known function size (TODO)
|
||||
if (func.attr & ppu_attr::known_size)
|
||||
if (test(func.attr, ppu_attr::known_size))
|
||||
{
|
||||
const auto last = func.blocks.crbegin();
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue