From 51d78afa091d296e5545e69ed11201ee436053a1 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Wed, 10 Dec 2014 17:06:09 +0100 Subject: [PATCH] Add HAVE_DYNAREC ifdef --- Makefile | 5 +++++ Makefile.common | 4 ++++ cpu.c | 5 +++++ cpu_threaded.c | 4 +++- gba_memory.c | 42 ++++++++++++++++++++++++------------------ jni/Android.mk | 2 ++ libretro.c | 16 +++++++++++++--- main.c | 2 ++ main.h | 1 + 9 files changed, 59 insertions(+), 22 deletions(-) diff --git a/Makefile b/Makefile index bdf1797..6e6d742 100644 --- a/Makefile +++ b/Makefile @@ -48,6 +48,7 @@ ifeq ($(platform), unix) fpic := -fPIC FORCE_32BIT := -m32 CPU_ARCH := x86_32 + HAVE_DYNAREC := 1 SHARED := -shared $(FORCE_32BIT) -Wl,--version-script=link.T ifneq ($(findstring Haiku,$(shell uname -a)),) LIBM := @@ -215,6 +216,10 @@ OBJECTS := $(SOURCES_C:.c=.o) $(SOURCES_ASM:.S=.o) DEFINES = -DHAVE_STRINGS_H -DHAVE_STDINT_H -DHAVE_INTTYPES_H -D__LIBRETRO__ -DINLINE=inline -DPC_BUILD -Wall -Werror=implicit-function-declaration +ifeq ($(HAVE_DYNAREC), 1) +DEFINES += -DHAVE_DYNAREC +endif + ifeq ($(CPU_ARCH), arm) DEFINES += -DARM_ARCH endif diff --git a/Makefile.common b/Makefile.common index aef6d23..b1790da 100644 --- a/Makefile.common +++ b/Makefile.common @@ -18,6 +18,8 @@ SOURCES_C := $(CORE_DIR)/main.c \ endif +ifeq ($(HAVE_DYNAREC), 1) + ifeq ($(CPU_ARCH), x86_32) SOURCES_ASM += $(CORE_DIR)/x86/x86_stub.S endif @@ -27,4 +29,6 @@ SOURCES_ASM += $(CORE_DIR)/arm/arm_stub.S \ $(CORE_DIR)/arm/video_blend.S endif +endif + INCFLAGS := -I$(CORE_DIR) diff --git a/cpu.c b/cpu.c index f1cbfaa..4c2f455 100644 --- a/cpu.c +++ b/cpu.c @@ -4054,6 +4054,11 @@ void raise_interrupt(irq_type irq_raised) } } +#ifndef HAVE_DYNAREC +u8 *memory_map_read [8 * 1024]; +u8 *memory_map_write[8 * 1024]; +#endif + void execute_arm(u32 cycles) { u32 pc = reg[REG_PC]; diff --git a/cpu_threaded.c b/cpu_threaded.c index 4436a69..99887ec 100644 --- a/cpu_threaded.c +++ b/cpu_threaded.c @@ -48,11 +48,13 @@ u32 ewram_code_max = 0xFFFFFFFF; u32 *rom_branch_hash[ROM_BRANCH_HASH_SIZE]; // Default +#ifdef HAVE_DYNAREC u32 idle_loop_target_pc = 0xFFFFFFFF; +u32 iwram_stack_optimize = 1; +#endif u32 force_pc_update_target = 0xFFFFFFFF; u32 translation_gate_target_pc[MAX_TRANSLATION_GATES]; u32 translation_gate_targets = 0; -u32 iwram_stack_optimize = 1; u32 allow_smc_ram_u8 = 1; u32 allow_smc_ram_u16 = 1; u32 allow_smc_ram_u32 = 1; diff --git a/gba_memory.c b/gba_memory.c index 106a342..98a025c 100644 --- a/gba_memory.c +++ b/gba_memory.c @@ -2280,23 +2280,26 @@ s32 load_game_config(char *gamepak_title, char *gamepak_code, char *gamepak_make return 0; } - if(!strcmp(current_variable, "idle_loop_eliminate_target")) - idle_loop_target_pc = strtol(current_value, NULL, 16); - - if(!strcmp(current_variable, "translation_gate_target")) + if (dynarec_enable) { - if(translation_gate_targets < MAX_TRANSLATION_GATES) - { - translation_gate_target_pc[translation_gate_targets] = - strtol(current_value, NULL, 16); - translation_gate_targets++; - } - } + if(!strcmp(current_variable, "idle_loop_eliminate_target")) + idle_loop_target_pc = strtol(current_value, NULL, 16); - if(!strcmp(current_variable, "iwram_stack_optimize") && - !strcmp(current_value, "no\0")) /* \0 for broken toolchain workaround */ - { - iwram_stack_optimize = 0; + if(!strcmp(current_variable, "translation_gate_target")) + { + if(translation_gate_targets < MAX_TRANSLATION_GATES) + { + translation_gate_target_pc[translation_gate_targets] = + strtol(current_value, NULL, 16); + translation_gate_targets++; + } + } + + if(!strcmp(current_variable, "iwram_stack_optimize") && + !strcmp(current_value, "no\0")) /* \0 for broken toolchain workaround */ + { + iwram_stack_optimize = 0; + } } if(!strcmp(current_variable, "flash_rom_type") && @@ -3381,9 +3384,12 @@ void gba_load_state(const void* src) state_mem_read_ptr = src; savestate_block(read); - flush_translation_cache_ram(); - flush_translation_cache_rom(); - flush_translation_cache_bios(); + if (dynarec_enable) + { + flush_translation_cache_ram(); + flush_translation_cache_rom(); + flush_translation_cache_bios(); + } oam_update = 1; gbc_sound_update = 1; diff --git a/jni/Android.mk b/jni/Android.mk index b3b81aa..2b2e0d1 100644 --- a/jni/Android.mk +++ b/jni/Android.mk @@ -9,11 +9,13 @@ ifeq ($(TARGET_ARCH),arm) LOCAL_CFLAGS += -DANDROID_ARM -DARM_ARCH LOCAL_ARM_MODE := arm CPU_ARCH := arm +HAVE_DYNAREC := 1 endif ifeq ($(TARGET_ARCH),x86) LOCAL_CFLAGS += -DANDROID_X86 CPU_ARCH := x86_32 +HAVE_DYNAREC := 1 endif #ifeq ($(TARGET_ARCH),mips) diff --git a/libretro.c b/libretro.c index d834ede..c753f01 100644 --- a/libretro.c +++ b/libretro.c @@ -20,6 +20,7 @@ struct retro_perf_callback perf_cb; static cothread_t main_thread; static cothread_t cpu_thread; +int dynarec_enable; void switch_to_main_thread(void) { @@ -33,7 +34,10 @@ static inline void switch_to_cpu_thread(void) static void cpu_thread_entry(void) { - execute_arm_translate(execute_cycles); +#ifdef HAVE_DYNAREC + if (dynarec_enable) + execute_arm_translate(execute_cycles); +#endif execute_arm(execute_cycles); } @@ -97,7 +101,10 @@ void retro_init() init_gamepak_buffer(); init_sound(1); -#ifdef HAVE_MMAP +#if defined(HAVE_DYNAREC) + dynarec_enable = 1; +#if defined(HAVE_MMAP) + rom_translation_cache = mmap(NULL, ROM_TRANSLATION_CACHE_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANON | MAP_PRIVATE, -1, 0); ram_translation_cache = mmap(NULL, RAM_TRANSLATION_CACHE_SIZE, @@ -109,6 +116,9 @@ void retro_init() ram_translation_ptr = ram_translation_cache; bios_translation_ptr = bios_translation_cache; #endif +#else + dynarec_enable = 0; +#endif } void retro_deinit() @@ -116,7 +126,7 @@ void retro_deinit() perf_cb.perf_log(); memory_term(); -#ifdef HAVE_MMAP +#if defined(HAVE_MMAP) && defined(HAVE_DYNAREC) munmap(rom_translation_cache, ROM_TRANSLATION_CACHE_SIZE); munmap(ram_translation_cache, RAM_TRANSLATION_CACHE_SIZE); munmap(bios_translation_cache, BIOS_TRANSLATION_CACHE_SIZE); diff --git a/main.c b/main.c index 3a9dcdb..ce416ce 100644 --- a/main.c +++ b/main.c @@ -117,9 +117,11 @@ void init_main(void) execute_cycles = 960; video_count = 960; +#ifdef HAVE_DYNAREC flush_translation_cache_rom(); flush_translation_cache_ram(); flush_translation_cache_bios(); +#endif } u32 no_alpha = 0; diff --git a/main.h b/main.h index bf7e1fa..b775402 100644 --- a/main.h +++ b/main.h @@ -97,6 +97,7 @@ extern u32 real_frame_count; extern u32 virtual_frame_count; extern u32 max_frameskip; extern u32 num_skipped_frames; +extern int dynarec_enable; void change_ext(const char *src, char *buffer, const char *extension);