Synchronize InstructionFormat and InstructionData.
These two enums must have identical variants. One is generated from the instruction formats in meta/cretonne/formats.py, the other defines the contents of an instruction. Emit a conversion from InstructionData to InstructionFormat which also serves to verify the correspondence. Rustc will error is the match is not complete.
This commit is contained in:
@@ -108,6 +108,20 @@ pub enum InstructionData {
|
|||||||
ty: Type,
|
ty: Type,
|
||||||
imm: Imm64,
|
imm: Imm64,
|
||||||
},
|
},
|
||||||
|
UnaryIeee32 {
|
||||||
|
opcode: Opcode,
|
||||||
|
ty: Type,
|
||||||
|
imm: Ieee32,
|
||||||
|
},
|
||||||
|
UnaryIeee64 {
|
||||||
|
opcode: Opcode,
|
||||||
|
ty: Type,
|
||||||
|
imm: Ieee64,
|
||||||
|
},
|
||||||
|
UnaryImmVector {
|
||||||
|
opcode: Opcode,
|
||||||
|
ty: Type, // TBD: imm: Box<ImmVectorData>
|
||||||
|
},
|
||||||
Binary {
|
Binary {
|
||||||
opcode: Opcode,
|
opcode: Opcode,
|
||||||
ty: Type,
|
ty: Type,
|
||||||
@@ -117,7 +131,14 @@ pub enum InstructionData {
|
|||||||
opcode: Opcode,
|
opcode: Opcode,
|
||||||
ty: Type,
|
ty: Type,
|
||||||
arg: Value,
|
arg: Value,
|
||||||
imm: Imm64,
|
rhs: Imm64,
|
||||||
|
},
|
||||||
|
// Same as BinaryImm, but the imediate is the lhs operand.
|
||||||
|
BinaryImmRev {
|
||||||
|
opcode: Opcode,
|
||||||
|
ty: Type,
|
||||||
|
arg: Value,
|
||||||
|
lhs: Imm64,
|
||||||
},
|
},
|
||||||
Call {
|
Call {
|
||||||
opcode: Opcode,
|
opcode: Opcode,
|
||||||
@@ -157,8 +178,12 @@ impl InstructionData {
|
|||||||
Nullary { opcode, .. } => opcode,
|
Nullary { opcode, .. } => opcode,
|
||||||
Unary { opcode, .. } => opcode,
|
Unary { opcode, .. } => opcode,
|
||||||
UnaryImm { opcode, .. } => opcode,
|
UnaryImm { opcode, .. } => opcode,
|
||||||
|
UnaryIeee32 { opcode, .. } => opcode,
|
||||||
|
UnaryIeee64 { opcode, .. } => opcode,
|
||||||
|
UnaryImmVector { opcode, .. } => opcode,
|
||||||
Binary { opcode, .. } => opcode,
|
Binary { opcode, .. } => opcode,
|
||||||
BinaryImm { opcode, .. } => opcode,
|
BinaryImm { opcode, .. } => opcode,
|
||||||
|
BinaryImmRev { opcode, .. } => opcode,
|
||||||
Call { opcode, .. } => opcode,
|
Call { opcode, .. } => opcode,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -170,8 +195,12 @@ impl InstructionData {
|
|||||||
Nullary { ty, .. } => ty,
|
Nullary { ty, .. } => ty,
|
||||||
Unary { ty, .. } => ty,
|
Unary { ty, .. } => ty,
|
||||||
UnaryImm { ty, .. } => ty,
|
UnaryImm { ty, .. } => ty,
|
||||||
|
UnaryIeee32 { ty, .. } => ty,
|
||||||
|
UnaryIeee64 { ty, .. } => ty,
|
||||||
|
UnaryImmVector { ty, .. } => ty,
|
||||||
Binary { ty, .. } => ty,
|
Binary { ty, .. } => ty,
|
||||||
BinaryImm { ty, .. } => ty,
|
BinaryImm { ty, .. } => ty,
|
||||||
|
BinaryImmRev { ty, .. } => ty,
|
||||||
Call { ty, .. } => ty,
|
Call { ty, .. } => ty,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -183,8 +212,12 @@ impl InstructionData {
|
|||||||
Nullary { .. } => None,
|
Nullary { .. } => None,
|
||||||
Unary { .. } => None,
|
Unary { .. } => None,
|
||||||
UnaryImm { .. } => None,
|
UnaryImm { .. } => None,
|
||||||
|
UnaryIeee32 { .. } => None,
|
||||||
|
UnaryIeee64 { .. } => None,
|
||||||
|
UnaryImmVector { .. } => None,
|
||||||
Binary { .. } => None,
|
Binary { .. } => None,
|
||||||
BinaryImm { .. } => None,
|
BinaryImm { .. } => None,
|
||||||
|
BinaryImmRev { .. } => None,
|
||||||
Call { ref data, .. } => Some(data.second_result),
|
Call { ref data, .. } => Some(data.second_result),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -195,8 +228,12 @@ impl InstructionData {
|
|||||||
Nullary { .. } => None,
|
Nullary { .. } => None,
|
||||||
Unary { .. } => None,
|
Unary { .. } => None,
|
||||||
UnaryImm { .. } => None,
|
UnaryImm { .. } => None,
|
||||||
|
UnaryIeee32 { .. } => None,
|
||||||
|
UnaryIeee64 { .. } => None,
|
||||||
|
UnaryImmVector { .. } => None,
|
||||||
Binary { .. } => None,
|
Binary { .. } => None,
|
||||||
BinaryImm { .. } => None,
|
BinaryImm { .. } => None,
|
||||||
|
BinaryImmRev { .. } => None,
|
||||||
Call { ref mut data, .. } => Some(&mut data.second_result),
|
Call { ref mut data, .. } => Some(&mut data.second_result),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,6 +55,17 @@ value = OperandKind(
|
|||||||
operand.
|
operand.
|
||||||
""")
|
""")
|
||||||
|
|
||||||
|
#: A variable-sizes list of value operands. Use for Ebb and function call
|
||||||
|
#: arguemnts.
|
||||||
|
args = OperandKind(
|
||||||
|
'args', """
|
||||||
|
A variable size list of `value` operands.
|
||||||
|
|
||||||
|
Use this to represent arguemtns passed to a function call, arguments
|
||||||
|
passed to an extended basic block, or a variable number of results
|
||||||
|
returned from an instruction.
|
||||||
|
""")
|
||||||
|
|
||||||
|
|
||||||
# Instances of immediate operand types are provided in the cretonne.immediates
|
# Instances of immediate operand types are provided in the cretonne.immediates
|
||||||
# module.
|
# module.
|
||||||
|
|||||||
@@ -7,9 +7,11 @@ in this module.
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
from . import InstructionFormat, value
|
from . import InstructionFormat, value, args
|
||||||
from immediates import imm64, ieee32, ieee64, immvector
|
from immediates import imm64, ieee32, ieee64, immvector
|
||||||
|
|
||||||
|
Nullary = InstructionFormat()
|
||||||
|
|
||||||
Unary = InstructionFormat(value)
|
Unary = InstructionFormat(value)
|
||||||
UnaryImm = InstructionFormat(imm64)
|
UnaryImm = InstructionFormat(imm64)
|
||||||
UnaryIeee32 = InstructionFormat(ieee32)
|
UnaryIeee32 = InstructionFormat(ieee32)
|
||||||
@@ -20,6 +22,7 @@ Binary = InstructionFormat(value, value)
|
|||||||
BinaryImm = InstructionFormat(value, imm64)
|
BinaryImm = InstructionFormat(value, imm64)
|
||||||
BinaryImmRev = InstructionFormat(imm64, value)
|
BinaryImmRev = InstructionFormat(imm64, value)
|
||||||
|
|
||||||
|
Call = InstructionFormat(args, multiple_results=True)
|
||||||
|
|
||||||
# Finally extract the names of global variables in this module.
|
# Finally extract the names of global variables in this module.
|
||||||
InstructionFormat.extract_names(globals())
|
InstructionFormat.extract_names(globals())
|
||||||
|
|||||||
@@ -21,6 +21,20 @@ def gen_formats(fmt):
|
|||||||
fmt.line(f.name + ',')
|
fmt.line(f.name + ',')
|
||||||
fmt.line()
|
fmt.line()
|
||||||
|
|
||||||
|
# Emit a From<InstructionData> which also serves to verify that
|
||||||
|
# InstructionFormat and InstructionData are in sync.
|
||||||
|
with fmt.indented(
|
||||||
|
"impl<'a> From<&'a InstructionData> for InstructionFormat {", '}'):
|
||||||
|
with fmt.indented(
|
||||||
|
"fn from(inst: &'a InstructionData) -> InstructionFormat {",
|
||||||
|
'}'):
|
||||||
|
with fmt.indented('match *inst {', '}'):
|
||||||
|
for f in cretonne.InstructionFormat.all_formats:
|
||||||
|
fmt.line(('InstructionData::{} {{ .. }} => ' +
|
||||||
|
'InstructionFormat::{},')
|
||||||
|
.format(f.name, f.name))
|
||||||
|
fmt.line()
|
||||||
|
|
||||||
|
|
||||||
def collect_instr_groups(targets):
|
def collect_instr_groups(targets):
|
||||||
seen = set()
|
seen = set()
|
||||||
|
|||||||
Reference in New Issue
Block a user