1d8b840d2SBenjamin Bouvier use crate::cdsl::operands::{OperandKind, OperandKindFields};
2d8b840d2SBenjamin Bouvier
3d8b840d2SBenjamin Bouvier /// Small helper to initialize an OperandBuilder with the right kind, for a given name and doc.
new(format_field_name: &'static str, rust_type: &'static str, doc: &'static str) -> OperandKind4d8b840d2SBenjamin Bouvier fn new(format_field_name: &'static str, rust_type: &'static str, doc: &'static str) -> OperandKind {
5f84e1c16Sbjorn3 OperandKind::new(
6f84e1c16Sbjorn3 format_field_name,
7f84e1c16Sbjorn3 rust_type,
8f84e1c16Sbjorn3 OperandKindFields::EntityRef,
9f84e1c16Sbjorn3 doc,
10f84e1c16Sbjorn3 )
11d8b840d2SBenjamin Bouvier }
12d59bef19SBenjamin Bouvier
135889dd2cSBenjamin Bouvier pub(crate) struct EntityRefs {
141e6c13d8STrevor Elliott /// A reference to a basic block in the same function, with its arguments provided.
151e6c13d8STrevor Elliott /// This is primarily used in control flow instructions.
161e6c13d8STrevor Elliott pub(crate) block_call: OperandKind,
171e6c13d8STrevor Elliott
18b58a197dSTrevor Elliott /// A reference to a basic block in the same function, with its arguments provided.
19b58a197dSTrevor Elliott /// This is primarily used in control flow instructions.
20b58a197dSTrevor Elliott pub(crate) block_then: OperandKind,
21b58a197dSTrevor Elliott
22b58a197dSTrevor Elliott /// A reference to a basic block in the same function, with its arguments provided.
23b58a197dSTrevor Elliott /// This is primarily used in control flow instructions.
24b58a197dSTrevor Elliott pub(crate) block_else: OperandKind,
25b58a197dSTrevor Elliott
26*4c01ee2fSChris Fallin /// A reference to a basic block in the same function, without any arguments.
27*4c01ee2fSChris Fallin /// This is primarily used to refer to block `try_call` terminators to get
28*4c01ee2fSChris Fallin /// exception metadata (e.g., resume PCs) as first-class values.
29*4c01ee2fSChris Fallin pub(crate) raw_block: OperandKind,
30*4c01ee2fSChris Fallin
318fba449bSBenjamin Bouvier /// A reference to a stack slot declared in the function preamble.
325889dd2cSBenjamin Bouvier pub(crate) stack_slot: OperandKind,
338fba449bSBenjamin Bouvier
349c43749dSSam Parker /// A reference to a dynamic_stack slot declared in the function preamble.
359c43749dSSam Parker pub(crate) dynamic_stack_slot: OperandKind,
369c43749dSSam Parker
378fba449bSBenjamin Bouvier /// A reference to a global value.
385889dd2cSBenjamin Bouvier pub(crate) global_value: OperandKind,
398fba449bSBenjamin Bouvier
408fba449bSBenjamin Bouvier /// A reference to a function signature declared in the function preamble.
418fba449bSBenjamin Bouvier /// This is used to provide the call signature in a call_indirect instruction.
425889dd2cSBenjamin Bouvier pub(crate) sig_ref: OperandKind,
438fba449bSBenjamin Bouvier
448fba449bSBenjamin Bouvier /// A reference to an external function declared in the function preamble.
458fba449bSBenjamin Bouvier /// This is used to provide the callee and signature in a call instruction.
465889dd2cSBenjamin Bouvier pub(crate) func_ref: OperandKind,
478fba449bSBenjamin Bouvier
488fba449bSBenjamin Bouvier /// A reference to a jump table declared in the function preamble.
495889dd2cSBenjamin Bouvier pub(crate) jump_table: OperandKind,
508fba449bSBenjamin Bouvier
5194ec88eaSChris Fallin /// A reference to an exception table declared in the function preamble.
5294ec88eaSChris Fallin pub(crate) exception_table: OperandKind,
5394ec88eaSChris Fallin
54832666c4SRyan Hunt /// A variable-sized list of value operands. Use for Block and function call arguments.
555889dd2cSBenjamin Bouvier pub(crate) varargs: OperandKind,
568a23cc74SNick Fitzgerald
578a23cc74SNick Fitzgerald /// A constant stored in the constant pool.
588a23cc74SNick Fitzgerald ///
598a23cc74SNick Fitzgerald /// This operand is used to pass constants to instructions like `vconst`
608a23cc74SNick Fitzgerald /// while storing the actual bytes in the constant pool.
618a23cc74SNick Fitzgerald pub(crate) pool_constant: OperandKind,
628a23cc74SNick Fitzgerald
638a23cc74SNick Fitzgerald /// An unsigned 128-bit immediate integer operand, stored out-of-line in the
648a23cc74SNick Fitzgerald /// `DataFlowGraph::immediates` pool.
658a23cc74SNick Fitzgerald ///
668a23cc74SNick Fitzgerald /// This operand is used to pass entire 128-bit vectors as immediates to instructions like
678a23cc74SNick Fitzgerald /// `shuffle` and `mask`.
688a23cc74SNick Fitzgerald pub(crate) uimm128: OperandKind,
69d59bef19SBenjamin Bouvier }
70d59bef19SBenjamin Bouvier
718fba449bSBenjamin Bouvier impl EntityRefs {
new() -> Self728fba449bSBenjamin Bouvier pub fn new() -> Self {
738fba449bSBenjamin Bouvier Self {
741e6c13d8STrevor Elliott block_call: new(
751e6c13d8STrevor Elliott "destination",
761e6c13d8STrevor Elliott "ir::BlockCall",
771e6c13d8STrevor Elliott "a basic block in the same function, with its arguments provided.",
781e6c13d8STrevor Elliott ),
791e6c13d8STrevor Elliott
80b58a197dSTrevor Elliott block_then: new(
81b58a197dSTrevor Elliott "block_then",
82b58a197dSTrevor Elliott "ir::BlockCall",
83b58a197dSTrevor Elliott "a basic block in the same function, with its arguments provided.",
84b58a197dSTrevor Elliott ),
85b58a197dSTrevor Elliott
86b58a197dSTrevor Elliott block_else: new(
87b58a197dSTrevor Elliott "block_else",
88b58a197dSTrevor Elliott "ir::BlockCall",
89b58a197dSTrevor Elliott "a basic block in the same function, with its arguments provided.",
90b58a197dSTrevor Elliott ),
91b58a197dSTrevor Elliott
92*4c01ee2fSChris Fallin raw_block: new(
93*4c01ee2fSChris Fallin "raw_block",
94*4c01ee2fSChris Fallin "ir::Block",
95*4c01ee2fSChris Fallin "a basic block in the same function, with no arguments provided.",
96*4c01ee2fSChris Fallin ),
97*4c01ee2fSChris Fallin
98d8b840d2SBenjamin Bouvier stack_slot: new("stack_slot", "ir::StackSlot", "A stack slot"),
99d59bef19SBenjamin Bouvier
1009c43749dSSam Parker dynamic_stack_slot: new(
1019c43749dSSam Parker "dynamic_stack_slot",
1029c43749dSSam Parker "ir::DynamicStackSlot",
1039c43749dSSam Parker "A dynamic stack slot",
1049c43749dSSam Parker ),
1059c43749dSSam Parker
106d8b840d2SBenjamin Bouvier global_value: new("global_value", "ir::GlobalValue", "A global value."),
107d59bef19SBenjamin Bouvier
108d8b840d2SBenjamin Bouvier sig_ref: new("sig_ref", "ir::SigRef", "A function signature."),
109d59bef19SBenjamin Bouvier
110d8b840d2SBenjamin Bouvier func_ref: new("func_ref", "ir::FuncRef", "An external function."),
111d59bef19SBenjamin Bouvier
112d8b840d2SBenjamin Bouvier jump_table: new("table", "ir::JumpTable", "A jump table."),
113d59bef19SBenjamin Bouvier
11494ec88eaSChris Fallin exception_table: new("exception", "ir::ExceptionTable", "An exception table."),
11594ec88eaSChris Fallin
116f84e1c16Sbjorn3 varargs: OperandKind::new(
117f84e1c16Sbjorn3 "",
118f84e1c16Sbjorn3 "&[Value]",
119f84e1c16Sbjorn3 OperandKindFields::VariableArgs,
120d59bef19SBenjamin Bouvier r#"
121d59bef19SBenjamin Bouvier A variable size list of `value` operands.
122d59bef19SBenjamin Bouvier
123d59bef19SBenjamin Bouvier Use this to represent arguments passed to a function call, arguments
124832666c4SRyan Hunt passed to a basic block, or a variable number of results
125d59bef19SBenjamin Bouvier returned from an instruction.
126d59bef19SBenjamin Bouvier "#,
127d8b840d2SBenjamin Bouvier ),
1288a23cc74SNick Fitzgerald
1298a23cc74SNick Fitzgerald pool_constant: new(
1308a23cc74SNick Fitzgerald "constant_handle",
1318a23cc74SNick Fitzgerald "ir::Constant",
1328a23cc74SNick Fitzgerald "A constant stored in the constant pool.",
1338a23cc74SNick Fitzgerald ),
1348a23cc74SNick Fitzgerald
1358a23cc74SNick Fitzgerald uimm128: new(
1368a23cc74SNick Fitzgerald "imm",
1378a23cc74SNick Fitzgerald "ir::Immediate",
1388a23cc74SNick Fitzgerald "A 128-bit immediate unsigned integer.",
1398a23cc74SNick Fitzgerald ),
1408fba449bSBenjamin Bouvier }
1418fba449bSBenjamin Bouvier }
1428fba449bSBenjamin Bouvier }
143