From 81651e1efff7deb137884bce6064eb6eac653d86 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Leon=20Wei=C3=9F?= <leon.weiss@rub.de>
Date: Fri, 25 Aug 2023 09:13:30 +0200
Subject: [PATCH] Search for (almost) all variants of the register

(except ah, bh, ...)
---
 irdb-libs/ir_builders/fill_in_indtargs.cpp | 34 ++++++++++++++--------
 1 file changed, 22 insertions(+), 12 deletions(-)

diff --git a/irdb-libs/ir_builders/fill_in_indtargs.cpp b/irdb-libs/ir_builders/fill_in_indtargs.cpp
index 508de9de9..31f272e16 100644
--- a/irdb-libs/ir_builders/fill_in_indtargs.cpp
+++ b/irdb-libs/ir_builders/fill_in_indtargs.cpp
@@ -2502,11 +2502,14 @@ V2:
 				return;
 			index_reg_no = d6->getOperand(1)->getIndexRegister();
 			const auto index_reg_64bit = regNoToX8664Reg(index_reg_no);
-			const auto index_reg_32bit = regNoToX8632Reg(index_reg_no);
+            const auto index_reg_32bit = regNoToX8632Reg(index_reg_no);
+            const auto index_reg_16bit = regNoToX8616Reg(index_reg_no);
+            const auto index_reg_8bit = regNoToX868Reg(index_reg_no);
 
-			cmp_str = "cmp " + index_reg_32bit + "|cmp " + index_reg_64bit;
-			bound_stopif = "^" + index_reg_32bit + "$|^" + index_reg_64bit + "$";
-			and_str = "and " + index_reg_32bit + "|and " + index_reg_64bit;
+
+			cmp_str = "cmp (" + index_reg_8bit + "|" + index_reg_16bit + "|" + index_reg_32bit + "|" + index_reg_64bit + ")";
+			bound_stopif = "^(" + index_reg_8bit + "|" + index_reg_16bit + "|" + index_reg_32bit + "|" + index_reg_64bit + ")$";
+			and_str = "and (" + index_reg_8bit + "|" + index_reg_16bit + "|" + index_reg_32bit + "|" + index_reg_64bit + ")";
 			lea_string1 += base_reg;
 			if (d6->getOperand(1)->getScaleValue() == 1)
 				lea_string2 = "lea " + index_reg_64bit;
@@ -2808,6 +2811,8 @@ V2:
                 const auto index_reg_32bit = regNoToX8632Reg(index_reg_no);
                 const auto temp_index_reg_64bit = regNoToX8664Reg(decoded_instr->getOperand(1)->getRegNumber());
                 const auto temp_index_reg_32bit = regNoToX8632Reg(decoded_instr->getOperand(1)->getRegNumber());
+                const auto temp_index_reg_16bit = regNoToX8616Reg(decoded_instr->getOperand(1)->getRegNumber());
+                const auto temp_index_reg_8bit = regNoToX868Reg(decoded_instr->getOperand(1)->getRegNumber());
                 if(index_reg_32bit.empty() || index_reg_64bit.empty()){
                     cout << "WARNING: Could not detect index register for table load at " <<
                         hex << table_load_instruction->getAddress()->getVirtualOffset() << endl;
@@ -2815,19 +2820,24 @@ V2:
                     cout << "WARNING: Could not detect new temporary index register for move into index reg at " <<
                          hex << intermediate_write_instr->getAddress()->getVirtualOffset() << endl;
                 } else {
+                    auto to_replace = "\\([^()]*" + index_reg_32bit + "\\|" + index_reg_64bit + "\\)";
+                    auto to_replace_regex = std::regex(to_replace);
+                    auto replace_with = "(" + temp_index_reg_8bit + "|" + temp_index_reg_16bit + "|" + temp_index_reg_32bit + "|" + temp_index_reg_64bit + ")";
                     if (getenv("IB_VERBOSE") || getenv("DEBUG")) {
-                        cout << "DEBUG: replacing index reg " << index_reg_64bit << "/" << index_reg_32bit << " with "
-                             << temp_index_reg_64bit << "/" << temp_index_reg_32bit << " because of instruction '"
+                        cout << "DEBUG: replacing index reg " << to_replace << " with " << replace_with << " because of instruction '"
                              << intermediate_write_instr->getDisassembly() << "' @ 0x"
                              << hex << intermediate_write_instr->getAddress()->getVirtualOffset() << endl;
                     }
 
-                    cmp_str = std::regex_replace(cmp_str, std::regex(index_reg_64bit), temp_index_reg_64bit);
-                    cmp_str = std::regex_replace(cmp_str, std::regex(index_reg_32bit), temp_index_reg_32bit);
-                    bound_stopif = std::regex_replace(bound_stopif, std::regex(index_reg_64bit), temp_index_reg_64bit);
-                    bound_stopif = std::regex_replace(bound_stopif, std::regex(index_reg_32bit), temp_index_reg_32bit);
-                    and_str = std::regex_replace(and_str, std::regex(index_reg_64bit), temp_index_reg_64bit);
-                    and_str = std::regex_replace(and_str, std::regex(index_reg_32bit), temp_index_reg_32bit);
+
+                    cmp_str = std::regex_replace(cmp_str, to_replace_regex, replace_with);
+                    bound_stopif = std::regex_replace(bound_stopif, to_replace_regex, replace_with);
+                    and_str = std::regex_replace(and_str, to_replace_regex, replace_with);
+
+                    if (getenv("IB_VERBOSE") || getenv("DEBUG")) {
+                        cout << "After replacement:" << endl << cmp_str << endl << bound_stopif << endl << and_str
+                             << endl;
+                    }
                 }
             } else {
                 if (getenv("IB_VERBOSE") || getenv("DEBUG")) {
-- 
GitLab