Skip to content

Commit b5c3d98

Browse files
authored
Final SIMD opcodes (bytecodealliance#222)
* Final SIMD opcodes - add and update i64x2 comparison ops - i8x16.popcnt - pairwise adds - change op codes - add i64x2.abs - disable some tests
1 parent 2a4df17 commit b5c3d98

7 files changed

Lines changed: 193 additions & 77 deletions

File tree

crates/wasmparser/src/binary_reader.rs

Lines changed: 50 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1649,51 +1649,58 @@ impl<'a> BinaryReader<'a> {
16491649
0x50 => Operator::V128Or,
16501650
0x51 => Operator::V128Xor,
16511651
0x52 => Operator::V128Bitselect,
1652-
0x53 => Operator::F64x2ConvertLowI32x4S,
1653-
0x54 => Operator::F64x2ConvertLowI32x4U,
1654-
0x55 => Operator::I32x4TruncSatF64x2SZero,
1655-
0x56 => Operator::I32x4TruncSatF64x2UZero,
1656-
0x57 => Operator::F32x4DemoteF64x2Zero,
1657-
0x58 => Operator::V128Load8Lane {
1652+
0x53 => Operator::V128AnyTrue,
1653+
0x54 => Operator::V128Load8Lane {
16581654
memarg: self.read_memarg()?,
16591655
lane: self.read_lane_index(16)?,
16601656
},
1661-
0x59 => Operator::V128Load16Lane {
1657+
0x55 => Operator::V128Load16Lane {
16621658
memarg: self.read_memarg()?,
16631659
lane: self.read_lane_index(8)?,
16641660
},
1665-
0x5a => Operator::V128Load32Lane {
1661+
0x56 => Operator::V128Load32Lane {
16661662
memarg: self.read_memarg()?,
16671663
lane: self.read_lane_index(4)?,
16681664
},
1669-
0x5b => Operator::V128Load64Lane {
1665+
0x57 => Operator::V128Load64Lane {
16701666
memarg: self.read_memarg()?,
16711667
lane: self.read_lane_index(2)?,
16721668
},
1673-
0x5c => Operator::V128Store8Lane {
1669+
0x58 => Operator::V128Store8Lane {
16741670
memarg: self.read_memarg()?,
16751671
lane: self.read_lane_index(16)?,
16761672
},
1677-
0x5d => Operator::V128Store16Lane {
1673+
0x59 => Operator::V128Store16Lane {
16781674
memarg: self.read_memarg()?,
16791675
lane: self.read_lane_index(8)?,
16801676
},
1681-
0x5e => Operator::V128Store32Lane {
1677+
0x5a => Operator::V128Store32Lane {
16821678
memarg: self.read_memarg()?,
16831679
lane: self.read_lane_index(4)?,
16841680
},
1685-
0x5f => Operator::V128Store64Lane {
1681+
0x5b => Operator::V128Store64Lane {
16861682
memarg: self.read_memarg()?,
16871683
lane: self.read_lane_index(2)?,
16881684
},
1685+
0x5c => Operator::V128Load32Zero {
1686+
memarg: self.read_memarg_of_align(2)?,
1687+
},
1688+
0x5d => Operator::V128Load64Zero {
1689+
memarg: self.read_memarg_of_align(3)?,
1690+
},
1691+
0x5e => Operator::F32x4DemoteF64x2Zero,
1692+
0x5f => Operator::F64x2PromoteLowF32x4,
16891693
0x60 => Operator::I8x16Abs,
16901694
0x61 => Operator::I8x16Neg,
1691-
0x62 => Operator::V128AnyTrue,
1695+
0x62 => Operator::I8x16Popcnt,
16921696
0x63 => Operator::I8x16AllTrue,
16931697
0x64 => Operator::I8x16Bitmask,
16941698
0x65 => Operator::I8x16NarrowI16x8S,
16951699
0x66 => Operator::I8x16NarrowI16x8U,
1696-
0x69 => Operator::F64x2PromoteLowF32x4,
1700+
0x67 => Operator::F32x4Ceil,
1701+
0x68 => Operator::F32x4Floor,
1702+
0x69 => Operator::F32x4Trunc,
1703+
0x6a => Operator::F32x4Nearest,
16971704
0x6b => Operator::I8x16Shl,
16981705
0x6c => Operator::I8x16ShrS,
16991706
0x6d => Operator::I8x16ShrU,
@@ -1703,13 +1710,21 @@ impl<'a> BinaryReader<'a> {
17031710
0x71 => Operator::I8x16Sub,
17041711
0x72 => Operator::I8x16SubSatS,
17051712
0x73 => Operator::I8x16SubSatU,
1713+
0x74 => Operator::F64x2Ceil,
1714+
0x75 => Operator::F64x2Floor,
17061715
0x76 => Operator::I8x16MinS,
17071716
0x77 => Operator::I8x16MinU,
17081717
0x78 => Operator::I8x16MaxS,
17091718
0x79 => Operator::I8x16MaxU,
1719+
0x7a => Operator::F64x2Trunc,
17101720
0x7b => Operator::I8x16RoundingAverageU,
1721+
0x7c => Operator::I16x8ExtAddPairwiseI8x16S,
1722+
0x7d => Operator::I16x8ExtAddPairwiseI8x16U,
1723+
0x7e => Operator::I32x4ExtAddPairwiseI16x8S,
1724+
0x7f => Operator::I32x4ExtAddPairwiseI16x8U,
17111725
0x80 => Operator::I16x8Abs,
17121726
0x81 => Operator::I16x8Neg,
1727+
0x82 => Operator::I16x8Q15MulrSatS,
17131728
0x83 => Operator::I16x8AllTrue,
17141729
0x84 => Operator::I16x8Bitmask,
17151730
0x85 => Operator::I16x8NarrowI32x4S,
@@ -1727,14 +1742,14 @@ impl<'a> BinaryReader<'a> {
17271742
0x91 => Operator::I16x8Sub,
17281743
0x92 => Operator::I16x8SubSatS,
17291744
0x93 => Operator::I16x8SubSatU,
1745+
0x94 => Operator::F64x2Nearest,
17301746
0x95 => Operator::I16x8Mul,
17311747
0x96 => Operator::I16x8MinS,
17321748
0x97 => Operator::I16x8MinU,
17331749
0x98 => Operator::I16x8MaxS,
17341750
0x99 => Operator::I16x8MaxU,
1735-
0x9a => Operator::I16x8ExtMulLowI8x16S,
17361751
0x9b => Operator::I16x8RoundingAverageU,
1737-
0x9c => Operator::I16x8Q15MulrSatS,
1752+
0x9c => Operator::I16x8ExtMulLowI8x16S,
17381753
0x9d => Operator::I16x8ExtMulHighI8x16S,
17391754
0x9e => Operator::I16x8ExtMulLowI8x16U,
17401755
0x9f => Operator::I16x8ExtMulHighI8x16U,
@@ -1757,12 +1772,13 @@ impl<'a> BinaryReader<'a> {
17571772
0xb8 => Operator::I32x4MaxS,
17581773
0xb9 => Operator::I32x4MaxU,
17591774
0xba => Operator::I32x4DotI16x8S,
1760-
0xbb => Operator::I32x4ExtMulLowI16x8S,
1775+
0xbc => Operator::I32x4ExtMulLowI16x8S,
17611776
0xbd => Operator::I32x4ExtMulHighI16x8S,
17621777
0xbe => Operator::I32x4ExtMulLowI16x8U,
17631778
0xbf => Operator::I32x4ExtMulHighI16x8U,
1764-
0xc0 => Operator::I64x2Eq,
1779+
0xc0 => Operator::I64x2Abs,
17651780
0xc1 => Operator::I64x2Neg,
1781+
0xc3 => Operator::I64x2AllTrue,
17661782
0xc4 => Operator::I64x2Bitmask,
17671783
0xc7 => Operator::I64x2WidenLowI32x4S,
17681784
0xc8 => Operator::I64x2WidenHighI32x4S,
@@ -1772,22 +1788,18 @@ impl<'a> BinaryReader<'a> {
17721788
0xcc => Operator::I64x2ShrS,
17731789
0xcd => Operator::I64x2ShrU,
17741790
0xce => Operator::I64x2Add,
1775-
0xcf => Operator::I64x2AllTrue,
1776-
0xd0 => Operator::I64x2Ne,
17771791
0xd1 => Operator::I64x2Sub,
1778-
0xd2 => Operator::I64x2ExtMulLowI32x4S,
1779-
0xd3 => Operator::I64x2ExtMulHighI32x4S,
17801792
0xd5 => Operator::I64x2Mul,
1781-
0xd6 => Operator::I64x2ExtMulLowI32x4U,
1782-
0xd7 => Operator::I64x2ExtMulHighI32x4U,
1783-
0xd8 => Operator::F32x4Ceil,
1784-
0xd9 => Operator::F32x4Floor,
1785-
0xda => Operator::F32x4Trunc,
1786-
0xdb => Operator::F32x4Nearest,
1787-
0xdc => Operator::F64x2Ceil,
1788-
0xdd => Operator::F64x2Floor,
1789-
0xde => Operator::F64x2Trunc,
1790-
0xdf => Operator::F64x2Nearest,
1793+
0xd6 => Operator::I64x2Eq,
1794+
0xd7 => Operator::I64x2Ne,
1795+
0xd8 => Operator::I64x2LtS,
1796+
0xd9 => Operator::I64x2GtS,
1797+
0xda => Operator::I64x2LeS,
1798+
0xdb => Operator::I64x2GeS,
1799+
0xdc => Operator::I64x2ExtMulLowI32x4S,
1800+
0xdd => Operator::I64x2ExtMulHighI32x4S,
1801+
0xde => Operator::I64x2ExtMulLowI32x4U,
1802+
0xdf => Operator::I64x2ExtMulHighI32x4U,
17911803
0xe0 => Operator::F32x4Abs,
17921804
0xe1 => Operator::F32x4Neg,
17931805
0xe3 => Operator::F32x4Sqrt,
@@ -1814,12 +1826,11 @@ impl<'a> BinaryReader<'a> {
18141826
0xf9 => Operator::I32x4TruncSatF32x4U,
18151827
0xfa => Operator::F32x4ConvertI32x4S,
18161828
0xfb => Operator::F32x4ConvertI32x4U,
1817-
0xfc => Operator::V128Load32Zero {
1818-
memarg: self.read_memarg_of_align(2)?,
1819-
},
1820-
0xfd => Operator::V128Load64Zero {
1821-
memarg: self.read_memarg_of_align(3)?,
1822-
},
1829+
0xfc => Operator::I32x4TruncSatF64x2SZero,
1830+
0xfd => Operator::I32x4TruncSatF64x2UZero,
1831+
0xfe => Operator::F64x2ConvertLowI32x4S,
1832+
0xff => Operator::F64x2ConvertLowI32x4U,
1833+
18231834
_ => {
18241835
return Err(BinaryReaderError::new(
18251836
format!("Unknown 0xfd subopcode: 0x{:x}", code),

crates/wasmparser/src/operators_validator.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1577,6 +1577,10 @@ impl OperatorValidator {
15771577
| Operator::I32x4GeU
15781578
| Operator::I64x2Eq
15791579
| Operator::I64x2Ne
1580+
| Operator::I64x2LtS
1581+
| Operator::I64x2GtS
1582+
| Operator::I64x2LeS
1583+
| Operator::I64x2GeS
15801584
| Operator::V128And
15811585
| Operator::V128AndNot
15821586
| Operator::V128Or
@@ -1631,6 +1635,10 @@ impl OperatorValidator {
16311635
| Operator::I64x2ExtMulHighI32x4S
16321636
| Operator::I64x2ExtMulLowI32x4U
16331637
| Operator::I64x2ExtMulHighI32x4U
1638+
| Operator::I16x8ExtAddPairwiseI8x16S
1639+
| Operator::I16x8ExtAddPairwiseI8x16U
1640+
| Operator::I32x4ExtAddPairwiseI16x8S
1641+
| Operator::I32x4ExtAddPairwiseI16x8U
16341642
| Operator::I16x8Q15MulrSatS => {
16351643
self.check_simd_enabled()?;
16361644
self.pop_operand(Some(Type::V128))?;
@@ -1667,10 +1675,12 @@ impl OperatorValidator {
16671675
Operator::V128Not
16681676
| Operator::I8x16Abs
16691677
| Operator::I8x16Neg
1678+
| Operator::I8x16Popcnt
16701679
| Operator::I16x8Abs
16711680
| Operator::I16x8Neg
16721681
| Operator::I32x4Abs
16731682
| Operator::I32x4Neg
1683+
| Operator::I64x2Abs
16741684
| Operator::I64x2Neg
16751685
| Operator::I32x4TruncSatF32x4S
16761686
| Operator::I32x4TruncSatF32x4U

crates/wasmparser/src/primitives.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -988,6 +988,10 @@ pub enum Operator<'a> {
988988
I32x4GeU,
989989
I64x2Eq,
990990
I64x2Ne,
991+
I64x2LtS,
992+
I64x2GtS,
993+
I64x2LeS,
994+
I64x2GeS,
991995
F32x4Eq,
992996
F32x4Ne,
993997
F32x4Lt,
@@ -1057,6 +1061,7 @@ pub enum Operator<'a> {
10571061
I32x4MaxS,
10581062
I32x4MaxU,
10591063
I32x4DotI16x8S,
1064+
I64x2Abs,
10601065
I64x2Neg,
10611066
I64x2AllTrue,
10621067
I64x2Bitmask,
@@ -1150,6 +1155,10 @@ pub enum Operator<'a> {
11501155
I64x2ExtMulHighI32x4S,
11511156
I64x2ExtMulLowI32x4U,
11521157
I64x2ExtMulHighI32x4U,
1158+
I16x8ExtAddPairwiseI8x16S,
1159+
I16x8ExtAddPairwiseI8x16U,
1160+
I32x4ExtAddPairwiseI16x8S,
1161+
I32x4ExtAddPairwiseI16x8U,
11531162
V128Load8x8S {
11541163
memarg: MemoryImmediate,
11551164
},
@@ -1209,4 +1218,5 @@ pub enum Operator<'a> {
12091218
F64x2ConvertLowI32x4U,
12101219
I32x4TruncSatF64x2SZero,
12111220
I32x4TruncSatF64x2UZero,
1221+
I8x16Popcnt,
12121222
}

crates/wasmprinter/src/lib.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1238,6 +1238,10 @@ impl Printer {
12381238

12391239
I64x2Eq => self.result.push_str("i64x2.eq"),
12401240
I64x2Ne => self.result.push_str("i64x2.ne"),
1241+
I64x2LtS => self.result.push_str("i64x2.lt_s"),
1242+
I64x2GtS => self.result.push_str("i64x2.gt_s"),
1243+
I64x2LeS => self.result.push_str("i64x2.le_s"),
1244+
I64x2GeS => self.result.push_str("i64x2.ge_s"),
12411245

12421246
F32x4Eq => self.result.push_str("f32x4.eq"),
12431247
F32x4Ne => self.result.push_str("f32x4.ne"),
@@ -1301,6 +1305,7 @@ impl Printer {
13011305
I32x4Sub => self.result.push_str("i32x4.sub"),
13021306
I32x4Mul => self.result.push_str("i32x4.mul"),
13031307

1308+
I64x2Abs => self.result.push_str("i64x2.abs"),
13041309
I64x2Neg => self.result.push_str("i64x2.neg"),
13051310
I64x2AllTrue => self.result.push_str("i64x2.all_true"),
13061311
I64x2Bitmask => self.result.push_str("i64x2.bitmask"),
@@ -1460,6 +1465,13 @@ impl Printer {
14601465
F64x2ConvertLowI32x4U => self.result.push_str("f64x2.convert_low_i32x4_u"),
14611466
I32x4TruncSatF64x2SZero => self.result.push_str("i32x4.trunc_sat_f64x2_s_zero"),
14621467
I32x4TruncSatF64x2UZero => self.result.push_str("i32x4.trunc_sat_f64x2_u_zero"),
1468+
1469+
I8x16Popcnt => self.result.push_str("i8x16.popcnt"),
1470+
1471+
I16x8ExtAddPairwiseI8x16S => self.result.push_str("i16x8.extadd_pairwise_i8x16_s"),
1472+
I16x8ExtAddPairwiseI8x16U => self.result.push_str("i16x8.extadd_pairwise_i8x16_u"),
1473+
I32x4ExtAddPairwiseI16x8S => self.result.push_str("i32x4.extadd_pairwise_i16x8_s"),
1474+
I32x4ExtAddPairwiseI16x8U => self.result.push_str("i32x4.extadd_pairwise_i16x8_u"),
14631475
}
14641476
Ok(())
14651477
}

0 commit comments

Comments
 (0)