Generating a lot of code!
Still a few missing instructions/variants and other issues, but a big and valid LLVM module is being generated.
This commit is contained in:
@@ -23,10 +23,14 @@
|
||||
#define XE_OPTION_LOG_INFO 1
|
||||
#define XE_OPTION_LOG_DEBUG 1
|
||||
#define XE_OPTION_LOG_CPU 1
|
||||
#define XE_OPTION_LOG_SDB 0
|
||||
#define XE_OPTION_LOG_SDB 1
|
||||
#define XE_OPTION_LOG_GPU 1
|
||||
#define XE_OPTION_LOG_KERNEL 1
|
||||
|
||||
|
||||
// TODO(benvanik): make this a runtime option
|
||||
#define XE_OPTION_OPTIMIZED 0
|
||||
|
||||
|
||||
#endif // XENIA_CONFIG_H_
|
||||
|
||||
|
||||
@@ -28,20 +28,28 @@ namespace codegen {
|
||||
|
||||
class FunctionGenerator {
|
||||
public:
|
||||
FunctionGenerator(xe_memory_ref memory, sdb::FunctionSymbol* fn,
|
||||
llvm::LLVMContext* context, llvm::Module* gen_module,
|
||||
llvm::Function* gen_fn);
|
||||
FunctionGenerator(
|
||||
xe_memory_ref memory, sdb::SymbolDatabase* sdb, sdb::FunctionSymbol* fn,
|
||||
llvm::LLVMContext* context, llvm::Module* gen_module,
|
||||
llvm::Function* gen_fn);
|
||||
~FunctionGenerator();
|
||||
|
||||
sdb::SymbolDatabase* sdb();
|
||||
sdb::FunctionSymbol* fn();
|
||||
llvm::LLVMContext* context();
|
||||
llvm::Module* gen_module();
|
||||
llvm::Function* gen_fn();
|
||||
sdb::FunctionBlock* fn_block();
|
||||
|
||||
void GenerateBasicBlocks();
|
||||
llvm::BasicBlock* GetBasicBlock(uint32_t address);
|
||||
llvm::BasicBlock* GetNextBasicBlock();
|
||||
|
||||
llvm::Function* GetFunction(uint32_t addr);
|
||||
llvm::Function* GetFunction(sdb::FunctionSymbol* fn);
|
||||
|
||||
llvm::Value* LoadStateValue(uint32_t offset, llvm::Type* type,
|
||||
const char* name = "");
|
||||
void StoreStateValue(uint32_t offset, llvm::Type* type, llvm::Value* value);
|
||||
|
||||
llvm::Value* cia_value();
|
||||
|
||||
@@ -54,24 +62,28 @@ public:
|
||||
llvm::Value* ctr_value();
|
||||
void update_ctr_value(llvm::Value* value);
|
||||
|
||||
llvm::Value* cr_value(uint32_t n);
|
||||
void update_cr_value(uint32_t n, llvm::Value* value);
|
||||
llvm::Value* cr_value();
|
||||
void update_cr_value(llvm::Value* value);
|
||||
|
||||
llvm::Value* gpr_value(uint32_t n);
|
||||
void update_gpr_value(uint32_t n, llvm::Value* value);
|
||||
|
||||
llvm::Value* GetMembase();
|
||||
llvm::Value* memory_addr(uint32_t addr);
|
||||
llvm::Value* read_memory(llvm::Value* addr, uint32_t size, bool extend);
|
||||
void write_memory(llvm::Value* addr, uint32_t size, llvm::Value* value);
|
||||
llvm::Value* ReadMemory(llvm::Value* addr, uint32_t size, bool extend);
|
||||
void WriteMemory(llvm::Value* addr, uint32_t size, llvm::Value* value);
|
||||
|
||||
private:
|
||||
void GenerateBasicBlock(sdb::FunctionBlock* block, llvm::BasicBlock* bb);
|
||||
|
||||
xe_memory_ref memory_;
|
||||
sdb::FunctionSymbol* fn_;
|
||||
llvm::LLVMContext* context_;
|
||||
llvm::Module* gen_module_;
|
||||
llvm::Function* gen_fn_;
|
||||
xe_memory_ref memory_;
|
||||
sdb::SymbolDatabase* sdb_;
|
||||
sdb::FunctionSymbol* fn_;
|
||||
llvm::LLVMContext* context_;
|
||||
llvm::Module* gen_module_;
|
||||
llvm::Function* gen_fn_;
|
||||
sdb::FunctionBlock* fn_block_;
|
||||
llvm::BasicBlock* bb_;
|
||||
llvm::IRBuilder<>* builder_;
|
||||
|
||||
std::map<uint32_t, llvm::BasicBlock*> bbs_;
|
||||
@@ -81,12 +93,17 @@ private:
|
||||
|
||||
struct {
|
||||
llvm::Value* xer;
|
||||
bool xer_dirty;
|
||||
llvm::Value* lr;
|
||||
bool lr_dirty;
|
||||
llvm::Value* ctr;
|
||||
bool ctr_dirty;
|
||||
|
||||
llvm::Value* cr[4];
|
||||
llvm::Value* cr;
|
||||
bool cr_dirty;
|
||||
|
||||
llvm::Value* gpr[32];
|
||||
uint32_t gpr_dirty_bits;
|
||||
} values_;
|
||||
};
|
||||
|
||||
|
||||
@@ -104,6 +104,14 @@ typedef struct {
|
||||
uint32_t OPCD : 6;
|
||||
} DS;
|
||||
// kXEPPCInstrFormatX
|
||||
struct {
|
||||
uint32_t Rc : 1;
|
||||
uint32_t : 10;
|
||||
uint32_t B : 5;
|
||||
uint32_t A : 5;
|
||||
uint32_t D : 5;
|
||||
uint32_t OPCD : 6;
|
||||
} X;
|
||||
// kXEPPCInstrFormatXL
|
||||
struct {
|
||||
uint32_t LK : 1;
|
||||
@@ -123,6 +131,15 @@ typedef struct {
|
||||
// kXEPPCInstrFormatXFL
|
||||
// kXEPPCInstrFormatXS
|
||||
// kXEPPCInstrFormatXO
|
||||
struct {
|
||||
uint32_t Rc : 1;
|
||||
uint32_t : 8;
|
||||
uint32_t OE : 1;
|
||||
uint32_t B : 5;
|
||||
uint32_t A : 5;
|
||||
uint32_t D : 5;
|
||||
uint32_t OPCD : 6;
|
||||
} XO;
|
||||
// kXEPPCInstrFormatA
|
||||
// kXEPPCInstrFormatM
|
||||
// kXEPPCInstrFormatMD
|
||||
|
||||
@@ -19,6 +19,12 @@
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
#ifdef XE_THUNK
|
||||
#define XECACHEALIGN __attribute__ ((aligned(8)))
|
||||
#define XECACHEALIGN64 __attribute__ ((aligned(64)))
|
||||
#endif
|
||||
|
||||
|
||||
// namespace FPRF {
|
||||
// enum FPRF_e {
|
||||
// QUIET_NAN = 0x00088000,
|
||||
@@ -34,7 +40,7 @@
|
||||
// } // FPRF
|
||||
|
||||
|
||||
typedef struct XECACHEALIGN {
|
||||
typedef struct XECACHEALIGN xe_float4 {
|
||||
union {
|
||||
struct {
|
||||
float x;
|
||||
@@ -51,17 +57,17 @@ typedef struct XECACHEALIGN {
|
||||
} xe_float4_t;
|
||||
|
||||
|
||||
typedef struct XECACHEALIGN64 {
|
||||
uint64_t r[32]; // General purpose registers
|
||||
xe_float4_t v[128]; // VMX128 vector registers
|
||||
double f[32]; // Floating-point registers
|
||||
|
||||
typedef struct XECACHEALIGN64 xe_ppc_state {
|
||||
uint32_t cia; // Current PC (CIA)
|
||||
uint32_t nia; // Next PC (NIA)
|
||||
uint64_t xer; // XER register
|
||||
uint64_t lr; // Link register
|
||||
uint64_t ctr; // Count register
|
||||
|
||||
uint64_t r[32]; // General purpose registers
|
||||
xe_float4_t v[128]; // VMX128 vector registers
|
||||
double f[32]; // Floating-point registers
|
||||
|
||||
union {
|
||||
uint32_t value;
|
||||
struct {
|
||||
@@ -76,6 +82,12 @@ typedef struct XECACHEALIGN64 {
|
||||
uint8_t vx :1; // FP invalid operation exception summary - copy of FPSCR[VX]
|
||||
uint8_t ox :1; // FP overflow exception - copy of FPSCR[OX]
|
||||
} cr1;
|
||||
uint8_t cr2 :4;
|
||||
uint8_t cr3 :4;
|
||||
uint8_t cr4 :4;
|
||||
uint8_t cr5 :4;
|
||||
uint8_t cr6 :4;
|
||||
uint8_t cr7 :4;
|
||||
} cr; // Condition register
|
||||
|
||||
union {
|
||||
|
||||
@@ -68,7 +68,8 @@ public:
|
||||
kTargetBlock = 1,
|
||||
kTargetFunction = 2,
|
||||
kTargetLR = 3,
|
||||
kTargetNone = 4,
|
||||
kTargetCTR = 4,
|
||||
kTargetNone = 5,
|
||||
};
|
||||
|
||||
FunctionBlock();
|
||||
@@ -106,7 +107,7 @@ public:
|
||||
|
||||
uint32_t start_address;
|
||||
uint32_t end_address;
|
||||
char *name;
|
||||
char* name;
|
||||
FunctionType type;
|
||||
uint32_t flags;
|
||||
|
||||
@@ -126,7 +127,7 @@ public:
|
||||
virtual ~VariableSymbol();
|
||||
|
||||
uint32_t address;
|
||||
char *name;
|
||||
char* name;
|
||||
};
|
||||
|
||||
class ExceptionEntrySymbol : public Symbol {
|
||||
|
||||
Reference in New Issue
Block a user