Skip to content

Commit 415648e

Browse files
committed
Accept operand size in x64 lea emission
We'll soon need to emit `lea` instructions into 32-bit destinations for untied 32-bit adds.
1 parent d79f1e6 commit 415648e

File tree

1 file changed

+23
-6
lines changed
  • crates/codegen/src/target/x64

1 file changed

+23
-6
lines changed

crates/codegen/src/target/x64/emit.rs

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -889,13 +889,18 @@ fn emit_lea_or_mov(buffer: &mut CodeBuffer<X64Fixup>, dest: PhysReg, addr: RawAd
889889
index: None,
890890
offset: 0,
891891
} => emit_mov_r_r(buffer, dest, base),
892-
_ => emit_lea(buffer, dest, addr),
892+
_ => emit_lea(buffer, OperandSize::S64, dest, addr),
893893
}
894894
}
895895

896-
fn emit_lea(buffer: &mut CodeBuffer<X64Fixup>, dest: PhysReg, addr: RawAddrMode) {
896+
fn emit_lea(
897+
buffer: &mut CodeBuffer<X64Fixup>,
898+
op_size: OperandSize,
899+
dest: PhysReg,
900+
addr: RawAddrMode,
901+
) {
897902
buffer.instr(|sink| {
898-
emit_lea_instr(sink, dest, addr);
903+
emit_lea_instr(sink, op_size, dest, addr);
899904
});
900905
}
901906

@@ -904,13 +909,25 @@ fn emit_lea_rip_reloc(buffer: &mut CodeBuffer<X64Fixup>, dest: PhysReg, target:
904909
BufferRelocTarget::Function(target),
905910
-4,
906911
RELOC_PC32,
907-
|sink| emit_lea_instr(sink, dest, RawAddrMode::RipOff { offset: 0 }),
912+
|sink| {
913+
emit_lea_instr(
914+
sink,
915+
OperandSize::S64,
916+
dest,
917+
RawAddrMode::RipOff { offset: 0 },
918+
)
919+
},
908920
);
909921
}
910922

911-
fn emit_lea_instr(sink: &mut InstrSink<'_>, dest: PhysReg, addr: RawAddrMode) -> InstrAnchor {
923+
fn emit_lea_instr(
924+
sink: &mut InstrSink<'_>,
925+
op_size: OperandSize,
926+
dest: PhysReg,
927+
addr: RawAddrMode,
928+
) -> InstrAnchor {
912929
let (rex, modrm_sib) = encode_mem_parts(addr, |rex: &mut RexPrefix| {
913-
rex.encode_operand_size(OperandSize::S64);
930+
rex.encode_operand_size(op_size);
914931
rex.encode_modrm_reg(dest)
915932
});
916933
rex.emit(sink);

0 commit comments

Comments
 (0)