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