zink/ffi/
asm.rs

1//! Assembly FFI.
2#[cfg(target_arch = "wasm32")]
3#[link(wasm_import_module = "asm")]
4#[allow(improper_ctypes)]
5extern "C" {
6    /// Push a 8-bit signed integer to the stack.
7    pub fn push_i8(val: i8);
8
9    /// Push a 8-bit unsigned integer to the stack.
10    pub fn push_u8(val: u8);
11
12    /// Push a 16-bit signed integer to the stack.
13    pub fn push_i16(val: i16);
14
15    /// Push a 16-bit unsigned integer to the stack.
16    pub fn push_u16(val: u16);
17
18    /// Push a 32-bit signed integer to the stack.
19    pub fn push_i32(val: i32);
20
21    /// Push a 32-bit unsigned integer to the stack.
22    pub fn push_u32(val: u32);
23
24    /// Push a 64-bit signed integer to the stack.
25    pub fn push_i64(val: i64);
26
27    /// Push a 64-bit unsigned integer to the stack.
28    pub fn push_u64(val: u64);
29
30    /// Emit opcode ADDMOD
31    pub fn addmod_i8(a: i8, b: i8, n: i8) -> i8;
32    /// Emit opcode ADDMOD
33    pub fn mulmod_i8(a: i8, b: i8, n: i8) -> i8;
34
35    /// Emit opcode ADDMOD
36    pub fn addmod_i16(a: i16, b: i16, n: i16) -> i16;
37    /// Emit opcode ADDMOD
38    pub fn mulmod_i16(a: i16, b: i16, n: i16) -> i16;
39
40    /// Emit opcode ADDMOD
41    pub fn addmod_i32(a: i32, b: i32, n: i32) -> i32;
42    /// Emit opcode ADDMOD
43    pub fn mulmod_i32(a: i32, b: i32, n: i32) -> i32;
44
45    /// Emit opcode ADDMOD
46    pub fn addmod_i64(a: i64, b: i64, n: i64) -> i64;
47    /// Emit opcode ADDMOD
48    pub fn mulmod_i64(a: i64, b: i64, n: i64) -> i64;
49
50    /// Emit opcode ADDMOD
51    pub fn addmod_u8(a: u8, b: u8, n: u8) -> u8;
52    /// Emit opcode ADDMOD
53    pub fn mulmod_u8(a: u8, b: u8, n: u8) -> u8;
54
55    /// Emit opcode ADDMOD
56    pub fn addmod_u16(a: u16, b: u16, n: u16) -> u16;
57    /// Emit opcode ADDMOD
58    pub fn mulmod_u16(a: u16, b: u16, n: u16) -> u16;
59
60    /// Emit opcode ADDMOD
61    pub fn addmod_u32(a: u32, b: u32, n: u32) -> u32;
62    /// Emit opcode ADDMOD
63    pub fn mulmod_u32(a: u32, b: u32, n: u32) -> u32;
64
65    /// Emit opcode ADDMOD
66    pub fn addmod_u64(a: u64, b: u64, n: u64) -> u64;
67    /// Emit opcode ADDMOD
68    pub fn mulmod_u64(a: u64, b: u64, n: u64) -> u64;
69
70    /// Revert with message in 32 bytes
71    pub fn revert1(message: &'static str);
72
73    /// Revert with message in 64 bytes
74    pub fn revert2(message: &'static str);
75
76    /// Revert with message in 96 bytes
77    pub fn revert3(message: &'static str);
78
79    /// Revert with message in 128 bytes
80    pub fn revert4(message: &'static str);
81
82    /// Load a 8-bit signed integer from the storage.
83    pub fn sload_i8() -> i8;
84
85    /// Load a 8-bit unsigned integer from the storage.
86    pub fn sload_u8() -> u8;
87
88    /// Load a 16-bit signed integer from the storage.
89    pub fn sload_i16() -> i16;
90
91    /// Load a 16-bit unsigned integer from the storage.
92    pub fn sload_u16() -> u16;
93
94    /// Load a 32-bit signed integer from the storage.
95    pub fn sload_i32() -> i32;
96
97    /// Load a 32-bit unsigned integer from the storage.
98    pub fn sload_u32() -> u32;
99
100    /// Load a 64-bit signed integer from the storage.
101    pub fn sload_i64() -> i64;
102
103    /// Load a 64-bit unsigned integer from the storage.
104    pub fn sload_u64() -> u64;
105
106    /// Load a 8-bit signed integer from the transient storage.
107    pub fn tload_i8() -> i8;
108
109    /// Load a 8-bit unsigned integer from the transient storage.
110    pub fn tload_u8() -> u8;
111
112    /// Load a 16-bit signed integer from the transient storage.
113    pub fn tload_i16() -> i16;
114
115    /// Load a 16-bit unsigned integer from the transient storage.
116    pub fn tload_u16() -> u16;
117
118    /// Load a 32-bit signed integer from the transient storage.
119    pub fn tload_i32() -> i32;
120
121    /// Load a 32-bit unsigned integer from the transient storage.
122    pub fn tload_u32() -> u32;
123
124    /// Load a 64-bit signed integer from the transient storage.
125    pub fn tload_i64() -> i64;
126
127    /// Load a 64-bit unsigned integer from the transient storage.
128    pub fn tload_u64() -> u64;
129
130    /// Store a 8-bit signed integer to the transient storage.
131    pub fn tstore_i8(val: i8);
132
133    /// Store a 8-bit unsigned integer to the transient storage.
134    pub fn tstore_u8(val: u8);
135
136    /// Store a 16-bit signed integer to the transient storage.
137    pub fn tstore_i16(val: i16);
138
139    /// Store a 16-bit unsigned integer to the transient storage.
140    pub fn tstore_u16(val: u16);
141
142    /// Store a 32-bit signed integer to the transient storage.
143    pub fn tstore_i32(val: i32);
144
145    /// Store a 32-bit unsigned integer to the transient storage.
146    pub fn tstore_u32(val: u32);
147
148    /// Store a 64-bit signed integer to the transient storage.
149    pub fn tstore_i64(val: i64);
150
151    /// Store a 64-bit unsigned integer to the transient storage.
152    pub fn tstore_u64(val: u64);
153}
154
155#[allow(clippy::module_inception)]
156#[cfg(not(target_arch = "wasm32"))]
157pub mod asm {
158    pub fn push_i8(_val: i8) {
159        unimplemented!("Only available in wasm32 target");
160    }
161
162    pub fn push_u8(_val: u8) {
163        unimplemented!("Only available in wasm32 target");
164    }
165
166    pub fn push_i16(_val: i16) {
167        unimplemented!("Only available in wasm32 target");
168    }
169
170    pub fn push_u16(_val: u16) {
171        unimplemented!("Only available in wasm32 target");
172    }
173
174    pub fn push_i32(_val: i32) {
175        unimplemented!("Only available in wasm32 target");
176    }
177
178    pub fn push_u32(_val: u32) {
179        unimplemented!("Only available in wasm32 target");
180    }
181
182    pub fn push_i64(_val: i64) {
183        unimplemented!("Only available in wasm32 target");
184    }
185
186    pub fn push_u64(_val: u64) {
187        unimplemented!("Only available in wasm32 target");
188    }
189
190    pub fn addmod_i8(_a: i8, _b: i8, _n: i8) -> i8 {
191        unimplemented!("Only available in wasm32 target");
192    }
193
194    pub fn mulmod_i8(_a: i8, _b: i8, _n: i8) -> i8 {
195        unimplemented!("Only available in wasm32 target");
196    }
197
198    pub fn addmod_i16(_a: i16, _b: i16, _n: i16) -> i16 {
199        unimplemented!("Only available in wasm32 target");
200    }
201
202    pub fn mulmod_i16(_a: i16, _b: i16, _n: i16) -> i16 {
203        unimplemented!("Only available in wasm32 target");
204    }
205
206    pub fn addmod_i32(_a: i32, _b: i32, _n: i32) -> i32 {
207        unimplemented!("Only available in wasm32 target");
208    }
209
210    pub fn mulmod_i32(_a: i32, _b: i32, _n: i32) -> i32 {
211        unimplemented!("Only available in wasm32 target");
212    }
213
214    pub fn addmod_i64(_a: i64, _b: i64, _n: i64) -> i64 {
215        unimplemented!("Only available in wasm32 target");
216    }
217
218    pub fn mulmod_i64(_a: i64, _b: i64, _n: i64) -> i64 {
219        unimplemented!("Only available in wasm32 target");
220    }
221
222    pub fn addmod_u8(_a: u8, _b: u8, _n: u8) -> u8 {
223        unimplemented!("Only available in wasm32 target");
224    }
225
226    pub fn mulmod_u8(_a: u8, _b: u8, _n: u8) -> u8 {
227        unimplemented!("Only available in wasm32 target");
228    }
229
230    pub fn addmod_u16(_a: u16, _b: u16, _n: u16) -> u16 {
231        unimplemented!("Only available in wasm32 target");
232    }
233
234    pub fn mulmod_u16(_a: u16, _b: u16, _n: u16) -> u16 {
235        unimplemented!("Only available in wasm32 target");
236    }
237
238    pub fn addmod_u32(_a: u32, _b: u32, _n: u32) -> u32 {
239        unimplemented!("Only available in wasm32 target");
240    }
241
242    pub fn mulmod_u32(_a: u32, _b: u32, _n: u32) -> u32 {
243        unimplemented!("Only available in wasm32 target");
244    }
245
246    pub fn addmod_u64(_a: u64, _b: u64, _n: u64) -> u64 {
247        unimplemented!("Only available in wasm32 target");
248    }
249
250    pub fn mulmod_u64(_a: u64, _b: u64, _n: u64) -> u64 {
251        unimplemented!("Only available in wasm32 target");
252    }
253
254    pub fn revert1(message: &'static str) {
255        panic!("Revert: {}", message);
256    }
257
258    pub fn revert2(_message: &'static str) {
259        panic!("Revert called");
260    }
261
262    pub fn revert3(_message: &'static str) {
263        panic!("Revert called");
264    }
265
266    pub fn revert4(_message: &'static str) {
267        panic!("Revert called");
268    }
269
270    pub fn sload(_slot: i32) -> i32 {
271        unimplemented!("Only available in wasm32 target");
272    }
273
274    pub fn sload_i8() -> i8 {
275        unimplemented!("Only available in wasm32 target");
276    }
277
278    pub fn sload_u8() -> u8 {
279        unimplemented!("Only available in wasm32 target");
280    }
281
282    pub fn sload_i16() -> i16 {
283        unimplemented!("Only available in wasm32 target");
284    }
285
286    pub fn sload_u16() -> u16 {
287        unimplemented!("Only available in wasm32 target");
288    }
289
290    pub fn sload_i32() -> i32 {
291        unimplemented!("Only available in wasm32 target");
292    }
293
294    pub fn sload_u32() -> u32 {
295        unimplemented!("Only available in wasm32 target");
296    }
297
298    pub fn sload_i64() -> i64 {
299        unimplemented!("Only available in wasm32 target");
300    }
301
302    pub fn sload_u64() -> u64 {
303        unimplemented!("Only available in wasm32 target");
304    }
305
306    pub fn sstore(_slot: i32, _value: i32) {
307        unimplemented!("Only available in wasm32 target");
308    }
309
310    pub fn tload(_slot: i32) -> i32 {
311        unimplemented!("Only available in wasm32 target");
312    }
313
314    pub fn tload_i8() -> i8 {
315        unimplemented!("Only available in wasm32 target");
316    }
317
318    pub fn tload_u8() -> u8 {
319        unimplemented!("Only available in wasm32 target");
320    }
321
322    pub fn tload_i16() -> i16 {
323        unimplemented!("Only available in wasm32 target");
324    }
325
326    pub fn tload_u16() -> u16 {
327        unimplemented!("Only available in wasm32 target");
328    }
329
330    pub fn tload_i32() -> i32 {
331        unimplemented!("Only available in wasm32 target");
332    }
333
334    pub fn tload_u32() -> u32 {
335        unimplemented!("Only available in wasm32 target");
336    }
337
338    pub fn tload_i64() -> i64 {
339        unimplemented!("Only available in wasm32 target");
340    }
341
342    pub fn tload_u64() -> u64 {
343        unimplemented!("Only available in wasm32 target");
344    }
345
346    pub fn tstore(_slot: i32, _value: i32) {
347        unimplemented!("Only available in wasm32 target");
348    }
349
350    pub fn tstore_i8(_val: i8) {
351        unimplemented!("Only available in wasm32 target");
352    }
353
354    pub fn tstore_u8(_val: u8) {
355        unimplemented!("Only available in wasm32 target");
356    }
357
358    pub fn tstore_i16(_val: i16) {
359        unimplemented!("Only available in wasm32 target");
360    }
361
362    pub fn tstore_u16(_val: i16) {
363        unimplemented!("Only available in wasm32 target");
364    }
365
366    pub fn tstore_i32(_val: i32) {
367        unimplemented!("Only available in wasm32 target");
368    }
369
370    pub fn tstore_u32(_val: u32) {
371        unimplemented!("Only available in wasm32 target");
372    }
373
374    pub fn tstore_i64(_val: i64) {
375        unimplemented!("Only available in wasm32 target");
376    }
377
378    pub fn tstore_u64(_val: u64) {
379        unimplemented!("Only available in wasm32 target");
380    }
381}
382
383#[cfg(not(target_arch = "wasm32"))]
384pub use asm::*;