Skip to content

Commit 1486243

Browse files
committed
[ENCODEGEN,X64] Support negative offset for LEA32rm
1 parent 4fea097 commit 1486243

File tree

3 files changed

+10
-10
lines changed

3 files changed

+10
-10
lines changed

tpde-encodegen/src/x64/EncCompilerTemplate.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ struct EncodeCompiler {
5858
5959
[[nodiscard]] static std::optional<i32> encodeable_as_imm32_sext(GenericValuePart &gv) noexcept;
6060
[[nodiscard]] static std::optional<FeMem> encodeable_as_mem(GenericValuePart &gv, unsigned align) noexcept;
61-
[[nodiscard]] static std::optional<FeMem> encodeable_with(GenericValuePart &gv, FeMem other) noexcept;
61+
[[nodiscard]] static std::optional<FeMem> encodeable_with(GenericValuePart &gv, FeMem other, bool addr32 = false) noexcept;
6262
void try_salvage_or_materialize(GenericValuePart &gv,
6363
ScratchReg &dst_scratch,
6464
u8 bank,
@@ -176,10 +176,10 @@ template <typename Adaptor,
176176
class BaseTy,
177177
typename Config>
178178
std::optional<FeMem> EncodeCompiler<Adaptor, Derived, BaseTy, Config>::
179-
encodeable_with(GenericValuePart &gv, FeMem other) noexcept {
180-
const auto disp_encodeable = [](u64 a, u64 b) -> std::optional<i32> {
179+
encodeable_with(GenericValuePart &gv, FeMem other, bool addr32) noexcept {
180+
const auto disp_encodeable = [addr32](u64 a, u64 b) -> std::optional<i32> {
181181
auto sum = static_cast<i32>(a + b);
182-
if (static_cast<i64>(sum) == static_cast<i64>(a + b))
182+
if (addr32 || static_cast<i64>(sum) == static_cast<i64>(a + b))
183183
return sum;
184184
return std::nullopt;
185185
};

tpde-encodegen/src/x64/Target.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,8 @@ void EncodingTargetX64::get_inst_candidates(
229229
unsigned sc = has_idx ? mi.getOperand(memop_start + 1).getImm() : 0;
230230
std::string_view idx = has_idx ? "FE_AX" : "FE_NOREG";
231231
auto off = mi.getOperand(memop_start + 3).getImm();
232-
auto cond = std::format("FE_MEM(FE_NOREG, {}, {}, {})", sc, idx, off);
232+
auto cond = std::format(
233+
"FE_MEM(FE_NOREG, {}, {}, {}), {}", sc, idx, off, mnem == "LEA32rm");
233234

234235
candidates.emplace_back(
235236
memop_start,
@@ -275,7 +276,8 @@ void EncodingTargetX64::get_inst_candidates(
275276
mi.getOperand(memop_start + 1).getImm() == 1 &&
276277
mi.getOperand(memop_start + 3).isImm()) {
277278
auto off = mi.getOperand(memop_start + 3).getImm();
278-
auto cond = std::format("FE_MEM(FE_AX, 0, FE_NOREG, {})", off);
279+
auto cond = std::format(
280+
"FE_MEM(FE_AX, 0, FE_NOREG, {}), {}", off, mnem == "LEA32rm");
279281

280282
candidates.emplace_back(
281283
memop_start + 2,

tpde-llvm/test/filetest/add.ll

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -267,8 +267,7 @@ define void @add_i32_invert(i32 %0) {
267267
; X64-NEXT: mov rbp, rsp
268268
; X64-NEXT: nop word ptr [rax + rax]
269269
; X64-NEXT: sub rsp, 0x30
270-
; X64-NEXT: mov eax, 0xffffffff
271-
; X64-NEXT: lea edi, [rdi + rax]
270+
; X64-NEXT: lea edi, [rdi - 0x1]
272271
; X64-NEXT: add rsp, 0x30
273272
; X64-NEXT: pop rbp
274273
; X64-NEXT: ret
@@ -345,8 +344,7 @@ define void @add_i32_FFFFFFFF(i32 %0) {
345344
; X64-NEXT: mov rbp, rsp
346345
; X64-NEXT: nop word ptr [rax + rax]
347346
; X64-NEXT: sub rsp, 0x30
348-
; X64-NEXT: mov eax, 0xffffffff
349-
; X64-NEXT: lea edi, [rdi + rax]
347+
; X64-NEXT: lea edi, [rdi - 0x1]
350348
; X64-NEXT: add rsp, 0x30
351349
; X64-NEXT: pop rbp
352350
; X64-NEXT: ret

0 commit comments

Comments
 (0)