import * as env from 'env';

function asmFunc(imports) {
 var Math_imul = Math.imul;
 var Math_fround = Math.fround;
 var Math_abs = Math.abs;
 var Math_clz32 = Math.clz32;
 var Math_min = Math.min;
 var Math_max = Math.max;
 var Math_floor = Math.floor;
 var Math_ceil = Math.ceil;
 var Math_trunc = Math.trunc;
 var Math_sqrt = Math.sqrt;
 var env = imports.env;
 var setTempRet0 = env.setTempRet0;
 var i64toi32_i32$HIGH_BITS = 0;
 function $0(i) {
  i = i | 0;
  var j = 0, $7 = 0;
  j = 100;
  switch_ : {
   $7 : {
    switch (i | 0) {
    case 0:
     return i | 0;
    case 1:
    case 2:
    case 3:
     j = 0 - i | 0;
     break switch_;
    case 4:
     break switch_;
    case 5:
     j = 101;
     break switch_;
    case 6:
     j = 101;
    default:
     j = 102;
     break;
    case 7:
     break $7;
    };
   }
  }
  return j | 0;
 }
 
 function $1(i, i$hi) {
  i = i | 0;
  i$hi = i$hi | 0;
  var i64toi32_i32$5 = 0, i64toi32_i32$2 = 0, $7 = 0, $7$hi = 0, j = 0, j$hi = 0, $10$hi = 0, $10 = 0;
  j = 100;
  j$hi = 0;
  switch_ : {
   $7 : {
    switch (i | 0) {
    case 0:
     i64toi32_i32$HIGH_BITS = i$hi;
     return i | 0;
    case 1:
    case 2:
    case 3:
     i64toi32_i32$2 = 0;
     i64toi32_i32$5 = (i64toi32_i32$2 >>> 0 < i >>> 0) + i$hi | 0;
     i64toi32_i32$5 = 0 - i64toi32_i32$5 | 0;
     $7 = i64toi32_i32$2 - i | 0;
     $7$hi = i64toi32_i32$5;
     break switch_;
    case 6:
     i64toi32_i32$5 = 0;
     j = 101;
     j$hi = i64toi32_i32$5;
    case 5:
    case 4:
    default:
     i64toi32_i32$5 = j$hi;
     $7 = j;
     $7$hi = i64toi32_i32$5;
     break switch_;
    case 7:
     break $7;
    };
   }
   i64toi32_i32$5 = -1;
   $7 = -5;
   $7$hi = i64toi32_i32$5;
  }
  i64toi32_i32$5 = $7$hi;
  i64toi32_i32$2 = $7;
  i64toi32_i32$HIGH_BITS = i64toi32_i32$5;
  return i64toi32_i32$2 | 0;
 }
 
 function $2(i) {
  i = i | 0;
  var $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0;
  $2 : {
   $1 : {
    $0 : {
     default_ : {
      $5 = Math_imul(2, i);
      $6 = $5;
      $7 = $5;
      $8 = $5;
      $9 = $5;
      switch (3 & i | 0 | 0) {
      case 0:
       break $0;
      case 1:
       break $1;
      case 2:
       break $2;
      default:
       break default_;
      };
     }
     $6 = 1e3 + $9 | 0;
    }
    $7 = 100 + $6 | 0;
   }
   $8 = 10 + $7 | 0;
  }
  return $8 | 0;
 }
 
 function $3() {
  return 1 | 0;
 }
 
 function legalstub$1($0_1, $1_1) {
  $0_1 = $0_1 | 0;
  $1_1 = $1_1 | 0;
  var i64toi32_i32$2 = 0, i64toi32_i32$4 = 0, i64toi32_i32$0 = 0, i64toi32_i32$1 = 0, i64toi32_i32$3 = 0, $12 = 0, $13 = 0, $4 = 0, $4$hi = 0, $7$hi = 0, $2_1 = 0, $2$hi = 0;
  i64toi32_i32$0 = 0;
  $4 = $0_1;
  $4$hi = i64toi32_i32$0;
  i64toi32_i32$0 = 0;
  i64toi32_i32$2 = $1_1;
  i64toi32_i32$1 = 0;
  i64toi32_i32$3 = 32;
  i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0;
  if (32 >>> 0 <= (i64toi32_i32$3 & 63 | 0) >>> 0) {
   i64toi32_i32$1 = i64toi32_i32$2 << i64toi32_i32$4 | 0;
   $12 = 0;
  } else {
   i64toi32_i32$1 = ((1 << i64toi32_i32$4 | 0) - 1 | 0) & (i64toi32_i32$2 >>> (32 - i64toi32_i32$4 | 0) | 0) | 0 | (i64toi32_i32$0 << i64toi32_i32$4 | 0) | 0;
   $12 = i64toi32_i32$2 << i64toi32_i32$4 | 0;
  }
  $7$hi = i64toi32_i32$1;
  i64toi32_i32$1 = $4$hi;
  i64toi32_i32$0 = $4;
  i64toi32_i32$2 = $7$hi;
  i64toi32_i32$3 = $12;
  i64toi32_i32$2 = i64toi32_i32$1 | i64toi32_i32$2 | 0;
  i64toi32_i32$2 = $1(i64toi32_i32$0 | i64toi32_i32$3 | 0 | 0, i64toi32_i32$2 | 0) | 0;
  i64toi32_i32$0 = i64toi32_i32$HIGH_BITS;
  $2_1 = i64toi32_i32$2;
  $2$hi = i64toi32_i32$0;
  i64toi32_i32$1 = i64toi32_i32$2;
  i64toi32_i32$2 = 0;
  i64toi32_i32$3 = 32;
  i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0;
  if (32 >>> 0 <= (i64toi32_i32$3 & 63 | 0) >>> 0) {
   i64toi32_i32$2 = 0;
   $13 = i64toi32_i32$0 >>> i64toi32_i32$4 | 0;
  } else {
   i64toi32_i32$2 = i64toi32_i32$0 >>> i64toi32_i32$4 | 0;
   $13 = (((1 << i64toi32_i32$4 | 0) - 1 | 0) & i64toi32_i32$0 | 0) << (32 - i64toi32_i32$4 | 0) | 0 | (i64toi32_i32$1 >>> i64toi32_i32$4 | 0) | 0;
  }
  setTempRet0($13 | 0);
  i64toi32_i32$2 = $2$hi;
  return $2_1 | 0;
 }
 
 return {
  "stmt": $0, 
  "expr": legalstub$1, 
  "arg": $2, 
  "corner": $3
 };
}

var retasmFunc = asmFunc({
  "env": env,
});
export var stmt = retasmFunc.stmt;
export var expr = retasmFunc.expr;
export var arg = retasmFunc.arg;
export var corner = retasmFunc.corner;
