@@ -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
988978fn 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+
13221316fn 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-
13871388fn emit_sse_fpu_r_rm (
13881389 buffer : & mut CodeBuffer < X64Fixup > ,
13891390 prec : SseFpuPrecision ,
0 commit comments