Moving some util types into poly.
This commit is contained in:
parent
b392afbfae
commit
59395318f3
|
@ -9,13 +9,13 @@
|
||||||
|
|
||||||
#include "alloy/backend/x64/x64_assembler.h"
|
#include "alloy/backend/x64/x64_assembler.h"
|
||||||
|
|
||||||
#include "alloy/reset_scope.h"
|
|
||||||
#include "alloy/backend/x64/x64_backend.h"
|
#include "alloy/backend/x64/x64_backend.h"
|
||||||
#include "alloy/backend/x64/x64_emitter.h"
|
#include "alloy/backend/x64/x64_emitter.h"
|
||||||
#include "alloy/backend/x64/x64_function.h"
|
#include "alloy/backend/x64/x64_function.h"
|
||||||
#include "alloy/hir/hir_builder.h"
|
#include "alloy/hir/hir_builder.h"
|
||||||
#include "alloy/hir/label.h"
|
#include "alloy/hir/label.h"
|
||||||
#include "alloy/runtime/runtime.h"
|
#include "alloy/runtime/runtime.h"
|
||||||
|
#include "poly/reset_scope.h"
|
||||||
#include "xenia/profiling.h"
|
#include "xenia/profiling.h"
|
||||||
|
|
||||||
namespace BE {
|
namespace BE {
|
||||||
|
@ -67,7 +67,7 @@ int X64Assembler::Assemble(FunctionInfo* symbol_info, HIRBuilder* builder,
|
||||||
SCOPE_profile_cpu_f("alloy");
|
SCOPE_profile_cpu_f("alloy");
|
||||||
|
|
||||||
// Reset when we leave.
|
// Reset when we leave.
|
||||||
make_reset_scope(this);
|
poly::make_reset_scope(this);
|
||||||
|
|
||||||
// Lower HIR -> x64.
|
// Lower HIR -> x64.
|
||||||
void* machine_code = 0;
|
void* machine_code = 0;
|
||||||
|
@ -97,7 +97,7 @@ int X64Assembler::Assemble(FunctionInfo* symbol_info, HIRBuilder* builder,
|
||||||
}
|
}
|
||||||
|
|
||||||
void X64Assembler::DumpMachineCode(DebugInfo* debug_info, void* machine_code,
|
void X64Assembler::DumpMachineCode(DebugInfo* debug_info, void* machine_code,
|
||||||
size_t code_size, StringBuffer* str) {
|
size_t code_size, poly::StringBuffer* str) {
|
||||||
BE::DISASM disasm = {0};
|
BE::DISASM disasm = {0};
|
||||||
disasm.Archi = 64;
|
disasm.Archi = 64;
|
||||||
disasm.Options = BE::Tabulation + BE::MasmSyntax + BE::PrefixedNumeral;
|
disasm.Options = BE::Tabulation + BE::MasmSyntax + BE::PrefixedNumeral;
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
#include "alloy/backend/assembler.h"
|
#include "alloy/backend/assembler.h"
|
||||||
#include "alloy/string_buffer.h"
|
#include "poly/string_buffer.h"
|
||||||
|
|
||||||
namespace alloy {
|
namespace alloy {
|
||||||
namespace backend {
|
namespace backend {
|
||||||
|
@ -39,14 +39,14 @@ class X64Assembler : public Assembler {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void DumpMachineCode(runtime::DebugInfo* debug_info, void* machine_code,
|
void DumpMachineCode(runtime::DebugInfo* debug_info, void* machine_code,
|
||||||
size_t code_size, StringBuffer* str);
|
size_t code_size, poly::StringBuffer* str);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
X64Backend* x64_backend_;
|
X64Backend* x64_backend_;
|
||||||
std::unique_ptr<X64Emitter> emitter_;
|
std::unique_ptr<X64Emitter> emitter_;
|
||||||
std::unique_ptr<XbyakAllocator> allocator_;
|
std::unique_ptr<XbyakAllocator> allocator_;
|
||||||
|
|
||||||
StringBuffer string_buffer_;
|
poly::StringBuffer string_buffer_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace x64
|
} // namespace x64
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include "alloy/runtime/runtime.h"
|
#include "alloy/runtime/runtime.h"
|
||||||
#include "alloy/runtime/symbol_info.h"
|
#include "alloy/runtime/symbol_info.h"
|
||||||
#include "alloy/runtime/thread_state.h"
|
#include "alloy/runtime/thread_state.h"
|
||||||
|
#include "poly/vec128.h"
|
||||||
#include "xdb/protocol.h"
|
#include "xdb/protocol.h"
|
||||||
#include "xenia/profiling.h"
|
#include "xenia/profiling.h"
|
||||||
|
|
||||||
|
@ -31,6 +32,10 @@ namespace x64 {
|
||||||
using namespace alloy::hir;
|
using namespace alloy::hir;
|
||||||
using namespace alloy::runtime;
|
using namespace alloy::runtime;
|
||||||
|
|
||||||
|
using poly::vec128b;
|
||||||
|
using poly::vec128f;
|
||||||
|
using poly::vec128i;
|
||||||
|
|
||||||
using namespace Xbyak;
|
using namespace Xbyak;
|
||||||
using alloy::hir::HIRBuilder;
|
using alloy::hir::HIRBuilder;
|
||||||
using alloy::hir::Instr;
|
using alloy::hir::Instr;
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
#define ALLOY_BACKEND_X64_X64_EMITTER_H_
|
#define ALLOY_BACKEND_X64_X64_EMITTER_H_
|
||||||
|
|
||||||
#include "alloy/hir/value.h"
|
#include "alloy/hir/value.h"
|
||||||
|
#include "poly/arena.h"
|
||||||
#include "third_party/xbyak/xbyak/xbyak.h"
|
#include "third_party/xbyak/xbyak/xbyak.h"
|
||||||
|
|
||||||
namespace alloy {
|
namespace alloy {
|
||||||
|
@ -30,6 +31,8 @@ namespace alloy {
|
||||||
namespace backend {
|
namespace backend {
|
||||||
namespace x64 {
|
namespace x64 {
|
||||||
|
|
||||||
|
using vec128_t = poly::vec128_t;
|
||||||
|
|
||||||
class X64Backend;
|
class X64Backend;
|
||||||
class X64CodeCache;
|
class X64CodeCache;
|
||||||
|
|
||||||
|
@ -193,7 +196,7 @@ class X64Emitter : public Xbyak::CodeGenerator {
|
||||||
hir::Instr* current_instr_;
|
hir::Instr* current_instr_;
|
||||||
|
|
||||||
size_t source_map_count_;
|
size_t source_map_count_;
|
||||||
Arena source_map_arena_;
|
poly::Arena source_map_arena_;
|
||||||
|
|
||||||
size_t stack_size_;
|
size_t stack_size_;
|
||||||
|
|
||||||
|
|
|
@ -39,6 +39,8 @@ using namespace Xbyak;
|
||||||
using namespace alloy::hir;
|
using namespace alloy::hir;
|
||||||
using namespace alloy::runtime;
|
using namespace alloy::runtime;
|
||||||
|
|
||||||
|
using poly::vec128b;
|
||||||
|
|
||||||
typedef bool (*SequenceSelectFn)(X64Emitter&, const Instr*, const Instr**);
|
typedef bool (*SequenceSelectFn)(X64Emitter&, const Instr*, const Instr**);
|
||||||
std::unordered_multimap<uint32_t, SequenceSelectFn> sequence_table;
|
std::unordered_multimap<uint32_t, SequenceSelectFn> sequence_table;
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "alloy/hir/hir_builder.h"
|
#include "alloy/hir/hir_builder.h"
|
||||||
|
#include "poly/arena.h"
|
||||||
|
|
||||||
namespace alloy {
|
namespace alloy {
|
||||||
namespace runtime {
|
namespace runtime {
|
||||||
|
@ -32,7 +33,7 @@ class Compiler {
|
||||||
~Compiler();
|
~Compiler();
|
||||||
|
|
||||||
runtime::Runtime* runtime() const { return runtime_; }
|
runtime::Runtime* runtime() const { return runtime_; }
|
||||||
Arena* scratch_arena() { return &scratch_arena_; }
|
poly::Arena* scratch_arena() { return &scratch_arena_; }
|
||||||
|
|
||||||
void AddPass(std::unique_ptr<CompilerPass> pass);
|
void AddPass(std::unique_ptr<CompilerPass> pass);
|
||||||
|
|
||||||
|
@ -42,7 +43,7 @@ class Compiler {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
runtime::Runtime* runtime_;
|
runtime::Runtime* runtime_;
|
||||||
Arena scratch_arena_;
|
poly::Arena scratch_arena_;
|
||||||
|
|
||||||
std::vector<std::unique_ptr<CompilerPass>> passes_;
|
std::vector<std::unique_ptr<CompilerPass>> passes_;
|
||||||
};
|
};
|
||||||
|
|
|
@ -24,7 +24,7 @@ int CompilerPass::Initialize(Compiler* compiler) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Arena* CompilerPass::scratch_arena() const {
|
poly::Arena* CompilerPass::scratch_arena() const {
|
||||||
return compiler_->scratch_arena();
|
return compiler_->scratch_arena();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
#define ALLOY_COMPILER_COMPILER_PASS_H_
|
#define ALLOY_COMPILER_COMPILER_PASS_H_
|
||||||
|
|
||||||
#include "alloy/hir/hir_builder.h"
|
#include "alloy/hir/hir_builder.h"
|
||||||
|
#include "poly/arena.h"
|
||||||
|
|
||||||
namespace alloy {
|
namespace alloy {
|
||||||
namespace runtime {
|
namespace runtime {
|
||||||
|
@ -33,7 +34,7 @@ class CompilerPass {
|
||||||
virtual int Run(hir::HIRBuilder* builder) = 0;
|
virtual int Run(hir::HIRBuilder* builder) = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Arena* scratch_arena() const;
|
poly::Arena* scratch_arena() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
runtime::Runtime* runtime_;
|
runtime::Runtime* runtime_;
|
||||||
|
|
|
@ -10,8 +10,8 @@
|
||||||
#ifndef ALLOY_FRONTEND_PPC_PPC_CONTEXT_H_
|
#ifndef ALLOY_FRONTEND_PPC_PPC_CONTEXT_H_
|
||||||
#define ALLOY_FRONTEND_PPC_PPC_CONTEXT_H_
|
#define ALLOY_FRONTEND_PPC_PPC_CONTEXT_H_
|
||||||
|
|
||||||
#include "alloy/vec128.h"
|
|
||||||
#include "poly/poly.h"
|
#include "poly/poly.h"
|
||||||
|
#include "poly/vec128.h"
|
||||||
|
|
||||||
namespace alloy { namespace runtime {
|
namespace alloy { namespace runtime {
|
||||||
class Runtime;
|
class Runtime;
|
||||||
|
@ -22,7 +22,7 @@ namespace alloy {
|
||||||
namespace frontend {
|
namespace frontend {
|
||||||
namespace ppc {
|
namespace ppc {
|
||||||
|
|
||||||
using vec128_t = alloy::vec128_t;
|
using vec128_t = poly::vec128_t;
|
||||||
|
|
||||||
// Map:
|
// Map:
|
||||||
// 0-31: GPR
|
// 0-31: GPR
|
||||||
|
|
|
@ -10,61 +10,61 @@
|
||||||
#include "alloy/frontend/ppc/ppc_disasm.h"
|
#include "alloy/frontend/ppc/ppc_disasm.h"
|
||||||
|
|
||||||
#include "poly/poly.h"
|
#include "poly/poly.h"
|
||||||
#include "alloy/string_buffer.h"
|
#include "poly/string_buffer.h"
|
||||||
|
|
||||||
namespace alloy {
|
namespace alloy {
|
||||||
namespace frontend {
|
namespace frontend {
|
||||||
namespace ppc {
|
namespace ppc {
|
||||||
|
|
||||||
void Disasm_0(InstrData& i, StringBuffer* str) {
|
void Disasm_0(InstrData& i, poly::StringBuffer* str) {
|
||||||
str->Append("%-8s ???", i.type->name);
|
str->Append("%-8s ???", i.type->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Disasm__(InstrData& i, StringBuffer* str) {
|
void Disasm__(InstrData& i, poly::StringBuffer* str) {
|
||||||
str->Append("%-8s", i.type->name);
|
str->Append("%-8s", i.type->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Disasm_X_FRT_FRB(InstrData& i, StringBuffer* str) {
|
void Disasm_X_FRT_FRB(InstrData& i, poly::StringBuffer* str) {
|
||||||
str->Append("%*s%s f%d, f%d", i.X.Rc ? -7 : -8, i.type->name,
|
str->Append("%*s%s f%d, f%d", i.X.Rc ? -7 : -8, i.type->name,
|
||||||
i.X.Rc ? "." : "", i.X.RT, i.X.RB);
|
i.X.Rc ? "." : "", i.X.RT, i.X.RB);
|
||||||
}
|
}
|
||||||
void Disasm_A_FRT_FRB(InstrData& i, StringBuffer* str) {
|
void Disasm_A_FRT_FRB(InstrData& i, poly::StringBuffer* str) {
|
||||||
str->Append("%*s%s f%d, f%d", i.A.Rc ? -7 : -8, i.type->name,
|
str->Append("%*s%s f%d, f%d", i.A.Rc ? -7 : -8, i.type->name,
|
||||||
i.A.Rc ? "." : "", i.A.FRT, i.A.FRB);
|
i.A.Rc ? "." : "", i.A.FRT, i.A.FRB);
|
||||||
}
|
}
|
||||||
void Disasm_A_FRT_FRA_FRB(InstrData& i, StringBuffer* str) {
|
void Disasm_A_FRT_FRA_FRB(InstrData& i, poly::StringBuffer* str) {
|
||||||
str->Append("%*s%s f%d, f%d, f%d", i.A.Rc ? -7 : -8, i.type->name,
|
str->Append("%*s%s f%d, f%d, f%d", i.A.Rc ? -7 : -8, i.type->name,
|
||||||
i.A.Rc ? "." : "", i.A.FRT, i.A.FRA, i.A.FRB);
|
i.A.Rc ? "." : "", i.A.FRT, i.A.FRA, i.A.FRB);
|
||||||
}
|
}
|
||||||
void Disasm_A_FRT_FRA_FRB_FRC(InstrData& i, StringBuffer* str) {
|
void Disasm_A_FRT_FRA_FRB_FRC(InstrData& i, poly::StringBuffer* str) {
|
||||||
str->Append("%*s%s f%d, f%d, f%d, f%d", i.A.Rc ? -7 : -8, i.type->name,
|
str->Append("%*s%s f%d, f%d, f%d, f%d", i.A.Rc ? -7 : -8, i.type->name,
|
||||||
i.A.Rc ? "." : "", i.A.FRT, i.A.FRA, i.A.FRB, i.A.FRC);
|
i.A.Rc ? "." : "", i.A.FRT, i.A.FRA, i.A.FRB, i.A.FRC);
|
||||||
}
|
}
|
||||||
void Disasm_X_RT_RA_RB(InstrData& i, StringBuffer* str) {
|
void Disasm_X_RT_RA_RB(InstrData& i, poly::StringBuffer* str) {
|
||||||
str->Append("%-8s r%d, r%d, r%d", i.type->name, i.X.RT, i.X.RA, i.X.RB);
|
str->Append("%-8s r%d, r%d, r%d", i.type->name, i.X.RT, i.X.RA, i.X.RB);
|
||||||
}
|
}
|
||||||
void Disasm_X_RT_RA0_RB(InstrData& i, StringBuffer* str) {
|
void Disasm_X_RT_RA0_RB(InstrData& i, poly::StringBuffer* str) {
|
||||||
if (i.X.RA) {
|
if (i.X.RA) {
|
||||||
str->Append("%-8s r%d, r%d, r%d", i.type->name, i.X.RT, i.X.RA, i.X.RB);
|
str->Append("%-8s r%d, r%d, r%d", i.type->name, i.X.RT, i.X.RA, i.X.RB);
|
||||||
} else {
|
} else {
|
||||||
str->Append("%-8s r%d, 0, r%d", i.type->name, i.X.RT, i.X.RB);
|
str->Append("%-8s r%d, 0, r%d", i.type->name, i.X.RT, i.X.RB);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void Disasm_X_FRT_RA_RB(InstrData& i, StringBuffer* str) {
|
void Disasm_X_FRT_RA_RB(InstrData& i, poly::StringBuffer* str) {
|
||||||
str->Append("%-8s f%d, r%d, r%d", i.type->name, i.X.RT, i.X.RA, i.X.RB);
|
str->Append("%-8s f%d, r%d, r%d", i.type->name, i.X.RT, i.X.RA, i.X.RB);
|
||||||
}
|
}
|
||||||
void Disasm_X_FRT_RA0_RB(InstrData& i, StringBuffer* str) {
|
void Disasm_X_FRT_RA0_RB(InstrData& i, poly::StringBuffer* str) {
|
||||||
if (i.X.RA) {
|
if (i.X.RA) {
|
||||||
str->Append("%-8s f%d, r%d, r%d", i.type->name, i.X.RT, i.X.RA, i.X.RB);
|
str->Append("%-8s f%d, r%d, r%d", i.type->name, i.X.RT, i.X.RA, i.X.RB);
|
||||||
} else {
|
} else {
|
||||||
str->Append("%-8s f%d, 0, r%d", i.type->name, i.X.RT, i.X.RB);
|
str->Append("%-8s f%d, 0, r%d", i.type->name, i.X.RT, i.X.RB);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void Disasm_D_RT_RA_I(InstrData& i, StringBuffer* str) {
|
void Disasm_D_RT_RA_I(InstrData& i, poly::StringBuffer* str) {
|
||||||
str->Append("%-8s r%d, r%d, %d", i.type->name, i.D.RT, i.D.RA,
|
str->Append("%-8s r%d, r%d, %d", i.type->name, i.D.RT, i.D.RA,
|
||||||
(int32_t)(int16_t)XEEXTS16(i.D.DS));
|
(int32_t)(int16_t)XEEXTS16(i.D.DS));
|
||||||
}
|
}
|
||||||
void Disasm_D_RT_RA0_I(InstrData& i, StringBuffer* str) {
|
void Disasm_D_RT_RA0_I(InstrData& i, poly::StringBuffer* str) {
|
||||||
if (i.D.RA) {
|
if (i.D.RA) {
|
||||||
str->Append("%-8s r%d, r%d, %d", i.type->name, i.D.RT, i.D.RA,
|
str->Append("%-8s r%d, r%d, %d", i.type->name, i.D.RT, i.D.RA,
|
||||||
(int32_t)(int16_t)XEEXTS16(i.D.DS));
|
(int32_t)(int16_t)XEEXTS16(i.D.DS));
|
||||||
|
@ -73,11 +73,11 @@ void Disasm_D_RT_RA0_I(InstrData& i, StringBuffer* str) {
|
||||||
(int32_t)(int16_t)XEEXTS16(i.D.DS));
|
(int32_t)(int16_t)XEEXTS16(i.D.DS));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void Disasm_D_FRT_RA_I(InstrData& i, StringBuffer* str) {
|
void Disasm_D_FRT_RA_I(InstrData& i, poly::StringBuffer* str) {
|
||||||
str->Append("%-8s f%d, r%d, %d", i.type->name, i.D.RT, i.D.RA,
|
str->Append("%-8s f%d, r%d, %d", i.type->name, i.D.RT, i.D.RA,
|
||||||
(int32_t)(int16_t)XEEXTS16(i.D.DS));
|
(int32_t)(int16_t)XEEXTS16(i.D.DS));
|
||||||
}
|
}
|
||||||
void Disasm_D_FRT_RA0_I(InstrData& i, StringBuffer* str) {
|
void Disasm_D_FRT_RA0_I(InstrData& i, poly::StringBuffer* str) {
|
||||||
if (i.D.RA) {
|
if (i.D.RA) {
|
||||||
str->Append("%-8s f%d, r%d, %d", i.type->name, i.D.RT, i.D.RA,
|
str->Append("%-8s f%d, r%d, %d", i.type->name, i.D.RT, i.D.RA,
|
||||||
(int32_t)(int16_t)XEEXTS16(i.D.DS));
|
(int32_t)(int16_t)XEEXTS16(i.D.DS));
|
||||||
|
@ -86,11 +86,11 @@ void Disasm_D_FRT_RA0_I(InstrData& i, StringBuffer* str) {
|
||||||
(int32_t)(int16_t)XEEXTS16(i.D.DS));
|
(int32_t)(int16_t)XEEXTS16(i.D.DS));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void Disasm_DS_RT_RA_I(InstrData& i, StringBuffer* str) {
|
void Disasm_DS_RT_RA_I(InstrData& i, poly::StringBuffer* str) {
|
||||||
str->Append("%-8s r%d, r%d, %d", i.type->name, i.DS.RT, i.DS.RA,
|
str->Append("%-8s r%d, r%d, %d", i.type->name, i.DS.RT, i.DS.RA,
|
||||||
(int32_t)(int16_t)XEEXTS16(i.DS.DS << 2));
|
(int32_t)(int16_t)XEEXTS16(i.DS.DS << 2));
|
||||||
}
|
}
|
||||||
void Disasm_DS_RT_RA0_I(InstrData& i, StringBuffer* str) {
|
void Disasm_DS_RT_RA0_I(InstrData& i, poly::StringBuffer* str) {
|
||||||
if (i.DS.RA) {
|
if (i.DS.RA) {
|
||||||
str->Append("%-8s r%d, r%d, %d", i.type->name, i.DS.RT, i.DS.RA,
|
str->Append("%-8s r%d, r%d, %d", i.type->name, i.DS.RT, i.DS.RA,
|
||||||
(int32_t)(int16_t)XEEXTS16(i.DS.DS << 2));
|
(int32_t)(int16_t)XEEXTS16(i.DS.DS << 2));
|
||||||
|
@ -99,29 +99,29 @@ void Disasm_DS_RT_RA0_I(InstrData& i, StringBuffer* str) {
|
||||||
(int32_t)(int16_t)XEEXTS16(i.DS.DS << 2));
|
(int32_t)(int16_t)XEEXTS16(i.DS.DS << 2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void Disasm_D_RA(InstrData& i, StringBuffer* str) {
|
void Disasm_D_RA(InstrData& i, poly::StringBuffer* str) {
|
||||||
str->Append("%-8s r%d", i.type->name, i.D.RA);
|
str->Append("%-8s r%d", i.type->name, i.D.RA);
|
||||||
}
|
}
|
||||||
void Disasm_X_RA_RB(InstrData& i, StringBuffer* str) {
|
void Disasm_X_RA_RB(InstrData& i, poly::StringBuffer* str) {
|
||||||
str->Append("%-8s r%d, r%d", i.type->name, i.X.RA, i.X.RB);
|
str->Append("%-8s r%d, r%d", i.type->name, i.X.RA, i.X.RB);
|
||||||
}
|
}
|
||||||
void Disasm_XO_RT_RA_RB(InstrData& i, StringBuffer* str) {
|
void Disasm_XO_RT_RA_RB(InstrData& i, poly::StringBuffer* str) {
|
||||||
str->Append("%*s%s%s r%d, r%d, r%d", i.XO.Rc ? -7 : -8, i.type->name,
|
str->Append("%*s%s%s r%d, r%d, r%d", i.XO.Rc ? -7 : -8, i.type->name,
|
||||||
i.XO.OE ? "o" : "", i.XO.Rc ? "." : "", i.XO.RT, i.XO.RA,
|
i.XO.OE ? "o" : "", i.XO.Rc ? "." : "", i.XO.RT, i.XO.RA,
|
||||||
i.XO.RB);
|
i.XO.RB);
|
||||||
}
|
}
|
||||||
void Disasm_XO_RT_RA(InstrData& i, StringBuffer* str) {
|
void Disasm_XO_RT_RA(InstrData& i, poly::StringBuffer* str) {
|
||||||
str->Append("%*s%s%s r%d, r%d", i.XO.Rc ? -7 : -8, i.type->name,
|
str->Append("%*s%s%s r%d, r%d", i.XO.Rc ? -7 : -8, i.type->name,
|
||||||
i.XO.OE ? "o" : "", i.XO.Rc ? "." : "", i.XO.RT, i.XO.RA);
|
i.XO.OE ? "o" : "", i.XO.Rc ? "." : "", i.XO.RT, i.XO.RA);
|
||||||
}
|
}
|
||||||
void Disasm_X_RA_RT_RB(InstrData& i, StringBuffer* str) {
|
void Disasm_X_RA_RT_RB(InstrData& i, poly::StringBuffer* str) {
|
||||||
str->Append("%*s%s r%d, r%d, r%d", i.X.Rc ? -7 : -8, i.type->name,
|
str->Append("%*s%s r%d, r%d, r%d", i.X.Rc ? -7 : -8, i.type->name,
|
||||||
i.X.Rc ? "." : "", i.X.RA, i.X.RT, i.X.RB);
|
i.X.Rc ? "." : "", i.X.RA, i.X.RT, i.X.RB);
|
||||||
}
|
}
|
||||||
void Disasm_D_RA_RT_I(InstrData& i, StringBuffer* str) {
|
void Disasm_D_RA_RT_I(InstrData& i, poly::StringBuffer* str) {
|
||||||
str->Append("%-7s. r%d, r%d, %.4Xh", i.type->name, i.D.RA, i.D.RT, i.D.DS);
|
str->Append("%-7s. r%d, r%d, %.4Xh", i.type->name, i.D.RA, i.D.RT, i.D.DS);
|
||||||
}
|
}
|
||||||
void Disasm_X_RA_RT(InstrData& i, StringBuffer* str) {
|
void Disasm_X_RA_RT(InstrData& i, poly::StringBuffer* str) {
|
||||||
str->Append("%*s%s r%d, r%d", i.X.Rc ? -7 : -8, i.type->name,
|
str->Append("%*s%s r%d, r%d", i.X.Rc ? -7 : -8, i.type->name,
|
||||||
i.X.Rc ? "." : "", i.X.RA, i.X.RT);
|
i.X.Rc ? "." : "", i.X.RA, i.X.RT);
|
||||||
}
|
}
|
||||||
|
@ -160,14 +160,14 @@ void Disasm_X_RA_RT(InstrData& i, StringBuffer* str) {
|
||||||
(i.VX128_R.VA128l | (i.VX128_R.VA128h << 5) | (i.VX128_R.VA128H << 6))
|
(i.VX128_R.VA128l | (i.VX128_R.VA128h << 5) | (i.VX128_R.VA128H << 6))
|
||||||
#define VX128_R_VB128 (i.VX128_R.VB128l | (i.VX128_R.VB128h << 5))
|
#define VX128_R_VB128 (i.VX128_R.VB128l | (i.VX128_R.VB128h << 5))
|
||||||
|
|
||||||
void Disasm_X_VX_RA0_RB(InstrData& i, StringBuffer* str) {
|
void Disasm_X_VX_RA0_RB(InstrData& i, poly::StringBuffer* str) {
|
||||||
if (i.X.RA) {
|
if (i.X.RA) {
|
||||||
str->Append("%-8s v%d, r%d, r%d", i.type->name, i.X.RT, i.X.RA, i.X.RB);
|
str->Append("%-8s v%d, r%d, r%d", i.type->name, i.X.RT, i.X.RA, i.X.RB);
|
||||||
} else {
|
} else {
|
||||||
str->Append("%-8s v%d, 0, r%d", i.type->name, i.X.RT, i.X.RB);
|
str->Append("%-8s v%d, 0, r%d", i.type->name, i.X.RT, i.X.RB);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void Disasm_VX1281_VD_RA0_RB(InstrData& i, StringBuffer* str) {
|
void Disasm_VX1281_VD_RA0_RB(InstrData& i, poly::StringBuffer* str) {
|
||||||
const uint32_t vd = VX128_1_VD128;
|
const uint32_t vd = VX128_1_VD128;
|
||||||
if (i.VX128_1.RA) {
|
if (i.VX128_1.RA) {
|
||||||
str->Append("%-8s v%d, r%d, r%d", i.type->name, vd, i.VX128_1.RA,
|
str->Append("%-8s v%d, r%d, r%d", i.type->name, vd, i.VX128_1.RA,
|
||||||
|
@ -176,45 +176,45 @@ void Disasm_VX1281_VD_RA0_RB(InstrData& i, StringBuffer* str) {
|
||||||
str->Append("%-8s v%d, 0, r%d", i.type->name, vd, i.VX128_1.RB);
|
str->Append("%-8s v%d, 0, r%d", i.type->name, vd, i.VX128_1.RB);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void Disasm_VX1283_VD_VB(InstrData& i, StringBuffer* str) {
|
void Disasm_VX1283_VD_VB(InstrData& i, poly::StringBuffer* str) {
|
||||||
const uint32_t vd = VX128_3_VD128;
|
const uint32_t vd = VX128_3_VD128;
|
||||||
const uint32_t vb = VX128_3_VB128;
|
const uint32_t vb = VX128_3_VB128;
|
||||||
str->Append("%-8s v%d, v%d", i.type->name, vd, vb);
|
str->Append("%-8s v%d, v%d", i.type->name, vd, vb);
|
||||||
}
|
}
|
||||||
void Disasm_VX1283_VD_VB_I(InstrData& i, StringBuffer* str) {
|
void Disasm_VX1283_VD_VB_I(InstrData& i, poly::StringBuffer* str) {
|
||||||
const uint32_t vd = VX128_VD128;
|
const uint32_t vd = VX128_VD128;
|
||||||
const uint32_t va = VX128_VA128;
|
const uint32_t va = VX128_VA128;
|
||||||
const uint32_t uimm = i.VX128_3.IMM;
|
const uint32_t uimm = i.VX128_3.IMM;
|
||||||
str->Append("%-8s v%d, v%d, %.2Xh", i.type->name, vd, va, uimm);
|
str->Append("%-8s v%d, v%d, %.2Xh", i.type->name, vd, va, uimm);
|
||||||
}
|
}
|
||||||
void Disasm_VX_VD_VA_VB(InstrData& i, StringBuffer* str) {
|
void Disasm_VX_VD_VA_VB(InstrData& i, poly::StringBuffer* str) {
|
||||||
str->Append("%-8s v%d, v%d, v%d", i.type->name, i.VX.VD, i.VX.VA, i.VX.VB);
|
str->Append("%-8s v%d, v%d, v%d", i.type->name, i.VX.VD, i.VX.VA, i.VX.VB);
|
||||||
}
|
}
|
||||||
void Disasm_VX128_VD_VA_VB(InstrData& i, StringBuffer* str) {
|
void Disasm_VX128_VD_VA_VB(InstrData& i, poly::StringBuffer* str) {
|
||||||
const uint32_t vd = VX128_VD128;
|
const uint32_t vd = VX128_VD128;
|
||||||
const uint32_t va = VX128_VA128;
|
const uint32_t va = VX128_VA128;
|
||||||
const uint32_t vb = VX128_VB128;
|
const uint32_t vb = VX128_VB128;
|
||||||
str->Append("%-8s v%d, v%d, v%d", i.type->name, vd, va, vb);
|
str->Append("%-8s v%d, v%d, v%d", i.type->name, vd, va, vb);
|
||||||
}
|
}
|
||||||
void Disasm_VX128_VD_VA_VD_VB(InstrData& i, StringBuffer* str) {
|
void Disasm_VX128_VD_VA_VD_VB(InstrData& i, poly::StringBuffer* str) {
|
||||||
const uint32_t vd = VX128_VD128;
|
const uint32_t vd = VX128_VD128;
|
||||||
const uint32_t va = VX128_VA128;
|
const uint32_t va = VX128_VA128;
|
||||||
const uint32_t vb = VX128_VB128;
|
const uint32_t vb = VX128_VB128;
|
||||||
str->Append("%-8s v%d, v%d, v%d, v%d", i.type->name, vd, va, vd, vb);
|
str->Append("%-8s v%d, v%d, v%d, v%d", i.type->name, vd, va, vd, vb);
|
||||||
}
|
}
|
||||||
void Disasm_VX1282_VD_VA_VB_VC(InstrData& i, StringBuffer* str) {
|
void Disasm_VX1282_VD_VA_VB_VC(InstrData& i, poly::StringBuffer* str) {
|
||||||
const uint32_t vd = VX128_2_VD128;
|
const uint32_t vd = VX128_2_VD128;
|
||||||
const uint32_t va = VX128_2_VA128;
|
const uint32_t va = VX128_2_VA128;
|
||||||
const uint32_t vb = VX128_2_VB128;
|
const uint32_t vb = VX128_2_VB128;
|
||||||
const uint32_t vc = i.VX128_2.VC;
|
const uint32_t vc = i.VX128_2.VC;
|
||||||
str->Append("%-8s v%d, v%d, v%d, v%d", i.type->name, vd, va, vb, vc);
|
str->Append("%-8s v%d, v%d, v%d, v%d", i.type->name, vd, va, vb, vc);
|
||||||
}
|
}
|
||||||
void Disasm_VXA_VD_VA_VB_VC(InstrData& i, StringBuffer* str) {
|
void Disasm_VXA_VD_VA_VB_VC(InstrData& i, poly::StringBuffer* str) {
|
||||||
str->Append("%-8s v%d, v%d, v%d, v%d", i.type->name, i.VXA.VD, i.VXA.VA,
|
str->Append("%-8s v%d, v%d, v%d, v%d", i.type->name, i.VXA.VD, i.VXA.VA,
|
||||||
i.VXA.VB, i.VXA.VC);
|
i.VXA.VB, i.VXA.VC);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Disasm_sync(InstrData& i, StringBuffer* str) {
|
void Disasm_sync(InstrData& i, poly::StringBuffer* str) {
|
||||||
const char* name;
|
const char* name;
|
||||||
int L = i.X.RT & 3;
|
int L = i.X.RT & 3;
|
||||||
switch (L) {
|
switch (L) {
|
||||||
|
@ -233,7 +233,7 @@ void Disasm_sync(InstrData& i, StringBuffer* str) {
|
||||||
str->Append("%-8s %.2X", name, L);
|
str->Append("%-8s %.2X", name, L);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Disasm_dcbf(InstrData& i, StringBuffer* str) {
|
void Disasm_dcbf(InstrData& i, poly::StringBuffer* str) {
|
||||||
const char* name;
|
const char* name;
|
||||||
switch (i.X.RT & 3) {
|
switch (i.X.RT & 3) {
|
||||||
case 0:
|
case 0:
|
||||||
|
@ -255,7 +255,7 @@ void Disasm_dcbf(InstrData& i, StringBuffer* str) {
|
||||||
str->Append("%-8s r%d, r%d", name, i.X.RA, i.X.RB);
|
str->Append("%-8s r%d, r%d", name, i.X.RA, i.X.RB);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Disasm_dcbz(InstrData& i, StringBuffer* str) {
|
void Disasm_dcbz(InstrData& i, poly::StringBuffer* str) {
|
||||||
// or dcbz128 0x7C2007EC
|
// or dcbz128 0x7C2007EC
|
||||||
if (i.X.RA) {
|
if (i.X.RA) {
|
||||||
str->Append("%-8s r%d, r%d", i.type->name, i.X.RA, i.X.RB);
|
str->Append("%-8s r%d, r%d", i.type->name, i.X.RA, i.X.RB);
|
||||||
|
@ -264,16 +264,16 @@ void Disasm_dcbz(InstrData& i, StringBuffer* str) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Disasm_fcmp(InstrData& i, StringBuffer* str) {
|
void Disasm_fcmp(InstrData& i, poly::StringBuffer* str) {
|
||||||
str->Append("%-8s cr%d, f%d, f%d", i.type->name, i.X.RT >> 2, i.X.RA, i.X.RB);
|
str->Append("%-8s cr%d, f%d, f%d", i.type->name, i.X.RT >> 2, i.X.RA, i.X.RB);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Disasm_mffsx(InstrData& i, StringBuffer* str) {
|
void Disasm_mffsx(InstrData& i, poly::StringBuffer* str) {
|
||||||
str->Append("%*s%s f%d, FPSCR", i.X.Rc ? -7 : -8, i.type->name,
|
str->Append("%*s%s f%d, FPSCR", i.X.Rc ? -7 : -8, i.type->name,
|
||||||
i.X.Rc ? "." : "", i.X.RT);
|
i.X.Rc ? "." : "", i.X.RT);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Disasm_bx(InstrData& i, StringBuffer* str) {
|
void Disasm_bx(InstrData& i, poly::StringBuffer* str) {
|
||||||
const char* name = i.I.LK ? "bl" : "b";
|
const char* name = i.I.LK ? "bl" : "b";
|
||||||
uint32_t nia;
|
uint32_t nia;
|
||||||
if (i.I.AA) {
|
if (i.I.AA) {
|
||||||
|
@ -284,7 +284,7 @@ void Disasm_bx(InstrData& i, StringBuffer* str) {
|
||||||
str->Append("%-8s %.8X", name, nia);
|
str->Append("%-8s %.8X", name, nia);
|
||||||
// TODO(benvanik): resolve target name?
|
// TODO(benvanik): resolve target name?
|
||||||
}
|
}
|
||||||
void Disasm_bcx(InstrData& i, StringBuffer* str) {
|
void Disasm_bcx(InstrData& i, poly::StringBuffer* str) {
|
||||||
const char* s0 = i.B.LK ? "lr, " : "";
|
const char* s0 = i.B.LK ? "lr, " : "";
|
||||||
const char* s1;
|
const char* s1;
|
||||||
if (!select_bits(i.B.BO, 2, 2)) {
|
if (!select_bits(i.B.BO, 2, 2)) {
|
||||||
|
@ -305,7 +305,7 @@ void Disasm_bcx(InstrData& i, StringBuffer* str) {
|
||||||
str->Append("%-8s %s%s%s%.8X", i.type->name, s0, s1, s2, nia);
|
str->Append("%-8s %s%s%s%.8X", i.type->name, s0, s1, s2, nia);
|
||||||
// TODO(benvanik): resolve target name?
|
// TODO(benvanik): resolve target name?
|
||||||
}
|
}
|
||||||
void Disasm_bcctrx(InstrData& i, StringBuffer* str) {
|
void Disasm_bcctrx(InstrData& i, poly::StringBuffer* str) {
|
||||||
// TODO(benvanik): mnemonics
|
// TODO(benvanik): mnemonics
|
||||||
const char* s0 = i.XL.LK ? "lr, " : "";
|
const char* s0 = i.XL.LK ? "lr, " : "";
|
||||||
char s2[8] = {0};
|
char s2[8] = {0};
|
||||||
|
@ -315,7 +315,7 @@ void Disasm_bcctrx(InstrData& i, StringBuffer* str) {
|
||||||
str->Append("%-8s %s%sctr", i.type->name, s0, s2);
|
str->Append("%-8s %s%sctr", i.type->name, s0, s2);
|
||||||
// TODO(benvanik): resolve target name?
|
// TODO(benvanik): resolve target name?
|
||||||
}
|
}
|
||||||
void Disasm_bclrx(InstrData& i, StringBuffer* str) {
|
void Disasm_bclrx(InstrData& i, poly::StringBuffer* str) {
|
||||||
const char* name = "bclr";
|
const char* name = "bclr";
|
||||||
if (i.code == 0x4E800020) {
|
if (i.code == 0x4E800020) {
|
||||||
name = "blr";
|
name = "blr";
|
||||||
|
@ -333,7 +333,7 @@ void Disasm_bclrx(InstrData& i, StringBuffer* str) {
|
||||||
str->Append("%-8s %s%s", name, s1, s2);
|
str->Append("%-8s %s%s", name, s1, s2);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Disasm_mfcr(InstrData& i, StringBuffer* str) {
|
void Disasm_mfcr(InstrData& i, poly::StringBuffer* str) {
|
||||||
str->Append("%-8s r%d, cr", i.type->name, i.X.RT);
|
str->Append("%-8s r%d, cr", i.type->name, i.X.RT);
|
||||||
}
|
}
|
||||||
const char* Disasm_spr_name(uint32_t n) {
|
const char* Disasm_spr_name(uint32_t n) {
|
||||||
|
@ -351,40 +351,40 @@ const char* Disasm_spr_name(uint32_t n) {
|
||||||
}
|
}
|
||||||
return reg;
|
return reg;
|
||||||
}
|
}
|
||||||
void Disasm_mfspr(InstrData& i, StringBuffer* str) {
|
void Disasm_mfspr(InstrData& i, poly::StringBuffer* str) {
|
||||||
const uint32_t n = ((i.XFX.spr & 0x1F) << 5) | ((i.XFX.spr >> 5) & 0x1F);
|
const uint32_t n = ((i.XFX.spr & 0x1F) << 5) | ((i.XFX.spr >> 5) & 0x1F);
|
||||||
const char* reg = Disasm_spr_name(n);
|
const char* reg = Disasm_spr_name(n);
|
||||||
str->Append("%-8s r%d, %s", i.type->name, i.XFX.RT, reg);
|
str->Append("%-8s r%d, %s", i.type->name, i.XFX.RT, reg);
|
||||||
}
|
}
|
||||||
void Disasm_mtspr(InstrData& i, StringBuffer* str) {
|
void Disasm_mtspr(InstrData& i, poly::StringBuffer* str) {
|
||||||
const uint32_t n = ((i.XFX.spr & 0x1F) << 5) | ((i.XFX.spr >> 5) & 0x1F);
|
const uint32_t n = ((i.XFX.spr & 0x1F) << 5) | ((i.XFX.spr >> 5) & 0x1F);
|
||||||
const char* reg = Disasm_spr_name(n);
|
const char* reg = Disasm_spr_name(n);
|
||||||
str->Append("%-8s %s, r%d", i.type->name, reg, i.XFX.RT);
|
str->Append("%-8s %s, r%d", i.type->name, reg, i.XFX.RT);
|
||||||
}
|
}
|
||||||
void Disasm_mftb(InstrData& i, StringBuffer* str) {
|
void Disasm_mftb(InstrData& i, poly::StringBuffer* str) {
|
||||||
str->Append("%-8s r%d, tb", i.type->name, i.XFX.RT);
|
str->Append("%-8s r%d, tb", i.type->name, i.XFX.RT);
|
||||||
}
|
}
|
||||||
void Disasm_mfmsr(InstrData& i, StringBuffer* str) {
|
void Disasm_mfmsr(InstrData& i, poly::StringBuffer* str) {
|
||||||
str->Append("%-8s r%d", i.type->name, i.X.RT);
|
str->Append("%-8s r%d", i.type->name, i.X.RT);
|
||||||
}
|
}
|
||||||
void Disasm_mtmsr(InstrData& i, StringBuffer* str) {
|
void Disasm_mtmsr(InstrData& i, poly::StringBuffer* str) {
|
||||||
str->Append("%-8s r%d, %d", i.type->name, i.X.RT, (i.X.RA & 16) ? 1 : 0);
|
str->Append("%-8s r%d, %d", i.type->name, i.X.RT, (i.X.RA & 16) ? 1 : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Disasm_cmp(InstrData& i, StringBuffer* str) {
|
void Disasm_cmp(InstrData& i, poly::StringBuffer* str) {
|
||||||
str->Append("%-8s cr%d, %.2X, r%d, r%d", i.type->name, i.X.RT >> 2,
|
str->Append("%-8s cr%d, %.2X, r%d, r%d", i.type->name, i.X.RT >> 2,
|
||||||
i.X.RT & 1, i.X.RA, i.X.RB);
|
i.X.RT & 1, i.X.RA, i.X.RB);
|
||||||
}
|
}
|
||||||
void Disasm_cmpi(InstrData& i, StringBuffer* str) {
|
void Disasm_cmpi(InstrData& i, poly::StringBuffer* str) {
|
||||||
str->Append("%-8s cr%d, %.2X, r%d, %d", i.type->name, i.D.RT >> 2, i.D.RT & 1,
|
str->Append("%-8s cr%d, %.2X, r%d, %d", i.type->name, i.D.RT >> 2, i.D.RT & 1,
|
||||||
i.D.RA, XEEXTS16(i.D.DS));
|
i.D.RA, XEEXTS16(i.D.DS));
|
||||||
}
|
}
|
||||||
void Disasm_cmpli(InstrData& i, StringBuffer* str) {
|
void Disasm_cmpli(InstrData& i, poly::StringBuffer* str) {
|
||||||
str->Append("%-8s cr%d, %.2X, r%d, %.2X", i.type->name, i.D.RT >> 2,
|
str->Append("%-8s cr%d, %.2X, r%d, %.2X", i.type->name, i.D.RT >> 2,
|
||||||
i.D.RT & 1, i.D.RA, XEEXTS16(i.D.DS));
|
i.D.RT & 1, i.D.RA, XEEXTS16(i.D.DS));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Disasm_rld(InstrData& i, StringBuffer* str) {
|
void Disasm_rld(InstrData& i, poly::StringBuffer* str) {
|
||||||
if (i.MD.idx == 0) {
|
if (i.MD.idx == 0) {
|
||||||
// XEDISASMR(rldiclx, 0x78000000, MD )
|
// XEDISASMR(rldiclx, 0x78000000, MD )
|
||||||
str->Append("%*s%s r%d, r%d, %d, %d", i.MD.Rc ? -7 : -8, "rldicl",
|
str->Append("%*s%s r%d, r%d, %d, %d", i.MD.Rc ? -7 : -8, "rldicl",
|
||||||
|
@ -421,75 +421,75 @@ void Disasm_rld(InstrData& i, StringBuffer* str) {
|
||||||
assert_always();
|
assert_always();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void Disasm_rlwim(InstrData& i, StringBuffer* str) {
|
void Disasm_rlwim(InstrData& i, poly::StringBuffer* str) {
|
||||||
str->Append("%*s%s r%d, r%d, %d, %d, %d", i.M.Rc ? -7 : -8, i.type->name,
|
str->Append("%*s%s r%d, r%d, %d, %d, %d", i.M.Rc ? -7 : -8, i.type->name,
|
||||||
i.M.Rc ? "." : "", i.M.RA, i.M.RT, i.M.SH, i.M.MB, i.M.ME);
|
i.M.Rc ? "." : "", i.M.RA, i.M.RT, i.M.SH, i.M.MB, i.M.ME);
|
||||||
}
|
}
|
||||||
void Disasm_rlwnmx(InstrData& i, StringBuffer* str) {
|
void Disasm_rlwnmx(InstrData& i, poly::StringBuffer* str) {
|
||||||
str->Append("%*s%s r%d, r%d, r%d, %d, %d", i.M.Rc ? -7 : -8, i.type->name,
|
str->Append("%*s%s r%d, r%d, r%d, %d, %d", i.M.Rc ? -7 : -8, i.type->name,
|
||||||
i.M.Rc ? "." : "", i.M.RA, i.M.RT, i.M.SH, i.M.MB, i.M.ME);
|
i.M.Rc ? "." : "", i.M.RA, i.M.RT, i.M.SH, i.M.MB, i.M.ME);
|
||||||
}
|
}
|
||||||
void Disasm_srawix(InstrData& i, StringBuffer* str) {
|
void Disasm_srawix(InstrData& i, poly::StringBuffer* str) {
|
||||||
str->Append("%*s%s r%d, r%d, %d", i.X.Rc ? -7 : -8, i.type->name,
|
str->Append("%*s%s r%d, r%d, %d", i.X.Rc ? -7 : -8, i.type->name,
|
||||||
i.X.Rc ? "." : "", i.X.RA, i.X.RT, i.X.RB);
|
i.X.Rc ? "." : "", i.X.RA, i.X.RT, i.X.RB);
|
||||||
}
|
}
|
||||||
void Disasm_sradix(InstrData& i, StringBuffer* str) {
|
void Disasm_sradix(InstrData& i, poly::StringBuffer* str) {
|
||||||
str->Append("%*s%s r%d, r%d, %d", i.XS.Rc ? -7 : -8, i.type->name,
|
str->Append("%*s%s r%d, r%d, %d", i.XS.Rc ? -7 : -8, i.type->name,
|
||||||
i.XS.Rc ? "." : "", i.XS.RA, i.XS.RT, (i.XS.SH5 << 5) | i.XS.SH);
|
i.XS.Rc ? "." : "", i.XS.RA, i.XS.RT, (i.XS.SH5 << 5) | i.XS.SH);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Disasm_vpermwi128(InstrData& i, StringBuffer* str) {
|
void Disasm_vpermwi128(InstrData& i, poly::StringBuffer* str) {
|
||||||
const uint32_t vd = i.VX128_P.VD128l | (i.VX128_P.VD128h << 5);
|
const uint32_t vd = i.VX128_P.VD128l | (i.VX128_P.VD128h << 5);
|
||||||
const uint32_t vb = i.VX128_P.VB128l | (i.VX128_P.VB128h << 5);
|
const uint32_t vb = i.VX128_P.VB128l | (i.VX128_P.VB128h << 5);
|
||||||
str->Append("%-8s v%d, v%d, %.2X", i.type->name, vd, vb,
|
str->Append("%-8s v%d, v%d, %.2X", i.type->name, vd, vb,
|
||||||
i.VX128_P.PERMl | (i.VX128_P.PERMh << 5));
|
i.VX128_P.PERMl | (i.VX128_P.PERMh << 5));
|
||||||
}
|
}
|
||||||
void Disasm_vrfin128(InstrData& i, StringBuffer* str) {
|
void Disasm_vrfin128(InstrData& i, poly::StringBuffer* str) {
|
||||||
const uint32_t vd = VX128_3_VD128;
|
const uint32_t vd = VX128_3_VD128;
|
||||||
const uint32_t vb = VX128_3_VB128;
|
const uint32_t vb = VX128_3_VB128;
|
||||||
str->Append("%-8s v%d, v%d", i.type->name, vd, vb);
|
str->Append("%-8s v%d, v%d", i.type->name, vd, vb);
|
||||||
}
|
}
|
||||||
void Disasm_vrlimi128(InstrData& i, StringBuffer* str) {
|
void Disasm_vrlimi128(InstrData& i, poly::StringBuffer* str) {
|
||||||
const uint32_t vd = VX128_4_VD128;
|
const uint32_t vd = VX128_4_VD128;
|
||||||
const uint32_t vb = VX128_4_VB128;
|
const uint32_t vb = VX128_4_VB128;
|
||||||
str->Append("%-8s v%d, v%d, %.2X, %.2X", i.type->name, vd, vb, i.VX128_4.IMM,
|
str->Append("%-8s v%d, v%d, %.2X, %.2X", i.type->name, vd, vb, i.VX128_4.IMM,
|
||||||
i.VX128_4.z);
|
i.VX128_4.z);
|
||||||
}
|
}
|
||||||
void Disasm_vsldoi128(InstrData& i, StringBuffer* str) {
|
void Disasm_vsldoi128(InstrData& i, poly::StringBuffer* str) {
|
||||||
const uint32_t vd = VX128_5_VD128;
|
const uint32_t vd = VX128_5_VD128;
|
||||||
const uint32_t va = VX128_5_VA128;
|
const uint32_t va = VX128_5_VA128;
|
||||||
const uint32_t vb = VX128_5_VB128;
|
const uint32_t vb = VX128_5_VB128;
|
||||||
const uint32_t sh = i.VX128_5.SH;
|
const uint32_t sh = i.VX128_5.SH;
|
||||||
str->Append("%-8s v%d, v%d, v%d, %.2X", i.type->name, vd, va, vb, sh);
|
str->Append("%-8s v%d, v%d, v%d, %.2X", i.type->name, vd, va, vb, sh);
|
||||||
}
|
}
|
||||||
void Disasm_vspltb(InstrData& i, StringBuffer* str) {
|
void Disasm_vspltb(InstrData& i, poly::StringBuffer* str) {
|
||||||
str->Append("%-8s v%d, v%d, %.2X", i.type->name, i.VX.VD, i.VX.VB,
|
str->Append("%-8s v%d, v%d, %.2X", i.type->name, i.VX.VD, i.VX.VB,
|
||||||
i.VX.VA & 0xF);
|
i.VX.VA & 0xF);
|
||||||
}
|
}
|
||||||
void Disasm_vsplth(InstrData& i, StringBuffer* str) {
|
void Disasm_vsplth(InstrData& i, poly::StringBuffer* str) {
|
||||||
str->Append("%-8s v%d, v%d, %.2X", i.type->name, i.VX.VD, i.VX.VB,
|
str->Append("%-8s v%d, v%d, %.2X", i.type->name, i.VX.VD, i.VX.VB,
|
||||||
i.VX.VA & 0x7);
|
i.VX.VA & 0x7);
|
||||||
}
|
}
|
||||||
void Disasm_vspltw(InstrData& i, StringBuffer* str) {
|
void Disasm_vspltw(InstrData& i, poly::StringBuffer* str) {
|
||||||
str->Append("%-8s v%d, v%d, %.2X", i.type->name, i.VX.VD, i.VX.VB, i.VX.VA);
|
str->Append("%-8s v%d, v%d, %.2X", i.type->name, i.VX.VD, i.VX.VB, i.VX.VA);
|
||||||
}
|
}
|
||||||
void Disasm_vspltisb(InstrData& i, StringBuffer* str) {
|
void Disasm_vspltisb(InstrData& i, poly::StringBuffer* str) {
|
||||||
// 5bit -> 8bit sign extend
|
// 5bit -> 8bit sign extend
|
||||||
int8_t simm = (i.VX.VA & 0x10) ? (i.VX.VA | 0xF0) : i.VX.VA;
|
int8_t simm = (i.VX.VA & 0x10) ? (i.VX.VA | 0xF0) : i.VX.VA;
|
||||||
str->Append("%-8s v%d, %.2X", i.type->name, i.VX.VD, simm);
|
str->Append("%-8s v%d, %.2X", i.type->name, i.VX.VD, simm);
|
||||||
}
|
}
|
||||||
void Disasm_vspltish(InstrData& i, StringBuffer* str) {
|
void Disasm_vspltish(InstrData& i, poly::StringBuffer* str) {
|
||||||
// 5bit -> 16bit sign extend
|
// 5bit -> 16bit sign extend
|
||||||
int16_t simm = (i.VX.VA & 0x10) ? (i.VX.VA | 0xFFF0) : i.VX.VA;
|
int16_t simm = (i.VX.VA & 0x10) ? (i.VX.VA | 0xFFF0) : i.VX.VA;
|
||||||
str->Append("%-8s v%d, %.4X", i.type->name, i.VX.VD, simm);
|
str->Append("%-8s v%d, %.4X", i.type->name, i.VX.VD, simm);
|
||||||
}
|
}
|
||||||
void Disasm_vspltisw(InstrData& i, StringBuffer* str) {
|
void Disasm_vspltisw(InstrData& i, poly::StringBuffer* str) {
|
||||||
// 5bit -> 32bit sign extend
|
// 5bit -> 32bit sign extend
|
||||||
int32_t simm = (i.VX.VA & 0x10) ? (i.VX.VA | 0xFFFFFFF0) : i.VX.VA;
|
int32_t simm = (i.VX.VA & 0x10) ? (i.VX.VA | 0xFFFFFFF0) : i.VX.VA;
|
||||||
str->Append("%-8s v%d, %.8X", i.type->name, i.VX.VD, simm);
|
str->Append("%-8s v%d, %.8X", i.type->name, i.VX.VD, simm);
|
||||||
}
|
}
|
||||||
|
|
||||||
int DisasmPPC(InstrData& i, StringBuffer* str) {
|
int DisasmPPC(InstrData& i, poly::StringBuffer* str) {
|
||||||
if (!i.type) {
|
if (!i.type) {
|
||||||
str->Append("???");
|
str->Append("???");
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -11,12 +11,13 @@
|
||||||
#define ALLOY_FRONTEND_PPC_PPC_DISASM_H_
|
#define ALLOY_FRONTEND_PPC_PPC_DISASM_H_
|
||||||
|
|
||||||
#include "alloy/frontend/ppc/ppc_instr.h"
|
#include "alloy/frontend/ppc/ppc_instr.h"
|
||||||
|
#include "poly/string_buffer.h"
|
||||||
|
|
||||||
namespace alloy {
|
namespace alloy {
|
||||||
namespace frontend {
|
namespace frontend {
|
||||||
namespace ppc {
|
namespace ppc {
|
||||||
|
|
||||||
int DisasmPPC(InstrData& i, StringBuffer* str);
|
int DisasmPPC(InstrData& i, poly::StringBuffer* str);
|
||||||
|
|
||||||
} // namespace ppc
|
} // namespace ppc
|
||||||
} // namespace frontend
|
} // namespace frontend
|
||||||
|
|
|
@ -18,6 +18,10 @@ namespace ppc {
|
||||||
|
|
||||||
// TODO(benvanik): remove when enums redefined.
|
// TODO(benvanik): remove when enums redefined.
|
||||||
using namespace alloy::hir;
|
using namespace alloy::hir;
|
||||||
|
using poly::vec128b;
|
||||||
|
using poly::vec128f;
|
||||||
|
using poly::vec128i;
|
||||||
|
using poly::vec128s;
|
||||||
|
|
||||||
using alloy::hir::Value;
|
using alloy::hir::Value;
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
|
||||||
#include "alloy/frontend/frontend.h"
|
#include "alloy/frontend/frontend.h"
|
||||||
#include "alloy/type_pool.h"
|
#include "poly/type_pool.h"
|
||||||
|
|
||||||
namespace alloy {
|
namespace alloy {
|
||||||
namespace frontend {
|
namespace frontend {
|
||||||
|
@ -43,7 +43,7 @@ class PPCFrontend : public Frontend {
|
||||||
runtime::Function** out_function) override;
|
runtime::Function** out_function) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
TypePool<PPCTranslator, PPCFrontend*> translator_pool_;
|
poly::TypePool<PPCTranslator, PPCFrontend*> translator_pool_;
|
||||||
PPCBuiltins builtins_;
|
PPCBuiltins builtins_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
#include "alloy/hir/hir_builder.h"
|
#include "alloy/hir/hir_builder.h"
|
||||||
#include "alloy/runtime/function.h"
|
#include "alloy/runtime/function.h"
|
||||||
#include "alloy/runtime/symbol_info.h"
|
#include "alloy/runtime/symbol_info.h"
|
||||||
#include "alloy/string_buffer.h"
|
#include "poly/string_buffer.h"
|
||||||
|
|
||||||
namespace alloy {
|
namespace alloy {
|
||||||
namespace frontend {
|
namespace frontend {
|
||||||
|
@ -91,7 +91,7 @@ class PPCHIRBuilder : public hir::HIRBuilder {
|
||||||
PPCFrontend* frontend_;
|
PPCFrontend* frontend_;
|
||||||
|
|
||||||
// Reset whenever needed:
|
// Reset whenever needed:
|
||||||
StringBuffer comment_buffer_;
|
poly::StringBuffer comment_buffer_;
|
||||||
|
|
||||||
// Reset each Emit:
|
// Reset each Emit:
|
||||||
bool with_debug_info_;
|
bool with_debug_info_;
|
||||||
|
|
|
@ -13,8 +13,8 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "alloy/frontend/ppc/ppc_instr_tables.h"
|
#include "alloy/frontend/ppc/ppc_instr_tables.h"
|
||||||
#include "alloy/string_buffer.h"
|
|
||||||
#include "poly/poly.h"
|
#include "poly/poly.h"
|
||||||
|
#include "poly/string_buffer.h"
|
||||||
|
|
||||||
namespace alloy {
|
namespace alloy {
|
||||||
namespace frontend {
|
namespace frontend {
|
||||||
|
@ -23,7 +23,7 @@ namespace ppc {
|
||||||
std::vector<InstrType*> all_instrs_;
|
std::vector<InstrType*> all_instrs_;
|
||||||
|
|
||||||
void DumpAllInstrCounts() {
|
void DumpAllInstrCounts() {
|
||||||
StringBuffer sb;
|
poly::StringBuffer sb;
|
||||||
sb.Append("Instruction translation counts:\n");
|
sb.Append("Instruction translation counts:\n");
|
||||||
for (auto instr_type : all_instrs_) {
|
for (auto instr_type : all_instrs_) {
|
||||||
if (instr_type->translation_count) {
|
if (instr_type->translation_count) {
|
||||||
|
|
|
@ -14,9 +14,7 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
namespace alloy {
|
#include "poly/string_buffer.h"
|
||||||
class StringBuffer;
|
|
||||||
} // namespace alloy
|
|
||||||
|
|
||||||
namespace alloy {
|
namespace alloy {
|
||||||
namespace frontend {
|
namespace frontend {
|
||||||
|
@ -549,7 +547,7 @@ class InstrDisasm {
|
||||||
void Dump(std::string& out_str, size_t pad = 13);
|
void Dump(std::string& out_str, size_t pad = 13);
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef void (*InstrDisasmFn)(InstrData& i, StringBuffer* str);
|
typedef void (*InstrDisasmFn)(InstrData& i, poly::StringBuffer* str);
|
||||||
typedef void* InstrEmitFn;
|
typedef void* InstrEmitFn;
|
||||||
|
|
||||||
class InstrType {
|
class InstrType {
|
||||||
|
|
|
@ -14,81 +14,82 @@
|
||||||
|
|
||||||
#include "alloy/frontend/ppc/ppc_instr.h"
|
#include "alloy/frontend/ppc/ppc_instr.h"
|
||||||
#include "poly/poly.h"
|
#include "poly/poly.h"
|
||||||
|
#include "poly/string_buffer.h"
|
||||||
|
|
||||||
namespace alloy {
|
namespace alloy {
|
||||||
namespace frontend {
|
namespace frontend {
|
||||||
namespace ppc {
|
namespace ppc {
|
||||||
|
|
||||||
void Disasm_0(InstrData& i, StringBuffer* str);
|
void Disasm_0(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm__(InstrData& i, StringBuffer* str);
|
void Disasm__(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_X_FRT_FRB(InstrData& i, StringBuffer* str);
|
void Disasm_X_FRT_FRB(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_A_FRT_FRB(InstrData& i, StringBuffer* str);
|
void Disasm_A_FRT_FRB(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_A_FRT_FRA_FRB(InstrData& i, StringBuffer* str);
|
void Disasm_A_FRT_FRA_FRB(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_A_FRT_FRA_FRB_FRC(InstrData& i, StringBuffer* str);
|
void Disasm_A_FRT_FRA_FRB_FRC(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_X_RT_RA_RB(InstrData& i, StringBuffer* str);
|
void Disasm_X_RT_RA_RB(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_X_RT_RA0_RB(InstrData& i, StringBuffer* str);
|
void Disasm_X_RT_RA0_RB(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_X_FRT_RA_RB(InstrData& i, StringBuffer* str);
|
void Disasm_X_FRT_RA_RB(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_X_FRT_RA0_RB(InstrData& i, StringBuffer* str);
|
void Disasm_X_FRT_RA0_RB(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_D_RT_RA_I(InstrData& i, StringBuffer* str);
|
void Disasm_D_RT_RA_I(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_D_RT_RA0_I(InstrData& i, StringBuffer* str);
|
void Disasm_D_RT_RA0_I(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_D_FRT_RA_I(InstrData& i, StringBuffer* str);
|
void Disasm_D_FRT_RA_I(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_D_FRT_RA0_I(InstrData& i, StringBuffer* str);
|
void Disasm_D_FRT_RA0_I(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_DS_RT_RA_I(InstrData& i, StringBuffer* str);
|
void Disasm_DS_RT_RA_I(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_DS_RT_RA0_I(InstrData& i, StringBuffer* str);
|
void Disasm_DS_RT_RA0_I(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_D_RA(InstrData& i, StringBuffer* str);
|
void Disasm_D_RA(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_X_RA_RB(InstrData& i, StringBuffer* str);
|
void Disasm_X_RA_RB(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_XO_RT_RA_RB(InstrData& i, StringBuffer* str);
|
void Disasm_XO_RT_RA_RB(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_XO_RT_RA(InstrData& i, StringBuffer* str);
|
void Disasm_XO_RT_RA(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_X_RA_RT_RB(InstrData& i, StringBuffer* str);
|
void Disasm_X_RA_RT_RB(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_D_RA_RT_I(InstrData& i, StringBuffer* str);
|
void Disasm_D_RA_RT_I(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_X_RA_RT(InstrData& i, StringBuffer* str);
|
void Disasm_X_RA_RT(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_X_VX_RA0_RB(InstrData& i, StringBuffer* str);
|
void Disasm_X_VX_RA0_RB(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_VX1281_VD_RA0_RB(InstrData& i, StringBuffer* str);
|
void Disasm_VX1281_VD_RA0_RB(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_VX1283_VD_VB(InstrData& i, StringBuffer* str);
|
void Disasm_VX1283_VD_VB(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_VX1283_VD_VB_I(InstrData& i, StringBuffer* str);
|
void Disasm_VX1283_VD_VB_I(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_VX_VD_VA_VB(InstrData& i, StringBuffer* str);
|
void Disasm_VX_VD_VA_VB(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_VX128_VD_VA_VB(InstrData& i, StringBuffer* str);
|
void Disasm_VX128_VD_VA_VB(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_VX128_VD_VA_VD_VB(InstrData& i, StringBuffer* str);
|
void Disasm_VX128_VD_VA_VD_VB(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_VX1282_VD_VA_VB_VC(InstrData& i, StringBuffer* str);
|
void Disasm_VX1282_VD_VA_VB_VC(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_VXA_VD_VA_VB_VC(InstrData& i, StringBuffer* str);
|
void Disasm_VXA_VD_VA_VB_VC(InstrData& i, poly::StringBuffer* str);
|
||||||
|
|
||||||
void Disasm_sync(InstrData& i, StringBuffer* str);
|
void Disasm_sync(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_dcbf(InstrData& i, StringBuffer* str);
|
void Disasm_dcbf(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_dcbz(InstrData& i, StringBuffer* str);
|
void Disasm_dcbz(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_fcmp(InstrData& i, StringBuffer* str);
|
void Disasm_fcmp(InstrData& i, poly::StringBuffer* str);
|
||||||
|
|
||||||
void Disasm_bx(InstrData& i, StringBuffer* str);
|
void Disasm_bx(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_bcx(InstrData& i, StringBuffer* str);
|
void Disasm_bcx(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_bcctrx(InstrData& i, StringBuffer* str);
|
void Disasm_bcctrx(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_bclrx(InstrData& i, StringBuffer* str);
|
void Disasm_bclrx(InstrData& i, poly::StringBuffer* str);
|
||||||
|
|
||||||
void Disasm_mfcr(InstrData& i, StringBuffer* str);
|
void Disasm_mfcr(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_mfspr(InstrData& i, StringBuffer* str);
|
void Disasm_mfspr(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_mtspr(InstrData& i, StringBuffer* str);
|
void Disasm_mtspr(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_mftb(InstrData& i, StringBuffer* str);
|
void Disasm_mftb(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_mfmsr(InstrData& i, StringBuffer* str);
|
void Disasm_mfmsr(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_mtmsr(InstrData& i, StringBuffer* str);
|
void Disasm_mtmsr(InstrData& i, poly::StringBuffer* str);
|
||||||
|
|
||||||
void Disasm_cmp(InstrData& i, StringBuffer* str);
|
void Disasm_cmp(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_cmpi(InstrData& i, StringBuffer* str);
|
void Disasm_cmpi(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_cmpli(InstrData& i, StringBuffer* str);
|
void Disasm_cmpli(InstrData& i, poly::StringBuffer* str);
|
||||||
|
|
||||||
void Disasm_rld(InstrData& i, StringBuffer* str);
|
void Disasm_rld(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_rlwim(InstrData& i, StringBuffer* str);
|
void Disasm_rlwim(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_rlwnmx(InstrData& i, StringBuffer* str);
|
void Disasm_rlwnmx(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_srawix(InstrData& i, StringBuffer* str);
|
void Disasm_srawix(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_sradix(InstrData& i, StringBuffer* str);
|
void Disasm_sradix(InstrData& i, poly::StringBuffer* str);
|
||||||
|
|
||||||
void Disasm_vpermwi128(InstrData& i, StringBuffer* str);
|
void Disasm_vpermwi128(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_vrfin128(InstrData& i, StringBuffer* str);
|
void Disasm_vrfin128(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_vrlimi128(InstrData& i, StringBuffer* str);
|
void Disasm_vrlimi128(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_vsldoi128(InstrData& i, StringBuffer* str);
|
void Disasm_vsldoi128(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_vspltb(InstrData& i, StringBuffer* str);
|
void Disasm_vspltb(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_vsplth(InstrData& i, StringBuffer* str);
|
void Disasm_vsplth(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_vspltw(InstrData& i, StringBuffer* str);
|
void Disasm_vspltw(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_vspltisb(InstrData& i, StringBuffer* str);
|
void Disasm_vspltisb(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_vspltish(InstrData& i, StringBuffer* str);
|
void Disasm_vspltish(InstrData& i, poly::StringBuffer* str);
|
||||||
void Disasm_vspltisw(InstrData& i, StringBuffer* str);
|
void Disasm_vspltisw(InstrData& i, poly::StringBuffer* str);
|
||||||
|
|
||||||
namespace tables {
|
namespace tables {
|
||||||
|
|
||||||
|
|
|
@ -16,8 +16,8 @@
|
||||||
#include "alloy/frontend/ppc/ppc_hir_builder.h"
|
#include "alloy/frontend/ppc/ppc_hir_builder.h"
|
||||||
#include "alloy/frontend/ppc/ppc_instr.h"
|
#include "alloy/frontend/ppc/ppc_instr.h"
|
||||||
#include "alloy/frontend/ppc/ppc_scanner.h"
|
#include "alloy/frontend/ppc/ppc_scanner.h"
|
||||||
#include "alloy/reset_scope.h"
|
|
||||||
#include "alloy/runtime/runtime.h"
|
#include "alloy/runtime/runtime.h"
|
||||||
|
#include "poly/reset_scope.h"
|
||||||
#include "xenia/profiling.h"
|
#include "xenia/profiling.h"
|
||||||
|
|
||||||
namespace alloy {
|
namespace alloy {
|
||||||
|
@ -91,10 +91,10 @@ int PPCTranslator::Translate(FunctionInfo* symbol_info,
|
||||||
SCOPE_profile_cpu_f("alloy");
|
SCOPE_profile_cpu_f("alloy");
|
||||||
|
|
||||||
// Reset() all caching when we leave.
|
// Reset() all caching when we leave.
|
||||||
make_reset_scope(builder_);
|
poly::make_reset_scope(builder_);
|
||||||
make_reset_scope(compiler_);
|
poly::make_reset_scope(compiler_);
|
||||||
make_reset_scope(assembler_);
|
poly::make_reset_scope(assembler_);
|
||||||
make_reset_scope(&string_buffer_);
|
poly::make_reset_scope(&string_buffer_);
|
||||||
|
|
||||||
// Scan the function to find its extents. We only need to do this if we
|
// Scan the function to find its extents. We only need to do this if we
|
||||||
// haven't already been provided with them from some other source.
|
// haven't already been provided with them from some other source.
|
||||||
|
@ -175,7 +175,7 @@ int PPCTranslator::Translate(FunctionInfo* symbol_info,
|
||||||
};
|
};
|
||||||
|
|
||||||
void PPCTranslator::DumpSource(runtime::FunctionInfo* symbol_info,
|
void PPCTranslator::DumpSource(runtime::FunctionInfo* symbol_info,
|
||||||
StringBuffer* string_buffer) {
|
poly::StringBuffer* string_buffer) {
|
||||||
Memory* memory = frontend_->memory();
|
Memory* memory = frontend_->memory();
|
||||||
const uint8_t* p = memory->membase();
|
const uint8_t* p = memory->membase();
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
#include "alloy/backend/assembler.h"
|
#include "alloy/backend/assembler.h"
|
||||||
#include "alloy/compiler/compiler.h"
|
#include "alloy/compiler/compiler.h"
|
||||||
#include "alloy/runtime/symbol_info.h"
|
#include "alloy/runtime/symbol_info.h"
|
||||||
#include "alloy/string_buffer.h"
|
#include "poly/string_buffer.h"
|
||||||
|
|
||||||
namespace alloy {
|
namespace alloy {
|
||||||
namespace frontend {
|
namespace frontend {
|
||||||
|
@ -35,7 +35,7 @@ class PPCTranslator {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void DumpSource(runtime::FunctionInfo* symbol_info,
|
void DumpSource(runtime::FunctionInfo* symbol_info,
|
||||||
StringBuffer* string_buffer);
|
poly::StringBuffer* string_buffer);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
PPCFrontend* frontend_;
|
PPCFrontend* frontend_;
|
||||||
|
@ -44,7 +44,7 @@ class PPCTranslator {
|
||||||
std::unique_ptr<compiler::Compiler> compiler_;
|
std::unique_ptr<compiler::Compiler> compiler_;
|
||||||
std::unique_ptr<backend::Assembler> assembler_;
|
std::unique_ptr<backend::Assembler> assembler_;
|
||||||
|
|
||||||
StringBuffer string_buffer_;
|
poly::StringBuffer string_buffer_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ppc
|
} // namespace ppc
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
#ifndef ALLOY_HIR_BLOCK_H_
|
#ifndef ALLOY_HIR_BLOCK_H_
|
||||||
#define ALLOY_HIR_BLOCK_H_
|
#define ALLOY_HIR_BLOCK_H_
|
||||||
|
|
||||||
#include "alloy/arena.h"
|
#include "poly/arena.h"
|
||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
class BitVector;
|
class BitVector;
|
||||||
|
@ -45,7 +45,7 @@ class Edge {
|
||||||
|
|
||||||
class Block {
|
class Block {
|
||||||
public:
|
public:
|
||||||
Arena* arena;
|
poly::Arena* arena;
|
||||||
|
|
||||||
Block* next;
|
Block* next;
|
||||||
Block* prev;
|
Block* prev;
|
||||||
|
|
|
@ -13,7 +13,6 @@
|
||||||
#include "alloy/hir/instr.h"
|
#include "alloy/hir/instr.h"
|
||||||
#include "alloy/hir/label.h"
|
#include "alloy/hir/label.h"
|
||||||
#include "alloy/runtime/symbol_info.h"
|
#include "alloy/runtime/symbol_info.h"
|
||||||
#include "alloy/string_buffer.h"
|
|
||||||
#include "xenia/profiling.h"
|
#include "xenia/profiling.h"
|
||||||
|
|
||||||
namespace alloy {
|
namespace alloy {
|
||||||
|
@ -30,7 +29,7 @@ using alloy::runtime::FunctionInfo;
|
||||||
assert_true((value1->type) == (value2->type))
|
assert_true((value1->type) == (value2->type))
|
||||||
|
|
||||||
HIRBuilder::HIRBuilder() {
|
HIRBuilder::HIRBuilder() {
|
||||||
arena_ = new Arena();
|
arena_ = new poly::Arena();
|
||||||
Reset();
|
Reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -90,7 +89,7 @@ int HIRBuilder::Finalize() {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void HIRBuilder::DumpValue(StringBuffer* str, Value* value) {
|
void HIRBuilder::DumpValue(poly::StringBuffer* str, Value* value) {
|
||||||
if (value->IsConstant()) {
|
if (value->IsConstant()) {
|
||||||
switch (value->type) {
|
switch (value->type) {
|
||||||
case INT8_TYPE:
|
case INT8_TYPE:
|
||||||
|
@ -131,7 +130,7 @@ void HIRBuilder::DumpValue(StringBuffer* str, Value* value) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void HIRBuilder::DumpOp(StringBuffer* str, OpcodeSignatureType sig_type,
|
void HIRBuilder::DumpOp(poly::StringBuffer* str, OpcodeSignatureType sig_type,
|
||||||
Instr::Op* op) {
|
Instr::Op* op) {
|
||||||
switch (sig_type) {
|
switch (sig_type) {
|
||||||
case OPCODE_SIG_TYPE_X:
|
case OPCODE_SIG_TYPE_X:
|
||||||
|
@ -158,7 +157,7 @@ void HIRBuilder::DumpOp(StringBuffer* str, OpcodeSignatureType sig_type,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void HIRBuilder::Dump(StringBuffer* str) {
|
void HIRBuilder::Dump(poly::StringBuffer* str) {
|
||||||
SCOPE_profile_cpu_f("alloy");
|
SCOPE_profile_cpu_f("alloy");
|
||||||
|
|
||||||
if (attributes_) {
|
if (attributes_) {
|
||||||
|
|
|
@ -17,10 +17,8 @@
|
||||||
#include "alloy/hir/label.h"
|
#include "alloy/hir/label.h"
|
||||||
#include "alloy/hir/opcodes.h"
|
#include "alloy/hir/opcodes.h"
|
||||||
#include "alloy/hir/value.h"
|
#include "alloy/hir/value.h"
|
||||||
|
#include "poly/arena.h"
|
||||||
namespace alloy {
|
#include "poly/string_buffer.h"
|
||||||
class StringBuffer;
|
|
||||||
} // namespace alloy
|
|
||||||
|
|
||||||
namespace alloy {
|
namespace alloy {
|
||||||
namespace hir {
|
namespace hir {
|
||||||
|
@ -37,10 +35,10 @@ class HIRBuilder {
|
||||||
virtual void Reset();
|
virtual void Reset();
|
||||||
virtual int Finalize();
|
virtual int Finalize();
|
||||||
|
|
||||||
void Dump(StringBuffer* str);
|
void Dump(poly::StringBuffer* str);
|
||||||
void AssertNoCycles();
|
void AssertNoCycles();
|
||||||
|
|
||||||
Arena* arena() const { return arena_; }
|
poly::Arena* arena() const { return arena_; }
|
||||||
|
|
||||||
uint32_t attributes() const { return attributes_; }
|
uint32_t attributes() const { return attributes_; }
|
||||||
void set_attributes(uint32_t value) { attributes_ = value; }
|
void set_attributes(uint32_t value) { attributes_ = value; }
|
||||||
|
@ -230,8 +228,9 @@ class HIRBuilder {
|
||||||
Value* AtomicSub(Value* address, Value* value);
|
Value* AtomicSub(Value* address, Value* value);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void DumpValue(StringBuffer* str, Value* value);
|
void DumpValue(poly::StringBuffer* str, Value* value);
|
||||||
void DumpOp(StringBuffer* str, OpcodeSignatureType sig_type, Instr::Op* op);
|
void DumpOp(poly::StringBuffer* str, OpcodeSignatureType sig_type,
|
||||||
|
Instr::Op* op);
|
||||||
|
|
||||||
Value* AllocValue(TypeName type = INT64_TYPE);
|
Value* AllocValue(TypeName type = INT64_TYPE);
|
||||||
Value* CloneValue(Value* source);
|
Value* CloneValue(Value* source);
|
||||||
|
@ -246,7 +245,7 @@ class HIRBuilder {
|
||||||
TypeName part_type);
|
TypeName part_type);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Arena* arena_;
|
poly::Arena* arena_;
|
||||||
|
|
||||||
uint32_t attributes_;
|
uint32_t attributes_;
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
namespace alloy {
|
namespace alloy {
|
||||||
namespace hir {
|
namespace hir {
|
||||||
|
|
||||||
Value::Use* Value::AddUse(Arena* arena, Instr* instr) {
|
Value::Use* Value::AddUse(poly::Arena* arena, Instr* instr) {
|
||||||
Use* use = arena->Alloc<Use>();
|
Use* use = arena->Alloc<Use>();
|
||||||
use->instr = instr;
|
use->instr = instr;
|
||||||
use->prev = NULL;
|
use->prev = NULL;
|
||||||
|
|
|
@ -10,17 +10,19 @@
|
||||||
#ifndef ALLOY_HIR_VALUE_H_
|
#ifndef ALLOY_HIR_VALUE_H_
|
||||||
#define ALLOY_HIR_VALUE_H_
|
#define ALLOY_HIR_VALUE_H_
|
||||||
|
|
||||||
#include "alloy/arena.h"
|
|
||||||
#include "alloy/backend/machine_info.h"
|
#include "alloy/backend/machine_info.h"
|
||||||
#include "alloy/hir/opcodes.h"
|
#include "alloy/hir/opcodes.h"
|
||||||
#include "alloy/vec128.h"
|
#include "poly/arena.h"
|
||||||
#include "poly/poly.h"
|
#include "poly/poly.h"
|
||||||
|
#include "poly/vec128.h"
|
||||||
|
|
||||||
namespace alloy {
|
namespace alloy {
|
||||||
namespace hir {
|
namespace hir {
|
||||||
|
|
||||||
class Instr;
|
class Instr;
|
||||||
|
|
||||||
|
using vec128_t = poly::vec128_t;
|
||||||
|
|
||||||
enum TypeName {
|
enum TypeName {
|
||||||
// Many tables rely on this ordering.
|
// Many tables rely on this ordering.
|
||||||
INT8_TYPE = 0,
|
INT8_TYPE = 0,
|
||||||
|
@ -99,7 +101,7 @@ class Value {
|
||||||
// TODO(benvanik): remove to shrink size.
|
// TODO(benvanik): remove to shrink size.
|
||||||
void* tag;
|
void* tag;
|
||||||
|
|
||||||
Use* AddUse(Arena* arena, Instr* instr);
|
Use* AddUse(poly::Arena* arena, Instr* instr);
|
||||||
void RemoveUse(Use* use);
|
void RemoveUse(Use* use);
|
||||||
|
|
||||||
int8_t get_constant(int8_t) const { return constant.i8; }
|
int8_t get_constant(int8_t) const { return constant.i8; }
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include "alloy/runtime/debugger.h"
|
#include "alloy/runtime/debugger.h"
|
||||||
#include "alloy/runtime/symbol_info.h"
|
#include "alloy/runtime/symbol_info.h"
|
||||||
#include "alloy/runtime/thread_state.h"
|
#include "alloy/runtime/thread_state.h"
|
||||||
|
#include "poly/logging.h"
|
||||||
#include "xdb/protocol.h"
|
#include "xdb/protocol.h"
|
||||||
|
|
||||||
namespace alloy {
|
namespace alloy {
|
||||||
|
|
|
@ -10,9 +10,9 @@
|
||||||
#include "alloy/runtime/test_module.h"
|
#include "alloy/runtime/test_module.h"
|
||||||
|
|
||||||
#include "alloy/compiler/compiler_passes.h"
|
#include "alloy/compiler/compiler_passes.h"
|
||||||
#include "alloy/reset_scope.h"
|
|
||||||
#include "alloy/runtime/runtime.h"
|
#include "alloy/runtime/runtime.h"
|
||||||
#include "poly/platform.h"
|
#include "poly/platform.h"
|
||||||
|
#include "poly/reset_scope.h"
|
||||||
#include "poly/string.h"
|
#include "poly/string.h"
|
||||||
|
|
||||||
namespace alloy {
|
namespace alloy {
|
||||||
|
@ -79,8 +79,8 @@ SymbolInfo::Status TestModule::DeclareFunction(uint64_t address,
|
||||||
auto symbol_info = *out_symbol_info;
|
auto symbol_info = *out_symbol_info;
|
||||||
|
|
||||||
// Reset() all caching when we leave.
|
// Reset() all caching when we leave.
|
||||||
make_reset_scope(compiler_);
|
poly::make_reset_scope(compiler_);
|
||||||
make_reset_scope(assembler_);
|
poly::make_reset_scope(assembler_);
|
||||||
|
|
||||||
if (!generate_(*builder_.get())) {
|
if (!generate_(*builder_.get())) {
|
||||||
symbol_info->set_status(SymbolInfo::STATUS_FAILED);
|
symbol_info->set_status(SymbolInfo::STATUS_FAILED);
|
||||||
|
|
|
@ -4,15 +4,8 @@
|
||||||
'alloy-private.h',
|
'alloy-private.h',
|
||||||
'alloy.cc',
|
'alloy.cc',
|
||||||
'alloy.h',
|
'alloy.h',
|
||||||
'arena.cc',
|
|
||||||
'arena.h',
|
|
||||||
'memory.cc',
|
'memory.cc',
|
||||||
'memory.h',
|
'memory.h',
|
||||||
'reset_scope.h',
|
|
||||||
'string_buffer.cc',
|
|
||||||
'string_buffer.h',
|
|
||||||
'type_pool.h',
|
|
||||||
'vec128.h',
|
|
||||||
],
|
],
|
||||||
|
|
||||||
'conditions': [
|
'conditions': [
|
||||||
|
|
|
@ -14,6 +14,7 @@ using namespace alloy::hir;
|
||||||
using namespace alloy::runtime;
|
using namespace alloy::runtime;
|
||||||
using namespace alloy::test;
|
using namespace alloy::test;
|
||||||
using alloy::frontend::ppc::PPCContext;
|
using alloy::frontend::ppc::PPCContext;
|
||||||
|
using namespace poly;
|
||||||
|
|
||||||
TEST_CASE("BYTE_SWAP_V128", "[instr]") {
|
TEST_CASE("BYTE_SWAP_V128", "[instr]") {
|
||||||
TestFunction([](hir::HIRBuilder& b) {
|
TestFunction([](hir::HIRBuilder& b) {
|
||||||
|
|
|
@ -16,6 +16,7 @@ using namespace alloy::hir;
|
||||||
using namespace alloy::runtime;
|
using namespace alloy::runtime;
|
||||||
using namespace alloy::test;
|
using namespace alloy::test;
|
||||||
using alloy::frontend::ppc::PPCContext;
|
using alloy::frontend::ppc::PPCContext;
|
||||||
|
using namespace poly;
|
||||||
|
|
||||||
TEST_CASE("EXTRACT_INT8", "[instr]") {
|
TEST_CASE("EXTRACT_INT8", "[instr]") {
|
||||||
TestFunction test([](hir::HIRBuilder& b) {
|
TestFunction test([](hir::HIRBuilder& b) {
|
||||||
|
|
|
@ -16,6 +16,7 @@ using namespace alloy::hir;
|
||||||
using namespace alloy::runtime;
|
using namespace alloy::runtime;
|
||||||
using namespace alloy::test;
|
using namespace alloy::test;
|
||||||
using alloy::frontend::ppc::PPCContext;
|
using alloy::frontend::ppc::PPCContext;
|
||||||
|
using namespace poly;
|
||||||
|
|
||||||
TEST_CASE("INSERT_INT8", "[instr]") {
|
TEST_CASE("INSERT_INT8", "[instr]") {
|
||||||
for (int i = 0; i < 16; ++i) {
|
for (int i = 0; i < 16; ++i) {
|
||||||
|
|
|
@ -14,6 +14,7 @@ using namespace alloy::hir;
|
||||||
using namespace alloy::runtime;
|
using namespace alloy::runtime;
|
||||||
using namespace alloy::test;
|
using namespace alloy::test;
|
||||||
using alloy::frontend::ppc::PPCContext;
|
using alloy::frontend::ppc::PPCContext;
|
||||||
|
using namespace poly;
|
||||||
|
|
||||||
TEST_CASE("LOAD_VECTOR_SHL", "[instr]") {
|
TEST_CASE("LOAD_VECTOR_SHL", "[instr]") {
|
||||||
TestFunction test([](hir::HIRBuilder& b) {
|
TestFunction test([](hir::HIRBuilder& b) {
|
||||||
|
|
|
@ -14,6 +14,7 @@ using namespace alloy::hir;
|
||||||
using namespace alloy::runtime;
|
using namespace alloy::runtime;
|
||||||
using namespace alloy::test;
|
using namespace alloy::test;
|
||||||
using alloy::frontend::ppc::PPCContext;
|
using alloy::frontend::ppc::PPCContext;
|
||||||
|
using namespace poly;
|
||||||
|
|
||||||
TEST_CASE("PACK_D3DCOLOR", "[instr]") {
|
TEST_CASE("PACK_D3DCOLOR", "[instr]") {
|
||||||
TestFunction test([](hir::HIRBuilder& b) {
|
TestFunction test([](hir::HIRBuilder& b) {
|
||||||
|
|
|
@ -14,6 +14,7 @@ using namespace alloy::hir;
|
||||||
using namespace alloy::runtime;
|
using namespace alloy::runtime;
|
||||||
using namespace alloy::test;
|
using namespace alloy::test;
|
||||||
using alloy::frontend::ppc::PPCContext;
|
using alloy::frontend::ppc::PPCContext;
|
||||||
|
using namespace poly;
|
||||||
|
|
||||||
TEST_CASE("PERMUTE_V128_BY_INT32_CONSTANT", "[instr]") {
|
TEST_CASE("PERMUTE_V128_BY_INT32_CONSTANT", "[instr]") {
|
||||||
{
|
{
|
||||||
|
|
|
@ -14,6 +14,7 @@ using namespace alloy::hir;
|
||||||
using namespace alloy::runtime;
|
using namespace alloy::runtime;
|
||||||
using namespace alloy::test;
|
using namespace alloy::test;
|
||||||
using alloy::frontend::ppc::PPCContext;
|
using alloy::frontend::ppc::PPCContext;
|
||||||
|
using namespace poly;
|
||||||
|
|
||||||
TEST_CASE("SHR_I8", "[instr]") {
|
TEST_CASE("SHR_I8", "[instr]") {
|
||||||
TestFunction test([](hir::HIRBuilder& b) {
|
TestFunction test([](hir::HIRBuilder& b) {
|
||||||
|
|
|
@ -14,6 +14,7 @@ using namespace alloy::hir;
|
||||||
using namespace alloy::runtime;
|
using namespace alloy::runtime;
|
||||||
using namespace alloy::test;
|
using namespace alloy::test;
|
||||||
using alloy::frontend::ppc::PPCContext;
|
using alloy::frontend::ppc::PPCContext;
|
||||||
|
using namespace poly;
|
||||||
|
|
||||||
TEST_CASE("SWIZZLE_V128", "[instr]") {
|
TEST_CASE("SWIZZLE_V128", "[instr]") {
|
||||||
TestFunction([](hir::HIRBuilder& b) {
|
TestFunction([](hir::HIRBuilder& b) {
|
||||||
|
|
|
@ -14,6 +14,7 @@ using namespace alloy::hir;
|
||||||
using namespace alloy::runtime;
|
using namespace alloy::runtime;
|
||||||
using namespace alloy::test;
|
using namespace alloy::test;
|
||||||
using alloy::frontend::ppc::PPCContext;
|
using alloy::frontend::ppc::PPCContext;
|
||||||
|
using namespace poly;
|
||||||
|
|
||||||
TEST_CASE("UNPACK_D3DCOLOR", "[instr]") {
|
TEST_CASE("UNPACK_D3DCOLOR", "[instr]") {
|
||||||
TestFunction test([](hir::HIRBuilder& b) {
|
TestFunction test([](hir::HIRBuilder& b) {
|
||||||
|
|
|
@ -16,6 +16,7 @@ using namespace alloy::hir;
|
||||||
using namespace alloy::runtime;
|
using namespace alloy::runtime;
|
||||||
using namespace alloy::test;
|
using namespace alloy::test;
|
||||||
using alloy::frontend::ppc::PPCContext;
|
using alloy::frontend::ppc::PPCContext;
|
||||||
|
using namespace poly;
|
||||||
|
|
||||||
TEST_CASE("VECTOR_ADD_I8", "[instr]") {
|
TEST_CASE("VECTOR_ADD_I8", "[instr]") {
|
||||||
TestFunction test([](hir::HIRBuilder& b) {
|
TestFunction test([](hir::HIRBuilder& b) {
|
||||||
|
|
|
@ -16,6 +16,7 @@ using namespace alloy::hir;
|
||||||
using namespace alloy::runtime;
|
using namespace alloy::runtime;
|
||||||
using namespace alloy::test;
|
using namespace alloy::test;
|
||||||
using alloy::frontend::ppc::PPCContext;
|
using alloy::frontend::ppc::PPCContext;
|
||||||
|
using namespace poly;
|
||||||
|
|
||||||
TEST_CASE("VECTOR_MAX_I8_SIGNED", "[instr]") {
|
TEST_CASE("VECTOR_MAX_I8_SIGNED", "[instr]") {
|
||||||
TestFunction test([](hir::HIRBuilder& b) {
|
TestFunction test([](hir::HIRBuilder& b) {
|
||||||
|
|
|
@ -16,6 +16,7 @@ using namespace alloy::hir;
|
||||||
using namespace alloy::runtime;
|
using namespace alloy::runtime;
|
||||||
using namespace alloy::test;
|
using namespace alloy::test;
|
||||||
using alloy::frontend::ppc::PPCContext;
|
using alloy::frontend::ppc::PPCContext;
|
||||||
|
using namespace poly;
|
||||||
|
|
||||||
TEST_CASE("VECTOR_MIN_I8_SIGNED", "[instr]") {
|
TEST_CASE("VECTOR_MIN_I8_SIGNED", "[instr]") {
|
||||||
TestFunction test([](hir::HIRBuilder& b) {
|
TestFunction test([](hir::HIRBuilder& b) {
|
||||||
|
|
|
@ -15,6 +15,7 @@ using namespace alloy::hir;
|
||||||
using namespace alloy::runtime;
|
using namespace alloy::runtime;
|
||||||
using namespace alloy::test;
|
using namespace alloy::test;
|
||||||
using alloy::frontend::ppc::PPCContext;
|
using alloy::frontend::ppc::PPCContext;
|
||||||
|
using namespace poly;
|
||||||
|
|
||||||
TEST_CASE("VECTOR_ROTATE_LEFT_I8", "[instr]") {
|
TEST_CASE("VECTOR_ROTATE_LEFT_I8", "[instr]") {
|
||||||
TestFunction test([](hir::HIRBuilder& b) {
|
TestFunction test([](hir::HIRBuilder& b) {
|
||||||
|
|
|
@ -14,6 +14,7 @@ using namespace alloy::hir;
|
||||||
using namespace alloy::runtime;
|
using namespace alloy::runtime;
|
||||||
using namespace alloy::test;
|
using namespace alloy::test;
|
||||||
using alloy::frontend::ppc::PPCContext;
|
using alloy::frontend::ppc::PPCContext;
|
||||||
|
using namespace poly;
|
||||||
|
|
||||||
TEST_CASE("VECTOR_SHA_I8", "[instr]") {
|
TEST_CASE("VECTOR_SHA_I8", "[instr]") {
|
||||||
TestFunction test([](hir::HIRBuilder& b) {
|
TestFunction test([](hir::HIRBuilder& b) {
|
||||||
|
|
|
@ -14,6 +14,7 @@ using namespace alloy::hir;
|
||||||
using namespace alloy::runtime;
|
using namespace alloy::runtime;
|
||||||
using namespace alloy::test;
|
using namespace alloy::test;
|
||||||
using alloy::frontend::ppc::PPCContext;
|
using alloy::frontend::ppc::PPCContext;
|
||||||
|
using namespace poly;
|
||||||
|
|
||||||
TEST_CASE("VECTOR_SHL_I8", "[instr]") {
|
TEST_CASE("VECTOR_SHL_I8", "[instr]") {
|
||||||
TestFunction test([](hir::HIRBuilder& b) {
|
TestFunction test([](hir::HIRBuilder& b) {
|
||||||
|
|
|
@ -14,6 +14,7 @@ using namespace alloy::hir;
|
||||||
using namespace alloy::runtime;
|
using namespace alloy::runtime;
|
||||||
using namespace alloy::test;
|
using namespace alloy::test;
|
||||||
using alloy::frontend::ppc::PPCContext;
|
using alloy::frontend::ppc::PPCContext;
|
||||||
|
using namespace poly;
|
||||||
|
|
||||||
TEST_CASE("VECTOR_SHR_I8", "[instr]") {
|
TEST_CASE("VECTOR_SHR_I8", "[instr]") {
|
||||||
TestFunction test([](hir::HIRBuilder& b) {
|
TestFunction test([](hir::HIRBuilder& b) {
|
||||||
|
|
|
@ -7,11 +7,13 @@
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "alloy/arena.h"
|
#include "poly/arena.h"
|
||||||
|
|
||||||
#include "poly/poly.h"
|
#include <memory>
|
||||||
|
|
||||||
namespace alloy {
|
#include "poly/assert.h"
|
||||||
|
|
||||||
|
namespace poly {
|
||||||
|
|
||||||
Arena::Arena(size_t chunk_size)
|
Arena::Arena(size_t chunk_size)
|
||||||
: chunk_size_(chunk_size), head_chunk_(nullptr), active_chunk_(nullptr) {}
|
: chunk_size_(chunk_size), head_chunk_(nullptr), active_chunk_(nullptr) {}
|
||||||
|
@ -37,7 +39,7 @@ void Arena::Reset() {
|
||||||
void Arena::DebugFill() {
|
void Arena::DebugFill() {
|
||||||
auto chunk = head_chunk_;
|
auto chunk = head_chunk_;
|
||||||
while (chunk) {
|
while (chunk) {
|
||||||
memset(chunk->buffer, 0xCD, chunk->capacity);
|
std::memset(chunk->buffer, 0xCD, chunk->capacity);
|
||||||
chunk = chunk->next;
|
chunk = chunk->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -77,7 +79,7 @@ void* Arena::CloneContents() {
|
||||||
uint8_t* p = (uint8_t*)result;
|
uint8_t* p = (uint8_t*)result;
|
||||||
chunk = head_chunk_;
|
chunk = head_chunk_;
|
||||||
while (chunk) {
|
while (chunk) {
|
||||||
memcpy(p, chunk->buffer, chunk->offset);
|
std::memcpy(p, chunk->buffer, chunk->offset);
|
||||||
p += chunk->offset;
|
p += chunk->offset;
|
||||||
if (chunk == active_chunk_) {
|
if (chunk == active_chunk_) {
|
||||||
break;
|
break;
|
||||||
|
@ -98,4 +100,4 @@ Arena::Chunk::~Chunk() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace alloy
|
} // namespace poly
|
|
@ -7,13 +7,13 @@
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef ALLOY_ARENA_H_
|
#ifndef POLY_ARENA_H_
|
||||||
#define ALLOY_ARENA_H_
|
#define POLY_ARENA_H_
|
||||||
|
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
namespace alloy {
|
namespace poly {
|
||||||
|
|
||||||
class Arena {
|
class Arena {
|
||||||
public:
|
public:
|
||||||
|
@ -50,6 +50,6 @@ class Arena {
|
||||||
Chunk* active_chunk_;
|
Chunk* active_chunk_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace alloy
|
} // namespace poly
|
||||||
|
|
||||||
#endif // ALLOY_ARENA_H_
|
#endif // POLY_ARENA_H_
|
|
@ -23,6 +23,7 @@
|
||||||
#include "poly/platform.h"
|
#include "poly/platform.h"
|
||||||
#include "poly/string.h"
|
#include "poly/string.h"
|
||||||
#include "poly/threading.h"
|
#include "poly/threading.h"
|
||||||
|
#include "poly/vec128.h"
|
||||||
|
|
||||||
namespace poly {} // namespace poly
|
namespace poly {} // namespace poly
|
||||||
|
|
||||||
|
|
|
@ -7,12 +7,12 @@
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef ALLOY_RESET_SCOPE_H_
|
#ifndef POLY_RESET_SCOPE_H_
|
||||||
#define ALLOY_RESET_SCOPE_H_
|
#define POLY_RESET_SCOPE_H_
|
||||||
|
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
|
||||||
namespace alloy {
|
namespace poly {
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
class ResetScope {
|
class ResetScope {
|
||||||
|
@ -38,6 +38,6 @@ inline ResetScope<T> make_reset_scope(const std::unique_ptr<T>& value) {
|
||||||
return ResetScope<T>(value.get());
|
return ResetScope<T>(value.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace alloy
|
} // namespace poly
|
||||||
|
|
||||||
#endif // ALLOY_RESET_SCOPE_H_
|
#endif // POLY_RESET_SCOPE_H_
|
|
@ -1,6 +1,8 @@
|
||||||
# Copyright 2014 Ben Vanik. All Rights Reserved.
|
# Copyright 2014 Ben Vanik. All Rights Reserved.
|
||||||
{
|
{
|
||||||
'sources': [
|
'sources': [
|
||||||
|
'arena.cc',
|
||||||
|
'arena.h',
|
||||||
'assert.h',
|
'assert.h',
|
||||||
'atomic.h',
|
'atomic.h',
|
||||||
'byte_order.h',
|
'byte_order.h',
|
||||||
|
@ -20,10 +22,15 @@
|
||||||
'memory.h',
|
'memory.h',
|
||||||
'platform.h',
|
'platform.h',
|
||||||
'poly.h',
|
'poly.h',
|
||||||
|
'reset_scope.h',
|
||||||
'string.cc',
|
'string.cc',
|
||||||
'string.h',
|
'string.h',
|
||||||
|
'string_buffer.cc',
|
||||||
|
'string_buffer.h',
|
||||||
'threading.cc',
|
'threading.cc',
|
||||||
'threading.h',
|
'threading.h',
|
||||||
|
'type_pool.h',
|
||||||
|
'vec128.h',
|
||||||
],
|
],
|
||||||
|
|
||||||
'conditions': [
|
'conditions': [
|
||||||
|
|
|
@ -7,12 +7,12 @@
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "alloy/string_buffer.h"
|
#include "poly/string_buffer.h"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cstdarg>
|
#include <cstdarg>
|
||||||
|
|
||||||
namespace alloy {
|
namespace poly {
|
||||||
|
|
||||||
StringBuffer::StringBuffer(size_t initial_capacity) {
|
StringBuffer::StringBuffer(size_t initial_capacity) {
|
||||||
buffer_.reserve(std::max(initial_capacity, static_cast<size_t>(1024)));
|
buffer_.reserve(std::max(initial_capacity, static_cast<size_t>(1024)));
|
||||||
|
@ -62,8 +62,10 @@ void StringBuffer::AppendBytes(const uint8_t* buffer, size_t length) {
|
||||||
|
|
||||||
const char* StringBuffer::GetString() const { return buffer_.data(); }
|
const char* StringBuffer::GetString() const { return buffer_.data(); }
|
||||||
|
|
||||||
std::string StringBuffer::to_string() { return std::string(buffer_.data(), buffer_.size()); }
|
std::string StringBuffer::to_string() {
|
||||||
|
return std::string(buffer_.data(), buffer_.size());
|
||||||
|
}
|
||||||
|
|
||||||
char* StringBuffer::ToString() { return strdup(buffer_.data()); }
|
char* StringBuffer::ToString() { return strdup(buffer_.data()); }
|
||||||
|
|
||||||
} // namespace alloy
|
} // namespace poly
|
|
@ -7,14 +7,14 @@
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef ALLOY_STRING_BUFFER_H_
|
#ifndef POLY_STRING_BUFFER_H_
|
||||||
#define ALLOY_STRING_BUFFER_H_
|
#define POLY_STRING_BUFFER_H_
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
namespace alloy {
|
namespace poly {
|
||||||
|
|
||||||
class StringBuffer {
|
class StringBuffer {
|
||||||
public:
|
public:
|
||||||
|
@ -41,6 +41,6 @@ class StringBuffer {
|
||||||
std::vector<char> buffer_;
|
std::vector<char> buffer_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace alloy
|
} // namespace poly
|
||||||
|
|
||||||
#endif // ALLOY_STRING_BUFFER_H_
|
#endif // POLY_STRING_BUFFER_H_
|
|
@ -7,13 +7,13 @@
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef ALLOY_TYPE_POOL_H_
|
#ifndef POLY_TYPE_POOL_H_
|
||||||
#define ALLOY_TYPE_POOL_H_
|
#define POLY_TYPE_POOL_H_
|
||||||
|
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
namespace alloy {
|
namespace poly {
|
||||||
|
|
||||||
template <class T, typename A>
|
template <class T, typename A>
|
||||||
class TypePool {
|
class TypePool {
|
||||||
|
@ -54,6 +54,6 @@ class TypePool {
|
||||||
std::vector<T*> list_;
|
std::vector<T*> list_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace alloy
|
} // namespace poly
|
||||||
|
|
||||||
#endif // ALLOY_TYPE_POOL_H_
|
#endif // POLY_TYPE_POOL_H_
|
|
@ -7,12 +7,12 @@
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef ALLOY_VEC128_H_
|
#ifndef POLY_VEC128_H_
|
||||||
#define ALLOY_VEC128_H_
|
#define POLY_VEC128_H_
|
||||||
|
|
||||||
#include "poly/poly.h"
|
#include <cstddef>
|
||||||
|
|
||||||
namespace alloy {
|
namespace poly {
|
||||||
|
|
||||||
// The first rule of vector programming is to only rely on exact positions
|
// The first rule of vector programming is to only rely on exact positions
|
||||||
// when absolutely required - prefer dumb loops to exact offsets.
|
// when absolutely required - prefer dumb loops to exact offsets.
|
||||||
|
@ -191,6 +191,6 @@ static inline vec128_t vec128b(uint8_t x0, uint8_t x1, uint8_t x2, uint8_t x3,
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace alloy
|
} // namespace poly
|
||||||
|
|
||||||
#endif // ALLOY_VEC128_H_
|
#endif // POLY_VEC128_H_
|
|
@ -12,13 +12,13 @@
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
#include <alloy/vec128.h>
|
#include "poly/atomic.h"
|
||||||
#include <poly/atomic.h>
|
#include "poly/vec128.h"
|
||||||
|
|
||||||
namespace xdb {
|
namespace xdb {
|
||||||
namespace protocol {
|
namespace protocol {
|
||||||
|
|
||||||
using vec128_t = alloy::vec128_t;
|
using vec128_t = poly::vec128_t;
|
||||||
|
|
||||||
#pragma pack(push, 4)
|
#pragma pack(push, 4)
|
||||||
|
|
||||||
|
@ -96,7 +96,7 @@ struct Registers {
|
||||||
uint32_t vscr;
|
uint32_t vscr;
|
||||||
uint64_t gpr[32];
|
uint64_t gpr[32];
|
||||||
double fpr[32];
|
double fpr[32];
|
||||||
alloy::vec128_t vr[128];
|
poly::vec128_t vr[128];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ThreadCreateEvent : public Event<ThreadCreateEvent> {
|
struct ThreadCreateEvent : public Event<ThreadCreateEvent> {
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include "alloy/string_buffer.h"
|
#include "poly/string_buffer.h"
|
||||||
#include "xenia/common.h"
|
#include "xenia/common.h"
|
||||||
#include "xenia/gpu/gl4/gl_context.h"
|
#include "xenia/gpu/gl4/gl_context.h"
|
||||||
#include "xenia/gpu/gl4/gl4_shader.h"
|
#include "xenia/gpu/gl4/gl4_shader.h"
|
||||||
|
@ -42,7 +42,7 @@ class GL4ShaderTranslator {
|
||||||
const uint32_t* dwords_;
|
const uint32_t* dwords_;
|
||||||
|
|
||||||
static const int kOutputCapacity = 64 * 1024;
|
static const int kOutputCapacity = 64 * 1024;
|
||||||
alloy::StringBuffer output_;
|
poly::StringBuffer output_;
|
||||||
|
|
||||||
bool is_vertex_shader() const { return shader_type_ == ShaderType::kVertex; }
|
bool is_vertex_shader() const { return shader_type_ == ShaderType::kVertex; }
|
||||||
bool is_pixel_shader() const { return shader_type_ == ShaderType::kPixel; }
|
bool is_pixel_shader() const { return shader_type_ == ShaderType::kPixel; }
|
||||||
|
|
Loading…
Reference in New Issue