From 34195ceee25c7fda65ff0251fb313c3d2bd9f832 Mon Sep 17 00:00:00 2001 From: Larry Ewing Date: Wed, 30 Apr 2025 14:09:51 -0500 Subject: [PATCH 1/5] Enable System.Runtime.Intrinsics/tests in wasm smoke tests --- src/libraries/tests.proj | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/libraries/tests.proj b/src/libraries/tests.proj index bbb83077d16210..7b75a90fd0aa00 100644 --- a/src/libraries/tests.proj +++ b/src/libraries/tests.proj @@ -578,6 +578,11 @@ + + + )" + + From bf2e29297fb42d6710900158c26aa431f5a381b6 Mon Sep 17 00:00:00 2001 From: Larry Ewing Date: Wed, 30 Apr 2025 14:18:59 -0500 Subject: [PATCH 2/5] Update tests.proj --- src/libraries/tests.proj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libraries/tests.proj b/src/libraries/tests.proj index 7b75a90fd0aa00..9542dfc140bf80 100644 --- a/src/libraries/tests.proj +++ b/src/libraries/tests.proj @@ -579,7 +579,7 @@ - + )" From 7ef0cdf67b2ada51820666b87ffa665c0c1b1a9e Mon Sep 17 00:00:00 2001 From: Larry Ewing Date: Wed, 30 Apr 2025 14:19:52 -0500 Subject: [PATCH 3/5] Update tests.proj --- src/libraries/tests.proj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libraries/tests.proj b/src/libraries/tests.proj index 9542dfc140bf80..14945aa2237f61 100644 --- a/src/libraries/tests.proj +++ b/src/libraries/tests.proj @@ -580,7 +580,7 @@ - )" + From a4bd250633ade27e21b92daa0ddc0a0d1a8ed5a8 Mon Sep 17 00:00:00 2001 From: Larry Ewing Date: Sun, 4 May 2025 12:23:57 -0500 Subject: [PATCH 4/5] Reimplement swizzle in terms of swizzle --- src/mono/mono/mini/mini-llvm.c | 35 +++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/src/mono/mono/mini/mini-llvm.c b/src/mono/mono/mini/mini-llvm.c index 8aa11b4868dfc9..b619feb93c3737 100644 --- a/src/mono/mono/mini/mini-llvm.c +++ b/src/mono/mono/mini/mini-llvm.c @@ -10449,20 +10449,29 @@ MONO_RESTORE_WARNING break; } case OP_WASM_SIMD_SWIZZLE: { + LLVMValueRef bidx = LLVMBuildBitCast (builder, rhs, LLVMVectorType (i1_t, 16), ""); int nelems = LLVMGetVectorSize (LLVMTypeOf (lhs)); - if (nelems == 16) { - LLVMValueRef args [] = { lhs, rhs }; - values [ins->dreg] = call_intrins (ctx, INTRINS_WASM_SWIZZLE, args, ""); - break; - } - - LLVMValueRef indexes [16]; - for (int i = 0; i < nelems; ++i) - indexes [i] = LLVMBuildExtractElement (builder, rhs, const_int32 (i), ""); - LLVMValueRef shuffle_val = LLVMConstNull (LLVMVectorType (i4_t, nelems)); - for (int i = 0; i < nelems; ++i) - shuffle_val = LLVMBuildInsertElement (builder, shuffle_val, convert (ctx, indexes [i], i4_t), const_int32 (i), ""); - values [ins->dreg] = LLVMBuildShuffleVector (builder, lhs, LLVMGetUndef (LLVMTypeOf (lhs)), shuffle_val, ""); + if (nelems < 16) { + int shift = nelems == 8 ? 1 : (nelems == 4 ? 2 : 3); + LLVMValueRef fill = LLVMConstNull (LLVMVectorType (i1_t, 16)); + LLVMValueRef offset = LLVMConstNull (LLVMVectorType (i1_t, 16)); + int stride = 16 / nelems; + for (int i = 0; i < nelems; ++i) { + for (int j = 0; j < stride; ++j) { + offset = LLVMBuildInsertElement (builder, offset, const_int8 (j), const_int8 (i * stride + j), ""); + fill = LLVMBuildInsertElement (builder, fill, const_int8 (i * stride), const_int8 (i * stride + j), ""); + } + } + LLVMValueRef shiftv = create_shift_vector (ctx, bidx, const_int32 (shift)); + bidx = LLVMBuildShl (builder, bidx, shiftv, ""); + LLVMValueRef args [] = { bidx, fill }; + bidx = call_intrins (ctx, INTRINS_WASM_SWIZZLE, args, ""); + bidx = LLVMBuildAdd (builder, bidx, offset, ""); + } + LLVMValueRef lhs_b = LLVMBuildBitCast (builder, lhs, LLVMVectorType (i1_t, 16), ""); + LLVMValueRef args [] = { lhs_b, bidx }; + LLVMValueRef result_b = call_intrins (ctx, INTRINS_WASM_SWIZZLE, args, ""); + values [ins->dreg] = LLVMBuildBitCast (builder, result_b, LLVMTypeOf (lhs), ""); break; } case OP_WASM_EXTRACT_NARROW: { From c1f834622c461ce98e8530dd31056f41def4225b Mon Sep 17 00:00:00 2001 From: Larry Ewing Date: Sun, 4 May 2025 12:34:30 -0500 Subject: [PATCH 5/5] Fix the aot min/max intrinsics --- src/mono/mono/mini/simd-intrinsics.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mono/mono/mini/simd-intrinsics.c b/src/mono/mono/mini/simd-intrinsics.c index f9d8d4b59ef559..f5da2fff2e5a3c 100644 --- a/src/mono/mono/mini/simd-intrinsics.c +++ b/src/mono/mono/mini/simd-intrinsics.c @@ -6152,8 +6152,8 @@ static SimdIntrinsic packedsimd_methods [] = { {SN_LoadScalarVector128}, {SN_LoadVector128, OP_LOADX_MEMBASE}, {SN_LoadWideningVector128, OP_WASM_SIMD_LOAD_WIDENING}, - {SN_Max, OP_XBINOP, OP_IMIN, OP_XBINOP, OP_IMIN_UN, OP_XBINOP, OP_FMIN}, - {SN_Min, OP_XBINOP, OP_IMAX, OP_XBINOP, OP_IMAX_UN, OP_XBINOP, OP_FMAX}, + {SN_Max, OP_XBINOP, OP_IMAX, OP_XBINOP, OP_IMAX_UN, OP_XBINOP, OP_FMAX}, + {SN_Min, OP_XBINOP, OP_IMIN, OP_XBINOP, OP_IMIN_UN, OP_XBINOP, OP_FMIN}, {SN_Multiply}, {SN_MultiplyRoundedSaturateQ15, OP_XOP_X_X_X, INTRINS_WASM_Q15MULR_SAT_SIGNED}, {SN_MultiplyWideningLower, OP_WASM_EXTMUL_LOWER, 0, OP_WASM_EXTMUL_LOWER_U},