#intermediate-representation #table #memory #reference

yanked wasm-ir

An Intermediate Representation of WebAssembly

0.1.9 Mar 23, 2022
0.1.8 Mar 14, 2022

#60 in #intermediate-representation

AGPL-3.0-only

72KB
1K SLoC

WebAssembly Intermediate Representation

License Maintenance Stability Crates.io latest version Crates.io total downloads Liberapay receiving

This is an Intermediate Representation which can be compiled into WebAssembly.

The source code is in an experimental state and will be fully documented in its final version.

Warning : we do not recommend to use this code in a production environment, even if it theoretically works we haven't finished writing tests to make sure everything works and avoid regressions.

The codebase is licensed under GNU Affero General Public License v3, you have the right to exploit this source code but it must remain open-source and under the same license, thanks for your support !

If you want to join the development and contribute to the project, please reach us at contact@blueforest.cc.

Todo

Values

  • u32
  • u64
  • s32
  • s64
  • f32
  • f64
  • v128
  • name

Types

  • u32
  • u64
  • s32
  • s64
  • f32
  • f64
  • v128
  • name
  • reference
    • function
    • extern
  • limit
  • function

Instructions

Control

  • unreachable
  • nop
  • block
  • if
  • else
  • br
  • br_if
  • br_table
  • return
  • call
  • call_indirect

Reference

  • ref.null
  • ref.is_null
  • ref.func

Parametric

  • drop
  • select
  • select t

Variable

  • local.get
  • local.set
  • local.tee
  • global.get
  • global.set

Table

  • table.get
  • table.set
  • table.init
  • elem.drop
  • table.copy
  • table.grow
  • table.size
  • table.fill

Memory

  • i32.load
  • i64.load
  • f32.load
  • f64.load
  • i32.load8_s
  • i32.load8_u
  • i32.load16_s
  • i32.load16_u
  • i64.load8_s
  • i64.load8_u
  • i64.load16_s
  • i64.load16_u
  • i64.load32_s
  • i64.load32_u
  • i32.store
  • i64.store
  • f32.store
  • f64.store
  • i32.store8
  • i32.store16
  • i64.store8
  • i64.store16
  • i64.store32
  • memory.size
  • memory.grow
  • memory.init
  • data.drop
  • memory.copy
  • memory.fill

Numeric

  • i32.const
  • i64.const
  • f32.const
  • f64.const
  • i32.eqz
  • i32.eq
  • i32.ne
  • i32.lt_s
  • i32.lt_u
  • i32.gt_s
  • i32.gt_u
  • i32.le_s
  • i32.le_u
  • i32.ge_s
  • i32.ge_u
  • i64.eqz
  • i64.eq
  • i64.ne
  • i64.lt_s
  • i64.lt_u
  • i64.gt_s
  • i64.gt_u
  • i64.le_s
  • i64.le_u
  • i64.ge_s
  • i64.ge_u
  • f32.eq
  • f32.ne
  • f32.lt
  • f32.gt
  • f32.le
  • f32.ge
  • f64.eq
  • f64.ne
  • f64.lt
  • f64.gt
  • f64.le
  • f64.ge
  • i32.clz
  • i32.ctz
  • i32.popcnt
  • i32.add
  • i32.sub
  • i32.mul
  • i32.div_s
  • i32.div_u
  • i32.rem_s
  • i32.rem_u
  • i32.and
  • i32.or
  • i32.xor
  • i32.shl
  • i32.shr_s
  • i32.shr_u
  • i32.rotl
  • i32.rotr
  • i64.clz
  • i64.ctz
  • i64.popcnt
  • i64.add
  • i64.sub
  • i64.mul
  • i64.div_s
  • i64.div_u
  • i64.rem_s
  • i64.rem_u
  • i64.and
  • i64.or
  • i64.xor
  • i64.shl
  • i64.shr_s
  • i64.shr_u
  • i64.rotl
  • i64.rotr
  • f32.abs
  • f32.neg
  • f32.ceil
  • f32.floor
  • f32.trunc
  • f32.nearest
  • f32.sqrt
  • f32.add
  • f32.sub
  • f32.mul
  • f32.div
  • f32.min
  • f32.max
  • f32.copysign
  • f64.abs
  • f64.neg
  • f64.ceil
  • f64.floor
  • f64.trunc
  • f64.nearest
  • f64.sqrt
  • f64.add
  • f64.sub
  • f64.mul
  • f64.div
  • f64.min
  • f64.max
  • f64.copysign
  • i32.wrap_i64
  • i32.trunc_f32_s
  • i32.trunc_f32_u
  • i32.trunc_f64_s
  • i32.trunc_f64_u
  • i64.extend_i32_s
  • i64.extend_i32_u
  • i64.trunc_f32_s
  • i64.trunc_f32_u
  • i64.trunc_f64_s
  • i64.trunc_f64_u
  • f32.convert_i32_s
  • f32.convert_i32_u
  • f32.convert_i64_s
  • f32.convert_i64_u
  • f32.demote_f64
  • f64.convert_i32_s
  • f64.convert_i32_u
  • f64.convert_i64_s
  • f64.convert_i64_u
  • f64.promote_f32
  • i32.reinterpret_f32
  • i64.reinterpret_f64
  • f32.reinterpret_i32
  • f64.reinterpret_i64
  • i32.extend8_s
  • i32.extend16_s
  • i64.extend8_s
  • i64.extend16_s
  • i64.extend32_s
  • i32.trunc_sat_f32_s
  • i32.trunc_sat_f32_u
  • i32.trunc_sat_f64_s
  • i32.trunc_sat_f64_u
  • i64.trunc_sat_f32_s
  • i64.trunc_sat_f32_u
  • i64.trunc_sat_f64_s
  • i64.trunc_sat_f64_u
  • v128.load
  • v128.load8x8_s
  • v128.load8x8_u
  • v128.load16x4_s
  • v128.load16x4_u
  • v128.load32x2_s
  • v128.load32x2_u
  • v128.load8_splat
  • v128.load16_splat
  • v128.load32_splat
  • v128.load64_splat
  • v128.load32_zero
  • v128.load64_zero
  • v128.store
  • v128.load8_lane
  • v128.load16_lane
  • v128.load32_lane
  • v128.load64_lane
  • v128.store8_lane
  • v128.store16_lane
  • v128.store32_lane
  • v128.store64_lane
  • v128.const
  • i8x16.shuffle
  • i8x16.extract_lane_s
  • i8x16.extract_lane_u
  • i8x16.replace_lane
  • i16x8.extract_lane_s
  • i16x8.extract_lane_u
  • i16x8.replace_lane
  • i32x4.extract_lane
  • i32x4.replace_lane
  • i64x2.extract_lane
  • i64x2.replace_lane
  • f32x4.extract_lane
  • f32x4.replace_lane
  • f64x2.extract_lane
  • f64x2.replace_lane
  • i8x16.swizzle
  • i8x16.splat
  • i16x8.splat
  • i32x4.splat
  • i64x2.splat
  • f32x4.splat
  • f64x2.splat
  • i8x16.eq
  • i8x16.ne
  • i8x16.lt_s
  • i8x16.lt_u
  • i8x16.gt_s
  • i8x16.gt_u
  • i8x16.le_s
  • i8x16.le_u
  • i8x16.ge_s
  • i8x16.ge_u
  • i16x8.eq
  • i16x8.ne
  • i16x8.lt_s
  • i16x8.lt_u
  • i16x8.gt_s
  • i16x8.gt_u
  • i16x8.le_s
  • i16x8.le_u
  • i16x8.ge_s
  • i16x8.ge_u
  • i32x4.eq
  • i32x4.ne
  • i32x4.lt_s
  • i32x4.lt_u
  • i32x4.gt_s
  • i32x4.gt_u
  • i32x4.le_s
  • i32x4.le_u
  • i32x4.ge_s
  • i32x4.ge_u
  • i64x2.eq
  • i64x2.ne
  • i64x2.lt_s
  • i64x2.gt_s
  • i64x2.le_s
  • i64x2.ge_s
  • f32x4.eq
  • f32x4.ne
  • f32x4.lt
  • f32x4.gt
  • f32x4.le
  • f32x4.ge
  • f64x2.eq
  • f64x2.ne
  • f64x2.lt
  • f64x2.gt
  • f64x2.le
  • f64x2.ge
  • v128.not
  • v128.and
  • v128.andnot
  • v128.or
  • v128.xor
  • v128.bitselect
  • v128.any_true
  • i8x16.abs
  • i8x16.neg
  • i8x16.popcnt
  • i8x16.all_true
  • i8x16.bitmask
  • i8x16.narrow_i16x8_s
  • i8x16.narrow_i16x8_u
  • i8x16.shl
  • i8x16.shr_s
  • i8x16.shr_u
  • i8x16.add
  • i8x16.add_sat_s
  • i8x16.add_sat_u
  • i8x16.sub
  • i8x16.sub_sat_s
  • i8x16.sub_sat_u
  • i8x16.min_s
  • i8x16.min_u
  • i8x16.max_s
  • i8x16.max_u
  • i8x16.avgr_u
  • i16x8.extadd_pairwise_i8x16_s
  • i16x8.extadd_pairwise_i8x16_u
  • i16x8.abs
  • i16x8.neg
  • i16x8.q15mulr_sat_s
  • i16x8.all_true
  • i16x8.bitmask
  • i16x8.narrow_i32x4_s
  • i16x8.narrow_i32x4_u
  • i16x8.extend_low_i8x16_s
  • i16x8.extend_high_i8x16_s
  • i16x8.extend_low_i8x16_u
  • i16x8.extend_high_i8x16_u
  • i16x8.shl
  • i16x8.shr_s
  • i16x8.shr_u
  • i16x8.add
  • i16x8.add_sat_s
  • i16x8.add_sat_u
  • i16x8.sub
  • i16x8.sub_sat_s
  • i16x8.sub_sat_u
  • i16x8.mul
  • i16x8.min_s
  • i16x8.min_u
  • i16x8.max_s
  • i16x8.max_u
  • i16x8.avgr_u
  • i16x8.extmul_low_i8x16_s
  • i16x8.extmul_high_i8x16_s
  • i16x8.extmul_low_i8x16_u
  • i16x8.extmul_high_i8x16_u
  • i32x4.extadd_pairwise_i8x16_s
  • i32x4.extadd_pairwise_i8x16_u
  • i32x4.abs
  • i32x4.neg
  • i32x4.all_true
  • i32x4.bitmask
  • i32x4.extend_low_i16x8_s
  • i32x4.extend_high_i16x8_s
  • i32x4.extend_low_i16x8_u
  • i32x4.extend_high_i16x8_u
  • i32x4.shl
  • i32x4.shr_s
  • i32x4.shr_u
  • i32x4.add
  • i32x4.sub
  • i32x4.mul
  • i32x4.min_s
  • i32x4.min_u
  • i32x4.max_s
  • i32x4.max_u
  • i32x4.dot_i16x8_s
  • i32x4.extmul_low_i16x8_s
  • i32x4.extmul_high_i16x8_s
  • i32x4.extmul_low_i16x8_u
  • i32x4.extmul_high_i16x8_u
  • i64x2.abs
  • i64x2.neg
  • i64x2.all_true
  • i64x2.bitmask
  • i64x2.extend_low_i32x4_s
  • i64x2.extend_high_i32x4_s
  • i64x2.extend_low_i32x4_u
  • i64x2.extend_high_i32x4_u
  • i64x2.shl
  • i64x2.shr_s
  • i64x2.shr_u
  • i64x2.add
  • i64x2.sub
  • i64x2.mul
  • i64x2.extmul_low_i32x4_s
  • i64x2.extmul_high_i32x4_s
  • i64x2.extmul_low_i32x4_u
  • i64x2.extmul_high_i32x4_u
  • f32x4.ceil
  • f32x4.floor
  • f32x4.trunc
  • f32x4.nearest
  • f32x4.abs
  • f32x4.neg
  • f32x4.sqrt
  • f32x4.add
  • f32x4.sub
  • f32x4.mul
  • f32x4.div
  • f32x4.min
  • f32x4.max
  • f32x4.pmin
  • f32x4.pmax
  • f64x2.ceil
  • f64x2.floor
  • f64x2.trunc
  • f64x2.nearest
  • f64x2.abs
  • f64x2.neg
  • f64x2.sqrt
  • f64x2.add
  • f64x2.sub
  • f64x2.mul
  • f64x2.div
  • f64x2.min
  • f64x2.max
  • f64x2.pmin
  • f64x2.pmax
  • i32x4.trunc_sat_f32x4_s
  • i32x4.trunc_sat_f32x4_u
  • f32x4.convert_i32x4_s
  • f32x4.convert_i32x4_u
  • i32x4.trunc_sat_f64x2_s_zero
  • i32x4.trunc_sat_f64x2_u_zero
  • f64x2.convert_low_i32x4_s
  • f64x2.convert_low_i32x4_u
  • f32x4.demote_f64x2_zero
  • f64x2.promote_low_f32x4

Module

  • Type
  • Import
    • Func
    • Table
    • Mem
    • Global
  • Function
  • Table
  • Memory
  • Global
  • Export
    • Func
    • Table
    • Mem
    • Global
  • Start
  • Element (except declarative)
  • Data count
  • Code
  • Data
  • Custom

Contributors

No runtime deps