| ;; A large WAST blob which contains the implementations of all the intrinsics |
| ;; that we inject as part of this module. This blob was generated from a Rust |
| ;; program [1] which uses the Rust compiler-builtins project. It's not |
| ;; necessarily perfect but gets the job done! The idea here is that we inject |
| ;; these pretty early so they can continue to be optimized by further passes |
| ;; (aka inlining and whatnot) |
| ;; |
| ;; LOCAL MODS done by hand afterwards: |
| ;; * Remove hardcoded address 1024 which was used for temporary data; instead |
| ;; add $wasm-intrinsics-temp-i64 global for that. |
| ;; * Fix function type of __wasm_ctz_i64, which was wrong somehow, |
| ;; i32, i32 => i32 instead of i64 => i64 |
| ;; * Remove unnecessary memory import. |
| ;; |
| ;; [1]: https://gist.github.com/alexcrichton/e7ea67bcdd17ce4b6254e66f77165690 |
| |
| (module |
| (type $0 (func (param i64 i64) (result i64))) |
| (type $1 (func (param f32) (result f32))) |
| (type $2 (func (param f64) (result f64))) |
| (type $3 (func (param i32) (result i32))) |
| (type $4 (func (param i32 i32) (result i32))) |
| (type $5 (func (param i64) (result i64))) |
| (export "__wasm_i64_sdiv" (func $__wasm_i64_sdiv)) |
| (export "__wasm_i64_udiv" (func $__wasm_i64_udiv)) |
| (export "__wasm_i64_srem" (func $__wasm_i64_srem)) |
| (export "__wasm_i64_urem" (func $__wasm_i64_urem)) |
| (export "__wasm_i64_mul" (func $__wasm_i64_mul)) |
| (export "__wasm_ctz_i32" (func $__wasm_ctz_i32)) |
| (export "__wasm_ctz_i64" (func $__wasm_ctz_i64)) |
| (export "__wasm_rotl_i32" (func $__wasm_rotl_i32)) |
| (export "__wasm_rotr_i32" (func $__wasm_rotr_i32)) |
| (export "__wasm_rotl_i64" (func $__wasm_rotl_i64)) |
| (export "__wasm_rotr_i64" (func $__wasm_rotr_i64)) |
| (export "__wasm_nearest_f32" (func $__wasm_nearest_f32)) |
| (export "__wasm_nearest_f64" (func $__wasm_nearest_f64)) |
| (export "__wasm_popcnt_i32" (func $__wasm_popcnt_i32)) |
| (export "__wasm_popcnt_i64" (func $__wasm_popcnt_i64)) |
| (global $__wasm-intrinsics-temp-i64 (mut i64) (i64.const 0)) |
| |
| ;; lowering of the i32.popcnt instruction, counts the number of bits set in the |
| ;; input and returns the result |
| (func $__wasm_popcnt_i32 (param $var$0 i32) (result i32) |
| (local $var$1 i32) |
| (block $label$1 (result i32) |
| (loop $label$2 |
| (drop |
| (br_if $label$1 |
| (local.get $var$1) |
| (i32.eqz |
| (local.get $var$0) |
| ) |
| ) |
| ) |
| (local.set $var$0 |
| (i32.and |
| (local.get $var$0) |
| (i32.sub |
| (local.get $var$0) |
| (i32.const 1) |
| ) |
| ) |
| ) |
| (local.set $var$1 |
| (i32.add |
| (local.get $var$1) |
| (i32.const 1) |
| ) |
| ) |
| (br $label$2) |
| ) |
| ) |
| ) |
| ;; lowering of the i64.popcnt instruction, counts the number of bits set in the |
| ;; input and returns the result |
| (func $__wasm_popcnt_i64 (param $var$0 i64) (result i64) |
| (local $var$1 i64) |
| (block $label$1 (result i64) |
| (loop $label$2 |
| (drop |
| (br_if $label$1 |
| (local.get $var$1) |
| (i64.eqz |
| (local.get $var$0) |
| ) |
| ) |
| ) |
| (local.set $var$0 |
| (i64.and |
| (local.get $var$0) |
| (i64.sub |
| (local.get $var$0) |
| (i64.const 1) |
| ) |
| ) |
| ) |
| (local.set $var$1 |
| (i64.add |
| (local.get $var$1) |
| (i64.const 1) |
| ) |
| ) |
| (br $label$2) |
| ) |
| ) |
| ) |
| ;; lowering of the i64.div_s instruction, return $var0 / $var$1 |
| (func $__wasm_i64_sdiv (; 0 ;) (type $0) (param $var$0 i64) (param $var$1 i64) (result i64) |
| (call $_ZN17compiler_builtins3int4sdiv3Div3div17he78fc483e41d7ec7E |
| (local.get $var$0) |
| (local.get $var$1) |
| ) |
| ) |
| ;; lowering of the i64.div_u instruction, return $var0 / $var$1 |
| (func $__wasm_i64_udiv (; 1 ;) (type $0) (param $var$0 i64) (param $var$1 i64) (result i64) |
| (call $_ZN17compiler_builtins3int4udiv10divmod_u6417h6026910b5ed08e40E |
| (local.get $var$0) |
| (local.get $var$1) |
| ) |
| ) |
| ;; lowering of the i64.rem_s instruction, return $var0 % $var$1 |
| (func $__wasm_i64_srem (; 2 ;) (type $0) (param $var$0 i64) (param $var$1 i64) (result i64) |
| (call $_ZN17compiler_builtins3int4sdiv3Mod4mod_17h2cbb7bbf36e41d68E |
| (local.get $var$0) |
| (local.get $var$1) |
| ) |
| ) |
| ;; lowering of the i64.rem_u instruction, return $var0 % $var$1 |
| (func $__wasm_i64_urem (; 3 ;) (type $0) (param $var$0 i64) (param $var$1 i64) (result i64) |
| (drop |
| (call $_ZN17compiler_builtins3int4udiv10divmod_u6417h6026910b5ed08e40E |
| (local.get $var$0) |
| (local.get $var$1) |
| ) |
| ) |
| (global.get $__wasm-intrinsics-temp-i64) |
| ) |
| ;; lowering of the i64.mul instruction, return $var0 * $var$1 |
| (func $__wasm_i64_mul (; 4 ;) (type $0) (param $var$0 i64) (param $var$1 i64) (result i64) |
| (call $_ZN17compiler_builtins3int3mul3Mul3mul17h070e9a1c69faec5bE |
| (local.get $var$0) |
| (local.get $var$1) |
| ) |
| ) |
| ;; lowering of the i32.ctz instruction, counting the number of zeros in $var$0 |
| (func $__wasm_ctz_i32 (; 7 ;) (type $3) (param $var$0 i32) (result i32) |
| (if |
| (local.get $var$0) |
| (then |
| (return |
| (i32.sub |
| (i32.const 31) |
| (i32.clz |
| (i32.xor |
| (i32.add |
| (local.get $var$0) |
| (i32.const -1) |
| ) |
| (local.get $var$0) |
| ) |
| ) |
| ) |
| ) |
| ) |
| ) |
| (i32.const 32) |
| ) |
| ;; lowering of the i64.ctz instruction, counting the number of zeros in $var$0 |
| (func $__wasm_ctz_i64 (; 8 ;) (type $5) (param $var$0 i64) (result i64) |
| (if |
| (i32.eqz |
| (i64.eqz |
| (local.get $var$0) |
| ) |
| ) |
| (then |
| (return |
| (i64.sub |
| (i64.const 63) |
| (i64.clz |
| (i64.xor |
| (i64.add |
| (local.get $var$0) |
| (i64.const -1) |
| ) |
| (local.get $var$0) |
| ) |
| ) |
| ) |
| ) |
| ) |
| ) |
| (i64.const 64) |
| ) |
| ;; lowering of the i32.rotl instruction, rotating the first argument, with |
| ;; wraparound, by the second argument |
| (func $__wasm_rotl_i32 (; 8 ;) (type $4) (param $var$0 i32) (param $var$1 i32) (result i32) |
| (local $var$2 i32) |
| (i32.or |
| (i32.shl |
| (i32.and |
| (i32.shr_u |
| (i32.const -1) |
| (local.tee $var$2 |
| (i32.and |
| (local.get $var$1) |
| (i32.const 31) |
| ) |
| ) |
| ) |
| (local.get $var$0) |
| ) |
| (local.get $var$2) |
| ) |
| (i32.shr_u |
| (i32.and |
| (i32.shl |
| (i32.const -1) |
| (local.tee $var$1 |
| (i32.and |
| (i32.sub |
| (i32.const 0) |
| (local.get $var$1) |
| ) |
| (i32.const 31) |
| ) |
| ) |
| ) |
| (local.get $var$0) |
| ) |
| (local.get $var$1) |
| ) |
| ) |
| ) |
| ;; lowering of the i32.rotr instruction, rotating the first argument, with |
| ;; wraparound, by the second argument |
| (func $__wasm_rotr_i32 (; 9 ;) (type $4) (param $var$0 i32) (param $var$1 i32) (result i32) |
| (local $var$2 i32) |
| (i32.or |
| (i32.shr_u |
| (i32.and |
| (i32.shl |
| (i32.const -1) |
| (local.tee $var$2 |
| (i32.and |
| (local.get $var$1) |
| (i32.const 31) |
| ) |
| ) |
| ) |
| (local.get $var$0) |
| ) |
| (local.get $var$2) |
| ) |
| (i32.shl |
| (i32.and |
| (i32.shr_u |
| (i32.const -1) |
| (local.tee $var$1 |
| (i32.and |
| (i32.sub |
| (i32.const 0) |
| (local.get $var$1) |
| ) |
| (i32.const 31) |
| ) |
| ) |
| ) |
| (local.get $var$0) |
| ) |
| (local.get $var$1) |
| ) |
| ) |
| ) |
| ;; lowering of the i64.rotl instruction, rotating the first argument, with |
| ;; wraparound, by the second argument |
| (func $__wasm_rotl_i64 (; 10 ;) (type $0) (param $var$0 i64) (param $var$1 i64) (result i64) |
| (local $var$2 i64) |
| (i64.or |
| (i64.shl |
| (i64.and |
| (i64.shr_u |
| (i64.const -1) |
| (local.tee $var$2 |
| (i64.and |
| (local.get $var$1) |
| (i64.const 63) |
| ) |
| ) |
| ) |
| (local.get $var$0) |
| ) |
| (local.get $var$2) |
| ) |
| (i64.shr_u |
| (i64.and |
| (i64.shl |
| (i64.const -1) |
| (local.tee $var$1 |
| (i64.and |
| (i64.sub |
| (i64.const 0) |
| (local.get $var$1) |
| ) |
| (i64.const 63) |
| ) |
| ) |
| ) |
| (local.get $var$0) |
| ) |
| (local.get $var$1) |
| ) |
| ) |
| ) |
| ;; lowering of the i64.rotr instruction, rotating the first argument, with |
| ;; wraparound, by the second argument |
| (func $__wasm_rotr_i64 (; 11 ;) (type $0) (param $var$0 i64) (param $var$1 i64) (result i64) |
| (local $var$2 i64) |
| (i64.or |
| (i64.shr_u |
| (i64.and |
| (i64.shl |
| (i64.const -1) |
| (local.tee $var$2 |
| (i64.and |
| (local.get $var$1) |
| (i64.const 63) |
| ) |
| ) |
| ) |
| (local.get $var$0) |
| ) |
| (local.get $var$2) |
| ) |
| (i64.shl |
| (i64.and |
| (i64.shr_u |
| (i64.const -1) |
| (local.tee $var$1 |
| (i64.and |
| (i64.sub |
| (i64.const 0) |
| (local.get $var$1) |
| ) |
| (i64.const 63) |
| ) |
| ) |
| ) |
| (local.get $var$0) |
| ) |
| (local.get $var$1) |
| ) |
| ) |
| ) |
| ;; lowering of the f32.nearest instruction, rounding the input to the nearest |
| ;; integer while breaking ties by rounding to even |
| (func $__wasm_nearest_f32 (; 12 ;) (type $1) (param $var$0 f32) (result f32) |
| (local $var$1 f32) |
| (local $var$2 f32) |
| (if |
| (i32.eqz |
| (f32.lt |
| (local.tee $var$2 |
| (f32.sub |
| (local.get $var$0) |
| (local.tee $var$1 |
| (f32.floor |
| (local.get $var$0) |
| ) |
| ) |
| ) |
| ) |
| (f32.const 0.5) |
| ) |
| ) |
| (then |
| (block |
| (local.set $var$0 |
| (f32.ceil |
| (local.get $var$0) |
| ) |
| ) |
| (if |
| (f32.gt |
| (local.get $var$2) |
| (f32.const 0.5) |
| ) |
| (then |
| (return |
| (local.get $var$0) |
| ) |
| ) |
| ) |
| (local.set $var$1 |
| (select |
| (local.get $var$1) |
| (local.get $var$0) |
| (f32.eq |
| (f32.sub |
| (local.tee $var$2 |
| (f32.mul |
| (local.get $var$1) |
| (f32.const 0.5) |
| ) |
| ) |
| (f32.floor |
| (local.get $var$2) |
| ) |
| ) |
| (f32.const 0) |
| ) |
| ) |
| ) |
| ) |
| ) |
| ) |
| (local.get $var$1) |
| ) |
| ;; lowering of the f64.nearest instruction, rounding the input to the nearest |
| ;; integer while breaking ties by rounding to even |
| (func $__wasm_nearest_f64 (; 13 ;) (type $2) (param $var$0 f64) (result f64) |
| (local $var$1 f64) |
| (local $var$2 f64) |
| (if |
| (i32.eqz |
| (f64.lt |
| (local.tee $var$2 |
| (f64.sub |
| (local.get $var$0) |
| (local.tee $var$1 |
| (f64.floor |
| (local.get $var$0) |
| ) |
| ) |
| ) |
| ) |
| (f64.const 0.5) |
| ) |
| ) |
| (then |
| (block |
| (local.set $var$0 |
| (f64.ceil |
| (local.get $var$0) |
| ) |
| ) |
| (if |
| (f64.gt |
| (local.get $var$2) |
| (f64.const 0.5) |
| ) |
| (then |
| (return |
| (local.get $var$0) |
| ) |
| ) |
| ) |
| (local.set $var$1 |
| (select |
| (local.get $var$1) |
| (local.get $var$0) |
| (f64.eq |
| (f64.sub |
| (local.tee $var$2 |
| (f64.mul |
| (local.get $var$1) |
| (f64.const 0.5) |
| ) |
| ) |
| (f64.floor |
| (local.get $var$2) |
| ) |
| ) |
| (f64.const 0) |
| ) |
| ) |
| ) |
| ) |
| ) |
| ) |
| (local.get $var$1) |
| ) |
| (func $_ZN17compiler_builtins3int4udiv10divmod_u6417h6026910b5ed08e40E (; 14 ;) (type $0) (param $var$0 i64) (param $var$1 i64) (result i64) |
| (local $var$2 i32) |
| (local $var$3 i32) |
| (local $var$4 i32) |
| (local $var$5 i64) |
| (local $var$6 i64) |
| (local $var$7 i64) |
| (local $var$8 i64) |
| (block $label$1 |
| (block $label$2 |
| (block $label$3 |
| (block $label$4 |
| (block $label$5 |
| (block $label$6 |
| (block $label$7 |
| (block $label$8 |
| (block $label$9 |
| (block $label$10 |
| (block $label$11 |
| (if |
| (local.tee $var$2 |
| (i32.wrap_i64 |
| (i64.shr_u |
| (local.get $var$0) |
| (i64.const 32) |
| ) |
| ) |
| ) |
| (then |
| (block |
| (br_if $label$11 |
| (i32.eqz |
| (local.tee $var$3 |
| (i32.wrap_i64 |
| (local.get $var$1) |
| ) |
| ) |
| ) |
| ) |
| (br_if $label$9 |
| (i32.eqz |
| (local.tee $var$4 |
| (i32.wrap_i64 |
| (i64.shr_u |
| (local.get $var$1) |
| (i64.const 32) |
| ) |
| ) |
| ) |
| ) |
| ) |
| (br_if $label$8 |
| (i32.le_u |
| (local.tee $var$2 |
| (i32.sub |
| (i32.clz |
| (local.get $var$4) |
| ) |
| (i32.clz |
| (local.get $var$2) |
| ) |
| ) |
| ) |
| (i32.const 31) |
| ) |
| ) |
| (br $label$2) |
| ) |
| ) |
| ) |
| (br_if $label$2 |
| (i64.ge_u |
| (local.get $var$1) |
| (i64.const 4294967296) |
| ) |
| ) |
| (global.set $__wasm-intrinsics-temp-i64 |
| (i64.extend_i32_u |
| (i32.sub |
| (local.tee $var$2 |
| (i32.wrap_i64 |
| (local.get $var$0) |
| ) |
| ) |
| (i32.mul |
| (local.tee $var$2 |
| (i32.div_u |
| (local.get $var$2) |
| (local.tee $var$3 |
| (i32.wrap_i64 |
| (local.get $var$1) |
| ) |
| ) |
| ) |
| ) |
| (local.get $var$3) |
| ) |
| ) |
| ) |
| ) |
| (return |
| (i64.extend_i32_u |
| (local.get $var$2) |
| ) |
| ) |
| ) |
| (local.set $var$3 |
| (i32.wrap_i64 |
| (i64.shr_u |
| (local.get $var$1) |
| (i64.const 32) |
| ) |
| ) |
| ) |
| (br_if $label$7 |
| (i32.eqz |
| (i32.wrap_i64 |
| (local.get $var$0) |
| ) |
| ) |
| ) |
| (br_if $label$6 |
| (i32.eqz |
| (local.get $var$3) |
| ) |
| ) |
| (br_if $label$6 |
| (i32.and |
| (local.tee $var$4 |
| (i32.add |
| (local.get $var$3) |
| (i32.const -1) |
| ) |
| ) |
| (local.get $var$3) |
| ) |
| ) |
| (global.set $__wasm-intrinsics-temp-i64 |
| (i64.or |
| (i64.shl |
| (i64.extend_i32_u |
| (i32.and |
| (local.get $var$4) |
| (local.get $var$2) |
| ) |
| ) |
| (i64.const 32) |
| ) |
| (i64.and |
| (local.get $var$0) |
| (i64.const 4294967295) |
| ) |
| ) |
| ) |
| (return |
| (i64.extend_i32_u |
| (i32.shr_u |
| (local.get $var$2) |
| (i32.and |
| (i32.ctz |
| (local.get $var$3) |
| ) |
| (i32.const 31) |
| ) |
| ) |
| ) |
| ) |
| ) |
| (unreachable) |
| ) |
| (br_if $label$5 |
| (i32.eqz |
| (i32.and |
| (local.tee $var$4 |
| (i32.add |
| (local.get $var$3) |
| (i32.const -1) |
| ) |
| ) |
| (local.get $var$3) |
| ) |
| ) |
| ) |
| (local.set $var$3 |
| (i32.sub |
| (i32.const 0) |
| (local.tee $var$2 |
| (i32.sub |
| (i32.add |
| (i32.clz |
| (local.get $var$3) |
| ) |
| (i32.const 33) |
| ) |
| (i32.clz |
| (local.get $var$2) |
| ) |
| ) |
| ) |
| ) |
| ) |
| (br $label$3) |
| ) |
| (local.set $var$3 |
| (i32.sub |
| (i32.const 63) |
| (local.get $var$2) |
| ) |
| ) |
| (local.set $var$2 |
| (i32.add |
| (local.get $var$2) |
| (i32.const 1) |
| ) |
| ) |
| (br $label$3) |
| ) |
| (global.set $__wasm-intrinsics-temp-i64 |
| (i64.shl |
| (i64.extend_i32_u |
| (i32.sub |
| (local.get $var$2) |
| (i32.mul |
| (local.tee $var$4 |
| (i32.div_u |
| (local.get $var$2) |
| (local.get $var$3) |
| ) |
| ) |
| (local.get $var$3) |
| ) |
| ) |
| ) |
| (i64.const 32) |
| ) |
| ) |
| (return |
| (i64.extend_i32_u |
| (local.get $var$4) |
| ) |
| ) |
| ) |
| (br_if $label$4 |
| (i32.lt_u |
| (local.tee $var$2 |
| (i32.sub |
| (i32.clz |
| (local.get $var$3) |
| ) |
| (i32.clz |
| (local.get $var$2) |
| ) |
| ) |
| ) |
| (i32.const 31) |
| ) |
| ) |
| (br $label$2) |
| ) |
| (global.set $__wasm-intrinsics-temp-i64 |
| (i64.extend_i32_u |
| (i32.and |
| (local.get $var$4) |
| (i32.wrap_i64 |
| (local.get $var$0) |
| ) |
| ) |
| ) |
| ) |
| (br_if $label$1 |
| (i32.eq |
| (local.get $var$3) |
| (i32.const 1) |
| ) |
| ) |
| (return |
| (i64.shr_u |
| (local.get $var$0) |
| (i64.extend_i32_u |
| (i32.ctz |
| (local.get $var$3) |
| ) |
| ) |
| ) |
| ) |
| ) |
| (local.set $var$3 |
| (i32.sub |
| (i32.const 63) |
| (local.get $var$2) |
| ) |
| ) |
| (local.set $var$2 |
| (i32.add |
| (local.get $var$2) |
| (i32.const 1) |
| ) |
| ) |
| ) |
| (local.set $var$5 |
| (i64.shr_u |
| (local.get $var$0) |
| (i64.extend_i32_u |
| (i32.and |
| (local.get $var$2) |
| (i32.const 63) |
| ) |
| ) |
| ) |
| ) |
| (local.set $var$0 |
| (i64.shl |
| (local.get $var$0) |
| (i64.extend_i32_u |
| (i32.and |
| (local.get $var$3) |
| (i32.const 63) |
| ) |
| ) |
| ) |
| ) |
| (block $label$13 |
| (if |
| (local.get $var$2) |
| (then |
| (block |
| (local.set $var$8 |
| (i64.add |
| (local.get $var$1) |
| (i64.const -1) |
| ) |
| ) |
| (loop $label$15 |
| (local.set $var$5 |
| (i64.sub |
| (local.tee $var$5 |
| (i64.or |
| (i64.shl |
| (local.get $var$5) |
| (i64.const 1) |
| ) |
| (i64.shr_u |
| (local.get $var$0) |
| (i64.const 63) |
| ) |
| ) |
| ) |
| (i64.and |
| (local.tee $var$6 |
| (i64.shr_s |
| (i64.sub |
| (local.get $var$8) |
| (local.get $var$5) |
| ) |
| (i64.const 63) |
| ) |
| ) |
| (local.get $var$1) |
| ) |
| ) |
| ) |
| (local.set $var$0 |
| (i64.or |
| (i64.shl |
| (local.get $var$0) |
| (i64.const 1) |
| ) |
| (local.get $var$7) |
| ) |
| ) |
| (local.set $var$7 |
| (local.tee $var$6 |
| (i64.and |
| (local.get $var$6) |
| (i64.const 1) |
| ) |
| ) |
| ) |
| (br_if $label$15 |
| (local.tee $var$2 |
| (i32.add |
| (local.get $var$2) |
| (i32.const -1) |
| ) |
| ) |
| ) |
| ) |
| (br $label$13) |
| ) |
| ) |
| ) |
| ) |
| (global.set $__wasm-intrinsics-temp-i64 |
| (local.get $var$5) |
| ) |
| (return |
| (i64.or |
| (i64.shl |
| (local.get $var$0) |
| (i64.const 1) |
| ) |
| (local.get $var$6) |
| ) |
| ) |
| ) |
| (global.set $__wasm-intrinsics-temp-i64 |
| (local.get $var$0) |
| ) |
| (local.set $var$0 |
| (i64.const 0) |
| ) |
| ) |
| (local.get $var$0) |
| ) |
| (func $_ZN17compiler_builtins3int3mul3Mul3mul17h070e9a1c69faec5bE (; 15 ;) (type $0) (param $var$0 i64) (param $var$1 i64) (result i64) |
| (local $var$2 i32) |
| (local $var$3 i32) |
| (local $var$4 i32) |
| (local $var$5 i32) |
| (local $var$6 i32) |
| (i64.or |
| (i64.shl |
| (i64.extend_i32_u |
| (i32.add |
| (i32.add |
| (i32.add |
| (i32.add |
| (i32.mul |
| (local.tee $var$4 |
| (i32.shr_u |
| (local.tee $var$2 |
| (i32.wrap_i64 |
| (local.get $var$1) |
| ) |
| ) |
| (i32.const 16) |
| ) |
| ) |
| (local.tee $var$5 |
| (i32.shr_u |
| (local.tee $var$3 |
| (i32.wrap_i64 |
| (local.get $var$0) |
| ) |
| ) |
| (i32.const 16) |
| ) |
| ) |
| ) |
| (i32.mul |
| (local.get $var$2) |
| (i32.wrap_i64 |
| (i64.shr_u |
| (local.get $var$0) |
| (i64.const 32) |
| ) |
| ) |
| ) |
| ) |
| (i32.mul |
| (i32.wrap_i64 |
| (i64.shr_u |
| (local.get $var$1) |
| (i64.const 32) |
| ) |
| ) |
| (local.get $var$3) |
| ) |
| ) |
| (i32.shr_u |
| (local.tee $var$2 |
| (i32.add |
| (i32.shr_u |
| (local.tee $var$6 |
| (i32.mul |
| (local.tee $var$2 |
| (i32.and |
| (local.get $var$2) |
| (i32.const 65535) |
| ) |
| ) |
| (local.tee $var$3 |
| (i32.and |
| (local.get $var$3) |
| (i32.const 65535) |
| ) |
| ) |
| ) |
| ) |
| (i32.const 16) |
| ) |
| (i32.mul |
| (local.get $var$2) |
| (local.get $var$5) |
| ) |
| ) |
| ) |
| (i32.const 16) |
| ) |
| ) |
| (i32.shr_u |
| (local.tee $var$2 |
| (i32.add |
| (i32.and |
| (local.get $var$2) |
| (i32.const 65535) |
| ) |
| (i32.mul |
| (local.get $var$4) |
| (local.get $var$3) |
| ) |
| ) |
| ) |
| (i32.const 16) |
| ) |
| ) |
| ) |
| (i64.const 32) |
| ) |
| (i64.extend_i32_u |
| (i32.or |
| (i32.shl |
| (local.get $var$2) |
| (i32.const 16) |
| ) |
| (i32.and |
| (local.get $var$6) |
| (i32.const 65535) |
| ) |
| ) |
| ) |
| ) |
| ) |
| (func $_ZN17compiler_builtins3int4sdiv3Div3div17he78fc483e41d7ec7E (; 16 ;) (type $0) (param $var$0 i64) (param $var$1 i64) (result i64) |
| (local $var$2 i64) |
| (i64.sub |
| (i64.xor |
| (i64.div_u |
| (i64.sub |
| (i64.xor |
| (local.tee $var$2 |
| (i64.shr_s |
| (local.get $var$0) |
| (i64.const 63) |
| ) |
| ) |
| (local.get $var$0) |
| ) |
| (local.get $var$2) |
| ) |
| (i64.sub |
| (i64.xor |
| (local.tee $var$2 |
| (i64.shr_s |
| (local.get $var$1) |
| (i64.const 63) |
| ) |
| ) |
| (local.get $var$1) |
| ) |
| (local.get $var$2) |
| ) |
| ) |
| (local.tee $var$0 |
| (i64.shr_s |
| (i64.xor |
| (local.get $var$1) |
| (local.get $var$0) |
| ) |
| (i64.const 63) |
| ) |
| ) |
| ) |
| (local.get $var$0) |
| ) |
| ) |
| (func $_ZN17compiler_builtins3int4sdiv3Mod4mod_17h2cbb7bbf36e41d68E (; 17 ;) (type $0) (param $var$0 i64) (param $var$1 i64) (result i64) |
| (local $var$2 i64) |
| (i64.sub |
| (i64.xor |
| (i64.rem_u |
| (i64.sub |
| (i64.xor |
| (local.tee $var$2 |
| (i64.shr_s |
| (local.get $var$0) |
| (i64.const 63) |
| ) |
| ) |
| (local.get $var$0) |
| ) |
| (local.get $var$2) |
| ) |
| (i64.sub |
| (i64.xor |
| (local.tee $var$0 |
| (i64.shr_s |
| (local.get $var$1) |
| (i64.const 63) |
| ) |
| ) |
| (local.get $var$1) |
| ) |
| (local.get $var$0) |
| ) |
| ) |
| (local.get $var$2) |
| ) |
| (local.get $var$2) |
| ) |
| ) |
| ;; custom section "linking", size 3 |
| ) |