Add support for fixed stack slots
This works by allowing a PReg to be marked as being a stack location instead of a physical register.
This commit is contained in:
@@ -25,20 +25,6 @@ pub enum Requirement {
|
||||
Conflict,
|
||||
}
|
||||
impl Requirement {
|
||||
#[inline(always)]
|
||||
pub fn merge(self, other: Requirement) -> Requirement {
|
||||
match (self, other) {
|
||||
(Requirement::Unknown, other) | (other, Requirement::Unknown) => other,
|
||||
(Requirement::Conflict, _) | (_, Requirement::Conflict) => Requirement::Conflict,
|
||||
(other, Requirement::Any) | (Requirement::Any, other) => other,
|
||||
(Requirement::Stack, Requirement::Stack) => self,
|
||||
(Requirement::Register, Requirement::Fixed(preg))
|
||||
| (Requirement::Fixed(preg), Requirement::Register) => Requirement::Fixed(preg),
|
||||
(Requirement::Register, Requirement::Register) => self,
|
||||
(Requirement::Fixed(a), Requirement::Fixed(b)) if a == b => self,
|
||||
_ => Requirement::Conflict,
|
||||
}
|
||||
}
|
||||
#[inline(always)]
|
||||
pub fn from_operand(op: Operand) -> Requirement {
|
||||
match op.constraint() {
|
||||
@@ -51,6 +37,23 @@ impl Requirement {
|
||||
}
|
||||
|
||||
impl<'a, F: Function> Env<'a, F> {
|
||||
#[inline(always)]
|
||||
pub fn merge_requirement(&self, a: Requirement, b: Requirement) -> Requirement {
|
||||
match (a, b) {
|
||||
(Requirement::Unknown, other) | (other, Requirement::Unknown) => other,
|
||||
(Requirement::Conflict, _) | (_, Requirement::Conflict) => Requirement::Conflict,
|
||||
(other, Requirement::Any) | (Requirement::Any, other) => other,
|
||||
(Requirement::Stack, Requirement::Stack) => Requirement::Stack,
|
||||
(Requirement::Register, Requirement::Register) => Requirement::Register,
|
||||
(Requirement::Register, Requirement::Fixed(preg))
|
||||
| (Requirement::Fixed(preg), Requirement::Register) if !self.pregs[preg.index()].is_stack => Requirement::Fixed(preg),
|
||||
(Requirement::Stack, Requirement::Fixed(preg))
|
||||
| (Requirement::Fixed(preg), Requirement::Stack) if self.pregs[preg.index()].is_stack => Requirement::Fixed(preg),
|
||||
(Requirement::Fixed(a), Requirement::Fixed(b)) if a == b => Requirement::Fixed(a),
|
||||
_ => Requirement::Conflict,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn compute_requirement(&self, bundle: LiveBundleIndex) -> Requirement {
|
||||
let mut req = Requirement::Unknown;
|
||||
log::trace!("compute_requirement: {:?}", bundle);
|
||||
@@ -59,7 +62,7 @@ impl<'a, F: Function> Env<'a, F> {
|
||||
for u in &self.ranges[entry.index.index()].uses {
|
||||
log::trace!(" -> use {:?}", u);
|
||||
let r = Requirement::from_operand(u.operand);
|
||||
req = req.merge(r);
|
||||
req = self.merge_requirement(req, r);
|
||||
log::trace!(" -> req {:?}", req);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user