Remove encoding generation from cranelift-codegen-meta
This commit is contained in:
@@ -1,7 +1,6 @@
|
||||
use std::collections::{hash_map, HashMap, HashSet};
|
||||
use std::collections::{HashMap, HashSet};
|
||||
use std::iter::FromIterator;
|
||||
|
||||
use crate::cdsl::encodings::Encoding;
|
||||
use crate::cdsl::types::ValueType;
|
||||
use crate::cdsl::xform::TransformGroupIndex;
|
||||
|
||||
@@ -10,30 +9,9 @@ pub(crate) struct CpuMode {
|
||||
default_legalize: Option<TransformGroupIndex>,
|
||||
monomorphic_legalize: Option<TransformGroupIndex>,
|
||||
typed_legalize: HashMap<ValueType, TransformGroupIndex>,
|
||||
pub encodings: Vec<Encoding>,
|
||||
}
|
||||
|
||||
impl CpuMode {
|
||||
pub fn get_default_legalize_code(&self) -> TransformGroupIndex {
|
||||
self.default_legalize
|
||||
.expect("a finished CpuMode must have a default legalize code")
|
||||
}
|
||||
pub fn get_legalize_code_for(&self, typ: &Option<ValueType>) -> TransformGroupIndex {
|
||||
match typ {
|
||||
Some(typ) => self
|
||||
.typed_legalize
|
||||
.get(typ)
|
||||
.copied()
|
||||
.unwrap_or_else(|| self.get_default_legalize_code()),
|
||||
None => self
|
||||
.monomorphic_legalize
|
||||
.unwrap_or_else(|| self.get_default_legalize_code()),
|
||||
}
|
||||
}
|
||||
pub fn get_legalized_types(&self) -> hash_map::Keys<ValueType, TransformGroupIndex> {
|
||||
self.typed_legalize.keys()
|
||||
}
|
||||
|
||||
/// Returns a deterministically ordered, deduplicated list of TransformGroupIndex for the directly
|
||||
/// reachable set of TransformGroup this TargetIsa uses.
|
||||
pub fn direct_transform_groups(&self) -> Vec<TransformGroupIndex> {
|
||||
|
||||
@@ -1,52 +0,0 @@
|
||||
use crate::cdsl::instructions::{
|
||||
InstSpec, Instruction,
|
||||
InstructionPredicateNumber
|
||||
};
|
||||
use crate::cdsl::recipes::{EncodingRecipeNumber, Recipes};
|
||||
use crate::cdsl::settings::SettingPredicateNumber;
|
||||
use crate::cdsl::types::ValueType;
|
||||
use std::rc::Rc;
|
||||
|
||||
/// Encoding for a concrete instruction.
|
||||
///
|
||||
/// An `Encoding` object ties an instruction opcode with concrete type variables together with an
|
||||
/// encoding recipe and encoding encbits.
|
||||
///
|
||||
/// The concrete instruction can be in three different forms:
|
||||
///
|
||||
/// 1. A naked opcode: `trap` for non-polymorphic instructions.
|
||||
/// 2. With bound type variables: `iadd.i32` for polymorphic instructions.
|
||||
/// 3. With operands providing constraints: `icmp.i32(intcc.eq, x, y)`.
|
||||
///
|
||||
/// If the instruction is polymorphic, all type variables must be provided.
|
||||
pub(crate) struct EncodingContent {
|
||||
/// The `Instruction` or `BoundInstruction` being encoded.
|
||||
inst: InstSpec,
|
||||
|
||||
/// The `EncodingRecipe` to use.
|
||||
pub recipe: EncodingRecipeNumber,
|
||||
|
||||
/// Additional encoding bits to be interpreted by `recipe`.
|
||||
pub encbits: u16,
|
||||
|
||||
/// An instruction predicate that must be true to allow selecting this encoding.
|
||||
pub inst_predicate: Option<InstructionPredicateNumber>,
|
||||
|
||||
/// An ISA predicate that must be true to allow selecting this encoding.
|
||||
pub isa_predicate: Option<SettingPredicateNumber>,
|
||||
|
||||
/// The value type this encoding has been bound to, for encodings of polymorphic instructions.
|
||||
pub bound_type: Option<ValueType>,
|
||||
}
|
||||
|
||||
impl EncodingContent {
|
||||
pub fn inst(&self) -> &Instruction {
|
||||
self.inst.inst()
|
||||
}
|
||||
pub fn to_rust_comment(&self, recipes: &Recipes) -> String {
|
||||
format!("[{}#{:02x}]", recipes[self.recipe].name, self.encbits)
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) type Encoding = Rc<EncodingContent>;
|
||||
|
||||
@@ -745,12 +745,6 @@ impl FormatPredicateNode {
|
||||
}
|
||||
}
|
||||
|
||||
fn destructuring_member_name(&self) -> &'static str {
|
||||
match &self.kind {
|
||||
_ => self.member_name,
|
||||
}
|
||||
}
|
||||
|
||||
fn rust_predicate(&self) -> String {
|
||||
match &self.kind {
|
||||
FormatPredicateKind::IsEqual(arg) => {
|
||||
@@ -808,44 +802,6 @@ impl InstructionPredicateNode {
|
||||
.join(" && "),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn format_destructuring_member_name(&self) -> &str {
|
||||
match self {
|
||||
InstructionPredicateNode::FormatPredicate(format_pred) => {
|
||||
format_pred.destructuring_member_name()
|
||||
}
|
||||
_ => panic!("Only for leaf format predicates"),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn format_name(&self) -> &str {
|
||||
match self {
|
||||
InstructionPredicateNode::FormatPredicate(format_pred) => format_pred.format_name,
|
||||
_ => panic!("Only for leaf format predicates"),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn is_type_predicate(&self) -> bool {
|
||||
match self {
|
||||
InstructionPredicateNode::FormatPredicate(_) | InstructionPredicateNode::And(_) => {
|
||||
false
|
||||
}
|
||||
InstructionPredicateNode::TypePredicate(_) => true,
|
||||
}
|
||||
}
|
||||
|
||||
fn collect_leaves(&self) -> Vec<&InstructionPredicateNode> {
|
||||
let mut ret = Vec::new();
|
||||
match self {
|
||||
InstructionPredicateNode::And(nodes) => {
|
||||
for node in nodes {
|
||||
ret.extend(node.collect_leaves());
|
||||
}
|
||||
}
|
||||
_ => ret.push(self),
|
||||
}
|
||||
ret
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Hash, PartialEq, Eq)]
|
||||
@@ -918,22 +874,6 @@ impl InstructionPredicate {
|
||||
pub fn rust_predicate(&self, func_str: &str) -> Option<String> {
|
||||
self.node.as_ref().map(|root| root.rust_predicate(func_str))
|
||||
}
|
||||
|
||||
/// Returns the type predicate if this is one, or None otherwise.
|
||||
pub fn type_predicate(&self, func_str: &str) -> Option<String> {
|
||||
let node = self.node.as_ref().unwrap();
|
||||
if node.is_type_predicate() {
|
||||
Some(node.rust_predicate(func_str))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns references to all the nodes that are leaves in the condition (i.e. by flattening
|
||||
/// AND/OR).
|
||||
pub fn collect_leaves(&self) -> Vec<&InstructionPredicateNode> {
|
||||
self.node.as_ref().unwrap().collect_leaves()
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
|
||||
|
||||
@@ -86,11 +86,4 @@ impl TargetIsa {
|
||||
pub fn direct_transform_groups(&self) -> &Vec<TransformGroupIndex> {
|
||||
&self.local_transform_groups
|
||||
}
|
||||
|
||||
pub fn translate_group_index(&self, group_index: TransformGroupIndex) -> usize {
|
||||
self.local_transform_groups
|
||||
.iter()
|
||||
.position(|&val| val == group_index)
|
||||
.expect("TransformGroup unused by this TargetIsa!")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
#[macro_use]
|
||||
pub mod ast;
|
||||
pub mod cpu_modes;
|
||||
pub mod encodings;
|
||||
pub mod formats;
|
||||
pub mod instructions;
|
||||
pub mod isa;
|
||||
|
||||
@@ -32,13 +32,6 @@ pub(crate) struct Stack {
|
||||
pub regclass: RegClassIndex,
|
||||
}
|
||||
|
||||
impl Stack {
|
||||
pub fn stack_base_mask(self) -> &'static str {
|
||||
// TODO: Make this configurable instead of just using the SP.
|
||||
"StackBaseMask(1)"
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Hash, PartialEq)]
|
||||
pub(crate) struct BranchRange {
|
||||
pub inst_size: u64,
|
||||
|
||||
Reference in New Issue
Block a user