Add fixed_nonallocatable constraints when appropriate (#5253)
Plumb the set of allocatable registers through the OperandCollector and use it validate uses of fixed-nonallocatable registers, like %rsp on x86_64.
This commit is contained in:
@@ -1263,6 +1263,7 @@ impl PrettyPrint for Inst {
|
||||
}
|
||||
|
||||
Inst::MovFromPReg { src, dst } => {
|
||||
allocs.next_fixed_nonallocatable(*src);
|
||||
let src: Reg = (*src).into();
|
||||
let src = regs::show_ireg_sized(src, 8);
|
||||
let dst = pretty_print_reg(dst.to_reg().to_reg(), 8, allocs);
|
||||
@@ -1271,6 +1272,7 @@ impl PrettyPrint for Inst {
|
||||
|
||||
Inst::MovToPReg { src, dst } => {
|
||||
let src = pretty_print_reg(src.to_reg(), 8, allocs);
|
||||
allocs.next_fixed_nonallocatable(*dst);
|
||||
let dst: Reg = (*dst).into();
|
||||
let dst = regs::show_ireg_sized(dst, 8);
|
||||
format!("{} {}, {}", ljustify("movq".to_string()), src, dst)
|
||||
@@ -1919,14 +1921,14 @@ fn x64_get_operands<F: Fn(VReg) -> VReg>(inst: &Inst, collector: &mut OperandCol
|
||||
collector.reg_def(dst.to_writable_reg());
|
||||
}
|
||||
Inst::MovFromPReg { dst, src } => {
|
||||
debug_assert!([regs::rsp(), regs::rbp(), regs::pinned_reg()].contains(&(*src).into()));
|
||||
debug_assert!(dst.to_reg().to_reg().is_virtual());
|
||||
collector.reg_fixed_nonallocatable(*src);
|
||||
collector.reg_def(dst.to_writable_reg());
|
||||
}
|
||||
Inst::MovToPReg { dst, src } => {
|
||||
debug_assert!(src.to_reg().is_virtual());
|
||||
debug_assert!([regs::rsp(), regs::rbp(), regs::pinned_reg()].contains(&(*dst).into()));
|
||||
collector.reg_use(src.to_reg());
|
||||
collector.reg_fixed_nonallocatable(*dst);
|
||||
}
|
||||
Inst::XmmToGpr { src, dst, .. } => {
|
||||
collector.reg_use(src.to_reg());
|
||||
|
||||
Reference in New Issue
Block a user