diff --git a/irdb-libs/ir_builders/fill_in_indtargs.cpp b/irdb-libs/ir_builders/fill_in_indtargs.cpp index 508de9de9d63d6efc4933e1bf3b52fbe6c8d969c..31f272e16e2c27ace1507824ffd790a4f0485934 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")) {