diff options
Diffstat (limited to 'src/core/arm/dyncom')
| -rw-r--r-- | src/core/arm/dyncom/arm_dyncom.cpp | 4 | ||||
| -rw-r--r-- | src/core/arm/dyncom/arm_dyncom_interpreter.cpp | 31 | 
2 files changed, 12 insertions, 23 deletions
| diff --git a/src/core/arm/dyncom/arm_dyncom.cpp b/src/core/arm/dyncom/arm_dyncom.cpp index bc1e969e4..128413262 100644 --- a/src/core/arm/dyncom/arm_dyncom.cpp +++ b/src/core/arm/dyncom/arm_dyncom.cpp @@ -2,6 +2,8 @@  // Licensed under GPLv2 or any later version  // Refer to the license.txt file included. +#include "common/make_unique.h" +  #include "core/arm/skyeye_common/armemu.h"  #include "core/arm/skyeye_common/vfp/vfp.h" @@ -17,7 +19,7 @@ const static cpu_config_t s_arm11_cpu_info = {  };  ARM_DynCom::ARM_DynCom(PrivilegeMode initial_mode) { -    state = std::unique_ptr<ARMul_State>(new ARMul_State); +    state = Common::make_unique<ARMul_State>();      ARMul_NewState(state.get());      ARMul_SelectProcessor(state.get(), ARM_v6_Prop | ARM_v5_Prop | ARM_v5e_Prop); diff --git a/src/core/arm/dyncom/arm_dyncom_interpreter.cpp b/src/core/arm/dyncom/arm_dyncom_interpreter.cpp index fde11e4ff..991da740b 100644 --- a/src/core/arm/dyncom/arm_dyncom_interpreter.cpp +++ b/src/core/arm/dyncom/arm_dyncom_interpreter.cpp @@ -6,7 +6,6 @@  #include <algorithm>  #include <cstdio> -#include <unordered_map>  #include "common/logging/log.h"  #include "common/profiler.h" @@ -3533,25 +3532,6 @@ const transop_fp_t arm_instruction_trans[] = {      INTERPRETER_TRANSLATE(blx_1_thumb)  }; -typedef std::unordered_map<u32, int> bb_map; -static bb_map CreamCache; - -static void insert_bb(unsigned int addr, int start) { -    CreamCache[addr] = start; -} - -static int find_bb(unsigned int addr, int& start) { -    int ret = -1; -    bb_map::const_iterator it = CreamCache.find(addr); -    if (it != CreamCache.end()) { -        start = static_cast<int>(it->second); -        ret = 0; -    } else { -        ret = -1; -    } -    return ret; -} -  enum {      FETCH_SUCCESS,      FETCH_FAILURE @@ -3674,7 +3654,9 @@ translated:          }          ret = inst_base->br;      }; -    insert_bb(pc_start, bb_start); + +    cpu->instruction_cache[pc_start] = bb_start; +      return KEEP_GOING;  } @@ -4001,9 +3983,14 @@ unsigned InterpreterMainLoop(ARMul_State* state) {          phys_addr = cpu->Reg[15]; -        if (find_bb(cpu->Reg[15], ptr) == -1) +        // Find the cached instruction cream, otherwise translate it... +        auto itr = cpu->instruction_cache.find(cpu->Reg[15]); +        if (itr != cpu->instruction_cache.end()) { +            ptr = itr->second; +        } else {              if (InterpreterTranslate(cpu, ptr, cpu->Reg[15]) == FETCH_EXCEPTION)                  goto END; +        }          inst_base = (arm_inst *)&inst_buf[ptr];          GOTO_NEXT_INST; | 
