diff --git a/src/builtins.ts b/src/builtins.ts index a3171074ef..fd7dfae38e 100644 --- a/src/builtins.ts +++ b/src/builtins.ts @@ -3542,20 +3542,39 @@ 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 - ); + 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++) { + let expr = vars[i]; + if (expr) vec = module.simd_replace(SIMDReplaceOp.ReplaceLaneI8x16, vec, i, expr); + } + return vec; + } } builtins.set(BuiltinNames.i8x16, builtin_i8x16); @@ -3573,20 +3592,39 @@ 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 - ); + 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++) { + let expr = vars[i]; + if (expr) vec = module.simd_replace(SIMDReplaceOp.ReplaceLaneI16x8, vec, i, expr); + } + return vec; + } } builtins.set(BuiltinNames.i16x8, builtin_i16x8); @@ -3604,20 +3642,39 @@ 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 - ); + 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++) { + let expr = vars[i]; + if (expr) vec = module.simd_replace(SIMDReplaceOp.ReplaceLaneI32x4, vec, i, expr); + } + return vec; + } } builtins.set(BuiltinNames.i32x4, builtin_i32x4); @@ -3635,22 +3692,41 @@ 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 - ); + 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++) { + let expr = vars[i]; + if (expr) vec = module.simd_replace(SIMDReplaceOp.ReplaceLaneI64x2, vec, i, expr); + } + return vec; + } } builtins.set(BuiltinNames.i64x2, builtin_i64x2); @@ -3668,20 +3744,39 @@ 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 - ); + 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++) { + let expr = vars[i]; + if (expr) vec = module.simd_replace(SIMDReplaceOp.ReplaceLaneF32x4, vec, i, expr); + } + return vec; + } } builtins.set(BuiltinNames.f32x4, builtin_f32x4); @@ -3699,20 +3794,39 @@ 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 - ); + 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++) { + let expr = vars[i]; + if (expr) vec = module.simd_replace(SIMDReplaceOp.ReplaceLaneF64x2, vec, i, expr); + } + return vec; + } } builtins.set(BuiltinNames.f64x2, builtin_f64x2); diff --git a/tests/compiler/simd.debug.wat b/tests/compiler/simd.debug.wat index d226d7e47d..3d25728865 100644 --- a/tests/compiler/simd.debug.wat +++ b/tests/compiler/simd.debug.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/native/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\0e\00\00\00s\00i\00m\00d\00.\00t\00s\00\00\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 $simd/test_vars_i8x16_partial)) + (export "test_vars_i8x16_full" (func $simd/test_vars_i8x16_full)) + (export "test_vars_i16x8_partial" (func $simd/test_vars_i16x8_partial)) + (export "test_vars_i16x8_full" (func $simd/test_vars_i16x8_full)) + (export "test_vars_i32x4_partial" (func $simd/test_vars_i32x4_partial)) + (export "test_vars_i32x4_full" (func $simd/test_vars_i32x4_full)) + (export "test_vars_i64x2_partial" (func $simd/test_vars_i64x2_partial)) + (export "test_vars_i64x2_full" (func $simd/test_vars_i64x2_full)) + (export "test_vars_f32x4_partial" (func $simd/test_vars_f32x4_partial)) + (export "test_vars_f32x4_full" (func $simd/test_vars_f32x4_full)) + (export "test_vars_f64x2_partial" (func $simd/test_vars_f64x2_partial)) + (export "test_vars_f64x2_full" (func $simd/test_vars_f64x2_full)) (export "memory" (memory $0)) (start $~start) (func $~lib/rt/tlsf/Root#set:flMap (param $0 i32) (param $1 i32) @@ -4645,6 +4667,136 @@ call $simd/test_const drop ) + (func $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 $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 $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 $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 $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 $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 $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 $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 $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 $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 $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 $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:simd ) diff --git a/tests/compiler/simd.release.wat b/tests/compiler/simd.release.wat index d017cdf643..1bab3c700b 100644 --- a/tests/compiler/simd.release.wat +++ b/tests/compiler/simd.release.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\0e\00\00\00s\00i\00m\00d\00.\00t\00s") + (export "test_vars_i8x16_partial" (func $simd/test_vars_i8x16_partial)) + (export "test_vars_i8x16_full" (func $simd/test_vars_i8x16_full)) + (export "test_vars_i16x8_partial" (func $simd/test_vars_i16x8_partial)) + (export "test_vars_i16x8_full" (func $simd/test_vars_i16x8_full)) + (export "test_vars_i32x4_partial" (func $simd/test_vars_i32x4_partial)) + (export "test_vars_i32x4_full" (func $simd/test_vars_i32x4_full)) + (export "test_vars_i64x2_partial" (func $simd/test_vars_i64x2_partial)) + (export "test_vars_i64x2_full" (func $simd/test_vars_i64x2_full)) + (export "test_vars_f32x4_partial" (func $simd/test_vars_f32x4_partial)) + (export "test_vars_f32x4_full" (func $simd/test_vars_f32x4_full)) + (export "test_vars_f64x2_partial" (func $simd/test_vars_f64x2_partial)) + (export "test_vars_f64x2_full" (func $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 $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 $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 $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 $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 $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 $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 $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 $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 $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 $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 $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 $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/simd.ts b/tests/compiler/simd.ts index 7abe0e8c82..857aa280a7 100644 --- a/tests/compiler/simd.ts +++ b/tests/compiler/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();