TCPU/src/instructions/impl/math_operators.c
2024-11-15 09:03:33 +05:00

48 lines
1.2 KiB
C

#include "impl_macros.h"
#define mathOperatorImpl(OPERATOR){\
u8 dst_register_i = 0, src_register_i = 0;\
readRegisterVar(dst_register_i);\
readRegisterVar(src_register_i);\
u8 value_size = 0;\
readValueSizeVar(value_size);\
\
switch(value_size){\
case 1: \
vm->registers[dst_register_i].u8v0 OPERATOR##= vm->registers[src_register_i].u8v0;\
break;\
case 2: \
vm->registers[dst_register_i].u16v0 OPERATOR##= vm->registers[src_register_i].u16v0;\
break;\
case 4: \
vm->registers[dst_register_i].u32v OPERATOR##= vm->registers[src_register_i].u32v;\
break;\
}\
return sizeof(dst_register_i) + sizeof(src_register_i) + sizeof(value_size);\
}
/// ADD [dst_register] [src_register]
i32 ADD_impl(VM* vm, size_t pos){
mathOperatorImpl(+);
}
/// SUB [dst_register] [src_register]
i32 SUB_impl(VM* vm, size_t pos){
mathOperatorImpl(-);
}
/// MUL [dst_register] [src_register]
i32 MUL_impl(VM* vm, size_t pos){
mathOperatorImpl(*)
}
/// DIV [dst_register] [src_register]
i32 DIV_impl(VM* vm, size_t pos){
mathOperatorImpl(/)
}
/// MOD [dst_register] [src_register]
i32 MOD_impl(VM* vm, size_t pos){
mathOperatorImpl(%)
}