diff --git a/src/scripting/vm/vmexec.cpp b/src/scripting/vm/vmexec.cpp index 57ce48a95a..af25030a9c 100644 --- a/src/scripting/vm/vmexec.cpp +++ b/src/scripting/vm/vmexec.cpp @@ -82,11 +82,17 @@ #define THROW(x) throw(EVMAbortException(x)) #define CMPJMP(test) \ - if ((test) == (a & CMP_CHECK)) { \ + pc++; \ + if (VM_UBYTE(test) == VM_UBYTE(a)) { \ assert(pc[1].op == OP_JMP); \ - pc += 1 + JMPOFS(pc+1); \ - } else { \ - pc += 1; \ + pc += JMPOFS(pc); \ + } + +#define CMPJMP_MASK(test) \ + pc++; \ + if (VM_UBYTE(test) == (VM_UBYTE(a) & CMP_CHECK)) { \ + assert(pc[1].op == OP_JMP); \ + pc += JMPOFS(pc); \ } #define GETADDR(a,o,x) \ diff --git a/src/scripting/vm/vmexec.h b/src/scripting/vm/vmexec.h index 4b16a99d13..10b85ef868 100644 --- a/src/scripting/vm/vmexec.h +++ b/src/scripting/vm/vmexec.h @@ -1199,88 +1199,88 @@ begin: ASSERTF(B); ASSERTF(C); if (a & CMP_APPROX) { - CMPJMP(fabs(reg.f[C] - reg.f[B]) < VM_EPSILON); + CMPJMP_MASK(fabs(reg.f[C] - reg.f[B]) < VM_EPSILON); } else { - CMPJMP(reg.f[C] == reg.f[B]); + CMPJMP_MASK(reg.f[C] == reg.f[B]); } NEXTOP; OP(EQF_K): ASSERTF(B); ASSERTKF(C); if (a & CMP_APPROX) { - CMPJMP(fabs(konstf[C] - reg.f[B]) < VM_EPSILON); + CMPJMP_MASK(fabs(konstf[C] - reg.f[B]) < VM_EPSILON); } else { - CMPJMP(konstf[C] == reg.f[B]); + CMPJMP_MASK(konstf[C] == reg.f[B]); } NEXTOP; OP(LTF_RR): ASSERTF(B); ASSERTF(C); if (a & CMP_APPROX) { - CMPJMP((reg.f[B] - reg.f[C]) < -VM_EPSILON); + CMPJMP_MASK((reg.f[B] - reg.f[C]) < -VM_EPSILON); } else { - CMPJMP(reg.f[B] < reg.f[C]); + CMPJMP_MASK(reg.f[B] < reg.f[C]); } NEXTOP; OP(LTF_RK): ASSERTF(B); ASSERTKF(C); if (a & CMP_APPROX) { - CMPJMP((reg.f[B] - konstf[C]) < -VM_EPSILON); + CMPJMP_MASK((reg.f[B] - konstf[C]) < -VM_EPSILON); } else { - CMPJMP(reg.f[B] < konstf[C]); + CMPJMP_MASK(reg.f[B] < konstf[C]); } NEXTOP; OP(LTF_KR): ASSERTKF(B); ASSERTF(C); if (a & CMP_APPROX) { - CMPJMP((konstf[B] - reg.f[C]) < -VM_EPSILON); + CMPJMP_MASK((konstf[B] - reg.f[C]) < -VM_EPSILON); } else { - CMPJMP(konstf[B] < reg.f[C]); + CMPJMP_MASK(konstf[B] < reg.f[C]); } NEXTOP; OP(LEF_RR): ASSERTF(B); ASSERTF(C); if (a & CMP_APPROX) { - CMPJMP((reg.f[B] - reg.f[C]) <= -VM_EPSILON); + CMPJMP_MASK((reg.f[B] - reg.f[C]) <= -VM_EPSILON); } else { - CMPJMP(reg.f[B] <= reg.f[C]); + CMPJMP_MASK(reg.f[B] <= reg.f[C]); } NEXTOP; OP(LEF_RK): ASSERTF(B); ASSERTKF(C); if (a & CMP_APPROX) { - CMPJMP((reg.f[B] - konstf[C]) <= -VM_EPSILON); + CMPJMP_MASK((reg.f[B] - konstf[C]) <= -VM_EPSILON); } else { - CMPJMP(reg.f[B] <= konstf[C]); + CMPJMP_MASK(reg.f[B] <= konstf[C]); } NEXTOP; OP(LEF_KR): ASSERTKF(B); ASSERTF(C); if (a & CMP_APPROX) { - CMPJMP((konstf[B] - reg.f[C]) <= -VM_EPSILON); + CMPJMP_MASK((konstf[B] - reg.f[C]) <= -VM_EPSILON); } else { - CMPJMP(konstf[B] <= reg.f[C]); + CMPJMP_MASK(konstf[B] <= reg.f[C]); } NEXTOP; @@ -1369,12 +1369,12 @@ begin: Do_EQV2: if (a & CMP_APPROX) { - CMPJMP(fabs(reg.f[B ] - fcp[0]) < VM_EPSILON && - fabs(reg.f[B+1] - fcp[1]) < VM_EPSILON); + CMPJMP_MASK(fabs(reg.f[B ] - fcp[0]) < VM_EPSILON && + fabs(reg.f[B+1] - fcp[1]) < VM_EPSILON); } else { - CMPJMP(reg.f[B] == fcp[0] && reg.f[B+1] == fcp[1]); + CMPJMP_MASK(reg.f[B] == fcp[0] && reg.f[B+1] == fcp[1]); } NEXTOP; OP(EQV2_K): @@ -1496,13 +1496,13 @@ begin: Do_EQV3: if (a & CMP_APPROX) { - CMPJMP(fabs(reg.f[B ] - fcp[0]) < VM_EPSILON && - fabs(reg.f[B+1] - fcp[1]) < VM_EPSILON && - fabs(reg.f[B+2] - fcp[2]) < VM_EPSILON); + CMPJMP_MASK(fabs(reg.f[B ] - fcp[0]) < VM_EPSILON && + fabs(reg.f[B+1] - fcp[1]) < VM_EPSILON && + fabs(reg.f[B+2] - fcp[2]) < VM_EPSILON); } else { - CMPJMP(reg.f[B] == fcp[0] && reg.f[B+1] == fcp[1] && reg.f[B+2] == fcp[2]); + CMPJMP_MASK(reg.f[B] == fcp[0] && reg.f[B+1] == fcp[1] && reg.f[B+2] == fcp[2]); } NEXTOP; OP(EQV3_K):