diff --git a/cranelift/codegen/meta/src/cdsl/instructions.rs b/cranelift/codegen/meta/src/cdsl/instructions.rs index 42cf0e3af4..5a7a1931ad 100644 --- a/cranelift/codegen/meta/src/cdsl/instructions.rs +++ b/cranelift/codegen/meta/src/cdsl/instructions.rs @@ -1,5 +1,3 @@ -use cranelift_entity::{entity_impl, PrimaryMap}; - use std::fmt; use std::rc::Rc; @@ -9,11 +7,7 @@ use crate::cdsl::operands::Operand; use crate::cdsl::type_inference::Constraint; use crate::cdsl::typevar::TypeVar; -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)] -pub(crate) struct OpcodeNumber(u32); -entity_impl!(OpcodeNumber); - -pub(crate) type AllInstructions = PrimaryMap; +pub(crate) type AllInstructions = Vec; pub(crate) struct InstructionGroupBuilder<'all_inst> { all_instructions: &'all_inst mut AllInstructions, @@ -25,8 +19,7 @@ impl<'all_inst> InstructionGroupBuilder<'all_inst> { } pub fn push(&mut self, builder: InstructionBuilder) { - let opcode_number = OpcodeNumber(self.all_instructions.next_key().as_u32()); - let inst = builder.build(opcode_number); + let inst = builder.build(); self.all_instructions.push(inst); } } @@ -42,7 +35,6 @@ pub(crate) struct InstructionContent { /// Instruction mnemonic, also becomes opcode name. pub name: String, pub camel_name: String, - pub opcode_number: OpcodeNumber, /// Documentation string. pub doc: String, @@ -240,7 +232,7 @@ impl InstructionBuilder { self } - fn build(self, opcode_number: OpcodeNumber) -> Instruction { + fn build(self) -> Instruction { let operands_in = self.operands_in.unwrap_or_else(Vec::new); let operands_out = self.operands_out.unwrap_or_else(Vec::new); @@ -275,7 +267,6 @@ impl InstructionBuilder { Rc::new(InstructionContent { name: self.name, camel_name, - opcode_number, doc: self.doc, operands_in, operands_out, diff --git a/cranelift/codegen/meta/src/gen_inst.rs b/cranelift/codegen/meta/src/gen_inst.rs index fb10dff8cb..1b3b42d73a 100644 --- a/cranelift/codegen/meta/src/gen_inst.rs +++ b/cranelift/codegen/meta/src/gen_inst.rs @@ -2,7 +2,6 @@ use std::fmt; use cranelift_codegen_shared::constant_hash; -use cranelift_entity::EntityRef; use crate::cdsl::camel_case; use crate::cdsl::formats::InstructionFormat; @@ -388,7 +387,7 @@ fn gen_bool_accessor bool>( fmtln!(fmt, "pub fn {}(self) -> bool {{", name); fmt.indent(|fmt| { let mut m = Match::new("self"); - for inst in all_inst.values() { + for inst in all_inst.iter() { if get_attr(inst) { m.arm_no_fields(format!("Self::{}", inst.camel_name), "true"); } @@ -424,7 +423,7 @@ fn gen_opcodes(all_inst: &AllInstructions, fmt: &mut Formatter) { fmt.line("pub enum Opcode {"); fmt.indent(|fmt| { let mut is_first_opcode = true; - for inst in all_inst.values() { + for inst in all_inst.iter() { fmt.doc_comment(format!("`{}`. ({})", inst, inst.format.name)); // Document polymorphism. @@ -440,8 +439,6 @@ fn gen_opcodes(all_inst: &AllInstructions, fmt: &mut Formatter) { // Enum variant itself. if is_first_opcode { - assert!(inst.opcode_number.index() == 0); - // TODO the python crate requires opcode numbers to start from one. fmtln!(fmt, "{} = 1,", inst.camel_name); is_first_opcode = false; } else { @@ -535,7 +532,7 @@ fn gen_opcodes(all_inst: &AllInstructions, fmt: &mut Formatter) { all_inst.len() ); fmt.indent(|fmt| { - for inst in all_inst.values() { + for inst in all_inst.iter() { fmtln!( fmt, "InstructionFormat::{}, // {}", @@ -551,7 +548,7 @@ fn gen_opcodes(all_inst: &AllInstructions, fmt: &mut Formatter) { fmt.line("fn opcode_name(opc: Opcode) -> &\'static str {"); fmt.indent(|fmt| { let mut m = Match::new("opc"); - for inst in all_inst.values() { + for inst in all_inst.iter() { m.arm_no_fields( format!("Opcode::{}", inst.camel_name), format!("\"{}\"", inst.name), @@ -563,7 +560,7 @@ fn gen_opcodes(all_inst: &AllInstructions, fmt: &mut Formatter) { fmt.empty_line(); // Generate an opcode hash table for looking up opcodes by name. - let hash_table = constant_hash::generate_table(all_inst.values(), all_inst.len(), |inst| { + let hash_table = constant_hash::generate_table(all_inst.iter(), all_inst.len(), |inst| { constant_hash::simple_hash(&inst.name) }); fmtln!( @@ -736,7 +733,7 @@ fn gen_type_constraints(all_inst: &AllInstructions, fmt: &mut Formatter) { all_inst.len() ); fmt.indent(|fmt| { - for inst in all_inst.values() { + for inst in all_inst.iter() { let (ctrl_typevar, ctrl_typeset) = if let Some(poly) = &inst.polymorphic_info { let index = type_sets.add(&*poly.ctrl_typevar.get_raw_typeset()); (Some(&poly.ctrl_typevar), index) @@ -1130,7 +1127,7 @@ fn gen_builder( ); fmt.line("pub trait InstBuilder<'f>: InstBuilderBase<'f> {"); fmt.indent(|fmt| { - for inst in instructions.values() { + for inst in instructions.iter() { gen_inst_builder(inst, &*inst.format, fmt); fmt.empty_line(); } diff --git a/cranelift/codegen/meta/src/shared/mod.rs b/cranelift/codegen/meta/src/shared/mod.rs index 549ae7cf99..5d530b27a4 100644 --- a/cranelift/codegen/meta/src/shared/mod.rs +++ b/cranelift/codegen/meta/src/shared/mod.rs @@ -54,7 +54,7 @@ impl Definitions { // of immediate fields. let mut format_structures: HashMap = HashMap::new(); - for inst in self.all_instructions.values() { + for inst in self.all_instructions.iter() { // Check name. if let Some(existing_format) = format_names.get(&inst.format.name) { assert!(