MXVM 1.8.1
Virtual Machine, Compiler, and Pascal Frontend
Loading...
Searching...
No Matches
std.cpp
Go to the documentation of this file.
1
6#include "mx_std.h"
7#include <mxvm/icode.hpp>
8#include <cctype>
9#include <cmath>
10#include <cstdlib>
11#include <ctime>
12#include <string>
13
14extern "C" void mxvm_std_abs(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
15 if (operand.size() != 1) {
16 throw mx::Exception("abs requires 1 argument (value).");
17 }
18
19 int64_t value = program->isVariable(operand[0].op) ? program->getVariable(operand[0].op).var_value.int_value : operand[0].op_value;
20
21 int64_t result = std::abs(value);
22 program->vars["%rax"].type = mxvm::VarType::VAR_INTEGER;
23 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_INTEGER;
24 program->vars["%rax"].var_value.int_value = result;
25}
26
27extern "C" void mxvm_std_fabs(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
28 if (operand.size() != 1) {
29 throw mx::Exception("fabs requires 1 argument (value).");
30 }
31
32 if (!program->isVariable(operand[0].op)) {
33 throw mx::Exception("fabs argument must be a variable.");
34 }
35
36 mxvm::Variable &var = program->getVariable(operand[0].op);
37 double value = (var.type == mxvm::VarType::VAR_FLOAT) ? var.var_value.float_value : static_cast<double>(var.var_value.int_value);
38
39 double result = std::fabs(value);
40 program->vars["%rax"].type = mxvm::VarType::VAR_FLOAT;
41 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_FLOAT;
42 program->vars["%rax"].var_value.float_value = result;
43}
44
45extern "C" void mxvm_std_sqrt(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
46 if (operand.size() != 1) {
47 throw mx::Exception("sqrt requires 1 argument (value).");
48 }
49
50 if (!program->isVariable(operand[0].op)) {
51 throw mx::Exception("sqrt argument must be a variable.");
52 }
53
54 mxvm::Variable &var = program->getVariable(operand[0].op);
55 double value = (var.type == mxvm::VarType::VAR_FLOAT) ? var.var_value.float_value : static_cast<double>(var.var_value.int_value);
56
57 double result = std::sqrt(value);
58 program->vars["%rax"].type = mxvm::VarType::VAR_FLOAT;
59 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_FLOAT;
60 program->vars["%rax"].var_value.float_value = result;
61}
62
63extern "C" void mxvm_std_pow(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
64 if (operand.size() != 2) {
65 throw mx::Exception("pow requires 2 arguments (base, exponent).");
66 }
67
68 double base, exponent;
69
70 if (program->isVariable(operand[0].op)) {
71 mxvm::Variable &var = program->getVariable(operand[0].op);
72 base = (var.type == mxvm::VarType::VAR_FLOAT) ? var.var_value.float_value : static_cast<double>(var.var_value.int_value);
73 } else {
74 base = static_cast<double>(operand[0].op_value);
75 }
76
77 if (program->isVariable(operand[1].op)) {
78 mxvm::Variable &var = program->getVariable(operand[1].op);
79 exponent = (var.type == mxvm::VarType::VAR_FLOAT) ? var.var_value.float_value : static_cast<double>(var.var_value.int_value);
80 } else {
81 exponent = static_cast<double>(operand[1].op_value);
82 }
83
84 double result = std::pow(base, exponent);
85 program->vars["%rax"].type = mxvm::VarType::VAR_FLOAT;
86 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_FLOAT;
87 program->vars["%rax"].var_value.float_value = result;
88}
89
90extern "C" void mxvm_std_sin(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
91 if (operand.size() != 1) {
92 throw mx::Exception("sin requires 1 argument (angle).");
93 }
94
95 if (!program->isVariable(operand[0].op)) {
96 throw mx::Exception("sin argument must be a variable.");
97 }
98
99 mxvm::Variable &var = program->getVariable(operand[0].op);
100 double value = (var.type == mxvm::VarType::VAR_FLOAT) ? var.var_value.float_value : static_cast<double>(var.var_value.int_value);
101
102 double result = std::sin(value);
103 program->vars["%rax"].type = mxvm::VarType::VAR_FLOAT;
104 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_FLOAT;
105 program->vars["%rax"].var_value.float_value = result;
106}
107
108extern "C" void mxvm_std_cos(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
109 if (operand.size() != 1) {
110 throw mx::Exception("cos requires 1 argument (angle).");
111 }
112
113 if (!program->isVariable(operand[0].op)) {
114 throw mx::Exception("cos argument must be a variable.");
115 }
116
117 mxvm::Variable &var = program->getVariable(operand[0].op);
118 double value = (var.type == mxvm::VarType::VAR_FLOAT) ? var.var_value.float_value : static_cast<double>(var.var_value.int_value);
119
120 double result = std::cos(value);
121 program->vars["%rax"].type = mxvm::VarType::VAR_FLOAT;
122 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_FLOAT;
123 program->vars["%rax"].var_value.float_value = result;
124}
125
126extern "C" void mxvm_std_tan(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
127 if (operand.size() != 1) {
128 throw mx::Exception("tan requires 1 argument (angle).");
129 }
130
131 if (!program->isVariable(operand[0].op)) {
132 throw mx::Exception("tan argument must be a variable.");
133 }
134
135 mxvm::Variable &var = program->getVariable(operand[0].op);
136 double value = (var.type == mxvm::VarType::VAR_FLOAT) ? var.var_value.float_value : static_cast<double>(var.var_value.int_value);
137
138 double result = std::tan(value);
139 program->vars["%rax"].type = mxvm::VarType::VAR_FLOAT;
140 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_FLOAT;
141 program->vars["%rax"].var_value.float_value = result;
142}
143
144extern "C" void mxvm_std_floor(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
145 if (operand.size() != 1) {
146 throw mx::Exception("floor requires 1 argument (value).");
147 }
148
149 if (!program->isVariable(operand[0].op)) {
150 throw mx::Exception("floor argument must be a variable.");
151 }
152
153 mxvm::Variable &var = program->getVariable(operand[0].op);
154 double value = (var.type == mxvm::VarType::VAR_FLOAT) ? var.var_value.float_value : static_cast<double>(var.var_value.int_value);
155
156 double result = std::floor(value);
157 program->vars["%rax"].type = mxvm::VarType::VAR_FLOAT;
158 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_FLOAT;
159 program->vars["%rax"].var_value.float_value = result;
160}
161
162extern "C" void mxvm_std_ceil(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
163 if (operand.size() != 1) {
164 throw mx::Exception("ceil requires 1 argument (value).");
165 }
166
167 if (!program->isVariable(operand[0].op)) {
168 throw mx::Exception("ceil argument must be a variable.");
169 }
170
171 mxvm::Variable &var = program->getVariable(operand[0].op);
172 double value = (var.type == mxvm::VarType::VAR_FLOAT) ? var.var_value.float_value : static_cast<double>(var.var_value.int_value);
173
174 double result = std::ceil(value);
175 program->vars["%rax"].type = mxvm::VarType::VAR_FLOAT;
176 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_FLOAT;
177 program->vars["%rax"].var_value.float_value = result;
178}
179
180// Random number functions
181extern "C" void mxvm_std_rand(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
182 int64_t result = std::rand();
183 program->vars["%rax"].type = mxvm::VarType::VAR_INTEGER;
184 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_INTEGER;
185 program->vars["%rax"].var_value.int_value = result;
186}
187
188extern "C" void mxvm_std_srand(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
189 if (operand.size() != 1) {
190 throw mx::Exception("srand requires 1 argument (seed).");
191 }
192
193 int64_t seed = program->isVariable(operand[0].op) ? program->getVariable(operand[0].op).var_value.int_value : operand[0].op_value;
194
195 std::srand(static_cast<unsigned int>(seed));
196}
197
198// Memory functions
199extern "C" void mxvm_std_malloc(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
200 if (operand.size() != 1) {
201 throw mx::Exception("malloc requires 1 argument (size).");
202 }
203
204 int64_t size = program->isVariable(operand[0].op) ? program->getVariable(operand[0].op).var_value.int_value : operand[0].op_value;
205
206 void *result = std::malloc(static_cast<size_t>(size));
207 if (result == nullptr) {
208 throw mx::Exception("malloc failed to allocate " + std::to_string(size) + " bytes");
209 }
210 program->vars["%rax"].type = mxvm::VarType::VAR_POINTER;
211 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_POINTER;
212 program->vars["%rax"].var_value.ptr_value = result;
213 program->vars["%rax"].var_value.owns = true;
214 program->vars["%rax"].var_value.ptr_size = static_cast<uint64_t>(size);
215 program->vars["%rax"].var_value.ptr_count = 1;
216}
217
218extern "C" void mxvm_std_calloc(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
219 if (operand.size() != 2) {
220 throw mx::Exception("calloc requires 2 arguments (count, size).");
221 }
222
223 int64_t count = program->isVariable(operand[0].op) ? program->getVariable(operand[0].op).var_value.int_value : operand[0].op_value;
224 int64_t size = program->isVariable(operand[1].op) ? program->getVariable(operand[1].op).var_value.int_value : operand[1].op_value;
225
226 void *result = std::calloc(static_cast<size_t>(count), static_cast<size_t>(size));
227 if (result == nullptr) {
228 throw mx::Exception("calloc failed to allocate " + std::to_string(count) + " * " + std::to_string(size) + " bytes");
229 }
230 program->vars["%rax"].type = mxvm::VarType::VAR_POINTER;
231 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_POINTER;
232 program->vars["%rax"].var_value.ptr_value = result;
233 program->vars["%rax"].var_value.owns = true;
234 program->vars["%rax"].var_value.ptr_size = static_cast<uint64_t>(size);
235 program->vars["%rax"].var_value.ptr_count = static_cast<uint64_t>(count);
236}
237
238extern "C" void mxvm_std_release(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
239 if (operand.size() != 1) {
240 throw mx::Exception("free requires 1 argument (pointer).");
241 }
242
243 if (!program->isVariable(operand[0].op)) {
244 throw mx::Exception("free argument must be a variable.");
245 }
246
247 mxvm::Variable &var = program->getVariable(operand[0].op);
248 if (var.type != mxvm::VarType::VAR_POINTER) {
249 throw mx::Exception("free argument must be a pointer variable.");
250 }
251
252 std::free(var.var_value.ptr_value);
253 var.var_value.ptr_value = nullptr;
254 var.var_value.owns = false;
255 var.var_value.ptr_size = 0;
256 var.var_value.ptr_count = 0;
257}
258
259// Character functions
260extern "C" void mxvm_std_toupper(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
261 if (operand.size() != 1) {
262 throw mx::Exception("toupper requires 1 argument (character).");
263 }
264
265 int64_t ch = program->isVariable(operand[0].op) ? program->getVariable(operand[0].op).var_value.int_value : operand[0].op_value;
266
267 int64_t result = std::toupper(static_cast<int>(ch));
268 program->vars["%rax"].type = mxvm::VarType::VAR_INTEGER;
269 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_INTEGER;
270 program->vars["%rax"].var_value.int_value = result;
271}
272
273extern "C" void mxvm_std_tolower(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
274 if (operand.size() != 1) {
275 throw mx::Exception("tolower requires 1 argument (character).");
276 }
277
278 int64_t ch = program->isVariable(operand[0].op) ? program->getVariable(operand[0].op).var_value.int_value : operand[0].op_value;
279
280 int64_t result = std::tolower(static_cast<int>(ch));
281 program->vars["%rax"].type = mxvm::VarType::VAR_INTEGER;
282 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_INTEGER;
283 program->vars["%rax"].var_value.int_value = result;
284}
285
286extern "C" void mxvm_std_isalpha(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
287 if (operand.size() != 1) {
288 throw mx::Exception("isalpha requires 1 argument (character).");
289 }
290
291 int64_t ch = program->isVariable(operand[0].op) ? program->getVariable(operand[0].op).var_value.int_value : operand[0].op_value;
292
293 int64_t result = std::isalpha(static_cast<int>(ch)) ? 1 : 0;
294 program->vars["%rax"].type = mxvm::VarType::VAR_INTEGER;
295 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_INTEGER;
296 program->vars["%rax"].var_value.int_value = result;
297}
298
299extern "C" void mxvm_std_isdigit(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
300 if (operand.size() != 1) {
301 throw mx::Exception("isdigit requires 1 argument (character).");
302 }
303
304 int64_t ch = program->isVariable(operand[0].op) ? program->getVariable(operand[0].op).var_value.int_value : operand[0].op_value;
305
306 int64_t result = std::isdigit(static_cast<int>(ch)) ? 1 : 0;
307 program->vars["%rax"].type = mxvm::VarType::VAR_INTEGER;
308 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_INTEGER;
309 program->vars["%rax"].var_value.int_value = result;
310}
311
312extern "C" void mxvm_std_isspace(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
313 if (operand.size() != 1) {
314 throw mx::Exception("isspace requires 1 argument (character).");
315 }
316
317 int64_t ch = program->isVariable(operand[0].op) ? program->getVariable(operand[0].op).var_value.int_value : operand[0].op_value;
318
319 int64_t result = std::isspace(static_cast<int>(ch)) ? 1 : 0;
320 program->vars["%rax"].type = mxvm::VarType::VAR_INTEGER;
321 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_INTEGER;
322 program->vars["%rax"].var_value.int_value = result;
323}
324
325// String conversion functions
326extern "C" void mxvm_std_atoi(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
327 if (operand.size() != 1) {
328 throw mx::Exception("atoi requires 1 argument (string).");
329 }
330
331 if (!program->isVariable(operand[0].op)) {
332 throw mx::Exception("atoi argument must be a variable.");
333 }
334
335 mxvm::Variable &var = program->getVariable(operand[0].op);
336 const char *str = nullptr;
337
338 if (var.type == mxvm::VarType::VAR_STRING) {
339 str = var.var_value.str_value.c_str();
340 } else if (var.type == mxvm::VarType::VAR_POINTER) {
341 if (var.var_value.ptr_value == nullptr) {
342 throw mx::Exception("atoi: pointer argument is null");
343 }
344 str = reinterpret_cast<const char *>(var.var_value.ptr_value);
345 } else {
346 throw mx::Exception("atoi argument must be a string or pointer variable.");
347 }
348
349 int64_t result = std::atoi(str);
350 program->vars["%rax"].type = mxvm::VarType::VAR_INTEGER;
351 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_INTEGER;
352 program->vars["%rax"].var_value.int_value = result;
353}
354
355extern "C" void mxvm_std_atof(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
356 if (operand.size() != 1) {
357 throw mx::Exception("atof requires 1 argument (string).");
358 }
359
360 if (!program->isVariable(operand[0].op)) {
361 throw mx::Exception("atof argument must be a variable.");
362 }
363
364 mxvm::Variable &var = program->getVariable(operand[0].op);
365 const char *str = nullptr;
366
367 if (var.type == mxvm::VarType::VAR_STRING) {
368 str = var.var_value.str_value.c_str();
369 } else if (var.type == mxvm::VarType::VAR_POINTER) {
370 if (var.var_value.ptr_value == nullptr) {
371 throw mx::Exception("atof: pointer argument is null");
372 }
373 str = reinterpret_cast<const char *>(var.var_value.ptr_value);
374 } else {
375 throw mx::Exception("atof argument must be a string or pointer variable.");
376 }
377
378 double result = std::atof(str);
379 program->vars["%rax"].type = mxvm::VarType::VAR_FLOAT;
380 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_FLOAT;
381 program->vars["%rax"].var_value.float_value = result;
382}
383
384// Utility functions
385extern "C" void mxvm_std_exit(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
386 int64_t exit_code = 0;
387 if (!operand.empty()) {
388 exit_code = program->isVariable(operand[0].op) ? program->getVariable(operand[0].op).var_value.int_value : operand[0].op_value;
389 }
390
391 std::exit(static_cast<int>(exit_code));
392}
393
394extern "C" void mxvm_std_system(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
395 if (operand.size() != 1) {
396 throw mx::Exception("system requires 1 argument (command).");
397 }
398
399 if (!program->isVariable(operand[0].op)) {
400 throw mx::Exception("system argument must be a variable.");
401 }
402
403 mxvm::Variable &var = program->getVariable(operand[0].op);
404 const char *command = nullptr;
405
406 if (var.type == mxvm::VarType::VAR_STRING) {
407 command = var.var_value.str_value.c_str();
408 } else if (var.type == mxvm::VarType::VAR_POINTER) {
409 if (var.var_value.ptr_value == nullptr) {
410 throw mx::Exception("system: pointer argument is null");
411 }
412 command = reinterpret_cast<const char *>(var.var_value.ptr_value);
413 } else {
414 throw mx::Exception("system argument must be a string or pointer variable.");
415 }
416
417 int64_t result = std::system(command);
418 program->vars["%rax"].type = mxvm::VarType::VAR_INTEGER;
419 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_INTEGER;
420 program->vars["%rax"].var_value.int_value = result;
421}
422
423// ...existing code...
424
425extern "C" void mxvm_std_memcpy(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
426 if (operand.size() != 3) {
427 throw mx::Exception("memcpy requires 3 arguments (dest, src, size).");
428 }
429
430 if (!program->isVariable(operand[0].op) || !program->isVariable(operand[1].op)) {
431 throw mx::Exception("memcpy dest and src must be pointer variables.");
432 }
433
434 mxvm::Variable &dest = program->getVariable(operand[0].op);
435 mxvm::Variable &src = program->getVariable(operand[1].op);
436
438 throw mx::Exception("memcpy dest and src must be pointer variables.");
439 }
440
441 mxvm::except_assert("memcpy: dest pointer is null", dest.var_value.ptr_value != nullptr);
442 mxvm::except_assert("memcpy: src pointer is null", src.var_value.ptr_value != nullptr);
443
444 size_t n = 0;
445 if (program->isVariable(operand[2].op)) {
446 mxvm::Variable &size_var = program->getVariable(operand[2].op);
447 n = static_cast<size_t>(size_var.var_value.int_value);
448 } else {
449 n = static_cast<size_t>(operand[2].op_value);
450 }
451
452 if (n > 0) {
453 memcpy(dest.var_value.ptr_value, src.var_value.ptr_value, n);
454 }
455
456 // Return dest pointer in %rax
457 program->vars["%rax"].type = mxvm::VarType::VAR_POINTER;
458 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_POINTER;
459 program->vars["%rax"].var_value.ptr_value = dest.var_value.ptr_value;
460}
461
462extern "C" void mxvm_std_memcmp(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
463 if (operand.size() != 3) {
464 throw mx::Exception("memcmp requires 3 arguments (ptr1, ptr2, size).");
465 }
466
467 if (!program->isVariable(operand[0].op) || !program->isVariable(operand[1].op)) {
468 throw mx::Exception("memcmp ptr1 and ptr2 must be pointer variables.");
469 }
470
471 mxvm::Variable &ptr1 = program->getVariable(operand[0].op);
472 mxvm::Variable &ptr2 = program->getVariable(operand[1].op);
473
475 throw mx::Exception("memcmp ptr1 and ptr2 must be pointer variables.");
476 }
477
478 mxvm::except_assert("memcmp: ptr1 is null", ptr1.var_value.ptr_value != nullptr);
479 mxvm::except_assert("memcmp: ptr2 is null", ptr2.var_value.ptr_value != nullptr);
480
481 size_t n = 0;
482 if (program->isVariable(operand[2].op)) {
483 mxvm::Variable &size_var = program->getVariable(operand[2].op);
484 n = static_cast<size_t>(size_var.var_value.int_value);
485 } else {
486 n = static_cast<size_t>(operand[2].op_value);
487 }
488
489 int result = 0;
490 if (n > 0) {
491 result = memcmp(ptr1.var_value.ptr_value, ptr2.var_value.ptr_value, n);
492 }
493
494 program->vars["%rax"].type = mxvm::VarType::VAR_INTEGER;
495 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_INTEGER;
496 program->vars["%rax"].var_value.int_value = static_cast<int64_t>(result);
497}
498
499extern "C" void mxvm_std_memmove(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
500 if (operand.size() != 3) {
501 throw mx::Exception("memmove requires 3 arguments (dest, src, size).");
502 }
503
504 if (!program->isVariable(operand[0].op) || !program->isVariable(operand[1].op)) {
505 throw mx::Exception("memmove dest and src must be pointer variables.");
506 }
507
508 mxvm::Variable &dest = program->getVariable(operand[0].op);
509 mxvm::Variable &src = program->getVariable(operand[1].op);
510
512 throw mx::Exception("memmove dest and src must be pointer variables.");
513 }
514
515 mxvm::except_assert("memmove: dest pointer is null", dest.var_value.ptr_value != nullptr);
516 mxvm::except_assert("memmove: src pointer is null", src.var_value.ptr_value != nullptr);
517
518 size_t n = 0;
519 if (program->isVariable(operand[2].op)) {
520 mxvm::Variable &size_var = program->getVariable(operand[2].op);
521 n = static_cast<size_t>(size_var.var_value.int_value);
522 } else {
523 n = static_cast<size_t>(operand[2].op_value);
524 }
525
526 if (n > 0) {
527 memmove(dest.var_value.ptr_value, src.var_value.ptr_value, n);
528 }
529
530 // Return dest pointer in %rax
531 program->vars["%rax"].type = mxvm::VarType::VAR_POINTER;
532 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_POINTER;
533 program->vars["%rax"].var_value.ptr_value = dest.var_value.ptr_value;
534}
535
536extern "C" void mxvm_std_memset(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
537 if (operand.size() != 3) {
538 throw mx::Exception("memset requires 3 arguments (dest, value, size).");
539 }
540
541 if (!program->isVariable(operand[0].op)) {
542 throw mx::Exception("memset dest must be a pointer variable.");
543 }
544
545 mxvm::Variable &dest = program->getVariable(operand[0].op);
546
547 if (dest.type != mxvm::VarType::VAR_POINTER) {
548 throw mx::Exception("memset dest must be a pointer variable.");
549 }
550
551 mxvm::except_assert("memset: dest pointer is null", dest.var_value.ptr_value != nullptr);
552
553 int value = 0;
554 if (program->isVariable(operand[1].op)) {
555 mxvm::Variable &val_var = program->getVariable(operand[1].op);
556 value = static_cast<int>(val_var.var_value.int_value);
557 } else {
558 value = static_cast<int>(operand[1].op_value);
559 }
560
561 size_t n = 0;
562 if (program->isVariable(operand[2].op)) {
563 mxvm::Variable &size_var = program->getVariable(operand[2].op);
564 n = static_cast<size_t>(size_var.var_value.int_value);
565 } else {
566 n = static_cast<size_t>(operand[2].op_value);
567 }
568
569 if (n > 0) {
570 memset(dest.var_value.ptr_value, value, n);
571 }
572
573 program->vars["%rax"].type = mxvm::VarType::VAR_POINTER;
574 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_POINTER;
575 program->vars["%rax"].var_value.ptr_value = dest.var_value.ptr_value;
576}
577
578extern "C" void mxvm_std_exp(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
579 if (operand.size() != 1)
580 throw mx::Exception("exp requires 1 argument.");
581 double v = program->isVariable(operand[0].op) ? (program->getVariable(operand[0].op).type == mxvm::VarType::VAR_FLOAT ? program->getVariable(operand[0].op).var_value.float_value : (double)program->getVariable(operand[0].op).var_value.int_value)
582 : (double)operand[0].op_value;
583 double r = std::exp(v);
584 program->vars["%rax"].type = mxvm::VarType::VAR_FLOAT;
585 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_FLOAT;
586 program->vars["%rax"].var_value.float_value = r;
587}
588
589extern "C" void mxvm_std_exp2(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
590 if (operand.size() != 1)
591 throw mx::Exception("exp2 requires 1 argument.");
592 double v = program->isVariable(operand[0].op) ? (program->getVariable(operand[0].op).type == mxvm::VarType::VAR_FLOAT ? program->getVariable(operand[0].op).var_value.float_value : (double)program->getVariable(operand[0].op).var_value.int_value)
593 : (double)operand[0].op_value;
594 double r = std::exp2(v);
595 program->vars["%rax"].type = mxvm::VarType::VAR_FLOAT;
596 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_FLOAT;
597 program->vars["%rax"].var_value.float_value = r;
598}
599
600extern "C" void mxvm_std_log(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
601 if (operand.size() != 1)
602 throw mx::Exception("log requires 1 argument.");
603 double v = program->isVariable(operand[0].op) ? (program->getVariable(operand[0].op).type == mxvm::VarType::VAR_FLOAT ? program->getVariable(operand[0].op).var_value.float_value : (double)program->getVariable(operand[0].op).var_value.int_value)
604 : (double)operand[0].op_value;
605 double r = std::log(v);
606 program->vars["%rax"].type = mxvm::VarType::VAR_FLOAT;
607 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_FLOAT;
608 program->vars["%rax"].var_value.float_value = r;
609}
610
611extern "C" void mxvm_std_log10(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
612 if (operand.size() != 1)
613 throw mx::Exception("log10 requires 1 argument.");
614 double v = program->isVariable(operand[0].op) ? (program->getVariable(operand[0].op).type == mxvm::VarType::VAR_FLOAT ? program->getVariable(operand[0].op).var_value.float_value : (double)program->getVariable(operand[0].op).var_value.int_value)
615 : (double)operand[0].op_value;
616 double r = std::log10(v);
617 program->vars["%rax"].type = mxvm::VarType::VAR_FLOAT;
618 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_FLOAT;
619 program->vars["%rax"].var_value.float_value = r;
620}
621
622extern "C" void mxvm_std_log2(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
623 if (operand.size() != 1)
624 throw mx::Exception("log2 requires 1 argument.");
625 double v = program->isVariable(operand[0].op) ? (program->getVariable(operand[0].op).type == mxvm::VarType::VAR_FLOAT ? program->getVariable(operand[0].op).var_value.float_value : (double)program->getVariable(operand[0].op).var_value.int_value)
626 : (double)operand[0].op_value;
627 double r = std::log2(v);
628 program->vars["%rax"].type = mxvm::VarType::VAR_FLOAT;
629 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_FLOAT;
630 program->vars["%rax"].var_value.float_value = r;
631}
632
633extern "C" void mxvm_std_fmod(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
634 if (operand.size() != 2)
635 throw mx::Exception("fmod requires 2 arguments (x, y).");
636 double x = program->isVariable(operand[0].op) ? (program->getVariable(operand[0].op).type == mxvm::VarType::VAR_FLOAT ? program->getVariable(operand[0].op).var_value.float_value : (double)program->getVariable(operand[0].op).var_value.int_value)
637 : (double)operand[0].op_value;
638 double y = program->isVariable(operand[1].op) ? (program->getVariable(operand[1].op).type == mxvm::VarType::VAR_FLOAT ? program->getVariable(operand[1].op).var_value.float_value : (double)program->getVariable(operand[1].op).var_value.int_value)
639 : (double)operand[1].op_value;
640 double r = std::fmod(x, y);
641 program->vars["%rax"].type = mxvm::VarType::VAR_FLOAT;
642 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_FLOAT;
643 program->vars["%rax"].var_value.float_value = r;
644}
645
646extern "C" void mxvm_std_atan2(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
647 if (operand.size() != 2)
648 throw mx::Exception("atan2 requires 2 arguments (y, x).");
649 double y = program->isVariable(operand[0].op) ? (program->getVariable(operand[0].op).type == mxvm::VarType::VAR_FLOAT ? program->getVariable(operand[0].op).var_value.float_value : (double)program->getVariable(operand[0].op).var_value.int_value)
650 : (double)operand[0].op_value;
651 double x = program->isVariable(operand[1].op) ? (program->getVariable(operand[1].op).type == mxvm::VarType::VAR_FLOAT ? program->getVariable(operand[1].op).var_value.float_value : (double)program->getVariable(operand[1].op).var_value.int_value)
652 : (double)operand[1].op_value;
653 double r = std::atan2(y, x);
654 program->vars["%rax"].type = mxvm::VarType::VAR_FLOAT;
655 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_FLOAT;
656 program->vars["%rax"].var_value.float_value = r;
657}
658
659extern "C" void mxvm_std_asin(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
660 if (operand.size() != 1)
661 throw mx::Exception("asin requires 1 argument.");
662 double v = program->isVariable(operand[0].op) ? (program->getVariable(operand[0].op).type == mxvm::VarType::VAR_FLOAT ? program->getVariable(operand[0].op).var_value.float_value : (double)program->getVariable(operand[0].op).var_value.int_value)
663 : (double)operand[0].op_value;
664 double r = std::asin(v);
665 program->vars["%rax"].type = mxvm::VarType::VAR_FLOAT;
666 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_FLOAT;
667 program->vars["%rax"].var_value.float_value = r;
668}
669
670extern "C" void mxvm_std_acos(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
671 if (operand.size() != 1)
672 throw mx::Exception("acos requires 1 argument.");
673 double v = program->isVariable(operand[0].op) ? (program->getVariable(operand[0].op).type == mxvm::VarType::VAR_FLOAT ? program->getVariable(operand[0].op).var_value.float_value : (double)program->getVariable(operand[0].op).var_value.int_value)
674 : (double)operand[0].op_value;
675 double r = std::acos(v);
676 program->vars["%rax"].type = mxvm::VarType::VAR_FLOAT;
677 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_FLOAT;
678 program->vars["%rax"].var_value.float_value = r;
679}
680
681extern "C" void mxvm_std_atan(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
682 if (operand.size() != 1)
683 throw mx::Exception("atan requires 1 argument.");
684 double v = program->isVariable(operand[0].op) ? (program->getVariable(operand[0].op).type == mxvm::VarType::VAR_FLOAT ? program->getVariable(operand[0].op).var_value.float_value : (double)program->getVariable(operand[0].op).var_value.int_value)
685 : (double)operand[0].op_value;
686 double r = std::atan(v);
687 program->vars["%rax"].type = mxvm::VarType::VAR_FLOAT;
688 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_FLOAT;
689 program->vars["%rax"].var_value.float_value = r;
690}
691
692extern "C" void mxvm_std_sinh(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
693 if (operand.size() != 1)
694 throw mx::Exception("sinh requires 1 argument.");
695 double v = program->isVariable(operand[0].op) ? (program->getVariable(operand[0].op).type == mxvm::VarType::VAR_FLOAT ? program->getVariable(operand[0].op).var_value.float_value : (double)program->getVariable(operand[0].op).var_value.int_value)
696 : (double)operand[0].op_value;
697 double r = std::sinh(v);
698 program->vars["%rax"].type = mxvm::VarType::VAR_FLOAT;
699 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_FLOAT;
700 program->vars["%rax"].var_value.float_value = r;
701}
702
703extern "C" void mxvm_std_cosh(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
704 if (operand.size() != 1)
705 throw mx::Exception("cosh requires 1 argument.");
706 double v = program->isVariable(operand[0].op) ? (program->getVariable(operand[0].op).type == mxvm::VarType::VAR_FLOAT ? program->getVariable(operand[0].op).var_value.float_value : (double)program->getVariable(operand[0].op).var_value.int_value)
707 : (double)operand[0].op_value;
708 double r = std::cosh(v);
709 program->vars["%rax"].type = mxvm::VarType::VAR_FLOAT;
710 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_FLOAT;
711 program->vars["%rax"].var_value.float_value = r;
712}
713
714extern "C" void mxvm_std_tanh(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
715 if (operand.size() != 1)
716 throw mx::Exception("tanh requires 1 argument.");
717 double v = program->isVariable(operand[0].op) ? (program->getVariable(operand[0].op).type == mxvm::VarType::VAR_FLOAT ? program->getVariable(operand[0].op).var_value.float_value : (double)program->getVariable(operand[0].op).var_value.int_value)
718 : (double)operand[0].op_value;
719 double r = std::tanh(v);
720 program->vars["%rax"].type = mxvm::VarType::VAR_FLOAT;
721 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_FLOAT;
722 program->vars["%rax"].var_value.float_value = r;
723}
724
725extern "C" void mxvm_std_hypot(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
726 if (operand.size() != 2)
727 throw mx::Exception("hypot requires 2 arguments (x, y).");
728 double x = program->isVariable(operand[0].op) ? (program->getVariable(operand[0].op).type == mxvm::VarType::VAR_FLOAT ? program->getVariable(operand[0].op).var_value.float_value : (double)program->getVariable(operand[0].op).var_value.int_value)
729 : (double)operand[0].op_value;
730 double y = program->isVariable(operand[1].op) ? (program->getVariable(operand[1].op).type == mxvm::VarType::VAR_FLOAT ? program->getVariable(operand[1].op).var_value.float_value : (double)program->getVariable(operand[1].op).var_value.int_value)
731 : (double)operand[1].op_value;
732 double r = std::hypot(x, y);
733 program->vars["%rax"].type = mxvm::VarType::VAR_FLOAT;
734 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_FLOAT;
735 program->vars["%rax"].var_value.float_value = r;
736}
737
738extern "C" void mxvm_std_round(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
739 if (operand.size() != 1)
740 throw mx::Exception("round requires 1 argument.");
741 double v = program->isVariable(operand[0].op) ? (program->getVariable(operand[0].op).type == mxvm::VarType::VAR_FLOAT ? program->getVariable(operand[0].op).var_value.float_value : (double)program->getVariable(operand[0].op).var_value.int_value)
742 : (double)operand[0].op_value;
743 double r = std::round(v);
744 program->vars["%rax"].type = mxvm::VarType::VAR_FLOAT;
745 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_FLOAT;
746 program->vars["%rax"].var_value.float_value = r;
747}
748
749extern "C" void mxvm_std_trunc(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
750 if (operand.size() != 1)
751 throw mx::Exception("trunc requires 1 argument.");
752 double v = program->isVariable(operand[0].op) ? (program->getVariable(operand[0].op).type == mxvm::VarType::VAR_FLOAT ? program->getVariable(operand[0].op).var_value.float_value : (double)program->getVariable(operand[0].op).var_value.int_value)
753 : (double)operand[0].op_value;
754 double r = std::trunc(v);
755 program->vars["%rax"].type = mxvm::VarType::VAR_FLOAT;
756 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_FLOAT;
757 program->vars["%rax"].var_value.float_value = r;
758}
759
760extern "C" void mxvm_std_argc(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
761 (void)operand;
762 int v = argc();
763 program->vars["%rax"].type = mxvm::VarType::VAR_INTEGER;
764 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_INTEGER;
765 program->vars["%rax"].var_value.int_value = (int64_t)v;
766}
767
768extern "C" void mxvm_std_argv(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
769 if (operand.size() != 1) {
770 throw mx::Exception("argv(index) requires 1 argument");
771 }
772
773 int idx = 0;
774 if (operand[0].type == mxvm::OperandType::OP_CONSTANT) {
775 idx = (int)operand[0].op_value;
776 } else if (program->isVariable(operand[0].op)) {
777 mxvm::Variable &v = program->getVariable(operand[0].op);
779 throw mx::Exception("argv index must be an integer");
780 }
781 idx = (int)v.var_value.int_value;
782 } else {
783 throw mx::Exception("argv argument must be an index constant or integer variable");
784 }
785
786 const char *s = argv(idx);
787 program->vars["%rax"].type = mxvm::VarType::VAR_POINTER;
788 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_POINTER;
789 program->vars["%rax"].var_value.ptr_value = (void *)s; /* may be NULL */
790}
791
792extern "C" void mxvm_std_free_program_args(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
794}
795
796extern "C" void mxvm_std_set_program_args(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
797 if (operand.size() != 2) {
798 throw mx::Exception("set_program_args requires 2 arguments (argc, argv)");
799 }
800
801 if (!program->isVariable(operand[0].op) || !program->isVariable(operand[1].op)) {
802 throw mx::Exception("set_program_args arguments must be variables");
803 }
804
805 mxvm::Variable &argc_var = program->getVariable(operand[0].op);
806 mxvm::Variable &argv_var = program->getVariable(operand[1].op);
807
808 if (argc_var.type != mxvm::VarType::VAR_INTEGER) {
809 throw mx::Exception("set_program_args first argument (argc) must be an integer");
810 }
811
812 if (argv_var.type != mxvm::VarType::VAR_POINTER) {
813 throw mx::Exception("set_program_args second argument (argv) must be a pointer");
814 }
815
816 int argc = (int)argc_var.var_value.int_value;
817 const char **argv = (const char **)argv_var.var_value.ptr_value;
818
819 if (argv == nullptr && argc > 0) {
820 throw mx::Exception("set_program_args: argv pointer is null but argc > 0");
821 }
822
824}
825
826extern "C" void mxvm_std_float_to_int(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
827 if (operand.size() != 1) {
828 throw mx::Exception("float_to_int requires 1 argument (float value).");
829 }
830
831 double value = 0.0;
832 if (program->isVariable(operand[0].op)) {
833 mxvm::Variable &var = program->getVariable(operand[0].op);
834 if (var.type == mxvm::VarType::VAR_FLOAT) {
835 value = var.var_value.float_value;
836 } else if (var.type == mxvm::VarType::VAR_INTEGER) {
837 value = static_cast<double>(var.var_value.int_value);
838 } else {
839 throw mx::Exception("float_to_int argument must be a float or integer variable.");
840 }
841 } else {
842 value = static_cast<double>(operand[0].op_value);
843 }
844
845 int64_t result = static_cast<int64_t>(value);
846 program->vars["%rax"].type = mxvm::VarType::VAR_INTEGER;
847 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_INTEGER;
848 program->vars["%rax"].var_value.int_value = result;
849}
850
851extern "C" void mxvm_std_int_to_float(mxvm::Program *program, std::vector<mxvm::Operand> &operand) {
852 if (operand.size() != 1) {
853 throw mx::Exception("int_to_float requires 1 argument (integer value).");
854 }
855
856 int64_t value = 0;
857 if (program->isVariable(operand[0].op)) {
858 mxvm::Variable &var = program->getVariable(operand[0].op);
859 if (var.type == mxvm::VarType::VAR_INTEGER) {
860 value = var.var_value.int_value;
861 } else if (var.type == mxvm::VarType::VAR_FLOAT) {
862 value = static_cast<int64_t>(var.var_value.float_value);
863 } else {
864 throw mx::Exception("int_to_float argument must be an integer or float variable.");
865 }
866 } else {
867 value = operand[0].op_value;
868 }
869
870 double result = static_cast<double>(value);
871 program->vars["%rax"].type = mxvm::VarType::VAR_FLOAT;
872 program->vars["%rax"].var_value.type = mxvm::VarType::VAR_FLOAT;
873 program->vars["%rax"].var_value.float_value = result;
874}
General-purpose exception with errno-aware factory method.
Definition exception.hpp:38
std::unordered_map< std::string, Variable > vars
variable symbol table
Definition icode.hpp:193
Complete MXVM program: instruction interpreter and native x64 code generator.
Definition icode.hpp:212
Variable & getVariable(const std::string &name)
Look up a variable by name, searching local scope then global.
bool isVariable(const std::string &name)
Check whether a variable exists in local or global scope.
Intermediate code representation, execution engine, and native x64 code generation (SysV + Win64).
Standard library module C API — function declarations exported to MXVM programs.
void free_program_args(void)
Free the stored command-line argument memory.
Definition std.c:23
void set_program_args(int argc, const char **argv)
Store command-line arguments for later access via argc()/argv().
Definition std.c:35
int argc(void)
Return the number of stored command-line arguments.
Definition std.c:72
const char * argv(int idx)
Return the command-line argument at the given index.
Definition std.c:76
void except_assert(std::string reason, bool value)
Assert a condition, throwing an Exception with the given reason on failure.
Definition icode.cpp:436
void mxvm_std_release(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:238
void mxvm_std_rand(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:181
void mxvm_std_log(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:600
void mxvm_std_malloc(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:199
void mxvm_std_fmod(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:633
void mxvm_std_tanh(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:714
void mxvm_std_free_program_args(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:792
void mxvm_std_exit(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:385
void mxvm_std_sin(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:90
void mxvm_std_float_to_int(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:826
void mxvm_std_cosh(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:703
void mxvm_std_exp2(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:589
void mxvm_std_isspace(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:312
void mxvm_std_memcpy(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:425
void mxvm_std_srand(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:188
void mxvm_std_set_program_args(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:796
void mxvm_std_argc(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:760
void mxvm_std_abs(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:14
void mxvm_std_trunc(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:749
void mxvm_std_system(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:394
void mxvm_std_round(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:738
void mxvm_std_isalpha(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:286
void mxvm_std_floor(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:144
void mxvm_std_calloc(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:218
void mxvm_std_memmove(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:499
void mxvm_std_atan(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:681
void mxvm_std_atof(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:355
void mxvm_std_sinh(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:692
void mxvm_std_tan(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:126
void mxvm_std_exp(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:578
void mxvm_std_int_to_float(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:851
void mxvm_std_tolower(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:273
void mxvm_std_atoi(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:326
void mxvm_std_isdigit(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:299
void mxvm_std_cos(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:108
void mxvm_std_sqrt(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:45
void mxvm_std_log10(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:611
void mxvm_std_acos(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:670
void mxvm_std_asin(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:659
void mxvm_std_toupper(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:260
void mxvm_std_memcmp(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:462
void mxvm_std_pow(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:63
void mxvm_std_hypot(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:725
void mxvm_std_log2(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:622
void mxvm_std_argv(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:768
void mxvm_std_atan2(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:646
void mxvm_std_ceil(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:162
void mxvm_std_fabs(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:27
void mxvm_std_memset(mxvm::Program *program, std::vector< mxvm::Operand > &operand)
Definition std.cpp:536
uint64_t ptr_size
size of each element in allocated memory
Definition instruct.hpp:218
bool owns
true if this value owns the allocated memory
Definition instruct.hpp:222
std::string str_value
Definition instruct.hpp:211
uint64_t ptr_count
number of elements allocated
Definition instruct.hpp:219
A named variable with type, value, and optional object association.
Definition instruct.hpp:292
Variable_Value var_value
Definition instruct.hpp:295