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