WebAssembly Intermediate Representation

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 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
- [x] u32
- [ ] u64
- [ ] s32
- [ ] s64
- [ ] f32
- [ ] f64
- [ ] v128
- [ ] name
Types
- [x] u32
- [ ] u64
- [ ] s32
- [ ] s64
- [x] f32
- [x] f64
- [x] v128
- [ ] name
- [x] reference
- [x] limit
- [x] function
Instructions
Control
- [ ] unreachable
- [ ] nop
- [ ] block
- [ ] if
- [ ] else
- [ ] br
- [ ] br_if
- [ ] br_table
- [ ] return
- [x] call
- [x] call_indirect
Reference
- [x] ref.null
- [x] ref.is_null
- [x] ref.func
Parametric
- [x] drop
- [ ] select
- [ ] select t
Variable
- [x] local.get
- [x] local.set
- [ ] local.tee
- [ ] global.get
- [ ] global.set
Table
- [ ] table.get
- [ ] table.set
- [x] 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
- [x] 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
- [x] 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
- [x] Type
- [ ] Import
- [x] Func
- [x] Table
- [x] Mem
- [ ] Global
- [x] Function
- [x] Table
- [x] Memory
- [ ] Global
- [ ] Export
- [x] Func
- [x] Table
- [x] Mem
- [ ] Global
- [ ] Start
- [x] Element (except declarative)
- [ ] Data count
- [x] Code
- [x] Data
- [ ] Custom
Contributors