x64: special case 0 to use xor in Inst::gen_constant for i128s
This commit is contained in:
@@ -3237,16 +3237,30 @@ impl MachInst for Inst {
|
|||||||
) -> SmallVec<[Self; 4]> {
|
) -> SmallVec<[Self; 4]> {
|
||||||
let mut ret = SmallVec::new();
|
let mut ret = SmallVec::new();
|
||||||
if ty == types::I128 {
|
if ty == types::I128 {
|
||||||
ret.push(Inst::imm(
|
let lo = value as u64;
|
||||||
OperandSize::Size64,
|
let hi = (value >> 64) as u64;
|
||||||
value as u64,
|
let lo_reg = to_regs.regs()[0];
|
||||||
to_regs.regs()[0],
|
let hi_reg = to_regs.regs()[1];
|
||||||
));
|
if lo == 0 {
|
||||||
ret.push(Inst::imm(
|
ret.push(Inst::alu_rmi_r(
|
||||||
OperandSize::Size64,
|
OperandSize::Size64,
|
||||||
(value >> 64) as u64,
|
AluRmiROpcode::Xor,
|
||||||
to_regs.regs()[1],
|
RegMemImm::reg(lo_reg.to_reg()),
|
||||||
));
|
lo_reg,
|
||||||
|
));
|
||||||
|
} else {
|
||||||
|
ret.push(Inst::imm(OperandSize::Size64, lo, lo_reg));
|
||||||
|
}
|
||||||
|
if hi == 0 {
|
||||||
|
ret.push(Inst::alu_rmi_r(
|
||||||
|
OperandSize::Size64,
|
||||||
|
AluRmiROpcode::Xor,
|
||||||
|
RegMemImm::reg(hi_reg.to_reg()),
|
||||||
|
hi_reg,
|
||||||
|
));
|
||||||
|
} else {
|
||||||
|
ret.push(Inst::imm(OperandSize::Size64, hi, hi_reg));
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
let to_reg = to_regs
|
let to_reg = to_regs
|
||||||
.only_reg()
|
.only_reg()
|
||||||
|
|||||||
@@ -702,10 +702,10 @@ block2(v6: i128):
|
|||||||
; nextln: testb $$1, %dl
|
; nextln: testb $$1, %dl
|
||||||
; nextln: jnz label1; j label2
|
; nextln: jnz label1; j label2
|
||||||
; check: Block 1:
|
; check: Block 1:
|
||||||
; check: movl $$0, %edi
|
; check: xorq %rdi, %rdi
|
||||||
; nextln: movl $$0, %esi
|
; nextln: xorq %rsi, %rsi
|
||||||
; nextln: movl $$1, %ecx
|
; nextln: movl $$1, %ecx
|
||||||
; nextln: movl $$0, %eax
|
; nextln: xorq %rax, %rax
|
||||||
; nextln: addq %rcx, %rdi
|
; nextln: addq %rcx, %rdi
|
||||||
; nextln: adcq %rax, %rsi
|
; nextln: adcq %rax, %rsi
|
||||||
; nextln: movq %rdi, %rax
|
; nextln: movq %rdi, %rax
|
||||||
@@ -714,10 +714,10 @@ block2(v6: i128):
|
|||||||
; nextln: popq %rbp
|
; nextln: popq %rbp
|
||||||
; nextln: ret
|
; nextln: ret
|
||||||
; check: Block 2:
|
; check: Block 2:
|
||||||
; check: movl $$0, %edi
|
; check: xorq %rdi, %rdi
|
||||||
; nextln: movl $$0, %esi
|
; nextln: xorq %rsi, %rsi
|
||||||
; nextln: movl $$2, %ecx
|
; nextln: movl $$2, %ecx
|
||||||
; nextln: movl $$0, %eax
|
; nextln: xorq %rax, %rax
|
||||||
; nextln: addq %rcx, %rdi
|
; nextln: addq %rcx, %rdi
|
||||||
; nextln: adcq %rax, %rsi
|
; nextln: adcq %rax, %rsi
|
||||||
; nextln: movq %rdi, %rax
|
; nextln: movq %rdi, %rax
|
||||||
|
|||||||
Reference in New Issue
Block a user