@@ -346,6 +346,7 @@ export namespace BuiltinNames {
346346 export const v128_bitselect = "~lib/builtins/v128.bitselect" ;
347347 export const v128_any_true = "~lib/builtins/v128.any_true" ;
348348 export const v128_all_true = "~lib/builtins/v128.all_true" ;
349+ export const v128_bitmask = "~lib/builtins/v128.bitmask" ;
349350 export const v128_min = "~lib/builtins/v128.min" ;
350351 export const v128_max = "~lib/builtins/v128.max" ;
351352 export const v128_dot = "~lib/builtins/v128.dot" ;
@@ -385,6 +386,7 @@ export namespace BuiltinNames {
385386 export const i8x16_max_s = "~lib/builtins/i8x16.max_s" ;
386387 export const i8x16_max_u = "~lib/builtins/i8x16.max_u" ;
387388 export const i8x16_avgr_u = "~lib/builtins/i8x16.avgr_u" ;
389+ export const i8x16_abs = "~lib/builtins/i8x16.abs" ;
388390 export const i8x16_neg = "~lib/builtins/i8x16.neg" ;
389391 export const i8x16_add_saturate_s = "~lib/builtins/i8x16.add_saturate_s" ;
390392 export const i8x16_add_saturate_u = "~lib/builtins/i8x16.add_saturate_u" ;
@@ -395,6 +397,7 @@ export namespace BuiltinNames {
395397 export const i8x16_shr_u = "~lib/builtins/i8x16.shr_u" ;
396398 export const i8x16_any_true = "~lib/builtins/i8x16.any_true" ;
397399 export const i8x16_all_true = "~lib/builtins/i8x16.all_true" ;
400+ export const i8x16_bitmask = "~lib/builtins/i8x16.bitmask" ;
398401 export const i8x16_eq = "~lib/builtins/i8x16.eq" ;
399402 export const i8x16_ne = "~lib/builtins/i8x16.ne" ;
400403 export const i8x16_lt_s = "~lib/builtins/i8x16.lt_s" ;
@@ -420,6 +423,7 @@ export namespace BuiltinNames {
420423 export const i16x8_max_s = "~lib/builtins/i16x8.max_s" ;
421424 export const i16x8_max_u = "~lib/builtins/i16x8.max_u" ;
422425 export const i16x8_avgr_u = "~lib/builtins/i16x8.avgr_u" ;
426+ export const i16x8_abs = "~lib/builtins/i16x8.abs" ;
423427 export const i16x8_neg = "~lib/builtins/i16x8.neg" ;
424428 export const i16x8_add_saturate_s = "~lib/builtins/i16x8.add_saturate_s" ;
425429 export const i16x8_add_saturate_u = "~lib/builtins/i16x8.add_saturate_u" ;
@@ -430,6 +434,7 @@ export namespace BuiltinNames {
430434 export const i16x8_shr_u = "~lib/builtins/i16x8.shr_u" ;
431435 export const i16x8_any_true = "~lib/builtins/i16x8.any_true" ;
432436 export const i16x8_all_true = "~lib/builtins/i16x8.all_true" ;
437+ export const i16x8_bitmask = "~lib/builtins/i16x8.bitmask" ;
433438 export const i16x8_eq = "~lib/builtins/i16x8.eq" ;
434439 export const i16x8_ne = "~lib/builtins/i16x8.ne" ;
435440 export const i16x8_lt_s = "~lib/builtins/i16x8.lt_s" ;
@@ -460,12 +465,14 @@ export namespace BuiltinNames {
460465 export const i32x4_max_s = "~lib/builtins/i32x4.max_s" ;
461466 export const i32x4_max_u = "~lib/builtins/i32x4.max_u" ;
462467 export const i32x4_dot_i16x8_s = "~lib/builtins/i32x4.dot_i16x8_s" ;
468+ export const i32x4_abs = "~lib/builtins/i32x4.abs" ;
463469 export const i32x4_neg = "~lib/builtins/i32x4.neg" ;
464470 export const i32x4_shl = "~lib/builtins/i32x4.shl" ;
465471 export const i32x4_shr_s = "~lib/builtins/i32x4.shr_s" ;
466472 export const i32x4_shr_u = "~lib/builtins/i32x4.shr_u" ;
467473 export const i32x4_any_true = "~lib/builtins/i32x4.any_true" ;
468474 export const i32x4_all_true = "~lib/builtins/i32x4.all_true" ;
475+ export const i32x4_bitmask = "~lib/builtins/i32x4.bitmask" ;
469476 export const i32x4_eq = "~lib/builtins/i32x4.eq" ;
470477 export const i32x4_ne = "~lib/builtins/i32x4.ne" ;
471478 export const i32x4_lt_s = "~lib/builtins/i32x4.lt_s" ;
@@ -2600,8 +2607,8 @@ function builtin_assert(ctx: BuiltinContext): ExpressionRef {
26002607
26012608 // if the assertion can be proven statically, omit it
26022609 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 : {
26052612 if ( getConstValueI32 ( arg0 ) != 0 ) {
26062613 if ( contextualType == Type . void ) {
26072614 compiler . currentType = Type . void ;
@@ -2611,7 +2618,7 @@ function builtin_assert(ctx: BuiltinContext): ExpressionRef {
26112618 }
26122619 break ;
26132620 }
2614- case NativeType . I64 : {
2621+ case < u32 > NativeType . I64 : {
26152622 if ( getConstValueI64Low ( arg0 ) != 0 || getConstValueI64High ( arg0 ) != 0 ) {
26162623 if ( contextualType == Type . void ) {
26172624 compiler . currentType = Type . void ;
@@ -2621,7 +2628,7 @@ function builtin_assert(ctx: BuiltinContext): ExpressionRef {
26212628 }
26222629 break ;
26232630 }
2624- case NativeType . F32 : {
2631+ case < u32 > NativeType . F32 : {
26252632 if ( getConstValueF32 ( arg0 ) != 0 ) {
26262633 if ( contextualType == Type . void ) {
26272634 compiler . currentType = Type . void ;
@@ -2631,7 +2638,7 @@ function builtin_assert(ctx: BuiltinContext): ExpressionRef {
26312638 }
26322639 break ;
26332640 }
2634- case NativeType . F64 : {
2641+ case < u32 > NativeType . F64 : {
26352642 if ( getConstValueF64 ( arg0 ) != 0 ) {
26362643 if ( contextualType == Type . void ) {
26372644 compiler . currentType = Type . void ;
@@ -4398,6 +4405,20 @@ function builtin_v128_abs(ctx: BuiltinContext): ExpressionRef {
43984405 var arg0 = compiler . compileExpression ( operands [ 0 ] , Type . v128 , Constraints . CONV_IMPLICIT ) ;
43994406 if ( ! type . is ( TypeFlags . REFERENCE ) ) {
44004407 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 ;
44014422 case TypeKind . F32 : return module . unary ( UnaryOp . AbsF32x4 , arg0 ) ;
44024423 case TypeKind . F64 : return module . unary ( UnaryOp . AbsF64x2 , arg0 ) ;
44034424 }
@@ -4844,6 +4865,45 @@ function builtin_v128_all_true(ctx: BuiltinContext): ExpressionRef {
48444865}
48454866builtins . set ( BuiltinNames . v128_all_true , builtin_v128_all_true ) ;
48464867
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+
48474907// v128.qfma<T!>(a: v128, b: v128, c: v128) -> v128
48484908function builtin_v128_qfma ( ctx : BuiltinContext ) : ExpressionRef {
48494909 var compiler = ctx . compiler ;
@@ -6225,6 +6285,15 @@ function builtin_i8x16_avgr_u(ctx: BuiltinContext): ExpressionRef {
62256285}
62266286builtins . set ( BuiltinNames . i8x16_avgr_u , builtin_i8x16_avgr_u ) ;
62276287
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+
62286297// i8x16.neg -> v128.neg<i8>
62296298function builtin_i8x16_neg ( ctx : BuiltinContext ) : ExpressionRef {
62306299 checkTypeAbsent ( ctx ) ;
@@ -6315,6 +6384,15 @@ function builtin_i8x16_all_true(ctx: BuiltinContext): ExpressionRef {
63156384}
63166385builtins . set ( BuiltinNames . i8x16_all_true , builtin_i8x16_all_true ) ;
63176386
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+
63186396// i8x16.eq -> v128.eq<i8>
63196397function builtin_i8x16_eq ( ctx : BuiltinContext ) : ExpressionRef {
63206398 checkTypeAbsent ( ctx ) ;
@@ -6531,6 +6609,15 @@ function builtin_i16x8_avgr_u(ctx: BuiltinContext): ExpressionRef {
65316609}
65326610builtins . set ( BuiltinNames . i16x8_avgr_u , builtin_i16x8_avgr_u ) ;
65336611
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+
65346621// i16x8.neg -> v128.neg<i16>
65356622function builtin_i16x8_neg ( ctx : BuiltinContext ) : ExpressionRef {
65366623 checkTypeAbsent ( ctx ) ;
@@ -6621,6 +6708,15 @@ function builtin_i16x8_all_true(ctx: BuiltinContext): ExpressionRef {
66216708}
66226709builtins . set ( BuiltinNames . i16x8_all_true , builtin_i16x8_all_true ) ;
66236710
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+
66246720// i16x8.eq -> v128.eq<i16>
66256721function builtin_i16x8_eq ( ctx : BuiltinContext ) : ExpressionRef {
66266722 checkTypeAbsent ( ctx ) ;
@@ -6882,6 +6978,15 @@ function builtin_i32x4_dot_i16x8_s(ctx: BuiltinContext): ExpressionRef {
68826978}
68836979builtins . set ( BuiltinNames . i32x4_dot_i16x8_s , builtin_i32x4_dot_i16x8_s ) ;
68846980
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+
68856990// i32x4.neg -> v128.neg<i32>
68866991function builtin_i32x4_neg ( ctx : BuiltinContext ) : ExpressionRef {
68876992 checkTypeAbsent ( ctx ) ;
@@ -6936,6 +7041,15 @@ function builtin_i32x4_all_true(ctx: BuiltinContext): ExpressionRef {
69367041}
69377042builtins . set ( BuiltinNames . i32x4_all_true , builtin_i32x4_all_true ) ;
69387043
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+
69397053// i32x4.eq -> v128.eq<i32>
69407054function builtin_i32x4_eq ( ctx : BuiltinContext ) : ExpressionRef {
69417055 checkTypeAbsent ( ctx ) ;
0 commit comments