diff --git a/desmume/src/arm_jit.cpp b/desmume/src/arm_jit.cpp index e76684b2f..a2bb41756 100644 --- a/desmume/src/arm_jit.cpp +++ b/desmume/src/arm_jit.cpp @@ -1,6 +1,6 @@ /* Copyright (C) 2006 yopyop Copyright (C) 2011 Loren Merritt - Copyright (C) 2012 DeSmuME team + Copyright (C) 2012-2013 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -3868,11 +3868,16 @@ static u32 instr_attributes(u32 opcode) static bool instr_is_branch(u32 opcode) { u32 x = instr_attributes(opcode); + if(bb_thumb) + { + // merge OP_BL_10+OP_BL_11 + if (x & MERGE_NEXT) return false; return (x & BRANCH_ALWAYS) || ((x & BRANCH_POS0) && ((opcode&7) | ((opcode>>4)&8)) == 15) || (x & BRANCH_SWI) || (x & JIT_BYPASS); + } else return (x & BRANCH_ALWAYS) || ((x & BRANCH_POS12) && REG_POS(opcode,12) == 15) @@ -4111,7 +4116,7 @@ static u32 compile_basicblock() u32 cycles = instr_cycles(opcode); - bEndBlock = (i >= (CommonSettings.jit_max_block_size - 1)) || instr_is_branch(opcode); + bEndBlock = instr_is_branch(opcode) || (i >= (CommonSettings.jit_max_block_size - 1)); #if LOG_JIT if (instr_is_conditional(opcode) && (cycles > 1) || (cycles == 0)) @@ -4236,7 +4241,7 @@ template u32 arm_jit_compile() template u32 arm_jit_compile<0>(); template u32 arm_jit_compile<1>(); -void arm_jit_reset(bool enable) +void arm_jit_reset(bool enable, bool suppress_msg) { #if LOG_JIT c.setLogger(&logger); @@ -4247,7 +4252,8 @@ void arm_jit_reset(bool enable) #ifdef HAVE_STATIC_CODE_BUFFER scratchptr = scratchpad; #endif - printf("CPU mode: %s\n", enable?"JIT":"Interpreter"); + if (!suppress_msg) + printf("CPU mode: %s\n", enable?"JIT":"Interpreter"); saveBlockSizeJIT = CommonSettings.jit_max_block_size; if (enable) diff --git a/desmume/src/arm_jit.h b/desmume/src/arm_jit.h index 9c02f97c2..1862e2444 100644 --- a/desmume/src/arm_jit.h +++ b/desmume/src/arm_jit.h @@ -1,6 +1,6 @@ /* Copyright (C) 2006 yopyop Copyright (C) 2011 Loren Merritt - Copyright (C) 2012 DeSmuME team + Copyright (C) 2012-2013 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,7 +26,7 @@ typedef u32 (FASTCALL* ArmOpCompiled)(); -void arm_jit_reset(bool enable); +void arm_jit_reset(bool enable, bool suppress_msg = false); void arm_jit_close(); void arm_jit_sync(); template u32 arm_jit_compile(); diff --git a/desmume/src/instruction_attributes.h b/desmume/src/instruction_attributes.h index 06905abd4..f9f12b62f 100644 --- a/desmume/src/instruction_attributes.h +++ b/desmume/src/instruction_attributes.h @@ -1,6 +1,6 @@ /* Copyright (C) 2006 yopyop Copyright (C) 2011 Loren Merritt - Copyright (C) 2012 DeSmuME team + Copyright (C) 2012-2013 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -41,6 +41,8 @@ #define BRANCH_LDM 0x00004000 #define BRANCH_SWI 0x00008000 // branch if use external SWI - if (cpu->swi_tab == NULL) +#define MERGE_NEXT 0x04000000 + #define JIT_BYPASS 0x80000000 // JIT makes no assumptions about what this instruction does static const u32 instruction_attributes[4096] = { @@ -5103,38 +5105,38 @@ INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX -INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 -INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 -INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 -INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 -INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 -INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 -INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 -INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 -INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 -INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 -INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 -INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 -INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 -INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 -INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 -INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 -INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 -INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 -INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 -INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 -INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 -INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 -INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 -INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 -INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 -INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 -INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 -INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 -INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 -INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 -INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 -INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 +INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 +INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 +INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 +INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 +INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 +INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 +INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 +INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 +INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 +INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 +INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 +INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 +INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 +INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 +INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 +INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 +INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 +INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 +INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 +INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 +INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 +INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 +INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 +INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 +INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 +INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 +INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 +INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 +INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 +INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 +INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 +INSTR_CYCLES(1) | BRANCH_NEVER | MERGE_NEXT, //OP_BL_10 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 diff --git a/desmume/src/windows/defaultconfig/SubWCRev.exe b/desmume/src/windows/defaultconfig/SubWCRev.exe index b5a562c53..72f7f5424 100644 Binary files a/desmume/src/windows/defaultconfig/SubWCRev.exe and b/desmume/src/windows/defaultconfig/SubWCRev.exe differ diff --git a/desmume/src/windows/defaultconfig/intl3_tsvn32.dll b/desmume/src/windows/defaultconfig/intl3_tsvn32.dll index 125bf9abf..5164bcf99 100644 Binary files a/desmume/src/windows/defaultconfig/intl3_tsvn32.dll and b/desmume/src/windows/defaultconfig/intl3_tsvn32.dll differ diff --git a/desmume/src/windows/defaultconfig/libapr_tsvn32.dll b/desmume/src/windows/defaultconfig/libapr_tsvn32.dll index d381c054c..1f78e646d 100644 Binary files a/desmume/src/windows/defaultconfig/libapr_tsvn32.dll and b/desmume/src/windows/defaultconfig/libapr_tsvn32.dll differ diff --git a/desmume/src/windows/defaultconfig/libaprutil_tsvn32.dll b/desmume/src/windows/defaultconfig/libaprutil_tsvn32.dll index f9150caab..0fdb7d803 100644 Binary files a/desmume/src/windows/defaultconfig/libaprutil_tsvn32.dll and b/desmume/src/windows/defaultconfig/libaprutil_tsvn32.dll differ diff --git a/desmume/src/windows/defaultconfig/libsasl32.dll b/desmume/src/windows/defaultconfig/libsasl32.dll index 18f46f524..ffb025114 100644 Binary files a/desmume/src/windows/defaultconfig/libsasl32.dll and b/desmume/src/windows/defaultconfig/libsasl32.dll differ diff --git a/desmume/src/windows/defaultconfig/libsvn_tsvn32.dll b/desmume/src/windows/defaultconfig/libsvn_tsvn32.dll index dad710f71..018c3811c 100644 Binary files a/desmume/src/windows/defaultconfig/libsvn_tsvn32.dll and b/desmume/src/windows/defaultconfig/libsvn_tsvn32.dll differ diff --git a/desmume/src/windows/hotkey.cpp b/desmume/src/windows/hotkey.cpp index b1cd091ba..6e86b0c35 100644 --- a/desmume/src/windows/hotkey.cpp +++ b/desmume/src/windows/hotkey.cpp @@ -3,7 +3,7 @@ licensed under the terms supplied at the end of this file (for the terms are very long!) Differences from that baseline version are: - Copyright (C) 2009-2011 DeSmuME team + Copyright (C) 2009-2013 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -97,9 +97,6 @@ void HK_ReloadROM(int, bool justPressed) #ifdef HAVE_JIT void HK_CpuMode(int, bool justPressed) { - extern void arm_jit_sync(); - void arm_jit_reset(bool enable); - arm_jit_sync(); CommonSettings.use_jit = !CommonSettings.use_jit; arm_jit_reset(CommonSettings.use_jit); @@ -119,7 +116,7 @@ void HK_JitBlockSizeDec(int, bool justPressed) char tmp[256]; sprintf(tmp,"JIT block size changed to: %d", CommonSettings.jit_max_block_size); osd->addLine(tmp); - arm_jit_reset(CommonSettings.use_jit); + arm_jit_reset(CommonSettings.use_jit, true); } void HK_JitBlockSizeInc(int, bool justPressed) @@ -131,7 +128,7 @@ void HK_JitBlockSizeInc(int, bool justPressed) char tmp[256]; sprintf(tmp,"JIT block size changed to: %d", CommonSettings.jit_max_block_size); osd->addLine(tmp); - arm_jit_reset(CommonSettings.use_jit); + arm_jit_reset(CommonSettings.use_jit, true); } #endif