cranelift: Rework pinned register lowering (#5249)
Rework pinned register lowering to avoid the use of pinned virtual registers, instead using the MovFromPReg and MovToPReg pseudo instructions.
This commit is contained in:
@@ -1367,15 +1367,36 @@ impl MachInstEmit for Inst {
|
||||
}
|
||||
}
|
||||
}
|
||||
&Inst::MovPReg { rd, rm } => {
|
||||
&Inst::MovFromPReg { rd, rm } => {
|
||||
let rd = allocs.next_writable(rd);
|
||||
let rm: Reg = rm.into();
|
||||
debug_assert!([regs::fp_reg(), regs::stack_reg(), regs::link_reg()].contains(&rm));
|
||||
debug_assert!([
|
||||
regs::fp_reg(),
|
||||
regs::stack_reg(),
|
||||
regs::link_reg(),
|
||||
regs::pinned_reg()
|
||||
]
|
||||
.contains(&rm));
|
||||
assert!(rm.class() == RegClass::Int);
|
||||
assert!(rd.to_reg().class() == rm.class());
|
||||
let size = OperandSize::Size64;
|
||||
Inst::Mov { size, rd, rm }.emit(&[], sink, emit_info, state);
|
||||
}
|
||||
&Inst::MovToPReg { rd, rm } => {
|
||||
let rd: Writable<Reg> = Writable::from_reg(rd.into());
|
||||
let rm = allocs.next(rm);
|
||||
debug_assert!([
|
||||
regs::fp_reg(),
|
||||
regs::stack_reg(),
|
||||
regs::link_reg(),
|
||||
regs::pinned_reg()
|
||||
]
|
||||
.contains(&rd.to_reg()));
|
||||
assert!(rd.to_reg().class() == RegClass::Int);
|
||||
assert!(rm.class() == rd.to_reg().class());
|
||||
let size = OperandSize::Size64;
|
||||
Inst::Mov { size, rd, rm }.emit(&[], sink, emit_info, state);
|
||||
}
|
||||
&Inst::MovWide { op, rd, imm, size } => {
|
||||
let rd = allocs.next_writable(rd);
|
||||
sink.put4(enc_move_wide(op, rd, imm, size));
|
||||
|
||||
Reference in New Issue
Block a user