From cd1b2c0af029f65742927b75e9ef9769f2e8d121 Mon Sep 17 00:00:00 2001 From: Benjamin Bouvier Date: Wed, 28 Aug 2019 17:02:10 +0200 Subject: [PATCH] [meta] Try to use {prefix+number} when looking up a register by name; This makes it possible to look up registers like r15 on x86. --- cranelift/codegen/meta/src/cdsl/regs.rs | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/cranelift/codegen/meta/src/cdsl/regs.rs b/cranelift/codegen/meta/src/cdsl/regs.rs index 60bf8f5818..e7a3464d10 100644 --- a/cranelift/codegen/meta/src/cdsl/regs.rs +++ b/cranelift/codegen/meta/src/cdsl/regs.rs @@ -43,10 +43,26 @@ impl RegBank { // Try to match without the bank prefix. assert!(name.starts_with(self.prefix)); let name_without_prefix = &name[self.prefix.len()..]; - self.names + if let Some(found) = self + .names .iter() .position(|®_name| reg_name == name_without_prefix) - .expect(&format!("invalid register name {}", name)) + { + found + } else { + // Ultimate try: try to parse a number and use this in the array, eg r15 on x86. + if let Ok(as_num) = name_without_prefix.parse::() { + assert!( + (as_num - self.first_unit) < self.units, + "trying to get {}, but bank only has {} registers!", + name, + self.units + ); + (as_num - self.first_unit) as usize + } else { + panic!("invalid register name {}", name); + } + } }; self.first_unit + (unit as u8) }