[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>,
}
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 {
pub fn new(name: &'static str) -> Self {
Self {
@@ -131,12 +110,21 @@ impl InstructionFormatBuilder {
self
}
pub fn imm(mut self, param: impl Into<ImmParameter>) -> Self {
let imm_param = param.into();
pub fn imm(mut self, operand_kind: &OperandKind) -> Self {
let field = FormatField {
immnum: self.imm_fields.len(),
kind: imm_param.kind,
member: imm_param.member,
kind: operand_kind.clone(),
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

View File

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