x64 tinyjit: linux support
This commit is contained in:
parent
3852cf9ac8
commit
e50cfe3010
|
@ -68,6 +68,9 @@
|
|||
#elif TARGET_LINUX_x86
|
||||
#define HOST_OS OS_LINUX
|
||||
#define HOST_CPU CPU_X86
|
||||
#elif TARGET_LINUX_x64
|
||||
#define HOST_OS OS_LINUX
|
||||
#define HOST_CPU CPU_X64
|
||||
#elif TARGET_LINUX_MIPS
|
||||
#define HOST_OS OS_LINUX
|
||||
#define HOST_CPU CPU_MIPS
|
||||
|
|
|
@ -33,6 +33,10 @@ ifdef X86_REC
|
|||
RZDCY_MODULES += rec-x86/ emitter/
|
||||
endif
|
||||
|
||||
ifdef X64_REC
|
||||
RZDCY_MODULES += rec-x64/
|
||||
endif
|
||||
|
||||
ifndef NO_REND
|
||||
RZDCY_MODULES += rend/gles/
|
||||
else
|
||||
|
|
|
@ -404,9 +404,9 @@ void recSh4_Init()
|
|||
bm_Reset();
|
||||
|
||||
#if HOST_CPU == CPU_X64
|
||||
verify(rcb_noffs(p_sh4rcb->fpcb) == -33816576);
|
||||
#else
|
||||
verify(rcb_noffs(p_sh4rcb->fpcb) == -67371008);
|
||||
#else
|
||||
verify(rcb_noffs(p_sh4rcb->fpcb) == -33816576);
|
||||
#endif
|
||||
|
||||
verify(rcb_noffs(p_sh4rcb->sq_buffer) == -512);
|
||||
|
|
|
@ -83,6 +83,8 @@ void fault_handler (int sn, siginfo_t * si, void *segfault_ctx)
|
|||
|
||||
context_to_segfault(&ctx, segfault_ctx);
|
||||
}
|
||||
#elif HOST_CPU == CPU_X64
|
||||
//x64 has no rewrite support
|
||||
#else
|
||||
#error JIT: Not supported arch
|
||||
#endif
|
||||
|
|
|
@ -57,6 +57,8 @@ void context_segfault(rei_host_context_t* reictx, void* segfault_ctx, bool to_se
|
|||
#else
|
||||
#error HOST_OS
|
||||
#endif
|
||||
#elif HOST_CPU == CPU_X64
|
||||
bicopy(reictx->pc, MCTX(.gregs[REG_RIP]), to_segfault);
|
||||
#elif HOST_CPU == CPU_MIPS
|
||||
bicopy(reictx->pc, MCTX(.pc), to_segfault);
|
||||
#else
|
||||
|
@ -71,4 +73,4 @@ void context_from_segfault(rei_host_context_t* reictx, void* segfault_ctx) {
|
|||
|
||||
void context_to_segfault(rei_host_context_t* reictx, void* segfault_ctx) {
|
||||
context_segfault(reictx, segfault_ctx, true);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#include "xbyak\xbyak.h"
|
||||
#include "xbyak/xbyak.h"
|
||||
|
||||
#include "types.h"
|
||||
|
||||
|
@ -39,13 +39,13 @@ void(*ngen_FailedToFindBlock)() = &ngen_FailedToFindBlock_internal;
|
|||
|
||||
void ngen_mainloop(void* v_cntx)
|
||||
{
|
||||
auto ctx = (Sh4RCB*)((u8*)v_cntx - sizeof(Sh4RCB));
|
||||
Sh4RCB* ctx = (Sh4RCB*)((u8*)v_cntx - sizeof(Sh4RCB));
|
||||
|
||||
cycle_counter = SH4_TIMESLICE;
|
||||
|
||||
for (;;) {
|
||||
do {
|
||||
auto rcb = bm_GetCode(ctx->cntx.pc);
|
||||
DynarecCodeEntryPtr rcb = bm_GetCode(ctx->cntx.pc);
|
||||
rcb();
|
||||
} while (cycle_counter > 0);
|
||||
|
||||
|
@ -92,7 +92,8 @@ public:
|
|||
|
||||
sub(rsp, 8);
|
||||
|
||||
for (auto op : block->oplist) {
|
||||
for (size_t i = 0; i < block->oplist.size(); i++) {
|
||||
shil_opcode& op = block->oplist[i];
|
||||
switch (op.op) {
|
||||
|
||||
case shop_ifb:
|
||||
|
@ -102,7 +103,11 @@ public:
|
|||
mov(dword[rax], op.rs2._imm);
|
||||
}
|
||||
|
||||
mov(rcx, op.rs3._imm);
|
||||
#if HOST_OS == OS_LINUX
|
||||
mov(rdi, op.rs3._imm);
|
||||
#else
|
||||
mov(rcx, op.rs3._imm);
|
||||
#endif
|
||||
|
||||
call(OpDesc[op.rs3._imm]->oph);
|
||||
break;
|
||||
|
@ -164,7 +169,7 @@ void ngen_Compile(RuntimeBlockInfo* block, bool force_checks, bool reset, bool s
|
|||
{
|
||||
verify(emit_FreeSpace() >= 64 * 1024);
|
||||
|
||||
auto compiler = new BlockCompiler();
|
||||
BlockCompiler* compiler = new BlockCompiler();
|
||||
|
||||
|
||||
compiler->compile(block, force_checks, reset, staging, optimise);
|
||||
|
@ -272,4 +277,4 @@ void ngen_CC_Finish(shil_opcode* op)
|
|||
/*
|
||||
x86e->Emit(op_add32, ESP, ngen_CC_BytesPushed);
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,123 @@
|
|||
|
||||
LOCAL_PATH := $(call my-dir)
|
||||
FOR_LINUX :=1
|
||||
NOT_ARM := 1
|
||||
X64_REC := 1
|
||||
#NO_REC := 1
|
||||
#NO_REND := 1
|
||||
WEBUI :=1
|
||||
USE_ALSA := 1
|
||||
USE_OSS := 1
|
||||
#USE_PULSEAUDIO := 1
|
||||
|
||||
RZDCY_SRC_DIR = ../../core
|
||||
|
||||
include $(RZDCY_SRC_DIR)/core.mk
|
||||
|
||||
|
||||
CXX=${CC_PREFIX}g++
|
||||
CC=${CC_PREFIX}gcc
|
||||
AS=${CC_PREFIX}as
|
||||
STRIP=${CC_PREFIX}strip
|
||||
|
||||
LD=${CC}
|
||||
|
||||
MFLAGS := #-m32
|
||||
#-marm -march=armv7-a -mtune=cortex-a9 -mfpu=neon -mfloat-abi=softfp -funroll-loops
|
||||
ASFLAGS :=
|
||||
#-march=armv7-a -mfpu=neon -mfloat-abi=softfp
|
||||
|
||||
LDFLAGS := -g -Wl,-Map,$(notdir $@).map,--gc-sections -Wl,-O3 -Wl,--sort-common
|
||||
|
||||
CFLAGS := -g -O3 -D RELEASE -c -D TARGET_LINUX_x64 -D USES_HOMEDIR -D HOST_NO_AREC #-D NO_REND
|
||||
CFLAGS += -D SUPPORT_X11
|
||||
CFLAGS += -frename-registers -fno-strict-aliasing -fsingle-precision-constant
|
||||
CFLAGS += -ffast-math -ftree-vectorize
|
||||
CFLAGS += -fno-operator-names
|
||||
|
||||
|
||||
#-fprefetch-loop-arrays
|
||||
#-std=c++0x
|
||||
CXXFLAGS += $(CFLAGS) $(MFLAGS) -fexceptions -fno-rtti -fpermissive
|
||||
CXXFLAGS += -D SUPPORT_X11
|
||||
|
||||
# use this to do GLES on x11 (also, update the libs)
|
||||
# CXXFLAGS += -DGLES
|
||||
|
||||
|
||||
ifdef PGO_MAKE
|
||||
CFLAGS += -fprofile-generate -pg
|
||||
LDFLAGS += -fprofile-generate
|
||||
else
|
||||
CFLAGS += -fomit-frame-pointer
|
||||
endif
|
||||
|
||||
ifdef PGO_USE
|
||||
CFLAGS += -fprofile-use
|
||||
endif
|
||||
|
||||
|
||||
ifdef LTO_TEST
|
||||
CFLAGS += -flto -fwhole-program
|
||||
LDFLAGS +=-flto -fwhole-program
|
||||
endif
|
||||
|
||||
INCS := -I$(RZDCY_SRC_DIR) -I$(RZDCY_SRC_DIR)/deps -I$(RZDCY_SRC_DIR)/khronos -I../linux-deps/include
|
||||
|
||||
LIBS := -L../linux-deps/lib/x86 -L./enta_viv
|
||||
#LIBS += -lglapi
|
||||
LIBS += -lm -lrt -ldl
|
||||
LIBS += -ldl -lGL #for desktop gl
|
||||
#use this for GLES
|
||||
#LIBS += -lEGL -lGLESv2 #-lglslcompiler -lIMGegl -lpvr2d -lsrv_um
|
||||
LIBS += -lpthread -lX11
|
||||
|
||||
ifdef USE_ALSA
|
||||
CXXFLAGS += -D USE_ALSA
|
||||
LIBS += -lasound
|
||||
endif
|
||||
|
||||
ifdef USE_OSS
|
||||
CXXFLAGS += -D USE_OSS
|
||||
endif
|
||||
|
||||
ifdef USE_PULSEAUDIO
|
||||
CXXFLAGS += -D USE_PULSEAUDIO
|
||||
LIBS += -lpulse-simple
|
||||
endif
|
||||
|
||||
|
||||
OBJECTS=$(RZDCY_FILES:.cpp=.build_obj)
|
||||
OBJECTS:=$(OBJECTS:.c=.build_obj)
|
||||
OBJECTS:=$(OBJECTS:.S=.build_obj)
|
||||
OBJECTS:=$(patsubst $(RZDCY_SRC_DIR)/%,obj/%,$(OBJECTS))
|
||||
|
||||
|
||||
EXECUTABLE_STRIPPED=nosym-reicast.elf
|
||||
EXECUTABLE=reicast.elf
|
||||
|
||||
PACKAGE_FILES=$(EXECUTABLE_STRIPPED) default.gcw0.desktop icon-32.png
|
||||
|
||||
all: $(CPPFILES) $(EXECUTABLE) $(EXECUTABLE_STRIPPED)
|
||||
|
||||
$(EXECUTABLE): $(OBJECTS)
|
||||
$(CXX) $(MFLAGS) $(EXTRAFLAGS) $(LDFLAGS) $(OBJECTS) $(LIBS) -o $@
|
||||
|
||||
$(EXECUTABLE_STRIPPED): $(EXECUTABLE)
|
||||
cp $< $@ && $(STRIP) $@
|
||||
|
||||
obj/%.build_obj : $(RZDCY_SRC_DIR)/%.cpp
|
||||
mkdir -p $(dir $@)
|
||||
$(CXX) $(EXTRAFLAGS) $(INCS) $(CFLAGS) $(CXXFLAGS) $< -o $@
|
||||
|
||||
obj/%.build_obj : $(RZDCY_SRC_DIR)/%.c
|
||||
mkdir -p $(dir $@)
|
||||
$(CC) $(EXTRAFLAGS) $(INCS) $(CFLAGS) $< -o $@
|
||||
|
||||
obj/%.build_obj : $(RZDCY_SRC_DIR)/%.S
|
||||
mkdir -p $(dir $@)
|
||||
$(AS) $(ASFLAGS) $(INCS) $< -o $@
|
||||
|
||||
|
||||
clean:
|
||||
rm $(OBJECTS) $(EXECUTABLE) -f
|
Loading…
Reference in New Issue