Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit e8ed2dd

Browse files
authoredAug 15, 2022
feat: Add simd shuffle / swizzle aliases for i16x8, i32x4, i64x2, f32x4 and f64x2 (#2368)
1 parent 847dbde commit e8ed2dd

File tree

6 files changed

+320
-91
lines changed

6 files changed

+320
-91
lines changed
 

‎src/builtins.ts

+95-1
Original file line numberDiff line numberDiff line change
@@ -541,6 +541,8 @@ export namespace BuiltinNames {
541541
export const i16x8_extmul_low_i8x16_u = "~lib/builtins/i16x8.extmul_low_i8x16_u";
542542
export const i16x8_extmul_high_i8x16_s = "~lib/builtins/i16x8.extmul_high_i8x16_s";
543543
export const i16x8_extmul_high_i8x16_u = "~lib/builtins/i16x8.extmul_high_i8x16_u";
544+
export const i16x8_shuffle = "~lib/builtins/i16x8.shuffle";
545+
export const i16x8_swizzle = "~lib/builtins/i16x8.swizzle";
544546

545547
export const i32x4_splat = "~lib/builtins/i32x4.splat";
546548
export const i32x4_extract_lane = "~lib/builtins/i32x4.extract_lane";
@@ -584,6 +586,8 @@ export namespace BuiltinNames {
584586
export const i32x4_extmul_low_i16x8_u = "~lib/builtins/i32x4.extmul_low_i16x8_u";
585587
export const i32x4_extmul_high_i16x8_s = "~lib/builtins/i32x4.extmul_high_i16x8_s";
586588
export const i32x4_extmul_high_i16x8_u = "~lib/builtins/i32x4.extmul_high_i16x8_u";
589+
export const i32x4_shuffle = "~lib/builtins/i32x4.shuffle";
590+
export const i32x4_swizzle = "~lib/builtins/i32x4.swizzle";
587591

588592
export const i64x2_splat = "~lib/builtins/i64x2.splat";
589593
export const i64x2_extract_lane = "~lib/builtins/i64x2.extract_lane";
@@ -616,6 +620,8 @@ export namespace BuiltinNames {
616620
export const i64x2_extmul_low_i32x4_u = "~lib/builtins/i64x2.extmul_low_i32x4_u";
617621
export const i64x2_extmul_high_i32x4_s = "~lib/builtins/i64x2.extmul_high_i32x4_s";
618622
export const i64x2_extmul_high_i32x4_u = "~lib/builtins/i64x2.extmul_high_i32x4_u";
623+
export const i64x2_shuffle = "~lib/builtins/i64x2.shuffle";
624+
export const i64x2_swizzle = "~lib/builtins/i64x2.swizzle";
619625

620626
export const f32x4_splat = "~lib/builtins/f32x4.splat";
621627
export const f32x4_extract_lane = "~lib/builtins/f32x4.extract_lane";
@@ -644,6 +650,8 @@ export namespace BuiltinNames {
644650
export const f32x4_convert_i32x4_s = "~lib/builtins/f32x4.convert_i32x4_s";
645651
export const f32x4_convert_i32x4_u = "~lib/builtins/f32x4.convert_i32x4_u";
646652
export const f32x4_demote_f64x2_zero = "~lib/builtins/f32x4.demote_f64x2_zero";
653+
export const f32x4_shuffle = "~lib/builtins/f32x4.shuffle";
654+
export const f32x4_swizzle = "~lib/builtins/f32x4.swizzle";
647655

648656
export const f64x2_splat = "~lib/builtins/f64x2.splat";
649657
export const f64x2_extract_lane = "~lib/builtins/f64x2.extract_lane";
@@ -672,6 +680,8 @@ export namespace BuiltinNames {
672680
export const f64x2_convert_low_i32x4_s = "~lib/builtins/f64x2.convert_low_i32x4_s";
673681
export const f64x2_convert_low_i32x4_u = "~lib/builtins/f64x2.convert_low_i32x4_u";
674682
export const f64x2_promote_low_f32x4 = "~lib/builtins/f64x2.promote_low_f32x4";
683+
export const f64x2_shuffle = "~lib/builtins/f64x2.shuffle";
684+
export const f64x2_swizzle = "~lib/builtins/f64x2.swizzle";
675685

676686
export const i31_new = "~lib/builtins/i31.new";
677687
export const i31_get = "~lib/builtins/i31.get";
@@ -8337,7 +8347,6 @@ builtins.set(BuiltinNames.i8x16_shuffle, builtin_i8x16_shuffle);
83378347

83388348
// i8x16.swizzle -> v128.swizzle
83398349
function builtin_i8x16_swizzle(ctx: BuiltinContext): ExpressionRef {
8340-
checkTypeAbsent(ctx);
83418350
ctx.typeArguments = null;
83428351
ctx.contextualType = Type.v128;
83438352
return builtin_v128_swizzle(ctx);
@@ -8758,6 +8767,23 @@ function builtin_i16x8_extmul_high_i8x16_u(ctx: BuiltinContext): ExpressionRef {
87588767
}
87598768
builtins.set(BuiltinNames.i16x8_extmul_high_i8x16_u, builtin_i16x8_extmul_high_i8x16_u);
87608769

8770+
// i16x8.shuffle -> v128.shuffle<i16>
8771+
function builtin_i16x8_shuffle(ctx: BuiltinContext): ExpressionRef {
8772+
checkTypeAbsent(ctx);
8773+
ctx.typeArguments = [ Type.i16 ];
8774+
ctx.contextualType = Type.v128;
8775+
return builtin_v128_shuffle(ctx);
8776+
}
8777+
builtins.set(BuiltinNames.i16x8_shuffle, builtin_i16x8_shuffle);
8778+
8779+
// i16x8.swizzle -> v128.swizzle
8780+
function builtin_i16x8_swizzle(ctx: BuiltinContext): ExpressionRef {
8781+
ctx.typeArguments = null;
8782+
ctx.contextualType = Type.v128;
8783+
return builtin_v128_swizzle(ctx);
8784+
}
8785+
builtins.set(BuiltinNames.i16x8_swizzle, builtin_i16x8_swizzle);
8786+
87618787
// i32x4.splat -> v128.splat<i32>
87628788
function builtin_i32x4_splat(ctx: BuiltinContext): ExpressionRef {
87638789
checkTypeAbsent(ctx);
@@ -9136,6 +9162,23 @@ function builtin_i32x4_extmul_high_i16x8_u(ctx: BuiltinContext): ExpressionRef {
91369162
}
91379163
builtins.set(BuiltinNames.i32x4_extmul_high_i16x8_u, builtin_i32x4_extmul_high_i16x8_u);
91389164

9165+
// i32x4.shuffle -> v128.shuffle<i32>
9166+
function builtin_i32x4_shuffle(ctx: BuiltinContext): ExpressionRef {
9167+
checkTypeAbsent(ctx);
9168+
ctx.typeArguments = [ Type.i32 ];
9169+
ctx.contextualType = Type.v128;
9170+
return builtin_v128_shuffle(ctx);
9171+
}
9172+
builtins.set(BuiltinNames.i32x4_shuffle, builtin_i32x4_shuffle);
9173+
9174+
// i32x4.swizzle -> v128.swizzle
9175+
function builtin_i32x4_swizzle(ctx: BuiltinContext): ExpressionRef {
9176+
ctx.typeArguments = null;
9177+
ctx.contextualType = Type.v128;
9178+
return builtin_v128_swizzle(ctx);
9179+
}
9180+
builtins.set(BuiltinNames.i32x4_swizzle, builtin_i32x4_swizzle);
9181+
91399182
// i64x2.splat -> v128.splat<i64>
91409183
function builtin_i64x2_splat(ctx: BuiltinContext): ExpressionRef {
91419184
checkTypeAbsent(ctx);
@@ -9379,6 +9422,23 @@ function builtin_i64x2_extmul_high_i32x4_u(ctx: BuiltinContext): ExpressionRef {
93799422
}
93809423
builtins.set(BuiltinNames.i64x2_extmul_high_i32x4_u, builtin_i64x2_extmul_high_i32x4_u);
93819424

9425+
// i64x2.shuffle -> v128.shuffle<i64>
9426+
function builtin_i64x2_shuffle(ctx: BuiltinContext): ExpressionRef {
9427+
checkTypeAbsent(ctx);
9428+
ctx.typeArguments = [ Type.i64 ];
9429+
ctx.contextualType = Type.v128;
9430+
return builtin_v128_shuffle(ctx);
9431+
}
9432+
builtins.set(BuiltinNames.i64x2_shuffle, builtin_i64x2_shuffle);
9433+
9434+
// i64x2.swizzle -> v128.swizzle
9435+
function builtin_i64x2_swizzle(ctx: BuiltinContext): ExpressionRef {
9436+
ctx.typeArguments = null;
9437+
ctx.contextualType = Type.v128;
9438+
return builtin_v128_swizzle(ctx);
9439+
}
9440+
builtins.set(BuiltinNames.i64x2_swizzle, builtin_i64x2_swizzle);
9441+
93829442
// f32x4.splat -> v128.splat<f32>
93839443
function builtin_f32x4_splat(ctx: BuiltinContext): ExpressionRef {
93849444
checkTypeAbsent(ctx);
@@ -9622,6 +9682,23 @@ function builtin_f32x4_demote_f64x2_zero(ctx: BuiltinContext): ExpressionRef {
96229682
}
96239683
builtins.set(BuiltinNames.f32x4_demote_f64x2_zero, builtin_f32x4_demote_f64x2_zero);
96249684

9685+
// f32x4.shuffle -> v128.shuffle<f32>
9686+
function builtin_f32x4_shuffle(ctx: BuiltinContext): ExpressionRef {
9687+
checkTypeAbsent(ctx);
9688+
ctx.typeArguments = [ Type.f32 ];
9689+
ctx.contextualType = Type.v128;
9690+
return builtin_v128_shuffle(ctx);
9691+
}
9692+
builtins.set(BuiltinNames.f32x4_shuffle, builtin_f32x4_shuffle);
9693+
9694+
// f32x4.swizzle -> v128.swizzle
9695+
function builtin_f32x4_swizzle(ctx: BuiltinContext): ExpressionRef {
9696+
ctx.typeArguments = null;
9697+
ctx.contextualType = Type.v128;
9698+
return builtin_v128_swizzle(ctx);
9699+
}
9700+
builtins.set(BuiltinNames.f32x4_swizzle, builtin_f32x4_swizzle);
9701+
96259702
// f64x2.splat -> v128.splat<f64>
96269703
function builtin_f64x2_splat(ctx: BuiltinContext): ExpressionRef {
96279704
checkTypeAbsent(ctx);
@@ -9865,6 +9942,23 @@ function builtin_f64x4_promote_low_f32x4(ctx: BuiltinContext): ExpressionRef {
98659942
}
98669943
builtins.set(BuiltinNames.f64x2_promote_low_f32x4, builtin_f64x4_promote_low_f32x4);
98679944

9945+
// f64x2.shuffle -> v128.shuffle<f32>
9946+
function builtin_f64x2_shuffle(ctx: BuiltinContext): ExpressionRef {
9947+
checkTypeAbsent(ctx);
9948+
ctx.typeArguments = [ Type.f64 ];
9949+
ctx.contextualType = Type.v128;
9950+
return builtin_v128_shuffle(ctx);
9951+
}
9952+
builtins.set(BuiltinNames.f64x2_shuffle, builtin_f64x2_shuffle);
9953+
9954+
// f64x2.swizzle -> v128.swizzle
9955+
function builtin_f64x2_swizzle(ctx: BuiltinContext): ExpressionRef {
9956+
ctx.typeArguments = null;
9957+
ctx.contextualType = Type.v128;
9958+
return builtin_v128_swizzle(ctx);
9959+
}
9960+
builtins.set(BuiltinNames.f64x2_swizzle, builtin_f64x2_swizzle);
9961+
98689962
// === Internal helpers =======================================================================
98699963

98709964
/** Compiles the `visit_globals` function. */

‎std/assembly/builtins.ts

+45-2
Original file line numberDiff line numberDiff line change
@@ -1177,7 +1177,7 @@ export namespace v128 {
11771177

11781178
// @ts-ignore: decorator
11791179
@builtin
1180-
export declare function swizzle(a: v128, s: v128): v128;
1180+
export declare function swizzle(a: v128, b: v128): v128;
11811181

11821182
// @ts-ignore: decorator
11831183
@unsafe @builtin
@@ -1647,7 +1647,7 @@ export namespace i8x16 {
16471647

16481648
// @ts-ignore: decorator
16491649
@builtin
1650-
export declare function swizzle(a: v128, s: v128): v128;
1650+
export declare function swizzle(a: v128, b: v128): v128;
16511651
}
16521652

16531653
// @ts-ignore: decorator
@@ -1839,6 +1839,17 @@ export namespace i16x8 {
18391839
// @ts-ignore: decorator
18401840
@builtin
18411841
export declare function extmul_high_i8x16_u(a: v128, b: v128): v128;
1842+
1843+
// @ts-ignore: decorator
1844+
@builtin
1845+
export declare function shuffle(
1846+
a: v128, b: v128,
1847+
l0: u8, l1: u8, l2: u8, l3: u8, l4: u8, l5: u8, l6: u8, l7: u8
1848+
): v128;
1849+
1850+
// @ts-ignore: decorator
1851+
@builtin
1852+
export declare function swizzle(a: v128, b: v128): v128;
18421853
}
18431854

18441855
// @ts-ignore: decorator
@@ -2014,6 +2025,14 @@ export namespace i32x4 {
20142025
// @ts-ignore: decorator
20152026
@builtin
20162027
export declare function extmul_high_i16x8_u(a: v128, b: v128): v128;
2028+
2029+
// @ts-ignore: decorator
2030+
@builtin
2031+
export declare function shuffle(a: v128, b: v128, l0: u8, l1: u8, l2: u8, l3: u8): v128;
2032+
2033+
// @ts-ignore: decorator
2034+
@builtin
2035+
export declare function swizzle(a: v128, b: v128): v128;
20172036
}
20182037

20192038
// @ts-ignore: decorator
@@ -2129,6 +2148,14 @@ export namespace i64x2 {
21292148
// @ts-ignore: decorator
21302149
@builtin
21312150
export declare function extmul_high_i32x4_u(a: v128, b: v128): v128;
2151+
2152+
// @ts-ignore: decorator
2153+
@builtin
2154+
export declare function shuffle(a: v128, b: v128, l0: u8, l1: u8): v128;
2155+
2156+
// @ts-ignore: decorator
2157+
@builtin
2158+
export declare function swizzle(a: v128, b: v128): v128;
21322159
}
21332160

21342161
// @ts-ignore: decorator
@@ -2244,6 +2271,14 @@ export namespace f32x4 {
22442271
// @ts-ignore: decorator
22452272
@builtin
22462273
export declare function demote_f64x2_zero(a: v128): v128;
2274+
2275+
// @ts-ignore: decorator
2276+
@builtin
2277+
export declare function shuffle(a: v128, b: v128, l0: u8, l1: u8, l2: u8, l3: u8): v128;
2278+
2279+
// @ts-ignore: decorator
2280+
@builtin
2281+
export declare function swizzle(a: v128, b: v128): v128;
22472282
}
22482283

22492284
// @ts-ignore: decorator
@@ -2359,6 +2394,14 @@ export namespace f64x2 {
23592394
// @ts-ignore: decorator
23602395
@builtin
23612396
export declare function promote_low_f32x4(a: v128): v128;
2397+
2398+
// @ts-ignore: decorator
2399+
@builtin
2400+
export declare function shuffle(a: v128, b: v128, l0: u8, l1: u8): v128;
2401+
2402+
// @ts-ignore: decorator
2403+
@builtin
2404+
export declare function swizzle(a: v128, b: v128): v128;
23622405
}
23632406

23642407
@final

‎std/assembly/index.d.ts

+20
Original file line numberDiff line numberDiff line change
@@ -1075,6 +1075,10 @@ declare namespace i16x8 {
10751075
export function extmul_high_i8x16_s(a: v128, b: v128): v128;
10761076
/** Performs the lane-wise 8-bit unsigned integer extended multiplication of the eight higher lanes producing twice wider 16-bit integer results. */
10771077
export function extmul_high_i8x16_u(a: v128, b: v128): v128;
1078+
/** Selects 16-bit lanes from either vector according to the specified [0-7] respectively [8-15] lane indexes. */
1079+
export function shuffle(a: v128, b: v128, l0: u8, l1: u8, l2: u8, l3: u8, l4: u8, l5: u8, l6: u8, l7: u8): v128;
1080+
/** Selects 8-bit lanes from the first vector according to the indexes [0-15] specified by the 8-bit lanes of the second vector. */
1081+
export function swizzle(a: v128, s: v128): v128;
10781082
}
10791083
/** Initializes a 128-bit vector from four 32-bit integer values. Arguments must be compile-time constants. */
10801084
declare function i32x4(a: i32, b: i32, c: i32, d: i32): v128;
@@ -1163,6 +1167,10 @@ declare namespace i32x4 {
11631167
export function extmul_high_i16x8_s(a: v128, b: v128): v128;
11641168
/** Performs the lane-wise 16-bit unsigned integer extended multiplication of the four higher lanes producing twice wider 32-bit integer results. */
11651169
export function extmul_high_i16x8_u(a: v128, b: v128): v128;
1170+
/** Selects 32-bit lanes from either vector according to the specified [0-3] respectively [4-7] lane indexes. */
1171+
export function shuffle(a: v128, b: v128, l0: u8, l1: u8, l2: u8, l3: u8): v128;
1172+
/** Selects 8-bit lanes from the first vector according to the indexes [0-15] specified by the 8-bit lanes of the second vector. */
1173+
export function swizzle(a: v128, s: v128): v128;
11661174
}
11671175
/** Initializes a 128-bit vector from two 64-bit integer values. Arguments must be compile-time constants. */
11681176
declare function i64x2(a: i64, b: i64): v128;
@@ -1221,6 +1229,10 @@ declare namespace i64x2 {
12211229
export function extmul_high_i32x4_s(a: v128, b: v128): v128;
12221230
/** Performs the lane-wise 32-bit unsigned integer extended multiplication of the two higher lanes producing twice wider 64-bit integer results. */
12231231
export function extmul_high_i32x4_u(a: v128, b: v128): v128;
1232+
/** Selects 64-bit lanes from either vector according to the specified [0-1] respectively [2-3] lane indexes. */
1233+
export function shuffle(a: v128, b: v128, l0: u8, l1: u8): v128;
1234+
/** Selects 8-bit lanes from the first vector according to the indexes [0-15] specified by the 8-bit lanes of the second vector. */
1235+
export function swizzle(a: v128, s: v128): v128;
12241236
}
12251237
/** Initializes a 128-bit vector from four 32-bit float values. Arguments must be compile-time constants. */
12261238
declare function f32x4(a: f32, b: f32, c: f32, d: f32): v128;
@@ -1279,6 +1291,10 @@ declare namespace f32x4 {
12791291
export function convert_i32x4_u(a: v128): v128;
12801292
/** Demotes each 64-bit float lane of a vector to single-precision. The higher lanes of the result are initialized to zero. */
12811293
export function demote_f64x2_zero(a: v128): v128;
1294+
/** Selects 32-bit lanes from either vector according to the specified [0-3] respectively [4-7] lane indexes. */
1295+
export function shuffle(a: v128, b: v128, l0: u8, l1: u8, l2: u8, l3: u8, l4: u8): v128;
1296+
/** Selects 8-bit lanes from the first vector according to the indexes [0-15] specified by the 8-bit lanes of the second vector. */
1297+
export function swizzle(a: v128, s: v128): v128;
12821298
}
12831299
/** Initializes a 128-bit vector from two 64-bit float values. Arguments must be compile-time constants. */
12841300
declare function f64x2(a: f64, b: f64): v128;
@@ -1337,6 +1353,10 @@ declare namespace f64x2 {
13371353
export function convert_low_i32x4_u(a: v128): v128;
13381354
/** Promotes the low 32-bit float lanes of a vector to double-precision. */
13391355
export function promote_low_f32x4(a: v128): v128;
1356+
/** Selects 64-bit lanes from either vector according to the specified [0-1] respectively [2-3] lane indexes. */
1357+
export function shuffle(a: v128, b: v128, l0: u8, l1: u8): v128;
1358+
/** Selects 8-bit lanes from the first vector according to the indexes [0-15] specified by the 8-bit lanes of the second vector. */
1359+
export function swizzle(a: v128, s: v128): v128;
13401360
}
13411361

13421362
declare abstract class i31 {
There was a problem loading the remainder of the diff.

0 commit comments

Comments
 (0)
Failed to load comments.