18 lines
489 B
C
18 lines
489 B
C
|
|
case OP_POW: {
|
||
|
|
Value b = pop_value(vm);
|
||
|
|
Value a = pop_value(vm);
|
||
|
|
if (a.type != VAL_INT || b.type != VAL_INT) { fprintf(stderr, "POW expects ints\n"); exit(1); }
|
||
|
|
int64_t base = a.i;
|
||
|
|
int64_t exp = b.i;
|
||
|
|
int64_t res = 1;
|
||
|
|
if (exp < 0) { res = 0; } else {
|
||
|
|
while (exp > 0) {
|
||
|
|
if (exp & 1) res *= base;
|
||
|
|
base *= base;
|
||
|
|
exp >>= 1;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
push_value(vm, make_int(res));
|
||
|
|
free_value(a); free_value(b);
|
||
|
|
break;
|
||
|
|
}
|