diff --git a/core/build.h b/core/build.h index d495297d6..d0372d330 100755 --- a/core/build.h +++ b/core/build.h @@ -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 diff --git a/core/core.mk b/core/core.mk index 79b760bcc..64be67ac3 100755 --- a/core/core.mk +++ b/core/core.mk @@ -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 diff --git a/core/hw/sh4/dyna/driver.cpp b/core/hw/sh4/dyna/driver.cpp index 864ce626c..5ea66fc63 100644 --- a/core/hw/sh4/dyna/driver.cpp +++ b/core/hw/sh4/dyna/driver.cpp @@ -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); diff --git a/core/linux/common.cpp b/core/linux/common.cpp index f6ea6c905..9017eb31f 100644 --- a/core/linux/common.cpp +++ b/core/linux/common.cpp @@ -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 diff --git a/core/linux/context.cpp b/core/linux/context.cpp index ae7939911..2afb09d09 100644 --- a/core/linux/context.cpp +++ b/core/linux/context.cpp @@ -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); -} \ No newline at end of file +} diff --git a/core/rec-x64/rec_x64.cpp b/core/rec-x64/rec_x64.cpp index e2f4aba1c..49476554f 100644 --- a/core/rec-x64/rec_x64.cpp +++ b/core/rec-x64/rec_x64.cpp @@ -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); */ -} \ No newline at end of file +} diff --git a/shell/lin64/Makefile b/shell/lin64/Makefile new file mode 100644 index 000000000..d6cf4d183 --- /dev/null +++ b/shell/lin64/Makefile @@ -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