[meta] Split FormatBuilder::imm to avoid the extra Into<> parameter type;

This commit is contained in:
Benjamin Bouvier
2019-09-03 16:32:32 +02:00
parent 8a9384f869
commit 0acddc08ea
2 changed files with 28 additions and 36 deletions

View File

@@ -89,27 +89,6 @@ pub struct InstructionFormatBuilder {
typevar_operand: Option<usize>, typevar_operand: Option<usize>,
} }
pub struct ImmParameter {
kind: OperandKind,
member: &'static str,
}
impl Into<ImmParameter> for (&'static str, &OperandKind) {
fn into(self) -> ImmParameter {
ImmParameter {
kind: self.1.clone(),
member: self.0,
}
}
}
impl Into<ImmParameter> for &OperandKind {
fn into(self) -> ImmParameter {
ImmParameter {
kind: self.clone(),
member: self.default_member.unwrap(),
}
}
}
impl InstructionFormatBuilder { impl InstructionFormatBuilder {
pub fn new(name: &'static str) -> Self { pub fn new(name: &'static str) -> Self {
Self { Self {
@@ -131,12 +110,21 @@ impl InstructionFormatBuilder {
self self
} }
pub fn imm(mut self, param: impl Into<ImmParameter>) -> Self { pub fn imm(mut self, operand_kind: &OperandKind) -> Self {
let imm_param = param.into();
let field = FormatField { let field = FormatField {
immnum: self.imm_fields.len(), immnum: self.imm_fields.len(),
kind: imm_param.kind, kind: operand_kind.clone(),
member: imm_param.member, member: operand_kind.default_member.unwrap(),
};
self.imm_fields.push(field);
self
}
pub fn imm_with_name(mut self, member: &'static str, operand_kind: &OperandKind) -> Self {
let field = FormatField {
immnum: self.imm_fields.len(),
kind: operand_kind.clone(),
member,
}; };
self.imm_fields.push(field); self.imm_fields.push(field);
self self

View File

@@ -60,10 +60,14 @@ pub fn define(immediates: &OperandKinds, entities: &OperandKinds) -> FormatRegis
registry.insert( registry.insert(
Builder::new("InsertLane") Builder::new("InsertLane")
.value() .value()
.imm(("lane", uimm8)) .imm_with_name("lane", uimm8)
.value(), .value(),
); );
registry.insert(Builder::new("ExtractLane").value().imm(("lane", uimm8))); registry.insert(
Builder::new("ExtractLane")
.value()
.imm_with_name("lane", uimm8),
);
registry.insert(Builder::new("IntCompare").imm(intcc).value().value()); registry.insert(Builder::new("IntCompare").imm(intcc).value().value());
registry.insert(Builder::new("IntCompareImm").imm(intcc).value().imm(imm64)); registry.insert(Builder::new("IntCompareImm").imm(intcc).value().imm(imm64));
@@ -151,26 +155,26 @@ pub fn define(immediates: &OperandKinds, entities: &OperandKinds) -> FormatRegis
registry.insert( registry.insert(
Builder::new("RegMove") Builder::new("RegMove")
.value() .value()
.imm(("src", regunit)) .imm_with_name("src", regunit)
.imm(("dst", regunit)), .imm_with_name("dst", regunit),
); );
registry.insert( registry.insert(
Builder::new("CopySpecial") Builder::new("CopySpecial")
.imm(("src", regunit)) .imm_with_name("src", regunit)
.imm(("dst", regunit)), .imm_with_name("dst", regunit),
); );
registry.insert(Builder::new("CopyToSsa").imm(("src", regunit))); registry.insert(Builder::new("CopyToSsa").imm_with_name("src", regunit));
registry.insert( registry.insert(
Builder::new("RegSpill") Builder::new("RegSpill")
.value() .value()
.imm(("src", regunit)) .imm_with_name("src", regunit)
.imm(("dst", stack_slot)), .imm_with_name("dst", stack_slot),
); );
registry.insert( registry.insert(
Builder::new("RegFill") Builder::new("RegFill")
.value() .value()
.imm(("src", stack_slot)) .imm_with_name("src", stack_slot)
.imm(("dst", regunit)), .imm_with_name("dst", regunit),
); );
registry.insert(Builder::new("Trap").imm(trapcode)); registry.insert(Builder::new("Trap").imm(trapcode));