@@ -346,6 +346,7 @@ export namespace BuiltinNames {
346
346
export const v128_bitselect = "~lib/builtins/v128.bitselect" ;
347
347
export const v128_any_true = "~lib/builtins/v128.any_true" ;
348
348
export const v128_all_true = "~lib/builtins/v128.all_true" ;
349
+ export const v128_bitmask = "~lib/builtins/v128.bitmask" ;
349
350
export const v128_min = "~lib/builtins/v128.min" ;
350
351
export const v128_max = "~lib/builtins/v128.max" ;
351
352
export const v128_dot = "~lib/builtins/v128.dot" ;
@@ -385,6 +386,7 @@ export namespace BuiltinNames {
385
386
export const i8x16_max_s = "~lib/builtins/i8x16.max_s" ;
386
387
export const i8x16_max_u = "~lib/builtins/i8x16.max_u" ;
387
388
export const i8x16_avgr_u = "~lib/builtins/i8x16.avgr_u" ;
389
+ export const i8x16_abs = "~lib/builtins/i8x16.abs" ;
388
390
export const i8x16_neg = "~lib/builtins/i8x16.neg" ;
389
391
export const i8x16_add_saturate_s = "~lib/builtins/i8x16.add_saturate_s" ;
390
392
export const i8x16_add_saturate_u = "~lib/builtins/i8x16.add_saturate_u" ;
@@ -395,6 +397,7 @@ export namespace BuiltinNames {
395
397
export const i8x16_shr_u = "~lib/builtins/i8x16.shr_u" ;
396
398
export const i8x16_any_true = "~lib/builtins/i8x16.any_true" ;
397
399
export const i8x16_all_true = "~lib/builtins/i8x16.all_true" ;
400
+ export const i8x16_bitmask = "~lib/builtins/i8x16.bitmask" ;
398
401
export const i8x16_eq = "~lib/builtins/i8x16.eq" ;
399
402
export const i8x16_ne = "~lib/builtins/i8x16.ne" ;
400
403
export const i8x16_lt_s = "~lib/builtins/i8x16.lt_s" ;
@@ -420,6 +423,7 @@ export namespace BuiltinNames {
420
423
export const i16x8_max_s = "~lib/builtins/i16x8.max_s" ;
421
424
export const i16x8_max_u = "~lib/builtins/i16x8.max_u" ;
422
425
export const i16x8_avgr_u = "~lib/builtins/i16x8.avgr_u" ;
426
+ export const i16x8_abs = "~lib/builtins/i16x8.abs" ;
423
427
export const i16x8_neg = "~lib/builtins/i16x8.neg" ;
424
428
export const i16x8_add_saturate_s = "~lib/builtins/i16x8.add_saturate_s" ;
425
429
export const i16x8_add_saturate_u = "~lib/builtins/i16x8.add_saturate_u" ;
@@ -430,6 +434,7 @@ export namespace BuiltinNames {
430
434
export const i16x8_shr_u = "~lib/builtins/i16x8.shr_u" ;
431
435
export const i16x8_any_true = "~lib/builtins/i16x8.any_true" ;
432
436
export const i16x8_all_true = "~lib/builtins/i16x8.all_true" ;
437
+ export const i16x8_bitmask = "~lib/builtins/i16x8.bitmask" ;
433
438
export const i16x8_eq = "~lib/builtins/i16x8.eq" ;
434
439
export const i16x8_ne = "~lib/builtins/i16x8.ne" ;
435
440
export const i16x8_lt_s = "~lib/builtins/i16x8.lt_s" ;
@@ -460,12 +465,14 @@ export namespace BuiltinNames {
460
465
export const i32x4_max_s = "~lib/builtins/i32x4.max_s" ;
461
466
export const i32x4_max_u = "~lib/builtins/i32x4.max_u" ;
462
467
export const i32x4_dot_i16x8_s = "~lib/builtins/i32x4.dot_i16x8_s" ;
468
+ export const i32x4_abs = "~lib/builtins/i32x4.abs" ;
463
469
export const i32x4_neg = "~lib/builtins/i32x4.neg" ;
464
470
export const i32x4_shl = "~lib/builtins/i32x4.shl" ;
465
471
export const i32x4_shr_s = "~lib/builtins/i32x4.shr_s" ;
466
472
export const i32x4_shr_u = "~lib/builtins/i32x4.shr_u" ;
467
473
export const i32x4_any_true = "~lib/builtins/i32x4.any_true" ;
468
474
export const i32x4_all_true = "~lib/builtins/i32x4.all_true" ;
475
+ export const i32x4_bitmask = "~lib/builtins/i32x4.bitmask" ;
469
476
export const i32x4_eq = "~lib/builtins/i32x4.eq" ;
470
477
export const i32x4_ne = "~lib/builtins/i32x4.ne" ;
471
478
export const i32x4_lt_s = "~lib/builtins/i32x4.lt_s" ;
@@ -2600,8 +2607,8 @@ function builtin_assert(ctx: BuiltinContext): ExpressionRef {
2600
2607
2601
2608
// if the assertion can be proven statically, omit it
2602
2609
if ( getExpressionId ( arg0 = module . precomputeExpression ( arg0 ) ) == ExpressionId . Const ) {
2603
- switch ( getExpressionType ( arg0 ) ) {
2604
- case NativeType . I32 : {
2610
+ switch ( < u32 > getExpressionType ( arg0 ) ) {
2611
+ case < u32 > NativeType . I32 : {
2605
2612
if ( getConstValueI32 ( arg0 ) != 0 ) {
2606
2613
if ( contextualType == Type . void ) {
2607
2614
compiler . currentType = Type . void ;
@@ -2611,7 +2618,7 @@ function builtin_assert(ctx: BuiltinContext): ExpressionRef {
2611
2618
}
2612
2619
break ;
2613
2620
}
2614
- case NativeType . I64 : {
2621
+ case < u32 > NativeType . I64 : {
2615
2622
if ( getConstValueI64Low ( arg0 ) != 0 || getConstValueI64High ( arg0 ) != 0 ) {
2616
2623
if ( contextualType == Type . void ) {
2617
2624
compiler . currentType = Type . void ;
@@ -2621,7 +2628,7 @@ function builtin_assert(ctx: BuiltinContext): ExpressionRef {
2621
2628
}
2622
2629
break ;
2623
2630
}
2624
- case NativeType . F32 : {
2631
+ case < u32 > NativeType . F32 : {
2625
2632
if ( getConstValueF32 ( arg0 ) != 0 ) {
2626
2633
if ( contextualType == Type . void ) {
2627
2634
compiler . currentType = Type . void ;
@@ -2631,7 +2638,7 @@ function builtin_assert(ctx: BuiltinContext): ExpressionRef {
2631
2638
}
2632
2639
break ;
2633
2640
}
2634
- case NativeType . F64 : {
2641
+ case < u32 > NativeType . F64 : {
2635
2642
if ( getConstValueF64 ( arg0 ) != 0 ) {
2636
2643
if ( contextualType == Type . void ) {
2637
2644
compiler . currentType = Type . void ;
@@ -4398,6 +4405,20 @@ function builtin_v128_abs(ctx: BuiltinContext): ExpressionRef {
4398
4405
var arg0 = compiler . compileExpression ( operands [ 0 ] , Type . v128 , Constraints . CONV_IMPLICIT ) ;
4399
4406
if ( ! type . is ( TypeFlags . REFERENCE ) ) {
4400
4407
switch ( type . kind ) {
4408
+ case TypeKind . I8 : return module . unary ( UnaryOp . AbsI8x16 , arg0 ) ;
4409
+ case TypeKind . I16 : return module . unary ( UnaryOp . AbsI16x8 , arg0 ) ;
4410
+ case TypeKind . ISIZE : {
4411
+ if ( compiler . options . isWasm64 ) break ;
4412
+ // fall-through
4413
+ }
4414
+ case TypeKind . I32 : return module . unary ( UnaryOp . AbsI32x4 , arg0 ) ;
4415
+ case TypeKind . USIZE : {
4416
+ if ( compiler . options . isWasm64 ) break ;
4417
+ // fall-through
4418
+ }
4419
+ case TypeKind . U8 :
4420
+ case TypeKind . U16 :
4421
+ case TypeKind . U32 : return arg0 ;
4401
4422
case TypeKind . F32 : return module . unary ( UnaryOp . AbsF32x4 , arg0 ) ;
4402
4423
case TypeKind . F64 : return module . unary ( UnaryOp . AbsF64x2 , arg0 ) ;
4403
4424
}
@@ -4844,6 +4865,45 @@ function builtin_v128_all_true(ctx: BuiltinContext): ExpressionRef {
4844
4865
}
4845
4866
builtins . set ( BuiltinNames . v128_all_true , builtin_v128_all_true ) ;
4846
4867
4868
+ // v128.bitmask<T!>(a: v128) -> i32
4869
+ function builtin_v128_bitmask ( ctx : BuiltinContext ) : ExpressionRef {
4870
+ var compiler = ctx . compiler ;
4871
+ var module = compiler . module ;
4872
+ if (
4873
+ checkFeatureEnabled ( ctx , Feature . SIMD ) |
4874
+ checkTypeRequired ( ctx ) |
4875
+ checkArgsRequired ( ctx , 1 )
4876
+ ) {
4877
+ compiler . currentType = Type . i32 ;
4878
+ return module . unreachable ( ) ;
4879
+ }
4880
+ var operands = ctx . operands ;
4881
+ var type = ctx . typeArguments ! [ 0 ] ;
4882
+ var arg0 = compiler . compileExpression ( operands [ 0 ] , Type . v128 , Constraints . CONV_IMPLICIT ) ;
4883
+ compiler . currentType = Type . i32 ;
4884
+ if ( ! type . is ( TypeFlags . REFERENCE ) ) {
4885
+ switch ( type . kind ) {
4886
+ case TypeKind . I8 :
4887
+ case TypeKind . U8 : return module . unary ( UnaryOp . BitmaskI8x16 , arg0 ) ;
4888
+ case TypeKind . I16 :
4889
+ case TypeKind . U16 : return module . unary ( UnaryOp . BitmaskI16x8 , arg0 ) ;
4890
+ case TypeKind . ISIZE :
4891
+ case TypeKind . USIZE : {
4892
+ if ( compiler . options . isWasm64 ) break ;
4893
+ // fall-through
4894
+ }
4895
+ case TypeKind . I32 :
4896
+ case TypeKind . U32 : return module . unary ( UnaryOp . BitmaskI32x4 , arg0 ) ;
4897
+ }
4898
+ }
4899
+ compiler . error (
4900
+ DiagnosticCode . Operation_0_cannot_be_applied_to_type_1 ,
4901
+ ctx . reportNode . typeArgumentsRange , "v128.bitmask" , type . toString ( )
4902
+ ) ;
4903
+ return module . unreachable ( ) ;
4904
+ }
4905
+ builtins . set ( BuiltinNames . v128_bitmask , builtin_v128_bitmask ) ;
4906
+
4847
4907
// v128.qfma<T!>(a: v128, b: v128, c: v128) -> v128
4848
4908
function builtin_v128_qfma ( ctx : BuiltinContext ) : ExpressionRef {
4849
4909
var compiler = ctx . compiler ;
@@ -6225,6 +6285,15 @@ function builtin_i8x16_avgr_u(ctx: BuiltinContext): ExpressionRef {
6225
6285
}
6226
6286
builtins . set ( BuiltinNames . i8x16_avgr_u , builtin_i8x16_avgr_u ) ;
6227
6287
6288
+ // i8x16.abs -> v128.abs<i8>
6289
+ function builtin_i8x16_abs ( ctx : BuiltinContext ) : ExpressionRef {
6290
+ checkTypeAbsent ( ctx ) ;
6291
+ ctx . typeArguments = [ Type . i8 ] ;
6292
+ ctx . contextualType = Type . v128 ;
6293
+ return builtin_v128_abs ( ctx ) ;
6294
+ }
6295
+ builtins . set ( BuiltinNames . i8x16_abs , builtin_i8x16_abs ) ;
6296
+
6228
6297
// i8x16.neg -> v128.neg<i8>
6229
6298
function builtin_i8x16_neg ( ctx : BuiltinContext ) : ExpressionRef {
6230
6299
checkTypeAbsent ( ctx ) ;
@@ -6315,6 +6384,15 @@ function builtin_i8x16_all_true(ctx: BuiltinContext): ExpressionRef {
6315
6384
}
6316
6385
builtins . set ( BuiltinNames . i8x16_all_true , builtin_i8x16_all_true ) ;
6317
6386
6387
+ // i8x16.bitmask -> v128.bitmask<i8>
6388
+ function builtin_i8x16_bitmask ( ctx : BuiltinContext ) : ExpressionRef {
6389
+ checkTypeAbsent ( ctx ) ;
6390
+ ctx . typeArguments = [ Type . i8 ] ;
6391
+ ctx . contextualType = Type . i32 ;
6392
+ return builtin_v128_bitmask ( ctx ) ;
6393
+ }
6394
+ builtins . set ( BuiltinNames . i8x16_bitmask , builtin_i8x16_bitmask ) ;
6395
+
6318
6396
// i8x16.eq -> v128.eq<i8>
6319
6397
function builtin_i8x16_eq ( ctx : BuiltinContext ) : ExpressionRef {
6320
6398
checkTypeAbsent ( ctx ) ;
@@ -6531,6 +6609,15 @@ function builtin_i16x8_avgr_u(ctx: BuiltinContext): ExpressionRef {
6531
6609
}
6532
6610
builtins . set ( BuiltinNames . i16x8_avgr_u , builtin_i16x8_avgr_u ) ;
6533
6611
6612
+ // i16x8.abs -> v128.abs<i16>
6613
+ function builtin_i16x8_abs ( ctx : BuiltinContext ) : ExpressionRef {
6614
+ checkTypeAbsent ( ctx ) ;
6615
+ ctx . typeArguments = [ Type . i16 ] ;
6616
+ ctx . contextualType = Type . v128 ;
6617
+ return builtin_v128_abs ( ctx ) ;
6618
+ }
6619
+ builtins . set ( BuiltinNames . i16x8_abs , builtin_i16x8_abs ) ;
6620
+
6534
6621
// i16x8.neg -> v128.neg<i16>
6535
6622
function builtin_i16x8_neg ( ctx : BuiltinContext ) : ExpressionRef {
6536
6623
checkTypeAbsent ( ctx ) ;
@@ -6621,6 +6708,15 @@ function builtin_i16x8_all_true(ctx: BuiltinContext): ExpressionRef {
6621
6708
}
6622
6709
builtins . set ( BuiltinNames . i16x8_all_true , builtin_i16x8_all_true ) ;
6623
6710
6711
+ // i16x8.bitmask -> v128.bitmask<i16>
6712
+ function builtin_i16x8_bitmask ( ctx : BuiltinContext ) : ExpressionRef {
6713
+ checkTypeAbsent ( ctx ) ;
6714
+ ctx . typeArguments = [ Type . i16 ] ;
6715
+ ctx . contextualType = Type . i32 ;
6716
+ return builtin_v128_bitmask ( ctx ) ;
6717
+ }
6718
+ builtins . set ( BuiltinNames . i16x8_bitmask , builtin_i16x8_bitmask ) ;
6719
+
6624
6720
// i16x8.eq -> v128.eq<i16>
6625
6721
function builtin_i16x8_eq ( ctx : BuiltinContext ) : ExpressionRef {
6626
6722
checkTypeAbsent ( ctx ) ;
@@ -6882,6 +6978,15 @@ function builtin_i32x4_dot_i16x8_s(ctx: BuiltinContext): ExpressionRef {
6882
6978
}
6883
6979
builtins . set ( BuiltinNames . i32x4_dot_i16x8_s , builtin_i32x4_dot_i16x8_s ) ;
6884
6980
6981
+ // i32x4.abs -> v128.abs<i32>
6982
+ function builtin_i32x4_abs ( ctx : BuiltinContext ) : ExpressionRef {
6983
+ checkTypeAbsent ( ctx ) ;
6984
+ ctx . typeArguments = [ Type . i32 ] ;
6985
+ ctx . contextualType = Type . v128 ;
6986
+ return builtin_v128_abs ( ctx ) ;
6987
+ }
6988
+ builtins . set ( BuiltinNames . i32x4_abs , builtin_i32x4_abs ) ;
6989
+
6885
6990
// i32x4.neg -> v128.neg<i32>
6886
6991
function builtin_i32x4_neg ( ctx : BuiltinContext ) : ExpressionRef {
6887
6992
checkTypeAbsent ( ctx ) ;
@@ -6936,6 +7041,15 @@ function builtin_i32x4_all_true(ctx: BuiltinContext): ExpressionRef {
6936
7041
}
6937
7042
builtins . set ( BuiltinNames . i32x4_all_true , builtin_i32x4_all_true ) ;
6938
7043
7044
+ // i32x4.bitmask -> v128.bitmask<i32>
7045
+ function builtin_i32x4_bitmask ( ctx : BuiltinContext ) : ExpressionRef {
7046
+ checkTypeAbsent ( ctx ) ;
7047
+ ctx . typeArguments = [ Type . i32 ] ;
7048
+ ctx . contextualType = Type . i32 ;
7049
+ return builtin_v128_bitmask ( ctx ) ;
7050
+ }
7051
+ builtins . set ( BuiltinNames . i32x4_bitmask , builtin_i32x4_bitmask ) ;
7052
+
6939
7053
// i32x4.eq -> v128.eq<i32>
6940
7054
function builtin_i32x4_eq ( ctx : BuiltinContext ) : ExpressionRef {
6941
7055
checkTypeAbsent ( ctx ) ;
0 commit comments