Skip to content

Commit 8a071a2

Browse files
authored
[wasm][jiterp] RelaxedSimd jiterpreter intrinsics (#115444)
Allow the Jiterpreter to use the potentially faster relaxed_swizzle in the case where we know the swizzle indices are valid and can detect at runtime the opcode is supported.
1 parent 9579c58 commit 8a071a2

File tree

5 files changed

+36
-4
lines changed

5 files changed

+36
-4
lines changed

src/mono/browser/runtime/jiterpreter-opcodes.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,7 @@ export const enum WasmSimdOpcode {
289289
v128_const = 0x0c,
290290
i8x16_shuffle = 0x0d,
291291
i8x16_swizzle = 0x0e,
292+
i8x16_relaxed_swizzle = 0x100,
292293
i8x16_splat = 0x0f,
293294
i16x8_splat = 0x10,
294295
i32x4_splat = 0x11,
@@ -466,6 +467,8 @@ export const enum WasmSimdOpcode {
466467
f64x2_pmax = 0xf7,
467468
i32x4_trunc_sat_f32x4_s = 0xf8,
468469
i32x4_trunc_sat_f32x4_u = 0xf9,
470+
i32x4_relaxed_trunc_f32x4_s = 0x101,
471+
i32x4_relaxed_trunc_f32x4_u = 0x102,
469472
f32x4_convert_i32x4_s = 0xfa,
470473
f32x4_convert_i32x4_u = 0xfb,
471474
v128_load32_zero = 0x5c,
@@ -483,6 +486,7 @@ export const enum WasmSimdOpcode {
483486
i64x2_extmul_low_i32x4_u = 0xde,
484487
i64x2_extmul_high_i32x4_u = 0xdf,
485488
i16x8_q15mulr_sat_s = 0x82,
489+
i16x8_relaxed_q15mulr_sat_s = 0x111,
486490
v128_any_true = 0x53,
487491
v128_load8_lane = 0x54,
488492
v128_load16_lane = 0x55,
@@ -503,13 +507,30 @@ export const enum WasmSimdOpcode {
503507
f64x2_convert_low_i32x4_u = 0xff,
504508
i32x4_trunc_sat_f64x2_s_zero = 0xfc,
505509
i32x4_trunc_sat_f64x2_u_zero = 0xfd,
510+
i32x4_relaxed_trunc_f64_s_zero = 0x103,
511+
i32x4_relaxed_trunc_f64_u_zero = 0x104,
506512
f32x4_demote_f64x2_zero = 0x5e,
507513
f64x2_promote_low_f32x4 = 0x5f,
508514
i8x16_popcnt = 0x62,
509515
i16x8_extadd_pairwise_i8x16_s = 0x7c,
510516
i16x8_extadd_pairwise_i8x16_u = 0x7d,
511517
i32x4_extadd_pairwise_i16x8_s = 0x7e,
512518
i32x4_extadd_pairwise_i16x8_u = 0x7f,
519+
f32x4_relaxed_madd = 0x105,
520+
f32x4_relaxed_mnadd = 0x106,
521+
f64x2_relaxed_madd = 0x107,
522+
f64x2_relaxed_mnadd = 0x108,
523+
i8x16_relaxed_lane_select = 0x109,
524+
i16x8_relaxed_lane_select = 0x10a,
525+
i32x4_relaxed_lane_select = 0x10b,
526+
i64x2_relaxed_lane_select = 0x10c,
527+
f32x4_relaxed_min = 0x10d,
528+
f32x4_relaxed_max = 0x10e,
529+
f64x2_relaxed_min = 0x10f,
530+
f64x2_relaxed_max = 0x110,
531+
i16x8_relaxed_dot_i8x16_i7x16_s = 0x112,
532+
i16x8_relaxed_dot_i8x16_i7x16_u = 0x113,
533+
i32x4_relaxed_dot_i8x16_i7x16_s = 0x114,
513534
}
514535

515536
export const enum WasmAtomicOpcode {

src/mono/browser/runtime/jiterpreter-trace-generator.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3919,7 +3919,11 @@ function emit_shuffle (builder: WasmBuilder, ip: MintOpcodePtr, elementCount: nu
39193919
for (let j = 0; j < elementSize; j++)
39203920
builder.appendU8(i);
39213921
}
3922-
builder.appendSimd(WasmSimdOpcode.i8x16_swizzle);
3922+
if (runtimeHelpers.featureWasmRelaxedSimd) {
3923+
builder.appendSimd(WasmSimdOpcode.i8x16_relaxed_swizzle);
3924+
} else {
3925+
builder.appendSimd(WasmSimdOpcode.i8x16_swizzle);
3926+
}
39233927
// multiply indices by 2 or 4 to scale from elt indices to byte indices
39243928
builder.i32_const(elementCount === 4 ? 2 : 1);
39253929
builder.appendSimd(WasmSimdOpcode.i8x16_shl);

src/mono/browser/runtime/loader/globals.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
/* eslint-disable @typescript-eslint/triple-slash-reference */
55
/// <reference path="../types/sidecar.d.ts" />
66

7-
import { exceptions, simd } from "wasm-feature-detect";
7+
import { exceptions, simd, relaxedSimd } from "wasm-feature-detect";
88

99
import gitHash from "consts:gitHash";
1010

@@ -133,6 +133,7 @@ export function setLoaderGlobals (
133133
// from wasm-feature-detect npm package
134134
exceptions,
135135
simd,
136+
relaxedSimd
136137
};
137138
Object.assign(runtimeHelpers, rh);
138139
Object.assign(loaderHelpers, lh);

src/mono/browser/runtime/startup.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -519,8 +519,12 @@ async function instantiate_wasm_module (
519519
}
520520

521521
async function ensureUsedWasmFeatures () {
522-
runtimeHelpers.featureWasmSimd = await loaderHelpers.simd();
523-
runtimeHelpers.featureWasmEh = await loaderHelpers.exceptions();
522+
const simd = loaderHelpers.simd();
523+
const relaxedSimd = loaderHelpers.relaxedSimd();
524+
const exceptions = loaderHelpers.exceptions();
525+
runtimeHelpers.featureWasmSimd = await simd;
526+
runtimeHelpers.featureWasmRelaxedSimd = await relaxedSimd;
527+
runtimeHelpers.featureWasmEh = await exceptions;
524528
if (runtimeHelpers.emscriptenBuildOptions.wasmEnableSIMD) {
525529
mono_assert(runtimeHelpers.featureWasmSimd, "This browser/engine doesn't support WASM SIMD. Please use a modern version. See also https://aka.ms/dotnet-wasm-features");
526530
}

src/mono/browser/runtime/types/internal.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ export type LoaderHelpers = {
179179
// from wasm-feature-detect npm package
180180
exceptions: () => Promise<boolean>,
181181
simd: () => Promise<boolean>,
182+
relaxedSimd: () => Promise<boolean>,
182183
}
183184
export type RuntimeHelpers = {
184185
emscriptenBuildOptions: EmscriptenBuildOptions,
@@ -232,6 +233,7 @@ export type RuntimeHelpers = {
232233

233234
featureWasmEh: boolean,
234235
featureWasmSimd: boolean,
236+
featureWasmRelaxedSimd: boolean,
235237

236238
//core
237239
stringify_as_error_with_stack?: (error: any) => string,

0 commit comments

Comments
 (0)