Skip to main content

midenc_codegen_masm/
lib.rs

1#![feature(debug_closure_helpers)]
2#![feature(iter_array_chunks)]
3#![deny(warnings)]
4
5extern crate alloc;
6
7mod artifact;
8mod data_segments;
9mod emit;
10mod emitter;
11mod events;
12pub mod intrinsics;
13mod legalization;
14mod linker;
15mod lower;
16mod opt;
17mod stack;
18
19pub mod masm {
20    pub use miden_assembly_syntax::{
21        Path as LibraryPathRef, PathBuf as LibraryPath, PathComponent as LibraryPathComponent,
22        ast::*,
23        debuginfo::{SourceSpan, Span, Spanned},
24        parser::{IntValue, PushValue},
25    };
26}
27
28use midenc_dialect_arith as arith;
29use midenc_dialect_cf as cf;
30use midenc_dialect_hir as hir;
31use midenc_dialect_scf as scf;
32use midenc_dialect_ub as ub;
33use midenc_dialect_wasm as wasm;
34use midenc_hir::{
35    dialects::{builtin, debuginfo},
36    inventory,
37};
38
39pub(crate) use self::lower::HirLowering;
40pub use self::{
41    artifact::{MasmComponent, Rodata},
42    events::{Event, FRAME_END_EVENT, FRAME_START_EVENT, PRINT_LN_EVENT},
43    legalization::{LegalizeForMasm, masm_legalization_target, populate_masm_legalization_target},
44    lower::{NativePtr, ToMasmComponent},
45    stack::{Constraint, Operand, OperandStack},
46};
47
48inventory::submit!(::midenc_hir::DialectRegistrationHookInfo::new::<builtin::BuiltinDialect>(
49    lower_builtin_ops
50));
51inventory::submit!(::midenc_hir::DialectRegistrationHookInfo::new::<arith::ArithDialect>(
52    lower_arith_ops
53));
54inventory::submit!(::midenc_hir::DialectRegistrationHookInfo::new::<cf::ControlFlowDialect>(
55    lower_cf_ops
56));
57inventory::submit!(::midenc_hir::DialectRegistrationHookInfo::new::<scf::ScfDialect>(
58    lower_scf_ops
59));
60inventory::submit!(::midenc_hir::DialectRegistrationHookInfo::new::<ub::UndefinedBehaviorDialect>(
61    lower_ub_ops
62));
63inventory::submit!(::midenc_hir::DialectRegistrationHookInfo::new::<hir::HirDialect>(
64    lower_hir_ops
65));
66inventory::submit!(::midenc_hir::DialectRegistrationHookInfo::new::<wasm::WasmDialect>(
67    lower_wasm_ops
68));
69inventory::submit!(::midenc_hir::DialectRegistrationHookInfo::new::<debuginfo::DebugInfoDialect>(
70    lower_debuginfo_ops
71));
72
73fn lower_builtin_ops(info: &mut midenc_hir::DialectInfo) {
74    info.register_operation_trait::<builtin::Ret, dyn HirLowering>();
75    info.register_operation_trait::<builtin::RetImm, dyn HirLowering>();
76    info.register_operation_trait::<builtin::GlobalSymbol, dyn HirLowering>();
77    info.register_operation_trait::<builtin::UnrealizedConversionCast, dyn HirLowering>();
78}
79
80fn lower_arith_ops(info: &mut midenc_hir::DialectInfo) {
81    info.register_operation_trait::<arith::Constant, dyn HirLowering>();
82    info.register_operation_trait::<arith::Add, dyn HirLowering>();
83    info.register_operation_trait::<arith::AddOverflowing, dyn HirLowering>();
84    info.register_operation_trait::<arith::Sub, dyn HirLowering>();
85    info.register_operation_trait::<arith::SubOverflowing, dyn HirLowering>();
86    info.register_operation_trait::<arith::Mul, dyn HirLowering>();
87    info.register_operation_trait::<arith::MulOverflowing, dyn HirLowering>();
88    info.register_operation_trait::<arith::Exp, dyn HirLowering>();
89    info.register_operation_trait::<arith::Div, dyn HirLowering>();
90    info.register_operation_trait::<arith::Ext2Add, dyn HirLowering>();
91    info.register_operation_trait::<arith::Ext2Sub, dyn HirLowering>();
92    info.register_operation_trait::<arith::Ext2Mul, dyn HirLowering>();
93    info.register_operation_trait::<arith::Ext2Div, dyn HirLowering>();
94    info.register_operation_trait::<arith::Sdiv, dyn HirLowering>();
95    info.register_operation_trait::<arith::Mod, dyn HirLowering>();
96    info.register_operation_trait::<arith::Smod, dyn HirLowering>();
97    info.register_operation_trait::<arith::Divmod, dyn HirLowering>();
98    info.register_operation_trait::<arith::Sdivmod, dyn HirLowering>();
99    info.register_operation_trait::<arith::And, dyn HirLowering>();
100    info.register_operation_trait::<arith::Or, dyn HirLowering>();
101    info.register_operation_trait::<arith::Xor, dyn HirLowering>();
102    info.register_operation_trait::<arith::Band, dyn HirLowering>();
103    info.register_operation_trait::<arith::Bor, dyn HirLowering>();
104    info.register_operation_trait::<arith::Bxor, dyn HirLowering>();
105    info.register_operation_trait::<arith::Shl, dyn HirLowering>();
106    info.register_operation_trait::<arith::Shr, dyn HirLowering>();
107    info.register_operation_trait::<arith::Ashr, dyn HirLowering>();
108    info.register_operation_trait::<arith::Rotl, dyn HirLowering>();
109    info.register_operation_trait::<arith::Rotr, dyn HirLowering>();
110    info.register_operation_trait::<arith::Eq, dyn HirLowering>();
111    info.register_operation_trait::<arith::Neq, dyn HirLowering>();
112    info.register_operation_trait::<arith::Gt, dyn HirLowering>();
113    info.register_operation_trait::<arith::Gte, dyn HirLowering>();
114    info.register_operation_trait::<arith::Lt, dyn HirLowering>();
115    info.register_operation_trait::<arith::Lte, dyn HirLowering>();
116    info.register_operation_trait::<arith::Min, dyn HirLowering>();
117    info.register_operation_trait::<arith::Max, dyn HirLowering>();
118    info.register_operation_trait::<arith::Trunc, dyn HirLowering>();
119    info.register_operation_trait::<arith::Zext, dyn HirLowering>();
120    info.register_operation_trait::<arith::Sext, dyn HirLowering>();
121    info.register_operation_trait::<arith::Incr, dyn HirLowering>();
122    info.register_operation_trait::<arith::Neg, dyn HirLowering>();
123    info.register_operation_trait::<arith::Inv, dyn HirLowering>();
124    info.register_operation_trait::<arith::Ext2Neg, dyn HirLowering>();
125    info.register_operation_trait::<arith::Ext2Inv, dyn HirLowering>();
126    info.register_operation_trait::<arith::Ilog2, dyn HirLowering>();
127    info.register_operation_trait::<arith::Pow2, dyn HirLowering>();
128    info.register_operation_trait::<arith::Not, dyn HirLowering>();
129    info.register_operation_trait::<arith::Bnot, dyn HirLowering>();
130    info.register_operation_trait::<arith::IsOdd, dyn HirLowering>();
131    info.register_operation_trait::<arith::Popcnt, dyn HirLowering>();
132    info.register_operation_trait::<arith::Clz, dyn HirLowering>();
133    info.register_operation_trait::<arith::Ctz, dyn HirLowering>();
134    info.register_operation_trait::<arith::Clo, dyn HirLowering>();
135    info.register_operation_trait::<arith::Cto, dyn HirLowering>();
136    info.register_operation_trait::<arith::Join, dyn HirLowering>();
137    info.register_operation_trait::<arith::Split, dyn HirLowering>();
138}
139
140fn lower_cf_ops(info: &mut midenc_hir::DialectInfo) {
141    info.register_operation_trait::<cf::Select, dyn HirLowering>();
142    info.register_operation_trait::<cf::CondBr, dyn HirLowering>();
143}
144
145fn lower_scf_ops(info: &mut midenc_hir::DialectInfo) {
146    info.register_operation_trait::<scf::If, dyn HirLowering>();
147    info.register_operation_trait::<scf::While, dyn HirLowering>();
148    info.register_operation_trait::<scf::IndexSwitch, dyn HirLowering>();
149    info.register_operation_trait::<scf::Condition, dyn HirLowering>();
150    info.register_operation_trait::<scf::Yield, dyn HirLowering>();
151}
152
153fn lower_ub_ops(info: &mut midenc_hir::DialectInfo) {
154    info.register_operation_trait::<ub::Unreachable, dyn HirLowering>();
155    info.register_operation_trait::<ub::Poison, dyn HirLowering>();
156}
157
158fn lower_hir_ops(info: &mut midenc_hir::DialectInfo) {
159    info.register_operation_trait::<hir::Assert, dyn HirLowering>();
160    info.register_operation_trait::<hir::Assertz, dyn HirLowering>();
161    info.register_operation_trait::<hir::AssertEq, dyn HirLowering>();
162    info.register_operation_trait::<hir::AssertU32, dyn HirLowering>();
163    info.register_operation_trait::<hir::PtrToInt, dyn HirLowering>();
164    info.register_operation_trait::<hir::IntToPtr, dyn HirLowering>();
165    info.register_operation_trait::<hir::Cast, dyn HirLowering>();
166    info.register_operation_trait::<hir::Bitcast, dyn HirLowering>();
167    //info.register_operation_trait::<hir::ConstantBytes, dyn HirLowering>();
168    info.register_operation_trait::<hir::ConstantPointer, dyn HirLowering>();
169    info.register_operation_trait::<hir::Exec, dyn HirLowering>();
170    info.register_operation_trait::<hir::ExecIndirect, dyn HirLowering>();
171    info.register_operation_trait::<hir::ProcedureRoot, dyn HirLowering>();
172    info.register_operation_trait::<hir::ExecFpi, dyn HirLowering>();
173    info.register_operation_trait::<hir::Call, dyn HirLowering>();
174    info.register_operation_trait::<hir::Syscall, dyn HirLowering>();
175    info.register_operation_trait::<hir::Store, dyn HirLowering>();
176    info.register_operation_trait::<hir::StoreLocal, dyn HirLowering>();
177    info.register_operation_trait::<hir::Load, dyn HirLowering>();
178    info.register_operation_trait::<hir::LoadLocal, dyn HirLowering>();
179    info.register_operation_trait::<hir::LocalAddress, dyn HirLowering>();
180    info.register_operation_trait::<hir::Caller, dyn HirLowering>();
181    info.register_operation_trait::<hir::Clk, dyn HirLowering>();
182    info.register_operation_trait::<hir::AdvicePop, dyn HirLowering>();
183    info.register_operation_trait::<hir::AdviceLoadWord, dyn HirLowering>();
184    info.register_operation_trait::<hir::AdvicePipe, dyn HirLowering>();
185    info.register_operation_trait::<hir::EmitEvent, dyn HirLowering>();
186    info.register_operation_trait::<hir::EmitEventImm, dyn HirLowering>();
187    info.register_operation_trait::<hir::SystemEvent, dyn HirLowering>();
188    info.register_operation_trait::<hir::Hash, dyn HirLowering>();
189    info.register_operation_trait::<hir::HMerge, dyn HirLowering>();
190    info.register_operation_trait::<hir::HPerm, dyn HirLowering>();
191    info.register_operation_trait::<hir::MTreeGet, dyn HirLowering>();
192    info.register_operation_trait::<hir::MTreeSet, dyn HirLowering>();
193    info.register_operation_trait::<hir::MTreeMerge, dyn HirLowering>();
194    info.register_operation_trait::<hir::MTreeVerify, dyn HirLowering>();
195    info.register_operation_trait::<hir::CryptoStream, dyn HirLowering>();
196    info.register_operation_trait::<hir::FriExt2Fold4, dyn HirLowering>();
197    info.register_operation_trait::<hir::HornerBase, dyn HirLowering>();
198    info.register_operation_trait::<hir::HornerExt, dyn HirLowering>();
199    info.register_operation_trait::<hir::EvalCircuit, dyn HirLowering>();
200    info.register_operation_trait::<hir::LogDeferred, dyn HirLowering>();
201    info.register_operation_trait::<hir::MemStream, dyn HirLowering>();
202    info.register_operation_trait::<hir::MemGrow, dyn HirLowering>();
203    info.register_operation_trait::<hir::MemSize, dyn HirLowering>();
204    info.register_operation_trait::<hir::MemSet, dyn HirLowering>();
205    info.register_operation_trait::<hir::MemCpy, dyn HirLowering>();
206    info.register_operation_trait::<hir::PrintLn, dyn HirLowering>();
207}
208
209fn lower_wasm_ops(info: &mut midenc_hir::DialectInfo) {
210    info.register_operation_trait::<wasm::SignExtend, dyn HirLowering>();
211    info.register_operation_trait::<wasm::I32Load8S, dyn HirLowering>();
212    info.register_operation_trait::<wasm::I32Load16S, dyn HirLowering>();
213    info.register_operation_trait::<wasm::I64Load8S, dyn HirLowering>();
214    info.register_operation_trait::<wasm::I64Load16S, dyn HirLowering>();
215    info.register_operation_trait::<wasm::I64Load32S, dyn HirLowering>();
216    info.register_operation_trait::<wasm::I32RemS, dyn HirLowering>();
217}
218
219fn lower_debuginfo_ops(info: &mut midenc_hir::DialectInfo) {
220    info.register_operation_trait::<debuginfo::DebugDeclare, dyn HirLowering>();
221    info.register_operation_trait::<debuginfo::DebugValue, dyn HirLowering>();
222    info.register_operation_trait::<debuginfo::DebugKill, dyn HirLowering>();
223}