implemented flag for comparison result
This commit is contained in:
@@ -11,40 +11,26 @@ i32 JMP_impl(VM* vm){
|
||||
}
|
||||
|
||||
|
||||
// JNZ [destination address] [condition register]
|
||||
// JNZ [destination address]
|
||||
i32 JNZ_impl(VM* vm){
|
||||
u64 dst_addr = 0;
|
||||
readVar(dst_addr);
|
||||
|
||||
RegisterCode reg_code = 0;
|
||||
readRegisterCode(reg_code);
|
||||
u64 cond_reg_value = 0;
|
||||
VM_registerRead(vm, &cond_reg_value, reg_code);
|
||||
|
||||
if(cond_reg_value != 0){
|
||||
if(vm->flags.cmp != 0){
|
||||
vm->current_pos = dst_addr;
|
||||
}
|
||||
|
||||
return sizeof(dst_addr) + sizeof(reg_code);
|
||||
return sizeof(dst_addr);
|
||||
}
|
||||
|
||||
// JZ [destination address] [condition register]
|
||||
// JZ [destination address]
|
||||
i32 JZ_impl(VM* vm){
|
||||
u64 dst_addr = 0;
|
||||
{
|
||||
if(!VM_dataRead(vm, &dst_addr, vm->current_pos, sizeof(dst_addr)))
|
||||
return -1;
|
||||
vm->current_pos += sizeof(dst_addr);
|
||||
};
|
||||
readVar(dst_addr);
|
||||
|
||||
RegisterCode reg_code = 0;
|
||||
readRegisterCode(reg_code);
|
||||
u64 cond_reg_value = 0;
|
||||
VM_registerRead(vm, &cond_reg_value, reg_code);
|
||||
|
||||
if(cond_reg_value == 0){
|
||||
if(vm->flags.cmp == 0){
|
||||
vm->current_pos = dst_addr;
|
||||
}
|
||||
|
||||
return sizeof(dst_addr) + sizeof(reg_code);
|
||||
return sizeof(dst_addr);
|
||||
}
|
||||
|
||||
@@ -45,18 +45,15 @@ i32 NAME##_impl (VM* vm) {\
|
||||
return sizeof(dst_reg_code) + sizeof(src_reg_code);\
|
||||
}
|
||||
|
||||
#define OPERATOR_IMPL_3(NAME, OPERATOR)\
|
||||
#define OPERATOR_IMPL_CMP_FLAG(NAME, OPERATOR)\
|
||||
i32 NAME##_impl (VM* vm) {\
|
||||
RegisterCode dst_reg_code = 0, src0_reg_code = 0, src1_reg_code = 0;\
|
||||
readRegisterCode(dst_reg_code);\
|
||||
RegisterCode src0_reg_code = 0, src1_reg_code = 0;\
|
||||
readRegisterCode(src0_reg_code);\
|
||||
readRegisterCode(src1_reg_code);\
|
||||
u64 dst_reg_value = 0, src0_reg_value = 0, src1_reg_value = 0;\
|
||||
VM_registerRead(vm, &dst_reg_value, dst_reg_code);\
|
||||
u64 src0_reg_value = 0, src1_reg_value = 0;\
|
||||
VM_registerRead(vm, &src0_reg_value, src0_reg_code);\
|
||||
VM_registerRead(vm, &src1_reg_value, src1_reg_code);\
|
||||
\
|
||||
dst_reg_value = src0_reg_value OPERATOR src1_reg_value;\
|
||||
VM_registerWrite(vm, &dst_reg_value, dst_reg_code);\
|
||||
return sizeof(dst_reg_code) + sizeof(src0_reg_code) + sizeof(src1_reg_code);\
|
||||
vm->flags.cmp = src0_reg_value OPERATOR src1_reg_value;\
|
||||
return sizeof(src0_reg_code) + sizeof(src1_reg_code);\
|
||||
}
|
||||
|
||||
@@ -17,20 +17,20 @@ OPERATOR_IMPL_2(XOR, ^)
|
||||
OPERATOR_IMPL_2(AND, &)
|
||||
|
||||
|
||||
/// EQ [dst_register] [src0_register] [src1_register]
|
||||
OPERATOR_IMPL_3(EQ, ==)
|
||||
/// EQ [src0_register] [src1_register]
|
||||
OPERATOR_IMPL_CMP_FLAG(EQ, ==)
|
||||
|
||||
/// NE [dst_register] [src0_register] [src1_register]
|
||||
OPERATOR_IMPL_3(NE, !=)
|
||||
/// NE [src0_register] [src1_register]
|
||||
OPERATOR_IMPL_CMP_FLAG(NE, !=)
|
||||
|
||||
/// LT [dst_register] [src0_register] [src1_register]
|
||||
OPERATOR_IMPL_3(LT, <)
|
||||
/// LT [src0_register] [src1_register]
|
||||
OPERATOR_IMPL_CMP_FLAG(LT, <)
|
||||
|
||||
/// LE [dst_register] [src0_register] [src1_register]
|
||||
OPERATOR_IMPL_3(LE, <=)
|
||||
/// LE [src0_register] [src1_register]
|
||||
OPERATOR_IMPL_CMP_FLAG(LE, <=)
|
||||
|
||||
/// GT [dst_register] [src0_register] [src1_register]
|
||||
OPERATOR_IMPL_3(GT, >)
|
||||
/// GT [src0_register] [src1_register]
|
||||
OPERATOR_IMPL_CMP_FLAG(GT, >)
|
||||
|
||||
/// GE [dst_register] [src0_register] [src1_register]
|
||||
OPERATOR_IMPL_3(GE, >=)
|
||||
/// GE [src0_register] [src1_register]
|
||||
OPERATOR_IMPL_CMP_FLAG(GE, >=)
|
||||
|
||||
Reference in New Issue
Block a user