فهرست منبع

dyncom: Use unordered_map rather than the terrible 2-level bb_map

Seems (probably just placebo/wishful thinking) to make it slightly
faster. Also reduces memory usage and makes shutdown when debugging from
MSVC fast.
Yuri Kunde Schlesner 11 سال پیش
والد
کامیت
4a68e91a62
1فایلهای تغییر یافته به همراه15 افزوده شده و 33 حذف شده
  1. 15 33
      src/core/arm/dyncom/arm_dyncom_interpreter.cpp

+ 15 - 33
src/core/arm/dyncom/arm_dyncom_interpreter.cpp

@@ -26,7 +26,7 @@
 #define CITRA_IGNORE_EXIT(x)
 
 #include <algorithm>
-#include <map>
+#include <unordered_map>
 #include <stdio.h>
 #include <assert.h>
 #include <cstdio>
@@ -3309,9 +3309,8 @@ const transop_fp_t arm_instruction_trans[] = {
 	INTERPRETER_TRANSLATE(blx_1_thumb)
 };
 
-typedef map<unsigned int, int> bb_map;
-bb_map CreamCache[65536];
-bb_map ProfileCache[65536];
+typedef std::unordered_map<u32, int> bb_map;
+bb_map CreamCache;
 
 //#define USE_DUMMY_CACHE
 
@@ -3319,14 +3318,12 @@ bb_map ProfileCache[65536];
 unsigned int DummyCache[0x100000];
 #endif
 
-#define HASH(x) ((x + (x << 3) + (x >> 6)) % 65536)
 void insert_bb(unsigned int addr, int start)
 {
 #ifdef USE_DUMMY_CACHE
 	DummyCache[addr] = start;
 #else
-//	CreamCache[addr] = start;
-	CreamCache[HASH(addr)][addr] = start;
+	CreamCache[addr] = start;
 #endif
 }
 
@@ -3341,8 +3338,8 @@ int find_bb(unsigned int addr, int &start)
 	} else
 		ret = -1;
 #else
-	bb_map::const_iterator it = CreamCache[HASH(addr)].find(addr);
-	if (it != CreamCache[HASH(addr)].end()) {
+	bb_map::const_iterator it = CreamCache.find(addr);
+	if (it != CreamCache.end()) {
 		start = static_cast<int>(it->second);
 		ret = 0;
 #if HYBRID_MODE
@@ -3473,30 +3470,15 @@ void flush_bb(uint32_t addr)
 	uint32_t start;
 
 	addr  &= 0xfffff000;
-	for (int i = 0; i < 65536; i ++) {
-		for (it = CreamCache[i].begin(); it != CreamCache[i].end(); ) {
-			start = static_cast<uint32_t>(it->first);
-			//start = (start >> 12) << 12;
-			start &= 0xfffff000;
-			if (start == addr) {
-				//DEBUG_LOG(ARM11, "[ERASE][0x%08x]\n", static_cast<int>(it->first));
-				CreamCache[i].erase(it ++);
-			} else
-				++it;
-		}
-	}
-
-	for (int i = 0; i < 65536; i ++) {
-		for (it = ProfileCache[i].begin(); it != ProfileCache[i].end(); ) {
-			start = static_cast<uint32_t>(it->first);
-			//start = (start >> 12) << 12;
-			start &= 0xfffff000;
-			if (start == addr) {
-				//DEBUG_LOG(ARM11, "[ERASE][0x%08x]\n", static_cast<int>(it->first));
-				ProfileCache[i].erase(it ++);
-			} else
-				++it;
-		}
+	for (it = CreamCache.begin(); it != CreamCache.end(); ) {
+		start = static_cast<uint32_t>(it->first);
+		//start = (start >> 12) << 12;
+		start &= 0xfffff000;
+		if (start == addr) {
+			//DEBUG_LOG(ARM11, "[ERASE][0x%08x]\n", static_cast<int>(it->first));
+			CreamCache.erase(it++);
+		} else
+			++it;
 	}
 
 	//DEBUG_LOG(ARM11, "flush bb @ %x\n", addr);