Add constraint summaries to RecipeConstraints.
Most instructions don't have any fixed register constraints. Add boolean summaries that can be used to check if it is worthwhile to scan the constraint lists when looking for a fixed register constraint. Also add a tied_ops summary bool which indicates that the instruction has tied operand constraints.
This commit is contained in:
@@ -474,6 +474,15 @@ def emit_recipe_constraints(isa, fmt):
|
|||||||
with fmt.indented('RecipeConstraints {', '},'):
|
with fmt.indented('RecipeConstraints {', '},'):
|
||||||
emit_operand_constraints(r, r.ins, 'ins', tied_i2o, fmt)
|
emit_operand_constraints(r, r.ins, 'ins', tied_i2o, fmt)
|
||||||
emit_operand_constraints(r, r.outs, 'outs', tied_o2i, fmt)
|
emit_operand_constraints(r, r.outs, 'outs', tied_o2i, fmt)
|
||||||
|
fmt.format(
|
||||||
|
'fixed_ins: {},',
|
||||||
|
str(any(isinstance(c, Register)
|
||||||
|
for c in r.ins)).lower())
|
||||||
|
fmt.format(
|
||||||
|
'fixed_outs: {},',
|
||||||
|
str(any(isinstance(c, Register)
|
||||||
|
for c in r.outs)).lower())
|
||||||
|
fmt.format('tied_ops: {},', str(bool(tied_i2o)).lower())
|
||||||
|
|
||||||
|
|
||||||
def emit_operand_constraints(
|
def emit_operand_constraints(
|
||||||
|
|||||||
@@ -67,6 +67,15 @@ pub struct RecipeConstraints {
|
|||||||
/// If the instruction produces a variable number of results, it's probably a call and the
|
/// If the instruction produces a variable number of results, it's probably a call and the
|
||||||
/// constraints must be derived from the calling convention ABI.
|
/// constraints must be derived from the calling convention ABI.
|
||||||
pub outs: &'static [OperandConstraint],
|
pub outs: &'static [OperandConstraint],
|
||||||
|
|
||||||
|
/// Are any of the input constraints `FixedReg`?
|
||||||
|
pub fixed_ins: bool,
|
||||||
|
|
||||||
|
/// Are any of the output constraints `FixedReg`?
|
||||||
|
pub fixed_outs: bool,
|
||||||
|
|
||||||
|
/// Are there any tied operands?
|
||||||
|
pub tied_ops: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Constraints on the range of a branch instruction.
|
/// Constraints on the range of a branch instruction.
|
||||||
|
|||||||
Reference in New Issue
Block a user