Implement pinned register usage through set_pinned_reg/get_pinned_reg;

This commit is contained in:
Benjamin Bouvier
2020-04-21 12:12:03 +02:00
parent d1b5df31fd
commit 241c164e25
7 changed files with 97 additions and 20 deletions

View File

@@ -7,6 +7,7 @@ use crate::binemit::CodeOffset;
use crate::ir::types::{B1, B16, B32, B64, B8, F32, F64, FFLAGS, I16, I32, I64, I8, IFLAGS};
use crate::ir::{ExternalName, Opcode, SourceLoc, TrapCode, Type};
use crate::machinst::*;
use crate::settings;
use regalloc::Map as RegallocMap;
use regalloc::{RealReg, RealRegUniverse, Reg, RegClass, SpillSlot, VirtualReg, Writable};
@@ -714,6 +715,16 @@ pub enum Inst {
rd: Writable<Reg>,
mem: MemArg,
},
/// Sets the value of the pinned register to the given register target.
GetPinnedReg {
rd: Writable<Reg>,
},
/// Writes the value of the given source register to the pinned register.
SetPinnedReg {
rm: Reg,
},
}
fn count_zero_half_words(mut value: u64) -> usize {
@@ -1099,6 +1110,12 @@ fn aarch64_get_regs(inst: &Inst, collector: &mut RegUsageCollector) {
&Inst::LoadAddr { rd, mem: _ } => {
collector.add_def(rd);
}
&Inst::GetPinnedReg { rd } => {
collector.add_def(rd);
}
&Inst::SetPinnedReg { rm } => {
collector.add_use(rm);
}
}
}
@@ -1660,6 +1677,12 @@ fn aarch64_map_regs(
map_wr(d, rd);
map_mem(u, mem);
}
&mut Inst::GetPinnedReg { ref mut rd } => {
map_wr(d, rd);
}
&mut Inst::SetPinnedReg { ref mut rm } => {
map(u, rm);
}
}
}
@@ -1850,8 +1873,8 @@ impl MachInst for Inst {
}
}
fn reg_universe() -> RealRegUniverse {
create_reg_universe()
fn reg_universe(flags: &settings::Flags) -> RealRegUniverse {
create_reg_universe(flags)
}
}
@@ -2589,6 +2612,14 @@ impl ShowWithRRU for Inst {
}
_ => unimplemented!("{:?}", mem),
},
&Inst::GetPinnedReg { rd } => {
let rd = rd.show_rru(mb_rru);
format!("get_pinned_reg {}", rd)
}
&Inst::SetPinnedReg { rm } => {
let rm = rm.show_rru(mb_rru);
format!("set_pinned_reg {}", rm)
}
}
}
}