Skip to content

Commit 77d0af2

Browse files
authoredApr 11, 2023
feat: Implement relaxed SIMD operations (#2681)
1 parent f7571a4 commit 77d0af2

12 files changed

+1322
-179
lines changed
 

‎cli/options.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -221,14 +221,14 @@
221221
" reference-types Reference types and operations.",
222222
" gc Garbage collection (WIP).",
223223
" stringref String reference types.",
224+
" relaxed-simd Relaxed SIMD operations.",
224225
""
225226
],
226227
"TODO_doesNothingYet": [
227228
" exception-handling Exception handling.",
228229
" tail-calls Tail call operations.",
229230
" multi-value Multi value types.",
230231
" memory64 Memory64 operations.",
231-
" relaxed-simd Relaxed SIMD operations.",
232232
" extended-const Extended const expressions."
233233
],
234234
"type": "S",

‎src/builtins.ts

+574-48
Large diffs are not rendered by default.

‎std/assembly/builtins.ts

+109-5
Original file line numberDiff line numberDiff line change
@@ -1562,6 +1562,50 @@ export namespace v128 {
15621562
// @ts-ignore: decorator
15631563
@builtin
15641564
export declare function extmul_high<T>(a: v128, b: v128): v128;
1565+
1566+
// @ts-ignore: decorator
1567+
@builtin
1568+
export declare function relaxed_swizzle(a: v128, s: v128): v128;
1569+
1570+
// @ts-ignore: decorator
1571+
@builtin
1572+
export declare function relaxed_trunc<T>(a: v128): v128;
1573+
1574+
// @ts-ignore: decorator
1575+
@builtin
1576+
export declare function relaxed_trunc_zero<T>(a: v128): v128;
1577+
1578+
// @ts-ignore: decorator
1579+
@builtin
1580+
export declare function relaxed_madd<T>(a: v128, b: v128, c: v128): v128;
1581+
1582+
// @ts-ignore: decorator
1583+
@builtin
1584+
export declare function relaxed_nmadd<T>(a: v128, b: v128, c: v128): v128;
1585+
1586+
// @ts-ignore: decorator
1587+
@builtin
1588+
export declare function relaxed_laneselect<T>(a: v128, b: v128, m: v128): v128;
1589+
1590+
// @ts-ignore: decorator
1591+
@builtin
1592+
export declare function relaxed_min<T>(a: v128, b: v128): v128;
1593+
1594+
// @ts-ignore: decorator
1595+
@builtin
1596+
export declare function relaxed_max<T>(a: v128, b: v128): v128;
1597+
1598+
// @ts-ignore: decorator
1599+
@builtin
1600+
export declare function relaxed_q15mulr<T>(a: v128, b: v128): v128;
1601+
1602+
// @ts-ignore: decorator
1603+
@builtin
1604+
export declare function relaxed_dot<T>(a: v128, b: v128): v128;
1605+
1606+
// @ts-ignore: decorator
1607+
@builtin
1608+
export declare function relaxed_dot_add<T>(a: v128, b: v128, c: v128): v128;
15651609
}
15661610

15671611
// @ts-ignore: decorator
@@ -1724,6 +1768,14 @@ export namespace i8x16 {
17241768
// @ts-ignore: decorator
17251769
@builtin
17261770
export declare function swizzle(a: v128, b: v128): v128;
1771+
1772+
// @ts-ignore: decorator
1773+
@builtin
1774+
export declare function relaxed_swizzle(a: v128, s: v128): v128;
1775+
1776+
// @ts-ignore: decorator
1777+
@builtin
1778+
export declare function relaxed_laneselect(a: v128, b: v128, m: v128): v128;
17271779
}
17281780

17291781
// @ts-ignore: decorator
@@ -1925,7 +1977,15 @@ export namespace i16x8 {
19251977

19261978
// @ts-ignore: decorator
19271979
@builtin
1928-
export declare function swizzle(a: v128, b: v128): v128;
1980+
export declare function relaxed_laneselect(a: v128, b: v128, m: v128): v128;
1981+
1982+
// @ts-ignore: decorator
1983+
@builtin
1984+
export declare function relaxed_q15mulr_s(a: v128, b: v128): v128;
1985+
1986+
// @ts-ignore: decorator
1987+
@builtin
1988+
export declare function relaxed_dot_i8x16_i7x16_s(a: v128, b: v128, c: v128): v128;
19291989
}
19301990

19311991
// @ts-ignore: decorator
@@ -2108,7 +2168,27 @@ export namespace i32x4 {
21082168

21092169
// @ts-ignore: decorator
21102170
@builtin
2111-
export declare function swizzle(a: v128, b: v128): v128;
2171+
export declare function relaxed_trunc_f32x4_s(a: v128): v128;
2172+
2173+
// @ts-ignore: decorator
2174+
@builtin
2175+
export declare function relaxed_trunc_f32x4_u(a: v128): v128;
2176+
2177+
// @ts-ignore: decorator
2178+
@builtin
2179+
export declare function relaxed_trunc_f64x2_s_zero(a: v128): v128;
2180+
2181+
// @ts-ignore: decorator
2182+
@builtin
2183+
export declare function relaxed_trunc_f64x2_u_zero(a: v128): v128;
2184+
2185+
// @ts-ignore: decorator
2186+
@builtin
2187+
export declare function relaxed_laneselect(a: v128, b: v128, m: v128): v128;
2188+
2189+
// @ts-ignore: decorator
2190+
@builtin
2191+
export declare function relaxed_dot_i8x16_i7x16_add_s(a: v128, b: v128, c: v128): v128;
21122192
}
21132193

21142194
// @ts-ignore: decorator
@@ -2231,7 +2311,7 @@ export namespace i64x2 {
22312311

22322312
// @ts-ignore: decorator
22332313
@builtin
2234-
export declare function swizzle(a: v128, b: v128): v128;
2314+
export declare function relaxed_laneselect(a: v128, b: v128, m: v128): v128;
22352315
}
22362316

22372317
// @ts-ignore: decorator
@@ -2354,7 +2434,19 @@ export namespace f32x4 {
23542434

23552435
// @ts-ignore: decorator
23562436
@builtin
2357-
export declare function swizzle(a: v128, b: v128): v128;
2437+
export declare function relaxed_madd(a: v128, b: v128, c: v128): v128;
2438+
2439+
// @ts-ignore: decorator
2440+
@builtin
2441+
export declare function relaxed_nmadd(a: v128, b: v128, c: v128): v128;
2442+
2443+
// @ts-ignore: decorator
2444+
@builtin
2445+
export declare function relaxed_min(a: v128, b: v128): v128;
2446+
2447+
// @ts-ignore: decorator
2448+
@builtin
2449+
export declare function relaxed_max(a: v128, b: v128): v128;
23582450
}
23592451

23602452
// @ts-ignore: decorator
@@ -2477,7 +2569,19 @@ export namespace f64x2 {
24772569

24782570
// @ts-ignore: decorator
24792571
@builtin
2480-
export declare function swizzle(a: v128, b: v128): v128;
2572+
export declare function relaxed_madd(a: v128, b: v128, c: v128): v128;
2573+
2574+
// @ts-ignore: decorator
2575+
@builtin
2576+
export declare function relaxed_nmadd(a: v128, b: v128, c: v128): v128;
2577+
2578+
// @ts-ignore: decorator
2579+
@builtin
2580+
export declare function relaxed_min(a: v128, b: v128): v128;
2581+
2582+
// @ts-ignore: decorator
2583+
@builtin
2584+
export declare function relaxed_max(a: v128, b: v128): v128;
24812585
}
24822586

24832587
@final

‎std/assembly/index.d.ts

+262-12
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
(module
2+
(type $none_=>_none (func))
3+
(global $features/relaxed-simd/v v128 (v128.const i32x4 0x00000000 0x00000000 0x00000000 0x00000000))
4+
(global $features/relaxed-simd/r (mut v128) (v128.const i32x4 0x00000000 0x00000000 0x00000000 0x00000000))
5+
(memory $0 0)
6+
(table $0 1 1 funcref)
7+
(elem $0 (i32.const 1))
8+
(export "memory" (memory $0))
9+
(start $~start)
10+
(func $start:features/relaxed-simd
11+
global.get $features/relaxed-simd/v
12+
global.get $features/relaxed-simd/v
13+
i8x16.relaxed_swizzle
14+
global.set $features/relaxed-simd/r
15+
global.get $features/relaxed-simd/v
16+
global.get $features/relaxed-simd/v
17+
i8x16.relaxed_swizzle
18+
global.set $features/relaxed-simd/r
19+
global.get $features/relaxed-simd/v
20+
i32x4.relaxed_trunc_f32x4_s
21+
global.set $features/relaxed-simd/r
22+
global.get $features/relaxed-simd/v
23+
i32x4.relaxed_trunc_f32x4_s
24+
global.set $features/relaxed-simd/r
25+
global.get $features/relaxed-simd/v
26+
i32x4.relaxed_trunc_f32x4_u
27+
global.set $features/relaxed-simd/r
28+
global.get $features/relaxed-simd/v
29+
i32x4.relaxed_trunc_f32x4_u
30+
global.set $features/relaxed-simd/r
31+
global.get $features/relaxed-simd/v
32+
i32x4.relaxed_trunc_f64x2_s_zero
33+
global.set $features/relaxed-simd/r
34+
global.get $features/relaxed-simd/v
35+
i32x4.relaxed_trunc_f64x2_s_zero
36+
global.set $features/relaxed-simd/r
37+
global.get $features/relaxed-simd/v
38+
i32x4.relaxed_trunc_f64x2_u_zero
39+
global.set $features/relaxed-simd/r
40+
global.get $features/relaxed-simd/v
41+
i32x4.relaxed_trunc_f64x2_u_zero
42+
global.set $features/relaxed-simd/r
43+
global.get $features/relaxed-simd/v
44+
global.get $features/relaxed-simd/v
45+
global.get $features/relaxed-simd/v
46+
f32x4.relaxed_fma
47+
global.set $features/relaxed-simd/r
48+
global.get $features/relaxed-simd/v
49+
global.get $features/relaxed-simd/v
50+
global.get $features/relaxed-simd/v
51+
f32x4.relaxed_fma
52+
global.set $features/relaxed-simd/r
53+
global.get $features/relaxed-simd/v
54+
global.get $features/relaxed-simd/v
55+
global.get $features/relaxed-simd/v
56+
f32x4.relaxed_fms
57+
global.set $features/relaxed-simd/r
58+
global.get $features/relaxed-simd/v
59+
global.get $features/relaxed-simd/v
60+
global.get $features/relaxed-simd/v
61+
f32x4.relaxed_fms
62+
global.set $features/relaxed-simd/r
63+
global.get $features/relaxed-simd/v
64+
global.get $features/relaxed-simd/v
65+
global.get $features/relaxed-simd/v
66+
f64x2.relaxed_fma
67+
global.set $features/relaxed-simd/r
68+
global.get $features/relaxed-simd/v
69+
global.get $features/relaxed-simd/v
70+
global.get $features/relaxed-simd/v
71+
f64x2.relaxed_fma
72+
global.set $features/relaxed-simd/r
73+
global.get $features/relaxed-simd/v
74+
global.get $features/relaxed-simd/v
75+
global.get $features/relaxed-simd/v
76+
f64x2.relaxed_fms
77+
global.set $features/relaxed-simd/r
78+
global.get $features/relaxed-simd/v
79+
global.get $features/relaxed-simd/v
80+
global.get $features/relaxed-simd/v
81+
f64x2.relaxed_fms
82+
global.set $features/relaxed-simd/r
83+
global.get $features/relaxed-simd/v
84+
global.get $features/relaxed-simd/v
85+
global.get $features/relaxed-simd/v
86+
i8x16.laneselect
87+
global.set $features/relaxed-simd/r
88+
global.get $features/relaxed-simd/v
89+
global.get $features/relaxed-simd/v
90+
global.get $features/relaxed-simd/v
91+
i8x16.laneselect
92+
global.set $features/relaxed-simd/r
93+
global.get $features/relaxed-simd/v
94+
global.get $features/relaxed-simd/v
95+
global.get $features/relaxed-simd/v
96+
i16x8.laneselect
97+
global.set $features/relaxed-simd/r
98+
global.get $features/relaxed-simd/v
99+
global.get $features/relaxed-simd/v
100+
global.get $features/relaxed-simd/v
101+
i16x8.laneselect
102+
global.set $features/relaxed-simd/r
103+
global.get $features/relaxed-simd/v
104+
global.get $features/relaxed-simd/v
105+
global.get $features/relaxed-simd/v
106+
i32x4.laneselect
107+
global.set $features/relaxed-simd/r
108+
global.get $features/relaxed-simd/v
109+
global.get $features/relaxed-simd/v
110+
global.get $features/relaxed-simd/v
111+
i32x4.laneselect
112+
global.set $features/relaxed-simd/r
113+
global.get $features/relaxed-simd/v
114+
global.get $features/relaxed-simd/v
115+
global.get $features/relaxed-simd/v
116+
i64x2.laneselect
117+
global.set $features/relaxed-simd/r
118+
global.get $features/relaxed-simd/v
119+
global.get $features/relaxed-simd/v
120+
global.get $features/relaxed-simd/v
121+
i64x2.laneselect
122+
global.set $features/relaxed-simd/r
123+
global.get $features/relaxed-simd/v
124+
global.get $features/relaxed-simd/v
125+
f32x4.relaxed_min
126+
global.set $features/relaxed-simd/r
127+
global.get $features/relaxed-simd/v
128+
global.get $features/relaxed-simd/v
129+
f32x4.relaxed_min
130+
global.set $features/relaxed-simd/r
131+
global.get $features/relaxed-simd/v
132+
global.get $features/relaxed-simd/v
133+
f32x4.relaxed_max
134+
global.set $features/relaxed-simd/r
135+
global.get $features/relaxed-simd/v
136+
global.get $features/relaxed-simd/v
137+
f32x4.relaxed_max
138+
global.set $features/relaxed-simd/r
139+
global.get $features/relaxed-simd/v
140+
global.get $features/relaxed-simd/v
141+
f64x2.relaxed_min
142+
global.set $features/relaxed-simd/r
143+
global.get $features/relaxed-simd/v
144+
global.get $features/relaxed-simd/v
145+
f64x2.relaxed_min
146+
global.set $features/relaxed-simd/r
147+
global.get $features/relaxed-simd/v
148+
global.get $features/relaxed-simd/v
149+
f64x2.relaxed_max
150+
global.set $features/relaxed-simd/r
151+
global.get $features/relaxed-simd/v
152+
global.get $features/relaxed-simd/v
153+
f64x2.relaxed_max
154+
global.set $features/relaxed-simd/r
155+
global.get $features/relaxed-simd/v
156+
global.get $features/relaxed-simd/v
157+
i16x8.relaxed_q15mulr_s
158+
global.set $features/relaxed-simd/r
159+
global.get $features/relaxed-simd/v
160+
global.get $features/relaxed-simd/v
161+
i16x8.relaxed_q15mulr_s
162+
global.set $features/relaxed-simd/r
163+
global.get $features/relaxed-simd/v
164+
global.get $features/relaxed-simd/v
165+
i16x8.dot_i8x16_i7x16_s
166+
global.set $features/relaxed-simd/r
167+
global.get $features/relaxed-simd/v
168+
global.get $features/relaxed-simd/v
169+
i16x8.dot_i8x16_i7x16_s
170+
global.set $features/relaxed-simd/r
171+
)
172+
(func $~start
173+
call $start:features/relaxed-simd
174+
)
175+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"asc_flags": [
3+
"--runtime stub"
4+
],
5+
"features": [
6+
"simd",
7+
"relaxed-simd"
8+
]
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
(module
2+
(memory $0 0)
3+
(export "memory" (memory $0))
4+
)
+83
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
const v = v128.splat<i32>(0);
2+
let r: v128;
3+
4+
r = i8x16.relaxed_swizzle(v, v);
5+
// ==
6+
r = v128.relaxed_swizzle(v, v);
7+
8+
r = i32x4.relaxed_trunc_f32x4_s(v);
9+
// ==
10+
r = v128.relaxed_trunc<i32>(v);
11+
12+
r = i32x4.relaxed_trunc_f32x4_u(v);
13+
// ==
14+
r = v128.relaxed_trunc<u32>(v);
15+
16+
r = i32x4.relaxed_trunc_f64x2_s_zero(v);
17+
// ==
18+
r = v128.relaxed_trunc_zero<i32>(v);
19+
20+
r = i32x4.relaxed_trunc_f64x2_u_zero(v);
21+
// ==
22+
r = v128.relaxed_trunc_zero<u32>(v);
23+
24+
r = f32x4.relaxed_madd(v, v, v);
25+
// ==
26+
r = v128.relaxed_madd<f32>(v, v, v);
27+
28+
r = f32x4.relaxed_nmadd(v, v, v);
29+
// ==
30+
r = v128.relaxed_nmadd<f32>(v, v, v);
31+
32+
r = f64x2.relaxed_madd(v, v, v);
33+
// ==
34+
r = v128.relaxed_madd<f64>(v, v, v);
35+
36+
r = f64x2.relaxed_nmadd(v, v, v);
37+
// ==
38+
r = v128.relaxed_nmadd<f64>(v, v, v);
39+
40+
r = i8x16.relaxed_laneselect(v, v, v);
41+
// ==
42+
r = v128.relaxed_laneselect<i8>(v, v, v);
43+
44+
r = i16x8.relaxed_laneselect(v, v, v);
45+
// ==
46+
r = v128.relaxed_laneselect<i16>(v, v, v);
47+
48+
r = i32x4.relaxed_laneselect(v, v, v);
49+
// ==
50+
r = v128.relaxed_laneselect<i32>(v, v, v);
51+
52+
r = i64x2.relaxed_laneselect(v, v, v);
53+
// ==
54+
r = v128.relaxed_laneselect<i64>(v, v, v);
55+
56+
r = f32x4.relaxed_min(v, v);
57+
// ==
58+
r = v128.relaxed_min<f32>(v, v);
59+
60+
r = f32x4.relaxed_max(v, v);
61+
// ==
62+
r = v128.relaxed_max<f32>(v, v);
63+
64+
r = f64x2.relaxed_min(v, v);
65+
// ==
66+
r = v128.relaxed_min<f64>(v, v);
67+
68+
r = f64x2.relaxed_max(v, v);
69+
// ==
70+
r = v128.relaxed_max<f64>(v, v);
71+
72+
r = i16x8.relaxed_q15mulr_s(v, v);
73+
// ==
74+
r = v128.relaxed_q15mulr<i16>(v, v);
75+
76+
r = i16x8.relaxed_dot_i8x16_i7x16_s(v, v);
77+
// ==
78+
r = v128.relaxed_dot<i16>(v, v);
79+
80+
// TODO: not yet implemented in binaryen/src/wasm-interpreter.h
81+
// r = i32x4.relaxed_dot_i8x16_i7x16_add_s(v, v, v);
82+
// // ==
83+
// r = v128.relaxed_dot_add<i32>(v, v, v);

‎tests/compiler/simd.debug.wat

+83-102
Large diffs are not rendered by default.

‎tests/compiler/simd.release.wat

+6-6
Original file line numberDiff line numberDiff line change
@@ -2297,7 +2297,7 @@
22972297
if
22982298
i32.const 0
22992299
i32.const 1552
2300-
i32.const 599
2300+
i32.const 594
23012301
i32.const 5
23022302
call $~lib/builtins/abort
23032303
unreachable
@@ -2311,7 +2311,7 @@
23112311
if
23122312
i32.const 0
23132313
i32.const 1552
2314-
i32.const 604
2314+
i32.const 599
23152315
i32.const 5
23162316
call $~lib/builtins/abort
23172317
unreachable
@@ -2349,7 +2349,7 @@
23492349
if
23502350
i32.const 0
23512351
i32.const 1552
2352-
i32.const 780
2352+
i32.const 775
23532353
i32.const 5
23542354
call $~lib/builtins/abort
23552355
unreachable
@@ -2363,7 +2363,7 @@
23632363
if
23642364
i32.const 0
23652365
i32.const 1552
2366-
i32.const 785
2366+
i32.const 780
23672367
i32.const 5
23682368
call $~lib/builtins/abort
23692369
unreachable
@@ -2395,7 +2395,7 @@
23952395
if
23962396
i32.const 0
23972397
i32.const 1552
2398-
i32.const 852
2398+
i32.const 847
23992399
i32.const 5
24002400
call $~lib/builtins/abort
24012401
unreachable
@@ -2409,7 +2409,7 @@
24092409
if
24102410
i32.const 0
24112411
i32.const 1552
2412-
i32.const 857
2412+
i32.const 852
24132413
i32.const 5
24142414
call $~lib/builtins/abort
24152415
unreachable

‎tests/compiler/simd.ts

-5
Original file line numberDiff line numberDiff line change
@@ -581,11 +581,6 @@ function test_i16x8(): void {
581581
==
582582
v128.shuffle<i16>(a, b, 0, 1, 2, 3, 12, 13, 14, 15)
583583
);
584-
assert(
585-
i16x8.swizzle(a, b)
586-
==
587-
v128.swizzle(a, b)
588-
);
589584
{
590585
let ptr = __alloc(16);
591586
store<i8>(ptr, 1);

‎tests/features.json

+16
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,21 @@
3232
"v8_flags": [
3333
"--experimental-wasm-eh"
3434
]
35+
},
36+
"simd": {
37+
"asc_flags": [
38+
"--enable simd"
39+
],
40+
"v8_flags": [
41+
"--experimental-wasm-simd"
42+
]
43+
},
44+
"relaxed-simd": {
45+
"asc_flags": [
46+
"--enable relaxed-simd"
47+
],
48+
"v8_flags": [
49+
"--experimental-wasm-relaxed-simd"
50+
]
3551
}
3652
}

0 commit comments

Comments
 (0)
Please sign in to comment.