[meta] Split FormatBuilder::imm to avoid the extra Into<> parameter type;
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|||||||
Reference in New Issue
Block a user