ISLE: Fix clif.isle InstructionData entries
Attempt to match a Jump instruction in ISLE will currently lead to the generated files not compiling. This is because the definition of the InstructionData enum in clif.isle does not match the actual type used in Rust code. Specifically, clif.isle erroneously omits the ValueList variable-length argument entry if the format does not use a typevar operand. This is the case for Jump and a few other formats. The problem is caused by a bug in the gen_isle routine in meta/src/gen_inst.rs.
This commit is contained in:
@@ -1200,14 +1200,12 @@ fn gen_isle(formats: &[&InstructionFormat], instructions: &AllInstructions, fmt:
|
|||||||
fmt.indent(|fmt| {
|
fmt.indent(|fmt| {
|
||||||
for format in formats {
|
for format in formats {
|
||||||
let mut s = format!("({} (opcode Opcode)", format.name);
|
let mut s = format!("({} (opcode Opcode)", format.name);
|
||||||
if format.typevar_operand.is_some() {
|
if format.has_value_list {
|
||||||
if format.has_value_list {
|
s.push_str(" (args ValueList)");
|
||||||
s.push_str(" (args ValueList)");
|
} else if format.num_value_operands == 1 {
|
||||||
} else if format.num_value_operands == 1 {
|
s.push_str(" (arg Value)");
|
||||||
s.push_str(" (arg Value)");
|
} else if format.num_value_operands > 1 {
|
||||||
} else {
|
write!(&mut s, " (args ValueArray{})", format.num_value_operands).unwrap();
|
||||||
write!(&mut s, " (args ValueArray{})", format.num_value_operands).unwrap();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
for field in &format.imm_fields {
|
for field in &format.imm_fields {
|
||||||
write!(
|
write!(
|
||||||
@@ -1269,60 +1267,58 @@ fn gen_isle(formats: &[&InstructionFormat], instructions: &AllInstructions, fmt:
|
|||||||
);
|
);
|
||||||
|
|
||||||
// Value and varargs operands.
|
// Value and varargs operands.
|
||||||
if inst.format.typevar_operand.is_some() {
|
if inst.format.has_value_list {
|
||||||
if inst.format.has_value_list {
|
// The instruction format uses a value list, but the
|
||||||
// The instruction format uses a value list, but the
|
// instruction itself might have not only a `&[Value]`
|
||||||
// instruction itself might have not only a `&[Value]`
|
// varargs operand, but also one or more `Value` operands as
|
||||||
// varargs operand, but also one or more `Value` operands as
|
// well. If this is the case, then we need to read them off
|
||||||
// well. If this is the case, then we need to read them off
|
// the front of the `ValueList`.
|
||||||
// the front of the `ValueList`.
|
let values: Vec<_> = inst
|
||||||
let values: Vec<_> = inst
|
.operands_in
|
||||||
.operands_in
|
.iter()
|
||||||
.iter()
|
.filter(|o| o.is_value())
|
||||||
.filter(|o| o.is_value())
|
.map(|o| o.name)
|
||||||
.map(|o| o.name)
|
.collect();
|
||||||
.collect();
|
let varargs = inst
|
||||||
let varargs = inst
|
.operands_in
|
||||||
.operands_in
|
.iter()
|
||||||
.iter()
|
.find(|o| o.is_varargs())
|
||||||
.find(|o| o.is_varargs())
|
.unwrap()
|
||||||
.unwrap()
|
.name;
|
||||||
.name;
|
if values.is_empty() {
|
||||||
if values.is_empty() {
|
write!(&mut s, " (value_list_slice {})", varargs).unwrap();
|
||||||
write!(&mut s, " (value_list_slice {})", varargs).unwrap();
|
|
||||||
} else {
|
|
||||||
write!(
|
|
||||||
&mut s,
|
|
||||||
" (unwrap_head_value_list_{} {} {})",
|
|
||||||
values.len(),
|
|
||||||
values.join(" "),
|
|
||||||
varargs
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
}
|
|
||||||
} else if inst.format.num_value_operands == 1 {
|
|
||||||
write!(
|
|
||||||
&mut s,
|
|
||||||
" {}",
|
|
||||||
inst.operands_in.iter().find(|o| o.is_value()).unwrap().name
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
} else {
|
} else {
|
||||||
let values = inst
|
|
||||||
.operands_in
|
|
||||||
.iter()
|
|
||||||
.filter(|o| o.is_value())
|
|
||||||
.map(|o| o.name)
|
|
||||||
.collect::<Vec<_>>();
|
|
||||||
assert_eq!(values.len(), inst.format.num_value_operands);
|
|
||||||
let values = values.join(" ");
|
|
||||||
write!(
|
write!(
|
||||||
&mut s,
|
&mut s,
|
||||||
" (value_array_{} {})",
|
" (unwrap_head_value_list_{} {} {})",
|
||||||
inst.format.num_value_operands, values,
|
values.len(),
|
||||||
|
values.join(" "),
|
||||||
|
varargs
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
|
} else if inst.format.num_value_operands == 1 {
|
||||||
|
write!(
|
||||||
|
&mut s,
|
||||||
|
" {}",
|
||||||
|
inst.operands_in.iter().find(|o| o.is_value()).unwrap().name
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
} else if inst.format.num_value_operands > 1 {
|
||||||
|
let values = inst
|
||||||
|
.operands_in
|
||||||
|
.iter()
|
||||||
|
.filter(|o| o.is_value())
|
||||||
|
.map(|o| o.name)
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
assert_eq!(values.len(), inst.format.num_value_operands);
|
||||||
|
let values = values.join(" ");
|
||||||
|
write!(
|
||||||
|
&mut s,
|
||||||
|
" (value_array_{} {})",
|
||||||
|
inst.format.num_value_operands, values,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Immediates.
|
// Immediates.
|
||||||
|
|||||||
@@ -349,7 +349,7 @@
|
|||||||
(BranchIcmp (opcode Opcode) (args ValueList) (cond IntCC) (destination Block))
|
(BranchIcmp (opcode Opcode) (args ValueList) (cond IntCC) (destination Block))
|
||||||
(BranchInt (opcode Opcode) (args ValueList) (cond IntCC) (destination Block))
|
(BranchInt (opcode Opcode) (args ValueList) (cond IntCC) (destination Block))
|
||||||
(BranchTable (opcode Opcode) (arg Value) (destination Block) (table JumpTable))
|
(BranchTable (opcode Opcode) (arg Value) (destination Block) (table JumpTable))
|
||||||
(Call (opcode Opcode) (func_ref FuncRef))
|
(Call (opcode Opcode) (args ValueList) (func_ref FuncRef))
|
||||||
(CallIndirect (opcode Opcode) (args ValueList) (sig_ref SigRef))
|
(CallIndirect (opcode Opcode) (args ValueList) (sig_ref SigRef))
|
||||||
(CondTrap (opcode Opcode) (arg Value) (code TrapCode))
|
(CondTrap (opcode Opcode) (arg Value) (code TrapCode))
|
||||||
(FloatCompare (opcode Opcode) (args ValueArray2) (cond FloatCC))
|
(FloatCompare (opcode Opcode) (args ValueArray2) (cond FloatCC))
|
||||||
@@ -362,11 +362,11 @@
|
|||||||
(IntCond (opcode Opcode) (arg Value) (cond IntCC))
|
(IntCond (opcode Opcode) (arg Value) (cond IntCC))
|
||||||
(IntCondTrap (opcode Opcode) (arg Value) (cond IntCC) (code TrapCode))
|
(IntCondTrap (opcode Opcode) (arg Value) (cond IntCC) (code TrapCode))
|
||||||
(IntSelect (opcode Opcode) (args ValueArray3) (cond IntCC))
|
(IntSelect (opcode Opcode) (args ValueArray3) (cond IntCC))
|
||||||
(Jump (opcode Opcode) (destination Block))
|
(Jump (opcode Opcode) (args ValueList) (destination Block))
|
||||||
(Load (opcode Opcode) (arg Value) (flags MemFlags) (offset Offset32))
|
(Load (opcode Opcode) (arg Value) (flags MemFlags) (offset Offset32))
|
||||||
(LoadComplex (opcode Opcode) (flags MemFlags) (offset Offset32))
|
(LoadComplex (opcode Opcode) (args ValueList) (flags MemFlags) (offset Offset32))
|
||||||
(LoadNoOffset (opcode Opcode) (arg Value) (flags MemFlags))
|
(LoadNoOffset (opcode Opcode) (arg Value) (flags MemFlags))
|
||||||
(MultiAry (opcode Opcode))
|
(MultiAry (opcode Opcode) (args ValueList))
|
||||||
(NullAry (opcode Opcode))
|
(NullAry (opcode Opcode))
|
||||||
(Shuffle (opcode Opcode) (args ValueArray2) (imm Immediate))
|
(Shuffle (opcode Opcode) (args ValueArray2) (imm Immediate))
|
||||||
(StackLoad (opcode Opcode) (stack_slot StackSlot) (offset Offset32))
|
(StackLoad (opcode Opcode) (stack_slot StackSlot) (offset Offset32))
|
||||||
@@ -393,7 +393,7 @@
|
|||||||
(decl jump (Block ValueSlice) Inst)
|
(decl jump (Block ValueSlice) Inst)
|
||||||
(extractor
|
(extractor
|
||||||
(jump block args)
|
(jump block args)
|
||||||
(inst_data (InstructionData.Jump (Opcode.Jump) block))
|
(inst_data (InstructionData.Jump (Opcode.Jump) (value_list_slice args) block))
|
||||||
)
|
)
|
||||||
|
|
||||||
(decl brz (Value Block ValueSlice) Inst)
|
(decl brz (Value Block ValueSlice) Inst)
|
||||||
@@ -483,19 +483,19 @@
|
|||||||
(decl return (ValueSlice) Inst)
|
(decl return (ValueSlice) Inst)
|
||||||
(extractor
|
(extractor
|
||||||
(return rvals)
|
(return rvals)
|
||||||
(inst_data (InstructionData.MultiAry (Opcode.Return)))
|
(inst_data (InstructionData.MultiAry (Opcode.Return) (value_list_slice rvals)))
|
||||||
)
|
)
|
||||||
|
|
||||||
(decl fallthrough_return (ValueSlice) Inst)
|
(decl fallthrough_return (ValueSlice) Inst)
|
||||||
(extractor
|
(extractor
|
||||||
(fallthrough_return rvals)
|
(fallthrough_return rvals)
|
||||||
(inst_data (InstructionData.MultiAry (Opcode.FallthroughReturn)))
|
(inst_data (InstructionData.MultiAry (Opcode.FallthroughReturn) (value_list_slice rvals)))
|
||||||
)
|
)
|
||||||
|
|
||||||
(decl call (FuncRef ValueSlice) Inst)
|
(decl call (FuncRef ValueSlice) Inst)
|
||||||
(extractor
|
(extractor
|
||||||
(call FN args)
|
(call FN args)
|
||||||
(inst_data (InstructionData.Call (Opcode.Call) FN))
|
(inst_data (InstructionData.Call (Opcode.Call) (value_list_slice args) FN))
|
||||||
)
|
)
|
||||||
|
|
||||||
(decl call_indirect (SigRef Value ValueSlice) Inst)
|
(decl call_indirect (SigRef Value ValueSlice) Inst)
|
||||||
@@ -597,7 +597,7 @@
|
|||||||
(decl load_complex (MemFlags ValueSlice Offset32) Inst)
|
(decl load_complex (MemFlags ValueSlice Offset32) Inst)
|
||||||
(extractor
|
(extractor
|
||||||
(load_complex MemFlags args Offset)
|
(load_complex MemFlags args Offset)
|
||||||
(inst_data (InstructionData.LoadComplex (Opcode.LoadComplex) MemFlags Offset))
|
(inst_data (InstructionData.LoadComplex (Opcode.LoadComplex) (value_list_slice args) MemFlags Offset))
|
||||||
)
|
)
|
||||||
|
|
||||||
(decl store (MemFlags Value Value Offset32) Inst)
|
(decl store (MemFlags Value Value Offset32) Inst)
|
||||||
@@ -621,7 +621,7 @@
|
|||||||
(decl uload8_complex (MemFlags ValueSlice Offset32) Inst)
|
(decl uload8_complex (MemFlags ValueSlice Offset32) Inst)
|
||||||
(extractor
|
(extractor
|
||||||
(uload8_complex MemFlags args Offset)
|
(uload8_complex MemFlags args Offset)
|
||||||
(inst_data (InstructionData.LoadComplex (Opcode.Uload8Complex) MemFlags Offset))
|
(inst_data (InstructionData.LoadComplex (Opcode.Uload8Complex) (value_list_slice args) MemFlags Offset))
|
||||||
)
|
)
|
||||||
|
|
||||||
(decl sload8 (MemFlags Value Offset32) Inst)
|
(decl sload8 (MemFlags Value Offset32) Inst)
|
||||||
@@ -633,7 +633,7 @@
|
|||||||
(decl sload8_complex (MemFlags ValueSlice Offset32) Inst)
|
(decl sload8_complex (MemFlags ValueSlice Offset32) Inst)
|
||||||
(extractor
|
(extractor
|
||||||
(sload8_complex MemFlags args Offset)
|
(sload8_complex MemFlags args Offset)
|
||||||
(inst_data (InstructionData.LoadComplex (Opcode.Sload8Complex) MemFlags Offset))
|
(inst_data (InstructionData.LoadComplex (Opcode.Sload8Complex) (value_list_slice args) MemFlags Offset))
|
||||||
)
|
)
|
||||||
|
|
||||||
(decl istore8 (MemFlags Value Value Offset32) Inst)
|
(decl istore8 (MemFlags Value Value Offset32) Inst)
|
||||||
@@ -657,7 +657,7 @@
|
|||||||
(decl uload16_complex (MemFlags ValueSlice Offset32) Inst)
|
(decl uload16_complex (MemFlags ValueSlice Offset32) Inst)
|
||||||
(extractor
|
(extractor
|
||||||
(uload16_complex MemFlags args Offset)
|
(uload16_complex MemFlags args Offset)
|
||||||
(inst_data (InstructionData.LoadComplex (Opcode.Uload16Complex) MemFlags Offset))
|
(inst_data (InstructionData.LoadComplex (Opcode.Uload16Complex) (value_list_slice args) MemFlags Offset))
|
||||||
)
|
)
|
||||||
|
|
||||||
(decl sload16 (MemFlags Value Offset32) Inst)
|
(decl sload16 (MemFlags Value Offset32) Inst)
|
||||||
@@ -669,7 +669,7 @@
|
|||||||
(decl sload16_complex (MemFlags ValueSlice Offset32) Inst)
|
(decl sload16_complex (MemFlags ValueSlice Offset32) Inst)
|
||||||
(extractor
|
(extractor
|
||||||
(sload16_complex MemFlags args Offset)
|
(sload16_complex MemFlags args Offset)
|
||||||
(inst_data (InstructionData.LoadComplex (Opcode.Sload16Complex) MemFlags Offset))
|
(inst_data (InstructionData.LoadComplex (Opcode.Sload16Complex) (value_list_slice args) MemFlags Offset))
|
||||||
)
|
)
|
||||||
|
|
||||||
(decl istore16 (MemFlags Value Value Offset32) Inst)
|
(decl istore16 (MemFlags Value Value Offset32) Inst)
|
||||||
@@ -693,7 +693,7 @@
|
|||||||
(decl uload32_complex (MemFlags ValueSlice Offset32) Inst)
|
(decl uload32_complex (MemFlags ValueSlice Offset32) Inst)
|
||||||
(extractor
|
(extractor
|
||||||
(uload32_complex MemFlags args Offset)
|
(uload32_complex MemFlags args Offset)
|
||||||
(inst_data (InstructionData.LoadComplex (Opcode.Uload32Complex) MemFlags Offset))
|
(inst_data (InstructionData.LoadComplex (Opcode.Uload32Complex) (value_list_slice args) MemFlags Offset))
|
||||||
)
|
)
|
||||||
|
|
||||||
(decl sload32 (MemFlags Value Offset32) Inst)
|
(decl sload32 (MemFlags Value Offset32) Inst)
|
||||||
@@ -705,7 +705,7 @@
|
|||||||
(decl sload32_complex (MemFlags ValueSlice Offset32) Inst)
|
(decl sload32_complex (MemFlags ValueSlice Offset32) Inst)
|
||||||
(extractor
|
(extractor
|
||||||
(sload32_complex MemFlags args Offset)
|
(sload32_complex MemFlags args Offset)
|
||||||
(inst_data (InstructionData.LoadComplex (Opcode.Sload32Complex) MemFlags Offset))
|
(inst_data (InstructionData.LoadComplex (Opcode.Sload32Complex) (value_list_slice args) MemFlags Offset))
|
||||||
)
|
)
|
||||||
|
|
||||||
(decl istore32 (MemFlags Value Value Offset32) Inst)
|
(decl istore32 (MemFlags Value Value Offset32) Inst)
|
||||||
@@ -729,7 +729,7 @@
|
|||||||
(decl uload8x8_complex (MemFlags ValueSlice Offset32) Inst)
|
(decl uload8x8_complex (MemFlags ValueSlice Offset32) Inst)
|
||||||
(extractor
|
(extractor
|
||||||
(uload8x8_complex MemFlags args Offset)
|
(uload8x8_complex MemFlags args Offset)
|
||||||
(inst_data (InstructionData.LoadComplex (Opcode.Uload8x8Complex) MemFlags Offset))
|
(inst_data (InstructionData.LoadComplex (Opcode.Uload8x8Complex) (value_list_slice args) MemFlags Offset))
|
||||||
)
|
)
|
||||||
|
|
||||||
(decl sload8x8 (MemFlags Value Offset32) Inst)
|
(decl sload8x8 (MemFlags Value Offset32) Inst)
|
||||||
@@ -741,7 +741,7 @@
|
|||||||
(decl sload8x8_complex (MemFlags ValueSlice Offset32) Inst)
|
(decl sload8x8_complex (MemFlags ValueSlice Offset32) Inst)
|
||||||
(extractor
|
(extractor
|
||||||
(sload8x8_complex MemFlags args Offset)
|
(sload8x8_complex MemFlags args Offset)
|
||||||
(inst_data (InstructionData.LoadComplex (Opcode.Sload8x8Complex) MemFlags Offset))
|
(inst_data (InstructionData.LoadComplex (Opcode.Sload8x8Complex) (value_list_slice args) MemFlags Offset))
|
||||||
)
|
)
|
||||||
|
|
||||||
(decl uload16x4 (MemFlags Value Offset32) Inst)
|
(decl uload16x4 (MemFlags Value Offset32) Inst)
|
||||||
@@ -753,7 +753,7 @@
|
|||||||
(decl uload16x4_complex (MemFlags ValueSlice Offset32) Inst)
|
(decl uload16x4_complex (MemFlags ValueSlice Offset32) Inst)
|
||||||
(extractor
|
(extractor
|
||||||
(uload16x4_complex MemFlags args Offset)
|
(uload16x4_complex MemFlags args Offset)
|
||||||
(inst_data (InstructionData.LoadComplex (Opcode.Uload16x4Complex) MemFlags Offset))
|
(inst_data (InstructionData.LoadComplex (Opcode.Uload16x4Complex) (value_list_slice args) MemFlags Offset))
|
||||||
)
|
)
|
||||||
|
|
||||||
(decl sload16x4 (MemFlags Value Offset32) Inst)
|
(decl sload16x4 (MemFlags Value Offset32) Inst)
|
||||||
@@ -765,7 +765,7 @@
|
|||||||
(decl sload16x4_complex (MemFlags ValueSlice Offset32) Inst)
|
(decl sload16x4_complex (MemFlags ValueSlice Offset32) Inst)
|
||||||
(extractor
|
(extractor
|
||||||
(sload16x4_complex MemFlags args Offset)
|
(sload16x4_complex MemFlags args Offset)
|
||||||
(inst_data (InstructionData.LoadComplex (Opcode.Sload16x4Complex) MemFlags Offset))
|
(inst_data (InstructionData.LoadComplex (Opcode.Sload16x4Complex) (value_list_slice args) MemFlags Offset))
|
||||||
)
|
)
|
||||||
|
|
||||||
(decl uload32x2 (MemFlags Value Offset32) Inst)
|
(decl uload32x2 (MemFlags Value Offset32) Inst)
|
||||||
@@ -777,7 +777,7 @@
|
|||||||
(decl uload32x2_complex (MemFlags ValueSlice Offset32) Inst)
|
(decl uload32x2_complex (MemFlags ValueSlice Offset32) Inst)
|
||||||
(extractor
|
(extractor
|
||||||
(uload32x2_complex MemFlags args Offset)
|
(uload32x2_complex MemFlags args Offset)
|
||||||
(inst_data (InstructionData.LoadComplex (Opcode.Uload32x2Complex) MemFlags Offset))
|
(inst_data (InstructionData.LoadComplex (Opcode.Uload32x2Complex) (value_list_slice args) MemFlags Offset))
|
||||||
)
|
)
|
||||||
|
|
||||||
(decl sload32x2 (MemFlags Value Offset32) Inst)
|
(decl sload32x2 (MemFlags Value Offset32) Inst)
|
||||||
@@ -789,7 +789,7 @@
|
|||||||
(decl sload32x2_complex (MemFlags ValueSlice Offset32) Inst)
|
(decl sload32x2_complex (MemFlags ValueSlice Offset32) Inst)
|
||||||
(extractor
|
(extractor
|
||||||
(sload32x2_complex MemFlags args Offset)
|
(sload32x2_complex MemFlags args Offset)
|
||||||
(inst_data (InstructionData.LoadComplex (Opcode.Sload32x2Complex) MemFlags Offset))
|
(inst_data (InstructionData.LoadComplex (Opcode.Sload32x2Complex) (value_list_slice args) MemFlags Offset))
|
||||||
)
|
)
|
||||||
|
|
||||||
(decl stack_load (StackSlot Offset32) Inst)
|
(decl stack_load (StackSlot Offset32) Inst)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
src/clif.isle f176ef3bba99365
|
src/clif.isle 9ea75a6f790b5c03
|
||||||
src/prelude.isle 51d2aef2566c1c96
|
src/prelude.isle 51d2aef2566c1c96
|
||||||
src/isa/aarch64/inst.isle f946561093de4ff5
|
src/isa/aarch64/inst.isle f946561093de4ff5
|
||||||
src/isa/aarch64/lower.isle 2d2e1e076a0c8a23
|
src/isa/aarch64/lower.isle 2d2e1e076a0c8a23
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
src/clif.isle f176ef3bba99365
|
src/clif.isle 9ea75a6f790b5c03
|
||||||
src/prelude.isle 51d2aef2566c1c96
|
src/prelude.isle 51d2aef2566c1c96
|
||||||
src/isa/s390x/inst.isle 63cf833b5cfd727d
|
src/isa/s390x/inst.isle 63cf833b5cfd727d
|
||||||
src/isa/s390x/lower.isle a0e21a567040bc33
|
src/isa/s390x/lower.isle a0e21a567040bc33
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
src/clif.isle f176ef3bba99365
|
src/clif.isle 9ea75a6f790b5c03
|
||||||
src/prelude.isle 51d2aef2566c1c96
|
src/prelude.isle 51d2aef2566c1c96
|
||||||
src/isa/x64/inst.isle 61004acbb1289816
|
src/isa/x64/inst.isle 61004acbb1289816
|
||||||
src/isa/x64/lower.isle 82db7f7d47ac7809
|
src/isa/x64/lower.isle 82db7f7d47ac7809
|
||||||
|
|||||||
Reference in New Issue
Block a user