Skip to content

Commit e6f54f6

Browse files
committed
fix: avoid powi opt in js engine only when exponent <= 2
1 parent f16b08f commit e6f54f6

File tree

2 files changed

+6
-10
lines changed

2 files changed

+6
-10
lines changed

src/compiler.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -206,9 +206,9 @@ import {
206206
isPowerOf2,
207207
readI32,
208208
isIdentifier,
209-
accuratePow64,
210209
v128_zero,
211210
v128_ones,
211+
accuratePow64,
212212
} from "./util";
213213

214214
import {
@@ -5129,7 +5129,7 @@ export class Compiler extends DiagnosticEmitter {
51295129
let leftValue = getConstValueF32(leftExpr);
51305130
let rightValue = getConstValueF32(rightExpr);
51315131
this.currentType = type;
5132-
return module.f32(f32(accuratePow64(leftValue, rightValue)));
5132+
return module.f32(f32(Math.pow(leftValue, rightValue)));
51335133
}
51345134
}
51355135
let instance = this.f32PowInstance;

src/util/math.ts

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,11 @@ export function isPowerOf2(x: i32): bool {
1111
export function accuratePow64(x: f64, y: f64): f64 {
1212
if (!ASC_TARGET) { // ASC_TARGET == JS
1313
// Engines like V8, WebKit and SpiderMonkey uses powi fast path if exponent is integer
14-
// This speculative optimization leads to loose precisions like 10 ** 208 != 1e208
15-
// or/and 10 ** -5 != 1e-5 anymore. For avoid this behaviour we are forcing exponent
14+
// This speculative optimization leads to loose precisions like 10 ** -5 != 1e-5 anymore.
15+
// For avoid this behaviour we are forcing exponent
1616
// to fractional form and compensate this afterwards.
17-
if (isFinite(y) && Math.abs(y) >= 2 && Math.trunc(y) == y) {
18-
if (y < 0) {
19-
return Math.pow(x, y + 0.5) / Math.pow(x, 0.5);
20-
} else {
21-
return Math.pow(x, y - 0.5) * Math.pow(x, 0.5);
22-
}
17+
if (isFinite(y) && y <= 2 && Math.trunc(y) == y) {
18+
return Math.pow(x, y + 0.5) / Math.pow(x, 0.5);
2319
}
2420
}
2521
return Math.pow(x, y);

0 commit comments

Comments
 (0)