x64 tinyjit: linux support

This commit is contained in:
Stefanos Kornilios Mitsis Poiitidis 2015-07-14 03:35:34 +02:00
parent 3852cf9ac8
commit e50cfe3010
7 changed files with 149 additions and 10 deletions

View File

@ -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

View File

@ -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

View File

@ -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);

View File

@ -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

View File

@ -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);
}
}

View File

@ -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);
*/
}
}

123
shell/lin64/Makefile Normal file
View File

@ -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