Ugh. Replacing the fancy templates with hand coded sequences for now.
This commit is contained in:
@@ -1,112 +0,0 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* Xenia : Xbox 360 Emulator Research Project *
|
||||
******************************************************************************
|
||||
* Copyright 2013 Ben Vanik. All rights reserved. *
|
||||
* Released under the BSD license - see LICENSE in the root for more details. *
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
DEFINE_OPCODE_X(COMMENT);
|
||||
|
||||
DEFINE_OPCODE_X(NOP);
|
||||
|
||||
DEFINE_OPCODE_X_O(SOURCE_OFFSET);
|
||||
|
||||
DEFINE_OPCODE_X(DEBUG_BREAK);
|
||||
DEFINE_OPCODE_X_V(DEBUG_BREAK_TRUE);
|
||||
|
||||
DEFINE_OPCODE_X(TRAP);
|
||||
DEFINE_OPCODE_X_V(TRAP_TRUE);
|
||||
|
||||
DEFINE_OPCODE_X_S(CALL);
|
||||
DEFINE_OPCODE_X_V_S(CALL_TRUE);
|
||||
DEFINE_OPCODE_X_V(CALL_INDIRECT);
|
||||
DEFINE_OPCODE_X_V_V(CALL_INDIRECT_TRUE);
|
||||
DEFINE_OPCODE_X(RETURN);
|
||||
DEFINE_OPCODE_X_V(SET_RETURN_ADDRESS);
|
||||
|
||||
DEFINE_OPCODE_X_L(BRANCH);
|
||||
DEFINE_OPCODE_X_V_L(BRANCH_TRUE);
|
||||
DEFINE_OPCODE_X_V_L(BRANCH_FALSE);
|
||||
|
||||
DEFINE_OPCODE_V_V(ASSIGN);
|
||||
DEFINE_OPCODE_V_V(CAST);
|
||||
DEFINE_OPCODE_V_V(ZERO_EXTEND);
|
||||
DEFINE_OPCODE_V_V(SIGN_EXTEND);
|
||||
DEFINE_OPCODE_V_V(TRUNCATE);
|
||||
DEFINE_OPCODE_V_V(CONVERT);
|
||||
DEFINE_OPCODE_V_V(ROUND);
|
||||
DEFINE_OPCODE_V_V(VECTOR_CONVERT_I2F);
|
||||
DEFINE_OPCODE_V_V(VECTOR_CONVERT_F2I);
|
||||
|
||||
DEFINE_OPCODE_V_V(LOAD_VECTOR_SHL);
|
||||
DEFINE_OPCODE_V_V(LOAD_VECTOR_SHR);
|
||||
|
||||
DEFINE_OPCODE_V_O(LOAD_CONTEXT);
|
||||
DEFINE_OPCODE_V_O_V(STORE_CONTEXT);
|
||||
|
||||
DEFINE_OPCODE_V_V(LOAD);
|
||||
DEFINE_OPCODE_V_V(LOAD_ACQUIRE);
|
||||
DEFINE_OPCODE_X_V_V(STORE);
|
||||
DEFINE_OPCODE_V_V_V(STORE_RELEASE);
|
||||
DEFINE_OPCODE_X_V_O(PREFETCH);
|
||||
|
||||
DEFINE_OPCODE_V_V_V(MAX);
|
||||
DEFINE_OPCODE_V_V_V(MIN);
|
||||
DEFINE_OPCODE_V_V_V_V(SELECT);
|
||||
DEFINE_OPCODE_V_V(IS_TRUE);
|
||||
DEFINE_OPCODE_V_V(IS_FALSE);
|
||||
DEFINE_OPCODE_V_V_V(COMPARE_EQ);
|
||||
DEFINE_OPCODE_V_V_V(COMPARE_NE);
|
||||
DEFINE_OPCODE_V_V_V(COMPARE_SLT);
|
||||
DEFINE_OPCODE_V_V_V(COMPARE_SLE);
|
||||
DEFINE_OPCODE_V_V_V(COMPARE_SGT);
|
||||
DEFINE_OPCODE_V_V_V(COMPARE_SGE);
|
||||
DEFINE_OPCODE_V_V_V(COMPARE_ULT);
|
||||
DEFINE_OPCODE_V_V_V(COMPARE_ULE);
|
||||
DEFINE_OPCODE_V_V_V(COMPARE_UGT);
|
||||
DEFINE_OPCODE_V_V_V(COMPARE_UGE);
|
||||
DEFINE_OPCODE_V_V(DID_CARRY);
|
||||
DEFINE_OPCODE_V_V(DID_OVERFLOW);
|
||||
DEFINE_OPCODE_V_V_V(VECTOR_COMPARE_EQ);
|
||||
DEFINE_OPCODE_V_V_V(VECTOR_COMPARE_SGT);
|
||||
DEFINE_OPCODE_V_V_V(VECTOR_COMPARE_SGE);
|
||||
DEFINE_OPCODE_V_V_V(VECTOR_COMPARE_UGT);
|
||||
DEFINE_OPCODE_V_V_V(VECTOR_COMPARE_UGE);
|
||||
|
||||
DEFINE_OPCODE_V_V_V(ADD);
|
||||
DEFINE_OPCODE_V_V_V_V(ADD_CARRY);
|
||||
DEFINE_OPCODE_V_V_V(SUB);
|
||||
DEFINE_OPCODE_V_V_V(MUL);
|
||||
DEFINE_OPCODE_V_V_V(DIV);
|
||||
DEFINE_OPCODE_V_V_V(REM);
|
||||
DEFINE_OPCODE_V_V_V_V(MULADD);
|
||||
DEFINE_OPCODE_V_V_V_V(MULSUB);
|
||||
DEFINE_OPCODE_V_V(NEG);
|
||||
DEFINE_OPCODE_V_V(ABS);
|
||||
DEFINE_OPCODE_V_V(SQRT);
|
||||
DEFINE_OPCODE_V_V(RSQRT);
|
||||
DEFINE_OPCODE_V_V_V(DOT_PRODUCT_3);
|
||||
DEFINE_OPCODE_V_V_V(DOT_PRODUCT_4);
|
||||
|
||||
DEFINE_OPCODE_V_V_V(AND);
|
||||
DEFINE_OPCODE_V_V_V(OR);
|
||||
DEFINE_OPCODE_V_V_V(XOR);
|
||||
DEFINE_OPCODE_V_V(NOT);
|
||||
DEFINE_OPCODE_V_V_V(SHL);
|
||||
DEFINE_OPCODE_V_V_V(VECTOR_SHL);
|
||||
DEFINE_OPCODE_V_V_V(SHR);
|
||||
DEFINE_OPCODE_V_V_V(SHA);
|
||||
DEFINE_OPCODE_V_V_V(ROTATE_LEFT);
|
||||
DEFINE_OPCODE_V_V(BYTE_SWAP);
|
||||
DEFINE_OPCODE_V_V(CNTLZ);
|
||||
DEFINE_OPCODE_V_V_V_V(INSERT);
|
||||
DEFINE_OPCODE_V_V_V(EXTRACT);
|
||||
DEFINE_OPCODE_V_V(SPLAT);
|
||||
DEFINE_OPCODE_V_V_V_V(PERMUTE);
|
||||
DEFINE_OPCODE_V_V_O(SWIZZLE);
|
||||
|
||||
DEFINE_OPCODE_V_V_V_V(COMPARE_EXCHANGE);
|
||||
DEFINE_OPCODE_V_V_V(ATOMIC_ADD);
|
||||
DEFINE_OPCODE_V_V_V(ATOMIC_SUB);
|
||||
@@ -1,16 +0,0 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* Xenia : Xbox 360 Emulator Research Project *
|
||||
******************************************************************************
|
||||
* Copyright 2013 Ben Vanik. All rights reserved. *
|
||||
* Released under the BSD license - see LICENSE in the root for more details. *
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
DEFINE_LIR_OPCODE_R32_R32(MOV_I32);
|
||||
DEFINE_LIR_OPCODE_R32_R32(XOR_I32);
|
||||
DEFINE_LIR_OPCODE_R32(DEC_I32);
|
||||
DEFINE_LIR_OPCODE_R32_R32(SUB_I32);
|
||||
DEFINE_LIR_OPCODE_R32_R32(IMUL_I32);
|
||||
DEFINE_LIR_OPCODE_R32_R32_C32(IMUL_I32_AUX);
|
||||
DEFINE_LIR_OPCODE_R32(DIV_I32);
|
||||
File diff suppressed because it is too large
Load Diff
@@ -23,11 +23,11 @@ LoweringTable::LoweringTable(X64Backend* backend) :
|
||||
|
||||
LoweringTable::~LoweringTable() {
|
||||
for (size_t n = 0; n < XECOUNT(lookup_); n++) {
|
||||
auto fn = lookup_[n];
|
||||
while (fn) {
|
||||
auto next = fn->next;
|
||||
delete fn;
|
||||
fn = next;
|
||||
auto entry = lookup_[n];
|
||||
while (entry) {
|
||||
auto next = entry->next;
|
||||
delete entry;
|
||||
entry = next;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -37,10 +37,12 @@ int LoweringTable::Initialize() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
void LoweringTable::AddSequence(hir::Opcode starting_opcode, FnWrapper* fn) {
|
||||
auto existing_fn = lookup_[starting_opcode];
|
||||
fn->next = existing_fn;
|
||||
lookup_[starting_opcode] = fn;
|
||||
void LoweringTable::AddSequence(hir::Opcode starting_opcode, sequence_fn_t fn) {
|
||||
auto existing_entry = lookup_[starting_opcode];
|
||||
auto new_entry = new sequence_fn_entry_t();
|
||||
new_entry->fn = fn;
|
||||
new_entry->next = existing_entry;
|
||||
lookup_[starting_opcode] = new_entry;
|
||||
}
|
||||
|
||||
int LoweringTable::Process(
|
||||
@@ -78,13 +80,13 @@ int LoweringTable::Process(
|
||||
auto hir_instr = hir_block->instr_head;
|
||||
while (hir_instr) {
|
||||
bool processed = false;
|
||||
auto fn = lookup_[hir_instr->opcode->num];
|
||||
while (fn) {
|
||||
if ((*fn)(lir_builder, hir_instr)) {
|
||||
auto entry = lookup_[hir_instr->opcode->num];
|
||||
while (entry) {
|
||||
if ((*entry->fn)(*lir_builder, hir_instr)) {
|
||||
processed = true;
|
||||
break;
|
||||
}
|
||||
fn = fn->next;
|
||||
entry = entry->next;
|
||||
}
|
||||
if (!processed) {
|
||||
// No sequence found!
|
||||
|
||||
@@ -33,28 +33,18 @@ public:
|
||||
int Process(hir::HIRBuilder* hir_builder, lir::LIRBuilder* lir_builder);
|
||||
|
||||
public:
|
||||
class FnWrapper {
|
||||
public:
|
||||
FnWrapper() : next(0) {}
|
||||
virtual bool operator()(lir::LIRBuilder* builder, hir::Instr*& instr) const = 0;
|
||||
FnWrapper* next;
|
||||
};
|
||||
template<typename T>
|
||||
class TypedFnWrapper : public FnWrapper {
|
||||
public:
|
||||
TypedFnWrapper(T fn) : fn_(fn) {}
|
||||
virtual bool operator()(lir::LIRBuilder* builder, hir::Instr*& instr) const {
|
||||
return fn_(builder, instr);
|
||||
}
|
||||
private:
|
||||
T fn_;
|
||||
};
|
||||
|
||||
void AddSequence(hir::Opcode starting_opcode, FnWrapper* fn);
|
||||
typedef bool(*sequence_fn_t)(lir::LIRBuilder& lb, hir::Instr*& instr);
|
||||
void AddSequence(hir::Opcode starting_opcode, sequence_fn_t fn);
|
||||
|
||||
private:
|
||||
class sequence_fn_entry_t {
|
||||
public:
|
||||
sequence_fn_t fn;
|
||||
sequence_fn_entry_t* next;
|
||||
};
|
||||
|
||||
X64Backend* backend_;
|
||||
FnWrapper* lookup_[hir::__OPCODE_MAX_VALUE];
|
||||
sequence_fn_entry_t* lookup_[hir::__OPCODE_MAX_VALUE];
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
# Copyright 2013 Ben Vanik. All Rights Reserved.
|
||||
{
|
||||
'sources': [
|
||||
'lowering_hir_opcodes.inl',
|
||||
'lowering_lir_opcodes.inl',
|
||||
'lowering_sequences.cc',
|
||||
'lowering_sequences.h',
|
||||
'lowering_table.cc',
|
||||
|
||||
Reference in New Issue
Block a user