Never use the first vararg as typevar operand

If an instruction only takes varargs as values, it may have no arguments
at all.
This commit is contained in:
bjorn3
2021-10-31 18:47:13 +01:00
parent 795e381be4
commit 74261ccd79
2 changed files with 16 additions and 18 deletions

View File

@@ -133,7 +133,7 @@ impl InstructionFormatBuilder {
pub fn typevar_operand(mut self, operand_index: usize) -> Self { pub fn typevar_operand(mut self, operand_index: usize) -> Self {
assert!(self.typevar_operand.is_none()); assert!(self.typevar_operand.is_none());
assert!(self.has_value_list || operand_index < self.num_value_operands); assert!(operand_index < self.num_value_operands);
self.typevar_operand = Some(operand_index); self.typevar_operand = Some(operand_index);
self self
} }
@@ -141,7 +141,7 @@ impl InstructionFormatBuilder {
pub fn build(self) -> Rc<InstructionFormat> { pub fn build(self) -> Rc<InstructionFormat> {
let typevar_operand = if self.typevar_operand.is_some() { let typevar_operand = if self.typevar_operand.is_some() {
self.typevar_operand self.typevar_operand
} else if self.has_value_list || self.num_value_operands > 0 { } else if self.num_value_operands > 0 {
// Default to the first value operand, if there's one. // Default to the first value operand, if there's one.
Some(0) Some(0)
} else { } else {

View File

@@ -75,14 +75,12 @@ fn gen_instruction_data(formats: &[&InstructionFormat], fmt: &mut Formatter) {
fmtln!(fmt, "{} {{", format.name); fmtln!(fmt, "{} {{", format.name);
fmt.indent(|fmt| { fmt.indent(|fmt| {
fmt.line("opcode: Opcode,"); fmt.line("opcode: Opcode,");
if format.typevar_operand.is_some() { if format.has_value_list {
if format.has_value_list { fmt.line("args: ValueList,");
fmt.line("args: ValueList,"); } else if format.num_value_operands == 1 {
} else if format.num_value_operands == 1 { fmt.line("arg: Value,");
fmt.line("arg: Value,"); } else if format.num_value_operands > 0 {
} else { fmtln!(fmt, "args: [Value; {}],", format.num_value_operands);
fmtln!(fmt, "args: [Value; {}],", format.num_value_operands);
}
} }
for field in &format.imm_fields { for field in &format.imm_fields {
fmtln!(fmt, "{}: {},", field.member, field.kind.rust_type); fmtln!(fmt, "{}: {},", field.member, field.kind.rust_type);
@@ -287,17 +285,17 @@ fn gen_instruction_data_impl(formats: &[&InstructionFormat], fmt: &mut Formatter
let name = format!("&Self::{}", format.name); let name = format!("&Self::{}", format.name);
let mut members = vec!["opcode"]; let mut members = vec!["opcode"];
let args_eq = if format.typevar_operand.is_none() { let args_eq = if format.has_value_list {
None
} else if format.has_value_list {
members.push("args"); members.push("args");
Some("args1.as_slice(pool) == args2.as_slice(pool)") Some("args1.as_slice(pool) == args2.as_slice(pool)")
} else if format.num_value_operands == 1 { } else if format.num_value_operands == 1 {
members.push("arg"); members.push("arg");
Some("arg1 == arg2") Some("arg1 == arg2")
} else { } else if format.num_value_operands > 0 {
members.push("args"); members.push("args");
Some("args1 == args2") Some("args1 == args2")
} else {
None
}; };
for field in &format.imm_fields { for field in &format.imm_fields {
@@ -339,17 +337,17 @@ fn gen_instruction_data_impl(formats: &[&InstructionFormat], fmt: &mut Formatter
let name = format!("Self::{}", format.name); let name = format!("Self::{}", format.name);
let mut members = vec!["opcode"]; let mut members = vec!["opcode"];
let args = if format.typevar_operand.is_none() { let args = if format.has_value_list {
"&()"
} else if format.has_value_list {
members.push("ref args"); members.push("ref args");
"args.as_slice(pool)" "args.as_slice(pool)"
} else if format.num_value_operands == 1 { } else if format.num_value_operands == 1 {
members.push("ref arg"); members.push("ref arg");
"arg" "arg"
} else { } else if format.num_value_operands > 0{
members.push("ref args"); members.push("ref args");
"args" "args"
} else {
"&()"
}; };
for field in &format.imm_fields { for field in &format.imm_fields {