@@ -2788,7 +2788,7 @@ export class Module {
27882788 maxLoopIterations : i32 = 1
27892789 ) : ExpressionRef {
27902790 var runner = binaryen . _ExpressionRunnerCreate ( this . ref , flags , maxDepth , maxLoopIterations ) ;
2791- var precomp = binaryen . _ExpressionRunnerRunAndDispose ( runner , expr ) ;
2791+ var precomp = binaryen . _ExpressionRunnerRunAndDispose ( runner , expr ) ;
27922792 if ( precomp ) {
27932793 if ( ! this . isConstExpression ( precomp ) ) return 0 ;
27942794 assert ( getExpressionType ( precomp ) == getExpressionType ( expr ) ) ;
@@ -2810,7 +2810,11 @@ export class Module {
28102810 case BinaryOp . MulI32 :
28112811 case BinaryOp . AddI64 :
28122812 case BinaryOp . SubI64 :
2813- case BinaryOp . MulI64 : return this . isConstExpression ( getBinaryLeft ( expr ) ) && this . isConstExpression ( getBinaryRight ( expr ) ) ;
2813+ case BinaryOp . MulI64 :
2814+ return (
2815+ this . isConstExpression ( getBinaryLeft ( expr ) ) &&
2816+ this . isConstExpression ( getBinaryRight ( expr ) )
2817+ ) ;
28142818 }
28152819 }
28162820 break ;
@@ -2934,6 +2938,52 @@ export function isConstNonZero(expr: ExpressionRef): bool {
29342938 return false ;
29352939}
29362940
2941+ export function isConstNegZero ( expr : ExpressionRef ) : bool {
2942+ if ( getExpressionId ( expr ) != ExpressionId . Const ) return false ;
2943+ var type = getExpressionType ( expr ) ;
2944+ if ( type == TypeRef . F32 ) {
2945+ let d = getConstValueF32 ( expr ) ;
2946+ return d == 0 && f32_as_i32 ( d ) < 0 ;
2947+ }
2948+ if ( type == TypeRef . F64 ) {
2949+ let d = getConstValueF64 ( expr ) ;
2950+ return d == 0 && i64_signbit ( f64_as_i64 ( d ) ) ;
2951+ }
2952+ return false ;
2953+ }
2954+
2955+ export function isConstNaN ( expr : ExpressionRef ) : bool {
2956+ if ( getExpressionId ( expr ) != ExpressionId . Const ) return false ;
2957+ var type = getExpressionType ( expr ) ;
2958+ if ( type == TypeRef . F32 ) return isNaN ( getConstValueF32 ( expr ) ) ;
2959+ if ( type == TypeRef . F64 ) return isNaN ( getConstValueF64 ( expr ) ) ;
2960+ return false ;
2961+ }
2962+
2963+ export function isConstExpressionNaN ( module : Module , expr : ExpressionRef ) : bool {
2964+ var id = getExpressionId ( expr ) ;
2965+ var type = getExpressionType ( expr ) ;
2966+ if ( type == TypeRef . F32 || type == TypeRef . F64 ) {
2967+ if ( id == ExpressionId . Const ) {
2968+ return isNaN (
2969+ type == TypeRef . F32
2970+ ? getConstValueF32 ( expr )
2971+ : getConstValueF64 ( expr )
2972+ ) ;
2973+ } else if ( id == ExpressionId . GlobalGet ) {
2974+ let precomp = module . runExpression ( expr , ExpressionRunnerFlags . Default , 8 ) ;
2975+ if ( precomp ) {
2976+ return isNaN (
2977+ type == TypeRef . F32
2978+ ? getConstValueF32 ( precomp )
2979+ : getConstValueF64 ( precomp )
2980+ ) ;
2981+ }
2982+ }
2983+ }
2984+ return false ;
2985+ }
2986+
29372987export function getLocalGetIndex ( expr : ExpressionRef ) : Index {
29382988 return binaryen . _BinaryenLocalGetGetIndex ( expr ) ;
29392989}
0 commit comments