Skip to content

Commit 748e811

Browse files
committed
Proper isNaN/isFinite without a temp. local
1 parent 1cea3c6 commit 748e811

19 files changed

+2283
-2154
lines changed

dist/asc.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/asc.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/assemblyscript.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/assemblyscript.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/builtins.ts

Lines changed: 30 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -184,18 +184,26 @@ export function compileCall(
184184

185185
switch (compiler.currentType.kind) {
186186
case TypeKind.F32: {
187-
let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.f32);
188-
ret = module.createBinary(BinaryOp.NeF32,
189-
module.createTeeLocal(tempLocal.index, arg0),
190-
module.createGetLocal(tempLocal.index, NativeType.F32)
187+
ret = module.createBinary(
188+
BinaryOp.GtU32,
189+
module.createBinary(
190+
BinaryOp.AndI32,
191+
module.createUnary(UnaryOp.ReinterpretF32, arg0),
192+
module.createI32(0x7FFFFFFF)
193+
),
194+
module.createI32(0x7F800000)
191195
);
192196
break;
193197
}
194198
case TypeKind.F64: {
195-
let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.f64);
196-
ret = module.createBinary(BinaryOp.NeF64,
197-
module.createTeeLocal(tempLocal.index, arg0),
198-
module.createGetLocal(tempLocal.index, NativeType.F64)
199+
ret = module.createBinary(
200+
BinaryOp.GtU64,
201+
module.createBinary(
202+
BinaryOp.AndI64,
203+
module.createUnary(UnaryOp.ReinterpretF64, arg0),
204+
module.createI64(0xFFFFFFFF, 0x7FFFFFFF)
205+
),
206+
module.createI64(0, 0x7FF00000)
199207
);
200208
break;
201209
}
@@ -244,36 +252,26 @@ export function compileCall(
244252
}
245253
switch (compiler.currentType.kind) {
246254
case TypeKind.F32: {
247-
let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.f32);
248-
ret = module.createSelect(
249-
module.createBinary(BinaryOp.NeF32,
250-
module.createUnary(UnaryOp.AbsF32,
251-
module.createTeeLocal(tempLocal.index, arg0)
252-
),
253-
module.createF32(Infinity)
255+
ret = module.createBinary(
256+
BinaryOp.LtU32,
257+
module.createBinary(
258+
BinaryOp.AndI32,
259+
module.createUnary(UnaryOp.ReinterpretF32, arg0),
260+
module.createI32(0x7FFFFFFF)
254261
),
255-
module.createI32(0),
256-
module.createBinary(BinaryOp.EqF32,
257-
module.createGetLocal(tempLocal.index, NativeType.F32),
258-
module.createGetLocal(tempLocal.index, NativeType.F32)
259-
)
262+
module.createI32(0x7F800000)
260263
);
261264
break;
262265
}
263266
case TypeKind.F64: {
264-
let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.f64);
265-
ret = module.createSelect(
266-
module.createBinary(BinaryOp.NeF64,
267-
module.createUnary(UnaryOp.AbsF64,
268-
module.createTeeLocal(tempLocal.index, arg0)
269-
),
270-
module.createF64(Infinity)
267+
ret = module.createBinary(
268+
BinaryOp.LtU64,
269+
module.createBinary(
270+
BinaryOp.AndI64,
271+
module.createUnary(UnaryOp.ReinterpretF64, arg0),
272+
module.createI64(0xFFFFFFFF, 0x7FFFFFFF)
271273
),
272-
module.createI32(0),
273-
module.createBinary(BinaryOp.EqF64,
274-
module.createGetLocal(tempLocal.index, NativeType.F64),
275-
module.createGetLocal(tempLocal.index, NativeType.F64)
276-
)
274+
module.createI64(0, 0x7FF00000)
277275
);
278276
break;
279277
}

src/program.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2686,7 +2686,7 @@ export class FunctionPrototype extends Element {
26862686
var resolvedTypeArguments: Type[] | null = null;
26872687
if (this.is(CommonFlags.GENERIC)) {
26882688
assert(typeArgumentNodes != null && typeArgumentNodes.length != 0);
2689-
resolvedTypeArguments = this.program.resolveTypeArguments(
2689+
resolvedTypeArguments = this.program.resolveTypeArguments( // reports
26902690
assert(this.declaration.typeParameters),
26912691
typeArgumentNodes,
26922692
contextualTypeArguments,

tests/compiler/binary.optimized.wat

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1531,8 +1531,7 @@
15311531
(local $4 i32)
15321532
(local $5 i32)
15331533
(local $6 i32)
1534-
(local $7 f32)
1535-
(local $8 i32)
1534+
(local $7 i32)
15361535
(block $folding-inner0
15371536
(set_local $4
15381537
(i32.and
@@ -1575,11 +1574,14 @@
15751574
)
15761575
)
15771576
(get_local $3)
1578-
(f32.ne
1579-
(tee_local $7
1580-
(get_local $1)
1577+
(i32.gt_u
1578+
(i32.and
1579+
(i32.reinterpret/f32
1580+
(get_local $1)
1581+
)
1582+
(i32.const 2147483647)
15811583
)
1582-
(get_local $7)
1584+
(i32.const 2139095040)
15831585
)
15841586
)
15851587
(i32.const 1)
@@ -1635,7 +1637,7 @@
16351637
)
16361638
)
16371639
)
1638-
(set_local $8
1640+
(set_local $7
16391641
(i32.and
16401642
(get_local $2)
16411643
(i32.const -2147483648)
@@ -1867,7 +1869,7 @@
18671869
)
18681870
)
18691871
)
1870-
(get_local $8)
1872+
(get_local $7)
18711873
)
18721874
)
18731875
)
@@ -3161,7 +3163,6 @@
31613163
(local $5 i64)
31623164
(local $6 i32)
31633165
(local $7 i32)
3164-
(local $8 f64)
31653166
(block $folding-inner0
31663167
(set_local $3
31673168
(i32.wrap/i64
@@ -3209,11 +3210,14 @@
32093210
)
32103211
)
32113212
(get_local $7)
3212-
(f64.ne
3213-
(tee_local $8
3214-
(get_local $1)
3213+
(i64.gt_u
3214+
(i64.and
3215+
(i64.reinterpret/f64
3216+
(get_local $1)
3217+
)
3218+
(i64.const 9223372036854775807)
32153219
)
3216-
(get_local $8)
3220+
(i64.const 9218868437227405312)
32173221
)
32183222
)
32193223
(i32.const 1)

0 commit comments

Comments
 (0)