Adding tests for branch/carry and logging disasm on test failure.
This commit is contained in:
parent
29c77a3087
commit
6b52f6715a
|
@ -71,5 +71,21 @@ SourceMapEntry* DebugInfo::LookupCodeOffset(uint32_t offset) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DebugInfo::Dump() {
|
||||||
|
if (source_disasm_) {
|
||||||
|
printf("PPC:\n%s\n", source_disasm_);
|
||||||
|
}
|
||||||
|
if (raw_hir_disasm_) {
|
||||||
|
printf("Unoptimized HIR:\n%s\n", raw_hir_disasm_);
|
||||||
|
}
|
||||||
|
if (hir_disasm_) {
|
||||||
|
printf("Optimized HIR:\n%s\n", hir_disasm_);
|
||||||
|
}
|
||||||
|
if (machine_code_disasm_) {
|
||||||
|
printf("Machine Code:\n%s\n", machine_code_disasm_);
|
||||||
|
}
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace cpu
|
} // namespace cpu
|
||||||
} // namespace xe
|
} // namespace xe
|
||||||
|
|
|
@ -31,6 +31,10 @@ enum DebugInfoFlags {
|
||||||
kDebugInfoTraceFunctionCoverage = (1 << 7) | kDebugInfoTraceFunctions,
|
kDebugInfoTraceFunctionCoverage = (1 << 7) | kDebugInfoTraceFunctions,
|
||||||
kDebugInfoTraceFunctionReferences = (1 << 8) | kDebugInfoTraceFunctions,
|
kDebugInfoTraceFunctionReferences = (1 << 8) | kDebugInfoTraceFunctions,
|
||||||
kDebugInfoTraceFunctionData = (1 << 9) | kDebugInfoTraceFunctions,
|
kDebugInfoTraceFunctionData = (1 << 9) | kDebugInfoTraceFunctions,
|
||||||
|
|
||||||
|
kDebugInfoAllTracing =
|
||||||
|
kDebugInfoTraceFunctions | kDebugInfoTraceFunctionCoverage |
|
||||||
|
kDebugInfoTraceFunctionReferences | kDebugInfoTraceFunctionData,
|
||||||
kDebugInfoAll = 0xFFFFFFFF,
|
kDebugInfoAll = 0xFFFFFFFF,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -72,6 +76,8 @@ class DebugInfo {
|
||||||
SourceMapEntry* LookupHIROffset(uint32_t offset);
|
SourceMapEntry* LookupHIROffset(uint32_t offset);
|
||||||
SourceMapEntry* LookupCodeOffset(uint32_t offset);
|
SourceMapEntry* LookupCodeOffset(uint32_t offset);
|
||||||
|
|
||||||
|
void Dump();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
uint32_t address_reference_count_;
|
uint32_t address_reference_count_;
|
||||||
uint32_t instruction_result_count_;
|
uint32_t instruction_result_count_;
|
||||||
|
|
|
@ -124,6 +124,11 @@ bool PPCTranslator::Translate(FunctionInfo* symbol_info,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto debugger = frontend_->processor()->debugger();
|
||||||
|
if (!debugger) {
|
||||||
|
debug_info_flags &= ~DebugInfoFlags::kDebugInfoAllTracing;
|
||||||
|
}
|
||||||
|
|
||||||
// Setup trace data, if needed.
|
// Setup trace data, if needed.
|
||||||
if (debug_info_flags & DebugInfoFlags::kDebugInfoTraceFunctions) {
|
if (debug_info_flags & DebugInfoFlags::kDebugInfoTraceFunctions) {
|
||||||
// Base trace data.
|
// Base trace data.
|
||||||
|
@ -133,9 +138,7 @@ bool PPCTranslator::Translate(FunctionInfo* symbol_info,
|
||||||
trace_data_size += debug::FunctionTraceData::SizeOfInstructionCounts(
|
trace_data_size += debug::FunctionTraceData::SizeOfInstructionCounts(
|
||||||
symbol_info->address(), symbol_info->end_address());
|
symbol_info->address(), symbol_info->end_address());
|
||||||
}
|
}
|
||||||
uint8_t* trace_data =
|
uint8_t* trace_data = debugger->AllocateFunctionTraceData(trace_data_size);
|
||||||
frontend_->processor()->debugger()->AllocateFunctionTraceData(
|
|
||||||
trace_data_size);
|
|
||||||
if (trace_data) {
|
if (trace_data) {
|
||||||
debug_info->trace_data().Reset(trace_data, trace_data_size,
|
debug_info->trace_data().Reset(trace_data, trace_data_size,
|
||||||
symbol_info->address(),
|
symbol_info->address(),
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
test_equiv_1:
|
||||||
|
#_ REGISTER_IN r11 0x9E2A83C1
|
||||||
|
lis r9, -0x61D6 # 0x9E2A83C1
|
||||||
|
ori r30, r9, 0x83C1 # 0x9E2A83C1
|
||||||
|
subf r8, r11, r30
|
||||||
|
addic r7, r8, -1
|
||||||
|
subfe. r31, r7, r8
|
||||||
|
beq .test_equiv_1_good
|
||||||
|
li r12, 0
|
||||||
|
blr
|
||||||
|
.test_equiv_1_good:
|
||||||
|
li r12, 1
|
||||||
|
blr
|
||||||
|
#_ REGISTER_OUT r7 0xfffffffeffffffff
|
||||||
|
#_ REGISTER_OUT r8 0xffffffff00000000
|
||||||
|
#_ REGISTER_OUT r9 0xffffffff9e2a0000
|
||||||
|
#_ REGISTER_OUT r30 0xffffffff9e2a83c1
|
||||||
|
#_ REGISTER_OUT r31 0
|
||||||
|
#_ REGISTER_OUT r11 0x000000009e2a83c1
|
||||||
|
#_ REGISTER_OUT r12 1
|
||||||
|
|
||||||
|
test_equiv_2:
|
||||||
|
#_ REGISTER_IN r11 0xffffffff9e2a83c1
|
||||||
|
lis r9, -0x61D6 # 0x9E2A83C1
|
||||||
|
ori r30, r9, 0x83C1 # 0x9E2A83C1
|
||||||
|
subf r8, r11, r30
|
||||||
|
addic r7, r8, -1
|
||||||
|
subfe. r31, r7, r8
|
||||||
|
beq .test_equiv_2_good
|
||||||
|
li r12, 0
|
||||||
|
blr
|
||||||
|
.test_equiv_2_good:
|
||||||
|
li r12, 1
|
||||||
|
blr
|
||||||
|
#_ REGISTER_OUT r7 0xffffffffffffffff
|
||||||
|
#_ REGISTER_OUT r8 0xffffffff00000000
|
||||||
|
#_ REGISTER_OUT r9 0xffffffff9e2a0000
|
||||||
|
#_ REGISTER_OUT r30 0xffffffff9e2a83c1
|
||||||
|
#_ REGISTER_OUT r31 0
|
||||||
|
#_ REGISTER_OUT r11 0xffffffff9e2a83c1
|
||||||
|
#_ REGISTER_OUT r12 1
|
|
@ -177,6 +177,7 @@ class TestRunner {
|
||||||
|
|
||||||
processor.reset(new Processor(memory.get(), nullptr, nullptr));
|
processor.reset(new Processor(memory.get(), nullptr, nullptr));
|
||||||
processor->Setup();
|
processor->Setup();
|
||||||
|
processor->set_debug_info_flags(DebugInfoFlags::kDebugInfoAll);
|
||||||
}
|
}
|
||||||
|
|
||||||
~TestRunner() {
|
~TestRunner() {
|
||||||
|
@ -228,6 +229,10 @@ class TestRunner {
|
||||||
|
|
||||||
// Assert test state expectations.
|
// Assert test state expectations.
|
||||||
bool result = CheckTestResults(test_case);
|
bool result = CheckTestResults(test_case);
|
||||||
|
if (!result) {
|
||||||
|
// Also dump all disasm/etc.
|
||||||
|
fn->debug_info()->Dump();
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
|
@ -208,6 +208,7 @@
|
||||||
<None Include="instr_vupkd3d128.s" />
|
<None Include="instr_vupkd3d128.s" />
|
||||||
<None Include="instr_vupkhsh.s" />
|
<None Include="instr_vupkhsh.s" />
|
||||||
<None Include="instr_vupklsh.s" />
|
<None Include="instr_vupklsh.s" />
|
||||||
|
<None Include="sequence_branch_carry.s" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="..\..\..\base\main.h" />
|
<ClInclude Include="..\..\..\base\main.h" />
|
||||||
|
|
|
@ -94,6 +94,7 @@
|
||||||
<None Include="instr_vupkd3d128.s" />
|
<None Include="instr_vupkd3d128.s" />
|
||||||
<None Include="instr_vupkhsh.s" />
|
<None Include="instr_vupkhsh.s" />
|
||||||
<None Include="instr_fnabs.s" />
|
<None Include="instr_fnabs.s" />
|
||||||
|
<None Include="sequence_branch_carry.s" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Filter Include="src">
|
<Filter Include="src">
|
||||||
|
|
|
@ -51,6 +51,10 @@ class Processor {
|
||||||
|
|
||||||
bool Setup();
|
bool Setup();
|
||||||
|
|
||||||
|
void set_debug_info_flags(uint32_t debug_info_flags) {
|
||||||
|
debug_info_flags_ = debug_info_flags;
|
||||||
|
}
|
||||||
|
|
||||||
bool AddModule(std::unique_ptr<Module> module);
|
bool AddModule(std::unique_ptr<Module> module);
|
||||||
Module* GetModule(const char* name);
|
Module* GetModule(const char* name);
|
||||||
Module* GetModule(const std::string& name) { return GetModule(name.c_str()); }
|
Module* GetModule(const std::string& name) { return GetModule(name.c_str()); }
|
||||||
|
|
Loading…
Reference in New Issue