Skip to content

Commit e115eda

Browse files
committed
Clean up x64 emission a bit with new helper
1 parent da8e697 commit e115eda

File tree

1 file changed

+22
-21
lines changed
  • crates/codegen/src/target/x64

1 file changed

+22
-21
lines changed

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

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -964,25 +964,15 @@ fn emit_imul_r_rm_i(
964964
op1: RegMem,
965965
imm: i32,
966966
) {
967-
let is_imm8 = is_sint::<8>(imm as u64);
968-
let opcode = if is_imm8 { 0x6b } else { 0x69 };
967+
let use_imm8 = is_sint::<8>(imm as u64);
968+
let opcode = if use_imm8 { 0x6b } else { 0x69 };
969969

970970
let (rex, modrm_sib) = encode_reg_mem_parts(op1, |rex| {
971971
rex.encode_operand_size(op_size);
972972
rex.encode_modrm_reg(dest)
973973
});
974974

975-
buffer.instr(|sink| {
976-
rex.emit(sink);
977-
sink.emit(&[opcode]);
978-
modrm_sib.emit(sink);
979-
980-
if is_imm8 {
981-
sink.emit(&[imm as u8]);
982-
} else {
983-
sink.emit(&imm.to_le_bytes());
984-
}
985-
});
975+
emit_rm_with_imm(buffer, rex, opcode, modrm_sib, imm, use_imm8);
986976
}
987977

988978
fn emit_div_rm(buffer: &mut CodeBuffer<X64Fixup>, op: DivOp, op_size: OperandSize, arg: RegMem) {
@@ -1319,15 +1309,19 @@ fn emit_alu_r_rm(
13191309
});
13201310
}
13211311

1312+
fn emit_alu_r64_i(buffer: &mut CodeBuffer<X64Fixup>, op: AluBinOp, dest: PhysReg, imm: i32) {
1313+
emit_alu_rm_i(buffer, op, OperandSize::S64, RegMem::Reg(dest), imm);
1314+
}
1315+
13221316
fn emit_alu_rm_i(
13231317
buffer: &mut CodeBuffer<X64Fixup>,
13241318
op: AluBinOp,
13251319
op_size: OperandSize,
13261320
arg: RegMem,
13271321
imm: i32,
13281322
) {
1329-
let mut is_imm8 = is_sint::<8>(imm as u64);
1330-
let mut opcode = if is_imm8 { 0x83 } else { 0x81 };
1323+
let mut use_imm8 = is_sint::<8>(imm as u64);
1324+
let mut opcode = if use_imm8 { 0x83 } else { 0x81 };
13311325

13321326
let reg_opcode = match op {
13331327
AluBinOp::Add => 0x0,
@@ -1338,7 +1332,7 @@ fn emit_alu_rm_i(
13381332
AluBinOp::Test => {
13391333
// `test` is special. Who knows why.
13401334
opcode = 0xf7;
1341-
is_imm8 = false;
1335+
use_imm8 = false;
13421336
0x0
13431337
}
13441338
AluBinOp::Xor => 0x6,
@@ -1349,12 +1343,23 @@ fn emit_alu_rm_i(
13491343
reg_opcode
13501344
});
13511345

1346+
emit_rm_with_imm(buffer, rex, opcode, modrm_sib, imm, use_imm8);
1347+
}
1348+
1349+
fn emit_rm_with_imm(
1350+
buffer: &mut CodeBuffer<X64Fixup>,
1351+
rex: RexPrefix,
1352+
opcode: u8,
1353+
modrm_sib: ModRmSib,
1354+
imm: i32,
1355+
use_imm8: bool,
1356+
) {
13521357
buffer.instr(|sink| {
13531358
rex.emit(sink);
13541359
sink.emit(&[opcode]);
13551360
modrm_sib.emit(sink);
13561361

1357-
if is_imm8 {
1362+
if use_imm8 {
13581363
sink.emit(&[imm as u8]);
13591364
} else {
13601365
sink.emit(&imm.to_le_bytes());
@@ -1380,10 +1385,6 @@ fn emit_alu_rm(buffer: &mut CodeBuffer<X64Fixup>, op: AluUnOp, op_size: OperandS
13801385
});
13811386
}
13821387

1383-
fn emit_alu_r64_i(buffer: &mut CodeBuffer<X64Fixup>, op: AluBinOp, dest: PhysReg, imm: i32) {
1384-
emit_alu_rm_i(buffer, op, OperandSize::S64, RegMem::Reg(dest), imm);
1385-
}
1386-
13871388
fn emit_sse_fpu_r_rm(
13881389
buffer: &mut CodeBuffer<X64Fixup>,
13891390
prec: SseFpuPrecision,

0 commit comments

Comments
 (0)