2 * Copyright (C) 2024 Mikulas Patocka
4 * This file is part of Ajla.
6 * Ajla is free software: you can redistribute it and/or modify it under the
7 * terms of the GNU General Public License as published by the Free Software
8 * Foundation, either version 3 of the License, or (at your option) any later
11 * Ajla is distributed in the hope that it will be useful, but WITHOUT ANY
12 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
13 * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along with
16 * Ajla. If not, see <https://www.gnu.org/licenses/>.
25 #define cg_upcall_vector name(cg_upcall_vector)
27 /*#define DEBUG_UPCALL*/
29 #ifdef POINTER_COMPRESSION
30 #define pointer_t_upcall uintptr_t
31 #define int_default_t_upcall intptr_t
33 #define pointer_t_upcall pointer_t
34 #define int_default_t_upcall int_default_t
37 void attr_fastcall
run(frame_s
*, ip_t
);
39 struct cg_upcall_vector_s
{
40 atomic_type tick_stamp_t ts
;
42 void (*mem_copy
)(void *dest
, const void *src
, size_t size
);
43 void (*mem_clear
)(void *ptr
, size_t size
);
44 void (*cg_upcall_pointer_dereference
)(pointer_t_upcall ptr
);
45 void (*cg_upcall_pointer_reference_owned
)(pointer_t_upcall ptr
);
46 pointer_t (*cg_upcall_flat_to_data
)(frame_s
*fp
, uintptr_t slot
, const unsigned char *flat
);
47 unsigned char *(*cg_upcall_data_alloc_function_reference_mayfail
)(uintptr_t n_curried_arguments
);
48 unsigned char *(*cg_upcall_data_alloc_record_mayfail
)(frame_s
*fp
, uintptr_t slot
);
49 unsigned char *(*cg_upcall_data_alloc_option_mayfail
)(void);
50 unsigned char *(*cg_upcall_data_alloc_array_flat_tag_mayfail
)(uintptr_t t
, int_default_t_upcall n_entries
);
51 unsigned char *(*cg_upcall_data_alloc_array_flat_slot_mayfail
)(frame_s
*fp
, uintptr_t slot
, int_default_t_upcall n_entries
);
52 unsigned char *(*cg_upcall_data_alloc_array_flat_types_ptr_mayfail
)(frame_s
*fp
, uintptr_t local_type
, int_default_t_upcall n_allocated
, int_default_t_upcall n_used
);
53 unsigned char *(*cg_upcall_data_alloc_array_pointers_mayfail
)(int_default_t_upcall n_allocated
, int_default_t_upcall n_used
);
54 pointer_t (*cg_upcall_array_create_flat
)(frame_s
*fp
, int_default_t_upcall length
, uintptr_t content_slot
);
55 pointer_t (*cg_upcall_array_create_pointers
)(frame_s
*fp
, uintptr_t ip_offset
, uintptr_t length_slot
, pointer_t_upcall ptr
);
56 pointer_t (*cg_upcall_array_create_sparse
)(int_default_t_upcall length
, pointer_t_upcall ptr
);
57 pointer_t (*cg_upcall_array_sub
)(pointer_t_upcall array
, int_default_t_upcall start
, int_default_t_upcall end
, bool deref
);
58 pointer_t (*cg_upcall_array_skip
)(pointer_t_upcall array
, int_default_t_upcall start
, bool deref
);
59 pointer_t (*cg_upcall_array_join
)(pointer_t_upcall ptr1
, pointer_t_upcall ptr2
);
60 void *(*cg_upcall_ipret_io
)(frame_s
*fp
, uintptr_t ip_offset
, uintptr_t code_params
);
61 pointer_t (*cg_upcall_ipret_copy_variable_to_pointer
)(frame_s
*src_fp
, uintptr_t src_slot
, bool deref
);
62 int_default_t (*cg_upcall_ipret_system_property
)(int_default_t_upcall idx
);
63 #define f(n, s, u, sz, bits) \
64 bool (*cat(INT_binary_const_,s))(const s *v1, int_default_t_upcall v2, s *r, bool (*op)(const void *, const void *, void *));
65 for_all_int(f
, for_all_empty
)
67 bool (*cat(FIXED_binary_add_
,TYPE_INT_MAX
))(const uintbig_t
*v1
, const uintbig_t
*v2
, uintbig_t
*r
);
68 bool (*cat(FIXED_binary_subtract_
,TYPE_INT_MAX
))(const uintbig_t
*v1
, const uintbig_t
*v2
, uintbig_t
*r
);
69 #define f(n, s, u, sz, bits) \
70 bool (*cat(FIXED_binary_multiply_,s))(const u *v1, const u *v2, u *r);
73 #define f(n, s, u, sz, bits) \
74 bool (*cat(FIXED_binary_divide_,s))(const u *v1, const u *v2, u *r);
77 #define f(n, s, u, sz, bits) \
78 bool (*cat(FIXED_binary_udivide_,s))(const u *v1, const u *v2, u *r);
81 #define f(n, s, u, sz, bits) \
82 bool (*cat(FIXED_binary_modulo_,s))(const u *v1, const u *v2, u *r);
85 #define f(n, s, u, sz, bits) \
86 bool (*cat(FIXED_binary_umodulo_,s))(const u *v1, const u *v2, u *r);
89 #define f(n, s, u, sz, bits) \
90 bool (*cat(FIXED_binary_power_,s))(const u *v1, const u *v2, u *r);
93 bool (*cat(FIXED_binary_shl_
,TYPE_INT_MAX
))(const uintbig_t
*v1
, const uintbig_t
*v2
, uintbig_t
*r
);
94 bool (*cat(FIXED_binary_shr_
,TYPE_INT_MAX
))(const uintbig_t
*v1
, const uintbig_t
*v2
, uintbig_t
*r
);
95 bool (*cat(FIXED_binary_ushr_
,TYPE_INT_MAX
))(const uintbig_t
*v1
, const uintbig_t
*v2
, uintbig_t
*r
);
96 bool (*cat(FIXED_binary_rol_
,TYPE_INT_MAX
))(const uintbig_t
*v1
, const uintbig_t
*v2
, uintbig_t
*r
);
97 bool (*cat(FIXED_binary_ror_
,TYPE_INT_MAX
))(const uintbig_t
*v1
, const uintbig_t
*v2
, uintbig_t
*r
);
98 bool (*cat(FIXED_binary_bts_
,TYPE_INT_MAX
))(const uintbig_t
*v1
, const uintbig_t
*v2
, uintbig_t
*r
);
99 bool (*cat(FIXED_binary_btr_
,TYPE_INT_MAX
))(const uintbig_t
*v1
, const uintbig_t
*v2
, uintbig_t
*r
);
100 bool (*cat(FIXED_binary_btc_
,TYPE_INT_MAX
))(const uintbig_t
*v1
, const uintbig_t
*v2
, uintbig_t
*r
);
101 bool (*cat(FIXED_binary_less_
,TYPE_INT_MAX
))(const uintbig_t
*v1
, const uintbig_t
*v2
, ajla_flat_option_t
*r
);
102 bool (*cat(FIXED_binary_less_equal_
,TYPE_INT_MAX
))(const uintbig_t
*v1
, const uintbig_t
*v2
, ajla_flat_option_t
*r
);
103 bool (*cat(FIXED_binary_greater_
,TYPE_INT_MAX
))(const uintbig_t
*v1
, const uintbig_t
*v2
, ajla_flat_option_t
*r
);
104 bool (*cat(FIXED_binary_greater_equal_
,TYPE_INT_MAX
))(const uintbig_t
*v1
, const uintbig_t
*v2
, ajla_flat_option_t
*r
);
105 bool (*cat(FIXED_binary_uless_
,TYPE_INT_MAX
))(const uintbig_t
*v1
, const uintbig_t
*v2
, ajla_flat_option_t
*r
);
106 bool (*cat(FIXED_binary_uless_equal_
,TYPE_INT_MAX
))(const uintbig_t
*v1
, const uintbig_t
*v2
, ajla_flat_option_t
*r
);
107 bool (*cat(FIXED_binary_ugreater_
,TYPE_INT_MAX
))(const uintbig_t
*v1
, const uintbig_t
*v2
, ajla_flat_option_t
*r
);
108 bool (*cat(FIXED_binary_ugreater_equal_
,TYPE_INT_MAX
))(const uintbig_t
*v1
, const uintbig_t
*v2
, ajla_flat_option_t
*r
);
109 bool (*cat(FIXED_binary_bt_
,TYPE_INT_MAX
))(const uintbig_t
*v1
, const uintbig_t
*v2
, ajla_flat_option_t
*r
);
110 void (*cat(FIXED_unary_neg_
,TYPE_INT_MAX
))(const uintbig_t
*v1
, uintbig_t
*r
);
111 #define f(n, s, u, sz, bits) \
112 void (*cat(FIXED_unary_bswap_,s))(const u *v1, u *r);
115 #define f(n, s, u, sz, bits) \
116 void (*cat(FIXED_unary_brev_,s))(const u *v1, u *r);
119 #define f(n, s, u, sz, bits) \
120 void (*cat(FIXED_unary_bsf_,s))(const u *v1, u *r);
123 #define f(n, s, u, sz, bits) \
124 void (*cat(FIXED_unary_bsr_,s))(const u *v1, u *r);
127 #define f(n, s, u, sz, bits) \
128 void (*cat(FIXED_unary_popcnt_,s))(const u *v1, u *r);
131 #define f(n, s, u, sz, bits) \
132 bool (*cat(FIXED_uto_int_,s))(const u *v1, int_default_t *r);
135 #define f(n, s, u, sz, bits) \
136 bool (*cat(FIXED_ufrom_int_,s))(const int_default_t *v1, u *r);
139 bool (*cat(INT_binary_add_
,TYPE_INT_MAX
))(const intbig_t
*v1
, const intbig_t
*v2
, intbig_t
*r
);
140 bool (*cat(INT_binary_subtract_
,TYPE_INT_MAX
))(const intbig_t
*v1
, const intbig_t
*v2
, intbig_t
*r
);
141 #define f(n, s, u, sz, bits) \
142 bool (*cat(INT_binary_multiply_,s))(const s *v1, const s *v2, s *r);
143 for_all_int(f
, for_all_empty
)
145 #define f(n, s, u, sz, bits) \
146 bool (*cat(INT_binary_divide_,s))(const s *v1, const s *v2, s *r);
147 for_all_int(f
, for_all_empty
)
149 #define f(n, s, u, sz, bits) \
150 bool (*cat(INT_binary_modulo_,s))(const s *v1, const s *v2, s *r);
151 for_all_int(f
, for_all_empty
)
153 #define f(n, s, u, sz, bits) \
154 bool (*cat(INT_binary_power_,s))(const s *v1, const s *v2, s *r);
155 for_all_int(f
, for_all_empty
)
157 bool (*cat(INT_binary_shl_
,TYPE_INT_MAX
))(const intbig_t
*v1
, const intbig_t
*v2
, intbig_t
*r
);
158 bool (*cat(INT_binary_shr_
,TYPE_INT_MAX
))(const intbig_t
*v1
, const intbig_t
*v2
, intbig_t
*r
);
159 bool (*cat(INT_binary_bts_
,TYPE_INT_MAX
))(const intbig_t
*v1
, const intbig_t
*v2
, intbig_t
*r
);
160 bool (*cat(INT_binary_btr_
,TYPE_INT_MAX
))(const intbig_t
*v1
, const intbig_t
*v2
, intbig_t
*r
);
161 bool (*cat(INT_binary_btc_
,TYPE_INT_MAX
))(const intbig_t
*v1
, const intbig_t
*v2
, intbig_t
*r
);
162 bool (*cat(INT_binary_bt_
,TYPE_INT_MAX
))(const intbig_t
*v1
, const intbig_t
*v2
, ajla_flat_option_t
*r
);
163 bool (*cat(INT_unary_neg_
,TYPE_INT_MAX
))(const intbig_t
*v1
, intbig_t
*r
);
164 #define f(n, s, u, sz, bits) \
165 bool (*cat(INT_unary_bsf_,s))(const s *v1, s *r);
166 for_all_int(f
, for_all_empty
)
168 #define f(n, s, u, sz, bits) \
169 bool (*cat(INT_unary_bsr_,s))(const s *v1, s *r);
170 for_all_int(f
, for_all_empty
)
172 #define f(n, s, u, sz, bits) \
173 bool (*cat(INT_unary_popcnt_,s))(const s *v1, s *r);
174 for_all_int(f
, for_all_empty
)
176 #define f(n, t, nt, pack, unpack) \
177 bool (*cat(REAL_binary_add_,t))(const t *v1, const t *v2, t *r);
179 void (*cat(REAL_binary_add_,t))(void);
183 #define f(n, t, nt, pack, unpack) \
184 bool (*cat(REAL_binary_subtract_,t))(const t *v1, const t *v2, t *r);
186 void (*cat(REAL_binary_subtract_,t))(void);
190 #define f(n, t, nt, pack, unpack) \
191 bool (*cat(REAL_binary_multiply_,t))(const t *v1, const t *v2, t *r);
193 void (*cat(REAL_binary_multiply_,t))(void);
197 #define f(n, t, nt, pack, unpack) \
198 bool (*cat(REAL_binary_divide_,t))(const t *v1, const t *v2, t *r);
200 void (*cat(REAL_binary_divide_,t))(void);
204 #define f(n, t, nt, pack, unpack) \
205 bool (*cat(REAL_binary_modulo_,t))(const t *v1, const t *v2, t *r);
207 void (*cat(REAL_binary_modulo_,t))(void);
211 #define f(n, t, nt, pack, unpack) \
212 bool (*cat(REAL_binary_power_,t))(const t *v1, const t *v2, t *r);
214 void (*cat(REAL_binary_power_,t))(void);
218 #define f(n, t, nt, pack, unpack) \
219 bool (*cat(REAL_binary_ldexp_,t))(const t *v1, const t *v2, t *r);
221 void (*cat(REAL_binary_ldexp_,t))(void);
225 #define f(n, t, nt, pack, unpack) \
226 bool (*cat(REAL_binary_atan2_,t))(const t *v1, const t *v2, t *r);
228 void (*cat(REAL_binary_atan2_,t))(void);
232 #define f(n, t, nt, pack, unpack) \
233 bool (*cat(REAL_binary_equal_,t))(const t *v1, const t *v2, ajla_flat_option_t *r);
235 void (*cat(REAL_binary_equal_,t))(void);
239 #define f(n, t, nt, pack, unpack) \
240 bool (*cat(REAL_binary_not_equal_,t))(const t *v1, const t *v2, ajla_flat_option_t *r);
242 void (*cat(REAL_binary_not_equal_,t))(void);
246 #define f(n, t, nt, pack, unpack) \
247 bool (*cat(REAL_binary_less_,t))(const t *v1, const t *v2, ajla_flat_option_t *r);
249 void (*cat(REAL_binary_less_,t))(void);
253 #define f(n, t, nt, pack, unpack) \
254 bool (*cat(REAL_binary_less_equal_,t))(const t *v1, const t *v2, ajla_flat_option_t *r);
256 void (*cat(REAL_binary_less_equal_,t))(void);
260 #define f(n, t, nt, pack, unpack) \
261 bool (*cat(REAL_binary_greater_,t))(const t *v1, const t *v2, ajla_flat_option_t *r);
263 void (*cat(REAL_binary_greater_,t))(void);
267 #define f(n, t, nt, pack, unpack) \
268 bool (*cat(REAL_binary_greater_equal_,t))(const t *v1, const t *v2, ajla_flat_option_t *r);
270 void (*cat(REAL_binary_greater_equal_,t))(void);
274 #define f(n, t, nt, pack, unpack) \
275 void (*cat(REAL_unary_neg_,t))(const t *v1, t *r);
277 void (*cat(REAL_unary_neg_,t))(void);
281 #define f(n, t, nt, pack, unpack) \
282 void (*cat(REAL_unary_sqrt_,t))(const t *v1, t *r);
284 void (*cat(REAL_unary_sqrt_,t))(void);
288 #define f(n, t, nt, pack, unpack) \
289 void (*cat(REAL_unary_cbrt_,t))(const t *v1, t *r);
291 void (*cat(REAL_unary_cbrt_,t))(void);
295 #define f(n, t, nt, pack, unpack) \
296 void (*cat(REAL_unary_sin_,t))(const t *v1, t *r);
298 void (*cat(REAL_unary_sin_,t))(void);
302 #define f(n, t, nt, pack, unpack) \
303 void (*cat(REAL_unary_cos_,t))(const t *v1, t *r);
305 void (*cat(REAL_unary_cos_,t))(void);
309 #define f(n, t, nt, pack, unpack) \
310 void (*cat(REAL_unary_tan_,t))(const t *v1, t *r);
312 void (*cat(REAL_unary_tan_,t))(void);
316 #define f(n, t, nt, pack, unpack) \
317 void (*cat(REAL_unary_asin_,t))(const t *v1, t *r);
319 void (*cat(REAL_unary_asin_,t))(void);
323 #define f(n, t, nt, pack, unpack) \
324 void (*cat(REAL_unary_acos_,t))(const t *v1, t *r);
326 void (*cat(REAL_unary_acos_,t))(void);
330 #define f(n, t, nt, pack, unpack) \
331 void (*cat(REAL_unary_atan_,t))(const t *v1, t *r);
333 void (*cat(REAL_unary_atan_,t))(void);
337 #define f(n, t, nt, pack, unpack) \
338 void (*cat(REAL_unary_sinh_,t))(const t *v1, t *r);
340 void (*cat(REAL_unary_sinh_,t))(void);
344 #define f(n, t, nt, pack, unpack) \
345 void (*cat(REAL_unary_cosh_,t))(const t *v1, t *r);
347 void (*cat(REAL_unary_cosh_,t))(void);
351 #define f(n, t, nt, pack, unpack) \
352 void (*cat(REAL_unary_tanh_,t))(const t *v1, t *r);
354 void (*cat(REAL_unary_tanh_,t))(void);
358 #define f(n, t, nt, pack, unpack) \
359 void (*cat(REAL_unary_asinh_,t))(const t *v1, t *r);
361 void (*cat(REAL_unary_asinh_,t))(void);
365 #define f(n, t, nt, pack, unpack) \
366 void (*cat(REAL_unary_acosh_,t))(const t *v1, t *r);
368 void (*cat(REAL_unary_acosh_,t))(void);
372 #define f(n, t, nt, pack, unpack) \
373 void (*cat(REAL_unary_atanh_,t))(const t *v1, t *r);
375 void (*cat(REAL_unary_atanh_,t))(void);
379 #define f(n, t, nt, pack, unpack) \
380 void (*cat(REAL_unary_exp2_,t))(const t *v1, t *r);
382 void (*cat(REAL_unary_exp2_,t))(void);
386 #define f(n, t, nt, pack, unpack) \
387 void (*cat(REAL_unary_exp_,t))(const t *v1, t *r);
389 void (*cat(REAL_unary_exp_,t))(void);
393 #define f(n, t, nt, pack, unpack) \
394 void (*cat(REAL_unary_exp10_,t))(const t *v1, t *r);
396 void (*cat(REAL_unary_exp10_,t))(void);
400 #define f(n, t, nt, pack, unpack) \
401 void (*cat(REAL_unary_log2_,t))(const t *v1, t *r);
403 void (*cat(REAL_unary_log2_,t))(void);
407 #define f(n, t, nt, pack, unpack) \
408 void (*cat(REAL_unary_log_,t))(const t *v1, t *r);
410 void (*cat(REAL_unary_log_,t))(void);
414 #define f(n, t, nt, pack, unpack) \
415 void (*cat(REAL_unary_log10_,t))(const t *v1, t *r);
417 void (*cat(REAL_unary_log10_,t))(void);
421 #define f(n, t, nt, pack, unpack) \
422 void (*cat(REAL_unary_round_,t))(const t *v1, t *r);
424 void (*cat(REAL_unary_round_,t))(void);
428 #define f(n, t, nt, pack, unpack) \
429 void (*cat(REAL_unary_ceil_,t))(const t *v1, t *r);
431 void (*cat(REAL_unary_ceil_,t))(void);
435 #define f(n, t, nt, pack, unpack) \
436 void (*cat(REAL_unary_floor_,t))(const t *v1, t *r);
438 void (*cat(REAL_unary_floor_,t))(void);
442 #define f(n, t, nt, pack, unpack) \
443 void (*cat(REAL_unary_trunc_,t))(const t *v1, t *r);
445 void (*cat(REAL_unary_trunc_,t))(void);
449 #define f(n, t, nt, pack, unpack) \
450 void (*cat(REAL_unary_fract_,t))(const t *v1, t *r);
452 void (*cat(REAL_unary_fract_,t))(void);
456 #define f(n, t, nt, pack, unpack) \
457 void (*cat(REAL_unary_mantissa_,t))(const t *v1, t *r);
459 void (*cat(REAL_unary_mantissa_,t))(void);
463 #define f(n, t, nt, pack, unpack) \
464 void (*cat(REAL_unary_exponent_,t))(const t *v1, t *r);
466 void (*cat(REAL_unary_exponent_,t))(void);
470 #define f(n, t, nt, pack, unpack) \
471 void (*cat(REAL_unary_next_number_,t))(const t *v1, t *r);
473 void (*cat(REAL_unary_next_number_,t))(void);
477 #define f(n, t, nt, pack, unpack) \
478 void (*cat(REAL_unary_prev_number_,t))(const t *v1, t *r);
480 void (*cat(REAL_unary_prev_number_,t))(void);
484 #define f(n, t, nt, pack, unpack) \
485 bool (*cat(REAL_unary_to_int_,t))(const t *val, int_default_t *r);
487 void (*cat(REAL_unary_to_int_,t))(void);
491 #define f(n, t, nt, pack, unpack) \
492 void (*cat(REAL_unary_from_int_,t))(const int_default_t *val, t *r);
494 void (*cat(REAL_unary_from_int_,t))(void);
498 #define f(n, t, nt, pack, unpack) \
499 void (*cat(REAL_unary_is_exception_,t))(const t *v1, ajla_flat_option_t *r);
501 void (*cat(REAL_unary_is_exception_,t))(void);
507 void (*cg_upcall_debug
)(unsigned long x1
, unsigned long x2
, unsigned long x3
, unsigned long x4
);
513 extern struct cg_upcall_vector_s cg_upcall_vector
;
515 #define tick_stamp (cg_upcall_vector.ts)