From f44e3a652709c2141100ba02fb89b556f6b11fda Mon Sep 17 00:00:00 2001 From: Ng Zhi An Date: Thu, 1 Aug 2019 16:01:54 -0700 Subject: [PATCH] Add integer widen/narrow conversions (#89) * Add integer widen/narrow conversions * Fix names, add explanation on signed/unsigned narrowing --- proposals/simd/BinarySIMD.md | 306 +++++++++++++------------ proposals/simd/ImplementationStatus.md | 306 +++++++++++++------------ proposals/simd/SIMD.md | 24 ++ 3 files changed, 342 insertions(+), 294 deletions(-) diff --git a/proposals/simd/BinarySIMD.md b/proposals/simd/BinarySIMD.md index baa5fbd65b..13615d3635 100644 --- a/proposals/simd/BinarySIMD.md +++ b/proposals/simd/BinarySIMD.md @@ -25,150 +25,162 @@ instr ::= ... Some SIMD instructions have additional immediate operands following `simdop`. The `v8x16.shuffle` instruction has 16 bytes after `simdop`. -| Instruction | `simdop` | Immediate operands | -| --------------------------|---------:|--------------------| -| `v128.load` | `0x00`| m:memarg | -| `v128.store` | `0x01`| m:memarg | -| `v128.const` | `0x02`| i:ImmByte[16] | -| `i8x16.splat` | `0x04`| - | -| `i8x16.extract_lane_s` | `0x05`| i:LaneIdx16 | -| `i8x16.extract_lane_u` | `0x06`| i:LaneIdx16 | -| `i8x16.replace_lane` | `0x07`| i:LaneIdx16 | -| `i16x8.splat` | `0x08`| - | -| `i16x8.extract_lane_s` | `0x09`| i:LaneIdx8 | -| `i16x8.extract_lane_u` | `0x0a`| i:LaneIdx8 | -| `i16x8.replace_lane` | `0x0b`| i:LaneIdx8 | -| `i32x4.splat` | `0x0c`| - | -| `i32x4.extract_lane` | `0x0d`| i:LaneIdx4 | -| `i32x4.replace_lane` | `0x0e`| i:LaneIdx4 | -| `i64x2.splat` | `0x0f`| - | -| `i64x2.extract_lane` | `0x10`| i:LaneIdx2 | -| `i64x2.replace_lane` | `0x11`| i:LaneIdx2 | -| `f32x4.splat` | `0x12`| - | -| `f32x4.extract_lane` | `0x13`| i:LaneIdx4 | -| `f32x4.replace_lane` | `0x14`| i:LaneIdx4 | -| `f64x2.splat` | `0x15`| - | -| `f64x2.extract_lane` | `0x16`| i:LaneIdx2 | -| `f64x2.replace_lane` | `0x17`| i:LaneIdx2 | -| `i8x16.eq` | `0x18`| - | -| `i8x16.ne` | `0x19`| - | -| `i8x16.lt_s` | `0x1a`| - | -| `i8x16.lt_u` | `0x1b`| - | -| `i8x16.gt_s` | `0x1c`| - | -| `i8x16.gt_u` | `0x1d`| - | -| `i8x16.le_s` | `0x1e`| - | -| `i8x16.le_u` | `0x1f`| - | -| `i8x16.ge_s` | `0x20`| - | -| `i8x16.ge_u` | `0x21`| - | -| `i16x8.eq` | `0x22`| - | -| `i16x8.ne` | `0x23`| - | -| `i16x8.lt_s` | `0x24`| - | -| `i16x8.lt_u` | `0x25`| - | -| `i16x8.gt_s` | `0x26`| - | -| `i16x8.gt_u` | `0x27`| - | -| `i16x8.le_s` | `0x28`| - | -| `i16x8.le_u` | `0x29`| - | -| `i16x8.ge_s` | `0x2a`| - | -| `i16x8.ge_u` | `0x2b`| - | -| `i32x4.eq` | `0x2c`| - | -| `i32x4.ne` | `0x2d`| - | -| `i32x4.lt_s` | `0x2e`| - | -| `i32x4.lt_u` | `0x2f`| - | -| `i32x4.gt_s` | `0x30`| - | -| `i32x4.gt_u` | `0x31`| - | -| `i32x4.le_s` | `0x32`| - | -| `i32x4.le_u` | `0x33`| - | -| `i32x4.ge_s` | `0x34`| - | -| `i32x4.ge_u` | `0x35`| - | -| `f32x4.eq` | `0x40`| - | -| `f32x4.ne` | `0x41`| - | -| `f32x4.lt` | `0x42`| - | -| `f32x4.gt` | `0x43`| - | -| `f32x4.le` | `0x44`| - | -| `f32x4.ge` | `0x45`| - | -| `f64x2.eq` | `0x46`| - | -| `f64x2.ne` | `0x47`| - | -| `f64x2.lt` | `0x48`| - | -| `f64x2.gt` | `0x49`| - | -| `f64x2.le` | `0x4a`| - | -| `f64x2.ge` | `0x4b`| - | -| `v128.not` | `0x4c`| - | -| `v128.and` | `0x4d`| - | -| `v128.or` | `0x4e`| - | -| `v128.xor` | `0x4f`| - | -| `v128.bitselect` | `0x50`| - | -| `i8x16.neg` | `0x51`| - | -| `i8x16.any_true` | `0x52`| - | -| `i8x16.all_true` | `0x53`| - | -| `i8x16.shl` | `0x54`| - | -| `i8x16.shr_s` | `0x55`| - | -| `i8x16.shr_u` | `0x56`| - | -| `i8x16.add` | `0x57`| - | -| `i8x16.add_saturate_s` | `0x58`| - | -| `i8x16.add_saturate_u` | `0x59`| - | -| `i8x16.sub` | `0x5a`| - | -| `i8x16.sub_saturate_s` | `0x5b`| - | -| `i8x16.sub_saturate_u` | `0x5c`| - | -| `i8x16.mul` | `0x5d`| - | -| `i16x8.neg` | `0x62`| - | -| `i16x8.any_true` | `0x63`| - | -| `i16x8.all_true` | `0x64`| - | -| `i16x8.shl` | `0x65`| - | -| `i16x8.shr_s` | `0x66`| - | -| `i16x8.shr_u` | `0x67`| - | -| `i16x8.add` | `0x68`| - | -| `i16x8.add_saturate_s` | `0x69`| - | -| `i16x8.add_saturate_u` | `0x6a`| - | -| `i16x8.sub` | `0x6b`| - | -| `i16x8.sub_saturate_s` | `0x6c`| - | -| `i16x8.sub_saturate_u` | `0x6d`| - | -| `i16x8.mul` | `0x6e`| - | -| `i32x4.neg` | `0x73`| - | -| `i32x4.any_true` | `0x74`| - | -| `i32x4.all_true` | `0x75`| - | -| `i32x4.shl` | `0x76`| - | -| `i32x4.shr_s` | `0x77`| - | -| `i32x4.shr_u` | `0x78`| - | -| `i32x4.add` | `0x79`| - | -| `i32x4.sub` | `0x7c`| - | -| `i32x4.mul` | `0x7f`| - | -| `i64x2.neg` | `0x84`| - | -| `i64x2.any_true` | `0x85`| - | -| `i64x2.all_true` | `0x86`| - | -| `i64x2.shl` | `0x87`| - | -| `i64x2.shr_s` | `0x88`| - | -| `i64x2.shr_u` | `0x89`| - | -| `i64x2.add` | `0x8a`| - | -| `i64x2.sub` | `0x8d`| - | -| `f32x4.abs` | `0x95`| - | -| `f32x4.neg` | `0x96`| - | -| `f32x4.sqrt` | `0x97`| - | -| `f32x4.add` | `0x9a`| - | -| `f32x4.sub` | `0x9b`| - | -| `f32x4.mul` | `0x9c`| - | -| `f32x4.div` | `0x9d`| - | -| `f32x4.min` | `0x9e`| - | -| `f32x4.max` | `0x9f`| - | -| `f64x2.abs` | `0xa0`| - | -| `f64x2.neg` | `0xa1`| - | -| `f64x2.sqrt` | `0xa2`| - | -| `f64x2.add` | `0xa5`| - | -| `f64x2.sub` | `0xa6`| - | -| `f64x2.mul` | `0xa7`| - | -| `f64x2.div` | `0xa8`| - | -| `f64x2.min` | `0xa9`| - | -| `f64x2.max` | `0xaa`| - | -| `i32x4.trunc_s/f32x4:sat` | `0xab`| - | -| `i32x4.trunc_u/f32x4:sat` | `0xac`| - | -| `i64x2.trunc_s/f64x2:sat` | `0xad`| - | -| `i64x2.trunc_u/f64x2:sat` | `0xae`| - | -| `f32x4.convert_s/i32x4` | `0xaf`| - | -| `f32x4.convert_u/i32x4` | `0xb0`| - | -| `f64x2.convert_s/i64x2` | `0xb1`| - | -| `f64x2.convert_u/i64x2` | `0xb2`| - | -| `v8x16.swizzle` | `0xc0`| - | -| `v8x16.shuffle` | `0xc1`| s:LaneIdx32[16] | -| `i8x16.load_splat` | `0xc2`| - | -| `i16x8.load_splat` | `0xc3`| - | -| `i32x4.load_splat` | `0xc4`| - | -| `i64x2.load_splat` | `0xc5`| - | +| Instruction | `simdop` | Immediate operands | +| ---------------------------|---------:|--------------------| +| `v128.load` | `0x00`| m:memarg | +| `v128.store` | `0x01`| m:memarg | +| `v128.const` | `0x02`| i:ImmByte[16] | +| `i8x16.splat` | `0x04`| - | +| `i8x16.extract_lane_s` | `0x05`| i:LaneIdx16 | +| `i8x16.extract_lane_u` | `0x06`| i:LaneIdx16 | +| `i8x16.replace_lane` | `0x07`| i:LaneIdx16 | +| `i16x8.splat` | `0x08`| - | +| `i16x8.extract_lane_s` | `0x09`| i:LaneIdx8 | +| `i16x8.extract_lane_u` | `0x0a`| i:LaneIdx8 | +| `i16x8.replace_lane` | `0x0b`| i:LaneIdx8 | +| `i32x4.splat` | `0x0c`| - | +| `i32x4.extract_lane` | `0x0d`| i:LaneIdx4 | +| `i32x4.replace_lane` | `0x0e`| i:LaneIdx4 | +| `i64x2.splat` | `0x0f`| - | +| `i64x2.extract_lane` | `0x10`| i:LaneIdx2 | +| `i64x2.replace_lane` | `0x11`| i:LaneIdx2 | +| `f32x4.splat` | `0x12`| - | +| `f32x4.extract_lane` | `0x13`| i:LaneIdx4 | +| `f32x4.replace_lane` | `0x14`| i:LaneIdx4 | +| `f64x2.splat` | `0x15`| - | +| `f64x2.extract_lane` | `0x16`| i:LaneIdx2 | +| `f64x2.replace_lane` | `0x17`| i:LaneIdx2 | +| `i8x16.eq` | `0x18`| - | +| `i8x16.ne` | `0x19`| - | +| `i8x16.lt_s` | `0x1a`| - | +| `i8x16.lt_u` | `0x1b`| - | +| `i8x16.gt_s` | `0x1c`| - | +| `i8x16.gt_u` | `0x1d`| - | +| `i8x16.le_s` | `0x1e`| - | +| `i8x16.le_u` | `0x1f`| - | +| `i8x16.ge_s` | `0x20`| - | +| `i8x16.ge_u` | `0x21`| - | +| `i16x8.eq` | `0x22`| - | +| `i16x8.ne` | `0x23`| - | +| `i16x8.lt_s` | `0x24`| - | +| `i16x8.lt_u` | `0x25`| - | +| `i16x8.gt_s` | `0x26`| - | +| `i16x8.gt_u` | `0x27`| - | +| `i16x8.le_s` | `0x28`| - | +| `i16x8.le_u` | `0x29`| - | +| `i16x8.ge_s` | `0x2a`| - | +| `i16x8.ge_u` | `0x2b`| - | +| `i32x4.eq` | `0x2c`| - | +| `i32x4.ne` | `0x2d`| - | +| `i32x4.lt_s` | `0x2e`| - | +| `i32x4.lt_u` | `0x2f`| - | +| `i32x4.gt_s` | `0x30`| - | +| `i32x4.gt_u` | `0x31`| - | +| `i32x4.le_s` | `0x32`| - | +| `i32x4.le_u` | `0x33`| - | +| `i32x4.ge_s` | `0x34`| - | +| `i32x4.ge_u` | `0x35`| - | +| `f32x4.eq` | `0x40`| - | +| `f32x4.ne` | `0x41`| - | +| `f32x4.lt` | `0x42`| - | +| `f32x4.gt` | `0x43`| - | +| `f32x4.le` | `0x44`| - | +| `f32x4.ge` | `0x45`| - | +| `f64x2.eq` | `0x46`| - | +| `f64x2.ne` | `0x47`| - | +| `f64x2.lt` | `0x48`| - | +| `f64x2.gt` | `0x49`| - | +| `f64x2.le` | `0x4a`| - | +| `f64x2.ge` | `0x4b`| - | +| `v128.not` | `0x4c`| - | +| `v128.and` | `0x4d`| - | +| `v128.or` | `0x4e`| - | +| `v128.xor` | `0x4f`| - | +| `v128.bitselect` | `0x50`| - | +| `i8x16.neg` | `0x51`| - | +| `i8x16.any_true` | `0x52`| - | +| `i8x16.all_true` | `0x53`| - | +| `i8x16.shl` | `0x54`| - | +| `i8x16.shr_s` | `0x55`| - | +| `i8x16.shr_u` | `0x56`| - | +| `i8x16.add` | `0x57`| - | +| `i8x16.add_saturate_s` | `0x58`| - | +| `i8x16.add_saturate_u` | `0x59`| - | +| `i8x16.sub` | `0x5a`| - | +| `i8x16.sub_saturate_s` | `0x5b`| - | +| `i8x16.sub_saturate_u` | `0x5c`| - | +| `i8x16.mul` | `0x5d`| - | +| `i16x8.neg` | `0x62`| - | +| `i16x8.any_true` | `0x63`| - | +| `i16x8.all_true` | `0x64`| - | +| `i16x8.shl` | `0x65`| - | +| `i16x8.shr_s` | `0x66`| - | +| `i16x8.shr_u` | `0x67`| - | +| `i16x8.add` | `0x68`| - | +| `i16x8.add_saturate_s` | `0x69`| - | +| `i16x8.add_saturate_u` | `0x6a`| - | +| `i16x8.sub` | `0x6b`| - | +| `i16x8.sub_saturate_s` | `0x6c`| - | +| `i16x8.sub_saturate_u` | `0x6d`| - | +| `i16x8.mul` | `0x6e`| - | +| `i32x4.neg` | `0x73`| - | +| `i32x4.any_true` | `0x74`| - | +| `i32x4.all_true` | `0x75`| - | +| `i32x4.shl` | `0x76`| - | +| `i32x4.shr_s` | `0x77`| - | +| `i32x4.shr_u` | `0x78`| - | +| `i32x4.add` | `0x79`| - | +| `i32x4.sub` | `0x7c`| - | +| `i32x4.mul` | `0x7f`| - | +| `i64x2.neg` | `0x84`| - | +| `i64x2.any_true` | `0x85`| - | +| `i64x2.all_true` | `0x86`| - | +| `i64x2.shl` | `0x87`| - | +| `i64x2.shr_s` | `0x88`| - | +| `i64x2.shr_u` | `0x89`| - | +| `i64x2.add` | `0x8a`| - | +| `i64x2.sub` | `0x8d`| - | +| `f32x4.abs` | `0x95`| - | +| `f32x4.neg` | `0x96`| - | +| `f32x4.sqrt` | `0x97`| - | +| `f32x4.add` | `0x9a`| - | +| `f32x4.sub` | `0x9b`| - | +| `f32x4.mul` | `0x9c`| - | +| `f32x4.div` | `0x9d`| - | +| `f32x4.min` | `0x9e`| - | +| `f32x4.max` | `0x9f`| - | +| `f64x2.abs` | `0xa0`| - | +| `f64x2.neg` | `0xa1`| - | +| `f64x2.sqrt` | `0xa2`| - | +| `f64x2.add` | `0xa5`| - | +| `f64x2.sub` | `0xa6`| - | +| `f64x2.mul` | `0xa7`| - | +| `f64x2.div` | `0xa8`| - | +| `f64x2.min` | `0xa9`| - | +| `f64x2.max` | `0xaa`| - | +| `i32x4.trunc_s/f32x4:sat` | `0xab`| - | +| `i32x4.trunc_u/f32x4:sat` | `0xac`| - | +| `i64x2.trunc_s/f64x2:sat` | `0xad`| - | +| `i64x2.trunc_u/f64x2:sat` | `0xae`| - | +| `f32x4.convert_s/i32x4` | `0xaf`| - | +| `f32x4.convert_u/i32x4` | `0xb0`| - | +| `f64x2.convert_s/i64x2` | `0xb1`| - | +| `f64x2.convert_u/i64x2` | `0xb2`| - | +| `v8x16.swizzle` | `0xc0`| - | +| `v8x16.shuffle` | `0xc1`| s:LaneIdx32[16] | +| `i8x16.load_splat` | `0xc2`| - | +| `i16x8.load_splat` | `0xc3`| - | +| `i32x4.load_splat` | `0xc4`| - | +| `i64x2.load_splat` | `0xc5`| - | +| `i8x16.narrow_i16x8_s` | `0xc6`| - | +| `i8x16.narrow_i16x8_u` | `0xc7`| - | +| `i16x8.narrow_i32x4_s` | `0xc8`| - | +| `i16x8.narrow_i32x4_u` | `0xc9`| - | +| `i16x8.widen_low_i8x16_s` | `0xca`| - | +| `i16x8.widen_high_i8x16_s` | `0xcb`| - | +| `i16x8.widen_low_i8x16_u` | `0xcc`| - | +| `i16x8.widen_high_i8x16_u` | `0xcd`| - | +| `i32x4.widen_low_i16x8_s` | `0xce`| - | +| `i32x4.widen_high_i16x8_s` | `0xcf`| - | +| `i32x4.widen_low_i16x8_u` | `0xd0`| - | +| `i32x4.widen_high_i16x8_u` | `0xd1`| - | diff --git a/proposals/simd/ImplementationStatus.md b/proposals/simd/ImplementationStatus.md index 6e44cc0e55..5e280688ff 100644 --- a/proposals/simd/ImplementationStatus.md +++ b/proposals/simd/ImplementationStatus.md @@ -1,150 +1,162 @@ -| Instruction | LLVM[1] | V8[2] | WAVM[3] | ChakraCore[4] | -| --------------------------|---------------------------|--------------------|--------------------|--------------------| -| `v128.load` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `v128.store` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `v128.const` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `i8x16.splat` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i8x16.load_splat` | | | | | -| `i8x16.extract_lane_s` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i8x16.extract_lane_u` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `i8x16.replace_lane` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i16x8.splat` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i16x8.load_splat` | | | | | -| `i16x8.extract_lane_s` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i16x8.extract_lane_u` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `i16x8.replace_lane` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i32x4.splat` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i32x4.load_splat` | | | | | -| `i32x4.extract_lane` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i32x4.replace_lane` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i64x2.splat` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `i64x2.extract_lane` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `i64x2.replace_lane` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `f32x4.splat` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `f32x4.extract_lane` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `f32x4.replace_lane` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `f64x2.splat` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `i64x2.load_splat` | | | | | -| `f64x2.extract_lane` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `f64x2.replace_lane` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `i8x16.eq` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i8x16.ne` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i8x16.lt_s` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i8x16.lt_u` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i8x16.gt_s` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i8x16.gt_u` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i8x16.le_s` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i8x16.le_u` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i8x16.ge_s` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i8x16.ge_u` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i16x8.eq` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i16x8.ne` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i16x8.lt_s` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i16x8.lt_u` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i16x8.gt_s` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i16x8.gt_u` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i16x8.le_s` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i16x8.le_u` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i16x8.ge_s` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i16x8.ge_u` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i32x4.eq` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i32x4.ne` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i32x4.lt_s` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i32x4.lt_u` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i32x4.gt_s` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i32x4.gt_u` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i32x4.le_s` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i32x4.le_u` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i32x4.ge_s` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i32x4.ge_u` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `f32x4.eq` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `f32x4.ne` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `f32x4.lt` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `f32x4.gt` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `f32x4.le` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `f32x4.ge` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `f64x2.eq` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `f64x2.ne` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `f64x2.lt` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `f64x2.gt` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `f64x2.le` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `f64x2.ge` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `v128.not` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `v128.and` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `v128.or` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `v128.xor` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `v128.bitselect` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i8x16.neg` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i8x16.any_true` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i8x16.all_true` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i8x16.shl` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `i8x16.shr_s` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `i8x16.shr_u` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `i8x16.add` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i8x16.add_saturate_s` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i8x16.add_saturate_u` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i8x16.sub` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i8x16.sub_saturate_s` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i8x16.sub_saturate_u` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i8x16.mul` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i16x8.neg` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i16x8.any_true` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i16x8.all_true` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i16x8.shl` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `i16x8.shr_s` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `i16x8.shr_u` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `i16x8.add` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i16x8.add_saturate_s` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i16x8.add_saturate_u` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i16x8.sub` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i16x8.sub_saturate_s` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i16x8.sub_saturate_u` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i16x8.mul` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i32x4.neg` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i32x4.any_true` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i32x4.all_true` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i32x4.shl` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `i32x4.shr_s` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `i32x4.shr_u` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `i32x4.add` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i32x4.sub` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i32x4.mul` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i64x2.neg` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `i64x2.any_true` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `i64x2.all_true` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `i64x2.shl` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `i64x2.shr_s` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `i64x2.shr_u` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `i64x2.add` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `i64x2.sub` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `f32x4.abs` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `f32x4.neg` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `f32x4.sqrt` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `f32x4.add` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `f32x4.sub` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `f32x4.mul` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `f32x4.div` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `f32x4.min` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `f32x4.max` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `f64x2.abs` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `f64x2.neg` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `f64x2.sqrt` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `f64x2.add` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `f64x2.sub` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `f64x2.mul` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `f64x2.div` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `f64x2.min` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `f64x2.max` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `i32x4.trunc_s/f32x4:sat` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i32x4.trunc_u/f32x4:sat` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `i64x2.trunc_s/f64x2:sat` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `i64x2.trunc_u/f64x2:sat` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `f32x4.convert_s/i32x4` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `f32x4.convert_u/i32x4` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| `f64x2.convert_s/i64x2` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `f64x2.convert_u/i64x2` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | -| `v8x16.swizzle` | | | :heavy_check_mark: | | -| `v8x16.shuffle` | | | :heavy_check_mark: | :heavy_check_mark: | +| Instruction | LLVM[1] | V8[2] | WAVM[3] | ChakraCore[4] | +| ---------------------------|---------------------------|--------------------|--------------------|--------------------| +| `v128.load` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `v128.store` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `v128.const` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `i8x16.splat` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i8x16.load_splat` | | | | | +| `i8x16.extract_lane_s` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i8x16.extract_lane_u` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `i8x16.replace_lane` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i16x8.splat` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i16x8.load_splat` | | | | | +| `i16x8.extract_lane_s` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i16x8.extract_lane_u` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `i16x8.replace_lane` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i32x4.splat` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i32x4.load_splat` | | | | | +| `i32x4.extract_lane` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i32x4.replace_lane` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i64x2.splat` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `i64x2.extract_lane` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `i64x2.replace_lane` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `f32x4.splat` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `f32x4.extract_lane` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `f32x4.replace_lane` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `f64x2.splat` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `i64x2.load_splat` | | | | | +| `f64x2.extract_lane` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `f64x2.replace_lane` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `i8x16.eq` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i8x16.ne` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i8x16.lt_s` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i8x16.lt_u` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i8x16.gt_s` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i8x16.gt_u` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i8x16.le_s` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i8x16.le_u` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i8x16.ge_s` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i8x16.ge_u` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i16x8.eq` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i16x8.ne` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i16x8.lt_s` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i16x8.lt_u` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i16x8.gt_s` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i16x8.gt_u` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i16x8.le_s` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i16x8.le_u` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i16x8.ge_s` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i16x8.ge_u` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i32x4.eq` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i32x4.ne` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i32x4.lt_s` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i32x4.lt_u` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i32x4.gt_s` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i32x4.gt_u` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i32x4.le_s` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i32x4.le_u` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i32x4.ge_s` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i32x4.ge_u` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `f32x4.eq` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `f32x4.ne` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `f32x4.lt` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `f32x4.gt` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `f32x4.le` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `f32x4.ge` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `f64x2.eq` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `f64x2.ne` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `f64x2.lt` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `f64x2.gt` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `f64x2.le` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `f64x2.ge` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `v128.not` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `v128.and` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `v128.or` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `v128.xor` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `v128.bitselect` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i8x16.neg` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i8x16.any_true` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i8x16.all_true` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i8x16.shl` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `i8x16.shr_s` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `i8x16.shr_u` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `i8x16.add` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i8x16.add_saturate_s` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i8x16.add_saturate_u` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i8x16.sub` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i8x16.sub_saturate_s` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i8x16.sub_saturate_u` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i8x16.mul` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i16x8.neg` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i16x8.any_true` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i16x8.all_true` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i16x8.shl` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `i16x8.shr_s` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `i16x8.shr_u` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `i16x8.add` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i16x8.add_saturate_s` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i16x8.add_saturate_u` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i16x8.sub` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i16x8.sub_saturate_s` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i16x8.sub_saturate_u` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i16x8.mul` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i32x4.neg` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i32x4.any_true` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i32x4.all_true` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i32x4.shl` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `i32x4.shr_s` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `i32x4.shr_u` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `i32x4.add` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i32x4.sub` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i32x4.mul` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i64x2.neg` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `i64x2.any_true` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `i64x2.all_true` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `i64x2.shl` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `i64x2.shr_s` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `i64x2.shr_u` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `i64x2.add` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `i64x2.sub` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `f32x4.abs` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `f32x4.neg` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `f32x4.sqrt` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `f32x4.add` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `f32x4.sub` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `f32x4.mul` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `f32x4.div` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `f32x4.min` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `f32x4.max` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `f64x2.abs` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `f64x2.neg` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `f64x2.sqrt` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `f64x2.add` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `f64x2.sub` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `f64x2.mul` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `f64x2.div` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `f64x2.min` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `f64x2.max` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `i32x4.trunc_s/f32x4:sat` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i32x4.trunc_u/f32x4:sat` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `i64x2.trunc_s/f64x2:sat` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `i64x2.trunc_u/f64x2:sat` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `f32x4.convert_s/i32x4` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `f32x4.convert_u/i32x4` | `-msimd128` | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | +| `f64x2.convert_s/i64x2` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `f64x2.convert_u/i64x2` | `-munimplemented-simd128` | | :heavy_check_mark: | :heavy_check_mark: | +| `v8x16.swizzle` | | | :heavy_check_mark: | | +| `v8x16.shuffle` | | | :heavy_check_mark: | :heavy_check_mark: | +| `i8x16.narrow_i16x8_s` | | :heavy_check_mark: | | | +| `i8x16.narrow_i16x8_u` | | :heavy_check_mark: | | | +| `i16x8.narrow_i32x4_s` | | :heavy_check_mark: | | | +| `i16x8.narrow_i32x4_u` | | :heavy_check_mark: | | | +| `i16x8.widen_low_i8x16_s` | | :heavy_check_mark: | | | +| `i16x8.widen_high_i8x16_s` | | :heavy_check_mark: | | | +| `i16x8.widen_low_i8x16_u` | | :heavy_check_mark: | | | +| `i16x8.widen_high_i8x16_u` | | :heavy_check_mark: | | | +| `i32x4.widen_low_i16x8_s` | | :heavy_check_mark: | | | +| `i32x4.widen_high_i16x8_s` | | :heavy_check_mark: | | | +| `i32x4.widen_low_i16x8_u` | | :heavy_check_mark: | | | +| `i32x4.widen_high_i16x8_u` | | :heavy_check_mark: | | | [1] Tip of tree LLVM as of April 24, 2019 diff --git a/proposals/simd/SIMD.md b/proposals/simd/SIMD.md index 55e8edff78..41fb3f733c 100644 --- a/proposals/simd/SIMD.md +++ b/proposals/simd/SIMD.md @@ -784,3 +784,27 @@ Lane-wise saturating conversion from floating point to integer using the IEEE resulting lane is 0. If the rounded integer value of a lane is outside the range of the destination type, the result is saturated to the nearest representable integer value. + +### Integer to integer narrowing +* `i8x16.narrow_i16x8_s(a: v128, b: v128) -> v128` +* `i8x16.narrow_i16x8_u(a: v128, b: v128) -> v128` +* `i16x8.narrow_i32x4_s(a: v128, b: v128) -> v128` +* `i16x8.narrow_i32x4_u(a: v128, b: v128) -> v128` + +Converts two input vectors into a smaller lane vector by narrowing each lane, +signed or unsigned. The signed narrowing operation will use signed saturation +to handle overflow, 0x7f or 0x80 for i8x16, the unsigned narrowing operation +will use unsigned saturation to handle overflow, 0x00 or 0xff for i8x16. + +### Integer to integer widening +* `i16x8.widen_low_i8x16_s(a: v128) -> v128` +* `i16x8.widen_high_i8x16_s(a: v128) -> v128` +* `i16x8.widen_low_i8x16_u(a: v128) -> v128` +* `i16x8.widen_high_i8x16_u(a: v128) -> v128` +* `i32x4.widen_low_i16x8_s(a: v128) -> v128` +* `i32x4.widen_high_i16x8_s(a: v128) -> v128` +* `i32x4.widen_low_i16x8_u(a: v128) -> v128` +* `i32x4.widen_high_i16x8_u(a: v128) -> v128` + +Converts low or high half of the smaller lane vector to a larger lane vector, +sign extended or zero (unsigned) extended.