From 97de954121ddf600fe537e50870d9ef0bd8ef1ab Mon Sep 17 00:00:00 2001 From: ValeriaVG Date: Sat, 3 Oct 2020 11:15:16 +0200 Subject: [PATCH 01/17] Add bultins: i32/i64/f32/f64.add --- src/builtins.ts | 140 ++++++++++++++++++++++ std/assembly/builtins.ts | 20 ++++ std/assembly/index.d.ts | 2 + tests/compiler/builtins.optimized.wat | 74 +++++++----- tests/compiler/builtins.ts | 16 ++- tests/compiler/builtins.untouched.wat | 164 ++++++++++++++++++-------- 6 files changed, 338 insertions(+), 78 deletions(-) diff --git a/src/builtins.ts b/src/builtins.ts index 7abdf6eb2e..7004bbf48b 100644 --- a/src/builtins.ts +++ b/src/builtins.ts @@ -185,6 +185,8 @@ export namespace BuiltinNames { export const instantiate = "~lib/builtins/instantiate"; export const idof = "~lib/builtins/idof"; + export const add = "~lib/builtins/add"; + export const i8 = "~lib/builtins/i8"; export const i16 = "~lib/builtins/i16"; export const i32 = "~lib/builtins/i32"; @@ -234,6 +236,11 @@ export namespace BuiltinNames { export const f32_trunc = "~lib/builtins/f32.trunc"; export const f64_trunc = "~lib/builtins/f64.trunc"; + export const i32_add = "~lib/builtins/i32.add"; + export const i64_add = "~lib/builtins/i64.add"; + export const f32_add = "~lib/builtins/f32.add"; + export const f64_add = "~lib/builtins/f64.add"; + export const i32_load8_s = "~lib/builtins/i32.load8_s"; export const i32_load8_u = "~lib/builtins/i32.load8_u"; export const i32_load16_s = "~lib/builtins/i32.load16_s"; @@ -2056,6 +2063,103 @@ function builtin_store(ctx: BuiltinContext): ExpressionRef { } builtins.set(BuiltinNames.store, builtin_store); +// add(left: T, right: T) -> T +function builtin_add(ctx: BuiltinContext): ExpressionRef { + var compiler = ctx.compiler; + var module = compiler.module; + if (checkTypeOptional(ctx, true) | checkArgsRequired(ctx, 2)) + return module.unreachable(); + var operands = ctx.operands; + var typeArguments = ctx.typeArguments; + var left = operands[0]; + var arg0 = typeArguments + ? compiler.compileExpression( + left, + typeArguments[0], + Constraints.CONV_IMPLICIT | Constraints.MUST_WRAP + ) + : compiler.compileExpression(operands[0], Type.auto, Constraints.MUST_WRAP); + var type = compiler.currentType; + if (type.isValue) { + let arg1: ExpressionRef; + if (!typeArguments && left.isNumericLiteral) { + // prefer right type + arg1 = compiler.compileExpression( + operands[1], + type, + Constraints.MUST_WRAP + ); + if (compiler.currentType != type) { + arg0 = compiler.compileExpression( + left, + (type = compiler.currentType), + Constraints.CONV_IMPLICIT | Constraints.MUST_WRAP + ); + } + } else { + arg1 = compiler.compileExpression( + operands[1], + type, + Constraints.CONV_IMPLICIT | Constraints.MUST_WRAP + ); + } + let op: BinaryOp = -1; + switch (type.kind) { + case TypeKind.I8: + case TypeKind.I16: + case TypeKind.I32: + case TypeKind.U8: + case TypeKind.U16: + case TypeKind.U32: + case TypeKind.BOOL: { + op = BinaryOp.AddI32; + break; + } + case TypeKind.I64: + case TypeKind.U64: { + op = BinaryOp.AddI64; + break; + } + case TypeKind.ISIZE: { + op = compiler.options.isWasm64 ? BinaryOp.AddI64 : BinaryOp.AddI32; + break; + } + case TypeKind.USIZE: { + op = compiler.options.isWasm64 ? BinaryOp.AddI64 : BinaryOp.AddI32; + break; + } + case TypeKind.F32: + return module.binary(BinaryOp.AddF32, arg0, arg1); + case TypeKind.F64: + return module.binary(BinaryOp.AddF64, arg0, arg1); + } + if (op != -1) { + let flow = compiler.currentFlow; + let nativeType = type.toNativeType(); + let temp1 = flow.getTempLocal(type); + flow.setLocalFlag(temp1.index, LocalFlags.WRAPPED); + let temp2 = flow.getTempLocal(type); + flow.setLocalFlag(temp2.index, LocalFlags.WRAPPED); + let ret = module.binary( + op, + module.local_get(temp1.index, nativeType), + module.local_get(temp2.index, nativeType) + ); + flow.freeTempLocal(temp2); + flow.freeTempLocal(temp1); + return ret; + } + } + compiler.error( + DiagnosticCode.Operation_0_cannot_be_applied_to_type_1, + ctx.reportNode.typeArgumentsRange, + "add", + type.toString() + ); + return module.unreachable(); +} +builtins.set(BuiltinNames.add, builtin_add); + // === Atomics ================================================================================ // atomic.load(offset: usize, immOffset?: usize) -> T* @@ -5580,6 +5684,42 @@ function builtin_f64_trunc(ctx: BuiltinContext): ExpressionRef { } builtins.set(BuiltinNames.f64_trunc, builtin_f64_trunc); +// f32.add -> add +function builtin_f32_add(ctx: BuiltinContext): ExpressionRef { + checkTypeAbsent(ctx); + ctx.typeArguments = [ Type.f32 ]; + ctx.contextualType = Type.f32; + return builtin_add(ctx); +} +builtins.set(BuiltinNames.f32_add, builtin_f32_add); + +// f64.add -> add +function builtin_f64_add(ctx: BuiltinContext): ExpressionRef { + checkTypeAbsent(ctx); + ctx.typeArguments = [ Type.f64 ]; + ctx.contextualType = Type.f64; + return builtin_add(ctx); +} +builtins.set(BuiltinNames.f64_add, builtin_f64_add); + +// i32.add -> add +function builtin_i32_add(ctx: BuiltinContext): ExpressionRef { + checkTypeAbsent(ctx); + ctx.typeArguments = [Type.i32]; + ctx.contextualType = Type.i32; + return builtin_add(ctx); +} +builtins.set(BuiltinNames.i32_add, builtin_i32_add); + +// i64.add -> add +function builtin_i64_add(ctx: BuiltinContext): ExpressionRef { + checkTypeAbsent(ctx); + ctx.typeArguments = [Type.i64]; + ctx.contextualType = Type.i64; + return builtin_add(ctx); +} +builtins.set(BuiltinNames.i64_add, builtin_i64_add); + // i32.load8_s -> load function builtin_i32_load8_s(ctx: BuiltinContext): ExpressionRef { checkTypeAbsent(ctx); diff --git a/std/assembly/builtins.ts b/std/assembly/builtins.ts index 1e33ddf7db..22ed7bbf70 100644 --- a/std/assembly/builtins.ts +++ b/std/assembly/builtins.ts @@ -120,6 +120,10 @@ export declare function sqrt(value: T): T; @builtin export declare function trunc(value: T): T; +// @ts-ignore: decorator +@builtin +export declare function add(left: T, right: T): T; + // @ts-ignore: decorator @unsafe @builtin export declare function load(ptr: usize, immOffset?: usize, immAlign?: usize): T; @@ -290,6 +294,10 @@ export namespace i32 { @builtin export declare function popcnt(value: i32): i32; + // @ts-ignore: decorator + @builtin + export declare function add(left: i32, right:i32): i32; + // @ts-ignore: decorator @builtin export declare function rotl(value: i32, shift: i32): i32; @@ -481,6 +489,10 @@ export namespace i64 { @builtin export declare function ctz(value: i64): i64; + // @ts-ignore: decorator + @builtin + export declare function add(left: i64, right:i64): i64; + // @ts-ignore: decorator @builtin export declare function load8_s(ptr: usize, immOffset?: usize, immAlign?: usize): i64; @@ -905,6 +917,10 @@ export namespace f32 { // @ts-ignore: decorator @builtin export declare function trunc(value: f32): f32; + + // @ts-ignore: decorator + @builtin + export declare function add(left: f32, right: f32): f32; } // @ts-ignore: decorator @@ -996,6 +1012,10 @@ export namespace f64 { // @ts-ignore: decorator @builtin export declare function trunc(value: f64): f64; + + // @ts-ignore: decorator + @builtin + export declare function add(left: f64, right: f64): f64; } // @ts-ignore: decorator diff --git a/std/assembly/index.d.ts b/std/assembly/index.d.ts index f281cfb769..bd44a61035 100644 --- a/std/assembly/index.d.ts +++ b/std/assembly/index.d.ts @@ -119,6 +119,8 @@ declare function select(ifTrue: T, ifFalse: T, condition: bool): T; declare function sqrt(value: T): T; /** Rounds to the nearest integer towards zero of a 32-bit or 64-bit float. */ declare function trunc(value: T): T; +/** Computes sum of two integers or floats. */ +declare function add(left: T, right: T): T; /** Loads a value of the specified type from memory. Equivalent to dereferncing a pointer in other languages. */ declare function load(ptr: usize, immOffset?: usize, immAlign?: usize): T; /** Stores a value of the specified type to memory. Equivalent to dereferencing a pointer in other languages when assigning a value. */ diff --git a/tests/compiler/builtins.optimized.wat b/tests/compiler/builtins.optimized.wat index 1067470f8e..99893aa327 100644 --- a/tests/compiler/builtins.optimized.wat +++ b/tests/compiler/builtins.optimized.wat @@ -203,6 +203,8 @@ global.set $builtins/i i32.const 1 global.set $builtins/i + i32.const 3 + global.set $builtins/i i64.const 63 global.set $builtins/I i64.const 0 @@ -219,6 +221,8 @@ global.set $builtins/I i64.const 1 global.set $builtins/I + i64.const 3 + global.set $builtins/I f32.const nan:0x400000 global.set $builtins/f f32.const inf @@ -231,6 +235,8 @@ global.set $builtins/f f32.const 1 global.set $builtins/f + f32.const 3.75 + global.set $builtins/f f32.const 2.5 global.set $builtins/f f32.const 1.25 @@ -253,6 +259,8 @@ global.set $builtins/F f64.const 1 global.set $builtins/F + f64.const 3.75 + global.set $builtins/F f64.const 2.5 global.set $builtins/F f64.const 1.25 @@ -267,6 +275,10 @@ global.set $builtins/F f32.const 1 global.set $builtins/f + f64.const 1 + global.set $builtins/F + f32.const 1 + global.set $builtins/f i32.const 8 i32.load global.set $builtins/i @@ -467,7 +479,7 @@ if i32.const 0 i32.const 1088 - i32.const 265 + i32.const 273 i32.const 1 call $~lib/builtins/abort unreachable @@ -482,7 +494,7 @@ if i32.const 0 i32.const 1088 - i32.const 266 + i32.const 274 i32.const 1 call $~lib/builtins/abort unreachable @@ -494,7 +506,7 @@ if i32.const 0 i32.const 1088 - i32.const 267 + i32.const 275 i32.const 1 call $~lib/builtins/abort unreachable @@ -506,7 +518,7 @@ if i32.const 0 i32.const 1088 - i32.const 270 + i32.const 278 i32.const 1 call $~lib/builtins/abort unreachable @@ -585,7 +597,7 @@ if i32.const 0 i32.const 1088 - i32.const 432 + i32.const 446 i32.const 1 call $~lib/builtins/abort unreachable @@ -597,7 +609,7 @@ if i32.const 0 i32.const 1088 - i32.const 433 + i32.const 447 i32.const 1 call $~lib/builtins/abort unreachable @@ -609,7 +621,7 @@ if i32.const 0 i32.const 1088 - i32.const 434 + i32.const 448 i32.const 1 call $~lib/builtins/abort unreachable @@ -619,7 +631,7 @@ if i32.const 0 i32.const 1088 - i32.const 435 + i32.const 449 i32.const 1 call $~lib/builtins/abort unreachable @@ -631,7 +643,7 @@ if i32.const 0 i32.const 1088 - i32.const 436 + i32.const 450 i32.const 1 call $~lib/builtins/abort unreachable @@ -641,7 +653,7 @@ if i32.const 0 i32.const 1088 - i32.const 437 + i32.const 451 i32.const 1 call $~lib/builtins/abort unreachable @@ -651,7 +663,7 @@ if i32.const 0 i32.const 1088 - i32.const 438 + i32.const 452 i32.const 1 call $~lib/builtins/abort unreachable @@ -671,7 +683,7 @@ if i32.const 0 i32.const 1088 - i32.const 455 + i32.const 469 i32.const 3 call $~lib/builtins/abort unreachable @@ -683,7 +695,7 @@ if i32.const 0 i32.const 1088 - i32.const 456 + i32.const 470 i32.const 3 call $~lib/builtins/abort unreachable @@ -695,7 +707,7 @@ if i32.const 0 i32.const 1088 - i32.const 457 + i32.const 471 i32.const 3 call $~lib/builtins/abort unreachable @@ -707,7 +719,7 @@ if i32.const 0 i32.const 1088 - i32.const 458 + i32.const 472 i32.const 3 call $~lib/builtins/abort unreachable @@ -719,7 +731,7 @@ if i32.const 0 i32.const 1088 - i32.const 459 + i32.const 473 i32.const 3 call $~lib/builtins/abort unreachable @@ -731,7 +743,7 @@ if i32.const 0 i32.const 1088 - i32.const 460 + i32.const 474 i32.const 3 call $~lib/builtins/abort unreachable @@ -743,7 +755,7 @@ if i32.const 0 i32.const 1088 - i32.const 461 + i32.const 475 i32.const 3 call $~lib/builtins/abort unreachable @@ -755,7 +767,7 @@ if i32.const 0 i32.const 1088 - i32.const 462 + i32.const 476 i32.const 3 call $~lib/builtins/abort unreachable @@ -767,7 +779,7 @@ if i32.const 0 i32.const 1088 - i32.const 463 + i32.const 477 i32.const 3 call $~lib/builtins/abort unreachable @@ -779,7 +791,7 @@ if i32.const 0 i32.const 1088 - i32.const 464 + i32.const 478 i32.const 3 call $~lib/builtins/abort unreachable @@ -791,7 +803,7 @@ if i32.const 0 i32.const 1088 - i32.const 465 + i32.const 479 i32.const 3 call $~lib/builtins/abort unreachable @@ -803,7 +815,7 @@ if i32.const 0 i32.const 1088 - i32.const 466 + i32.const 480 i32.const 3 call $~lib/builtins/abort unreachable @@ -815,7 +827,7 @@ if i32.const 0 i32.const 1088 - i32.const 467 + i32.const 481 i32.const 3 call $~lib/builtins/abort unreachable @@ -827,7 +839,7 @@ if i32.const 0 i32.const 1088 - i32.const 468 + i32.const 482 i32.const 3 call $~lib/builtins/abort unreachable @@ -839,7 +851,7 @@ if i32.const 0 i32.const 1088 - i32.const 469 + i32.const 483 i32.const 3 call $~lib/builtins/abort unreachable @@ -851,7 +863,7 @@ if i32.const 0 i32.const 1088 - i32.const 470 + i32.const 484 i32.const 3 call $~lib/builtins/abort unreachable @@ -863,7 +875,7 @@ if i32.const 0 i32.const 1088 - i32.const 471 + i32.const 485 i32.const 3 call $~lib/builtins/abort unreachable @@ -875,7 +887,7 @@ if i32.const 0 i32.const 1088 - i32.const 472 + i32.const 486 i32.const 3 call $~lib/builtins/abort unreachable @@ -887,7 +899,7 @@ if i32.const 0 i32.const 1088 - i32.const 473 + i32.const 487 i32.const 3 call $~lib/builtins/abort unreachable @@ -899,7 +911,7 @@ if i32.const 0 i32.const 1088 - i32.const 474 + i32.const 488 i32.const 3 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/builtins.ts b/tests/compiler/builtins.ts index 5df24b334d..2140590238 100644 --- a/tests/compiler/builtins.ts +++ b/tests/compiler/builtins.ts @@ -58,6 +58,7 @@ rotr(1, 1); abs(-42); max(1, 2); min(1, 2); +add(1, 2); i = clz(1); i = ctz(1); @@ -67,6 +68,7 @@ i = rotr(1, 1); i = abs(-42); assert(i == 42); i = max(1, 2); assert(i == 2); i = min(1, 2); assert(i == 1); +i = add(1, 2); assert(i == 3); var I: i64; @@ -84,7 +86,8 @@ I = rotl(1, 1); I = rotr(1, 1); I = abs(-42); assert(I == 42); I = max(1, 2); assert(I == 2); -I = min(1, 2); assert(i == 1); +I = min(1, 2); assert(I == 1); +I = add(1, 2); assert(I == 3); // floats @@ -114,6 +117,7 @@ f = abs(1.25); f = ceil(1.25); f = copysign(1.25, 2.5); f = floor(1.25); +f = add(1.25, 2.5); f = max(1.25, 2.5); f = min(1.25, 2.5); f = nearest(1.25); @@ -132,6 +136,7 @@ abs(1.25); ceil(1.25); copysign(1.25, 2.5); floor(1.25); +add(1.25, 2.5); max(1.25, 2.5); min(1.25, 2.5); nearest(1.25); @@ -150,6 +155,7 @@ F = abs(1.25); F = ceil(1.25); F = copysign(1.25, 2.5); F = floor(1.25); +F = add(1.25, 2.5); F = max(1.25, 2.5); F = min(1.25, 2.5); F = nearest(1.25); @@ -162,6 +168,8 @@ b = isFinite(1.25); F = min(0, 1.0); f = max(0, f); +F = add(0, 1.0); +f = add(0, f); // load and store @@ -381,6 +389,9 @@ f64.nearest(1.0); i32.popcnt(1); i64.popcnt(1); +i32.add(1, 2); +i64.add(1, 2); + i32.load8_s(8); i32.load8_u(8); i32.load16_s(8); @@ -396,6 +407,9 @@ i64.load(8); f32.load(8); f64.load(8); +f32.add(1.0, 2.0); +f64.add(1.0, 2.0); + f32.max(1.0, 2.0); f64.max(1.0, 2.0); diff --git a/tests/compiler/builtins.untouched.wat b/tests/compiler/builtins.untouched.wat index 9573100c47..aaa8d2a38c 100644 --- a/tests/compiler/builtins.untouched.wat +++ b/tests/compiler/builtins.untouched.wat @@ -488,6 +488,10 @@ i32.lt_s select drop + local.get $0 + local.get $1 + i32.add + drop i32.const 1 i32.clz global.set $builtins/i @@ -522,7 +526,7 @@ if i32.const 0 i32.const 80 - i32.const 67 + i32.const 68 i32.const 20 call $~lib/builtins/abort unreachable @@ -543,7 +547,7 @@ if i32.const 0 i32.const 80 - i32.const 68 + i32.const 69 i32.const 21 call $~lib/builtins/abort unreachable @@ -564,7 +568,23 @@ if i32.const 0 i32.const 80 - i32.const 69 + i32.const 70 + i32.const 21 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $1 + i32.add + global.set $builtins/i + global.get $builtins/i + i32.const 3 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 80 + i32.const 71 i32.const 21 call $~lib/builtins/abort unreachable @@ -630,7 +650,7 @@ if i32.const 0 i32.const 80 - i32.const 85 + i32.const 87 i32.const 20 call $~lib/builtins/abort unreachable @@ -651,7 +671,7 @@ if i32.const 0 i32.const 80 - i32.const 86 + i32.const 88 i32.const 21 call $~lib/builtins/abort unreachable @@ -665,14 +685,30 @@ i64.lt_s select global.set $builtins/I - global.get $builtins/i - i32.const 1 - i32.eq + global.get $builtins/I + i64.const 1 + i64.eq i32.eqz if i32.const 0 i32.const 80 - i32.const 87 + i32.const 89 + i32.const 21 + call $~lib/builtins/abort + unreachable + end + local.get $2 + local.get $3 + i64.add + global.set $builtins/I + global.get $builtins/I + i64.const 3 + i64.eq + i32.eqz + if + i32.const 0 + i32.const 80 + i32.const 90 i32.const 21 call $~lib/builtins/abort unreachable @@ -781,6 +817,10 @@ global.set $builtins/f f32.const 1.25 f32.const 2.5 + f32.add + global.set $builtins/f + f32.const 1.25 + f32.const 2.5 f32.max global.set $builtins/f f32.const 1.25 @@ -831,6 +871,10 @@ drop f64.const 1.25 f64.const 2.5 + f64.add + drop + f64.const 1.25 + f64.const 2.5 f64.max drop f64.const 1.25 @@ -916,6 +960,10 @@ global.set $builtins/F f64.const 1.25 f64.const 2.5 + f64.add + global.set $builtins/F + f64.const 1.25 + f64.const 2.5 f64.max global.set $builtins/F f64.const 1.25 @@ -951,6 +999,14 @@ global.get $builtins/f f32.max global.set $builtins/f + f64.const 0 + f64.const 1 + f64.add + global.set $builtins/F + f32.const 0 + global.get $builtins/f + f32.add + global.set $builtins/f i32.const 8 i32.load global.set $builtins/i @@ -1208,7 +1264,7 @@ if i32.const 0 i32.const 80 - i32.const 265 + i32.const 273 i32.const 1 call $~lib/builtins/abort unreachable @@ -1224,7 +1280,7 @@ if i32.const 0 i32.const 80 - i32.const 266 + i32.const 274 i32.const 1 call $~lib/builtins/abort unreachable @@ -1238,7 +1294,7 @@ if i32.const 0 i32.const 80 - i32.const 267 + i32.const 275 i32.const 1 call $~lib/builtins/abort unreachable @@ -1251,7 +1307,7 @@ if i32.const 0 i32.const 80 - i32.const 268 + i32.const 276 i32.const 1 call $~lib/builtins/abort unreachable @@ -1264,7 +1320,7 @@ if i32.const 0 i32.const 80 - i32.const 269 + i32.const 277 i32.const 1 call $~lib/builtins/abort unreachable @@ -1278,7 +1334,7 @@ if i32.const 0 i32.const 80 - i32.const 270 + i32.const 278 i32.const 1 call $~lib/builtins/abort unreachable @@ -1621,6 +1677,14 @@ i64.const 1 i64.popcnt drop + local.get $6 + local.get $7 + i32.add + drop + local.get $2 + local.get $3 + i64.add + drop i32.const 8 i32.load8_s drop @@ -1665,6 +1729,14 @@ drop f32.const 1 f32.const 2 + f32.add + drop + f64.const 1 + f64.const 2 + f64.add + drop + f32.const 1 + f32.const 2 f32.max drop f64.const 1 @@ -1754,7 +1826,7 @@ if i32.const 0 i32.const 80 - i32.const 432 + i32.const 446 i32.const 1 call $~lib/builtins/abort unreachable @@ -1767,7 +1839,7 @@ if i32.const 0 i32.const 80 - i32.const 433 + i32.const 447 i32.const 1 call $~lib/builtins/abort unreachable @@ -1780,7 +1852,7 @@ if i32.const 0 i32.const 80 - i32.const 434 + i32.const 448 i32.const 1 call $~lib/builtins/abort unreachable @@ -1793,7 +1865,7 @@ if i32.const 0 i32.const 80 - i32.const 435 + i32.const 449 i32.const 1 call $~lib/builtins/abort unreachable @@ -1806,7 +1878,7 @@ if i32.const 0 i32.const 80 - i32.const 436 + i32.const 450 i32.const 1 call $~lib/builtins/abort unreachable @@ -1819,7 +1891,7 @@ if i32.const 0 i32.const 80 - i32.const 437 + i32.const 451 i32.const 1 call $~lib/builtins/abort unreachable @@ -1832,7 +1904,7 @@ if i32.const 0 i32.const 80 - i32.const 438 + i32.const 452 i32.const 1 call $~lib/builtins/abort unreachable @@ -1867,7 +1939,7 @@ if i32.const 288 i32.const 80 - i32.const 448 + i32.const 462 i32.const 3 call $~lib/builtins/abort unreachable @@ -1879,7 +1951,7 @@ if i32.const 0 i32.const 80 - i32.const 449 + i32.const 463 i32.const 3 call $~lib/builtins/abort unreachable @@ -1891,7 +1963,7 @@ if i32.const 0 i32.const 80 - i32.const 450 + i32.const 464 i32.const 3 call $~lib/builtins/abort unreachable @@ -1903,7 +1975,7 @@ if i32.const 0 i32.const 80 - i32.const 451 + i32.const 465 i32.const 3 call $~lib/builtins/abort unreachable @@ -1915,7 +1987,7 @@ if i32.const 0 i32.const 80 - i32.const 455 + i32.const 469 i32.const 3 call $~lib/builtins/abort unreachable @@ -1927,7 +1999,7 @@ if i32.const 0 i32.const 80 - i32.const 456 + i32.const 470 i32.const 3 call $~lib/builtins/abort unreachable @@ -1939,7 +2011,7 @@ if i32.const 0 i32.const 80 - i32.const 457 + i32.const 471 i32.const 3 call $~lib/builtins/abort unreachable @@ -1951,7 +2023,7 @@ if i32.const 0 i32.const 80 - i32.const 458 + i32.const 472 i32.const 3 call $~lib/builtins/abort unreachable @@ -1963,7 +2035,7 @@ if i32.const 0 i32.const 80 - i32.const 459 + i32.const 473 i32.const 3 call $~lib/builtins/abort unreachable @@ -1975,7 +2047,7 @@ if i32.const 0 i32.const 80 - i32.const 460 + i32.const 474 i32.const 3 call $~lib/builtins/abort unreachable @@ -1987,7 +2059,7 @@ if i32.const 0 i32.const 80 - i32.const 461 + i32.const 475 i32.const 3 call $~lib/builtins/abort unreachable @@ -1999,7 +2071,7 @@ if i32.const 0 i32.const 80 - i32.const 462 + i32.const 476 i32.const 3 call $~lib/builtins/abort unreachable @@ -2011,7 +2083,7 @@ if i32.const 0 i32.const 80 - i32.const 463 + i32.const 477 i32.const 3 call $~lib/builtins/abort unreachable @@ -2023,7 +2095,7 @@ if i32.const 0 i32.const 80 - i32.const 464 + i32.const 478 i32.const 3 call $~lib/builtins/abort unreachable @@ -2035,7 +2107,7 @@ if i32.const 0 i32.const 80 - i32.const 465 + i32.const 479 i32.const 3 call $~lib/builtins/abort unreachable @@ -2047,7 +2119,7 @@ if i32.const 0 i32.const 80 - i32.const 466 + i32.const 480 i32.const 3 call $~lib/builtins/abort unreachable @@ -2059,7 +2131,7 @@ if i32.const 0 i32.const 80 - i32.const 467 + i32.const 481 i32.const 3 call $~lib/builtins/abort unreachable @@ -2071,7 +2143,7 @@ if i32.const 0 i32.const 80 - i32.const 468 + i32.const 482 i32.const 3 call $~lib/builtins/abort unreachable @@ -2083,7 +2155,7 @@ if i32.const 0 i32.const 80 - i32.const 469 + i32.const 483 i32.const 3 call $~lib/builtins/abort unreachable @@ -2095,7 +2167,7 @@ if i32.const 0 i32.const 80 - i32.const 470 + i32.const 484 i32.const 3 call $~lib/builtins/abort unreachable @@ -2107,7 +2179,7 @@ if i32.const 0 i32.const 80 - i32.const 471 + i32.const 485 i32.const 3 call $~lib/builtins/abort unreachable @@ -2119,7 +2191,7 @@ if i32.const 0 i32.const 80 - i32.const 472 + i32.const 486 i32.const 3 call $~lib/builtins/abort unreachable @@ -2131,7 +2203,7 @@ if i32.const 0 i32.const 80 - i32.const 473 + i32.const 487 i32.const 3 call $~lib/builtins/abort unreachable @@ -2143,7 +2215,7 @@ if i32.const 0 i32.const 80 - i32.const 474 + i32.const 488 i32.const 3 call $~lib/builtins/abort unreachable From 606e65bd3f2dd6ca60148992c03dfb8c2d62f8a1 Mon Sep 17 00:00:00 2001 From: ValeriaVG Date: Sat, 3 Oct 2020 11:23:05 +0200 Subject: [PATCH 02/17] Add author to NOTICE --- NOTICE | 1 + 1 file changed, 1 insertion(+) diff --git a/NOTICE b/NOTICE index 198b982544..31569de6a1 100644 --- a/NOTICE +++ b/NOTICE @@ -26,6 +26,7 @@ under the licensing terms detailed in LICENSE: * ncave <777696+ncave@users.noreply.github.com> * Andrew Davis * Maƫl Nison +* Valeria Viana Gusmao Portions of this software are derived from third-party works licensed under the following terms: From e8820d7f90c5d39a4ef7ade0544b57fb7b500371 Mon Sep 17 00:00:00 2001 From: ValeriaVG Date: Sat, 3 Oct 2020 13:27:19 +0200 Subject: [PATCH 03/17] Reorder exports in builtins --- src/builtins.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/builtins.ts b/src/builtins.ts index 7004bbf48b..64124ffc4c 100644 --- a/src/builtins.ts +++ b/src/builtins.ts @@ -141,6 +141,7 @@ export namespace BuiltinNames { export const isManaged = "~lib/builtins/isManaged"; export const isVoid = "~lib/builtins/isVoid"; + export const add = "~lib/builtins/add"; export const clz = "~lib/builtins/clz"; export const ctz = "~lib/builtins/ctz"; export const popcnt = "~lib/builtins/popcnt"; @@ -185,8 +186,6 @@ export namespace BuiltinNames { export const instantiate = "~lib/builtins/instantiate"; export const idof = "~lib/builtins/idof"; - export const add = "~lib/builtins/add"; - export const i8 = "~lib/builtins/i8"; export const i16 = "~lib/builtins/i16"; export const i32 = "~lib/builtins/i32"; From 0a4f167b916735f6d8c5563ffbbbd567fe430e54 Mon Sep 17 00:00:00 2001 From: Valeria Date: Sat, 3 Oct 2020 14:24:57 +0200 Subject: [PATCH 04/17] Update src/builtins.ts Co-authored-by: Max Graey --- src/builtins.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/builtins.ts b/src/builtins.ts index 64124ffc4c..64ec7f8707 100644 --- a/src/builtins.ts +++ b/src/builtins.ts @@ -5704,7 +5704,7 @@ builtins.set(BuiltinNames.f64_add, builtin_f64_add); // i32.add -> add function builtin_i32_add(ctx: BuiltinContext): ExpressionRef { checkTypeAbsent(ctx); - ctx.typeArguments = [Type.i32]; + ctx.typeArguments = [ Type.i32 ]; ctx.contextualType = Type.i32; return builtin_add(ctx); } From c56a901714660fc6e4f8512b6748c6c5a4f8c641 Mon Sep 17 00:00:00 2001 From: Valeria Date: Sat, 3 Oct 2020 14:25:04 +0200 Subject: [PATCH 05/17] Update src/builtins.ts Co-authored-by: Max Graey --- src/builtins.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/builtins.ts b/src/builtins.ts index 64ec7f8707..6f9b592225 100644 --- a/src/builtins.ts +++ b/src/builtins.ts @@ -5713,7 +5713,7 @@ builtins.set(BuiltinNames.i32_add, builtin_i32_add); // i64.add -> add function builtin_i64_add(ctx: BuiltinContext): ExpressionRef { checkTypeAbsent(ctx); - ctx.typeArguments = [Type.i64]; + ctx.typeArguments = [ Type.i64 ]; ctx.contextualType = Type.i64; return builtin_add(ctx); } From 0304c758af2046a444daacbddd573df44d69bdc8 Mon Sep 17 00:00:00 2001 From: ValeriaVG Date: Sat, 3 Oct 2020 15:49:29 +0200 Subject: [PATCH 06/17] Add T.add types --- std/assembly/index.d.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/std/assembly/index.d.ts b/std/assembly/index.d.ts index bd44a61035..647efc72d9 100644 --- a/std/assembly/index.d.ts +++ b/std/assembly/index.d.ts @@ -278,6 +278,8 @@ declare namespace i32 { export function store16(ptr: usize, value: i32, immOffset?: usize, immAlign?: usize): void; /** Stores a 32-bit integer value to memory. */ export function store(ptr: usize, value: i32, immOffset?: usize, immAlign?: usize): void; + /** Computes sum of two 32-bit integers */ + export function add(left: i32, right: i32): i32; /** Atomic 32-bit integer operations. */ export namespace atomic { /** Atomically loads an 8-bit unsigned integer value from memory and returns it as a 32-bit integer. */ @@ -376,6 +378,8 @@ declare namespace i64 { export function store32(ptr: usize, value: i64, immOffset?: usize, immAlign?: usize): void; /** Stores a 64-bit integer value to memory. */ export function store(ptr: usize, value: i64, immOffset?: usize, immAlign?: usize): void; + /** Computes sum of two 64-bit integers */ + export function add(left: i64, right: i64): i64; /** Atomic 64-bit integer operations. */ export namespace atomic { /** Atomically loads an 8-bit unsigned integer value from memory and returns it as a 64-bit integer. */ @@ -535,6 +539,8 @@ declare namespace f32 { export function load(ptr: usize, immOffset?: usize, immAlign?: usize): f32; /** Stores a 32-bit float to memory. */ export function store(ptr: usize, value: f32, immOffset?: usize, immAlign?: usize): void; + /** Computes sum of two 32-bit floats */ + export function add(left: f32, right: f32): f32; } /** Converts any other numeric value to a 64-bit float. */ declare function f64(value: any): f64; @@ -561,6 +567,8 @@ declare namespace f64 { export function load(ptr: usize, immOffset?: usize, immAlign?: usize): f64; /** Stores a 64-bit float to memory. */ export function store(ptr: usize, value: f64, immOffset?: usize, immAlign?: usize): void; + /** Computes sum of two 64-bit floats */ + export function add(left: f64, right: f64): f64; } /** Initializes a 128-bit vector from sixteen 8-bit integer values. Arguments must be compile-time constants. */ declare function v128(a: i8, b: i8, c: i8, d: i8, e: i8, f: i8, g: i8, h: i8, i: i8, j: i8, k: i8, l: i8, m: i8, n: i8, o: i8, p: i8): v128; From f2ae153beb36d65a39ebe27a24bdb6b4dd2ab85c Mon Sep 17 00:00:00 2001 From: ValeriaVG Date: Sat, 3 Oct 2020 19:11:26 +0200 Subject: [PATCH 07/17] Add sub & mul builtins --- src/builtins.ts | 300 ++++++++++++++++++++++++-- std/assembly/builtins.ts | 46 +++- std/assembly/index.d.ts | 22 +- tests/compiler/builtins.optimized.wat | 86 +++++--- tests/compiler/builtins.ts | 25 ++- tests/compiler/builtins.untouched.wat | 186 ++++++++++++---- 6 files changed, 572 insertions(+), 93 deletions(-) diff --git a/src/builtins.ts b/src/builtins.ts index 6f9b592225..95df49d7ab 100644 --- a/src/builtins.ts +++ b/src/builtins.ts @@ -142,6 +142,8 @@ export namespace BuiltinNames { export const isVoid = "~lib/builtins/isVoid"; export const add = "~lib/builtins/add"; + export const sub = "~lib/builtins/sub"; + export const mul = "~lib/builtins/mul"; export const clz = "~lib/builtins/clz"; export const ctz = "~lib/builtins/ctz"; export const popcnt = "~lib/builtins/popcnt"; @@ -239,6 +241,14 @@ export namespace BuiltinNames { export const i64_add = "~lib/builtins/i64.add"; export const f32_add = "~lib/builtins/f32.add"; export const f64_add = "~lib/builtins/f64.add"; + export const i32_sub = "~lib/builtins/i32.sub"; + export const i64_sub = "~lib/builtins/i64.sub"; + export const f32_sub = "~lib/builtins/f32.sub"; + export const f64_sub = "~lib/builtins/f64.sub"; + export const i32_mul = "~lib/builtins/i32.mul"; + export const i64_mul = "~lib/builtins/i64.mul"; + export const f32_mul = "~lib/builtins/f32.mul"; + export const f64_mul = "~lib/builtins/f64.mul"; export const i32_load8_s = "~lib/builtins/i32.load8_s"; export const i32_load8_u = "~lib/builtins/i32.load8_u"; @@ -2159,6 +2169,200 @@ function builtin_add(ctx: BuiltinContext): ExpressionRef { } builtins.set(BuiltinNames.add, builtin_add); +// sub(left: T, right: T) -> T +function builtin_sub(ctx: BuiltinContext): ExpressionRef { + var compiler = ctx.compiler; + var module = compiler.module; + if (checkTypeOptional(ctx, true) | checkArgsRequired(ctx, 2)) + return module.unreachable(); + var operands = ctx.operands; + var typeArguments = ctx.typeArguments; + var left = operands[0]; + var arg0 = typeArguments + ? compiler.compileExpression( + left, + typeArguments[0], + Constraints.CONV_IMPLICIT | Constraints.MUST_WRAP + ) + : compiler.compileExpression(operands[0], Type.auto, Constraints.MUST_WRAP); + var type = compiler.currentType; + if (type.isValue) { + let arg1: ExpressionRef; + if (!typeArguments && left.isNumericLiteral) { + // prefer right type + arg1 = compiler.compileExpression( + operands[1], + type, + Constraints.MUST_WRAP + ); + if (compiler.currentType != type) { + arg0 = compiler.compileExpression( + left, + (type = compiler.currentType), + Constraints.CONV_IMPLICIT | Constraints.MUST_WRAP + ); + } + } else { + arg1 = compiler.compileExpression( + operands[1], + type, + Constraints.CONV_IMPLICIT | Constraints.MUST_WRAP + ); + } + let op: BinaryOp = -1; + switch (type.kind) { + case TypeKind.I8: + case TypeKind.I16: + case TypeKind.I32: + case TypeKind.U8: + case TypeKind.U16: + case TypeKind.U32: + case TypeKind.BOOL: { + op = BinaryOp.SubI32; + break; + } + case TypeKind.I64: + case TypeKind.U64: { + op = BinaryOp.SubI64; + break; + } + case TypeKind.ISIZE: { + op = compiler.options.isWasm64 ? BinaryOp.SubI64 : BinaryOp.SubI32; + break; + } + case TypeKind.USIZE: { + op = compiler.options.isWasm64 ? BinaryOp.SubI64 : BinaryOp.SubI32; + break; + } + case TypeKind.F32: + return module.binary(BinaryOp.SubF32, arg0, arg1); + case TypeKind.F64: + return module.binary(BinaryOp.SubF64, arg0, arg1); + } + if (op != -1) { + let flow = compiler.currentFlow; + let nativeType = type.toNativeType(); + let temp1 = flow.getTempLocal(type); + flow.setLocalFlag(temp1.index, LocalFlags.WRAPPED); + let temp2 = flow.getTempLocal(type); + flow.setLocalFlag(temp2.index, LocalFlags.WRAPPED); + let ret = module.binary( + op, + module.local_get(temp1.index, nativeType), + module.local_get(temp2.index, nativeType) + ); + flow.freeTempLocal(temp2); + flow.freeTempLocal(temp1); + return ret; + } + } + compiler.error( + DiagnosticCode.Operation_0_cannot_be_applied_to_type_1, + ctx.reportNode.typeArgumentsRange, + "sub", + type.toString() + ); + return module.unreachable(); +} +builtins.set(BuiltinNames.sub, builtin_sub); + +// mul(left: T, right: T) -> T +function builtin_mul(ctx: BuiltinContext): ExpressionRef { + var compiler = ctx.compiler; + var module = compiler.module; + if (checkTypeOptional(ctx, true) | checkArgsRequired(ctx, 2)) + return module.unreachable(); + var operands = ctx.operands; + var typeArguments = ctx.typeArguments; + var left = operands[0]; + var arg0 = typeArguments + ? compiler.compileExpression( + left, + typeArguments[0], + Constraints.CONV_IMPLICIT | Constraints.MUST_WRAP + ) + : compiler.compileExpression(operands[0], Type.auto, Constraints.MUST_WRAP); + var type = compiler.currentType; + if (type.isValue) { + let arg1: ExpressionRef; + if (!typeArguments && left.isNumericLiteral) { + // prefer right type + arg1 = compiler.compileExpression( + operands[1], + type, + Constraints.MUST_WRAP + ); + if (compiler.currentType != type) { + arg0 = compiler.compileExpression( + left, + (type = compiler.currentType), + Constraints.CONV_IMPLICIT | Constraints.MUST_WRAP + ); + } + } else { + arg1 = compiler.compileExpression( + operands[1], + type, + Constraints.CONV_IMPLICIT | Constraints.MUST_WRAP + ); + } + let op: BinaryOp = -1; + switch (type.kind) { + case TypeKind.I8: + case TypeKind.I16: + case TypeKind.I32: + case TypeKind.U8: + case TypeKind.U16: + case TypeKind.U32: + case TypeKind.BOOL: { + op = BinaryOp.MulI32; + break; + } + case TypeKind.I64: + case TypeKind.U64: { + op = BinaryOp.MulI64; + break; + } + case TypeKind.ISIZE: { + op = compiler.options.isWasm64 ? BinaryOp.MulI64 : BinaryOp.MulI32; + break; + } + case TypeKind.USIZE: { + op = compiler.options.isWasm64 ? BinaryOp.MulI64 : BinaryOp.MulI32; + break; + } + case TypeKind.F32: + return module.binary(BinaryOp.MulF32, arg0, arg1); + case TypeKind.F64: + return module.binary(BinaryOp.MulF64, arg0, arg1); + } + if (op != -1) { + let flow = compiler.currentFlow; + let nativeType = type.toNativeType(); + let temp1 = flow.getTempLocal(type); + flow.setLocalFlag(temp1.index, LocalFlags.WRAPPED); + let temp2 = flow.getTempLocal(type); + flow.setLocalFlag(temp2.index, LocalFlags.WRAPPED); + let ret = module.binary( + op, + module.local_get(temp1.index, nativeType), + module.local_get(temp2.index, nativeType) + ); + flow.freeTempLocal(temp2); + flow.freeTempLocal(temp1); + return ret; + } + } + compiler.error( + DiagnosticCode.Operation_0_cannot_be_applied_to_type_1, + ctx.reportNode.typeArgumentsRange, + "mul", + type.toString() + ); + return module.unreachable(); +} +builtins.set(BuiltinNames.mul, builtin_mul); + // === Atomics ================================================================================ // atomic.load(offset: usize, immOffset?: usize) -> T* @@ -5683,6 +5887,60 @@ function builtin_f64_trunc(ctx: BuiltinContext): ExpressionRef { } builtins.set(BuiltinNames.f64_trunc, builtin_f64_trunc); +// i32.add -> add +function builtin_i32_add(ctx: BuiltinContext): ExpressionRef { + checkTypeAbsent(ctx); + ctx.typeArguments = [ Type.i32 ]; + ctx.contextualType = Type.i32; + return builtin_add(ctx); +} +builtins.set(BuiltinNames.i32_add, builtin_i32_add); + +// i64.add -> add +function builtin_i64_add(ctx: BuiltinContext): ExpressionRef { + checkTypeAbsent(ctx); + ctx.typeArguments = [ Type.i64 ]; + ctx.contextualType = Type.i64; + return builtin_add(ctx); +} +builtins.set(BuiltinNames.i64_add, builtin_i64_add); + +// i32.sub -> sub +function builtin_i32_sub(ctx: BuiltinContext): ExpressionRef { + checkTypeAbsent(ctx); + ctx.typeArguments = [ Type.i32 ]; + ctx.contextualType = Type.i32; + return builtin_sub(ctx); +} +builtins.set(BuiltinNames.i32_sub, builtin_i32_sub); + +// i64.sub -> sub +function builtin_i64_sub(ctx: BuiltinContext): ExpressionRef { + checkTypeAbsent(ctx); + ctx.typeArguments = [ Type.i64 ]; + ctx.contextualType = Type.i64; + return builtin_sub(ctx); +} +builtins.set(BuiltinNames.i64_sub, builtin_i64_sub); + +// i32.mul -> mul +function builtin_i32_mul(ctx: BuiltinContext): ExpressionRef { + checkTypeAbsent(ctx); + ctx.typeArguments = [ Type.i32 ]; + ctx.contextualType = Type.i32; + return builtin_mul(ctx); +} +builtins.set(BuiltinNames.i32_mul, builtin_i32_mul); + +// i64.mul -> mul +function builtin_i64_mul(ctx: BuiltinContext): ExpressionRef { + checkTypeAbsent(ctx); + ctx.typeArguments = [ Type.i64 ]; + ctx.contextualType = Type.i64; + return builtin_mul(ctx); +} +builtins.set(BuiltinNames.i64_mul, builtin_i64_mul); + // f32.add -> add function builtin_f32_add(ctx: BuiltinContext): ExpressionRef { checkTypeAbsent(ctx); @@ -5701,23 +5959,41 @@ function builtin_f64_add(ctx: BuiltinContext): ExpressionRef { } builtins.set(BuiltinNames.f64_add, builtin_f64_add); -// i32.add -> add -function builtin_i32_add(ctx: BuiltinContext): ExpressionRef { +// f32.sub -> sub +function builtin_f32_sub(ctx: BuiltinContext): ExpressionRef { checkTypeAbsent(ctx); - ctx.typeArguments = [ Type.i32 ]; - ctx.contextualType = Type.i32; - return builtin_add(ctx); + ctx.typeArguments = [ Type.f32 ]; + ctx.contextualType = Type.f32; + return builtin_sub(ctx); } -builtins.set(BuiltinNames.i32_add, builtin_i32_add); +builtins.set(BuiltinNames.f32_sub, builtin_f32_sub); -// i64.add -> add -function builtin_i64_add(ctx: BuiltinContext): ExpressionRef { +// f64.sub -> sub +function builtin_f64_sub(ctx: BuiltinContext): ExpressionRef { checkTypeAbsent(ctx); - ctx.typeArguments = [ Type.i64 ]; - ctx.contextualType = Type.i64; - return builtin_add(ctx); + ctx.typeArguments = [ Type.f64 ]; + ctx.contextualType = Type.f64; + return builtin_sub(ctx); } -builtins.set(BuiltinNames.i64_add, builtin_i64_add); +builtins.set(BuiltinNames.f64_sub, builtin_f64_sub); + +// f32.mul -> mul +function builtin_f32_mul(ctx: BuiltinContext): ExpressionRef { + checkTypeAbsent(ctx); + ctx.typeArguments = [ Type.f32 ]; + ctx.contextualType = Type.f32; + return builtin_mul(ctx); +} +builtins.set(BuiltinNames.f32_mul, builtin_f32_mul); + +// f64.mul -> mul +function builtin_f64_mul(ctx: BuiltinContext): ExpressionRef { + checkTypeAbsent(ctx); + ctx.typeArguments = [ Type.f64 ]; + ctx.contextualType = Type.f64; + return builtin_mul(ctx); +} +builtins.set(BuiltinNames.f64_mul, builtin_f64_mul); // i32.load8_s -> load function builtin_i32_load8_s(ctx: BuiltinContext): ExpressionRef { diff --git a/std/assembly/builtins.ts b/std/assembly/builtins.ts index 22ed7bbf70..0638f842cb 100644 --- a/std/assembly/builtins.ts +++ b/std/assembly/builtins.ts @@ -124,6 +124,14 @@ export declare function trunc(value: T): T; @builtin export declare function add(left: T, right: T): T; +// @ts-ignore: decorator +@builtin +export declare function sub(left: T, right: T): T; + +// @ts-ignore: decorator +@builtin +export declare function mul(left: T, right: T): T; + // @ts-ignore: decorator @unsafe @builtin export declare function load(ptr: usize, immOffset?: usize, immAlign?: usize): T; @@ -298,6 +306,14 @@ export namespace i32 { @builtin export declare function add(left: i32, right:i32): i32; + // @ts-ignore: decorator + @builtin + export declare function sub(left: i32, right:i32): i32; + + // @ts-ignore: decorator + @builtin + export declare function mul(left: i32, right:i32): i32; + // @ts-ignore: decorator @builtin export declare function rotl(value: i32, shift: i32): i32; @@ -491,7 +507,15 @@ export namespace i64 { // @ts-ignore: decorator @builtin - export declare function add(left: i64, right:i64): i64; + export declare function add(left: i64, right:i64): i64; + + // @ts-ignore: decorator + @builtin + export declare function sub(left: i64, right:i64): i64; + + // @ts-ignore: decorator + @builtin + export declare function mul(left: i64, right:i64): i64; // @ts-ignore: decorator @builtin @@ -920,7 +944,15 @@ export namespace f32 { // @ts-ignore: decorator @builtin - export declare function add(left: f32, right: f32): f32; + export declare function add(left: f32, right: f32): f32; + + // @ts-ignore: decorator + @builtin + export declare function sub(left: f32, right: f32): f32; + + // @ts-ignore: decorator + @builtin + export declare function mul(left: f32, right: f32): f32; } // @ts-ignore: decorator @@ -1015,7 +1047,15 @@ export namespace f64 { // @ts-ignore: decorator @builtin - export declare function add(left: f64, right: f64): f64; + export declare function add(left: f64, right: f64): f64; + + // @ts-ignore: decorator + @builtin + export declare function sub(left: f64, right: f64): f64; + + // @ts-ignore: decorator + @builtin + export declare function mul(left: f64, right: f64): f64; } // @ts-ignore: decorator diff --git a/std/assembly/index.d.ts b/std/assembly/index.d.ts index 647efc72d9..3b7ed7f76a 100644 --- a/std/assembly/index.d.ts +++ b/std/assembly/index.d.ts @@ -121,6 +121,10 @@ declare function sqrt(value: T): T; declare function trunc(value: T): T; /** Computes sum of two integers or floats. */ declare function add(left: T, right: T): T; +/** Computes difference of two integers or floats. */ +declare function sub(left: T, right: T): T; +/** Computes product of two integers or floats. */ +declare function mul(left: T, right: T): T; /** Loads a value of the specified type from memory. Equivalent to dereferncing a pointer in other languages. */ declare function load(ptr: usize, immOffset?: usize, immAlign?: usize): T; /** Stores a value of the specified type to memory. Equivalent to dereferencing a pointer in other languages when assigning a value. */ @@ -280,6 +284,10 @@ declare namespace i32 { export function store(ptr: usize, value: i32, immOffset?: usize, immAlign?: usize): void; /** Computes sum of two 32-bit integers */ export function add(left: i32, right: i32): i32; + /** Computes difference of two 32-bit integers */ + export function sub(left: i32, right: i32): i32; + /** Computes product of two 32-bit integers */ + export function mul(left: i32, right: i32): i32; /** Atomic 32-bit integer operations. */ export namespace atomic { /** Atomically loads an 8-bit unsigned integer value from memory and returns it as a 32-bit integer. */ @@ -379,7 +387,11 @@ declare namespace i64 { /** Stores a 64-bit integer value to memory. */ export function store(ptr: usize, value: i64, immOffset?: usize, immAlign?: usize): void; /** Computes sum of two 64-bit integers */ - export function add(left: i64, right: i64): i64; + export function add(left: i64, right: i64): i64; + /** Computes difference of two 64-bit integers */ + export function sub(left: i64, right: i64): i64; + /** Computes product of two 64-bit integers */ + export function mul(left: i64, right: i64): i64; /** Atomic 64-bit integer operations. */ export namespace atomic { /** Atomically loads an 8-bit unsigned integer value from memory and returns it as a 64-bit integer. */ @@ -541,6 +553,10 @@ declare namespace f32 { export function store(ptr: usize, value: f32, immOffset?: usize, immAlign?: usize): void; /** Computes sum of two 32-bit floats */ export function add(left: f32, right: f32): f32; + /** Computes difference of two 32-bit floats */ + export function sub(left: f32, right: f32): f32; + /** Computes product of two 32-bit floats */ + export function mul(left: f32, right: f32): f32; } /** Converts any other numeric value to a 64-bit float. */ declare function f64(value: any): f64; @@ -569,6 +585,10 @@ declare namespace f64 { export function store(ptr: usize, value: f64, immOffset?: usize, immAlign?: usize): void; /** Computes sum of two 64-bit floats */ export function add(left: f64, right: f64): f64; + /** Computes difference of two 64-bit floats */ + export function sub(left: f64, right: f64): f64; + /** Computes product of two 64-bit floats */ + export function mul(left: f64, right: f64): f64; } /** Initializes a 128-bit vector from sixteen 8-bit integer values. Arguments must be compile-time constants. */ declare function v128(a: i8, b: i8, c: i8, d: i8, e: i8, f: i8, g: i8, h: i8, i: i8, j: i8, k: i8, l: i8, m: i8, n: i8, o: i8, p: i8): v128; diff --git a/tests/compiler/builtins.optimized.wat b/tests/compiler/builtins.optimized.wat index 99893aa327..444b5f4927 100644 --- a/tests/compiler/builtins.optimized.wat +++ b/tests/compiler/builtins.optimized.wat @@ -205,6 +205,10 @@ global.set $builtins/i i32.const 3 global.set $builtins/i + i32.const -1 + global.set $builtins/i + i32.const 2 + global.set $builtins/i i64.const 63 global.set $builtins/I i64.const 0 @@ -223,6 +227,10 @@ global.set $builtins/I i64.const 3 global.set $builtins/I + i64.const -1 + global.set $builtins/I + i64.const 2 + global.set $builtins/I f32.const nan:0x400000 global.set $builtins/f f32.const inf @@ -237,6 +245,10 @@ global.set $builtins/f f32.const 3.75 global.set $builtins/f + f32.const 1 + global.set $builtins/f + f32.const 3.125 + global.set $builtins/f f32.const 2.5 global.set $builtins/f f32.const 1.25 @@ -261,6 +273,10 @@ global.set $builtins/F f64.const 3.75 global.set $builtins/F + f64.const 1 + global.set $builtins/F + f64.const 3.125 + global.set $builtins/F f64.const 2.5 global.set $builtins/F f64.const 1.25 @@ -279,6 +295,14 @@ global.set $builtins/F f32.const 1 global.set $builtins/f + f64.const 1 + global.set $builtins/F + f32.const 1 + global.set $builtins/f + f64.const 2 + global.set $builtins/F + f32.const 2 + global.set $builtins/f i32.const 8 i32.load global.set $builtins/i @@ -479,7 +503,7 @@ if i32.const 0 i32.const 1088 - i32.const 273 + i32.const 288 i32.const 1 call $~lib/builtins/abort unreachable @@ -494,7 +518,7 @@ if i32.const 0 i32.const 1088 - i32.const 274 + i32.const 289 i32.const 1 call $~lib/builtins/abort unreachable @@ -506,7 +530,7 @@ if i32.const 0 i32.const 1088 - i32.const 275 + i32.const 290 i32.const 1 call $~lib/builtins/abort unreachable @@ -518,7 +542,7 @@ if i32.const 0 i32.const 1088 - i32.const 278 + i32.const 293 i32.const 1 call $~lib/builtins/abort unreachable @@ -597,7 +621,7 @@ if i32.const 0 i32.const 1088 - i32.const 446 + i32.const 469 i32.const 1 call $~lib/builtins/abort unreachable @@ -609,7 +633,7 @@ if i32.const 0 i32.const 1088 - i32.const 447 + i32.const 470 i32.const 1 call $~lib/builtins/abort unreachable @@ -621,7 +645,7 @@ if i32.const 0 i32.const 1088 - i32.const 448 + i32.const 471 i32.const 1 call $~lib/builtins/abort unreachable @@ -631,7 +655,7 @@ if i32.const 0 i32.const 1088 - i32.const 449 + i32.const 472 i32.const 1 call $~lib/builtins/abort unreachable @@ -643,7 +667,7 @@ if i32.const 0 i32.const 1088 - i32.const 450 + i32.const 473 i32.const 1 call $~lib/builtins/abort unreachable @@ -653,7 +677,7 @@ if i32.const 0 i32.const 1088 - i32.const 451 + i32.const 474 i32.const 1 call $~lib/builtins/abort unreachable @@ -663,7 +687,7 @@ if i32.const 0 i32.const 1088 - i32.const 452 + i32.const 475 i32.const 1 call $~lib/builtins/abort unreachable @@ -683,7 +707,7 @@ if i32.const 0 i32.const 1088 - i32.const 469 + i32.const 492 i32.const 3 call $~lib/builtins/abort unreachable @@ -695,7 +719,7 @@ if i32.const 0 i32.const 1088 - i32.const 470 + i32.const 493 i32.const 3 call $~lib/builtins/abort unreachable @@ -707,7 +731,7 @@ if i32.const 0 i32.const 1088 - i32.const 471 + i32.const 494 i32.const 3 call $~lib/builtins/abort unreachable @@ -719,7 +743,7 @@ if i32.const 0 i32.const 1088 - i32.const 472 + i32.const 495 i32.const 3 call $~lib/builtins/abort unreachable @@ -731,7 +755,7 @@ if i32.const 0 i32.const 1088 - i32.const 473 + i32.const 496 i32.const 3 call $~lib/builtins/abort unreachable @@ -743,7 +767,7 @@ if i32.const 0 i32.const 1088 - i32.const 474 + i32.const 497 i32.const 3 call $~lib/builtins/abort unreachable @@ -755,7 +779,7 @@ if i32.const 0 i32.const 1088 - i32.const 475 + i32.const 498 i32.const 3 call $~lib/builtins/abort unreachable @@ -767,7 +791,7 @@ if i32.const 0 i32.const 1088 - i32.const 476 + i32.const 499 i32.const 3 call $~lib/builtins/abort unreachable @@ -779,7 +803,7 @@ if i32.const 0 i32.const 1088 - i32.const 477 + i32.const 500 i32.const 3 call $~lib/builtins/abort unreachable @@ -791,7 +815,7 @@ if i32.const 0 i32.const 1088 - i32.const 478 + i32.const 501 i32.const 3 call $~lib/builtins/abort unreachable @@ -803,7 +827,7 @@ if i32.const 0 i32.const 1088 - i32.const 479 + i32.const 502 i32.const 3 call $~lib/builtins/abort unreachable @@ -815,7 +839,7 @@ if i32.const 0 i32.const 1088 - i32.const 480 + i32.const 503 i32.const 3 call $~lib/builtins/abort unreachable @@ -827,7 +851,7 @@ if i32.const 0 i32.const 1088 - i32.const 481 + i32.const 504 i32.const 3 call $~lib/builtins/abort unreachable @@ -839,7 +863,7 @@ if i32.const 0 i32.const 1088 - i32.const 482 + i32.const 505 i32.const 3 call $~lib/builtins/abort unreachable @@ -851,7 +875,7 @@ if i32.const 0 i32.const 1088 - i32.const 483 + i32.const 506 i32.const 3 call $~lib/builtins/abort unreachable @@ -863,7 +887,7 @@ if i32.const 0 i32.const 1088 - i32.const 484 + i32.const 507 i32.const 3 call $~lib/builtins/abort unreachable @@ -875,7 +899,7 @@ if i32.const 0 i32.const 1088 - i32.const 485 + i32.const 508 i32.const 3 call $~lib/builtins/abort unreachable @@ -887,7 +911,7 @@ if i32.const 0 i32.const 1088 - i32.const 486 + i32.const 509 i32.const 3 call $~lib/builtins/abort unreachable @@ -899,7 +923,7 @@ if i32.const 0 i32.const 1088 - i32.const 487 + i32.const 510 i32.const 3 call $~lib/builtins/abort unreachable @@ -911,7 +935,7 @@ if i32.const 0 i32.const 1088 - i32.const 488 + i32.const 511 i32.const 3 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/builtins.ts b/tests/compiler/builtins.ts index 2140590238..9bf32526b3 100644 --- a/tests/compiler/builtins.ts +++ b/tests/compiler/builtins.ts @@ -59,6 +59,8 @@ abs(-42); max(1, 2); min(1, 2); add(1, 2); +sub(2, 1); +mul(1, 2); i = clz(1); i = ctz(1); @@ -69,7 +71,8 @@ i = abs(-42); assert(i == 42); i = max(1, 2); assert(i == 2); i = min(1, 2); assert(i == 1); i = add(1, 2); assert(i == 3); - +i = sub(2, 1); // assert(i == 1); +i = mul(2, 3); // assert(i == 6); var I: i64; clz(1); @@ -88,6 +91,8 @@ I = abs(-42); assert(I == 42); I = max(1, 2); assert(I == 2); I = min(1, 2); assert(I == 1); I = add(1, 2); assert(I == 3); +I = sub(2, 1); // assert(I == 1); +I = mul(2, 3); // assert(I == 6); // floats @@ -118,6 +123,8 @@ f = ceil(1.25); f = copysign(1.25, 2.5); f = floor(1.25); f = add(1.25, 2.5); +f = sub(2.5, 1.5); +f = mul(1.25, 2.5); f = max(1.25, 2.5); f = min(1.25, 2.5); f = nearest(1.25); @@ -137,6 +144,8 @@ ceil(1.25); copysign(1.25, 2.5); floor(1.25); add(1.25, 2.5); +sub(2.5, 1.5); +mul(1.25, 2.5); max(1.25, 2.5); min(1.25, 2.5); nearest(1.25); @@ -156,6 +165,8 @@ F = ceil(1.25); F = copysign(1.25, 2.5); F = floor(1.25); F = add(1.25, 2.5); +F = sub(2.5, 1.5); +F = mul(1.25, 2.5); F = max(1.25, 2.5); F = min(1.25, 2.5); F = nearest(1.25); @@ -170,6 +181,10 @@ F = min(0, 1.0); f = max(0, f); F = add(0, 1.0); f = add(0, f); +F = sub(2, 1.0); +f = sub(2, f); +F = mul(2, 1.0); +f = mul(2, f); // load and store @@ -391,6 +406,10 @@ i64.popcnt(1); i32.add(1, 2); i64.add(1, 2); +i32.sub(2, 1); +i64.sub(2, 1); +i32.mul(2, 1); +i64.mul(2, 1); i32.load8_s(8); i32.load8_u(8); @@ -409,6 +428,10 @@ f64.load(8); f32.add(1.0, 2.0); f64.add(1.0, 2.0); +f32.sub(2.0, 1.0); +f64.sub(2.0, 1.0); +f32.mul(1.0, 2.0); +f64.mul(1.0, 2.0); f32.max(1.0, 2.0); f64.max(1.0, 2.0); diff --git a/tests/compiler/builtins.untouched.wat b/tests/compiler/builtins.untouched.wat index aaa8d2a38c..b41855898b 100644 --- a/tests/compiler/builtins.untouched.wat +++ b/tests/compiler/builtins.untouched.wat @@ -492,6 +492,14 @@ local.get $1 i32.add drop + local.get $0 + local.get $1 + i32.sub + drop + local.get $0 + local.get $1 + i32.mul + drop i32.const 1 i32.clz global.set $builtins/i @@ -526,7 +534,7 @@ if i32.const 0 i32.const 80 - i32.const 68 + i32.const 70 i32.const 20 call $~lib/builtins/abort unreachable @@ -547,7 +555,7 @@ if i32.const 0 i32.const 80 - i32.const 69 + i32.const 71 i32.const 21 call $~lib/builtins/abort unreachable @@ -568,7 +576,7 @@ if i32.const 0 i32.const 80 - i32.const 70 + i32.const 72 i32.const 21 call $~lib/builtins/abort unreachable @@ -584,11 +592,19 @@ if i32.const 0 i32.const 80 - i32.const 71 + i32.const 73 i32.const 21 call $~lib/builtins/abort unreachable end + local.get $0 + local.get $1 + i32.sub + global.set $builtins/i + local.get $0 + local.get $1 + i32.mul + global.set $builtins/i i64.const 1 i64.clz drop @@ -650,7 +666,7 @@ if i32.const 0 i32.const 80 - i32.const 87 + i32.const 90 i32.const 20 call $~lib/builtins/abort unreachable @@ -671,7 +687,7 @@ if i32.const 0 i32.const 80 - i32.const 88 + i32.const 91 i32.const 21 call $~lib/builtins/abort unreachable @@ -692,7 +708,7 @@ if i32.const 0 i32.const 80 - i32.const 89 + i32.const 92 i32.const 21 call $~lib/builtins/abort unreachable @@ -708,11 +724,19 @@ if i32.const 0 i32.const 80 - i32.const 90 + i32.const 93 i32.const 21 call $~lib/builtins/abort unreachable end + local.get $2 + local.get $3 + i64.sub + global.set $builtins/I + local.get $2 + local.get $3 + i64.mul + global.set $builtins/I f32.const nan:0x400000 drop f32.const inf @@ -819,6 +843,14 @@ f32.const 2.5 f32.add global.set $builtins/f + f32.const 2.5 + f32.const 1.5 + f32.sub + global.set $builtins/f + f32.const 1.25 + f32.const 2.5 + f32.mul + global.set $builtins/f f32.const 1.25 f32.const 2.5 f32.max @@ -873,6 +905,14 @@ f64.const 2.5 f64.add drop + f64.const 2.5 + f64.const 1.5 + f64.sub + drop + f64.const 1.25 + f64.const 2.5 + f64.mul + drop f64.const 1.25 f64.const 2.5 f64.max @@ -962,6 +1002,14 @@ f64.const 2.5 f64.add global.set $builtins/F + f64.const 2.5 + f64.const 1.5 + f64.sub + global.set $builtins/F + f64.const 1.25 + f64.const 2.5 + f64.mul + global.set $builtins/F f64.const 1.25 f64.const 2.5 f64.max @@ -1007,6 +1055,22 @@ global.get $builtins/f f32.add global.set $builtins/f + f64.const 2 + f64.const 1 + f64.sub + global.set $builtins/F + f32.const 2 + global.get $builtins/f + f32.sub + global.set $builtins/f + f64.const 2 + f64.const 1 + f64.mul + global.set $builtins/F + f32.const 2 + global.get $builtins/f + f32.mul + global.set $builtins/f i32.const 8 i32.load global.set $builtins/i @@ -1264,7 +1328,7 @@ if i32.const 0 i32.const 80 - i32.const 273 + i32.const 288 i32.const 1 call $~lib/builtins/abort unreachable @@ -1280,7 +1344,7 @@ if i32.const 0 i32.const 80 - i32.const 274 + i32.const 289 i32.const 1 call $~lib/builtins/abort unreachable @@ -1294,7 +1358,7 @@ if i32.const 0 i32.const 80 - i32.const 275 + i32.const 290 i32.const 1 call $~lib/builtins/abort unreachable @@ -1307,7 +1371,7 @@ if i32.const 0 i32.const 80 - i32.const 276 + i32.const 291 i32.const 1 call $~lib/builtins/abort unreachable @@ -1320,7 +1384,7 @@ if i32.const 0 i32.const 80 - i32.const 277 + i32.const 292 i32.const 1 call $~lib/builtins/abort unreachable @@ -1334,7 +1398,7 @@ if i32.const 0 i32.const 80 - i32.const 278 + i32.const 293 i32.const 1 call $~lib/builtins/abort unreachable @@ -1685,6 +1749,22 @@ local.get $3 i64.add drop + local.get $6 + local.get $7 + i32.sub + drop + local.get $2 + local.get $3 + i64.sub + drop + local.get $6 + local.get $7 + i32.mul + drop + local.get $2 + local.get $3 + i64.mul + drop i32.const 8 i32.load8_s drop @@ -1735,6 +1815,22 @@ f64.const 2 f64.add drop + f32.const 2 + f32.const 1 + f32.sub + drop + f64.const 2 + f64.const 1 + f64.sub + drop + f32.const 1 + f32.const 2 + f32.mul + drop + f64.const 1 + f64.const 2 + f64.mul + drop f32.const 1 f32.const 2 f32.max @@ -1826,7 +1922,7 @@ if i32.const 0 i32.const 80 - i32.const 446 + i32.const 469 i32.const 1 call $~lib/builtins/abort unreachable @@ -1839,7 +1935,7 @@ if i32.const 0 i32.const 80 - i32.const 447 + i32.const 470 i32.const 1 call $~lib/builtins/abort unreachable @@ -1852,7 +1948,7 @@ if i32.const 0 i32.const 80 - i32.const 448 + i32.const 471 i32.const 1 call $~lib/builtins/abort unreachable @@ -1865,7 +1961,7 @@ if i32.const 0 i32.const 80 - i32.const 449 + i32.const 472 i32.const 1 call $~lib/builtins/abort unreachable @@ -1878,7 +1974,7 @@ if i32.const 0 i32.const 80 - i32.const 450 + i32.const 473 i32.const 1 call $~lib/builtins/abort unreachable @@ -1891,7 +1987,7 @@ if i32.const 0 i32.const 80 - i32.const 451 + i32.const 474 i32.const 1 call $~lib/builtins/abort unreachable @@ -1904,7 +2000,7 @@ if i32.const 0 i32.const 80 - i32.const 452 + i32.const 475 i32.const 1 call $~lib/builtins/abort unreachable @@ -1939,7 +2035,7 @@ if i32.const 288 i32.const 80 - i32.const 462 + i32.const 485 i32.const 3 call $~lib/builtins/abort unreachable @@ -1951,7 +2047,7 @@ if i32.const 0 i32.const 80 - i32.const 463 + i32.const 486 i32.const 3 call $~lib/builtins/abort unreachable @@ -1963,7 +2059,7 @@ if i32.const 0 i32.const 80 - i32.const 464 + i32.const 487 i32.const 3 call $~lib/builtins/abort unreachable @@ -1975,7 +2071,7 @@ if i32.const 0 i32.const 80 - i32.const 465 + i32.const 488 i32.const 3 call $~lib/builtins/abort unreachable @@ -1987,7 +2083,7 @@ if i32.const 0 i32.const 80 - i32.const 469 + i32.const 492 i32.const 3 call $~lib/builtins/abort unreachable @@ -1999,7 +2095,7 @@ if i32.const 0 i32.const 80 - i32.const 470 + i32.const 493 i32.const 3 call $~lib/builtins/abort unreachable @@ -2011,7 +2107,7 @@ if i32.const 0 i32.const 80 - i32.const 471 + i32.const 494 i32.const 3 call $~lib/builtins/abort unreachable @@ -2023,7 +2119,7 @@ if i32.const 0 i32.const 80 - i32.const 472 + i32.const 495 i32.const 3 call $~lib/builtins/abort unreachable @@ -2035,7 +2131,7 @@ if i32.const 0 i32.const 80 - i32.const 473 + i32.const 496 i32.const 3 call $~lib/builtins/abort unreachable @@ -2047,7 +2143,7 @@ if i32.const 0 i32.const 80 - i32.const 474 + i32.const 497 i32.const 3 call $~lib/builtins/abort unreachable @@ -2059,7 +2155,7 @@ if i32.const 0 i32.const 80 - i32.const 475 + i32.const 498 i32.const 3 call $~lib/builtins/abort unreachable @@ -2071,7 +2167,7 @@ if i32.const 0 i32.const 80 - i32.const 476 + i32.const 499 i32.const 3 call $~lib/builtins/abort unreachable @@ -2083,7 +2179,7 @@ if i32.const 0 i32.const 80 - i32.const 477 + i32.const 500 i32.const 3 call $~lib/builtins/abort unreachable @@ -2095,7 +2191,7 @@ if i32.const 0 i32.const 80 - i32.const 478 + i32.const 501 i32.const 3 call $~lib/builtins/abort unreachable @@ -2107,7 +2203,7 @@ if i32.const 0 i32.const 80 - i32.const 479 + i32.const 502 i32.const 3 call $~lib/builtins/abort unreachable @@ -2119,7 +2215,7 @@ if i32.const 0 i32.const 80 - i32.const 480 + i32.const 503 i32.const 3 call $~lib/builtins/abort unreachable @@ -2131,7 +2227,7 @@ if i32.const 0 i32.const 80 - i32.const 481 + i32.const 504 i32.const 3 call $~lib/builtins/abort unreachable @@ -2143,7 +2239,7 @@ if i32.const 0 i32.const 80 - i32.const 482 + i32.const 505 i32.const 3 call $~lib/builtins/abort unreachable @@ -2155,7 +2251,7 @@ if i32.const 0 i32.const 80 - i32.const 483 + i32.const 506 i32.const 3 call $~lib/builtins/abort unreachable @@ -2167,7 +2263,7 @@ if i32.const 0 i32.const 80 - i32.const 484 + i32.const 507 i32.const 3 call $~lib/builtins/abort unreachable @@ -2179,7 +2275,7 @@ if i32.const 0 i32.const 80 - i32.const 485 + i32.const 508 i32.const 3 call $~lib/builtins/abort unreachable @@ -2191,7 +2287,7 @@ if i32.const 0 i32.const 80 - i32.const 486 + i32.const 509 i32.const 3 call $~lib/builtins/abort unreachable @@ -2203,7 +2299,7 @@ if i32.const 0 i32.const 80 - i32.const 487 + i32.const 510 i32.const 3 call $~lib/builtins/abort unreachable @@ -2215,7 +2311,7 @@ if i32.const 0 i32.const 80 - i32.const 488 + i32.const 511 i32.const 3 call $~lib/builtins/abort unreachable From 3856e7325bcc6f3b7a06624a78c320a1a4b0e0c7 Mon Sep 17 00:00:00 2001 From: ValeriaVG Date: Sat, 3 Oct 2020 19:47:37 +0200 Subject: [PATCH 08/17] Fix add, mul & sub --- src/builtins.ts | 81 ++++------ tests/compiler/builtins.optimized.wat | 18 +-- tests/compiler/builtins.ts | 30 ++-- tests/compiler/builtins.untouched.wat | 212 +++++++++++++++++++++----- 4 files changed, 229 insertions(+), 112 deletions(-) diff --git a/src/builtins.ts b/src/builtins.ts index 95df49d7ab..45955e16d6 100644 --- a/src/builtins.ts +++ b/src/builtins.ts @@ -2137,26 +2137,21 @@ function builtin_add(ctx: BuiltinContext): ExpressionRef { op = compiler.options.isWasm64 ? BinaryOp.AddI64 : BinaryOp.AddI32; break; } - case TypeKind.F32: - return module.binary(BinaryOp.AddF32, arg0, arg1); - case TypeKind.F64: - return module.binary(BinaryOp.AddF64, arg0, arg1); + case TypeKind.F32: { + op = BinaryOp.AddF32; + break; + } + case TypeKind.F64: { + op = BinaryOp.AddF64; + break; + } } if (op != -1) { - let flow = compiler.currentFlow; - let nativeType = type.toNativeType(); - let temp1 = flow.getTempLocal(type); - flow.setLocalFlag(temp1.index, LocalFlags.WRAPPED); - let temp2 = flow.getTempLocal(type); - flow.setLocalFlag(temp2.index, LocalFlags.WRAPPED); - let ret = module.binary( + return module.binary( op, - module.local_get(temp1.index, nativeType), - module.local_get(temp2.index, nativeType) + arg0, + arg1 ); - flow.freeTempLocal(temp2); - flow.freeTempLocal(temp1); - return ret; } } compiler.error( @@ -2234,26 +2229,21 @@ function builtin_sub(ctx: BuiltinContext): ExpressionRef { op = compiler.options.isWasm64 ? BinaryOp.SubI64 : BinaryOp.SubI32; break; } - case TypeKind.F32: - return module.binary(BinaryOp.SubF32, arg0, arg1); - case TypeKind.F64: - return module.binary(BinaryOp.SubF64, arg0, arg1); + case TypeKind.F32: { + op = BinaryOp.SubF32; + break; + } + case TypeKind.F64: { + op = BinaryOp.SubF64; + break; + } } if (op != -1) { - let flow = compiler.currentFlow; - let nativeType = type.toNativeType(); - let temp1 = flow.getTempLocal(type); - flow.setLocalFlag(temp1.index, LocalFlags.WRAPPED); - let temp2 = flow.getTempLocal(type); - flow.setLocalFlag(temp2.index, LocalFlags.WRAPPED); - let ret = module.binary( + return module.binary( op, - module.local_get(temp1.index, nativeType), - module.local_get(temp2.index, nativeType) + arg0, + arg1 ); - flow.freeTempLocal(temp2); - flow.freeTempLocal(temp1); - return ret; } } compiler.error( @@ -2331,26 +2321,21 @@ function builtin_mul(ctx: BuiltinContext): ExpressionRef { op = compiler.options.isWasm64 ? BinaryOp.MulI64 : BinaryOp.MulI32; break; } - case TypeKind.F32: - return module.binary(BinaryOp.MulF32, arg0, arg1); - case TypeKind.F64: - return module.binary(BinaryOp.MulF64, arg0, arg1); + case TypeKind.F32: { + op = BinaryOp.MulF32; + break; + } + case TypeKind.F64: { + op = BinaryOp.MulF64; + break; + } } if (op != -1) { - let flow = compiler.currentFlow; - let nativeType = type.toNativeType(); - let temp1 = flow.getTempLocal(type); - flow.setLocalFlag(temp1.index, LocalFlags.WRAPPED); - let temp2 = flow.getTempLocal(type); - flow.setLocalFlag(temp2.index, LocalFlags.WRAPPED); - let ret = module.binary( + return module.binary( op, - module.local_get(temp1.index, nativeType), - module.local_get(temp2.index, nativeType) + arg0, + arg1 ); - flow.freeTempLocal(temp2); - flow.freeTempLocal(temp1); - return ret; } } compiler.error( diff --git a/tests/compiler/builtins.optimized.wat b/tests/compiler/builtins.optimized.wat index 444b5f4927..c1462081bd 100644 --- a/tests/compiler/builtins.optimized.wat +++ b/tests/compiler/builtins.optimized.wat @@ -205,9 +205,9 @@ global.set $builtins/i i32.const 3 global.set $builtins/i - i32.const -1 + i32.const 1 global.set $builtins/i - i32.const 2 + i32.const 6 global.set $builtins/i i64.const 63 global.set $builtins/I @@ -227,9 +227,9 @@ global.set $builtins/I i64.const 3 global.set $builtins/I - i64.const -1 + i64.const 1 global.set $builtins/I - i64.const 2 + i64.const 6 global.set $builtins/I f32.const nan:0x400000 global.set $builtins/f @@ -243,11 +243,11 @@ global.set $builtins/f f32.const 1 global.set $builtins/f - f32.const 3.75 + f32.const 4 global.set $builtins/f f32.const 1 global.set $builtins/f - f32.const 3.125 + f32.const 3 global.set $builtins/f f32.const 2.5 global.set $builtins/f @@ -271,11 +271,11 @@ global.set $builtins/F f64.const 1 global.set $builtins/F - f64.const 3.75 + f64.const 4 global.set $builtins/F f64.const 1 global.set $builtins/F - f64.const 3.125 + f64.const 3 global.set $builtins/F f64.const 2.5 global.set $builtins/F @@ -291,7 +291,7 @@ global.set $builtins/F f32.const 1 global.set $builtins/f - f64.const 1 + f64.const 1.5 global.set $builtins/F f32.const 1 global.set $builtins/f diff --git a/tests/compiler/builtins.ts b/tests/compiler/builtins.ts index 9bf32526b3..db4f9a688b 100644 --- a/tests/compiler/builtins.ts +++ b/tests/compiler/builtins.ts @@ -71,8 +71,8 @@ i = abs(-42); assert(i == 42); i = max(1, 2); assert(i == 2); i = min(1, 2); assert(i == 1); i = add(1, 2); assert(i == 3); -i = sub(2, 1); // assert(i == 1); -i = mul(2, 3); // assert(i == 6); +i = sub(2, 1); assert(i == 1); +i = mul(2, 3); assert(i == 6); var I: i64; clz(1); @@ -91,8 +91,8 @@ I = abs(-42); assert(I == 42); I = max(1, 2); assert(I == 2); I = min(1, 2); assert(I == 1); I = add(1, 2); assert(I == 3); -I = sub(2, 1); // assert(I == 1); -I = mul(2, 3); // assert(I == 6); +I = sub(2, 1); assert(I == 1); +I = mul(2, 3); assert(I == 6); // floats @@ -122,10 +122,10 @@ f = abs(1.25); f = ceil(1.25); f = copysign(1.25, 2.5); f = floor(1.25); -f = add(1.25, 2.5); -f = sub(2.5, 1.5); -f = mul(1.25, 2.5); -f = max(1.25, 2.5); +f = add(1.5, 2.5); assert(f == 4.0); +f = sub(2.5, 1.5); assert(f == 1.0); +f = mul(1.5, 2.0); assert(f == 3.0); +f = max(1.25, 2.5); assert(f == 2.5); f = min(1.25, 2.5); f = nearest(1.25); f = sqrt(1.25); @@ -143,9 +143,9 @@ abs(1.25); ceil(1.25); copysign(1.25, 2.5); floor(1.25); -add(1.25, 2.5); -sub(2.5, 1.5); -mul(1.25, 2.5); +add(1.5, 2.5); +sub(2.5, 1.5); +mul(1.5, 2.0); max(1.25, 2.5); min(1.25, 2.5); nearest(1.25); @@ -164,9 +164,9 @@ F = abs(1.25); F = ceil(1.25); F = copysign(1.25, 2.5); F = floor(1.25); -F = add(1.25, 2.5); -F = sub(2.5, 1.5); -F = mul(1.25, 2.5); +F = add(1.5, 2.5); assert(F == 4.0); +F = sub(2.5, 1.5); assert(F == 1.0); +F = mul(1.5, 2.0); assert(F == 3.0); F = max(1.25, 2.5); F = min(1.25, 2.5); F = nearest(1.25); @@ -179,7 +179,7 @@ b = isFinite(1.25); F = min(0, 1.0); f = max(0, f); -F = add(0, 1.0); +F = add(0, 1.5); f = add(0, f); F = sub(2, 1.0); f = sub(2, f); diff --git a/tests/compiler/builtins.untouched.wat b/tests/compiler/builtins.untouched.wat index b41855898b..a163f1aab9 100644 --- a/tests/compiler/builtins.untouched.wat +++ b/tests/compiler/builtins.untouched.wat @@ -488,16 +488,16 @@ i32.lt_s select drop - local.get $0 - local.get $1 + i32.const 1 + i32.const 2 i32.add drop - local.get $0 - local.get $1 + i32.const 2 + i32.const 1 i32.sub drop - local.get $0 - local.get $1 + i32.const 1 + i32.const 2 i32.mul drop i32.const 1 @@ -581,8 +581,8 @@ call $~lib/builtins/abort unreachable end - local.get $0 - local.get $1 + i32.const 1 + i32.const 2 i32.add global.set $builtins/i global.get $builtins/i @@ -597,14 +597,38 @@ call $~lib/builtins/abort unreachable end - local.get $0 - local.get $1 + i32.const 2 + i32.const 1 i32.sub global.set $builtins/i - local.get $0 - local.get $1 + global.get $builtins/i + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 80 + i32.const 74 + i32.const 21 + call $~lib/builtins/abort + unreachable + end + i32.const 2 + i32.const 3 i32.mul global.set $builtins/i + global.get $builtins/i + i32.const 6 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 80 + i32.const 75 + i32.const 21 + call $~lib/builtins/abort + unreachable + end i64.const 1 i64.clz drop @@ -713,8 +737,8 @@ call $~lib/builtins/abort unreachable end - local.get $2 - local.get $3 + i64.const 1 + i64.const 2 i64.add global.set $builtins/I global.get $builtins/I @@ -729,14 +753,38 @@ call $~lib/builtins/abort unreachable end - local.get $2 - local.get $3 + i64.const 2 + i64.const 1 i64.sub global.set $builtins/I - local.get $2 - local.get $3 + global.get $builtins/I + i64.const 1 + i64.eq + i32.eqz + if + i32.const 0 + i32.const 80 + i32.const 94 + i32.const 21 + call $~lib/builtins/abort + unreachable + end + i64.const 2 + i64.const 3 i64.mul global.set $builtins/I + global.get $builtins/I + i64.const 6 + i64.eq + i32.eqz + if + i32.const 0 + i32.const 80 + i32.const 95 + i32.const 21 + call $~lib/builtins/abort + unreachable + end f32.const nan:0x400000 drop f32.const inf @@ -839,22 +887,70 @@ f32.const 1.25 f32.floor global.set $builtins/f - f32.const 1.25 + f32.const 1.5 f32.const 2.5 f32.add global.set $builtins/f + global.get $builtins/f + f32.const 4 + f32.eq + i32.eqz + if + i32.const 0 + i32.const 80 + i32.const 125 + i32.const 25 + call $~lib/builtins/abort + unreachable + end f32.const 2.5 f32.const 1.5 f32.sub global.set $builtins/f - f32.const 1.25 - f32.const 2.5 + global.get $builtins/f + f32.const 1 + f32.eq + i32.eqz + if + i32.const 0 + i32.const 80 + i32.const 126 + i32.const 25 + call $~lib/builtins/abort + unreachable + end + f32.const 1.5 + f32.const 2 f32.mul global.set $builtins/f + global.get $builtins/f + f32.const 3 + f32.eq + i32.eqz + if + i32.const 0 + i32.const 80 + i32.const 127 + i32.const 25 + call $~lib/builtins/abort + unreachable + end f32.const 1.25 f32.const 2.5 f32.max global.set $builtins/f + global.get $builtins/f + f32.const 2.5 + f32.eq + i32.eqz + if + i32.const 0 + i32.const 80 + i32.const 128 + i32.const 26 + call $~lib/builtins/abort + unreachable + end f32.const 1.25 f32.const 2.5 f32.min @@ -901,7 +997,7 @@ f64.const 1.25 f64.floor drop - f64.const 1.25 + f64.const 1.5 f64.const 2.5 f64.add drop @@ -909,8 +1005,8 @@ f64.const 1.5 f64.sub drop - f64.const 1.25 - f64.const 2.5 + f64.const 1.5 + f64.const 2 f64.mul drop f64.const 1.25 @@ -998,18 +1094,54 @@ f64.const 1.25 f64.floor global.set $builtins/F - f64.const 1.25 + f64.const 1.5 f64.const 2.5 f64.add global.set $builtins/F + global.get $builtins/F + f64.const 4 + f64.eq + i32.eqz + if + i32.const 0 + i32.const 80 + i32.const 167 + i32.const 25 + call $~lib/builtins/abort + unreachable + end f64.const 2.5 f64.const 1.5 f64.sub global.set $builtins/F - f64.const 1.25 - f64.const 2.5 + global.get $builtins/F + f64.const 1 + f64.eq + i32.eqz + if + i32.const 0 + i32.const 80 + i32.const 168 + i32.const 25 + call $~lib/builtins/abort + unreachable + end + f64.const 1.5 + f64.const 2 f64.mul global.set $builtins/F + global.get $builtins/F + f64.const 3 + f64.eq + i32.eqz + if + i32.const 0 + i32.const 80 + i32.const 169 + i32.const 25 + call $~lib/builtins/abort + unreachable + end f64.const 1.25 f64.const 2.5 f64.max @@ -1048,7 +1180,7 @@ f32.max global.set $builtins/f f64.const 0 - f64.const 1 + f64.const 1.5 f64.add global.set $builtins/F f32.const 0 @@ -1741,28 +1873,28 @@ i64.const 1 i64.popcnt drop - local.get $6 - local.get $7 + i32.const 1 + i32.const 2 i32.add drop - local.get $2 - local.get $3 + i64.const 1 + i64.const 2 i64.add drop - local.get $6 - local.get $7 + i32.const 2 + i32.const 1 i32.sub drop - local.get $2 - local.get $3 + i64.const 2 + i64.const 1 i64.sub drop - local.get $6 - local.get $7 + i32.const 2 + i32.const 1 i32.mul drop - local.get $2 - local.get $3 + i64.const 2 + i64.const 1 i64.mul drop i32.const 8 From 0c5fbac587a7b42a4230c8c3ebf1e5558d403916 Mon Sep 17 00:00:00 2001 From: ValeriaVG Date: Sat, 3 Oct 2020 19:55:03 +0200 Subject: [PATCH 09/17] Ensure small integers in i8 etc --- src/builtins.ts | 18 ++- tests/compiler/builtins.optimized.wat | 62 +++++----- tests/compiler/builtins.ts | 6 + tests/compiler/builtins.untouched.wat | 169 +++++++++++++++++--------- 4 files changed, 162 insertions(+), 93 deletions(-) diff --git a/src/builtins.ts b/src/builtins.ts index 45955e16d6..ab3912e979 100644 --- a/src/builtins.ts +++ b/src/builtins.ts @@ -2121,8 +2121,10 @@ function builtin_add(ctx: BuiltinContext): ExpressionRef { case TypeKind.U16: case TypeKind.U32: case TypeKind.BOOL: { - op = BinaryOp.AddI32; - break; + return compiler.ensureSmallIntegerWrap( + module.binary(BinaryOp.AddI32, arg0, arg1), + type + ); } case TypeKind.I64: case TypeKind.U64: { @@ -2213,8 +2215,10 @@ function builtin_sub(ctx: BuiltinContext): ExpressionRef { case TypeKind.U16: case TypeKind.U32: case TypeKind.BOOL: { - op = BinaryOp.SubI32; - break; + return compiler.ensureSmallIntegerWrap( + module.binary(BinaryOp.SubI32, arg0, arg1), + type + ); } case TypeKind.I64: case TypeKind.U64: { @@ -2305,8 +2309,10 @@ function builtin_mul(ctx: BuiltinContext): ExpressionRef { case TypeKind.U16: case TypeKind.U32: case TypeKind.BOOL: { - op = BinaryOp.MulI32; - break; + return compiler.ensureSmallIntegerWrap( + module.binary(BinaryOp.MulI32, arg0, arg1), + type + ); } case TypeKind.I64: case TypeKind.U64: { diff --git a/tests/compiler/builtins.optimized.wat b/tests/compiler/builtins.optimized.wat index c1462081bd..e522385f05 100644 --- a/tests/compiler/builtins.optimized.wat +++ b/tests/compiler/builtins.optimized.wat @@ -503,7 +503,7 @@ if i32.const 0 i32.const 1088 - i32.const 288 + i32.const 294 i32.const 1 call $~lib/builtins/abort unreachable @@ -518,7 +518,7 @@ if i32.const 0 i32.const 1088 - i32.const 289 + i32.const 295 i32.const 1 call $~lib/builtins/abort unreachable @@ -530,7 +530,7 @@ if i32.const 0 i32.const 1088 - i32.const 290 + i32.const 296 i32.const 1 call $~lib/builtins/abort unreachable @@ -542,7 +542,7 @@ if i32.const 0 i32.const 1088 - i32.const 293 + i32.const 299 i32.const 1 call $~lib/builtins/abort unreachable @@ -621,7 +621,7 @@ if i32.const 0 i32.const 1088 - i32.const 469 + i32.const 475 i32.const 1 call $~lib/builtins/abort unreachable @@ -633,7 +633,7 @@ if i32.const 0 i32.const 1088 - i32.const 470 + i32.const 476 i32.const 1 call $~lib/builtins/abort unreachable @@ -645,7 +645,7 @@ if i32.const 0 i32.const 1088 - i32.const 471 + i32.const 477 i32.const 1 call $~lib/builtins/abort unreachable @@ -655,7 +655,7 @@ if i32.const 0 i32.const 1088 - i32.const 472 + i32.const 478 i32.const 1 call $~lib/builtins/abort unreachable @@ -667,7 +667,7 @@ if i32.const 0 i32.const 1088 - i32.const 473 + i32.const 479 i32.const 1 call $~lib/builtins/abort unreachable @@ -677,7 +677,7 @@ if i32.const 0 i32.const 1088 - i32.const 474 + i32.const 480 i32.const 1 call $~lib/builtins/abort unreachable @@ -687,7 +687,7 @@ if i32.const 0 i32.const 1088 - i32.const 475 + i32.const 481 i32.const 1 call $~lib/builtins/abort unreachable @@ -707,7 +707,7 @@ if i32.const 0 i32.const 1088 - i32.const 492 + i32.const 498 i32.const 3 call $~lib/builtins/abort unreachable @@ -719,7 +719,7 @@ if i32.const 0 i32.const 1088 - i32.const 493 + i32.const 499 i32.const 3 call $~lib/builtins/abort unreachable @@ -731,7 +731,7 @@ if i32.const 0 i32.const 1088 - i32.const 494 + i32.const 500 i32.const 3 call $~lib/builtins/abort unreachable @@ -743,7 +743,7 @@ if i32.const 0 i32.const 1088 - i32.const 495 + i32.const 501 i32.const 3 call $~lib/builtins/abort unreachable @@ -755,7 +755,7 @@ if i32.const 0 i32.const 1088 - i32.const 496 + i32.const 502 i32.const 3 call $~lib/builtins/abort unreachable @@ -767,7 +767,7 @@ if i32.const 0 i32.const 1088 - i32.const 497 + i32.const 503 i32.const 3 call $~lib/builtins/abort unreachable @@ -779,7 +779,7 @@ if i32.const 0 i32.const 1088 - i32.const 498 + i32.const 504 i32.const 3 call $~lib/builtins/abort unreachable @@ -791,7 +791,7 @@ if i32.const 0 i32.const 1088 - i32.const 499 + i32.const 505 i32.const 3 call $~lib/builtins/abort unreachable @@ -803,7 +803,7 @@ if i32.const 0 i32.const 1088 - i32.const 500 + i32.const 506 i32.const 3 call $~lib/builtins/abort unreachable @@ -815,7 +815,7 @@ if i32.const 0 i32.const 1088 - i32.const 501 + i32.const 507 i32.const 3 call $~lib/builtins/abort unreachable @@ -827,7 +827,7 @@ if i32.const 0 i32.const 1088 - i32.const 502 + i32.const 508 i32.const 3 call $~lib/builtins/abort unreachable @@ -839,7 +839,7 @@ if i32.const 0 i32.const 1088 - i32.const 503 + i32.const 509 i32.const 3 call $~lib/builtins/abort unreachable @@ -851,7 +851,7 @@ if i32.const 0 i32.const 1088 - i32.const 504 + i32.const 510 i32.const 3 call $~lib/builtins/abort unreachable @@ -863,7 +863,7 @@ if i32.const 0 i32.const 1088 - i32.const 505 + i32.const 511 i32.const 3 call $~lib/builtins/abort unreachable @@ -875,7 +875,7 @@ if i32.const 0 i32.const 1088 - i32.const 506 + i32.const 512 i32.const 3 call $~lib/builtins/abort unreachable @@ -887,7 +887,7 @@ if i32.const 0 i32.const 1088 - i32.const 507 + i32.const 513 i32.const 3 call $~lib/builtins/abort unreachable @@ -899,7 +899,7 @@ if i32.const 0 i32.const 1088 - i32.const 508 + i32.const 514 i32.const 3 call $~lib/builtins/abort unreachable @@ -911,7 +911,7 @@ if i32.const 0 i32.const 1088 - i32.const 509 + i32.const 515 i32.const 3 call $~lib/builtins/abort unreachable @@ -923,7 +923,7 @@ if i32.const 0 i32.const 1088 - i32.const 510 + i32.const 516 i32.const 3 call $~lib/builtins/abort unreachable @@ -935,7 +935,7 @@ if i32.const 0 i32.const 1088 - i32.const 511 + i32.const 517 i32.const 3 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/builtins.ts b/tests/compiler/builtins.ts index db4f9a688b..10586da2c0 100644 --- a/tests/compiler/builtins.ts +++ b/tests/compiler/builtins.ts @@ -46,6 +46,12 @@ assert(!isDefined(c)); assert(isConstant(1)); assert(!isConstant(b)); +// small integers +var l: i8; +l = add(1, 2); assert(l == 3); +l = sub(2, 1); assert(l == 1) +l = mul(1, 2); assert(l == 2) + // integers var i: i32; diff --git a/tests/compiler/builtins.untouched.wat b/tests/compiler/builtins.untouched.wat index a163f1aab9..481b988d19 100644 --- a/tests/compiler/builtins.untouched.wat +++ b/tests/compiler/builtins.untouched.wat @@ -39,6 +39,7 @@ (table $0 4 funcref) (elem (i32.const 1) $start:builtins~anonymous|0 $start:builtins~anonymous|1 $start:builtins~anonymous|2) (global $builtins/b (mut i32) (i32.const 0)) + (global $builtins/l (mut i32) (i32.const 0)) (global $builtins/i (mut i32) (i32.const 0)) (global $builtins/I (mut i64) (i64.const 0)) (global $builtins/f (mut f32) (f32.const 0)) @@ -444,6 +445,62 @@ i32.eqz drop i32.const 1 + i32.const 2 + i32.add + i32.const 24 + i32.shl + i32.const 24 + i32.shr_s + global.set $builtins/l + global.get $builtins/l + i32.const 3 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 80 + i32.const 51 + i32.const 20 + call $~lib/builtins/abort + unreachable + end + i32.const 2 + i32.const 1 + i32.sub + i32.const 24 + i32.shl + i32.const 24 + i32.shr_s + global.set $builtins/l + global.get $builtins/l + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 80 + i32.const 52 + i32.const 20 + call $~lib/builtins/abort + unreachable + end + i32.const 1 + i32.const 2 + i32.mul + global.set $builtins/l + global.get $builtins/l + i32.const 2 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 80 + i32.const 53 + i32.const 20 + call $~lib/builtins/abort + unreachable + end + i32.const 1 i32.clz drop i32.const 1 @@ -534,7 +591,7 @@ if i32.const 0 i32.const 80 - i32.const 70 + i32.const 76 i32.const 20 call $~lib/builtins/abort unreachable @@ -555,7 +612,7 @@ if i32.const 0 i32.const 80 - i32.const 71 + i32.const 77 i32.const 21 call $~lib/builtins/abort unreachable @@ -576,7 +633,7 @@ if i32.const 0 i32.const 80 - i32.const 72 + i32.const 78 i32.const 21 call $~lib/builtins/abort unreachable @@ -592,7 +649,7 @@ if i32.const 0 i32.const 80 - i32.const 73 + i32.const 79 i32.const 21 call $~lib/builtins/abort unreachable @@ -608,7 +665,7 @@ if i32.const 0 i32.const 80 - i32.const 74 + i32.const 80 i32.const 21 call $~lib/builtins/abort unreachable @@ -624,7 +681,7 @@ if i32.const 0 i32.const 80 - i32.const 75 + i32.const 81 i32.const 21 call $~lib/builtins/abort unreachable @@ -690,7 +747,7 @@ if i32.const 0 i32.const 80 - i32.const 90 + i32.const 96 i32.const 20 call $~lib/builtins/abort unreachable @@ -711,7 +768,7 @@ if i32.const 0 i32.const 80 - i32.const 91 + i32.const 97 i32.const 21 call $~lib/builtins/abort unreachable @@ -732,7 +789,7 @@ if i32.const 0 i32.const 80 - i32.const 92 + i32.const 98 i32.const 21 call $~lib/builtins/abort unreachable @@ -748,7 +805,7 @@ if i32.const 0 i32.const 80 - i32.const 93 + i32.const 99 i32.const 21 call $~lib/builtins/abort unreachable @@ -764,7 +821,7 @@ if i32.const 0 i32.const 80 - i32.const 94 + i32.const 100 i32.const 21 call $~lib/builtins/abort unreachable @@ -780,7 +837,7 @@ if i32.const 0 i32.const 80 - i32.const 95 + i32.const 101 i32.const 21 call $~lib/builtins/abort unreachable @@ -898,7 +955,7 @@ if i32.const 0 i32.const 80 - i32.const 125 + i32.const 131 i32.const 25 call $~lib/builtins/abort unreachable @@ -914,7 +971,7 @@ if i32.const 0 i32.const 80 - i32.const 126 + i32.const 132 i32.const 25 call $~lib/builtins/abort unreachable @@ -930,7 +987,7 @@ if i32.const 0 i32.const 80 - i32.const 127 + i32.const 133 i32.const 25 call $~lib/builtins/abort unreachable @@ -946,7 +1003,7 @@ if i32.const 0 i32.const 80 - i32.const 128 + i32.const 134 i32.const 26 call $~lib/builtins/abort unreachable @@ -1105,7 +1162,7 @@ if i32.const 0 i32.const 80 - i32.const 167 + i32.const 173 i32.const 25 call $~lib/builtins/abort unreachable @@ -1121,7 +1178,7 @@ if i32.const 0 i32.const 80 - i32.const 168 + i32.const 174 i32.const 25 call $~lib/builtins/abort unreachable @@ -1137,7 +1194,7 @@ if i32.const 0 i32.const 80 - i32.const 169 + i32.const 175 i32.const 25 call $~lib/builtins/abort unreachable @@ -1460,7 +1517,7 @@ if i32.const 0 i32.const 80 - i32.const 288 + i32.const 294 i32.const 1 call $~lib/builtins/abort unreachable @@ -1476,7 +1533,7 @@ if i32.const 0 i32.const 80 - i32.const 289 + i32.const 295 i32.const 1 call $~lib/builtins/abort unreachable @@ -1490,7 +1547,7 @@ if i32.const 0 i32.const 80 - i32.const 290 + i32.const 296 i32.const 1 call $~lib/builtins/abort unreachable @@ -1503,7 +1560,7 @@ if i32.const 0 i32.const 80 - i32.const 291 + i32.const 297 i32.const 1 call $~lib/builtins/abort unreachable @@ -1516,7 +1573,7 @@ if i32.const 0 i32.const 80 - i32.const 292 + i32.const 298 i32.const 1 call $~lib/builtins/abort unreachable @@ -1530,7 +1587,7 @@ if i32.const 0 i32.const 80 - i32.const 293 + i32.const 299 i32.const 1 call $~lib/builtins/abort unreachable @@ -2054,7 +2111,7 @@ if i32.const 0 i32.const 80 - i32.const 469 + i32.const 475 i32.const 1 call $~lib/builtins/abort unreachable @@ -2067,7 +2124,7 @@ if i32.const 0 i32.const 80 - i32.const 470 + i32.const 476 i32.const 1 call $~lib/builtins/abort unreachable @@ -2080,7 +2137,7 @@ if i32.const 0 i32.const 80 - i32.const 471 + i32.const 477 i32.const 1 call $~lib/builtins/abort unreachable @@ -2093,7 +2150,7 @@ if i32.const 0 i32.const 80 - i32.const 472 + i32.const 478 i32.const 1 call $~lib/builtins/abort unreachable @@ -2106,7 +2163,7 @@ if i32.const 0 i32.const 80 - i32.const 473 + i32.const 479 i32.const 1 call $~lib/builtins/abort unreachable @@ -2119,7 +2176,7 @@ if i32.const 0 i32.const 80 - i32.const 474 + i32.const 480 i32.const 1 call $~lib/builtins/abort unreachable @@ -2132,7 +2189,7 @@ if i32.const 0 i32.const 80 - i32.const 475 + i32.const 481 i32.const 1 call $~lib/builtins/abort unreachable @@ -2167,7 +2224,7 @@ if i32.const 288 i32.const 80 - i32.const 485 + i32.const 491 i32.const 3 call $~lib/builtins/abort unreachable @@ -2179,7 +2236,7 @@ if i32.const 0 i32.const 80 - i32.const 486 + i32.const 492 i32.const 3 call $~lib/builtins/abort unreachable @@ -2191,7 +2248,7 @@ if i32.const 0 i32.const 80 - i32.const 487 + i32.const 493 i32.const 3 call $~lib/builtins/abort unreachable @@ -2203,7 +2260,7 @@ if i32.const 0 i32.const 80 - i32.const 488 + i32.const 494 i32.const 3 call $~lib/builtins/abort unreachable @@ -2215,7 +2272,7 @@ if i32.const 0 i32.const 80 - i32.const 492 + i32.const 498 i32.const 3 call $~lib/builtins/abort unreachable @@ -2227,7 +2284,7 @@ if i32.const 0 i32.const 80 - i32.const 493 + i32.const 499 i32.const 3 call $~lib/builtins/abort unreachable @@ -2239,7 +2296,7 @@ if i32.const 0 i32.const 80 - i32.const 494 + i32.const 500 i32.const 3 call $~lib/builtins/abort unreachable @@ -2251,7 +2308,7 @@ if i32.const 0 i32.const 80 - i32.const 495 + i32.const 501 i32.const 3 call $~lib/builtins/abort unreachable @@ -2263,7 +2320,7 @@ if i32.const 0 i32.const 80 - i32.const 496 + i32.const 502 i32.const 3 call $~lib/builtins/abort unreachable @@ -2275,7 +2332,7 @@ if i32.const 0 i32.const 80 - i32.const 497 + i32.const 503 i32.const 3 call $~lib/builtins/abort unreachable @@ -2287,7 +2344,7 @@ if i32.const 0 i32.const 80 - i32.const 498 + i32.const 504 i32.const 3 call $~lib/builtins/abort unreachable @@ -2299,7 +2356,7 @@ if i32.const 0 i32.const 80 - i32.const 499 + i32.const 505 i32.const 3 call $~lib/builtins/abort unreachable @@ -2311,7 +2368,7 @@ if i32.const 0 i32.const 80 - i32.const 500 + i32.const 506 i32.const 3 call $~lib/builtins/abort unreachable @@ -2323,7 +2380,7 @@ if i32.const 0 i32.const 80 - i32.const 501 + i32.const 507 i32.const 3 call $~lib/builtins/abort unreachable @@ -2335,7 +2392,7 @@ if i32.const 0 i32.const 80 - i32.const 502 + i32.const 508 i32.const 3 call $~lib/builtins/abort unreachable @@ -2347,7 +2404,7 @@ if i32.const 0 i32.const 80 - i32.const 503 + i32.const 509 i32.const 3 call $~lib/builtins/abort unreachable @@ -2359,7 +2416,7 @@ if i32.const 0 i32.const 80 - i32.const 504 + i32.const 510 i32.const 3 call $~lib/builtins/abort unreachable @@ -2371,7 +2428,7 @@ if i32.const 0 i32.const 80 - i32.const 505 + i32.const 511 i32.const 3 call $~lib/builtins/abort unreachable @@ -2383,7 +2440,7 @@ if i32.const 0 i32.const 80 - i32.const 506 + i32.const 512 i32.const 3 call $~lib/builtins/abort unreachable @@ -2395,7 +2452,7 @@ if i32.const 0 i32.const 80 - i32.const 507 + i32.const 513 i32.const 3 call $~lib/builtins/abort unreachable @@ -2407,7 +2464,7 @@ if i32.const 0 i32.const 80 - i32.const 508 + i32.const 514 i32.const 3 call $~lib/builtins/abort unreachable @@ -2419,7 +2476,7 @@ if i32.const 0 i32.const 80 - i32.const 509 + i32.const 515 i32.const 3 call $~lib/builtins/abort unreachable @@ -2431,7 +2488,7 @@ if i32.const 0 i32.const 80 - i32.const 510 + i32.const 516 i32.const 3 call $~lib/builtins/abort unreachable @@ -2443,7 +2500,7 @@ if i32.const 0 i32.const 80 - i32.const 511 + i32.const 517 i32.const 3 call $~lib/builtins/abort unreachable From 7573bb875f4925becb10efbdf78234b0ffd5c982 Mon Sep 17 00:00:00 2001 From: ValeriaVG Date: Sat, 3 Oct 2020 19:58:05 +0200 Subject: [PATCH 10/17] Fix lint errors --- tests/compiler/builtins.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/compiler/builtins.ts b/tests/compiler/builtins.ts index 10586da2c0..0f5217de42 100644 --- a/tests/compiler/builtins.ts +++ b/tests/compiler/builtins.ts @@ -49,8 +49,8 @@ assert(!isConstant(b)); // small integers var l: i8; l = add(1, 2); assert(l == 3); -l = sub(2, 1); assert(l == 1) -l = mul(1, 2); assert(l == 2) +l = sub(2, 1); assert(l == 1); +l = mul(1, 2); assert(l == 2); // integers From fc61aa9c692110c215952f1ab5ec5ea384e6acc7 Mon Sep 17 00:00:00 2001 From: Valeria Date: Sun, 4 Oct 2020 08:26:26 +0200 Subject: [PATCH 11/17] Update src/builtins.ts Co-authored-by: Max Graey --- src/builtins.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/builtins.ts b/src/builtins.ts index ab3912e979..6db672bb0f 100644 --- a/src/builtins.ts +++ b/src/builtins.ts @@ -2337,11 +2337,7 @@ function builtin_mul(ctx: BuiltinContext): ExpressionRef { } } if (op != -1) { - return module.binary( - op, - arg0, - arg1 - ); + return module.binary(op, arg0, arg1); } } compiler.error( From b327b13699e41828c56fe1f824bffdeb98a830d2 Mon Sep 17 00:00:00 2001 From: Valeria Date: Sun, 4 Oct 2020 08:26:35 +0200 Subject: [PATCH 12/17] Update src/builtins.ts Co-authored-by: Max Graey --- src/builtins.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/builtins.ts b/src/builtins.ts index 6db672bb0f..b571c3a7cf 100644 --- a/src/builtins.ts +++ b/src/builtins.ts @@ -2319,10 +2319,7 @@ function builtin_mul(ctx: BuiltinContext): ExpressionRef { op = BinaryOp.MulI64; break; } - case TypeKind.ISIZE: { - op = compiler.options.isWasm64 ? BinaryOp.MulI64 : BinaryOp.MulI32; - break; - } + case TypeKind.ISIZE: case TypeKind.USIZE: { op = compiler.options.isWasm64 ? BinaryOp.MulI64 : BinaryOp.MulI32; break; From eb510ef68e4d2c9d5388de7a046d1eb4632c4d74 Mon Sep 17 00:00:00 2001 From: Valeria Date: Sun, 4 Oct 2020 08:26:46 +0200 Subject: [PATCH 13/17] Update src/builtins.ts Co-authored-by: Max Graey --- src/builtins.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/builtins.ts b/src/builtins.ts index b571c3a7cf..02f37665c8 100644 --- a/src/builtins.ts +++ b/src/builtins.ts @@ -2243,11 +2243,7 @@ function builtin_sub(ctx: BuiltinContext): ExpressionRef { } } if (op != -1) { - return module.binary( - op, - arg0, - arg1 - ); + return module.binary(op, arg0, arg1); } } compiler.error( From 8e5a3ebc1f93edfd0cec5cff1638aec8cac19379 Mon Sep 17 00:00:00 2001 From: Valeria Date: Sun, 4 Oct 2020 08:27:03 +0200 Subject: [PATCH 14/17] Update src/builtins.ts Co-authored-by: Max Graey --- src/builtins.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/builtins.ts b/src/builtins.ts index 02f37665c8..c7f68219c3 100644 --- a/src/builtins.ts +++ b/src/builtins.ts @@ -2225,10 +2225,7 @@ function builtin_sub(ctx: BuiltinContext): ExpressionRef { op = BinaryOp.SubI64; break; } - case TypeKind.ISIZE: { - op = compiler.options.isWasm64 ? BinaryOp.SubI64 : BinaryOp.SubI32; - break; - } + case TypeKind.ISIZE: case TypeKind.USIZE: { op = compiler.options.isWasm64 ? BinaryOp.SubI64 : BinaryOp.SubI32; break; From 78867181b1f4820f458018cc9ed927a16ccef98d Mon Sep 17 00:00:00 2001 From: Valeria Date: Sun, 4 Oct 2020 08:27:15 +0200 Subject: [PATCH 15/17] Update src/builtins.ts Co-authored-by: Max Graey --- src/builtins.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/builtins.ts b/src/builtins.ts index c7f68219c3..3cda990881 100644 --- a/src/builtins.ts +++ b/src/builtins.ts @@ -2149,11 +2149,7 @@ function builtin_add(ctx: BuiltinContext): ExpressionRef { } } if (op != -1) { - return module.binary( - op, - arg0, - arg1 - ); + return module.binary(op, arg0, arg1); } } compiler.error( From d59706533ceff7914a1558c55bcf66e3b2784579 Mon Sep 17 00:00:00 2001 From: Valeria Date: Sun, 4 Oct 2020 08:27:25 +0200 Subject: [PATCH 16/17] Update src/builtins.ts Co-authored-by: Max Graey --- src/builtins.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/builtins.ts b/src/builtins.ts index 3cda990881..2090d0a38d 100644 --- a/src/builtins.ts +++ b/src/builtins.ts @@ -2131,10 +2131,7 @@ function builtin_add(ctx: BuiltinContext): ExpressionRef { op = BinaryOp.AddI64; break; } - case TypeKind.ISIZE: { - op = compiler.options.isWasm64 ? BinaryOp.AddI64 : BinaryOp.AddI32; - break; - } + case TypeKind.ISIZE: case TypeKind.USIZE: { op = compiler.options.isWasm64 ? BinaryOp.AddI64 : BinaryOp.AddI32; break; From f6be4aaa095e19604655ecdcba0d99e6a9eb0e1c Mon Sep 17 00:00:00 2001 From: ValeriaVG Date: Sun, 4 Oct 2020 11:34:51 +0200 Subject: [PATCH 17/17] Remove ensureSmallIntegerWrap for I32 and U32 in add,mul and sub builtins --- src/builtins.ts | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/builtins.ts b/src/builtins.ts index 2090d0a38d..eb6e4f60f6 100644 --- a/src/builtins.ts +++ b/src/builtins.ts @@ -2116,16 +2116,20 @@ function builtin_add(ctx: BuiltinContext): ExpressionRef { switch (type.kind) { case TypeKind.I8: case TypeKind.I16: - case TypeKind.I32: case TypeKind.U8: case TypeKind.U16: - case TypeKind.U32: case TypeKind.BOOL: { return compiler.ensureSmallIntegerWrap( module.binary(BinaryOp.AddI32, arg0, arg1), type ); } + case TypeKind.I32: + case TypeKind.U32: + { + op = BinaryOp.AddI32; + break; + } case TypeKind.I64: case TypeKind.U64: { op = BinaryOp.AddI64; @@ -2203,16 +2207,20 @@ function builtin_sub(ctx: BuiltinContext): ExpressionRef { switch (type.kind) { case TypeKind.I8: case TypeKind.I16: - case TypeKind.I32: case TypeKind.U8: case TypeKind.U16: - case TypeKind.U32: case TypeKind.BOOL: { return compiler.ensureSmallIntegerWrap( module.binary(BinaryOp.SubI32, arg0, arg1), type ); } + case TypeKind.I32: + case TypeKind.U32: + { + op = BinaryOp.SubI32; + break; + } case TypeKind.I64: case TypeKind.U64: { op = BinaryOp.SubI64; @@ -2290,16 +2298,20 @@ function builtin_mul(ctx: BuiltinContext): ExpressionRef { switch (type.kind) { case TypeKind.I8: case TypeKind.I16: - case TypeKind.I32: case TypeKind.U8: case TypeKind.U16: - case TypeKind.U32: case TypeKind.BOOL: { return compiler.ensureSmallIntegerWrap( module.binary(BinaryOp.MulI32, arg0, arg1), type ); } + case TypeKind.I32: + case TypeKind.U32: + { + op = BinaryOp.MulI32; + break; + } case TypeKind.I64: case TypeKind.U64: { op = BinaryOp.MulI64;