Wiring up register read/write from JIT -> GPU.
This commit is contained in:
@@ -89,6 +89,13 @@ X64Emitter::~X64Emitter() {
|
||||
lock_ = NULL;
|
||||
}
|
||||
|
||||
void X64Emitter::SetupGpuPointers(void* gpu_this,
|
||||
void* gpu_read, void* gpu_write) {
|
||||
gpu_this_ = gpu_this;
|
||||
gpu_read_ = gpu_read;
|
||||
gpu_write_ = gpu_write;
|
||||
}
|
||||
|
||||
void X64Emitter::Lock() {
|
||||
xe_mutex_lock(lock_);
|
||||
}
|
||||
@@ -1004,6 +1011,41 @@ int X64Emitter::GenerateIndirectionBranch(uint32_t cia, GpVar& target,
|
||||
return 0;
|
||||
}
|
||||
|
||||
GpVar X64Emitter::read_gpu_register(uint32_t r) {
|
||||
X86Compiler& c = compiler_;
|
||||
|
||||
GpVar this_imm(c.newGpVar());
|
||||
c.mov(this_imm, imm((uint64_t)gpu_this_));
|
||||
GpVar reg_imm(c.newGpVar());
|
||||
c.mov(reg_imm, imm(r & 0xFFFF));
|
||||
|
||||
X86CompilerFuncCall* call = c.call(gpu_read_);
|
||||
call->setPrototype(kX86FuncConvDefault,
|
||||
FuncBuilder2<uint64_t, void*, uint32_t>());
|
||||
call->setArgument(0, this_imm);
|
||||
call->setArgument(1, reg_imm);
|
||||
GpVar res(c.newGpVar());
|
||||
call->setReturn(res);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
void X64Emitter::write_gpu_register(uint32_t r, GpVar& v) {
|
||||
X86Compiler& c = compiler_;
|
||||
|
||||
GpVar this_imm(c.newGpVar());
|
||||
c.mov(this_imm, imm((uint64_t)gpu_this_));
|
||||
GpVar reg_imm(c.newGpVar());
|
||||
c.mov(reg_imm, imm(r & 0xFFFF));
|
||||
|
||||
X86CompilerFuncCall* call = c.call(gpu_write_);
|
||||
call->setPrototype(kX86FuncConvDefault,
|
||||
FuncBuilder3<void, void*, uint32_t, uint64_t>());
|
||||
call->setArgument(0, this_imm);
|
||||
call->setArgument(1, reg_imm);
|
||||
call->setArgument(2, v);
|
||||
}
|
||||
|
||||
void X64Emitter::SetupLocals() {
|
||||
X86Compiler& c = compiler_;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user