Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 33 additions & 4 deletions cranelift/codegen/meta/src/gen_inst.rs
Original file line number Diff line number Diff line change
Expand Up @@ -557,6 +557,11 @@ fn gen_instruction_data_impl(formats: &[Rc<InstructionFormat>], fmt: &mut Format
OperandKindFields::VariableArgs => {
fmtln!(fmt, "{member}: mapper.map_value_list({member}),");
}
OperandKindFields::ImmValue
if field.kind.rust_type == "ir::MemFlags" =>
{
fmtln!(fmt, "{member}: mapper.map_mem_flags({member}),");
}
OperandKindFields::ImmValue |
OperandKindFields::ImmEnum(_) |
OperandKindFields::TypeVar(_) => fmtln!(fmt, "{member},"),
Expand Down Expand Up @@ -1153,7 +1158,14 @@ fn gen_inst_builder(inst: &Instruction, format: &InstructionFormat, fmt: &mut Fo
} else {
let t = if op.is_immediate() {
let t = format!("T{}", tmpl_types.len() + 1);
tmpl_types.push(format!("{}: Into<{}>", t, op.kind.rust_type));
// For memflags, the public API type is MemFlagsData (the data),
// while InstructionData stores MemFlags (the entity index).
let api_type = if op.kind.rust_type == "ir::MemFlags" {
"ir::MemFlagsData"
} else {
op.kind.rust_type
};
tmpl_types.push(format!("{}: Into<{}>", t, api_type));
into_args.push(op.name);
t
} else {
Expand All @@ -1164,9 +1176,15 @@ fn gen_inst_builder(inst: &Instruction, format: &InstructionFormat, fmt: &mut Fo
}
}

// We need to mutate `self` if this instruction accepts a value list, or will construct
// BlockCall values.
if format.has_value_list || !block_args.is_empty() {
// We need to mutate `self` if this instruction accepts a value list, will construct
// BlockCall values, or has memflags operands (which need DFG insertion).
// We need to mutate `self` if this instruction accepts a value list, will construct
// BlockCall values, or has memflags operands (which need DFG insertion).
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Duplicated comment (maybe a merge or rebase issue?)

let has_memflags = inst
.operands_in
.iter()
.any(|op| op.kind.rust_type == "ir::MemFlags");
if format.has_value_list || !block_args.is_empty() || has_memflags {
args[0].push_str("mut self");
} else {
args[0].push_str("self");
Expand Down Expand Up @@ -1221,6 +1239,17 @@ fn gen_inst_builder(inst: &Instruction, format: &InstructionFormat, fmt: &mut Fo
fmtln!(fmt, "let {} = {}.into();", arg, arg);
}

// Insert memflags data into the DFG to get entity indices.
for op in &inst.operands_in {
if op.kind.rust_type == "ir::MemFlags" && op.is_immediate() {
fmtln!(
fmt,
"let {0} = self.data_flow_graph_mut().mem_flags.insert({0}).unwrap();",
op.name
);
}
}

// Convert block references
for op in block_args {
fmtln!(
Expand Down
4 changes: 4 additions & 0 deletions cranelift/codegen/meta/src/gen_isle.rs
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,10 @@ fn gen_common_isle(
for ty in others.keys() {
fmtln!(fmt, "(type {} (primitive {}))", ty, ty);
}
// Also declare the MemFlagsData type, which is the resolved form of MemFlags.
// MemFlags is an entity index into the DFG's MemFlagsSet, while MemFlagsData
// contains the actual flag bits. Backend MachInst types use MemFlagsData.
fmt.line("(type MemFlagsData (primitive MemFlagsData))");
fmt.empty_line();

// Generate the `enum` immediates, expanding all of the available variants
Expand Down
2 changes: 1 addition & 1 deletion cranelift/codegen/meta/src/shared/immediates.rs
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ impl Immediates {
)
},

memflags: new_imm("flags", "ir::MemFlagsData", "Memory operation flags"),
memflags: new_imm("flags", "ir::MemFlags", "Memory operation flags"),

trapcode: {
let mut trapcode_values = HashMap::new();
Expand Down
48 changes: 24 additions & 24 deletions cranelift/codegen/meta/src/shared/instructions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -772,7 +772,7 @@ pub(crate) fn define(
&formats.load,
)
.operands_in(vec![
Operand::new("MemFlagsData", &imm.memflags),
Operand::new("MemFlags", &imm.memflags),
Operand::new("p", iAddr),
Operand::new("Offset", &imm.offset32).with_doc("Byte offset from base address"),
])
Expand All @@ -792,7 +792,7 @@ pub(crate) fn define(
&formats.store,
)
.operands_in(vec![
Operand::new("MemFlagsData", &imm.memflags),
Operand::new("MemFlags", &imm.memflags),
Operand::new("x", Mem).with_doc("Value to be stored"),
Operand::new("p", iAddr),
Operand::new("Offset", &imm.offset32).with_doc("Byte offset from base address"),
Expand All @@ -817,7 +817,7 @@ pub(crate) fn define(
&formats.load,
)
.operands_in(vec![
Operand::new("MemFlagsData", &imm.memflags),
Operand::new("MemFlags", &imm.memflags),
Operand::new("p", iAddr),
Operand::new("Offset", &imm.offset32).with_doc("Byte offset from base address"),
])
Expand All @@ -836,7 +836,7 @@ pub(crate) fn define(
&formats.load,
)
.operands_in(vec![
Operand::new("MemFlagsData", &imm.memflags),
Operand::new("MemFlags", &imm.memflags),
Operand::new("p", iAddr),
Operand::new("Offset", &imm.offset32).with_doc("Byte offset from base address"),
])
Expand All @@ -855,7 +855,7 @@ pub(crate) fn define(
&formats.store,
)
.operands_in(vec![
Operand::new("MemFlagsData", &imm.memflags),
Operand::new("MemFlags", &imm.memflags),
Operand::new("x", iExt8),
Operand::new("p", iAddr),
Operand::new("Offset", &imm.offset32).with_doc("Byte offset from base address"),
Expand All @@ -880,7 +880,7 @@ pub(crate) fn define(
&formats.load,
)
.operands_in(vec![
Operand::new("MemFlagsData", &imm.memflags),
Operand::new("MemFlags", &imm.memflags),
Operand::new("p", iAddr),
Operand::new("Offset", &imm.offset32).with_doc("Byte offset from base address"),
])
Expand All @@ -899,7 +899,7 @@ pub(crate) fn define(
&formats.load,
)
.operands_in(vec![
Operand::new("MemFlagsData", &imm.memflags),
Operand::new("MemFlags", &imm.memflags),
Operand::new("p", iAddr),
Operand::new("Offset", &imm.offset32).with_doc("Byte offset from base address"),
])
Expand All @@ -918,7 +918,7 @@ pub(crate) fn define(
&formats.store,
)
.operands_in(vec![
Operand::new("MemFlagsData", &imm.memflags),
Operand::new("MemFlags", &imm.memflags),
Operand::new("x", iExt16),
Operand::new("p", iAddr),
Operand::new("Offset", &imm.offset32).with_doc("Byte offset from base address"),
Expand All @@ -943,7 +943,7 @@ pub(crate) fn define(
&formats.load,
)
.operands_in(vec![
Operand::new("MemFlagsData", &imm.memflags),
Operand::new("MemFlags", &imm.memflags),
Operand::new("p", iAddr),
Operand::new("Offset", &imm.offset32).with_doc("Byte offset from base address"),
])
Expand All @@ -962,7 +962,7 @@ pub(crate) fn define(
&formats.load,
)
.operands_in(vec![
Operand::new("MemFlagsData", &imm.memflags),
Operand::new("MemFlags", &imm.memflags),
Operand::new("p", iAddr),
Operand::new("Offset", &imm.offset32).with_doc("Byte offset from base address"),
])
Expand All @@ -981,7 +981,7 @@ pub(crate) fn define(
&formats.store,
)
.operands_in(vec![
Operand::new("MemFlagsData", &imm.memflags),
Operand::new("MemFlags", &imm.memflags),
Operand::new("x", iExt32),
Operand::new("p", iAddr),
Operand::new("Offset", &imm.offset32).with_doc("Byte offset from base address"),
Expand Down Expand Up @@ -1069,7 +1069,7 @@ pub(crate) fn define(
&formats.load,
)
.operands_in(vec![
Operand::new("MemFlagsData", &imm.memflags),
Operand::new("MemFlags", &imm.memflags),
Operand::new("p", iAddr),
Operand::new("Offset", &imm.offset32).with_doc("Byte offset from base address"),
])
Expand All @@ -1087,7 +1087,7 @@ pub(crate) fn define(
&formats.load,
)
.operands_in(vec![
Operand::new("MemFlagsData", &imm.memflags),
Operand::new("MemFlags", &imm.memflags),
Operand::new("p", iAddr),
Operand::new("Offset", &imm.offset32).with_doc("Byte offset from base address"),
])
Expand Down Expand Up @@ -1115,7 +1115,7 @@ pub(crate) fn define(
&formats.load,
)
.operands_in(vec![
Operand::new("MemFlagsData", &imm.memflags),
Operand::new("MemFlags", &imm.memflags),
Operand::new("p", iAddr),
Operand::new("Offset", &imm.offset32).with_doc("Byte offset from base address"),
])
Expand All @@ -1133,7 +1133,7 @@ pub(crate) fn define(
&formats.load,
)
.operands_in(vec![
Operand::new("MemFlagsData", &imm.memflags),
Operand::new("MemFlags", &imm.memflags),
Operand::new("p", iAddr),
Operand::new("Offset", &imm.offset32).with_doc("Byte offset from base address"),
])
Expand Down Expand Up @@ -1161,7 +1161,7 @@ pub(crate) fn define(
&formats.load,
)
.operands_in(vec![
Operand::new("MemFlagsData", &imm.memflags),
Operand::new("MemFlags", &imm.memflags),
Operand::new("p", iAddr),
Operand::new("Offset", &imm.offset32).with_doc("Byte offset from base address"),
])
Expand All @@ -1179,7 +1179,7 @@ pub(crate) fn define(
&formats.load,
)
.operands_in(vec![
Operand::new("MemFlagsData", &imm.memflags),
Operand::new("MemFlags", &imm.memflags),
Operand::new("p", iAddr),
Operand::new("Offset", &imm.offset32).with_doc("Byte offset from base address"),
])
Expand Down Expand Up @@ -3132,17 +3132,17 @@ pub(crate) fn define(

The input and output types must be storable to memory and of the same
size. A bitcast is equivalent to storing one type and loading the other
type from the same address, both using the specified MemFlagsData.
type from the same address, both using the specified MemFlags.

Note that this operation only supports the `big` or `little` MemFlagsData.
Note that this operation only supports the `big` or `little` MemFlags.
The specified byte order only affects the result in the case where
input and output types differ in lane count/size. In this case, the
operation is only valid if a byte order specifier is provided.
"#,
&formats.load_no_offset,
)
.operands_in(vec![
Operand::new("MemFlagsData", &imm.memflags),
Operand::new("MemFlags", &imm.memflags),
Operand::new("x", Mem),
])
.operands_out(vec![
Expand Down Expand Up @@ -3773,7 +3773,7 @@ pub(crate) fn define(
&formats.atomic_rmw,
)
.operands_in(vec![
Operand::new("MemFlagsData", &imm.memflags),
Operand::new("MemFlags", &imm.memflags),
Operand::new("AtomicRmwOp", &imm.atomic_rmw_op),
Operand::new("p", iAddr),
Operand::new("x", AtomicMem).with_doc("Value to be atomically stored"),
Expand Down Expand Up @@ -3802,7 +3802,7 @@ pub(crate) fn define(
&formats.atomic_cas,
)
.operands_in(vec![
Operand::new("MemFlagsData", &imm.memflags),
Operand::new("MemFlags", &imm.memflags),
Operand::new("p", iAddr),
Operand::new("e", AtomicMem).with_doc("Expected value in CAS"),
Operand::new("x", AtomicMem).with_doc("Value to be atomically stored"),
Expand Down Expand Up @@ -3830,7 +3830,7 @@ pub(crate) fn define(
&formats.load_no_offset,
)
.operands_in(vec![
Operand::new("MemFlagsData", &imm.memflags),
Operand::new("MemFlags", &imm.memflags),
Operand::new("p", iAddr),
])
.operands_out(vec![
Expand All @@ -3855,7 +3855,7 @@ pub(crate) fn define(
&formats.store_no_offset,
)
.operands_in(vec![
Operand::new("MemFlagsData", &imm.memflags),
Operand::new("MemFlags", &imm.memflags),
Operand::new("x", AtomicMem).with_doc("Value to be atomically stored"),
Operand::new("p", iAddr),
])
Expand Down
Loading