use super::{Op, Resources};
pub use Op::*;
pub const BUDGET: Resources = Resources::new(0x1412316);
pub const SPILL_COST: Resources = Resources::new(0x0010202);
pub const SLOT_COST: Resources = Resources::new(0x0001100);
#[derive(Debug)]
pub struct Cost {
pub input_latencies: &'static [u8],
pub output_latencies: &'static [u8],
pub resources: Resources,
}
pub const ZERO_COST: Cost = Cost {
input_latencies: &[],
output_latencies: &[],
resources: Resources::new(0x0000000),
};
pub const GUARD_COST: Cost = Cost {
input_latencies: &[0],
output_latencies: &[],
resources: Resources::new(0x0100012),
};
pub const MOVE_COST: Cost = Cost {
input_latencies: &[0],
output_latencies: &[0],
resources: Resources::new(0x0000001),
};
pub const ALU_COST: Cost = Cost {
input_latencies: &[0, 0],
output_latencies: &[1],
resources: Resources::new(0x0100001),
};
pub const CONDITIONAL_COST: Cost = Cost {
input_latencies: &[0, 0],
output_latencies: &[2],
resources: Resources::new(0x0200013),
};
pub const MUL_COST: Cost = Cost {
input_latencies: &[0, 0],
output_latencies: &[3],
resources: Resources::new(0x1100001),
};
pub const DIV_COST: Cost = Cost {
input_latencies: &[0, 0],
output_latencies: &[30],
resources: Resources::new(0x1012306),
};
pub const SHIFT_COST: Cost = Cost {
input_latencies: &[0, 0],
output_latencies: &[1],
resources: Resources::new(0x0100002),
};
pub const LOAD_COST: Cost = Cost {
input_latencies: &[2],
output_latencies: &[1],
resources: Resources::new(0x0001101),
};
pub const STORE_COST: Cost = Cost {
input_latencies: &[0, 2],
output_latencies: &[0],
resources: Resources::new(0x0010101),
};
pub const DEBUG_COST: Cost = Cost {
input_latencies: &[0],
output_latencies: &[],
resources: Resources::new(0x0000000),
};
#[allow(clippy::module_name_repetitions)]
pub fn op_cost(op: Op) -> Option<&'static Cost> {
use Op::*;
use super::code::{UnaryOp::*, BinaryOp::*};
if op == Op::Convention { return None; }
Some(match op {
Guard => &GUARD_COST,
Sequence => &ZERO_COST,
Convention => panic!("Cannot execute Op::Convention"),
Constant(n) => if n == 0 { &MOVE_COST } else { &ALU_COST },
Unary(_, op) => match op {
Abs => &CONDITIONAL_COST,
Negate | Not => &ALU_COST,
},
Binary(_, op) => match op {
Add | Sub | And| Or| Xor => &ALU_COST,
Mul => &MUL_COST,
UDiv | SDiv => &DIV_COST,
Lsl | Lsr | Asr => &SHIFT_COST,
Lt | Ult | Eq | Max | Min => &CONDITIONAL_COST,
},
Load(_, _) => &LOAD_COST,
Store(_, _) => &STORE_COST,
Debug => &DEBUG_COST,
})
}