Skip to content

Commit 8420036

Browse files
committed
Optimize: Prioritize number arithmetic in hot VM instructions (ADD, SUB, MUL, DIV)
1 parent e832e90 commit 8420036

1 file changed

Lines changed: 35 additions & 16 deletions

File tree

src/runtime/vm.c

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -630,13 +630,14 @@ static bool resolveContextualMethod(VM* pvm, ObjString* name, Value* result) {
630630
}
631631

632632
CASE_OP(OP_ADD) {
633-
if (performTensorArithmetic(vm, '+')) { DISPATCH(); }
634-
if (IS_STRING(peek(vm, 0)) && IS_STRING(peek(vm, 1))) {
635-
concatenate(vm);
636-
} else if (IS_NUMBER(peek(vm, 0)) && IS_NUMBER(peek(vm, 1))) {
633+
if (IS_NUMBER(peek(vm, 0)) && IS_NUMBER(peek(vm, 1))) {
637634
double b = AS_NUMBER(pop(vm));
638635
double a = AS_NUMBER(pop(vm));
639636
PUSH(NUMBER_VAL(a + b));
637+
} else if (IS_TENSOR(peek(vm, 0)) || IS_TENSOR(peek(vm, 1))) {
638+
if (performTensorArithmetic(vm, '+')) { DISPATCH(); }
639+
} else if (IS_STRING(peek(vm, 0)) && IS_STRING(peek(vm, 1))) {
640+
concatenate(vm);
640641
} else if (IS_NUMBER(peek(vm, 0)) && IS_STRING(peek(vm, 1))) {
641642
Value numVal = peek(vm, 0);
642643
char buffer[32];
@@ -662,26 +663,44 @@ static bool resolveContextualMethod(VM* pvm, ObjString* name, Value* result) {
662663
}
663664

664665
CASE_OP(OP_SUBTRACT) {
665-
if (performTensorArithmetic(vm, '-')) { DISPATCH(); }
666-
double b = AS_NUMBER(pop(vm));
667-
double a = AS_NUMBER(pop(vm));
668-
PUSH(NUMBER_VAL(a - b));
666+
if (IS_NUMBER(peek(vm, 0)) && IS_NUMBER(peek(vm, 1))) {
667+
double b = AS_NUMBER(pop(vm));
668+
double a = AS_NUMBER(pop(vm));
669+
PUSH(NUMBER_VAL(a - b));
670+
} else if (performTensorArithmetic(vm, '-')) {
671+
DISPATCH();
672+
} else {
673+
runtimeError(vm, "Operands must be numbers.");
674+
return INTERPRET_RUNTIME_ERROR;
675+
}
669676
DISPATCH();
670677
}
671678

672679
CASE_OP(OP_MULTIPLY) {
673-
if (performTensorArithmetic(vm, '*')) { DISPATCH(); }
674-
double b = AS_NUMBER(pop(vm));
675-
double a = AS_NUMBER(pop(vm));
676-
PUSH(NUMBER_VAL(a * b));
680+
if (IS_NUMBER(peek(vm, 0)) && IS_NUMBER(peek(vm, 1))) {
681+
double b = AS_NUMBER(pop(vm));
682+
double a = AS_NUMBER(pop(vm));
683+
PUSH(NUMBER_VAL(a * b));
684+
} else if (performTensorArithmetic(vm, '*')) {
685+
DISPATCH();
686+
} else {
687+
runtimeError(vm, "Operands must be numbers.");
688+
return INTERPRET_RUNTIME_ERROR;
689+
}
677690
DISPATCH();
678691
}
679692

680693
CASE_OP(OP_DIVIDE) {
681-
if (performTensorArithmetic(vm, '/')) { DISPATCH(); }
682-
double b = AS_NUMBER(pop(vm));
683-
double a = AS_NUMBER(pop(vm));
684-
PUSH(NUMBER_VAL(a / b));
694+
if (IS_NUMBER(peek(vm, 0)) && IS_NUMBER(peek(vm, 1))) {
695+
double b = AS_NUMBER(pop(vm));
696+
double a = AS_NUMBER(pop(vm));
697+
PUSH(NUMBER_VAL(a / b));
698+
} else if (performTensorArithmetic(vm, '/')) {
699+
DISPATCH();
700+
} else {
701+
runtimeError(vm, "Operands must be numbers.");
702+
return INTERPRET_RUNTIME_ERROR;
703+
}
685704
DISPATCH();
686705
}
687706

0 commit comments

Comments
 (0)