From 7a9a7862ab08bd4a1cbe34ecee4b8769e89bc810 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 13 Nov 2021 23:21:07 +0200 Subject: [PATCH 1/4] init --- src/builtins.ts | 190 +++++++++++++++++---- tests/compiler/features/simd.optimized.wat | 152 +++++++++++++++++ tests/compiler/features/simd.ts | 56 ++++++ tests/compiler/features/simd.untouched.wat | 152 +++++++++++++++++ 4 files changed, 519 insertions(+), 31 deletions(-) diff --git a/src/builtins.ts b/src/builtins.ts index d6e8120e3a..678b9f860e 100644 --- a/src/builtins.ts +++ b/src/builtins.ts @@ -3522,20 +3522,41 @@ function builtin_i8x16(ctx: BuiltinContext): ExpressionRef { } var operands = ctx.operands; var bytes = new Uint8Array(16); + var vars = new Array(16); + var numVars = 0; + for (let i = 0; i < 16; ++i) { let expr = compiler.compileExpression(operands[i], Type.i8, Constraints.CONV_IMPLICIT); let precomp = module.runExpression(expr, ExpressionRunnerFlags.PreserveSideeffects); if (precomp) { writeI8(getConstValueI32(precomp), bytes, i); } else { - compiler.error( - DiagnosticCode.Expression_must_be_a_compile_time_constant, - operands[i].range - ); + writeI8(0, bytes, i); + vars[i] = expr; + numVars++; } } compiler.currentType = Type.v128; - return module.v128(bytes); + if (numVars == 0) { + // all constants + return module.v128(bytes); + } else { + let vec: ExpressionRef; + let fullVars = numVars == 16; + if (fullVars) { + // all variants + vec = module.unary(UnaryOp.SplatI8x16, vars[0]); + } else { + // mixed constants / variants + vec = module.v128(bytes); + } + for (let i = i32(fullVars); i < 16; i++) { + if (vars[i]) { + vec = module.simd_replace(SIMDReplaceOp.ReplaceLaneI8x16, vec, i, vars[i]); + } + } + return vec; + } } builtins.set(BuiltinNames.i8x16, builtin_i8x16); @@ -3553,20 +3574,41 @@ function builtin_i16x8(ctx: BuiltinContext): ExpressionRef { } var operands = ctx.operands; var bytes = new Uint8Array(16); + var vars = new Array(8); + var numVars = 0; + for (let i = 0; i < 8; ++i) { let expr = compiler.compileExpression(operands[i], Type.i16, Constraints.CONV_IMPLICIT); let precomp = module.runExpression(expr, ExpressionRunnerFlags.PreserveSideeffects); if (precomp) { writeI16(getConstValueI32(precomp), bytes, i << 1); } else { - compiler.error( - DiagnosticCode.Expression_must_be_a_compile_time_constant, - operands[i].range - ); + writeI16(0, bytes, i << 1); + vars[i] = expr; + numVars++; } } compiler.currentType = Type.v128; - return module.v128(bytes); + if (numVars == 0) { + // all constants + return module.v128(bytes); + } else { + let vec: ExpressionRef; + let fullVars = numVars == 8; + if (fullVars) { + // all variants + vec = module.unary(UnaryOp.SplatI16x8, vars[0]); + } else { + // mixed constants / variants + vec = module.v128(bytes); + } + for (let i = i32(fullVars); i < 8; i++) { + if (vars[i]) { + vec = module.simd_replace(SIMDReplaceOp.ReplaceLaneI16x8, vec, i, vars[i]); + } + } + return vec; + } } builtins.set(BuiltinNames.i16x8, builtin_i16x8); @@ -3584,20 +3626,41 @@ function builtin_i32x4(ctx: BuiltinContext): ExpressionRef { } var operands = ctx.operands; var bytes = new Uint8Array(16); + var vars = new Array(4); + var numVars = 0; + for (let i = 0; i < 4; ++i) { let expr = compiler.compileExpression(operands[i], Type.i32, Constraints.CONV_IMPLICIT); let precomp = module.runExpression(expr, ExpressionRunnerFlags.PreserveSideeffects); if (precomp) { writeI32(getConstValueI32(precomp), bytes, i << 2); } else { - compiler.error( - DiagnosticCode.Expression_must_be_a_compile_time_constant, - operands[i].range - ); + writeI32(0, bytes, i << 2); + vars[i] = expr; + numVars++; } } compiler.currentType = Type.v128; - return module.v128(bytes); + if (numVars == 0) { + // all constants + return module.v128(bytes); + } else { + let vec: ExpressionRef; + let fullVars = numVars == 4; + if (fullVars) { + // all variants + vec = module.unary(UnaryOp.SplatI32x4, vars[0]); + } else { + // mixed constants / variants + vec = module.v128(bytes); + } + for (let i = i32(fullVars); i < 4; i++) { + if (vars[i]) { + vec = module.simd_replace(SIMDReplaceOp.ReplaceLaneI32x4, vec, i, vars[i]); + } + } + return vec; + } } builtins.set(BuiltinNames.i32x4, builtin_i32x4); @@ -3615,22 +3678,45 @@ function builtin_i64x2(ctx: BuiltinContext): ExpressionRef { } var operands = ctx.operands; var bytes = new Uint8Array(16); + var vars = new Array(2); + var numVars = 0; + for (let i = 0; i < 2; ++i) { let expr = compiler.compileExpression(operands[i], Type.i64, Constraints.CONV_IMPLICIT); let precomp = module.runExpression(expr, ExpressionRunnerFlags.PreserveSideeffects); if (precomp) { let off = i << 3; - writeI32(getConstValueI64Low(precomp), bytes, off); + writeI32(getConstValueI64Low(precomp), bytes, off + 0); writeI32(getConstValueI64High(precomp), bytes, off + 4); } else { - compiler.error( - DiagnosticCode.Expression_must_be_a_compile_time_constant, - operands[i].range - ); + let off = i << 3; + writeI32(0, bytes, off + 0); + writeI32(0, bytes, off + 4); + vars[i] = expr; + numVars++; } } compiler.currentType = Type.v128; - return module.v128(bytes); + if (numVars == 0) { + // all constants + return module.v128(bytes); + } else { + let vec: ExpressionRef; + let fullVars = numVars == 2; + if (fullVars) { + // all variants + vec = module.unary(UnaryOp.SplatI64x2, vars[0]); + } else { + // mixed constants / variants + vec = module.v128(bytes); + } + for (let i = i32(fullVars); i < 2; i++) { + if (vars[i]) { + vec = module.simd_replace(SIMDReplaceOp.ReplaceLaneI64x2, vec, i, vars[i]); + } + } + return vec; + } } builtins.set(BuiltinNames.i64x2, builtin_i64x2); @@ -3648,20 +3734,41 @@ function builtin_f32x4(ctx: BuiltinContext): ExpressionRef { } var operands = ctx.operands; var bytes = new Uint8Array(16); + var vars = new Array(4); + var numVars = 0; + for (let i = 0; i < 4; ++i) { let expr = compiler.compileExpression(operands[i], Type.f32, Constraints.CONV_IMPLICIT); let precomp = module.runExpression(expr, ExpressionRunnerFlags.PreserveSideeffects); if (precomp) { writeF32(getConstValueF32(precomp), bytes, i << 2); } else { - compiler.error( - DiagnosticCode.Expression_must_be_a_compile_time_constant, - operands[i].range - ); + writeF32(0, bytes, i << 2); + vars[i] = expr; + numVars++; } } compiler.currentType = Type.v128; - return module.v128(bytes); + if (numVars == 0) { + // all constants + return module.v128(bytes); + } else { + let vec: ExpressionRef; + let fullVars = numVars == 4; + if (fullVars) { + // all variants + vec = module.unary(UnaryOp.SplatF32x4, vars[0]); + } else { + // mixed constants / variants + vec = module.v128(bytes); + } + for (let i = i32(fullVars); i < 4; i++) { + if (vars[i]) { + vec = module.simd_replace(SIMDReplaceOp.ReplaceLaneF32x4, vec, i, vars[i]); + } + } + return vec; + } } builtins.set(BuiltinNames.f32x4, builtin_f32x4); @@ -3679,20 +3786,41 @@ function builtin_f64x2(ctx: BuiltinContext): ExpressionRef { } var operands = ctx.operands; var bytes = new Uint8Array(16); + var vars = new Array(2); + var numVars = 0; + for (let i = 0; i < 2; ++i) { let expr = compiler.compileExpression(operands[i], Type.f64, Constraints.CONV_IMPLICIT); let precomp = module.runExpression(expr, ExpressionRunnerFlags.PreserveSideeffects); if (precomp) { writeF64(getConstValueF64(precomp), bytes, i << 3); } else { - compiler.error( - DiagnosticCode.Expression_must_be_a_compile_time_constant, - operands[i].range - ); + writeF64(0, bytes, i << 3); + vars[i] = expr; + numVars++; } } compiler.currentType = Type.v128; - return module.v128(bytes); + if (numVars == 0) { + // all constants + return module.v128(bytes); + } else { + let vec: ExpressionRef; + let fullVars = numVars == 2; + if (fullVars) { + // all variants + vec = module.unary(UnaryOp.SplatF64x2, vars[0]); + } else { + // mixed constants / variants + vec = module.v128(bytes); + } + for (let i = i32(fullVars); i < 2; i++) { + if (vars[i]) { + vec = module.simd_replace(SIMDReplaceOp.ReplaceLaneF64x2, vec, i, vars[i]); + } + } + return vec; + } } builtins.set(BuiltinNames.f64x2, builtin_f64x2); diff --git a/tests/compiler/features/simd.optimized.wat b/tests/compiler/features/simd.optimized.wat index 95b3156975..1f62a9c0cd 100644 --- a/tests/compiler/features/simd.optimized.wat +++ b/tests/compiler/features/simd.optimized.wat @@ -1,10 +1,20 @@ (module + (type $i32_i32_i32_=>_v128 (func (param i32 i32 i32) (result v128))) (type $i32_i32_=>_none (func (param i32 i32))) (type $none_=>_none (func)) (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) (type $i32_=>_none (func (param i32))) + (type $i32_i32_i32_i32_i32_i32_i32_i32_i32_i32_i32_i32_i32_i32_i32_i32_=>_v128 (func (param i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) (result v128))) + (type $i32_i32_i32_i32_i32_i32_i32_i32_=>_v128 (func (param i32 i32 i32 i32 i32 i32 i32 i32) (result v128))) + (type $i32_i32_i32_i32_=>_v128 (func (param i32 i32 i32 i32) (result v128))) + (type $i64_=>_v128 (func (param i64) (result v128))) + (type $i64_i64_=>_v128 (func (param i64 i64) (result v128))) + (type $f32_f32_f32_=>_v128 (func (param f32 f32 f32) (result v128))) + (type $f32_f32_f32_f32_=>_v128 (func (param f32 f32 f32 f32) (result v128))) + (type $f64_=>_v128 (func (param f64) (result v128))) + (type $f64_f64_=>_v128 (func (param f64 f64) (result v128))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) (memory $0 1) @@ -14,6 +24,18 @@ (data (i32.const 1112) "\01\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e") (data (i32.const 1164) "<") (data (i32.const 1176) "\01\00\00\00 \00\00\00f\00e\00a\00t\00u\00r\00e\00s\00/\00s\00i\00m\00d\00.\00t\00s") + (export "test_vars_i8x16_partial" (func $features/simd/test_vars_i8x16_partial)) + (export "test_vars_i8x16_full" (func $features/simd/test_vars_i8x16_full)) + (export "test_vars_i16x8_partial" (func $features/simd/test_vars_i16x8_partial)) + (export "test_vars_i16x8_full" (func $features/simd/test_vars_i16x8_full)) + (export "test_vars_i32x4_partial" (func $features/simd/test_vars_i32x4_partial)) + (export "test_vars_i32x4_full" (func $features/simd/test_vars_i32x4_full)) + (export "test_vars_i64x2_partial" (func $features/simd/test_vars_i64x2_partial)) + (export "test_vars_i64x2_full" (func $features/simd/test_vars_i64x2_full)) + (export "test_vars_f32x4_partial" (func $features/simd/test_vars_f32x4_partial)) + (export "test_vars_f32x4_full" (func $features/simd/test_vars_f32x4_full)) + (export "test_vars_f64x2_partial" (func $features/simd/test_vars_f64x2_partial)) + (export "test_vars_f64x2_full" (func $features/simd/test_vars_f64x2_full)) (export "memory" (memory $0)) (start $~start) (func $~lib/rt/tlsf/removeBlock (param $0 i32) (param $1 i32) @@ -975,6 +997,136 @@ local.get $1 call $~lib/rt/tlsf/insertBlock ) + (func $features/simd/test_vars_i8x16_partial (param $0 i32) (param $1 i32) (param $2 i32) (result v128) + v128.const i32x4 0x03000100 0x07000504 0x0b0a0908 0x000e0d0c + local.get $0 + i8x16.replace_lane 2 + local.get $1 + i8x16.replace_lane 6 + local.get $2 + i8x16.replace_lane 15 + ) + (func $features/simd/test_vars_i8x16_full (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) (param $5 i32) (param $6 i32) (param $7 i32) (param $8 i32) (param $9 i32) (param $10 i32) (param $11 i32) (param $12 i32) (param $13 i32) (param $14 i32) (param $15 i32) (result v128) + local.get $0 + i8x16.splat + local.get $1 + i8x16.replace_lane 1 + local.get $2 + i8x16.replace_lane 2 + local.get $3 + i8x16.replace_lane 3 + local.get $4 + i8x16.replace_lane 4 + local.get $5 + i8x16.replace_lane 5 + local.get $6 + i8x16.replace_lane 6 + local.get $7 + i8x16.replace_lane 7 + local.get $8 + i8x16.replace_lane 8 + local.get $9 + i8x16.replace_lane 9 + local.get $10 + i8x16.replace_lane 10 + local.get $11 + i8x16.replace_lane 11 + local.get $12 + i8x16.replace_lane 12 + local.get $13 + i8x16.replace_lane 13 + local.get $14 + i8x16.replace_lane 14 + local.get $15 + i8x16.replace_lane 15 + ) + (func $features/simd/test_vars_i16x8_partial (param $0 i32) (param $1 i32) (param $2 i32) (result v128) + v128.const i32x4 0x00010000 0x00030000 0x00050000 0x00000006 + local.get $0 + i16x8.replace_lane 2 + local.get $1 + i16x8.replace_lane 4 + local.get $2 + i16x8.replace_lane 7 + ) + (func $features/simd/test_vars_i16x8_full (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) (param $5 i32) (param $6 i32) (param $7 i32) (result v128) + local.get $0 + i16x8.splat + local.get $1 + i16x8.replace_lane 1 + local.get $2 + i16x8.replace_lane 2 + local.get $3 + i16x8.replace_lane 3 + local.get $4 + i16x8.replace_lane 4 + local.get $5 + i16x8.replace_lane 5 + local.get $6 + i16x8.replace_lane 6 + local.get $7 + i16x8.replace_lane 7 + ) + (func $features/simd/test_vars_i32x4_partial (param $0 i32) (param $1 i32) (param $2 i32) (result v128) + v128.const i32x4 0x00000000 0x00000000 0x00000000 0x00000000 + local.get $0 + i32x4.replace_lane 1 + local.get $1 + i32x4.replace_lane 2 + local.get $2 + i32x4.replace_lane 3 + ) + (func $features/simd/test_vars_i32x4_full (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result v128) + local.get $0 + i32x4.splat + local.get $1 + i32x4.replace_lane 1 + local.get $2 + i32x4.replace_lane 2 + local.get $3 + i32x4.replace_lane 3 + ) + (func $features/simd/test_vars_i64x2_partial (param $0 i64) (result v128) + v128.const i32x4 0x00000000 0x00000000 0x00000000 0x00000000 + local.get $0 + i64x2.replace_lane 1 + ) + (func $features/simd/test_vars_i64x2_full (param $0 i64) (param $1 i64) (result v128) + local.get $0 + i64x2.splat + local.get $1 + i64x2.replace_lane 1 + ) + (func $features/simd/test_vars_f32x4_partial (param $0 f32) (param $1 f32) (param $2 f32) (result v128) + v128.const i32x4 0x00000000 0x00000000 0x00000000 0x00000000 + local.get $0 + f32x4.replace_lane 1 + local.get $1 + f32x4.replace_lane 2 + local.get $2 + f32x4.replace_lane 3 + ) + (func $features/simd/test_vars_f32x4_full (param $0 f32) (param $1 f32) (param $2 f32) (param $3 f32) (result v128) + local.get $0 + f32x4.splat + local.get $1 + f32x4.replace_lane 1 + local.get $2 + f32x4.replace_lane 2 + local.get $3 + f32x4.replace_lane 3 + ) + (func $features/simd/test_vars_f64x2_partial (param $0 f64) (result v128) + v128.const i32x4 0x00000000 0x00000000 0x00000000 0x00000000 + local.get $0 + f64x2.replace_lane 1 + ) + (func $features/simd/test_vars_f64x2_full (param $0 f64) (param $1 f64) (result v128) + local.get $0 + f64x2.splat + local.get $1 + f64x2.replace_lane 1 + ) (func $~start (local $0 i32) global.get $~lib/rt/tlsf/ROOT diff --git a/tests/compiler/features/simd.ts b/tests/compiler/features/simd.ts index 432c715838..f2b50cb0b3 100644 --- a/tests/compiler/features/simd.ts +++ b/tests/compiler/features/simd.ts @@ -703,6 +703,62 @@ function test_const(): v128 { return one; // should not inline } +export function test_vars_i8x16_partial(a: i8, b: i8, c: i8): v128 { + return i8x16(0, 1, a, 3, 4, 5, b, 7, 8, 9, 10, 11, 12, 13, 14, c); +} + +export function test_vars_i8x16_full( + a: i8, b: i8, c: i8, d: i8, + e: i8, f: i8, g: i8, h: i8, + i: i8, k: i8, l: i8, m: i8, + n: i8, o: i8, p: i8, q: i8 +): v128 { + return i8x16(a, b, c, d, e, f, g, h, i, k, l, m, n, o, p, q); +} + +export function test_vars_i16x8_partial(a: i16, b: i16, c: i16): v128 { + return i16x8(0, 1, a, 3, b, 5, 6, c); +} + +export function test_vars_i16x8_full( + a: i16, b: i16, c: i16, d: i16, + e: i16, f: i16, g: i16, h: i16 +): v128 { + return i16x8(a, b, c, d, e, f, g, h); +} + +export function test_vars_i32x4_partial(a: i32, b: i32, c: i32): v128 { + return i32x4(0, a, b, c); +} + +export function test_vars_i32x4_full(a: i32, b: i32, c: i32, d: i32): v128 { + return i32x4(a, b, c, d); +} + +export function test_vars_i64x2_partial(a: i64): v128 { + return i64x2(0, a); +} + +export function test_vars_i64x2_full(a: i64, b: i64): v128 { + return i64x2(a, b); +} + +export function test_vars_f32x4_partial(a: f32, b: f32, c: f32): v128 { + return f32x4(0, a, b, c); +} + +export function test_vars_f32x4_full(a: f32, b: f32, c: f32, d: f32): v128 { + return f32x4(a, b, c, d); +} + +export function test_vars_f64x2_partial(a: f64): v128 { + return f64x2(0, a); +} + +export function test_vars_f64x2_full(a: f64, b: f64): v128 { + return f64x2(a, b); +} + if (ASC_FEATURE_SIMD) { test_v128(); test_i8x16(); diff --git a/tests/compiler/features/simd.untouched.wat b/tests/compiler/features/simd.untouched.wat index 29a3b2e40d..18a67c6038 100644 --- a/tests/compiler/features/simd.untouched.wat +++ b/tests/compiler/features/simd.untouched.wat @@ -2,12 +2,22 @@ (type $none_=>_none (func)) (type $i32_i32_=>_none (func (param i32 i32))) (type $i32_=>_i32 (func (param i32) (result i32))) + (type $i32_i32_i32_=>_v128 (func (param i32 i32 i32) (result v128))) (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) (type $i32_i32_i32_=>_i32 (func (param i32 i32 i32) (result i32))) (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) (type $i32_=>_none (func (param i32))) (type $none_=>_v128 (func (result v128))) + (type $i32_i32_i32_i32_i32_i32_i32_i32_i32_i32_i32_i32_i32_i32_i32_i32_=>_v128 (func (param i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) (result v128))) + (type $i32_i32_i32_i32_i32_i32_i32_i32_=>_v128 (func (param i32 i32 i32 i32 i32 i32 i32 i32) (result v128))) + (type $i32_i32_i32_i32_=>_v128 (func (param i32 i32 i32 i32) (result v128))) + (type $i64_=>_v128 (func (param i64) (result v128))) + (type $i64_i64_=>_v128 (func (param i64 i64) (result v128))) + (type $f32_f32_f32_=>_v128 (func (param f32 f32 f32) (result v128))) + (type $f32_f32_f32_f32_=>_v128 (func (param f32 f32 f32 f32) (result v128))) + (type $f64_=>_v128 (func (param f64) (result v128))) + (type $f64_f64_=>_v128 (func (param f64 f64) (result v128))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) (global $~lib/ASC_FEATURE_SIMD i32 (i32.const 1)) (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) @@ -26,6 +36,18 @@ (data (i32.const 140) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00 \00\00\00f\00e\00a\00t\00u\00r\00e\00s\00/\00s\00i\00m\00d\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") (table $0 1 funcref) (elem $0 (i32.const 1)) + (export "test_vars_i8x16_partial" (func $features/simd/test_vars_i8x16_partial)) + (export "test_vars_i8x16_full" (func $features/simd/test_vars_i8x16_full)) + (export "test_vars_i16x8_partial" (func $features/simd/test_vars_i16x8_partial)) + (export "test_vars_i16x8_full" (func $features/simd/test_vars_i16x8_full)) + (export "test_vars_i32x4_partial" (func $features/simd/test_vars_i32x4_partial)) + (export "test_vars_i32x4_full" (func $features/simd/test_vars_i32x4_full)) + (export "test_vars_i64x2_partial" (func $features/simd/test_vars_i64x2_partial)) + (export "test_vars_i64x2_full" (func $features/simd/test_vars_i64x2_full)) + (export "test_vars_f32x4_partial" (func $features/simd/test_vars_f32x4_partial)) + (export "test_vars_f32x4_full" (func $features/simd/test_vars_f32x4_full)) + (export "test_vars_f64x2_partial" (func $features/simd/test_vars_f64x2_partial)) + (export "test_vars_f64x2_full" (func $features/simd/test_vars_f64x2_full)) (export "memory" (memory $0)) (start $~start) (func $~lib/rt/tlsf/Root#set:flMap (param $0 i32) (param $1 i32) @@ -4653,6 +4675,136 @@ call $features/simd/test_const drop ) + (func $features/simd/test_vars_i8x16_partial (param $0 i32) (param $1 i32) (param $2 i32) (result v128) + v128.const i32x4 0x03000100 0x07000504 0x0b0a0908 0x000e0d0c + local.get $0 + i8x16.replace_lane 2 + local.get $1 + i8x16.replace_lane 6 + local.get $2 + i8x16.replace_lane 15 + ) + (func $features/simd/test_vars_i8x16_full (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) (param $5 i32) (param $6 i32) (param $7 i32) (param $8 i32) (param $9 i32) (param $10 i32) (param $11 i32) (param $12 i32) (param $13 i32) (param $14 i32) (param $15 i32) (result v128) + local.get $0 + i8x16.splat + local.get $1 + i8x16.replace_lane 1 + local.get $2 + i8x16.replace_lane 2 + local.get $3 + i8x16.replace_lane 3 + local.get $4 + i8x16.replace_lane 4 + local.get $5 + i8x16.replace_lane 5 + local.get $6 + i8x16.replace_lane 6 + local.get $7 + i8x16.replace_lane 7 + local.get $8 + i8x16.replace_lane 8 + local.get $9 + i8x16.replace_lane 9 + local.get $10 + i8x16.replace_lane 10 + local.get $11 + i8x16.replace_lane 11 + local.get $12 + i8x16.replace_lane 12 + local.get $13 + i8x16.replace_lane 13 + local.get $14 + i8x16.replace_lane 14 + local.get $15 + i8x16.replace_lane 15 + ) + (func $features/simd/test_vars_i16x8_partial (param $0 i32) (param $1 i32) (param $2 i32) (result v128) + v128.const i32x4 0x00010000 0x00030000 0x00050000 0x00000006 + local.get $0 + i16x8.replace_lane 2 + local.get $1 + i16x8.replace_lane 4 + local.get $2 + i16x8.replace_lane 7 + ) + (func $features/simd/test_vars_i16x8_full (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) (param $5 i32) (param $6 i32) (param $7 i32) (result v128) + local.get $0 + i16x8.splat + local.get $1 + i16x8.replace_lane 1 + local.get $2 + i16x8.replace_lane 2 + local.get $3 + i16x8.replace_lane 3 + local.get $4 + i16x8.replace_lane 4 + local.get $5 + i16x8.replace_lane 5 + local.get $6 + i16x8.replace_lane 6 + local.get $7 + i16x8.replace_lane 7 + ) + (func $features/simd/test_vars_i32x4_partial (param $0 i32) (param $1 i32) (param $2 i32) (result v128) + v128.const i32x4 0x00000000 0x00000000 0x00000000 0x00000000 + local.get $0 + i32x4.replace_lane 1 + local.get $1 + i32x4.replace_lane 2 + local.get $2 + i32x4.replace_lane 3 + ) + (func $features/simd/test_vars_i32x4_full (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result v128) + local.get $0 + i32x4.splat + local.get $1 + i32x4.replace_lane 1 + local.get $2 + i32x4.replace_lane 2 + local.get $3 + i32x4.replace_lane 3 + ) + (func $features/simd/test_vars_i64x2_partial (param $0 i64) (result v128) + v128.const i32x4 0x00000000 0x00000000 0x00000000 0x00000000 + local.get $0 + i64x2.replace_lane 1 + ) + (func $features/simd/test_vars_i64x2_full (param $0 i64) (param $1 i64) (result v128) + local.get $0 + i64x2.splat + local.get $1 + i64x2.replace_lane 1 + ) + (func $features/simd/test_vars_f32x4_partial (param $0 f32) (param $1 f32) (param $2 f32) (result v128) + v128.const i32x4 0x00000000 0x00000000 0x00000000 0x00000000 + local.get $0 + f32x4.replace_lane 1 + local.get $1 + f32x4.replace_lane 2 + local.get $2 + f32x4.replace_lane 3 + ) + (func $features/simd/test_vars_f32x4_full (param $0 f32) (param $1 f32) (param $2 f32) (param $3 f32) (result v128) + local.get $0 + f32x4.splat + local.get $1 + f32x4.replace_lane 1 + local.get $2 + f32x4.replace_lane 2 + local.get $3 + f32x4.replace_lane 3 + ) + (func $features/simd/test_vars_f64x2_partial (param $0 f64) (result v128) + v128.const i32x4 0x00000000 0x00000000 0x00000000 0x00000000 + local.get $0 + f64x2.replace_lane 1 + ) + (func $features/simd/test_vars_f64x2_full (param $0 f64) (param $1 f64) (result v128) + local.get $0 + f64x2.splat + local.get $1 + f64x2.replace_lane 1 + ) (func $~start call $start:features/simd ) From 2740dd5762eaf7230a2c4e4c0e08ad1e0793c5ec Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 13 Nov 2021 23:30:17 +0200 Subject: [PATCH 2/4] fix --- src/builtins.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/builtins.ts b/src/builtins.ts index 678b9f860e..859047f28f 100644 --- a/src/builtins.ts +++ b/src/builtins.ts @@ -3552,7 +3552,7 @@ function builtin_i8x16(ctx: BuiltinContext): ExpressionRef { } for (let i = i32(fullVars); i < 16; i++) { if (vars[i]) { - vec = module.simd_replace(SIMDReplaceOp.ReplaceLaneI8x16, vec, i, vars[i]); + vec = module.simd_replace(SIMDReplaceOp.ReplaceLaneI8x16, vec, i, vars[i]); } } return vec; @@ -3604,7 +3604,7 @@ function builtin_i16x8(ctx: BuiltinContext): ExpressionRef { } for (let i = i32(fullVars); i < 8; i++) { if (vars[i]) { - vec = module.simd_replace(SIMDReplaceOp.ReplaceLaneI16x8, vec, i, vars[i]); + vec = module.simd_replace(SIMDReplaceOp.ReplaceLaneI16x8, vec, i, vars[i]); } } return vec; @@ -3656,7 +3656,7 @@ function builtin_i32x4(ctx: BuiltinContext): ExpressionRef { } for (let i = i32(fullVars); i < 4; i++) { if (vars[i]) { - vec = module.simd_replace(SIMDReplaceOp.ReplaceLaneI32x4, vec, i, vars[i]); + vec = module.simd_replace(SIMDReplaceOp.ReplaceLaneI32x4, vec, i, vars[i]); } } return vec; @@ -3712,7 +3712,7 @@ function builtin_i64x2(ctx: BuiltinContext): ExpressionRef { } for (let i = i32(fullVars); i < 2; i++) { if (vars[i]) { - vec = module.simd_replace(SIMDReplaceOp.ReplaceLaneI64x2, vec, i, vars[i]); + vec = module.simd_replace(SIMDReplaceOp.ReplaceLaneI64x2, vec, i, vars[i]); } } return vec; @@ -3764,7 +3764,7 @@ function builtin_f32x4(ctx: BuiltinContext): ExpressionRef { } for (let i = i32(fullVars); i < 4; i++) { if (vars[i]) { - vec = module.simd_replace(SIMDReplaceOp.ReplaceLaneF32x4, vec, i, vars[i]); + vec = module.simd_replace(SIMDReplaceOp.ReplaceLaneF32x4, vec, i, vars[i]); } } return vec; @@ -3816,7 +3816,7 @@ function builtin_f64x2(ctx: BuiltinContext): ExpressionRef { } for (let i = i32(fullVars); i < 2; i++) { if (vars[i]) { - vec = module.simd_replace(SIMDReplaceOp.ReplaceLaneF64x2, vec, i, vars[i]); + vec = module.simd_replace(SIMDReplaceOp.ReplaceLaneF64x2, vec, i, vars[i]); } } return vec; From 95a63da53b17d3533824cf15120dc23bda698db6 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 13 Nov 2021 23:58:21 +0200 Subject: [PATCH 3/4] refactor --- src/builtins.ts | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/src/builtins.ts b/src/builtins.ts index 859047f28f..a9e583cd7b 100644 --- a/src/builtins.ts +++ b/src/builtins.ts @@ -3551,9 +3551,8 @@ function builtin_i8x16(ctx: BuiltinContext): ExpressionRef { vec = module.v128(bytes); } for (let i = i32(fullVars); i < 16; i++) { - if (vars[i]) { - vec = module.simd_replace(SIMDReplaceOp.ReplaceLaneI8x16, vec, i, vars[i]); - } + let expr = vars[i]; + if (expr) vec = module.simd_replace(SIMDReplaceOp.ReplaceLaneI8x16, vec, i, expr); } return vec; } @@ -3603,9 +3602,8 @@ function builtin_i16x8(ctx: BuiltinContext): ExpressionRef { vec = module.v128(bytes); } for (let i = i32(fullVars); i < 8; i++) { - if (vars[i]) { - vec = module.simd_replace(SIMDReplaceOp.ReplaceLaneI16x8, vec, i, vars[i]); - } + let expr = vars[i]; + if (expr) vec = module.simd_replace(SIMDReplaceOp.ReplaceLaneI16x8, vec, i, expr); } return vec; } @@ -3655,9 +3653,8 @@ function builtin_i32x4(ctx: BuiltinContext): ExpressionRef { vec = module.v128(bytes); } for (let i = i32(fullVars); i < 4; i++) { - if (vars[i]) { - vec = module.simd_replace(SIMDReplaceOp.ReplaceLaneI32x4, vec, i, vars[i]); - } + let expr = vars[i]; + if (expr) vec = module.simd_replace(SIMDReplaceOp.ReplaceLaneI32x4, vec, i, expr); } return vec; } @@ -3711,9 +3708,8 @@ function builtin_i64x2(ctx: BuiltinContext): ExpressionRef { vec = module.v128(bytes); } for (let i = i32(fullVars); i < 2; i++) { - if (vars[i]) { - vec = module.simd_replace(SIMDReplaceOp.ReplaceLaneI64x2, vec, i, vars[i]); - } + let expr = vars[i]; + if (expr) vec = module.simd_replace(SIMDReplaceOp.ReplaceLaneI64x2, vec, i, expr); } return vec; } @@ -3763,9 +3759,8 @@ function builtin_f32x4(ctx: BuiltinContext): ExpressionRef { vec = module.v128(bytes); } for (let i = i32(fullVars); i < 4; i++) { - if (vars[i]) { - vec = module.simd_replace(SIMDReplaceOp.ReplaceLaneF32x4, vec, i, vars[i]); - } + let expr = vars[i]; + if (expr) vec = module.simd_replace(SIMDReplaceOp.ReplaceLaneF32x4, vec, i, expr); } return vec; } @@ -3815,9 +3810,8 @@ function builtin_f64x2(ctx: BuiltinContext): ExpressionRef { vec = module.v128(bytes); } for (let i = i32(fullVars); i < 2; i++) { - if (vars[i]) { - vec = module.simd_replace(SIMDReplaceOp.ReplaceLaneF64x2, vec, i, vars[i]); - } + let expr = vars[i]; + if (expr) vec = module.simd_replace(SIMDReplaceOp.ReplaceLaneF64x2, vec, i, expr); } return vec; } From 1a56c29b47e71d85cdfd360e0d09b67a68b55de6 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sun, 14 Nov 2021 00:00:19 +0200 Subject: [PATCH 4/4] remove unnecessary stores --- src/builtins.ts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/builtins.ts b/src/builtins.ts index a9e583cd7b..9cce3c9db5 100644 --- a/src/builtins.ts +++ b/src/builtins.ts @@ -3531,7 +3531,6 @@ function builtin_i8x16(ctx: BuiltinContext): ExpressionRef { if (precomp) { writeI8(getConstValueI32(precomp), bytes, i); } else { - writeI8(0, bytes, i); vars[i] = expr; numVars++; } @@ -3582,7 +3581,6 @@ function builtin_i16x8(ctx: BuiltinContext): ExpressionRef { if (precomp) { writeI16(getConstValueI32(precomp), bytes, i << 1); } else { - writeI16(0, bytes, i << 1); vars[i] = expr; numVars++; } @@ -3633,7 +3631,6 @@ function builtin_i32x4(ctx: BuiltinContext): ExpressionRef { if (precomp) { writeI32(getConstValueI32(precomp), bytes, i << 2); } else { - writeI32(0, bytes, i << 2); vars[i] = expr; numVars++; } @@ -3686,9 +3683,6 @@ function builtin_i64x2(ctx: BuiltinContext): ExpressionRef { writeI32(getConstValueI64Low(precomp), bytes, off + 0); writeI32(getConstValueI64High(precomp), bytes, off + 4); } else { - let off = i << 3; - writeI32(0, bytes, off + 0); - writeI32(0, bytes, off + 4); vars[i] = expr; numVars++; } @@ -3739,7 +3733,6 @@ function builtin_f32x4(ctx: BuiltinContext): ExpressionRef { if (precomp) { writeF32(getConstValueF32(precomp), bytes, i << 2); } else { - writeF32(0, bytes, i << 2); vars[i] = expr; numVars++; } @@ -3790,7 +3783,6 @@ function builtin_f64x2(ctx: BuiltinContext): ExpressionRef { if (precomp) { writeF64(getConstValueF64(precomp), bytes, i << 3); } else { - writeF64(0, bytes, i << 3); vars[i] = expr; numVars++; }