machinst x64: revamp integer immediate emission;
In particular: - try to optimize the integer emission into a 32-bit emission, when the high bits are all zero, and stop relying on the caller of `imm_r` to ensure this. - rename `Inst::imm_r`/`Inst::Imm_R` to `Inst::imm`/`Inst::Imm`. - generate a sign-extending mov 32-bit immediate to 64-bits, whenever possible. - fix a few places where the previous commit did introduce the generation of zero-constants with xor, when calling `put_input_to_reg`, thus clobbering the flags before they were read.
This commit is contained in:
@@ -1368,43 +1368,43 @@ fn test_x64_emit() {
|
||||
// Imm_R
|
||||
//
|
||||
insns.push((
|
||||
Inst::imm_r(false, 1234567, w_r14),
|
||||
Inst::imm(OperandSize::Size32, 1234567, w_r14),
|
||||
"41BE87D61200",
|
||||
"movl $1234567, %r14d",
|
||||
));
|
||||
insns.push((
|
||||
Inst::imm_r(false, -126i64 as u64, w_r14),
|
||||
Inst::imm(OperandSize::Size32, -126i64 as u64, w_r14),
|
||||
"41BE82FFFFFF",
|
||||
"movl $-126, %r14d",
|
||||
));
|
||||
insns.push((
|
||||
Inst::imm_r(true, 1234567898765, w_r14),
|
||||
Inst::imm(OperandSize::Size64, 1234567898765, w_r14),
|
||||
"49BE8D26FB711F010000",
|
||||
"movabsq $1234567898765, %r14",
|
||||
));
|
||||
insns.push((
|
||||
Inst::imm_r(true, -126i64 as u64, w_r14),
|
||||
"49BE82FFFFFFFFFFFFFF",
|
||||
Inst::imm(OperandSize::Size64, -126i64 as u64, w_r14),
|
||||
"49C7C682FFFFFF",
|
||||
"movabsq $-126, %r14",
|
||||
));
|
||||
insns.push((
|
||||
Inst::imm_r(false, 1234567, w_rcx),
|
||||
Inst::imm(OperandSize::Size32, 1234567, w_rcx),
|
||||
"B987D61200",
|
||||
"movl $1234567, %ecx",
|
||||
));
|
||||
insns.push((
|
||||
Inst::imm_r(false, -126i64 as u64, w_rcx),
|
||||
Inst::imm(OperandSize::Size32, -126i64 as u64, w_rcx),
|
||||
"B982FFFFFF",
|
||||
"movl $-126, %ecx",
|
||||
));
|
||||
insns.push((
|
||||
Inst::imm_r(true, 1234567898765, w_rsi),
|
||||
Inst::imm(OperandSize::Size64, 1234567898765, w_rsi),
|
||||
"48BE8D26FB711F010000",
|
||||
"movabsq $1234567898765, %rsi",
|
||||
));
|
||||
insns.push((
|
||||
Inst::imm_r(true, -126i64 as u64, w_rbx),
|
||||
"48BB82FFFFFFFFFFFFFF",
|
||||
Inst::imm(OperandSize::Size64, -126i64 as u64, w_rbx),
|
||||
"48C7C382FFFFFF",
|
||||
"movabsq $-126, %rbx",
|
||||
));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user