#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(%) }