TCPU/src/instructions/impl/math_operators.c
2025-03-12 12:57:16 +05:00

43 lines
1.3 KiB
C

#include "impl_macros.h"
#define mathOperator2Impl(NAME, OPERATOR)\
i32 NAME##_impl (VM* vm) {\
u8 dst_register_i = 0, src_register_i = 0;\
readRegisterVar(dst_register_i);\
readRegisterVar(src_register_i);\
/*u8 value_size = 0;\
readValueSizeVar(value_size);*/\
u8 value_size = 4;\
\
switch(value_size){\
case 1: \
vm->registers.array[dst_register_i].u8v0 OPERATOR##= vm->registers.array[src_register_i].u8v0;\
break;\
case 2: \
vm->registers.array[dst_register_i].u16v0 OPERATOR##= vm->registers.array[src_register_i].u16v0;\
break;\
case 4: \
vm->registers.array[dst_register_i].u32v0 OPERATOR##= vm->registers.array[src_register_i].u32v0;\
break;\
case 8: \
vm->registers.array[dst_register_i].u64v OPERATOR##= vm->registers.array[src_register_i].u64v;\
break;\
}\
return sizeof(dst_register_i) + sizeof(src_register_i) /*+ sizeof(value_size)*/;\
}
/// ADD [dst_register] [src_register]
mathOperator2Impl(ADD, +)
/// SUB [dst_register] [src_register]
mathOperator2Impl(SUB, -)
/// MUL [dst_register] [src_register]
mathOperator2Impl(MUL, *)
/// DIV [dst_register] [src_register]
mathOperator2Impl(DIV, /)
/// MOD [dst_register] [src_register]
mathOperator2Impl(MOD, %)