1835abbcdSSaúl Cabrera //! This module is the central place for machine code emission.
2835abbcdSSaúl Cabrera //! It defines an implementation of wasmparser's Visitor trait
3835abbcdSSaúl Cabrera //! for `CodeGen`; which defines a visitor per op-code,
4835abbcdSSaúl Cabrera //! which validates and dispatches to the corresponding
5835abbcdSSaúl Cabrera //! machine code emitter.
6835abbcdSSaúl Cabrera 
70e98a8d5SSaúl Cabrera use crate::abi::RetArea;
8b93e1bc0SSaúl Cabrera use crate::codegen::{
989419ec2SSaúl Cabrera     Callee, CodeGen, CodeGenError, ConditionalBranch, ControlStackFrame, Emission, FnCall,
1089419ec2SSaúl Cabrera     UnconditionalBranch, control_index,
11b93e1bc0SSaúl Cabrera };
12230eec9eSTrevor Elliott use crate::masm::{
1389419ec2SSaúl Cabrera     AtomicWaitKind, DivKind, Extend, ExtractLaneKind, FloatCmpKind, IntCmpKind, LoadKind,
1489419ec2SSaúl Cabrera     MacroAssembler, MulWideKind, OperandSize, RegImm, RemKind, ReplaceLaneKind, RmwOp,
1589419ec2SSaúl Cabrera     RoundingMode, SPOffset, ShiftKind, Signed, SplatKind, SplatLoadKind, StoreKind, TruncKind,
1689419ec2SSaúl Cabrera     V128AbsKind, V128AddKind, V128ConvertKind, V128ExtAddKind, V128ExtMulKind, V128ExtendKind,
1789419ec2SSaúl Cabrera     V128LoadExtendKind, V128MaxKind, V128MinKind, V128MulKind, V128NarrowKind, V128NegKind,
1889419ec2SSaúl Cabrera     V128SubKind, V128TruncKind, VectorCompareKind, VectorEqualityKind, Zero,
19230eec9eSTrevor Elliott };
2090ac295eSAlex Crichton use crate::reg::{Reg, writable};
2114b39bc2SSaúl Cabrera use crate::stack::{TypedReg, Val};
22b112bb85SNick Fitzgerald use crate::{Result, bail, ensure, format_err};
23b546a5f2SJeffrey Charles use regalloc2::RegClass;
2490ac295eSAlex Crichton use smallvec::{SmallVec, smallvec};
251256cfaeSAlex Crichton use wasmparser::{
26071c4061Sr-near     BlockType, BrTable, HeapType, Ieee32, Ieee64, MemArg, V128, ValType, VisitOperator,
27071c4061Sr-near     VisitSimdOperator,
281256cfaeSAlex Crichton };
299fc41baeSAlex Crichton use wasmtime_cranelift::TRAP_INDIRECT_CALL_TO_NULL;
304b288ba8SSaúl Cabrera use wasmtime_environ::{
31*39e910beSAlex Crichton     FUNCREF_INIT_BIT, FuncIndex, GlobalIndex, IndexType, MemoryIndex, TableIndex, TypeIndex,
32*39e910beSAlex Crichton     WasmHeapType, WasmValType,
334b288ba8SSaúl Cabrera };
34835abbcdSSaúl Cabrera 
35835abbcdSSaúl Cabrera /// A macro to define unsupported WebAssembly operators.
36835abbcdSSaúl Cabrera ///
37835abbcdSSaúl Cabrera /// This macro calls itself recursively;
38835abbcdSSaúl Cabrera /// 1. It no-ops when matching a supported operator.
39835abbcdSSaúl Cabrera /// 2. Defines the visitor function and panics when
40835abbcdSSaúl Cabrera ///    matching an unsupported operator.
41835abbcdSSaúl Cabrera macro_rules! def_unsupported {
426844ed1aSAlex Crichton     ($( @$proposal:ident $op:ident $({ $($arg:ident: $argty:ty),* })? => $visit:ident $ann:tt)*) => {
43835abbcdSSaúl Cabrera         $(
44835abbcdSSaúl Cabrera             def_unsupported!(
45835abbcdSSaúl Cabrera                 emit
46835abbcdSSaúl Cabrera                     $op
47835abbcdSSaúl Cabrera 
4805489523SAlex Crichton                 fn $visit(&mut self $($(,$arg: $argty)*)?) -> Self::Output {
497f0228c9SAlex Crichton                     $($(let _ = $arg;)*)?
50974c3245SAlex Crichton 
51b112bb85SNick Fitzgerald                     Err(format_err!(CodeGenError::unimplemented_wasm_instruction()))
52835abbcdSSaúl Cabrera                 }
53835abbcdSSaúl Cabrera             );
54835abbcdSSaúl Cabrera         )*
55835abbcdSSaúl Cabrera     };
56835abbcdSSaúl Cabrera 
57835abbcdSSaúl Cabrera     (emit I32Const $($rest:tt)*) => {};
587c5c7e4bSSaúl Cabrera     (emit I64Const $($rest:tt)*) => {};
5914b39bc2SSaúl Cabrera     (emit F32Const $($rest:tt)*) => {};
6014b39bc2SSaúl Cabrera     (emit F64Const $($rest:tt)*) => {};
61fa9a948dSJeffrey Charles     (emit V128Const $($rest:tt)*) => {};
62dd42290eSJeffrey Charles     (emit F32Add $($rest:tt)*) => {};
63dd42290eSJeffrey Charles     (emit F64Add $($rest:tt)*) => {};
64dd42290eSJeffrey Charles     (emit F32Sub $($rest:tt)*) => {};
65dd42290eSJeffrey Charles     (emit F64Sub $($rest:tt)*) => {};
66dd42290eSJeffrey Charles     (emit F32Mul $($rest:tt)*) => {};
67dd42290eSJeffrey Charles     (emit F64Mul $($rest:tt)*) => {};
68dd42290eSJeffrey Charles     (emit F32Div $($rest:tt)*) => {};
69dd42290eSJeffrey Charles     (emit F64Div $($rest:tt)*) => {};
70dd42290eSJeffrey Charles     (emit F32Min $($rest:tt)*) => {};
71dd42290eSJeffrey Charles     (emit F64Min $($rest:tt)*) => {};
72dd42290eSJeffrey Charles     (emit F32Max $($rest:tt)*) => {};
73dd42290eSJeffrey Charles     (emit F64Max $($rest:tt)*) => {};
74dd42290eSJeffrey Charles     (emit F32Copysign $($rest:tt)*) => {};
75dd42290eSJeffrey Charles     (emit F64Copysign $($rest:tt)*) => {};
769f001986STrevor Elliott     (emit F32Abs $($rest:tt)*) => {};
779f001986STrevor Elliott     (emit F64Abs $($rest:tt)*) => {};
789f001986STrevor Elliott     (emit F32Neg $($rest:tt)*) => {};
799f001986STrevor Elliott     (emit F64Neg $($rest:tt)*) => {};
80230eec9eSTrevor Elliott     (emit F32Floor $($rest:tt)*) => {};
81230eec9eSTrevor Elliott     (emit F64Floor $($rest:tt)*) => {};
82230eec9eSTrevor Elliott     (emit F32Ceil $($rest:tt)*) => {};
83230eec9eSTrevor Elliott     (emit F64Ceil $($rest:tt)*) => {};
84230eec9eSTrevor Elliott     (emit F32Nearest $($rest:tt)*) => {};
85230eec9eSTrevor Elliott     (emit F64Nearest $($rest:tt)*) => {};
86230eec9eSTrevor Elliott     (emit F32Trunc $($rest:tt)*) => {};
87230eec9eSTrevor Elliott     (emit F64Trunc $($rest:tt)*) => {};
88654d9f5eSJeffrey Charles     (emit F32Sqrt $($rest:tt)*) => {};
89654d9f5eSJeffrey Charles     (emit F64Sqrt $($rest:tt)*) => {};
900d797f7fSJeffrey Charles     (emit F32Eq $($rest:tt)*) => {};
910d797f7fSJeffrey Charles     (emit F64Eq $($rest:tt)*) => {};
920d797f7fSJeffrey Charles     (emit F32Ne $($rest:tt)*) => {};
930d797f7fSJeffrey Charles     (emit F64Ne $($rest:tt)*) => {};
940d797f7fSJeffrey Charles     (emit F32Lt $($rest:tt)*) => {};
950d797f7fSJeffrey Charles     (emit F64Lt $($rest:tt)*) => {};
960d797f7fSJeffrey Charles     (emit F32Gt $($rest:tt)*) => {};
970d797f7fSJeffrey Charles     (emit F64Gt $($rest:tt)*) => {};
980d797f7fSJeffrey Charles     (emit F32Le $($rest:tt)*) => {};
990d797f7fSJeffrey Charles     (emit F64Le $($rest:tt)*) => {};
1000d797f7fSJeffrey Charles     (emit F32Ge $($rest:tt)*) => {};
1010d797f7fSJeffrey Charles     (emit F64Ge $($rest:tt)*) => {};
102b546a5f2SJeffrey Charles     (emit F32ConvertI32S $($rest:tt)*) => {};
103b546a5f2SJeffrey Charles     (emit F32ConvertI32U $($rest:tt)*) => {};
104b546a5f2SJeffrey Charles     (emit F32ConvertI64S $($rest:tt)*) => {};
105b546a5f2SJeffrey Charles     (emit F32ConvertI64U $($rest:tt)*) => {};
106b546a5f2SJeffrey Charles     (emit F64ConvertI32S $($rest:tt)*) => {};
107b546a5f2SJeffrey Charles     (emit F64ConvertI32U $($rest:tt)*) => {};
108b546a5f2SJeffrey Charles     (emit F64ConvertI64S $($rest:tt)*) => {};
109b546a5f2SJeffrey Charles     (emit F64ConvertI64U $($rest:tt)*) => {};
110b546a5f2SJeffrey Charles     (emit F32ReinterpretI32 $($rest:tt)*) => {};
111b546a5f2SJeffrey Charles     (emit F64ReinterpretI64 $($rest:tt)*) => {};
112b546a5f2SJeffrey Charles     (emit F32DemoteF64 $($rest:tt)*) => {};
113b546a5f2SJeffrey Charles     (emit F64PromoteF32 $($rest:tt)*) => {};
114835abbcdSSaúl Cabrera     (emit I32Add $($rest:tt)*) => {};
1157c5c7e4bSSaúl Cabrera     (emit I64Add $($rest:tt)*) => {};
1167c5c7e4bSSaúl Cabrera     (emit I32Sub $($rest:tt)*) => {};
11791c8114fSSaúl Cabrera     (emit I32Mul $($rest:tt)*) => {};
1187ec92512SSaúl Cabrera     (emit I32DivS $($rest:tt)*) => {};
1197ec92512SSaúl Cabrera     (emit I32DivU $($rest:tt)*) => {};
1207ec92512SSaúl Cabrera     (emit I64DivS $($rest:tt)*) => {};
1217ec92512SSaúl Cabrera     (emit I64DivU $($rest:tt)*) => {};
1224d954f5cSSaúl Cabrera     (emit I64RemU $($rest:tt)*) => {};
1234d954f5cSSaúl Cabrera     (emit I64RemS $($rest:tt)*) => {};
1244d954f5cSSaúl Cabrera     (emit I32RemU $($rest:tt)*) => {};
1254d954f5cSSaúl Cabrera     (emit I32RemS $($rest:tt)*) => {};
12691c8114fSSaúl Cabrera     (emit I64Mul $($rest:tt)*) => {};
1277c5c7e4bSSaúl Cabrera     (emit I64Sub $($rest:tt)*) => {};
1289cc62e7fSJeffrey Charles     (emit I32Eq $($rest:tt)*) => {};
1299cc62e7fSJeffrey Charles     (emit I64Eq $($rest:tt)*) => {};
1309cc62e7fSJeffrey Charles     (emit I32Ne $($rest:tt)*) => {};
1319cc62e7fSJeffrey Charles     (emit I64Ne $($rest:tt)*) => {};
1329cc62e7fSJeffrey Charles     (emit I32LtS $($rest:tt)*) => {};
1339cc62e7fSJeffrey Charles     (emit I64LtS $($rest:tt)*) => {};
1349cc62e7fSJeffrey Charles     (emit I32LtU $($rest:tt)*) => {};
1359cc62e7fSJeffrey Charles     (emit I64LtU $($rest:tt)*) => {};
1369cc62e7fSJeffrey Charles     (emit I32LeS $($rest:tt)*) => {};
1379cc62e7fSJeffrey Charles     (emit I64LeS $($rest:tt)*) => {};
1389cc62e7fSJeffrey Charles     (emit I32LeU $($rest:tt)*) => {};
1399cc62e7fSJeffrey Charles     (emit I64LeU $($rest:tt)*) => {};
1409cc62e7fSJeffrey Charles     (emit I32GtS $($rest:tt)*) => {};
1419cc62e7fSJeffrey Charles     (emit I64GtS $($rest:tt)*) => {};
1429cc62e7fSJeffrey Charles     (emit I32GtU $($rest:tt)*) => {};
1439cc62e7fSJeffrey Charles     (emit I64GtU $($rest:tt)*) => {};
1449cc62e7fSJeffrey Charles     (emit I32GeS $($rest:tt)*) => {};
1459cc62e7fSJeffrey Charles     (emit I64GeS $($rest:tt)*) => {};
1469cc62e7fSJeffrey Charles     (emit I32GeU $($rest:tt)*) => {};
1479cc62e7fSJeffrey Charles     (emit I64GeU $($rest:tt)*) => {};
1480893f7c7SJeffrey Charles     (emit I32Eqz $($rest:tt)*) => {};
1490893f7c7SJeffrey Charles     (emit I64Eqz $($rest:tt)*) => {};
150f5fafba8SJeffrey Charles     (emit I32And $($rest:tt)*) => {};
151f5fafba8SJeffrey Charles     (emit I64And $($rest:tt)*) => {};
152f5fafba8SJeffrey Charles     (emit I32Or $($rest:tt)*) => {};
153f5fafba8SJeffrey Charles     (emit I64Or $($rest:tt)*) => {};
154f5fafba8SJeffrey Charles     (emit I32Xor $($rest:tt)*) => {};
155f5fafba8SJeffrey Charles     (emit I64Xor $($rest:tt)*) => {};
156f5fafba8SJeffrey Charles     (emit I32Shl $($rest:tt)*) => {};
157f5fafba8SJeffrey Charles     (emit I64Shl $($rest:tt)*) => {};
158f5fafba8SJeffrey Charles     (emit I32ShrS $($rest:tt)*) => {};
159f5fafba8SJeffrey Charles     (emit I64ShrS $($rest:tt)*) => {};
160f5fafba8SJeffrey Charles     (emit I32ShrU $($rest:tt)*) => {};
161f5fafba8SJeffrey Charles     (emit I64ShrU $($rest:tt)*) => {};
162f5fafba8SJeffrey Charles     (emit I32Rotl $($rest:tt)*) => {};
163f5fafba8SJeffrey Charles     (emit I64Rotl $($rest:tt)*) => {};
164f5fafba8SJeffrey Charles     (emit I32Rotr $($rest:tt)*) => {};
165f5fafba8SJeffrey Charles     (emit I64Rotr $($rest:tt)*) => {};
166c26a3cf6SJeffrey Charles     (emit I32Clz $($rest:tt)*) => {};
167c26a3cf6SJeffrey Charles     (emit I64Clz $($rest:tt)*) => {};
168c26a3cf6SJeffrey Charles     (emit I32Ctz $($rest:tt)*) => {};
169c26a3cf6SJeffrey Charles     (emit I64Ctz $($rest:tt)*) => {};
17075134640SRainy Sinclair     (emit I32Popcnt $($rest:tt)*) => {};
17175134640SRainy Sinclair     (emit I64Popcnt $($rest:tt)*) => {};
1723b055d47SJeffrey Charles     (emit I32WrapI64 $($rest:tt)*) => {};
1733b055d47SJeffrey Charles     (emit I64ExtendI32S $($rest:tt)*) => {};
1743b055d47SJeffrey Charles     (emit I64ExtendI32U $($rest:tt)*) => {};
1753b055d47SJeffrey Charles     (emit I32Extend8S $($rest:tt)*) => {};
1763b055d47SJeffrey Charles     (emit I32Extend16S $($rest:tt)*) => {};
1773b055d47SJeffrey Charles     (emit I64Extend8S $($rest:tt)*) => {};
1783b055d47SJeffrey Charles     (emit I64Extend16S $($rest:tt)*) => {};
1793b055d47SJeffrey Charles     (emit I64Extend32S $($rest:tt)*) => {};
180b546a5f2SJeffrey Charles     (emit I32TruncF32S $($rest:tt)*) => {};
181b546a5f2SJeffrey Charles     (emit I32TruncF32U $($rest:tt)*) => {};
182b546a5f2SJeffrey Charles     (emit I32TruncF64S $($rest:tt)*) => {};
183b546a5f2SJeffrey Charles     (emit I32TruncF64U $($rest:tt)*) => {};
184b546a5f2SJeffrey Charles     (emit I64TruncF32S $($rest:tt)*) => {};
185b546a5f2SJeffrey Charles     (emit I64TruncF32U $($rest:tt)*) => {};
186b546a5f2SJeffrey Charles     (emit I64TruncF64S $($rest:tt)*) => {};
187b546a5f2SJeffrey Charles     (emit I64TruncF64U $($rest:tt)*) => {};
188b546a5f2SJeffrey Charles     (emit I32ReinterpretF32 $($rest:tt)*) => {};
189b546a5f2SJeffrey Charles     (emit I64ReinterpretF64 $($rest:tt)*) => {};
190835abbcdSSaúl Cabrera     (emit LocalGet $($rest:tt)*) => {};
191835abbcdSSaúl Cabrera     (emit LocalSet $($rest:tt)*) => {};
192af4d94c8SSaúl Cabrera     (emit Call $($rest:tt)*) => {};
193835abbcdSSaúl Cabrera     (emit End $($rest:tt)*) => {};
1945a6ea327SJeffrey Charles     (emit Nop $($rest:tt)*) => {};
195a50c4972SSaúl Cabrera     (emit If $($rest:tt)*) => {};
196a50c4972SSaúl Cabrera     (emit Else $($rest:tt)*) => {};
197b4a93b6aSSaúl Cabrera     (emit Block $($rest:tt)*) => {};
1981bc4ff3fSSaúl Cabrera     (emit Loop $($rest:tt)*) => {};
1991bc4ff3fSSaúl Cabrera     (emit Br $($rest:tt)*) => {};
2001bc4ff3fSSaúl Cabrera     (emit BrIf $($rest:tt)*) => {};
201404711b4SSaúl Cabrera     (emit Return $($rest:tt)*) => {};
202404711b4SSaúl Cabrera     (emit Unreachable $($rest:tt)*) => {};
2033efd7284SSaúl Cabrera     (emit LocalTee $($rest:tt)*) => {};
204690dd116SSaúl Cabrera     (emit GlobalGet $($rest:tt)*) => {};
205690dd116SSaúl Cabrera     (emit GlobalSet $($rest:tt)*) => {};
2062da108dfSSaúl Cabrera     (emit Select $($rest:tt)*) => {};
207071c4061Sr-near     (emit TypedSelect $($rest:tt)*) => {};
208071c4061Sr-near     (emit RefNull $($rest:tt)*) => {};
209071c4061Sr-near     (emit RefIsNull $($rest:tt)*) => {};
210071c4061Sr-near     (emit RefFunc $($rest:tt)*) => {};
2112da108dfSSaúl Cabrera     (emit Drop $($rest:tt)*) => {};
212350410acSSaúl Cabrera     (emit BrTable $($rest:tt)*) => {};
2134b288ba8SSaúl Cabrera     (emit CallIndirect $($rest:tt)*) => {};
214a109d2abSSaúl Cabrera     (emit TableInit $($rest:tt)*) => {};
215a109d2abSSaúl Cabrera     (emit TableCopy $($rest:tt)*) => {};
216a109d2abSSaúl Cabrera     (emit TableGet $($rest:tt)*) => {};
217a109d2abSSaúl Cabrera     (emit TableSet $($rest:tt)*) => {};
218a109d2abSSaúl Cabrera     (emit TableGrow $($rest:tt)*) => {};
219a109d2abSSaúl Cabrera     (emit TableSize $($rest:tt)*) => {};
220a109d2abSSaúl Cabrera     (emit TableFill $($rest:tt)*) => {};
221a109d2abSSaúl Cabrera     (emit ElemDrop $($rest:tt)*) => {};
2225708d693SSaúl Cabrera     (emit MemoryInit $($rest:tt)*) => {};
2235708d693SSaúl Cabrera     (emit MemoryCopy $($rest:tt)*) => {};
2245708d693SSaúl Cabrera     (emit DataDrop $($rest:tt)*) => {};
2255708d693SSaúl Cabrera     (emit MemoryFill $($rest:tt)*) => {};
2265708d693SSaúl Cabrera     (emit MemorySize $($rest:tt)*) => {};
2275708d693SSaúl Cabrera     (emit MemoryGrow $($rest:tt)*) => {};
22883cf7438SSaúl Cabrera     (emit I32Load $($rest:tt)*) => {};
22983cf7438SSaúl Cabrera     (emit I32Load8S $($rest:tt)*) => {};
23083cf7438SSaúl Cabrera     (emit I32Load8U $($rest:tt)*) => {};
23183cf7438SSaúl Cabrera     (emit I32Load16S $($rest:tt)*) => {};
23283cf7438SSaúl Cabrera     (emit I32Load16U $($rest:tt)*) => {};
23383cf7438SSaúl Cabrera     (emit I64Load8S $($rest:tt)*) => {};
23483cf7438SSaúl Cabrera     (emit I64Load8U $($rest:tt)*) => {};
23583cf7438SSaúl Cabrera     (emit I64Load16S $($rest:tt)*) => {};
23683cf7438SSaúl Cabrera     (emit I64Load16U $($rest:tt)*) => {};
23783cf7438SSaúl Cabrera     (emit I64Load32S $($rest:tt)*) => {};
23883cf7438SSaúl Cabrera     (emit I64Load32U $($rest:tt)*) => {};
23983cf7438SSaúl Cabrera     (emit I64Load $($rest:tt)*) => {};
24083cf7438SSaúl Cabrera     (emit I32Store $($rest:tt)*) => {};
24183cf7438SSaúl Cabrera     (emit I32Store8 $($rest:tt)*) => {};
24283cf7438SSaúl Cabrera     (emit I32Store16 $($rest:tt)*) => {};
24383cf7438SSaúl Cabrera     (emit I64Store $($rest:tt)*) => {};
24483cf7438SSaúl Cabrera     (emit I64Store8 $($rest:tt)*) => {};
24583cf7438SSaúl Cabrera     (emit I64Store16 $($rest:tt)*) => {};
24683cf7438SSaúl Cabrera     (emit I64Store32 $($rest:tt)*) => {};
24783cf7438SSaúl Cabrera     (emit F32Load $($rest:tt)*) => {};
24883cf7438SSaúl Cabrera     (emit F32Store $($rest:tt)*) => {};
24983cf7438SSaúl Cabrera     (emit F64Load $($rest:tt)*) => {};
25083cf7438SSaúl Cabrera     (emit F64Store $($rest:tt)*) => {};
2512c6f3862SSaúl Cabrera     (emit I32TruncSatF32S $($rest:tt)*) => {};
2522c6f3862SSaúl Cabrera     (emit I32TruncSatF32U $($rest:tt)*) => {};
2532c6f3862SSaúl Cabrera     (emit I32TruncSatF64S $($rest:tt)*) => {};
2542c6f3862SSaúl Cabrera     (emit I32TruncSatF64U $($rest:tt)*) => {};
2552c6f3862SSaúl Cabrera     (emit I64TruncSatF32S $($rest:tt)*) => {};
2562c6f3862SSaúl Cabrera     (emit I64TruncSatF32U $($rest:tt)*) => {};
2572c6f3862SSaúl Cabrera     (emit I64TruncSatF64S $($rest:tt)*) => {};
2582c6f3862SSaúl Cabrera     (emit I64TruncSatF64U $($rest:tt)*) => {};
259488e5056SJeffrey Charles     (emit V128Load $($rest:tt)*) => {};
260488e5056SJeffrey Charles     (emit V128Store $($rest:tt)*) => {};
261c42f925fSAlex Crichton     (emit I64Add128 $($rest:tt)*) => {};
262c42f925fSAlex Crichton     (emit I64Sub128 $($rest:tt)*) => {};
263c42f925fSAlex Crichton     (emit I64MulWideS $($rest:tt)*) => {};
264c42f925fSAlex Crichton     (emit I64MulWideU $($rest:tt)*) => {};
2658b42faf4Sad hoc     (emit I32AtomicLoad8U $($rest:tt)*) => {};
2668b42faf4Sad hoc     (emit I32AtomicLoad16U $($rest:tt)*) => {};
2678b42faf4Sad hoc     (emit I32AtomicLoad $($rest:tt)*) => {};
2688b42faf4Sad hoc     (emit I64AtomicLoad8U $($rest:tt)*) => {};
2698b42faf4Sad hoc     (emit I64AtomicLoad16U $($rest:tt)*) => {};
2708b42faf4Sad hoc     (emit I64AtomicLoad32U $($rest:tt)*) => {};
2718b42faf4Sad hoc     (emit I64AtomicLoad $($rest:tt)*) => {};
2726066c675SJeffrey Charles     (emit V128Load8x8S $($rest:tt)*) => {};
2736066c675SJeffrey Charles     (emit V128Load8x8U $($rest:tt)*) => {};
2746066c675SJeffrey Charles     (emit V128Load16x4S $($rest:tt)*) => {};
2756066c675SJeffrey Charles     (emit V128Load16x4U $($rest:tt)*) => {};
2766066c675SJeffrey Charles     (emit V128Load32x2S $($rest:tt)*) => {};
2776066c675SJeffrey Charles     (emit V128Load32x2U $($rest:tt)*) => {};
2786066c675SJeffrey Charles     (emit V128Load8Splat $($rest:tt)*) => {};
2796066c675SJeffrey Charles     (emit V128Load16Splat $($rest:tt)*) => {};
2806066c675SJeffrey Charles     (emit V128Load32Splat $($rest:tt)*) => {};
2816066c675SJeffrey Charles     (emit V128Load64Splat $($rest:tt)*) => {};
282be6c6c86SJeffrey Charles     (emit I8x16Splat $($rest:tt)*) => {};
283be6c6c86SJeffrey Charles     (emit I16x8Splat $($rest:tt)*) => {};
284be6c6c86SJeffrey Charles     (emit I32x4Splat $($rest:tt)*) => {};
285be6c6c86SJeffrey Charles     (emit I64x2Splat $($rest:tt)*) => {};
286be6c6c86SJeffrey Charles     (emit F32x4Splat $($rest:tt)*) => {};
287be6c6c86SJeffrey Charles     (emit F64x2Splat $($rest:tt)*) => {};
2883a4cf0acSad hoc     (emit I32AtomicStore8 $($rest:tt)*) => {};
2893a4cf0acSad hoc     (emit I32AtomicStore16 $($rest:tt)*) => {};
2903a4cf0acSad hoc     (emit I32AtomicStore $($rest:tt)*) => {};
2913a4cf0acSad hoc     (emit I64AtomicStore8 $($rest:tt)*) => {};
2923a4cf0acSad hoc     (emit I64AtomicStore16 $($rest:tt)*) => {};
2933a4cf0acSad hoc     (emit I64AtomicStore32 $($rest:tt)*) => {};
2943a4cf0acSad hoc     (emit I64AtomicStore $($rest:tt)*) => {};
2950a4dcc4eSad hoc     (emit I32AtomicRmw8AddU $($rest:tt)*) => {};
2960a4dcc4eSad hoc     (emit I32AtomicRmw16AddU $($rest:tt)*) => {};
2970a4dcc4eSad hoc     (emit I32AtomicRmwAdd $($rest:tt)*) => {};
2980a4dcc4eSad hoc     (emit I64AtomicRmw8AddU $($rest:tt)*) => {};
2990a4dcc4eSad hoc     (emit I64AtomicRmw16AddU $($rest:tt)*) => {};
3000a4dcc4eSad hoc     (emit I64AtomicRmw32AddU $($rest:tt)*) => {};
3010a4dcc4eSad hoc     (emit I64AtomicRmwAdd $($rest:tt)*) => {};
302ba950f2cSJeffrey Charles     (emit I8x16Shuffle $($rest:tt)*) => {};
30312649ac5SJeffrey Charles     (emit I8x16Swizzle $($rest:tt)*) => {};
304c72de0bfSad hoc     (emit I32AtomicRmw8SubU $($rest:tt)*) => {};
305c72de0bfSad hoc     (emit I32AtomicRmw16SubU $($rest:tt)*) => {};
306c72de0bfSad hoc     (emit I32AtomicRmwSub $($rest:tt)*) => {};
307c72de0bfSad hoc     (emit I64AtomicRmw8SubU $($rest:tt)*) => {};
308c72de0bfSad hoc     (emit I64AtomicRmw16SubU $($rest:tt)*) => {};
309c72de0bfSad hoc     (emit I64AtomicRmw32SubU $($rest:tt)*) => {};
310c72de0bfSad hoc     (emit I64AtomicRmwSub $($rest:tt)*) => {};
311146aa476Sad hoc     (emit I32AtomicRmw8XchgU $($rest:tt)*) => {};
312146aa476Sad hoc     (emit I32AtomicRmw16XchgU $($rest:tt)*) => {};
313146aa476Sad hoc     (emit I32AtomicRmwXchg $($rest:tt)*) => {};
314146aa476Sad hoc     (emit I64AtomicRmw8XchgU $($rest:tt)*) => {};
315146aa476Sad hoc     (emit I64AtomicRmw16XchgU $($rest:tt)*) => {};
316146aa476Sad hoc     (emit I64AtomicRmw32XchgU $($rest:tt)*) => {};
317146aa476Sad hoc     (emit I64AtomicRmwXchg $($rest:tt)*) => {};
318cd67a609SJeffrey Charles     (emit I8x16ExtractLaneS $($rest:tt)*) => {};
319cd67a609SJeffrey Charles     (emit I8x16ExtractLaneU $($rest:tt)*) => {};
320cd67a609SJeffrey Charles     (emit I16x8ExtractLaneS $($rest:tt)*) => {};
321cd67a609SJeffrey Charles     (emit I16x8ExtractLaneU $($rest:tt)*) => {};
322cd67a609SJeffrey Charles     (emit I32x4ExtractLane $($rest:tt)*) => {};
323cd67a609SJeffrey Charles     (emit I64x2ExtractLane $($rest:tt)*) => {};
324cd67a609SJeffrey Charles     (emit F32x4ExtractLane $($rest:tt)*) => {};
325cd67a609SJeffrey Charles     (emit F64x2ExtractLane $($rest:tt)*) => {};
3262eb65138Sad hoc     (emit I32AtomicRmw8AndU $($rest:tt)*) => {};
3272eb65138Sad hoc     (emit I32AtomicRmw16AndU $($rest:tt)*) => {};
3282eb65138Sad hoc     (emit I32AtomicRmwAnd $($rest:tt)*) => {};
3292eb65138Sad hoc     (emit I64AtomicRmw8AndU $($rest:tt)*) => {};
3302eb65138Sad hoc     (emit I64AtomicRmw16AndU $($rest:tt)*) => {};
3312eb65138Sad hoc     (emit I64AtomicRmw32AndU $($rest:tt)*) => {};
3322eb65138Sad hoc     (emit I64AtomicRmwAnd $($rest:tt)*) => {};
3332eb65138Sad hoc     (emit I32AtomicRmw8OrU $($rest:tt)*) => {};
3342eb65138Sad hoc     (emit I32AtomicRmw16OrU $($rest:tt)*) => {};
3352eb65138Sad hoc     (emit I32AtomicRmwOr $($rest:tt)*) => {};
3362eb65138Sad hoc     (emit I64AtomicRmw8OrU $($rest:tt)*) => {};
3372eb65138Sad hoc     (emit I64AtomicRmw16OrU $($rest:tt)*) => {};
3382eb65138Sad hoc     (emit I64AtomicRmw32OrU $($rest:tt)*) => {};
3392eb65138Sad hoc     (emit I64AtomicRmwOr $($rest:tt)*) => {};
3402eb65138Sad hoc     (emit I32AtomicRmw8XorU $($rest:tt)*) => {};
3412eb65138Sad hoc     (emit I32AtomicRmw16XorU $($rest:tt)*) => {};
3422eb65138Sad hoc     (emit I32AtomicRmwXor $($rest:tt)*) => {};
3432eb65138Sad hoc     (emit I64AtomicRmw8XorU $($rest:tt)*) => {};
3442eb65138Sad hoc     (emit I64AtomicRmw16XorU $($rest:tt)*) => {};
3452eb65138Sad hoc     (emit I64AtomicRmw32XorU $($rest:tt)*) => {};
3462eb65138Sad hoc     (emit I64AtomicRmwXor $($rest:tt)*) => {};
3471ad7a4f6SJeffrey Charles     (emit I8x16ReplaceLane $($rest:tt)*) => {};
3481ad7a4f6SJeffrey Charles     (emit I16x8ReplaceLane $($rest:tt)*) => {};
3491ad7a4f6SJeffrey Charles     (emit I32x4ReplaceLane $($rest:tt)*) => {};
3501ad7a4f6SJeffrey Charles     (emit I64x2ReplaceLane $($rest:tt)*) => {};
3511ad7a4f6SJeffrey Charles     (emit F32x4ReplaceLane $($rest:tt)*) => {};
3521ad7a4f6SJeffrey Charles     (emit F64x2ReplaceLane $($rest:tt)*) => {};
3533ab865a2Sad hoc     (emit I32AtomicRmw8CmpxchgU $($rest:tt)*) => {};
3543ab865a2Sad hoc     (emit I32AtomicRmw16CmpxchgU $($rest:tt)*) => {};
3553ab865a2Sad hoc     (emit I32AtomicRmwCmpxchg $($rest:tt)*) => {};
3563ab865a2Sad hoc     (emit I64AtomicRmw8CmpxchgU $($rest:tt)*) => {};
3573ab865a2Sad hoc     (emit I64AtomicRmw16CmpxchgU $($rest:tt)*) => {};
3583ab865a2Sad hoc     (emit I64AtomicRmw32CmpxchgU $($rest:tt)*) => {};
3593ab865a2Sad hoc     (emit I64AtomicRmwCmpxchg $($rest:tt)*) => {};
360febd080eSJeffrey Charles     (emit I8x16Eq $($rest:tt)*) => {};
361febd080eSJeffrey Charles     (emit I16x8Eq $($rest:tt)*) => {};
362febd080eSJeffrey Charles     (emit I32x4Eq $($rest:tt)*) => {};
363febd080eSJeffrey Charles     (emit I64x2Eq $($rest:tt)*) => {};
364febd080eSJeffrey Charles     (emit F32x4Eq $($rest:tt)*) => {};
365febd080eSJeffrey Charles     (emit F64x2Eq $($rest:tt)*) => {};
366febd080eSJeffrey Charles     (emit I8x16Ne $($rest:tt)*) => {};
367febd080eSJeffrey Charles     (emit I16x8Ne $($rest:tt)*) => {};
368febd080eSJeffrey Charles     (emit I32x4Ne $($rest:tt)*) => {};
369febd080eSJeffrey Charles     (emit I64x2Ne $($rest:tt)*) => {};
370febd080eSJeffrey Charles     (emit F32x4Ne $($rest:tt)*) => {};
371febd080eSJeffrey Charles     (emit F64x2Ne $($rest:tt)*) => {};
372febd080eSJeffrey Charles     (emit I8x16LtS $($rest:tt)*) => {};
373febd080eSJeffrey Charles     (emit I8x16LtU $($rest:tt)*) => {};
374febd080eSJeffrey Charles     (emit I16x8LtS $($rest:tt)*) => {};
375febd080eSJeffrey Charles     (emit I16x8LtU $($rest:tt)*) => {};
376febd080eSJeffrey Charles     (emit I32x4LtS $($rest:tt)*) => {};
377febd080eSJeffrey Charles     (emit I32x4LtU $($rest:tt)*) => {};
378febd080eSJeffrey Charles     (emit I64x2LtS $($rest:tt)*) => {};
379febd080eSJeffrey Charles     (emit F32x4Lt $($rest:tt)*) => {};
380febd080eSJeffrey Charles     (emit F64x2Lt $($rest:tt)*) => {};
381febd080eSJeffrey Charles     (emit I8x16LeS $($rest:tt)*) => {};
382febd080eSJeffrey Charles     (emit I8x16LeU $($rest:tt)*) => {};
383febd080eSJeffrey Charles     (emit I16x8LeS $($rest:tt)*) => {};
384febd080eSJeffrey Charles     (emit I16x8LeU $($rest:tt)*) => {};
385febd080eSJeffrey Charles     (emit I32x4LeS $($rest:tt)*) => {};
386febd080eSJeffrey Charles     (emit I32x4LeU $($rest:tt)*) => {};
387febd080eSJeffrey Charles     (emit I64x2LeS $($rest:tt)*) => {};
388febd080eSJeffrey Charles     (emit F32x4Le $($rest:tt)*) => {};
389febd080eSJeffrey Charles     (emit F64x2Le $($rest:tt)*) => {};
390febd080eSJeffrey Charles     (emit I8x16GtS $($rest:tt)*) => {};
391febd080eSJeffrey Charles     (emit I8x16GtU $($rest:tt)*) => {};
392febd080eSJeffrey Charles     (emit I16x8GtS $($rest:tt)*) => {};
393febd080eSJeffrey Charles     (emit I16x8GtU $($rest:tt)*) => {};
394febd080eSJeffrey Charles     (emit I32x4GtS $($rest:tt)*) => {};
395febd080eSJeffrey Charles     (emit I32x4GtU $($rest:tt)*) => {};
396febd080eSJeffrey Charles     (emit I64x2GtS $($rest:tt)*) => {};
397febd080eSJeffrey Charles     (emit F32x4Gt $($rest:tt)*) => {};
398febd080eSJeffrey Charles     (emit F64x2Gt $($rest:tt)*) => {};
399febd080eSJeffrey Charles     (emit I8x16GeS $($rest:tt)*) => {};
400febd080eSJeffrey Charles     (emit I8x16GeU $($rest:tt)*) => {};
401febd080eSJeffrey Charles     (emit I16x8GeS $($rest:tt)*) => {};
402febd080eSJeffrey Charles     (emit I16x8GeU $($rest:tt)*) => {};
403febd080eSJeffrey Charles     (emit I32x4GeS $($rest:tt)*) => {};
404febd080eSJeffrey Charles     (emit I32x4GeU $($rest:tt)*) => {};
405febd080eSJeffrey Charles     (emit I64x2GeS $($rest:tt)*) => {};
406febd080eSJeffrey Charles     (emit F32x4Ge $($rest:tt)*) => {};
407febd080eSJeffrey Charles     (emit F64x2Ge $($rest:tt)*) => {};
4081bd66bf6Sad hoc     (emit MemoryAtomicWait32 $($rest:tt)*) => {};
4091bd66bf6Sad hoc     (emit MemoryAtomicWait64 $($rest:tt)*) => {};
4101bd66bf6Sad hoc     (emit MemoryAtomicNotify $($rest:tt)*) => {};
4111bd66bf6Sad hoc     (emit AtomicFence $($rest:tt)*) => {};
412cb195e54Sad hoc     (emit V128Not $($rest:tt)*) => {};
413cb195e54Sad hoc     (emit V128And $($rest:tt)*) => {};
414cb195e54Sad hoc     (emit V128AndNot $($rest:tt)*) => {};
415cb195e54Sad hoc     (emit V128Or $($rest:tt)*) => {};
416cb195e54Sad hoc     (emit V128Xor $($rest:tt)*) => {};
417cb195e54Sad hoc     (emit V128Bitselect $($rest:tt)*) => {};
418cb195e54Sad hoc     (emit V128AnyTrue $($rest:tt)*) => {};
419cb195e54Sad hoc     (emit V128Load8Lane $($rest:tt)*) => {};
420cb195e54Sad hoc     (emit V128Load16Lane $($rest:tt)*) => {};
421cb195e54Sad hoc     (emit V128Load32Lane $($rest:tt)*) => {};
422cb195e54Sad hoc     (emit V128Load64Lane $($rest:tt)*) => {};
423cb195e54Sad hoc     (emit V128Store8Lane $($rest:tt)*) => {};
424cb195e54Sad hoc     (emit V128Store16Lane $($rest:tt)*) => {};
425cb195e54Sad hoc     (emit V128Store32Lane $($rest:tt)*) => {};
426cb195e54Sad hoc     (emit V128Store64Lane $($rest:tt)*) => {};
42776654321SJeffrey Charles     (emit F32x4ConvertI32x4S $($rest:tt)*) => {};
42876654321SJeffrey Charles     (emit F32x4ConvertI32x4U $($rest:tt)*) => {};
42976654321SJeffrey Charles     (emit F64x2ConvertLowI32x4S $($rest:tt)*) => {};
43076654321SJeffrey Charles     (emit F64x2ConvertLowI32x4U $($rest:tt)*) => {};
43176654321SJeffrey Charles     (emit I8x16NarrowI16x8S $($rest:tt)*) => {};
43276654321SJeffrey Charles     (emit I8x16NarrowI16x8U $($rest:tt)*) => {};
43376654321SJeffrey Charles     (emit I16x8NarrowI32x4S $($rest:tt)*) => {};
43476654321SJeffrey Charles     (emit I16x8NarrowI32x4U $($rest:tt)*) => {};
43576654321SJeffrey Charles     (emit F32x4DemoteF64x2Zero $($rest:tt)*) => {};
43676654321SJeffrey Charles     (emit F64x2PromoteLowF32x4 $($rest:tt)*) => {};
43776654321SJeffrey Charles     (emit I16x8ExtendLowI8x16S $($rest:tt)*) => {};
43876654321SJeffrey Charles     (emit I16x8ExtendHighI8x16S $($rest:tt)*) => {};
43976654321SJeffrey Charles     (emit I16x8ExtendLowI8x16U $($rest:tt)*) => {};
44076654321SJeffrey Charles     (emit I16x8ExtendHighI8x16U $($rest:tt)*) => {};
44176654321SJeffrey Charles     (emit I32x4ExtendLowI16x8S $($rest:tt)*) => {};
44276654321SJeffrey Charles     (emit I32x4ExtendHighI16x8S $($rest:tt)*) => {};
44376654321SJeffrey Charles     (emit I32x4ExtendLowI16x8U $($rest:tt)*) => {};
44476654321SJeffrey Charles     (emit I32x4ExtendHighI16x8U $($rest:tt)*) => {};
44576654321SJeffrey Charles     (emit I64x2ExtendLowI32x4S $($rest:tt)*) => {};
44676654321SJeffrey Charles     (emit I64x2ExtendHighI32x4S $($rest:tt)*) => {};
44776654321SJeffrey Charles     (emit I64x2ExtendLowI32x4U $($rest:tt)*) => {};
44876654321SJeffrey Charles     (emit I64x2ExtendHighI32x4U $($rest:tt)*) => {};
44970c93c67Sad hoc     (emit I8x16Add $($rest:tt)*) => {};
45070c93c67Sad hoc     (emit I16x8Add $($rest:tt)*) => {};
45170c93c67Sad hoc     (emit I32x4Add $($rest:tt)*) => {};
45270c93c67Sad hoc     (emit I64x2Add $($rest:tt)*) => {};
45370c93c67Sad hoc     (emit I8x16Sub $($rest:tt)*) => {};
45470c93c67Sad hoc     (emit I16x8Sub $($rest:tt)*) => {};
45570c93c67Sad hoc     (emit I32x4Sub $($rest:tt)*) => {};
45670c93c67Sad hoc     (emit I64x2Sub $($rest:tt)*) => {};
45770c93c67Sad hoc     (emit I16x8Mul $($rest:tt)*) => {};
45870c93c67Sad hoc     (emit I32x4Mul $($rest:tt)*) => {};
45970c93c67Sad hoc     (emit I64x2Mul $($rest:tt)*) => {};
46070c93c67Sad hoc     (emit I8x16AddSatS $($rest:tt)*) => {};
46170c93c67Sad hoc     (emit I16x8AddSatS $($rest:tt)*) => {};
46270c93c67Sad hoc     (emit I8x16AddSatU $($rest:tt)*) => {};
46370c93c67Sad hoc     (emit I16x8AddSatU $($rest:tt)*) => {};
46470c93c67Sad hoc     (emit I8x16SubSatS $($rest:tt)*) => {};
46570c93c67Sad hoc     (emit I16x8SubSatS $($rest:tt)*) => {};
46670c93c67Sad hoc     (emit I8x16SubSatU $($rest:tt)*) => {};
46770c93c67Sad hoc     (emit I16x8SubSatU $($rest:tt)*) => {};
46848fe3bb5SJeffrey Charles     (emit I8x16Abs $($rest:tt)*) => {};
46948fe3bb5SJeffrey Charles     (emit I16x8Abs $($rest:tt)*) => {};
47048fe3bb5SJeffrey Charles     (emit I32x4Abs $($rest:tt)*) => {};
47148fe3bb5SJeffrey Charles     (emit I64x2Abs $($rest:tt)*) => {};
47248fe3bb5SJeffrey Charles     (emit F32x4Abs $($rest:tt)*) => {};
47348fe3bb5SJeffrey Charles     (emit F64x2Abs $($rest:tt)*) => {};
474d943d57eSad hoc     (emit I8x16Neg $($rest:tt)*) => {};
475d943d57eSad hoc     (emit I16x8Neg $($rest:tt)*) => {};
476d943d57eSad hoc     (emit I32x4Neg $($rest:tt)*) => {};
477d943d57eSad hoc     (emit I64x2Neg $($rest:tt)*) => {};
478d943d57eSad hoc     (emit I8x16Shl $($rest:tt)*) => {};
479d943d57eSad hoc     (emit I16x8Shl $($rest:tt)*) => {};
480d943d57eSad hoc     (emit I32x4Shl $($rest:tt)*) => {};
481d943d57eSad hoc     (emit I64x2Shl $($rest:tt)*) => {};
482d943d57eSad hoc     (emit I8x16ShrU $($rest:tt)*) => {};
483d943d57eSad hoc     (emit I16x8ShrU $($rest:tt)*) => {};
484d943d57eSad hoc     (emit I32x4ShrU $($rest:tt)*) => {};
485d943d57eSad hoc     (emit I64x2ShrU $($rest:tt)*) => {};
486d943d57eSad hoc     (emit I8x16ShrS $($rest:tt)*) => {};
487d943d57eSad hoc     (emit I16x8ShrS $($rest:tt)*) => {};
488d943d57eSad hoc     (emit I32x4ShrS $($rest:tt)*) => {};
489d943d57eSad hoc     (emit I64x2ShrS $($rest:tt)*) => {};
490b5b82579SJeffrey Charles     (emit I16x8Q15MulrSatS $($rest:tt)*) => {};
4916eb3155eSJeffrey Charles     (emit I8x16AllTrue $($rest:tt)*) => {};
4926eb3155eSJeffrey Charles     (emit I16x8AllTrue $($rest:tt)*) => {};
4936eb3155eSJeffrey Charles     (emit I32x4AllTrue $($rest:tt)*) => {};
4946eb3155eSJeffrey Charles     (emit I64x2AllTrue $($rest:tt)*) => {};
4956eb3155eSJeffrey Charles     (emit I8x16Bitmask $($rest:tt)*) => {};
4966eb3155eSJeffrey Charles     (emit I16x8Bitmask $($rest:tt)*) => {};
4976eb3155eSJeffrey Charles     (emit I32x4Bitmask $($rest:tt)*) => {};
4986eb3155eSJeffrey Charles     (emit I64x2Bitmask $($rest:tt)*) => {};
4997f93c1edSJeffrey Charles     (emit I32x4TruncSatF32x4S $($rest:tt)*) => {};
5007f93c1edSJeffrey Charles     (emit I32x4TruncSatF32x4U $($rest:tt)*) => {};
5017f93c1edSJeffrey Charles     (emit I32x4TruncSatF64x2SZero $($rest:tt)*) => {};
5027f93c1edSJeffrey Charles     (emit I32x4TruncSatF64x2UZero $($rest:tt)*) => {};
503305c3f99Sad hoc     (emit I8x16MinU $($rest:tt)*) => {};
504305c3f99Sad hoc     (emit I16x8MinU $($rest:tt)*) => {};
505305c3f99Sad hoc     (emit I32x4MinU $($rest:tt)*) => {};
506305c3f99Sad hoc     (emit I8x16MinS $($rest:tt)*) => {};
507305c3f99Sad hoc     (emit I16x8MinS $($rest:tt)*) => {};
508305c3f99Sad hoc     (emit I32x4MinS $($rest:tt)*) => {};
509305c3f99Sad hoc     (emit I8x16MaxU $($rest:tt)*) => {};
510305c3f99Sad hoc     (emit I16x8MaxU $($rest:tt)*) => {};
511305c3f99Sad hoc     (emit I32x4MaxU $($rest:tt)*) => {};
512305c3f99Sad hoc     (emit I8x16MaxS $($rest:tt)*) => {};
513305c3f99Sad hoc     (emit I16x8MaxS $($rest:tt)*) => {};
514305c3f99Sad hoc     (emit I32x4MaxS $($rest:tt)*) => {};
515305c3f99Sad hoc     (emit I16x8ExtMulLowI8x16S $($rest:tt)*) => {};
516305c3f99Sad hoc     (emit I32x4ExtMulLowI16x8S $($rest:tt)*) => {};
517305c3f99Sad hoc     (emit I64x2ExtMulLowI32x4S $($rest:tt)*) => {};
518305c3f99Sad hoc     (emit I16x8ExtMulHighI8x16S $($rest:tt)*) => {};
519305c3f99Sad hoc     (emit I32x4ExtMulHighI16x8S $($rest:tt)*) => {};
520305c3f99Sad hoc     (emit I64x2ExtMulHighI32x4S $($rest:tt)*) => {};
521305c3f99Sad hoc     (emit I16x8ExtMulLowI8x16U $($rest:tt)*) => {};
522305c3f99Sad hoc     (emit I32x4ExtMulLowI16x8U $($rest:tt)*) => {};
523305c3f99Sad hoc     (emit I64x2ExtMulLowI32x4U $($rest:tt)*) => {};
524305c3f99Sad hoc     (emit I16x8ExtMulHighI8x16U $($rest:tt)*) => {};
525305c3f99Sad hoc     (emit I32x4ExtMulHighI16x8U $($rest:tt)*) => {};
526305c3f99Sad hoc     (emit I64x2ExtMulHighI32x4U $($rest:tt)*) => {};
527305c3f99Sad hoc     (emit I16x8ExtAddPairwiseI8x16U $($rest:tt)*) => {};
528305c3f99Sad hoc     (emit I16x8ExtAddPairwiseI8x16S $($rest:tt)*) => {};
529305c3f99Sad hoc     (emit I32x4ExtAddPairwiseI16x8U $($rest:tt)*) => {};
530305c3f99Sad hoc     (emit I32x4ExtAddPairwiseI16x8S $($rest:tt)*) => {};
531ec9f885aSJeffrey Charles     (emit I32x4DotI16x8S $($rest:tt)*) => {};
532362b0dbfSJeffrey Charles     (emit I8x16Popcnt $($rest:tt)*) => {};
533b09899deSJeffrey Charles     (emit I8x16AvgrU $($rest:tt)*) => {};
534b09899deSJeffrey Charles     (emit I16x8AvgrU $($rest:tt)*) => {};
535acef4083SJeffrey Charles     (emit F32x4Add $($rest:tt)*) => {};
536acef4083SJeffrey Charles     (emit F64x2Add $($rest:tt)*) => {};
537acef4083SJeffrey Charles     (emit F32x4Sub $($rest:tt)*) => {};
538acef4083SJeffrey Charles     (emit F64x2Sub $($rest:tt)*) => {};
539acef4083SJeffrey Charles     (emit F32x4Mul $($rest:tt)*) => {};
540acef4083SJeffrey Charles     (emit F64x2Mul $($rest:tt)*) => {};
541acef4083SJeffrey Charles     (emit F32x4Div $($rest:tt)*) => {};
542acef4083SJeffrey Charles     (emit F64x2Div $($rest:tt)*) => {};
543acef4083SJeffrey Charles     (emit F32x4Neg $($rest:tt)*) => {};
544acef4083SJeffrey Charles     (emit F64x2Neg $($rest:tt)*) => {};
545acef4083SJeffrey Charles     (emit F32x4Sqrt $($rest:tt)*) => {};
546acef4083SJeffrey Charles     (emit F64x2Sqrt $($rest:tt)*) => {};
547fb7dd612SJeffrey Charles     (emit F32x4Ceil $($rest:tt)*) => {};
548fb7dd612SJeffrey Charles     (emit F64x2Ceil $($rest:tt)*) => {};
549fb7dd612SJeffrey Charles     (emit F32x4Floor $($rest:tt)*) => {};
550fb7dd612SJeffrey Charles     (emit F64x2Floor $($rest:tt)*) => {};
551fb7dd612SJeffrey Charles     (emit F32x4Nearest $($rest:tt)*) => {};
552fb7dd612SJeffrey Charles     (emit F64x2Nearest $($rest:tt)*) => {};
553fb7dd612SJeffrey Charles     (emit F32x4Trunc $($rest:tt)*) => {};
554fb7dd612SJeffrey Charles     (emit F64x2Trunc $($rest:tt)*) => {};
555898b0febSJeffrey Charles     (emit V128Load32Zero $($rest:tt)*) => {};
556898b0febSJeffrey Charles     (emit V128Load64Zero $($rest:tt)*) => {};
557b0319ebcSJeffrey Charles     (emit F32x4PMin $($rest:tt)*) => {};
558b0319ebcSJeffrey Charles     (emit F64x2PMin $($rest:tt)*) => {};
559b0319ebcSJeffrey Charles     (emit F32x4PMax $($rest:tt)*) => {};
560b0319ebcSJeffrey Charles     (emit F64x2PMax $($rest:tt)*) => {};
5611f24222fSJeffrey Charles     (emit F32x4Min $($rest:tt)*) => {};
5621f24222fSJeffrey Charles     (emit F64x2Min $($rest:tt)*) => {};
5631f24222fSJeffrey Charles     (emit F32x4Max $($rest:tt)*) => {};
5641f24222fSJeffrey Charles     (emit F64x2Max $($rest:tt)*) => {};
5653a4cf0acSad hoc 
566835abbcdSSaúl Cabrera     (emit $unsupported:tt $($rest:tt)*) => {$($rest)*};
567835abbcdSSaúl Cabrera }
568835abbcdSSaúl Cabrera 
5697ef8f2e2SSaúl Cabrera impl<'a, 'translation, 'data, M> VisitOperator<'a> for CodeGen<'a, 'translation, 'data, M, Emission>
570835abbcdSSaúl Cabrera where
571835abbcdSSaúl Cabrera     M: MacroAssembler,
572835abbcdSSaúl Cabrera {
573b93e1bc0SSaúl Cabrera     type Output = Result<()>;
574835abbcdSSaúl Cabrera 
visit_i32_const(&mut self, val: i32) -> Self::Output575b93e1bc0SSaúl Cabrera     fn visit_i32_const(&mut self, val: i32) -> Self::Output {
5763b966855SAlex Crichton         self.context.stack.push(Val::i32(val));
577b93e1bc0SSaúl Cabrera 
578b93e1bc0SSaúl Cabrera         Ok(())
579835abbcdSSaúl Cabrera     }
580835abbcdSSaúl Cabrera 
visit_i64_const(&mut self, val: i64) -> Self::Output581b93e1bc0SSaúl Cabrera     fn visit_i64_const(&mut self, val: i64) -> Self::Output {
5827c5c7e4bSSaúl Cabrera         self.context.stack.push(Val::i64(val));
583b93e1bc0SSaúl Cabrera         Ok(())
5843b966855SAlex Crichton     }
5857c5c7e4bSSaúl Cabrera 
visit_f32_const(&mut self, val: Ieee32) -> Self::Output586b93e1bc0SSaúl Cabrera     fn visit_f32_const(&mut self, val: Ieee32) -> Self::Output {
58714b39bc2SSaúl Cabrera         self.context.stack.push(Val::f32(val));
588b93e1bc0SSaúl Cabrera         Ok(())
58914b39bc2SSaúl Cabrera     }
59014b39bc2SSaúl Cabrera 
visit_f64_const(&mut self, val: Ieee64) -> Self::Output591b93e1bc0SSaúl Cabrera     fn visit_f64_const(&mut self, val: Ieee64) -> Self::Output {
59214b39bc2SSaúl Cabrera         self.context.stack.push(Val::f64(val));
593b93e1bc0SSaúl Cabrera         Ok(())
59414b39bc2SSaúl Cabrera     }
59514b39bc2SSaúl Cabrera 
visit_f32_add(&mut self) -> Self::Output596b93e1bc0SSaúl Cabrera     fn visit_f32_add(&mut self) -> Self::Output {
597dd42290eSJeffrey Charles         self.context.binop(
598dd42290eSJeffrey Charles             self.masm,
599dd42290eSJeffrey Charles             OperandSize::S32,
600dd42290eSJeffrey Charles             &mut |masm: &mut M, dst, src, size| {
601b93e1bc0SSaúl Cabrera                 masm.float_add(writable!(dst), dst, src, size)?;
602b93e1bc0SSaúl Cabrera                 Ok(TypedReg::f32(dst))
603dd42290eSJeffrey Charles             },
604b93e1bc0SSaúl Cabrera         )
605dd42290eSJeffrey Charles     }
606dd42290eSJeffrey Charles 
visit_f64_add(&mut self) -> Self::Output607b93e1bc0SSaúl Cabrera     fn visit_f64_add(&mut self) -> Self::Output {
608dd42290eSJeffrey Charles         self.context.binop(
609dd42290eSJeffrey Charles             self.masm,
610dd42290eSJeffrey Charles             OperandSize::S64,
611dd42290eSJeffrey Charles             &mut |masm: &mut M, dst, src, size| {
612b93e1bc0SSaúl Cabrera                 masm.float_add(writable!(dst), dst, src, size)?;
613b93e1bc0SSaúl Cabrera                 Ok(TypedReg::f64(dst))
614dd42290eSJeffrey Charles             },
615b93e1bc0SSaúl Cabrera         )
616dd42290eSJeffrey Charles     }
617dd42290eSJeffrey Charles 
visit_f32_sub(&mut self) -> Self::Output618b93e1bc0SSaúl Cabrera     fn visit_f32_sub(&mut self) -> Self::Output {
619dd42290eSJeffrey Charles         self.context.binop(
620dd42290eSJeffrey Charles             self.masm,
621dd42290eSJeffrey Charles             OperandSize::S32,
622dd42290eSJeffrey Charles             &mut |masm: &mut M, dst, src, size| {
623b93e1bc0SSaúl Cabrera                 masm.float_sub(writable!(dst), dst, src, size)?;
624b93e1bc0SSaúl Cabrera                 Ok(TypedReg::f32(dst))
625dd42290eSJeffrey Charles             },
626b93e1bc0SSaúl Cabrera         )
627dd42290eSJeffrey Charles     }
628dd42290eSJeffrey Charles 
visit_f64_sub(&mut self) -> Self::Output629b93e1bc0SSaúl Cabrera     fn visit_f64_sub(&mut self) -> Self::Output {
630dd42290eSJeffrey Charles         self.context.binop(
631dd42290eSJeffrey Charles             self.masm,
632dd42290eSJeffrey Charles             OperandSize::S64,
633dd42290eSJeffrey Charles             &mut |masm: &mut M, dst, src, size| {
634b93e1bc0SSaúl Cabrera                 masm.float_sub(writable!(dst), dst, src, size)?;
635b93e1bc0SSaúl Cabrera                 Ok(TypedReg::f64(dst))
636dd42290eSJeffrey Charles             },
637b93e1bc0SSaúl Cabrera         )
638dd42290eSJeffrey Charles     }
639dd42290eSJeffrey Charles 
visit_f32_mul(&mut self) -> Self::Output640b93e1bc0SSaúl Cabrera     fn visit_f32_mul(&mut self) -> Self::Output {
641dd42290eSJeffrey Charles         self.context.binop(
642dd42290eSJeffrey Charles             self.masm,
643dd42290eSJeffrey Charles             OperandSize::S32,
644dd42290eSJeffrey Charles             &mut |masm: &mut M, dst, src, size| {
645b93e1bc0SSaúl Cabrera                 masm.float_mul(writable!(dst), dst, src, size)?;
646b93e1bc0SSaúl Cabrera                 Ok(TypedReg::f32(dst))
647dd42290eSJeffrey Charles             },
648b93e1bc0SSaúl Cabrera         )
649dd42290eSJeffrey Charles     }
650dd42290eSJeffrey Charles 
visit_f64_mul(&mut self) -> Self::Output651b93e1bc0SSaúl Cabrera     fn visit_f64_mul(&mut self) -> Self::Output {
652dd42290eSJeffrey Charles         self.context.binop(
653dd42290eSJeffrey Charles             self.masm,
654dd42290eSJeffrey Charles             OperandSize::S64,
655dd42290eSJeffrey Charles             &mut |masm: &mut M, dst, src, size| {
656b93e1bc0SSaúl Cabrera                 masm.float_mul(writable!(dst), dst, src, size)?;
657b93e1bc0SSaúl Cabrera                 Ok(TypedReg::f64(dst))
658dd42290eSJeffrey Charles             },
659b93e1bc0SSaúl Cabrera         )
660dd42290eSJeffrey Charles     }
661dd42290eSJeffrey Charles 
visit_f32_div(&mut self) -> Self::Output662b93e1bc0SSaúl Cabrera     fn visit_f32_div(&mut self) -> Self::Output {
663dd42290eSJeffrey Charles         self.context.binop(
664dd42290eSJeffrey Charles             self.masm,
665dd42290eSJeffrey Charles             OperandSize::S32,
666dd42290eSJeffrey Charles             &mut |masm: &mut M, dst, src, size| {
667b93e1bc0SSaúl Cabrera                 masm.float_div(writable!(dst), dst, src, size)?;
668b93e1bc0SSaúl Cabrera                 Ok(TypedReg::f32(dst))
669dd42290eSJeffrey Charles             },
670b93e1bc0SSaúl Cabrera         )
671dd42290eSJeffrey Charles     }
672dd42290eSJeffrey Charles 
visit_f64_div(&mut self) -> Self::Output673b93e1bc0SSaúl Cabrera     fn visit_f64_div(&mut self) -> Self::Output {
674dd42290eSJeffrey Charles         self.context.binop(
675dd42290eSJeffrey Charles             self.masm,
676dd42290eSJeffrey Charles             OperandSize::S64,
677dd42290eSJeffrey Charles             &mut |masm: &mut M, dst, src, size| {
678b93e1bc0SSaúl Cabrera                 masm.float_div(writable!(dst), dst, src, size)?;
679b93e1bc0SSaúl Cabrera                 Ok(TypedReg::f64(dst))
680dd42290eSJeffrey Charles             },
681b93e1bc0SSaúl Cabrera         )
682dd42290eSJeffrey Charles     }
683dd42290eSJeffrey Charles 
visit_f32_min(&mut self) -> Self::Output684b93e1bc0SSaúl Cabrera     fn visit_f32_min(&mut self) -> Self::Output {
685dd42290eSJeffrey Charles         self.context.binop(
686dd42290eSJeffrey Charles             self.masm,
687dd42290eSJeffrey Charles             OperandSize::S32,
688dd42290eSJeffrey Charles             &mut |masm: &mut M, dst, src, size| {
689b93e1bc0SSaúl Cabrera                 masm.float_min(writable!(dst), dst, src, size)?;
690b93e1bc0SSaúl Cabrera                 Ok(TypedReg::f32(dst))
691dd42290eSJeffrey Charles             },
692b93e1bc0SSaúl Cabrera         )
693dd42290eSJeffrey Charles     }
694dd42290eSJeffrey Charles 
visit_f64_min(&mut self) -> Self::Output695b93e1bc0SSaúl Cabrera     fn visit_f64_min(&mut self) -> Self::Output {
696dd42290eSJeffrey Charles         self.context.binop(
697dd42290eSJeffrey Charles             self.masm,
698dd42290eSJeffrey Charles             OperandSize::S64,
699dd42290eSJeffrey Charles             &mut |masm: &mut M, dst, src, size| {
700b93e1bc0SSaúl Cabrera                 masm.float_min(writable!(dst), dst, src, size)?;
701b93e1bc0SSaúl Cabrera                 Ok(TypedReg::f64(dst))
702dd42290eSJeffrey Charles             },
703b93e1bc0SSaúl Cabrera         )
704dd42290eSJeffrey Charles     }
705dd42290eSJeffrey Charles 
visit_f32_max(&mut self) -> Self::Output706b93e1bc0SSaúl Cabrera     fn visit_f32_max(&mut self) -> Self::Output {
707dd42290eSJeffrey Charles         self.context.binop(
708dd42290eSJeffrey Charles             self.masm,
709dd42290eSJeffrey Charles             OperandSize::S32,
710dd42290eSJeffrey Charles             &mut |masm: &mut M, dst, src, size| {
711b93e1bc0SSaúl Cabrera                 masm.float_max(writable!(dst), dst, src, size)?;
712b93e1bc0SSaúl Cabrera                 Ok(TypedReg::f32(dst))
713dd42290eSJeffrey Charles             },
714b93e1bc0SSaúl Cabrera         )
715dd42290eSJeffrey Charles     }
716dd42290eSJeffrey Charles 
visit_f64_max(&mut self) -> Self::Output717b93e1bc0SSaúl Cabrera     fn visit_f64_max(&mut self) -> Self::Output {
718dd42290eSJeffrey Charles         self.context.binop(
719dd42290eSJeffrey Charles             self.masm,
720dd42290eSJeffrey Charles             OperandSize::S64,
721dd42290eSJeffrey Charles             &mut |masm: &mut M, dst, src, size| {
722b93e1bc0SSaúl Cabrera                 masm.float_max(writable!(dst), dst, src, size)?;
723b93e1bc0SSaúl Cabrera                 Ok(TypedReg::f64(dst))
724dd42290eSJeffrey Charles             },
725b93e1bc0SSaúl Cabrera         )
726dd42290eSJeffrey Charles     }
727dd42290eSJeffrey Charles 
visit_f32_copysign(&mut self) -> Self::Output728b93e1bc0SSaúl Cabrera     fn visit_f32_copysign(&mut self) -> Self::Output {
729dd42290eSJeffrey Charles         self.context.binop(
730dd42290eSJeffrey Charles             self.masm,
731dd42290eSJeffrey Charles             OperandSize::S32,
732dd42290eSJeffrey Charles             &mut |masm: &mut M, dst, src, size| {
733b93e1bc0SSaúl Cabrera                 masm.float_copysign(writable!(dst), dst, src, size)?;
734b93e1bc0SSaúl Cabrera                 Ok(TypedReg::f32(dst))
735dd42290eSJeffrey Charles             },
736b93e1bc0SSaúl Cabrera         )
737dd42290eSJeffrey Charles     }
738dd42290eSJeffrey Charles 
visit_f64_copysign(&mut self) -> Self::Output739b93e1bc0SSaúl Cabrera     fn visit_f64_copysign(&mut self) -> Self::Output {
740dd42290eSJeffrey Charles         self.context.binop(
741dd42290eSJeffrey Charles             self.masm,
742dd42290eSJeffrey Charles             OperandSize::S64,
743dd42290eSJeffrey Charles             &mut |masm: &mut M, dst, src, size| {
744b93e1bc0SSaúl Cabrera                 masm.float_copysign(writable!(dst), dst, src, size)?;
745b93e1bc0SSaúl Cabrera                 Ok(TypedReg::f64(dst))
746dd42290eSJeffrey Charles             },
747b93e1bc0SSaúl Cabrera         )
748dd42290eSJeffrey Charles     }
749dd42290eSJeffrey Charles 
visit_f32_abs(&mut self) -> Self::Output750b93e1bc0SSaúl Cabrera     fn visit_f32_abs(&mut self) -> Self::Output {
751cb195e54Sad hoc         self.context.unop(self.masm, |masm, reg| {
752529b6adfSJeffrey Charles             masm.float_abs(writable!(reg), OperandSize::S32)?;
753b93e1bc0SSaúl Cabrera             Ok(TypedReg::f32(reg))
754b93e1bc0SSaúl Cabrera         })
7559f001986STrevor Elliott     }
7569f001986STrevor Elliott 
visit_f64_abs(&mut self) -> Self::Output757b93e1bc0SSaúl Cabrera     fn visit_f64_abs(&mut self) -> Self::Output {
758cb195e54Sad hoc         self.context.unop(self.masm, |masm, reg| {
759529b6adfSJeffrey Charles             masm.float_abs(writable!(reg), OperandSize::S64)?;
760b93e1bc0SSaúl Cabrera             Ok(TypedReg::f64(reg))
761b93e1bc0SSaúl Cabrera         })
7629f001986STrevor Elliott     }
7639f001986STrevor Elliott 
visit_f32_neg(&mut self) -> Self::Output764b93e1bc0SSaúl Cabrera     fn visit_f32_neg(&mut self) -> Self::Output {
765cb195e54Sad hoc         self.context.unop(self.masm, |masm, reg| {
766529b6adfSJeffrey Charles             masm.float_neg(writable!(reg), OperandSize::S32)?;
767b93e1bc0SSaúl Cabrera             Ok(TypedReg::f32(reg))
768b93e1bc0SSaúl Cabrera         })
7699f001986STrevor Elliott     }
7709f001986STrevor Elliott 
visit_f64_neg(&mut self) -> Self::Output771b93e1bc0SSaúl Cabrera     fn visit_f64_neg(&mut self) -> Self::Output {
772cb195e54Sad hoc         self.context.unop(self.masm, |masm, reg| {
773529b6adfSJeffrey Charles             masm.float_neg(writable!(reg), OperandSize::S64)?;
774b93e1bc0SSaúl Cabrera             Ok(TypedReg::f64(reg))
775b93e1bc0SSaúl Cabrera         })
7769f001986STrevor Elliott     }
7779f001986STrevor Elliott 
visit_f32_floor(&mut self) -> Self::Output778b93e1bc0SSaúl Cabrera     fn visit_f32_floor(&mut self) -> Self::Output {
7791b5c4ae8SSaúl Cabrera         self.masm.float_round(
7801b5c4ae8SSaúl Cabrera             RoundingMode::Down,
7811b5c4ae8SSaúl Cabrera             &mut self.env,
7821b5c4ae8SSaúl Cabrera             &mut self.context,
7831b5c4ae8SSaúl Cabrera             OperandSize::S32,
7841b5c4ae8SSaúl Cabrera             |env, cx, masm| {
7850145a99dSAlex Crichton                 let builtin = env.builtins.floor_f32::<M::ABI>()?;
786b93e1bc0SSaúl Cabrera                 FnCall::emit::<M>(env, masm, cx, Callee::Builtin(builtin))
7871b5c4ae8SSaúl Cabrera             },
788b93e1bc0SSaúl Cabrera         )
789230eec9eSTrevor Elliott     }
790230eec9eSTrevor Elliott 
visit_f64_floor(&mut self) -> Self::Output791b93e1bc0SSaúl Cabrera     fn visit_f64_floor(&mut self) -> Self::Output {
7921b5c4ae8SSaúl Cabrera         self.masm.float_round(
7931b5c4ae8SSaúl Cabrera             RoundingMode::Down,
7941b5c4ae8SSaúl Cabrera             &mut self.env,
7951b5c4ae8SSaúl Cabrera             &mut self.context,
7961b5c4ae8SSaúl Cabrera             OperandSize::S64,
7971b5c4ae8SSaúl Cabrera             |env, cx, masm| {
7980145a99dSAlex Crichton                 let builtin = env.builtins.floor_f64::<M::ABI>()?;
799b93e1bc0SSaúl Cabrera                 FnCall::emit::<M>(env, masm, cx, Callee::Builtin(builtin))
8001b5c4ae8SSaúl Cabrera             },
801b93e1bc0SSaúl Cabrera         )
802230eec9eSTrevor Elliott     }
803230eec9eSTrevor Elliott 
visit_f32_ceil(&mut self) -> Self::Output804b93e1bc0SSaúl Cabrera     fn visit_f32_ceil(&mut self) -> Self::Output {
8051b5c4ae8SSaúl Cabrera         self.masm.float_round(
8061b5c4ae8SSaúl Cabrera             RoundingMode::Up,
8071b5c4ae8SSaúl Cabrera             &mut self.env,
8081b5c4ae8SSaúl Cabrera             &mut self.context,
8091b5c4ae8SSaúl Cabrera             OperandSize::S32,
8101b5c4ae8SSaúl Cabrera             |env, cx, masm| {
8110145a99dSAlex Crichton                 let builtin = env.builtins.ceil_f32::<M::ABI>()?;
812b93e1bc0SSaúl Cabrera                 FnCall::emit::<M>(env, masm, cx, Callee::Builtin(builtin))
8131b5c4ae8SSaúl Cabrera             },
814b93e1bc0SSaúl Cabrera         )
815230eec9eSTrevor Elliott     }
816230eec9eSTrevor Elliott 
visit_f64_ceil(&mut self) -> Self::Output817b93e1bc0SSaúl Cabrera     fn visit_f64_ceil(&mut self) -> Self::Output {
8181b5c4ae8SSaúl Cabrera         self.masm.float_round(
8191b5c4ae8SSaúl Cabrera             RoundingMode::Up,
8201b5c4ae8SSaúl Cabrera             &mut self.env,
8211b5c4ae8SSaúl Cabrera             &mut self.context,
8221b5c4ae8SSaúl Cabrera             OperandSize::S64,
8231b5c4ae8SSaúl Cabrera             |env, cx, masm| {
8240145a99dSAlex Crichton                 let builtin = env.builtins.ceil_f64::<M::ABI>()?;
825b93e1bc0SSaúl Cabrera                 FnCall::emit::<M>(env, masm, cx, Callee::Builtin(builtin))
8261b5c4ae8SSaúl Cabrera             },
827b93e1bc0SSaúl Cabrera         )
828230eec9eSTrevor Elliott     }
829230eec9eSTrevor Elliott 
visit_f32_nearest(&mut self) -> Self::Output830b93e1bc0SSaúl Cabrera     fn visit_f32_nearest(&mut self) -> Self::Output {
8311b5c4ae8SSaúl Cabrera         self.masm.float_round(
8321b5c4ae8SSaúl Cabrera             RoundingMode::Nearest,
8331b5c4ae8SSaúl Cabrera             &mut self.env,
8341b5c4ae8SSaúl Cabrera             &mut self.context,
8351b5c4ae8SSaúl Cabrera             OperandSize::S32,
8361b5c4ae8SSaúl Cabrera             |env, cx, masm| {
8370145a99dSAlex Crichton                 let builtin = env.builtins.nearest_f32::<M::ABI>()?;
838355990b4SAlex Crichton                 FnCall::emit::<M>(env, masm, cx, Callee::Builtin(builtin))
8391b5c4ae8SSaúl Cabrera             },
840b93e1bc0SSaúl Cabrera         )
841230eec9eSTrevor Elliott     }
842230eec9eSTrevor Elliott 
visit_f64_nearest(&mut self) -> Self::Output843b93e1bc0SSaúl Cabrera     fn visit_f64_nearest(&mut self) -> Self::Output {
8441b5c4ae8SSaúl Cabrera         self.masm.float_round(
8451b5c4ae8SSaúl Cabrera             RoundingMode::Nearest,
8461b5c4ae8SSaúl Cabrera             &mut self.env,
8471b5c4ae8SSaúl Cabrera             &mut self.context,
8481b5c4ae8SSaúl Cabrera             OperandSize::S64,
8491b5c4ae8SSaúl Cabrera             |env, cx, masm| {
8500145a99dSAlex Crichton                 let builtin = env.builtins.nearest_f64::<M::ABI>()?;
851b93e1bc0SSaúl Cabrera                 FnCall::emit::<M>(env, masm, cx, Callee::Builtin(builtin))
8521b5c4ae8SSaúl Cabrera             },
853b93e1bc0SSaúl Cabrera         )
854230eec9eSTrevor Elliott     }
855230eec9eSTrevor Elliott 
visit_f32_trunc(&mut self) -> Self::Output856b93e1bc0SSaúl Cabrera     fn visit_f32_trunc(&mut self) -> Self::Output {
8571b5c4ae8SSaúl Cabrera         self.masm.float_round(
8581b5c4ae8SSaúl Cabrera             RoundingMode::Zero,
8591b5c4ae8SSaúl Cabrera             &mut self.env,
8601b5c4ae8SSaúl Cabrera             &mut self.context,
8611b5c4ae8SSaúl Cabrera             OperandSize::S32,
8621b5c4ae8SSaúl Cabrera             |env, cx, masm| {
8630145a99dSAlex Crichton                 let builtin = env.builtins.trunc_f32::<M::ABI>()?;
864b93e1bc0SSaúl Cabrera                 FnCall::emit::<M>(env, masm, cx, Callee::Builtin(builtin))
8651b5c4ae8SSaúl Cabrera             },
866b93e1bc0SSaúl Cabrera         )
867230eec9eSTrevor Elliott     }
868230eec9eSTrevor Elliott 
visit_f64_trunc(&mut self) -> Self::Output869b93e1bc0SSaúl Cabrera     fn visit_f64_trunc(&mut self) -> Self::Output {
8701b5c4ae8SSaúl Cabrera         self.masm.float_round(
8711b5c4ae8SSaúl Cabrera             RoundingMode::Zero,
8721b5c4ae8SSaúl Cabrera             &mut self.env,
8731b5c4ae8SSaúl Cabrera             &mut self.context,
8741b5c4ae8SSaúl Cabrera             OperandSize::S64,
8751b5c4ae8SSaúl Cabrera             |env, cx, masm| {
8760145a99dSAlex Crichton                 let builtin = env.builtins.trunc_f64::<M::ABI>()?;
877b93e1bc0SSaúl Cabrera                 FnCall::emit::<M>(env, masm, cx, Callee::Builtin(builtin))
8781b5c4ae8SSaúl Cabrera             },
879b93e1bc0SSaúl Cabrera         )
880230eec9eSTrevor Elliott     }
881230eec9eSTrevor Elliott 
visit_f32_sqrt(&mut self) -> Self::Output882b93e1bc0SSaúl Cabrera     fn visit_f32_sqrt(&mut self) -> Self::Output {
883cb195e54Sad hoc         self.context.unop(self.masm, |masm, reg| {
884529b6adfSJeffrey Charles             masm.float_sqrt(writable!(reg), reg, OperandSize::S32)?;
885b93e1bc0SSaúl Cabrera             Ok(TypedReg::f32(reg))
886b93e1bc0SSaúl Cabrera         })
887654d9f5eSJeffrey Charles     }
888654d9f5eSJeffrey Charles 
visit_f64_sqrt(&mut self) -> Self::Output889b93e1bc0SSaúl Cabrera     fn visit_f64_sqrt(&mut self) -> Self::Output {
890cb195e54Sad hoc         self.context.unop(self.masm, |masm, reg| {
891529b6adfSJeffrey Charles             masm.float_sqrt(writable!(reg), reg, OperandSize::S64)?;
892b93e1bc0SSaúl Cabrera             Ok(TypedReg::f64(reg))
893b93e1bc0SSaúl Cabrera         })
894654d9f5eSJeffrey Charles     }
895654d9f5eSJeffrey Charles 
visit_f32_eq(&mut self) -> Self::Output896b93e1bc0SSaúl Cabrera     fn visit_f32_eq(&mut self) -> Self::Output {
8970d797f7fSJeffrey Charles         self.context.float_cmp_op(
8980d797f7fSJeffrey Charles             self.masm,
8990d797f7fSJeffrey Charles             OperandSize::S32,
9000d797f7fSJeffrey Charles             &mut |masm: &mut M, dst, src1, src2, size| {
901b93e1bc0SSaúl Cabrera                 masm.float_cmp_with_set(writable!(dst), src1, src2, FloatCmpKind::Eq, size)
9020d797f7fSJeffrey Charles             },
903b93e1bc0SSaúl Cabrera         )
9040d797f7fSJeffrey Charles     }
9050d797f7fSJeffrey Charles 
visit_f64_eq(&mut self) -> Self::Output906b93e1bc0SSaúl Cabrera     fn visit_f64_eq(&mut self) -> Self::Output {
9070d797f7fSJeffrey Charles         self.context.float_cmp_op(
9080d797f7fSJeffrey Charles             self.masm,
9090d797f7fSJeffrey Charles             OperandSize::S64,
9100d797f7fSJeffrey Charles             &mut |masm: &mut M, dst, src1, src2, size| {
911b93e1bc0SSaúl Cabrera                 masm.float_cmp_with_set(writable!(dst), src1, src2, FloatCmpKind::Eq, size)
9120d797f7fSJeffrey Charles             },
913b93e1bc0SSaúl Cabrera         )
9140d797f7fSJeffrey Charles     }
9150d797f7fSJeffrey Charles 
visit_f32_ne(&mut self) -> Self::Output916b93e1bc0SSaúl Cabrera     fn visit_f32_ne(&mut self) -> Self::Output {
9170d797f7fSJeffrey Charles         self.context.float_cmp_op(
9180d797f7fSJeffrey Charles             self.masm,
9190d797f7fSJeffrey Charles             OperandSize::S32,
9200d797f7fSJeffrey Charles             &mut |masm: &mut M, dst, src1, src2, size| {
921b93e1bc0SSaúl Cabrera                 masm.float_cmp_with_set(writable!(dst), src1, src2, FloatCmpKind::Ne, size)
9220d797f7fSJeffrey Charles             },
923b93e1bc0SSaúl Cabrera         )
9240d797f7fSJeffrey Charles     }
9250d797f7fSJeffrey Charles 
visit_f64_ne(&mut self) -> Self::Output926b93e1bc0SSaúl Cabrera     fn visit_f64_ne(&mut self) -> Self::Output {
9270d797f7fSJeffrey Charles         self.context.float_cmp_op(
9280d797f7fSJeffrey Charles             self.masm,
9290d797f7fSJeffrey Charles             OperandSize::S64,
9300d797f7fSJeffrey Charles             &mut |masm: &mut M, dst, src1, src2, size| {
931b93e1bc0SSaúl Cabrera                 masm.float_cmp_with_set(writable!(dst), src1, src2, FloatCmpKind::Ne, size)
9320d797f7fSJeffrey Charles             },
933b93e1bc0SSaúl Cabrera         )
9340d797f7fSJeffrey Charles     }
9350d797f7fSJeffrey Charles 
visit_f32_lt(&mut self) -> Self::Output936b93e1bc0SSaúl Cabrera     fn visit_f32_lt(&mut self) -> Self::Output {
9370d797f7fSJeffrey Charles         self.context.float_cmp_op(
9380d797f7fSJeffrey Charles             self.masm,
9390d797f7fSJeffrey Charles             OperandSize::S32,
9400d797f7fSJeffrey Charles             &mut |masm: &mut M, dst, src1, src2, size| {
941b93e1bc0SSaúl Cabrera                 masm.float_cmp_with_set(writable!(dst), src1, src2, FloatCmpKind::Lt, size)
9420d797f7fSJeffrey Charles             },
943b93e1bc0SSaúl Cabrera         )
9440d797f7fSJeffrey Charles     }
9450d797f7fSJeffrey Charles 
visit_f64_lt(&mut self) -> Self::Output946b93e1bc0SSaúl Cabrera     fn visit_f64_lt(&mut self) -> Self::Output {
9470d797f7fSJeffrey Charles         self.context.float_cmp_op(
9480d797f7fSJeffrey Charles             self.masm,
9490d797f7fSJeffrey Charles             OperandSize::S64,
9500d797f7fSJeffrey Charles             &mut |masm: &mut M, dst, src1, src2, size| {
951b93e1bc0SSaúl Cabrera                 masm.float_cmp_with_set(writable!(dst), src1, src2, FloatCmpKind::Lt, size)
9520d797f7fSJeffrey Charles             },
953b93e1bc0SSaúl Cabrera         )
9540d797f7fSJeffrey Charles     }
9550d797f7fSJeffrey Charles 
visit_f32_gt(&mut self) -> Self::Output956b93e1bc0SSaúl Cabrera     fn visit_f32_gt(&mut self) -> Self::Output {
9570d797f7fSJeffrey Charles         self.context.float_cmp_op(
9580d797f7fSJeffrey Charles             self.masm,
9590d797f7fSJeffrey Charles             OperandSize::S32,
9600d797f7fSJeffrey Charles             &mut |masm: &mut M, dst, src1, src2, size| {
961b93e1bc0SSaúl Cabrera                 masm.float_cmp_with_set(writable!(dst), src1, src2, FloatCmpKind::Gt, size)
9620d797f7fSJeffrey Charles             },
963b93e1bc0SSaúl Cabrera         )
9640d797f7fSJeffrey Charles     }
9650d797f7fSJeffrey Charles 
visit_f64_gt(&mut self) -> Self::Output966b93e1bc0SSaúl Cabrera     fn visit_f64_gt(&mut self) -> Self::Output {
9670d797f7fSJeffrey Charles         self.context.float_cmp_op(
9680d797f7fSJeffrey Charles             self.masm,
9690d797f7fSJeffrey Charles             OperandSize::S64,
9700d797f7fSJeffrey Charles             &mut |masm: &mut M, dst, src1, src2, size| {
971b93e1bc0SSaúl Cabrera                 masm.float_cmp_with_set(writable!(dst), src1, src2, FloatCmpKind::Gt, size)
9720d797f7fSJeffrey Charles             },
973b93e1bc0SSaúl Cabrera         )
9740d797f7fSJeffrey Charles     }
9750d797f7fSJeffrey Charles 
visit_f32_le(&mut self) -> Self::Output976b93e1bc0SSaúl Cabrera     fn visit_f32_le(&mut self) -> Self::Output {
9770d797f7fSJeffrey Charles         self.context.float_cmp_op(
9780d797f7fSJeffrey Charles             self.masm,
9790d797f7fSJeffrey Charles             OperandSize::S32,
9800d797f7fSJeffrey Charles             &mut |masm: &mut M, dst, src1, src2, size| {
981b93e1bc0SSaúl Cabrera                 masm.float_cmp_with_set(writable!(dst), src1, src2, FloatCmpKind::Le, size)
9820d797f7fSJeffrey Charles             },
983b93e1bc0SSaúl Cabrera         )
9840d797f7fSJeffrey Charles     }
9850d797f7fSJeffrey Charles 
visit_f64_le(&mut self) -> Self::Output986b93e1bc0SSaúl Cabrera     fn visit_f64_le(&mut self) -> Self::Output {
9870d797f7fSJeffrey Charles         self.context.float_cmp_op(
9880d797f7fSJeffrey Charles             self.masm,
9890d797f7fSJeffrey Charles             OperandSize::S64,
9900d797f7fSJeffrey Charles             &mut |masm: &mut M, dst, src1, src2, size| {
991b93e1bc0SSaúl Cabrera                 masm.float_cmp_with_set(writable!(dst), src1, src2, FloatCmpKind::Le, size)
9920d797f7fSJeffrey Charles             },
993b93e1bc0SSaúl Cabrera         )
9940d797f7fSJeffrey Charles     }
9950d797f7fSJeffrey Charles 
visit_f32_ge(&mut self) -> Self::Output996b93e1bc0SSaúl Cabrera     fn visit_f32_ge(&mut self) -> Self::Output {
9970d797f7fSJeffrey Charles         self.context.float_cmp_op(
9980d797f7fSJeffrey Charles             self.masm,
9990d797f7fSJeffrey Charles             OperandSize::S32,
10000d797f7fSJeffrey Charles             &mut |masm: &mut M, dst, src1, src2, size| {
1001b93e1bc0SSaúl Cabrera                 masm.float_cmp_with_set(writable!(dst), src1, src2, FloatCmpKind::Ge, size)
10020d797f7fSJeffrey Charles             },
1003b93e1bc0SSaúl Cabrera         )
10040d797f7fSJeffrey Charles     }
10050d797f7fSJeffrey Charles 
visit_f64_ge(&mut self) -> Self::Output1006b93e1bc0SSaúl Cabrera     fn visit_f64_ge(&mut self) -> Self::Output {
10070d797f7fSJeffrey Charles         self.context.float_cmp_op(
10080d797f7fSJeffrey Charles             self.masm,
10090d797f7fSJeffrey Charles             OperandSize::S64,
10100d797f7fSJeffrey Charles             &mut |masm: &mut M, dst, src1, src2, size| {
1011b93e1bc0SSaúl Cabrera                 masm.float_cmp_with_set(writable!(dst), src1, src2, FloatCmpKind::Ge, size)
10120d797f7fSJeffrey Charles             },
1013b93e1bc0SSaúl Cabrera         )
10140d797f7fSJeffrey Charles     }
10150d797f7fSJeffrey Charles 
visit_f32_convert_i32_s(&mut self) -> Self::Output1016b93e1bc0SSaúl Cabrera     fn visit_f32_convert_i32_s(&mut self) -> Self::Output {
1017b546a5f2SJeffrey Charles         self.context
1018496237c2SNick Fitzgerald             .convert_op(self.masm, WasmValType::F32, |masm, dst, src, dst_size| {
1019b93e1bc0SSaúl Cabrera                 masm.signed_convert(writable!(dst), src, OperandSize::S32, dst_size)
1020b93e1bc0SSaúl Cabrera             })
1021b546a5f2SJeffrey Charles     }
1022b546a5f2SJeffrey Charles 
visit_f32_convert_i32_u(&mut self) -> Self::Output1023b93e1bc0SSaúl Cabrera     fn visit_f32_convert_i32_u(&mut self) -> Self::Output {
1024b546a5f2SJeffrey Charles         self.context.convert_op_with_tmp_reg(
1025b546a5f2SJeffrey Charles             self.masm,
1026496237c2SNick Fitzgerald             WasmValType::F32,
1027b546a5f2SJeffrey Charles             RegClass::Int,
1028b546a5f2SJeffrey Charles             |masm, dst, src, tmp_gpr, dst_size| {
1029b93e1bc0SSaúl Cabrera                 masm.unsigned_convert(writable!(dst), src, tmp_gpr, OperandSize::S32, dst_size)
1030b546a5f2SJeffrey Charles             },
1031b93e1bc0SSaúl Cabrera         )
1032b546a5f2SJeffrey Charles     }
1033b546a5f2SJeffrey Charles 
visit_f32_convert_i64_s(&mut self) -> Self::Output1034b93e1bc0SSaúl Cabrera     fn visit_f32_convert_i64_s(&mut self) -> Self::Output {
1035b546a5f2SJeffrey Charles         self.context
1036496237c2SNick Fitzgerald             .convert_op(self.masm, WasmValType::F32, |masm, dst, src, dst_size| {
1037b93e1bc0SSaúl Cabrera                 masm.signed_convert(writable!(dst), src, OperandSize::S64, dst_size)
1038b93e1bc0SSaúl Cabrera             })
1039b546a5f2SJeffrey Charles     }
1040b546a5f2SJeffrey Charles 
visit_f32_convert_i64_u(&mut self) -> Self::Output1041b93e1bc0SSaúl Cabrera     fn visit_f32_convert_i64_u(&mut self) -> Self::Output {
1042b546a5f2SJeffrey Charles         self.context.convert_op_with_tmp_reg(
1043b546a5f2SJeffrey Charles             self.masm,
1044496237c2SNick Fitzgerald             WasmValType::F32,
1045b546a5f2SJeffrey Charles             RegClass::Int,
1046b546a5f2SJeffrey Charles             |masm, dst, src, tmp_gpr, dst_size| {
1047b93e1bc0SSaúl Cabrera                 masm.unsigned_convert(writable!(dst), src, tmp_gpr, OperandSize::S64, dst_size)
1048b546a5f2SJeffrey Charles             },
1049b93e1bc0SSaúl Cabrera         )
1050b546a5f2SJeffrey Charles     }
1051b546a5f2SJeffrey Charles 
visit_f64_convert_i32_s(&mut self) -> Self::Output1052b93e1bc0SSaúl Cabrera     fn visit_f64_convert_i32_s(&mut self) -> Self::Output {
1053b546a5f2SJeffrey Charles         self.context
1054496237c2SNick Fitzgerald             .convert_op(self.masm, WasmValType::F64, |masm, dst, src, dst_size| {
1055b93e1bc0SSaúl Cabrera                 masm.signed_convert(writable!(dst), src, OperandSize::S32, dst_size)
1056b93e1bc0SSaúl Cabrera             })
1057b546a5f2SJeffrey Charles     }
1058b546a5f2SJeffrey Charles 
visit_f64_convert_i32_u(&mut self) -> Self::Output1059b93e1bc0SSaúl Cabrera     fn visit_f64_convert_i32_u(&mut self) -> Self::Output {
1060b546a5f2SJeffrey Charles         self.context.convert_op_with_tmp_reg(
1061b546a5f2SJeffrey Charles             self.masm,
1062496237c2SNick Fitzgerald             WasmValType::F64,
1063b546a5f2SJeffrey Charles             RegClass::Int,
1064b546a5f2SJeffrey Charles             |masm, dst, src, tmp_gpr, dst_size| {
1065b93e1bc0SSaúl Cabrera                 masm.unsigned_convert(writable!(dst), src, tmp_gpr, OperandSize::S32, dst_size)
1066b546a5f2SJeffrey Charles             },
1067b93e1bc0SSaúl Cabrera         )
1068b546a5f2SJeffrey Charles     }
1069b546a5f2SJeffrey Charles 
visit_f64_convert_i64_s(&mut self) -> Self::Output1070b93e1bc0SSaúl Cabrera     fn visit_f64_convert_i64_s(&mut self) -> Self::Output {
1071b546a5f2SJeffrey Charles         self.context
1072496237c2SNick Fitzgerald             .convert_op(self.masm, WasmValType::F64, |masm, dst, src, dst_size| {
1073b93e1bc0SSaúl Cabrera                 masm.signed_convert(writable!(dst), src, OperandSize::S64, dst_size)
1074b93e1bc0SSaúl Cabrera             })
1075b546a5f2SJeffrey Charles     }
1076b546a5f2SJeffrey Charles 
visit_f64_convert_i64_u(&mut self) -> Self::Output1077b93e1bc0SSaúl Cabrera     fn visit_f64_convert_i64_u(&mut self) -> Self::Output {
1078b546a5f2SJeffrey Charles         self.context.convert_op_with_tmp_reg(
1079b546a5f2SJeffrey Charles             self.masm,
1080496237c2SNick Fitzgerald             WasmValType::F64,
1081b546a5f2SJeffrey Charles             RegClass::Int,
1082b546a5f2SJeffrey Charles             |masm, dst, src, tmp_gpr, dst_size| {
1083b93e1bc0SSaúl Cabrera                 masm.unsigned_convert(writable!(dst), src, tmp_gpr, OperandSize::S64, dst_size)
1084b546a5f2SJeffrey Charles             },
1085b93e1bc0SSaúl Cabrera         )
1086b546a5f2SJeffrey Charles     }
1087b546a5f2SJeffrey Charles 
visit_f32_reinterpret_i32(&mut self) -> Self::Output1088b93e1bc0SSaúl Cabrera     fn visit_f32_reinterpret_i32(&mut self) -> Self::Output {
1089b546a5f2SJeffrey Charles         self.context
1090496237c2SNick Fitzgerald             .convert_op(self.masm, WasmValType::F32, |masm, dst, src, size| {
1091703871a2SAlex Crichton                 masm.reinterpret_int_as_float(writable!(dst), src, size)
1092b93e1bc0SSaúl Cabrera             })
1093b546a5f2SJeffrey Charles     }
1094b546a5f2SJeffrey Charles 
visit_f64_reinterpret_i64(&mut self) -> Self::Output1095b93e1bc0SSaúl Cabrera     fn visit_f64_reinterpret_i64(&mut self) -> Self::Output {
1096b546a5f2SJeffrey Charles         self.context
1097496237c2SNick Fitzgerald             .convert_op(self.masm, WasmValType::F64, |masm, dst, src, size| {
1098703871a2SAlex Crichton                 masm.reinterpret_int_as_float(writable!(dst), src, size)
1099b93e1bc0SSaúl Cabrera             })
1100b546a5f2SJeffrey Charles     }
1101b546a5f2SJeffrey Charles 
visit_f32_demote_f64(&mut self) -> Self::Output1102b93e1bc0SSaúl Cabrera     fn visit_f32_demote_f64(&mut self) -> Self::Output {
1103cb195e54Sad hoc         self.context.unop(self.masm, |masm, reg| {
1104b93e1bc0SSaúl Cabrera             masm.demote(writable!(reg), reg)?;
1105b93e1bc0SSaúl Cabrera             Ok(TypedReg::f32(reg))
1106b93e1bc0SSaúl Cabrera         })
1107b546a5f2SJeffrey Charles     }
1108b546a5f2SJeffrey Charles 
visit_f64_promote_f32(&mut self) -> Self::Output1109b93e1bc0SSaúl Cabrera     fn visit_f64_promote_f32(&mut self) -> Self::Output {
1110cb195e54Sad hoc         self.context.unop(self.masm, |masm, reg| {
1111b93e1bc0SSaúl Cabrera             masm.promote(writable!(reg), reg)?;
1112b93e1bc0SSaúl Cabrera             Ok(TypedReg::f64(reg))
1113b93e1bc0SSaúl Cabrera         })
1114b546a5f2SJeffrey Charles     }
1115b546a5f2SJeffrey Charles 
visit_i32_add(&mut self) -> Self::Output1116b93e1bc0SSaúl Cabrera     fn visit_i32_add(&mut self) -> Self::Output {
111781cd9983SNick Fitzgerald         self.context.i32_binop(self.masm, |masm, dst, src, size| {
1118b93e1bc0SSaúl Cabrera             masm.add(writable!(dst), dst, src, size)?;
1119b93e1bc0SSaúl Cabrera             Ok(TypedReg::i32(dst))
1120b93e1bc0SSaúl Cabrera         })
11217c5c7e4bSSaúl Cabrera     }
11227c5c7e4bSSaúl Cabrera 
visit_i64_add(&mut self) -> Self::Output1123b93e1bc0SSaúl Cabrera     fn visit_i64_add(&mut self) -> Self::Output {
112481cd9983SNick Fitzgerald         self.context.i64_binop(self.masm, |masm, dst, src, size| {
1125b93e1bc0SSaúl Cabrera             masm.add(writable!(dst), dst, src, size)?;
1126b93e1bc0SSaúl Cabrera             Ok(TypedReg::i64(dst))
1127b93e1bc0SSaúl Cabrera         })
11287c5c7e4bSSaúl Cabrera     }
11297c5c7e4bSSaúl Cabrera 
visit_i32_sub(&mut self) -> Self::Output1130b93e1bc0SSaúl Cabrera     fn visit_i32_sub(&mut self) -> Self::Output {
113181cd9983SNick Fitzgerald         self.context.i32_binop(self.masm, |masm, dst, src, size| {
1132b93e1bc0SSaúl Cabrera             masm.sub(writable!(dst), dst, src, size)?;
1133b93e1bc0SSaúl Cabrera             Ok(TypedReg::i32(dst))
1134b93e1bc0SSaúl Cabrera         })
11357c5c7e4bSSaúl Cabrera     }
11367c5c7e4bSSaúl Cabrera 
visit_i64_sub(&mut self) -> Self::Output1137b93e1bc0SSaúl Cabrera     fn visit_i64_sub(&mut self) -> Self::Output {
113881cd9983SNick Fitzgerald         self.context.i64_binop(self.masm, |masm, dst, src, size| {
1139b93e1bc0SSaúl Cabrera             masm.sub(writable!(dst), dst, src, size)?;
1140b93e1bc0SSaúl Cabrera             Ok(TypedReg::i64(dst))
1141b93e1bc0SSaúl Cabrera         })
1142835abbcdSSaúl Cabrera     }
1143835abbcdSSaúl Cabrera 
visit_i32_mul(&mut self) -> Self::Output1144b93e1bc0SSaúl Cabrera     fn visit_i32_mul(&mut self) -> Self::Output {
114581cd9983SNick Fitzgerald         self.context.i32_binop(self.masm, |masm, dst, src, size| {
1146b93e1bc0SSaúl Cabrera             masm.mul(writable!(dst), dst, src, size)?;
1147b93e1bc0SSaúl Cabrera             Ok(TypedReg::i32(dst))
1148b93e1bc0SSaúl Cabrera         })
114991c8114fSSaúl Cabrera     }
115091c8114fSSaúl Cabrera 
visit_i64_mul(&mut self) -> Self::Output1151b93e1bc0SSaúl Cabrera     fn visit_i64_mul(&mut self) -> Self::Output {
115281cd9983SNick Fitzgerald         self.context.i64_binop(self.masm, |masm, dst, src, size| {
1153b93e1bc0SSaúl Cabrera             masm.mul(writable!(dst), dst, src, size)?;
1154b93e1bc0SSaúl Cabrera             Ok(TypedReg::i64(dst))
1155b93e1bc0SSaúl Cabrera         })
115691c8114fSSaúl Cabrera     }
115791c8114fSSaúl Cabrera 
visit_i32_div_s(&mut self) -> Self::Output1158b93e1bc0SSaúl Cabrera     fn visit_i32_div_s(&mut self) -> Self::Output {
11597ec92512SSaúl Cabrera         use DivKind::*;
11607ec92512SSaúl Cabrera         use OperandSize::*;
11617ec92512SSaúl Cabrera 
1162b93e1bc0SSaúl Cabrera         self.masm.div(&mut self.context, Signed, S32)
11637ec92512SSaúl Cabrera     }
11647ec92512SSaúl Cabrera 
visit_i32_div_u(&mut self) -> Self::Output1165b93e1bc0SSaúl Cabrera     fn visit_i32_div_u(&mut self) -> Self::Output {
11667ec92512SSaúl Cabrera         use DivKind::*;
11677ec92512SSaúl Cabrera         use OperandSize::*;
11687ec92512SSaúl Cabrera 
1169b93e1bc0SSaúl Cabrera         self.masm.div(&mut self.context, Unsigned, S32)
11707ec92512SSaúl Cabrera     }
11717ec92512SSaúl Cabrera 
visit_i64_div_s(&mut self) -> Self::Output1172b93e1bc0SSaúl Cabrera     fn visit_i64_div_s(&mut self) -> Self::Output {
11737ec92512SSaúl Cabrera         use DivKind::*;
11747ec92512SSaúl Cabrera         use OperandSize::*;
11757ec92512SSaúl Cabrera 
1176b93e1bc0SSaúl Cabrera         self.masm.div(&mut self.context, Signed, S64)
11777ec92512SSaúl Cabrera     }
11787ec92512SSaúl Cabrera 
visit_i64_div_u(&mut self) -> Self::Output1179b93e1bc0SSaúl Cabrera     fn visit_i64_div_u(&mut self) -> Self::Output {
11807ec92512SSaúl Cabrera         use DivKind::*;
11817ec92512SSaúl Cabrera         use OperandSize::*;
11827ec92512SSaúl Cabrera 
1183b93e1bc0SSaúl Cabrera         self.masm.div(&mut self.context, Unsigned, S64)
11847ec92512SSaúl Cabrera     }
11857ec92512SSaúl Cabrera 
visit_i32_rem_s(&mut self) -> Self::Output1186b93e1bc0SSaúl Cabrera     fn visit_i32_rem_s(&mut self) -> Self::Output {
11874d954f5cSSaúl Cabrera         use OperandSize::*;
11884d954f5cSSaúl Cabrera         use RemKind::*;
11894d954f5cSSaúl Cabrera 
1190b93e1bc0SSaúl Cabrera         self.masm.rem(&mut self.context, Signed, S32)
11914d954f5cSSaúl Cabrera     }
11924d954f5cSSaúl Cabrera 
visit_i32_rem_u(&mut self) -> Self::Output1193b93e1bc0SSaúl Cabrera     fn visit_i32_rem_u(&mut self) -> Self::Output {
11944d954f5cSSaúl Cabrera         use OperandSize::*;
11954d954f5cSSaúl Cabrera         use RemKind::*;
11964d954f5cSSaúl Cabrera 
1197b93e1bc0SSaúl Cabrera         self.masm.rem(&mut self.context, Unsigned, S32)
11984d954f5cSSaúl Cabrera     }
11994d954f5cSSaúl Cabrera 
visit_i64_rem_s(&mut self) -> Self::Output1200b93e1bc0SSaúl Cabrera     fn visit_i64_rem_s(&mut self) -> Self::Output {
12014d954f5cSSaúl Cabrera         use OperandSize::*;
12024d954f5cSSaúl Cabrera         use RemKind::*;
12034d954f5cSSaúl Cabrera 
1204b93e1bc0SSaúl Cabrera         self.masm.rem(&mut self.context, Signed, S64)
12054d954f5cSSaúl Cabrera     }
12064d954f5cSSaúl Cabrera 
visit_i64_rem_u(&mut self) -> Self::Output1207b93e1bc0SSaúl Cabrera     fn visit_i64_rem_u(&mut self) -> Self::Output {
12084d954f5cSSaúl Cabrera         use OperandSize::*;
12094d954f5cSSaúl Cabrera         use RemKind::*;
12104d954f5cSSaúl Cabrera 
1211b93e1bc0SSaúl Cabrera         self.masm.rem(&mut self.context, Unsigned, S64)
12124d954f5cSSaúl Cabrera     }
12134d954f5cSSaúl Cabrera 
visit_i32_eq(&mut self) -> Self::Output1214b93e1bc0SSaúl Cabrera     fn visit_i32_eq(&mut self) -> Self::Output {
1215b93e1bc0SSaúl Cabrera         self.cmp_i32s(IntCmpKind::Eq)
12169cc62e7fSJeffrey Charles     }
12179cc62e7fSJeffrey Charles 
visit_i64_eq(&mut self) -> Self::Output1218b93e1bc0SSaúl Cabrera     fn visit_i64_eq(&mut self) -> Self::Output {
1219b93e1bc0SSaúl Cabrera         self.cmp_i64s(IntCmpKind::Eq)
12209cc62e7fSJeffrey Charles     }
12219cc62e7fSJeffrey Charles 
visit_i32_ne(&mut self) -> Self::Output1222b93e1bc0SSaúl Cabrera     fn visit_i32_ne(&mut self) -> Self::Output {
1223b93e1bc0SSaúl Cabrera         self.cmp_i32s(IntCmpKind::Ne)
12249cc62e7fSJeffrey Charles     }
12259cc62e7fSJeffrey Charles 
visit_i64_ne(&mut self) -> Self::Output1226b93e1bc0SSaúl Cabrera     fn visit_i64_ne(&mut self) -> Self::Output {
1227b93e1bc0SSaúl Cabrera         self.cmp_i64s(IntCmpKind::Ne)
12289cc62e7fSJeffrey Charles     }
12299cc62e7fSJeffrey Charles 
visit_i32_lt_s(&mut self) -> Self::Output1230b93e1bc0SSaúl Cabrera     fn visit_i32_lt_s(&mut self) -> Self::Output {
1231b93e1bc0SSaúl Cabrera         self.cmp_i32s(IntCmpKind::LtS)
12329cc62e7fSJeffrey Charles     }
12339cc62e7fSJeffrey Charles 
visit_i64_lt_s(&mut self) -> Self::Output1234b93e1bc0SSaúl Cabrera     fn visit_i64_lt_s(&mut self) -> Self::Output {
1235b93e1bc0SSaúl Cabrera         self.cmp_i64s(IntCmpKind::LtS)
12369cc62e7fSJeffrey Charles     }
12379cc62e7fSJeffrey Charles 
visit_i32_lt_u(&mut self) -> Self::Output1238b93e1bc0SSaúl Cabrera     fn visit_i32_lt_u(&mut self) -> Self::Output {
1239b93e1bc0SSaúl Cabrera         self.cmp_i32s(IntCmpKind::LtU)
12409cc62e7fSJeffrey Charles     }
12419cc62e7fSJeffrey Charles 
visit_i64_lt_u(&mut self) -> Self::Output1242b93e1bc0SSaúl Cabrera     fn visit_i64_lt_u(&mut self) -> Self::Output {
1243b93e1bc0SSaúl Cabrera         self.cmp_i64s(IntCmpKind::LtU)
12449cc62e7fSJeffrey Charles     }
12459cc62e7fSJeffrey Charles 
visit_i32_le_s(&mut self) -> Self::Output1246b93e1bc0SSaúl Cabrera     fn visit_i32_le_s(&mut self) -> Self::Output {
1247b93e1bc0SSaúl Cabrera         self.cmp_i32s(IntCmpKind::LeS)
12489cc62e7fSJeffrey Charles     }
12499cc62e7fSJeffrey Charles 
visit_i64_le_s(&mut self) -> Self::Output1250b93e1bc0SSaúl Cabrera     fn visit_i64_le_s(&mut self) -> Self::Output {
1251b93e1bc0SSaúl Cabrera         self.cmp_i64s(IntCmpKind::LeS)
12529cc62e7fSJeffrey Charles     }
12539cc62e7fSJeffrey Charles 
visit_i32_le_u(&mut self) -> Self::Output1254b93e1bc0SSaúl Cabrera     fn visit_i32_le_u(&mut self) -> Self::Output {
1255b93e1bc0SSaúl Cabrera         self.cmp_i32s(IntCmpKind::LeU)
12569cc62e7fSJeffrey Charles     }
12579cc62e7fSJeffrey Charles 
visit_i64_le_u(&mut self) -> Self::Output1258b93e1bc0SSaúl Cabrera     fn visit_i64_le_u(&mut self) -> Self::Output {
1259b93e1bc0SSaúl Cabrera         self.cmp_i64s(IntCmpKind::LeU)
12609cc62e7fSJeffrey Charles     }
12619cc62e7fSJeffrey Charles 
visit_i32_gt_s(&mut self) -> Self::Output1262b93e1bc0SSaúl Cabrera     fn visit_i32_gt_s(&mut self) -> Self::Output {
1263b93e1bc0SSaúl Cabrera         self.cmp_i32s(IntCmpKind::GtS)
12649cc62e7fSJeffrey Charles     }
12659cc62e7fSJeffrey Charles 
visit_i64_gt_s(&mut self) -> Self::Output1266b93e1bc0SSaúl Cabrera     fn visit_i64_gt_s(&mut self) -> Self::Output {
1267b93e1bc0SSaúl Cabrera         self.cmp_i64s(IntCmpKind::GtS)
12689cc62e7fSJeffrey Charles     }
12699cc62e7fSJeffrey Charles 
visit_i32_gt_u(&mut self) -> Self::Output1270b93e1bc0SSaúl Cabrera     fn visit_i32_gt_u(&mut self) -> Self::Output {
1271b93e1bc0SSaúl Cabrera         self.cmp_i32s(IntCmpKind::GtU)
12729cc62e7fSJeffrey Charles     }
12739cc62e7fSJeffrey Charles 
visit_i64_gt_u(&mut self) -> Self::Output1274b93e1bc0SSaúl Cabrera     fn visit_i64_gt_u(&mut self) -> Self::Output {
1275b93e1bc0SSaúl Cabrera         self.cmp_i64s(IntCmpKind::GtU)
12769cc62e7fSJeffrey Charles     }
12779cc62e7fSJeffrey Charles 
visit_i32_ge_s(&mut self) -> Self::Output1278b93e1bc0SSaúl Cabrera     fn visit_i32_ge_s(&mut self) -> Self::Output {
1279b93e1bc0SSaúl Cabrera         self.cmp_i32s(IntCmpKind::GeS)
12809cc62e7fSJeffrey Charles     }
12819cc62e7fSJeffrey Charles 
visit_i64_ge_s(&mut self) -> Self::Output1282b93e1bc0SSaúl Cabrera     fn visit_i64_ge_s(&mut self) -> Self::Output {
1283b93e1bc0SSaúl Cabrera         self.cmp_i64s(IntCmpKind::GeS)
12849cc62e7fSJeffrey Charles     }
12859cc62e7fSJeffrey Charles 
visit_i32_ge_u(&mut self) -> Self::Output1286b93e1bc0SSaúl Cabrera     fn visit_i32_ge_u(&mut self) -> Self::Output {
1287b93e1bc0SSaúl Cabrera         self.cmp_i32s(IntCmpKind::GeU)
12889cc62e7fSJeffrey Charles     }
12899cc62e7fSJeffrey Charles 
visit_i64_ge_u(&mut self) -> Self::Output1290b93e1bc0SSaúl Cabrera     fn visit_i64_ge_u(&mut self) -> Self::Output {
1291b93e1bc0SSaúl Cabrera         self.cmp_i64s(IntCmpKind::GeU)
12929cc62e7fSJeffrey Charles     }
12939cc62e7fSJeffrey Charles 
visit_i32_eqz(&mut self) -> Self::Output1294b93e1bc0SSaúl Cabrera     fn visit_i32_eqz(&mut self) -> Self::Output {
12950893f7c7SJeffrey Charles         use OperandSize::*;
12960893f7c7SJeffrey Charles 
1297cb195e54Sad hoc         self.context.unop(self.masm, |masm, reg| {
1298703871a2SAlex Crichton             masm.cmp_with_set(writable!(reg), RegImm::i32(0), IntCmpKind::Eq, S32)?;
1299b93e1bc0SSaúl Cabrera             Ok(TypedReg::i32(reg))
1300b93e1bc0SSaúl Cabrera         })
13010893f7c7SJeffrey Charles     }
13020893f7c7SJeffrey Charles 
visit_i64_eqz(&mut self) -> Self::Output1303b93e1bc0SSaúl Cabrera     fn visit_i64_eqz(&mut self) -> Self::Output {
13040893f7c7SJeffrey Charles         use OperandSize::*;
13050893f7c7SJeffrey Charles 
1306cb195e54Sad hoc         self.context.unop(self.masm, |masm, reg| {
1307703871a2SAlex Crichton             masm.cmp_with_set(writable!(reg), RegImm::i64(0), IntCmpKind::Eq, S64)?;
1308b93e1bc0SSaúl Cabrera             Ok(TypedReg::i32(reg)) // Return value for `i64.eqz` is an `i32`.
1309b93e1bc0SSaúl Cabrera         })
1310c26a3cf6SJeffrey Charles     }
1311c26a3cf6SJeffrey Charles 
visit_i32_clz(&mut self) -> Self::Output1312b93e1bc0SSaúl Cabrera     fn visit_i32_clz(&mut self) -> Self::Output {
1313c26a3cf6SJeffrey Charles         use OperandSize::*;
1314c26a3cf6SJeffrey Charles 
1315cb195e54Sad hoc         self.context.unop(self.masm, |masm, reg| {
1316529b6adfSJeffrey Charles             masm.clz(writable!(reg), reg, S32)?;
1317b93e1bc0SSaúl Cabrera             Ok(TypedReg::i32(reg))
1318b93e1bc0SSaúl Cabrera         })
1319c26a3cf6SJeffrey Charles     }
1320c26a3cf6SJeffrey Charles 
visit_i64_clz(&mut self) -> Self::Output1321b93e1bc0SSaúl Cabrera     fn visit_i64_clz(&mut self) -> Self::Output {
1322c26a3cf6SJeffrey Charles         use OperandSize::*;
1323c26a3cf6SJeffrey Charles 
1324cb195e54Sad hoc         self.context.unop(self.masm, |masm, reg| {
1325529b6adfSJeffrey Charles             masm.clz(writable!(reg), reg, S64)?;
1326b93e1bc0SSaúl Cabrera             Ok(TypedReg::i64(reg))
1327b93e1bc0SSaúl Cabrera         })
1328c26a3cf6SJeffrey Charles     }
1329c26a3cf6SJeffrey Charles 
visit_i32_ctz(&mut self) -> Self::Output1330b93e1bc0SSaúl Cabrera     fn visit_i32_ctz(&mut self) -> Self::Output {
1331c26a3cf6SJeffrey Charles         use OperandSize::*;
1332c26a3cf6SJeffrey Charles 
1333cb195e54Sad hoc         self.context.unop(self.masm, |masm, reg| {
1334529b6adfSJeffrey Charles             masm.ctz(writable!(reg), reg, S32)?;
1335b93e1bc0SSaúl Cabrera             Ok(TypedReg::i32(reg))
1336b93e1bc0SSaúl Cabrera         })
1337c26a3cf6SJeffrey Charles     }
1338c26a3cf6SJeffrey Charles 
visit_i64_ctz(&mut self) -> Self::Output1339b93e1bc0SSaúl Cabrera     fn visit_i64_ctz(&mut self) -> Self::Output {
1340c26a3cf6SJeffrey Charles         use OperandSize::*;
1341c26a3cf6SJeffrey Charles 
1342cb195e54Sad hoc         self.context.unop(self.masm, |masm, reg| {
1343529b6adfSJeffrey Charles             masm.ctz(writable!(reg), reg, S64)?;
1344b93e1bc0SSaúl Cabrera             Ok(TypedReg::i64(reg))
1345b93e1bc0SSaúl Cabrera         })
13460893f7c7SJeffrey Charles     }
13470893f7c7SJeffrey Charles 
visit_i32_and(&mut self) -> Self::Output1348b93e1bc0SSaúl Cabrera     fn visit_i32_and(&mut self) -> Self::Output {
1349f5fafba8SJeffrey Charles         self.context.i32_binop(self.masm, |masm, dst, src, size| {
1350b93e1bc0SSaúl Cabrera             masm.and(writable!(dst), dst, src, size)?;
1351b93e1bc0SSaúl Cabrera             Ok(TypedReg::i32(dst))
1352b93e1bc0SSaúl Cabrera         })
1353f5fafba8SJeffrey Charles     }
1354f5fafba8SJeffrey Charles 
visit_i64_and(&mut self) -> Self::Output1355b93e1bc0SSaúl Cabrera     fn visit_i64_and(&mut self) -> Self::Output {
1356f5fafba8SJeffrey Charles         self.context.i64_binop(self.masm, |masm, dst, src, size| {
1357b93e1bc0SSaúl Cabrera             masm.and(writable!(dst), dst, src, size)?;
1358b93e1bc0SSaúl Cabrera             Ok(TypedReg::i64(dst))
1359b93e1bc0SSaúl Cabrera         })
1360f5fafba8SJeffrey Charles     }
1361f5fafba8SJeffrey Charles 
visit_i32_or(&mut self) -> Self::Output1362b93e1bc0SSaúl Cabrera     fn visit_i32_or(&mut self) -> Self::Output {
1363f5fafba8SJeffrey Charles         self.context.i32_binop(self.masm, |masm, dst, src, size| {
1364b93e1bc0SSaúl Cabrera             masm.or(writable!(dst), dst, src, size)?;
1365b93e1bc0SSaúl Cabrera             Ok(TypedReg::i32(dst))
1366b93e1bc0SSaúl Cabrera         })
1367f5fafba8SJeffrey Charles     }
1368f5fafba8SJeffrey Charles 
visit_i64_or(&mut self) -> Self::Output1369b93e1bc0SSaúl Cabrera     fn visit_i64_or(&mut self) -> Self::Output {
1370f5fafba8SJeffrey Charles         self.context.i64_binop(self.masm, |masm, dst, src, size| {
1371b93e1bc0SSaúl Cabrera             masm.or(writable!(dst), dst, src, size)?;
1372b93e1bc0SSaúl Cabrera             Ok(TypedReg::i64(dst))
1373b93e1bc0SSaúl Cabrera         })
1374f5fafba8SJeffrey Charles     }
1375f5fafba8SJeffrey Charles 
visit_i32_xor(&mut self) -> Self::Output1376b93e1bc0SSaúl Cabrera     fn visit_i32_xor(&mut self) -> Self::Output {
1377f5fafba8SJeffrey Charles         self.context.i32_binop(self.masm, |masm, dst, src, size| {
1378b93e1bc0SSaúl Cabrera             masm.xor(writable!(dst), dst, src, size)?;
1379b93e1bc0SSaúl Cabrera             Ok(TypedReg::i32(dst))
1380b93e1bc0SSaúl Cabrera         })
1381f5fafba8SJeffrey Charles     }
1382f5fafba8SJeffrey Charles 
visit_i64_xor(&mut self) -> Self::Output1383b93e1bc0SSaúl Cabrera     fn visit_i64_xor(&mut self) -> Self::Output {
1384f5fafba8SJeffrey Charles         self.context.i64_binop(self.masm, |masm, dst, src, size| {
1385b93e1bc0SSaúl Cabrera             masm.xor(writable!(dst), dst, src, size)?;
1386b93e1bc0SSaúl Cabrera             Ok(TypedReg::i64(dst))
1387b93e1bc0SSaúl Cabrera         })
1388f5fafba8SJeffrey Charles     }
1389f5fafba8SJeffrey Charles 
visit_i32_shl(&mut self) -> Self::Output1390b93e1bc0SSaúl Cabrera     fn visit_i32_shl(&mut self) -> Self::Output {
1391f5fafba8SJeffrey Charles         use ShiftKind::*;
1392f5fafba8SJeffrey Charles 
1393b93e1bc0SSaúl Cabrera         self.context.i32_shift(self.masm, Shl)
1394f5fafba8SJeffrey Charles     }
1395f5fafba8SJeffrey Charles 
visit_i64_shl(&mut self) -> Self::Output1396b93e1bc0SSaúl Cabrera     fn visit_i64_shl(&mut self) -> Self::Output {
1397f5fafba8SJeffrey Charles         use ShiftKind::*;
1398f5fafba8SJeffrey Charles 
1399b93e1bc0SSaúl Cabrera         self.context.i64_shift(self.masm, Shl)
1400f5fafba8SJeffrey Charles     }
1401f5fafba8SJeffrey Charles 
visit_i32_shr_s(&mut self) -> Self::Output1402b93e1bc0SSaúl Cabrera     fn visit_i32_shr_s(&mut self) -> Self::Output {
1403f5fafba8SJeffrey Charles         use ShiftKind::*;
1404f5fafba8SJeffrey Charles 
1405b93e1bc0SSaúl Cabrera         self.context.i32_shift(self.masm, ShrS)
1406f5fafba8SJeffrey Charles     }
1407f5fafba8SJeffrey Charles 
visit_i64_shr_s(&mut self) -> Self::Output1408b93e1bc0SSaúl Cabrera     fn visit_i64_shr_s(&mut self) -> Self::Output {
1409f5fafba8SJeffrey Charles         use ShiftKind::*;
1410f5fafba8SJeffrey Charles 
1411b93e1bc0SSaúl Cabrera         self.context.i64_shift(self.masm, ShrS)
1412f5fafba8SJeffrey Charles     }
1413f5fafba8SJeffrey Charles 
visit_i32_shr_u(&mut self) -> Self::Output1414b93e1bc0SSaúl Cabrera     fn visit_i32_shr_u(&mut self) -> Self::Output {
1415f5fafba8SJeffrey Charles         use ShiftKind::*;
1416f5fafba8SJeffrey Charles 
1417b93e1bc0SSaúl Cabrera         self.context.i32_shift(self.masm, ShrU)
1418f5fafba8SJeffrey Charles     }
1419f5fafba8SJeffrey Charles 
visit_i64_shr_u(&mut self) -> Self::Output1420b93e1bc0SSaúl Cabrera     fn visit_i64_shr_u(&mut self) -> Self::Output {
1421f5fafba8SJeffrey Charles         use ShiftKind::*;
1422f5fafba8SJeffrey Charles 
1423b93e1bc0SSaúl Cabrera         self.context.i64_shift(self.masm, ShrU)
1424f5fafba8SJeffrey Charles     }
1425f5fafba8SJeffrey Charles 
visit_i32_rotl(&mut self) -> Self::Output1426b93e1bc0SSaúl Cabrera     fn visit_i32_rotl(&mut self) -> Self::Output {
1427f5fafba8SJeffrey Charles         use ShiftKind::*;
1428f5fafba8SJeffrey Charles 
1429b93e1bc0SSaúl Cabrera         self.context.i32_shift(self.masm, Rotl)
1430f5fafba8SJeffrey Charles     }
1431f5fafba8SJeffrey Charles 
visit_i64_rotl(&mut self) -> Self::Output1432b93e1bc0SSaúl Cabrera     fn visit_i64_rotl(&mut self) -> Self::Output {
1433f5fafba8SJeffrey Charles         use ShiftKind::*;
1434f5fafba8SJeffrey Charles 
1435b93e1bc0SSaúl Cabrera         self.context.i64_shift(self.masm, Rotl)
1436f5fafba8SJeffrey Charles     }
1437f5fafba8SJeffrey Charles 
visit_i32_rotr(&mut self) -> Self::Output1438b93e1bc0SSaúl Cabrera     fn visit_i32_rotr(&mut self) -> Self::Output {
1439f5fafba8SJeffrey Charles         use ShiftKind::*;
1440f5fafba8SJeffrey Charles 
1441b93e1bc0SSaúl Cabrera         self.context.i32_shift(self.masm, Rotr)
1442f5fafba8SJeffrey Charles     }
1443f5fafba8SJeffrey Charles 
visit_i64_rotr(&mut self) -> Self::Output1444b93e1bc0SSaúl Cabrera     fn visit_i64_rotr(&mut self) -> Self::Output {
1445f5fafba8SJeffrey Charles         use ShiftKind::*;
1446f5fafba8SJeffrey Charles 
1447b93e1bc0SSaúl Cabrera         self.context.i64_shift(self.masm, Rotr)
1448f5fafba8SJeffrey Charles     }
1449f5fafba8SJeffrey Charles 
visit_end(&mut self) -> Self::Output1450b93e1bc0SSaúl Cabrera     fn visit_end(&mut self) -> Self::Output {
14511bc4ff3fSSaúl Cabrera         if !self.context.reachable {
1452b93e1bc0SSaúl Cabrera             self.handle_unreachable_end()
14531bc4ff3fSSaúl Cabrera         } else {
1454b93e1bc0SSaúl Cabrera             let mut control = self.pop_control_frame()?;
1455b93e1bc0SSaúl Cabrera             control.emit_end(self.masm, &mut self.context)
1456a50c4972SSaúl Cabrera         }
1457a50c4972SSaúl Cabrera     }
14583b966855SAlex Crichton 
visit_i32_popcnt(&mut self) -> Self::Output1459b93e1bc0SSaúl Cabrera     fn visit_i32_popcnt(&mut self) -> Self::Output {
146075134640SRainy Sinclair         use OperandSize::*;
1461b93e1bc0SSaúl Cabrera         self.masm.popcnt(&mut self.context, S32)
146275134640SRainy Sinclair     }
146375134640SRainy Sinclair 
visit_i64_popcnt(&mut self) -> Self::Output1464b93e1bc0SSaúl Cabrera     fn visit_i64_popcnt(&mut self) -> Self::Output {
146575134640SRainy Sinclair         use OperandSize::*;
146675134640SRainy Sinclair 
1467b93e1bc0SSaúl Cabrera         self.masm.popcnt(&mut self.context, S64)
146875134640SRainy Sinclair     }
146975134640SRainy Sinclair 
visit_i32_wrap_i64(&mut self) -> Self::Output1470b93e1bc0SSaúl Cabrera     fn visit_i32_wrap_i64(&mut self) -> Self::Output {
1471cb195e54Sad hoc         self.context.unop(self.masm, |masm, reg| {
1472b93e1bc0SSaúl Cabrera             masm.wrap(writable!(reg), reg)?;
1473b93e1bc0SSaúl Cabrera             Ok(TypedReg::i32(reg))
1474b93e1bc0SSaúl Cabrera         })
14753b055d47SJeffrey Charles     }
14763b055d47SJeffrey Charles 
visit_i64_extend_i32_s(&mut self) -> Self::Output1477b93e1bc0SSaúl Cabrera     fn visit_i64_extend_i32_s(&mut self) -> Self::Output {
1478cb195e54Sad hoc         self.context.unop(self.masm, |masm, reg| {
1479362568b4Sad hoc             masm.extend(writable!(reg), reg, Extend::<Signed>::I64Extend32.into())?;
1480b93e1bc0SSaúl Cabrera             Ok(TypedReg::i64(reg))
1481b93e1bc0SSaúl Cabrera         })
14823b055d47SJeffrey Charles     }
14833b055d47SJeffrey Charles 
visit_i64_extend_i32_u(&mut self) -> Self::Output1484b93e1bc0SSaúl Cabrera     fn visit_i64_extend_i32_u(&mut self) -> Self::Output {
1485cb195e54Sad hoc         self.context.unop(self.masm, |masm, reg| {
1486362568b4Sad hoc             masm.extend(writable!(reg), reg, Extend::<Zero>::I64Extend32.into())?;
1487b93e1bc0SSaúl Cabrera             Ok(TypedReg::i64(reg))
1488b93e1bc0SSaúl Cabrera         })
14893b055d47SJeffrey Charles     }
14903b055d47SJeffrey Charles 
visit_i32_extend8_s(&mut self) -> Self::Output1491b93e1bc0SSaúl Cabrera     fn visit_i32_extend8_s(&mut self) -> Self::Output {
1492cb195e54Sad hoc         self.context.unop(self.masm, |masm, reg| {
1493362568b4Sad hoc             masm.extend(writable!(reg), reg, Extend::<Signed>::I32Extend8.into())?;
1494b93e1bc0SSaúl Cabrera             Ok(TypedReg::i32(reg))
1495b93e1bc0SSaúl Cabrera         })
14963b055d47SJeffrey Charles     }
14973b055d47SJeffrey Charles 
visit_i32_extend16_s(&mut self) -> Self::Output1498b93e1bc0SSaúl Cabrera     fn visit_i32_extend16_s(&mut self) -> Self::Output {
1499cb195e54Sad hoc         self.context.unop(self.masm, |masm, reg| {
1500362568b4Sad hoc             masm.extend(writable!(reg), reg, Extend::<Signed>::I32Extend16.into())?;
1501b93e1bc0SSaúl Cabrera             Ok(TypedReg::i32(reg))
1502b93e1bc0SSaúl Cabrera         })
15033b055d47SJeffrey Charles     }
15043b055d47SJeffrey Charles 
visit_i64_extend8_s(&mut self) -> Self::Output1505b93e1bc0SSaúl Cabrera     fn visit_i64_extend8_s(&mut self) -> Self::Output {
1506cb195e54Sad hoc         self.context.unop(self.masm, |masm, reg| {
1507362568b4Sad hoc             masm.extend(writable!(reg), reg, Extend::<Signed>::I64Extend8.into())?;
1508b93e1bc0SSaúl Cabrera             Ok(TypedReg::i64(reg))
1509b93e1bc0SSaúl Cabrera         })
15103b055d47SJeffrey Charles     }
15113b055d47SJeffrey Charles 
visit_i64_extend16_s(&mut self) -> Self::Output1512b93e1bc0SSaúl Cabrera     fn visit_i64_extend16_s(&mut self) -> Self::Output {
1513cb195e54Sad hoc         self.context.unop(self.masm, |masm, reg| {
1514362568b4Sad hoc             masm.extend(writable!(reg), reg, Extend::<Signed>::I64Extend16.into())?;
1515b93e1bc0SSaúl Cabrera             Ok(TypedReg::i64(reg))
1516b93e1bc0SSaúl Cabrera         })
15173b055d47SJeffrey Charles     }
15183b055d47SJeffrey Charles 
visit_i64_extend32_s(&mut self) -> Self::Output1519b93e1bc0SSaúl Cabrera     fn visit_i64_extend32_s(&mut self) -> Self::Output {
1520cb195e54Sad hoc         self.context.unop(self.masm, |masm, reg| {
1521362568b4Sad hoc             masm.extend(writable!(reg), reg, Extend::<Signed>::I64Extend32.into())?;
1522b93e1bc0SSaúl Cabrera             Ok(TypedReg::i64(reg))
1523b93e1bc0SSaúl Cabrera         })
15243b055d47SJeffrey Charles     }
15253b055d47SJeffrey Charles 
visit_i32_trunc_f32_s(&mut self) -> Self::Output1526b93e1bc0SSaúl Cabrera     fn visit_i32_trunc_f32_s(&mut self) -> Self::Output {
1527b546a5f2SJeffrey Charles         use OperandSize::*;
1528b546a5f2SJeffrey Charles 
1529b546a5f2SJeffrey Charles         self.context
1530496237c2SNick Fitzgerald             .convert_op(self.masm, WasmValType::I32, |masm, dst, src, dst_size| {
1531b93e1bc0SSaúl Cabrera                 masm.signed_truncate(writable!(dst), src, S32, dst_size, TruncKind::Unchecked)
1532b93e1bc0SSaúl Cabrera             })
1533b546a5f2SJeffrey Charles     }
1534b546a5f2SJeffrey Charles 
visit_i32_trunc_f32_u(&mut self) -> Self::Output1535b93e1bc0SSaúl Cabrera     fn visit_i32_trunc_f32_u(&mut self) -> Self::Output {
1536b546a5f2SJeffrey Charles         use OperandSize::*;
1537b546a5f2SJeffrey Charles 
1538f309bfddSad hoc         self.masm
1539f309bfddSad hoc             .unsigned_truncate(&mut self.context, S32, S32, TruncKind::Unchecked)
1540b546a5f2SJeffrey Charles     }
1541b546a5f2SJeffrey Charles 
visit_i32_trunc_f64_s(&mut self) -> Self::Output1542b93e1bc0SSaúl Cabrera     fn visit_i32_trunc_f64_s(&mut self) -> Self::Output {
1543b546a5f2SJeffrey Charles         use OperandSize::*;
1544b546a5f2SJeffrey Charles 
1545b546a5f2SJeffrey Charles         self.context
1546496237c2SNick Fitzgerald             .convert_op(self.masm, WasmValType::I32, |masm, dst, src, dst_size| {
1547b93e1bc0SSaúl Cabrera                 masm.signed_truncate(writable!(dst), src, S64, dst_size, TruncKind::Unchecked)
1548b93e1bc0SSaúl Cabrera             })
1549b546a5f2SJeffrey Charles     }
1550b546a5f2SJeffrey Charles 
visit_i32_trunc_f64_u(&mut self) -> Self::Output1551b93e1bc0SSaúl Cabrera     fn visit_i32_trunc_f64_u(&mut self) -> Self::Output {
1552b546a5f2SJeffrey Charles         use OperandSize::*;
1553f309bfddSad hoc         self.masm
1554f309bfddSad hoc             .unsigned_truncate(&mut self.context, S64, S32, TruncKind::Unchecked)
1555b546a5f2SJeffrey Charles     }
1556b546a5f2SJeffrey Charles 
visit_i64_trunc_f32_s(&mut self) -> Self::Output1557b93e1bc0SSaúl Cabrera     fn visit_i64_trunc_f32_s(&mut self) -> Self::Output {
1558b546a5f2SJeffrey Charles         use OperandSize::*;
1559b546a5f2SJeffrey Charles 
1560b546a5f2SJeffrey Charles         self.context
1561496237c2SNick Fitzgerald             .convert_op(self.masm, WasmValType::I64, |masm, dst, src, dst_size| {
1562b93e1bc0SSaúl Cabrera                 masm.signed_truncate(writable!(dst), src, S32, dst_size, TruncKind::Unchecked)
1563b93e1bc0SSaúl Cabrera             })
1564b546a5f2SJeffrey Charles     }
1565b546a5f2SJeffrey Charles 
visit_i64_trunc_f32_u(&mut self) -> Self::Output1566b93e1bc0SSaúl Cabrera     fn visit_i64_trunc_f32_u(&mut self) -> Self::Output {
1567b546a5f2SJeffrey Charles         use OperandSize::*;
1568b546a5f2SJeffrey Charles 
1569f309bfddSad hoc         self.masm
1570f309bfddSad hoc             .unsigned_truncate(&mut self.context, S32, S64, TruncKind::Unchecked)
1571b546a5f2SJeffrey Charles     }
1572b546a5f2SJeffrey Charles 
visit_i64_trunc_f64_s(&mut self) -> Self::Output1573b93e1bc0SSaúl Cabrera     fn visit_i64_trunc_f64_s(&mut self) -> Self::Output {
1574b546a5f2SJeffrey Charles         use OperandSize::*;
1575b546a5f2SJeffrey Charles 
1576b546a5f2SJeffrey Charles         self.context
1577496237c2SNick Fitzgerald             .convert_op(self.masm, WasmValType::I64, |masm, dst, src, dst_size| {
1578b93e1bc0SSaúl Cabrera                 masm.signed_truncate(writable!(dst), src, S64, dst_size, TruncKind::Unchecked)
1579b93e1bc0SSaúl Cabrera             })
1580b546a5f2SJeffrey Charles     }
1581b546a5f2SJeffrey Charles 
visit_i64_trunc_f64_u(&mut self) -> Self::Output1582b93e1bc0SSaúl Cabrera     fn visit_i64_trunc_f64_u(&mut self) -> Self::Output {
1583b546a5f2SJeffrey Charles         use OperandSize::*;
1584b546a5f2SJeffrey Charles 
1585f309bfddSad hoc         self.masm
1586f309bfddSad hoc             .unsigned_truncate(&mut self.context, S64, S64, TruncKind::Unchecked)
1587b546a5f2SJeffrey Charles     }
1588b546a5f2SJeffrey Charles 
visit_i32_reinterpret_f32(&mut self) -> Self::Output1589b93e1bc0SSaúl Cabrera     fn visit_i32_reinterpret_f32(&mut self) -> Self::Output {
1590b546a5f2SJeffrey Charles         self.context
1591496237c2SNick Fitzgerald             .convert_op(self.masm, WasmValType::I32, |masm, dst, src, size| {
1592703871a2SAlex Crichton                 masm.reinterpret_float_as_int(writable!(dst), src, size)
1593b93e1bc0SSaúl Cabrera             })
1594b546a5f2SJeffrey Charles     }
1595b546a5f2SJeffrey Charles 
visit_i64_reinterpret_f64(&mut self) -> Self::Output1596b93e1bc0SSaúl Cabrera     fn visit_i64_reinterpret_f64(&mut self) -> Self::Output {
1597b546a5f2SJeffrey Charles         self.context
1598496237c2SNick Fitzgerald             .convert_op(self.masm, WasmValType::I64, |masm, dst, src, size| {
1599703871a2SAlex Crichton                 masm.reinterpret_float_as_int(writable!(dst), src, size)
1600b93e1bc0SSaúl Cabrera             })
1601b546a5f2SJeffrey Charles     }
1602b546a5f2SJeffrey Charles 
visit_local_get(&mut self, index: u32) -> Self::Output1603b93e1bc0SSaúl Cabrera     fn visit_local_get(&mut self, index: u32) -> Self::Output {
1604496237c2SNick Fitzgerald         use WasmValType::*;
16053b966855SAlex Crichton         let context = &mut self.context;
16060e98a8d5SSaúl Cabrera         let slot = context.frame.get_wasm_local(index);
16073b966855SAlex Crichton         match slot.ty {
1608fa9a948dSJeffrey Charles             I32 | I64 | F32 | F64 | V128 => context.stack.push(Val::local(index, slot.ty)),
1609a109d2abSSaúl Cabrera             Ref(rt) => match rt.heap_type {
1610a109d2abSSaúl Cabrera                 WasmHeapType::Func => context.stack.push(Val::local(index, slot.ty)),
1611b93e1bc0SSaúl Cabrera                 _ => bail!(CodeGenError::unsupported_wasm_type()),
1612a109d2abSSaúl Cabrera             },
16133b966855SAlex Crichton         }
1614b93e1bc0SSaúl Cabrera 
1615b93e1bc0SSaúl Cabrera         Ok(())
1616835abbcdSSaúl Cabrera     }
1617835abbcdSSaúl Cabrera 
visit_local_set(&mut self, index: u32) -> Self::Output1618b93e1bc0SSaúl Cabrera     fn visit_local_set(&mut self, index: u32) -> Self::Output {
1619b93e1bc0SSaúl Cabrera         let src = self.emit_set_local(index)?;
162014b39bc2SSaúl Cabrera         self.context.free_reg(src);
1621b93e1bc0SSaúl Cabrera         Ok(())
1622835abbcdSSaúl Cabrera     }
1623835abbcdSSaúl Cabrera 
visit_call(&mut self, index: u32) -> Self::Output1624b93e1bc0SSaúl Cabrera     fn visit_call(&mut self, index: u32) -> Self::Output {
1625355990b4SAlex Crichton         let callee = self.env.callee_from_index(FuncIndex::from_u32(index));
1626b93e1bc0SSaúl Cabrera         FnCall::emit::<M>(&mut self.env, self.masm, &mut self.context, callee)?;
1627b93e1bc0SSaúl Cabrera         Ok(())
16284b288ba8SSaúl Cabrera     }
16294b288ba8SSaúl Cabrera 
visit_call_indirect(&mut self, type_index: u32, table_index: u32) -> Self::Output1630b93e1bc0SSaúl Cabrera     fn visit_call_indirect(&mut self, type_index: u32, table_index: u32) -> Self::Output {
163155f9a4bdSJeffrey Charles         // Spill now because `emit_lazy_init_funcref` and the `FnCall::emit`
163255f9a4bdSJeffrey Charles         // invocations will both trigger spills since they both call functions.
163355f9a4bdSJeffrey Charles         // However, the machine instructions for the spill emitted by
163455f9a4bdSJeffrey Charles         // `emit_lazy_funcref` will be jumped over if the funcref was previously
163555f9a4bdSJeffrey Charles         // initialized which may result in the machine stack becoming
163655f9a4bdSJeffrey Charles         // unbalanced.
1637b93e1bc0SSaúl Cabrera         self.context.spill(self.masm)?;
163855f9a4bdSJeffrey Charles 
16394b288ba8SSaúl Cabrera         let type_index = TypeIndex::from_u32(type_index);
16404b288ba8SSaúl Cabrera         let table_index = TableIndex::from_u32(table_index);
16414b288ba8SSaúl Cabrera 
1642b93e1bc0SSaúl Cabrera         self.emit_lazy_init_funcref(table_index)?;
16434b288ba8SSaúl Cabrera 
16444b288ba8SSaúl Cabrera         // Perform the indirect call.
16454f47f3ecSSaúl Cabrera         // This code assumes that [`Self::emit_lazy_init_funcref`] will
16464f47f3ecSSaúl Cabrera         // push the funcref to the value stack.
1647b93e1bc0SSaúl Cabrera         let funcref_ptr = self
1648b93e1bc0SSaúl Cabrera             .context
1649b93e1bc0SSaúl Cabrera             .stack
1650b93e1bc0SSaúl Cabrera             .peek()
1651b93e1bc0SSaúl Cabrera             .map(|v| v.unwrap_reg())
1652b93e1bc0SSaúl Cabrera             .ok_or_else(|| CodeGenError::missing_values_in_stack())?;
1653a109d2abSSaúl Cabrera         self.masm
1654b93e1bc0SSaúl Cabrera             .trapz(funcref_ptr.into(), TRAP_INDIRECT_CALL_TO_NULL)?;
1655b93e1bc0SSaúl Cabrera         self.emit_typecheck_funcref(funcref_ptr.into(), type_index)?;
16564b288ba8SSaúl Cabrera 
1657355990b4SAlex Crichton         let callee = self.env.funcref(type_index);
1658b93e1bc0SSaúl Cabrera         FnCall::emit::<M>(&mut self.env, self.masm, &mut self.context, callee)?;
1659b93e1bc0SSaúl Cabrera         Ok(())
1660af4d94c8SSaúl Cabrera     }
1661af4d94c8SSaúl Cabrera 
visit_table_init(&mut self, elem: u32, table: u32) -> Self::Output1662b93e1bc0SSaúl Cabrera     fn visit_table_init(&mut self, elem: u32, table: u32) -> Self::Output {
1663b93e1bc0SSaúl Cabrera         let at = self.context.stack.ensure_index_at(3)?;
16644f47f3ecSSaúl Cabrera 
16650e98a8d5SSaúl Cabrera         self.context
16660e98a8d5SSaúl Cabrera             .stack
1667b93e1bc0SSaúl Cabrera             .insert_many(at, &[table.try_into()?, elem.try_into()?]);
16681b5c4ae8SSaúl Cabrera 
16690145a99dSAlex Crichton         let builtin = self.env.builtins.table_init::<M::ABI>()?;
1670355990b4SAlex Crichton         FnCall::emit::<M>(
1671355990b4SAlex Crichton             &mut self.env,
16721b5c4ae8SSaúl Cabrera             self.masm,
16731b5c4ae8SSaúl Cabrera             &mut self.context,
16741b5c4ae8SSaúl Cabrera             Callee::Builtin(builtin.clone()),
1675b93e1bc0SSaúl Cabrera         )?;
1676b93e1bc0SSaúl Cabrera         self.context.pop_and_free(self.masm)
1677a109d2abSSaúl Cabrera     }
1678a109d2abSSaúl Cabrera 
visit_table_copy(&mut self, dst: u32, src: u32) -> Self::Output1679b93e1bc0SSaúl Cabrera     fn visit_table_copy(&mut self, dst: u32, src: u32) -> Self::Output {
1680b93e1bc0SSaúl Cabrera         let at = self.context.stack.ensure_index_at(3)?;
16810e98a8d5SSaúl Cabrera         self.context
16820e98a8d5SSaúl Cabrera             .stack
1683b93e1bc0SSaúl Cabrera             .insert_many(at, &[dst.try_into()?, src.try_into()?]);
16844f47f3ecSSaúl Cabrera 
16850145a99dSAlex Crichton         let builtin = self.env.builtins.table_copy::<M::ABI>()?;
1686355990b4SAlex Crichton         FnCall::emit::<M>(
1687355990b4SAlex Crichton             &mut self.env,
1688355990b4SAlex Crichton             self.masm,
1689355990b4SAlex Crichton             &mut self.context,
1690355990b4SAlex Crichton             Callee::Builtin(builtin),
1691b93e1bc0SSaúl Cabrera         )?;
1692b93e1bc0SSaúl Cabrera         self.context.pop_and_free(self.masm)
1693a109d2abSSaúl Cabrera     }
1694a109d2abSSaúl Cabrera 
visit_table_get(&mut self, table: u32) -> Self::Output1695b93e1bc0SSaúl Cabrera     fn visit_table_get(&mut self, table: u32) -> Self::Output {
1696a109d2abSSaúl Cabrera         let table_index = TableIndex::from_u32(table);
16977a49e44fSAlex Crichton         let table = self.env.table(table_index);
16987a49e44fSAlex Crichton         let heap_type = table.ref_type.heap_type;
1699a109d2abSSaúl Cabrera 
1700a109d2abSSaúl Cabrera         match heap_type {
1701a82bdd83SAlex Crichton             WasmHeapType::Func => self.emit_lazy_init_funcref(table_index),
1702b112bb85SNick Fitzgerald             _ => Err(format_err!(CodeGenError::unsupported_wasm_type())),
17034f47f3ecSSaúl Cabrera         }
1704a109d2abSSaúl Cabrera     }
1705a109d2abSSaúl Cabrera 
visit_table_grow(&mut self, table: u32) -> Self::Output1706b93e1bc0SSaúl Cabrera     fn visit_table_grow(&mut self, table: u32) -> Self::Output {
1707a109d2abSSaúl Cabrera         let table_index = TableIndex::from_u32(table);
1708*39e910beSAlex Crichton         let ptr_type = self.env.ptr_type();
1709*39e910beSAlex Crichton         let (heap_type, idx_type) = {
17107a49e44fSAlex Crichton             let table_ty = self.env.table(table_index);
1711*39e910beSAlex Crichton             (table_ty.ref_type.heap_type, table_ty.idx_type)
1712*39e910beSAlex Crichton         };
1713*39e910beSAlex Crichton         let builtin = match heap_type {
17140145a99dSAlex Crichton             WasmHeapType::Func => self.env.builtins.table_grow_func_ref::<M::ABI>()?,
1715b93e1bc0SSaúl Cabrera             _ => bail!(CodeGenError::unsupported_wasm_type()),
1716a109d2abSSaúl Cabrera         };
1717a109d2abSSaúl Cabrera 
17184f47f3ecSSaúl Cabrera         let len = self.context.stack.len();
17194f47f3ecSSaúl Cabrera         // table.grow` requires at least 2 elements on the value stack.
1720b93e1bc0SSaúl Cabrera         let at = self.context.stack.ensure_index_at(2)?;
17214f47f3ecSSaúl Cabrera 
1722a109d2abSSaúl Cabrera         // The table_grow builtin expects the parameters in a different
1723a109d2abSSaúl Cabrera         // order.
1724a109d2abSSaúl Cabrera         // The value stack at this point should contain:
1725a109d2abSSaúl Cabrera         // [ init_value | delta ] (stack top)
1726a109d2abSSaúl Cabrera         // but the builtin function expects the init value as the last
1727a109d2abSSaúl Cabrera         // argument.
17284f47f3ecSSaúl Cabrera         self.context.stack.inner_mut().swap(len - 1, len - 2);
1729a109d2abSSaúl Cabrera 
17301b571864SAlex Crichton         let builtin = self.prepare_builtin_defined_table_arg(table_index, at, builtin)?;
17311b571864SAlex Crichton 
17321b571864SAlex Crichton         FnCall::emit::<M>(&mut self.env, self.masm, &mut self.context, builtin)?;
1733b93e1bc0SSaúl Cabrera 
1734*39e910beSAlex Crichton         // Similar to the memory.grow builtin, `table.grow` returns a
1735*39e910beSAlex Crichton         // pointer, however, we need to ensure that the returned index
1736*39e910beSAlex Crichton         // is representative of the address space for tables.
1737*39e910beSAlex Crichton         match (ptr_type, idx_type) {
1738*39e910beSAlex Crichton             (WasmValType::I64, IndexType::I64) => Ok(()),
1739*39e910beSAlex Crichton             (WasmValType::I64, IndexType::I32) => {
1740*39e910beSAlex Crichton                 let top: Reg = self.context.pop_to_reg(self.masm, None)?.into();
1741*39e910beSAlex Crichton                 self.masm.wrap(writable!(top), top)?;
1742*39e910beSAlex Crichton                 self.context.stack.push(TypedReg::i32(top).into());
1743b93e1bc0SSaúl Cabrera                 Ok(())
1744a109d2abSSaúl Cabrera             }
1745a109d2abSSaúl Cabrera 
1746*39e910beSAlex Crichton             _ => Err(format_err!(CodeGenError::unsupported_32_bit_platform())),
1747*39e910beSAlex Crichton         }
1748*39e910beSAlex Crichton     }
1749*39e910beSAlex Crichton 
visit_table_size(&mut self, table: u32) -> Self::Output1750b93e1bc0SSaúl Cabrera     fn visit_table_size(&mut self, table: u32) -> Self::Output {
1751a109d2abSSaúl Cabrera         let table_index = TableIndex::from_u32(table);
1752a109d2abSSaúl Cabrera         let table_data = self.env.resolve_table_data(table_index);
1753b93e1bc0SSaúl Cabrera         self.emit_compute_table_size(&table_data)
1754a109d2abSSaúl Cabrera     }
1755a109d2abSSaúl Cabrera 
visit_table_fill(&mut self, table: u32) -> Self::Output1756b93e1bc0SSaúl Cabrera     fn visit_table_fill(&mut self, table: u32) -> Self::Output {
1757a109d2abSSaúl Cabrera         let table_index = TableIndex::from_u32(table);
17587a49e44fSAlex Crichton         let table_ty = self.env.table(table_index);
1759a109d2abSSaúl Cabrera 
1760b93e1bc0SSaúl Cabrera         ensure!(
1761b93e1bc0SSaúl Cabrera             table_ty.ref_type.heap_type == WasmHeapType::Func,
1762b93e1bc0SSaúl Cabrera             CodeGenError::unsupported_wasm_type()
1763b93e1bc0SSaúl Cabrera         );
1764b93e1bc0SSaúl Cabrera 
17650145a99dSAlex Crichton         let builtin = self.env.builtins.table_fill_func_ref::<M::ABI>()?;
1766b93e1bc0SSaúl Cabrera 
1767b93e1bc0SSaúl Cabrera         let at = self.context.stack.ensure_index_at(3)?;
1768b93e1bc0SSaúl Cabrera 
1769*39e910beSAlex Crichton         let callee = self.prepare_builtin_defined_table_arg(table_index, at, builtin)?;
1770*39e910beSAlex Crichton         FnCall::emit::<M>(&mut self.env, self.masm, &mut self.context, callee)?;
1771*39e910beSAlex Crichton 
1772b93e1bc0SSaúl Cabrera         self.context.pop_and_free(self.masm)
1773a109d2abSSaúl Cabrera     }
1774a109d2abSSaúl Cabrera 
visit_table_set(&mut self, table: u32) -> Self::Output1775b93e1bc0SSaúl Cabrera     fn visit_table_set(&mut self, table: u32) -> Self::Output {
1776a109d2abSSaúl Cabrera         let ptr_type = self.env.ptr_type();
1777a109d2abSSaúl Cabrera         let table_index = TableIndex::from_u32(table);
1778a109d2abSSaúl Cabrera         let table_data = self.env.resolve_table_data(table_index);
17797a49e44fSAlex Crichton         let table = self.env.table(table_index);
17807a49e44fSAlex Crichton         match table.ref_type.heap_type {
1781a82bdd83SAlex Crichton             WasmHeapType::Func => {
1782b93e1bc0SSaúl Cabrera                 ensure!(
1783a82bdd83SAlex Crichton                     self.tunables.table_lazy_init,
1784b93e1bc0SSaúl Cabrera                     CodeGenError::unsupported_table_eager_init()
1785a82bdd83SAlex Crichton                 );
1786b93e1bc0SSaúl Cabrera                 let value = self.context.pop_to_reg(self.masm, None)?;
1787b93e1bc0SSaúl Cabrera                 let index = self.context.pop_to_reg(self.masm, None)?;
1788b93e1bc0SSaúl Cabrera                 let base = self.context.any_gpr(self.masm)?;
1789b93e1bc0SSaúl Cabrera                 let elem_addr =
1790b93e1bc0SSaúl Cabrera                     self.emit_compute_table_elem_addr(index.into(), base, &table_data)?;
1791a109d2abSSaúl Cabrera                 // Set the initialized bit.
1792a109d2abSSaúl Cabrera                 self.masm.or(
1793bdb834baSSaúl Cabrera                     writable!(value.into()),
1794a109d2abSSaúl Cabrera                     value.into(),
1795a109d2abSSaúl Cabrera                     RegImm::i64(FUNCREF_INIT_BIT as i64),
1796b93e1bc0SSaúl Cabrera                     ptr_type.try_into()?,
1797b93e1bc0SSaúl Cabrera                 )?;
1798a109d2abSSaúl Cabrera 
1799b93e1bc0SSaúl Cabrera                 self.masm.store_ptr(value.into(), elem_addr)?;
1800a109d2abSSaúl Cabrera 
1801a109d2abSSaúl Cabrera                 self.context.free_reg(value);
1802a109d2abSSaúl Cabrera                 self.context.free_reg(index);
1803a109d2abSSaúl Cabrera                 self.context.free_reg(base);
1804b93e1bc0SSaúl Cabrera                 Ok(())
1805a109d2abSSaúl Cabrera             }
1806b112bb85SNick Fitzgerald             _ => Err(format_err!(CodeGenError::unsupported_wasm_type())),
1807b93e1bc0SSaúl Cabrera         }
1808a109d2abSSaúl Cabrera     }
1809a109d2abSSaúl Cabrera 
visit_elem_drop(&mut self, index: u32) -> Self::Output1810b93e1bc0SSaúl Cabrera     fn visit_elem_drop(&mut self, index: u32) -> Self::Output {
18110145a99dSAlex Crichton         let elem_drop = self.env.builtins.elem_drop::<M::ABI>()?;
1812b93e1bc0SSaúl Cabrera         self.context.stack.extend([index.try_into()?]);
1813355990b4SAlex Crichton         FnCall::emit::<M>(
1814355990b4SAlex Crichton             &mut self.env,
1815355990b4SAlex Crichton             self.masm,
1816355990b4SAlex Crichton             &mut self.context,
1817355990b4SAlex Crichton             Callee::Builtin(elem_drop),
1818b93e1bc0SSaúl Cabrera         )?;
1819a465eabfSNick Fitzgerald         self.context.pop_and_free(self.masm)
1820a109d2abSSaúl Cabrera     }
1821a109d2abSSaúl Cabrera 
visit_memory_init(&mut self, data_index: u32, mem: u32) -> Self::Output1822b93e1bc0SSaúl Cabrera     fn visit_memory_init(&mut self, data_index: u32, mem: u32) -> Self::Output {
1823b93e1bc0SSaúl Cabrera         let at = self.context.stack.ensure_index_at(3)?;
1824b93e1bc0SSaúl Cabrera         self.context
1825b93e1bc0SSaúl Cabrera             .stack
1826b93e1bc0SSaúl Cabrera             .insert_many(at, &[mem.try_into()?, data_index.try_into()?]);
18270145a99dSAlex Crichton         let builtin = self.env.builtins.memory_init::<M::ABI>()?;
1828355990b4SAlex Crichton         FnCall::emit::<M>(
1829355990b4SAlex Crichton             &mut self.env,
1830355990b4SAlex Crichton             self.masm,
1831355990b4SAlex Crichton             &mut self.context,
1832355990b4SAlex Crichton             Callee::Builtin(builtin),
1833b93e1bc0SSaúl Cabrera         )?;
1834b93e1bc0SSaúl Cabrera         self.context.pop_and_free(self.masm)
18355708d693SSaúl Cabrera     }
18365708d693SSaúl Cabrera 
visit_memory_copy(&mut self, dst_mem: u32, src_mem: u32) -> Self::Output1837b93e1bc0SSaúl Cabrera     fn visit_memory_copy(&mut self, dst_mem: u32, src_mem: u32) -> Self::Output {
18385708d693SSaúl Cabrera         // At this point, the stack is expected to contain:
18395708d693SSaúl Cabrera         //     [ dst_offset, src_offset, len ]
18405708d693SSaúl Cabrera         // The following code inserts the missing params, so that stack contains:
18415708d693SSaúl Cabrera         //     [ vmctx, dst_mem, dst_offset, src_mem, src_offset, len ]
18425708d693SSaúl Cabrera         // Which is the order expected by the builtin function.
1843b93e1bc0SSaúl Cabrera         let _ = self.context.stack.ensure_index_at(3)?;
1844b93e1bc0SSaúl Cabrera         let at = self.context.stack.ensure_index_at(2)?;
1845b93e1bc0SSaúl Cabrera         self.context.stack.insert_many(at, &[src_mem.try_into()?]);
18465708d693SSaúl Cabrera 
18475708d693SSaúl Cabrera         // One element was inserted above, so instead of 3, we use 4.
1848b93e1bc0SSaúl Cabrera         let at = self.context.stack.ensure_index_at(4)?;
1849b93e1bc0SSaúl Cabrera         self.context.stack.insert_many(at, &[dst_mem.try_into()?]);
18505708d693SSaúl Cabrera 
18510145a99dSAlex Crichton         let builtin = self.env.builtins.memory_copy::<M::ABI>()?;
18521b5c4ae8SSaúl Cabrera 
1853355990b4SAlex Crichton         FnCall::emit::<M>(
1854355990b4SAlex Crichton             &mut self.env,
1855355990b4SAlex Crichton             self.masm,
1856355990b4SAlex Crichton             &mut self.context,
1857355990b4SAlex Crichton             Callee::Builtin(builtin),
1858b93e1bc0SSaúl Cabrera         )?;
1859b93e1bc0SSaúl Cabrera         self.context.pop_and_free(self.masm)
18605708d693SSaúl Cabrera     }
18615708d693SSaúl Cabrera 
visit_memory_fill(&mut self, mem: u32) -> Self::Output1862b93e1bc0SSaúl Cabrera     fn visit_memory_fill(&mut self, mem: u32) -> Self::Output {
1863b93e1bc0SSaúl Cabrera         let at = self.context.stack.ensure_index_at(3)?;
1864ab76f64bSAlex Crichton         let mem = MemoryIndex::from_u32(mem);
18655708d693SSaúl Cabrera 
18660145a99dSAlex Crichton         let builtin = self.env.builtins.memory_fill::<M::ABI>()?;
1867ab76f64bSAlex Crichton         let builtin = self.prepare_builtin_defined_memory_arg(mem, at, builtin)?;
1868ab76f64bSAlex Crichton 
1869ab76f64bSAlex Crichton         FnCall::emit::<M>(&mut self.env, self.masm, &mut self.context, builtin)?;
1870b93e1bc0SSaúl Cabrera         self.context.pop_and_free(self.masm)
18715708d693SSaúl Cabrera     }
18725708d693SSaúl Cabrera 
visit_memory_size(&mut self, mem: u32) -> Self::Output1873b93e1bc0SSaúl Cabrera     fn visit_memory_size(&mut self, mem: u32) -> Self::Output {
18745708d693SSaúl Cabrera         let heap = self.env.resolve_heap(MemoryIndex::from_u32(mem));
1875b93e1bc0SSaúl Cabrera         self.emit_compute_memory_size(&heap)
18765708d693SSaúl Cabrera     }
18775708d693SSaúl Cabrera 
visit_memory_grow(&mut self, mem: u32) -> Self::Output1878b93e1bc0SSaúl Cabrera     fn visit_memory_grow(&mut self, mem: u32) -> Self::Output {
1879ab76f64bSAlex Crichton         let at = self.context.stack.ensure_index_at(1)?;
1880ab76f64bSAlex Crichton         let mem = MemoryIndex::from_u32(mem);
18815708d693SSaúl Cabrera         // The stack at this point contains: [ delta ]
18825708d693SSaúl Cabrera         // The desired state is
18835708d693SSaúl Cabrera         //   [ vmctx, delta, index ]
18840145a99dSAlex Crichton         let builtin = self.env.builtins.memory_grow::<M::ABI>()?;
1885ab76f64bSAlex Crichton         let builtin = self.prepare_builtin_defined_memory_arg(mem, at + 1, builtin)?;
1886ab76f64bSAlex Crichton 
1887ab76f64bSAlex Crichton         let heap = self.env.resolve_heap(mem);
1888ab76f64bSAlex Crichton         FnCall::emit::<M>(&mut self.env, self.masm, &mut self.context, builtin)?;
18898baee53bSSaúl Cabrera 
18908baee53bSSaúl Cabrera         // The memory32_grow builtin returns a pointer type, therefore we must
18918baee53bSSaúl Cabrera         // ensure that the return type is representative of the address space of
18928baee53bSSaúl Cabrera         // the heap type.
189365181b36SAlex Crichton         match (self.env.ptr_type(), heap.index_type()) {
1894b93e1bc0SSaúl Cabrera             (WasmValType::I64, WasmValType::I64) => Ok(()),
18958baee53bSSaúl Cabrera             // When the heap type is smaller than the pointer type, we adjust
18968baee53bSSaúl Cabrera             // the result of the memory32_grow builtin.
18978baee53bSSaúl Cabrera             (WasmValType::I64, WasmValType::I32) => {
1898b93e1bc0SSaúl Cabrera                 let top: Reg = self.context.pop_to_reg(self.masm, None)?.into();
1899703871a2SAlex Crichton                 self.masm.wrap(writable!(top), top)?;
19008baee53bSSaúl Cabrera                 self.context.stack.push(TypedReg::i32(top).into());
1901b93e1bc0SSaúl Cabrera                 Ok(())
19028baee53bSSaúl Cabrera             }
1903b112bb85SNick Fitzgerald             _ => Err(format_err!(CodeGenError::unsupported_32_bit_platform())),
19048baee53bSSaúl Cabrera         }
19055708d693SSaúl Cabrera     }
19065708d693SSaúl Cabrera 
visit_data_drop(&mut self, data_index: u32) -> Self::Output1907b93e1bc0SSaúl Cabrera     fn visit_data_drop(&mut self, data_index: u32) -> Self::Output {
1908b93e1bc0SSaúl Cabrera         self.context.stack.extend([data_index.try_into()?]);
19095708d693SSaúl Cabrera 
19100145a99dSAlex Crichton         let builtin = self.env.builtins.data_drop::<M::ABI>()?;
1911355990b4SAlex Crichton         FnCall::emit::<M>(
1912355990b4SAlex Crichton             &mut self.env,
1913355990b4SAlex Crichton             self.masm,
1914355990b4SAlex Crichton             &mut self.context,
1915355990b4SAlex Crichton             Callee::Builtin(builtin),
1916a465eabfSNick Fitzgerald         )?;
1917a465eabfSNick Fitzgerald         self.context.pop_and_free(self.masm)
19185708d693SSaúl Cabrera     }
19195708d693SSaúl Cabrera 
visit_nop(&mut self) -> Self::Output1920b93e1bc0SSaúl Cabrera     fn visit_nop(&mut self) -> Self::Output {
1921b93e1bc0SSaúl Cabrera         Ok(())
1922b93e1bc0SSaúl Cabrera     }
19235a6ea327SJeffrey Charles 
visit_if(&mut self, blockty: BlockType) -> Self::Output1924b93e1bc0SSaúl Cabrera     fn visit_if(&mut self, blockty: BlockType) -> Self::Output {
1925f0162a40SSaúl Cabrera         self.control_frames.push(ControlStackFrame::r#if(
1926366f320dSAlex Crichton             self.env.resolve_block_sig(blockty)?,
1927a50c4972SSaúl Cabrera             self.masm,
1928a50c4972SSaúl Cabrera             &mut self.context,
1929b93e1bc0SSaúl Cabrera         )?);
1930b93e1bc0SSaúl Cabrera 
1931b93e1bc0SSaúl Cabrera         Ok(())
1932a50c4972SSaúl Cabrera     }
1933a50c4972SSaúl Cabrera 
visit_else(&mut self) -> Self::Output1934b93e1bc0SSaúl Cabrera     fn visit_else(&mut self) -> Self::Output {
19351bc4ff3fSSaúl Cabrera         if !self.context.reachable {
1936b93e1bc0SSaúl Cabrera             self.handle_unreachable_else()
19371bc4ff3fSSaúl Cabrera         } else {
1938a50c4972SSaúl Cabrera             let control = self
1939a50c4972SSaúl Cabrera                 .control_frames
1940a50c4972SSaúl Cabrera                 .last_mut()
1941b93e1bc0SSaúl Cabrera                 .ok_or_else(|| CodeGenError::control_frame_expected())?;
1942b93e1bc0SSaúl Cabrera             control.emit_else(self.masm, &mut self.context)
1943a50c4972SSaúl Cabrera         }
19441bc4ff3fSSaúl Cabrera     }
1945a50c4972SSaúl Cabrera 
visit_block(&mut self, blockty: BlockType) -> Self::Output1946b93e1bc0SSaúl Cabrera     fn visit_block(&mut self, blockty: BlockType) -> Self::Output {
1947b4a93b6aSSaúl Cabrera         self.control_frames.push(ControlStackFrame::block(
1948366f320dSAlex Crichton             self.env.resolve_block_sig(blockty)?,
1949b4a93b6aSSaúl Cabrera             self.masm,
1950b4a93b6aSSaúl Cabrera             &mut self.context,
1951b93e1bc0SSaúl Cabrera         )?);
1952b93e1bc0SSaúl Cabrera 
1953b93e1bc0SSaúl Cabrera         Ok(())
1954b4a93b6aSSaúl Cabrera     }
1955b4a93b6aSSaúl Cabrera 
visit_loop(&mut self, blockty: BlockType) -> Self::Output1956b93e1bc0SSaúl Cabrera     fn visit_loop(&mut self, blockty: BlockType) -> Self::Output {
1957f0162a40SSaúl Cabrera         self.control_frames.push(ControlStackFrame::r#loop(
1958366f320dSAlex Crichton             self.env.resolve_block_sig(blockty)?,
19591bc4ff3fSSaúl Cabrera             self.masm,
19601bc4ff3fSSaúl Cabrera             &mut self.context,
1961b93e1bc0SSaúl Cabrera         )?);
19622f684ba1SSaúl Cabrera 
1963b93e1bc0SSaúl Cabrera         self.maybe_emit_epoch_check()?;
1964b93e1bc0SSaúl Cabrera         self.maybe_emit_fuel_check()
19651bc4ff3fSSaúl Cabrera     }
19661bc4ff3fSSaúl Cabrera 
visit_br(&mut self, depth: u32) -> Self::Output1967b93e1bc0SSaúl Cabrera     fn visit_br(&mut self, depth: u32) -> Self::Output {
1968b93e1bc0SSaúl Cabrera         let index = control_index(depth, self.control_frames.len())?;
1969350410acSSaúl Cabrera         let frame = &mut self.control_frames[index];
1970350410acSSaúl Cabrera         self.context
197140315bd2SSaúl Cabrera             .br::<_, _, UnconditionalBranch>(frame, self.masm, |masm, cx, frame| {
1972b93e1bc0SSaúl Cabrera                 frame.pop_abi_results::<M, _>(cx, masm, |results, _, _| {
1973b93e1bc0SSaúl Cabrera                     Ok(results.ret_area().copied())
1974b93e1bc0SSaúl Cabrera                 })
1975b93e1bc0SSaúl Cabrera             })
19761bc4ff3fSSaúl Cabrera     }
19771bc4ff3fSSaúl Cabrera 
visit_br_if(&mut self, depth: u32) -> Self::Output1978b93e1bc0SSaúl Cabrera     fn visit_br_if(&mut self, depth: u32) -> Self::Output {
1979b93e1bc0SSaúl Cabrera         let index = control_index(depth, self.control_frames.len())?;
1980350410acSSaúl Cabrera         let frame = &mut self.control_frames[index];
19811bc4ff3fSSaúl Cabrera         frame.set_as_target();
1982f0162a40SSaúl Cabrera 
1983446a7f5eSSaúl Cabrera         let top = {
1984b93e1bc0SSaúl Cabrera             let top = self.context.without::<Result<TypedReg>, M, _>(
19858bc01990SSaúl Cabrera                 frame.results::<M>()?.regs(),
19864b288ba8SSaúl Cabrera                 self.masm,
19874b288ba8SSaúl Cabrera                 |ctx, masm| ctx.pop_to_reg(masm, None),
1988b93e1bc0SSaúl Cabrera             )??;
19898fc41866SSaúl Cabrera             // Explicitly save any live registers and locals before setting up
19908fc41866SSaúl Cabrera             // the branch state.
19918fc41866SSaúl Cabrera             // In some cases, calculating the `top` value above, will result in
19928fc41866SSaúl Cabrera             // a spill, thus the following one will result in a no-op.
1993b93e1bc0SSaúl Cabrera             self.context.spill(self.masm)?;
1994446a7f5eSSaúl Cabrera             frame.top_abi_results::<M, _>(
1995446a7f5eSSaúl Cabrera                 &mut self.context,
1996446a7f5eSSaúl Cabrera                 self.masm,
1997446a7f5eSSaúl Cabrera                 |results, context, masm| {
19980e9121daSFrankReh                     // In the case of `br_if` there's a possibility that we'll
19990e9121daSFrankReh                     // exit early from the block or fallthrough, for
20000e9121daSFrankReh                     // a fallthrough, we cannot rely on the pre-computed return area;
2001446a7f5eSSaúl Cabrera                     // it must be recalculated so that any values that are
2002446a7f5eSSaúl Cabrera                     // generated are correctly placed near the current stack
2003446a7f5eSSaúl Cabrera                     // pointer.
2004b93e1bc0SSaúl Cabrera                     if results.on_stack() {
2005446a7f5eSSaúl Cabrera                         let stack_consumed = context.stack.sizeof(results.stack_operands_len());
2006b93e1bc0SSaúl Cabrera                         let base = masm.sp_offset()?.as_u32() - stack_consumed;
2007446a7f5eSSaúl Cabrera                         let offs = base + results.size();
2008b93e1bc0SSaúl Cabrera                         Ok(Some(RetArea::sp(SPOffset::from_u32(offs))))
2009b93e1bc0SSaúl Cabrera                     } else {
2010b93e1bc0SSaúl Cabrera                         Ok(None)
2011b93e1bc0SSaúl Cabrera                     }
2012446a7f5eSSaúl Cabrera                 },
2013b93e1bc0SSaúl Cabrera             )?;
2014f0162a40SSaúl Cabrera             top
2015f0162a40SSaúl Cabrera         };
2016f0162a40SSaúl Cabrera 
201740315bd2SSaúl Cabrera         // Emit instructions to balance the machine stack.
2018b93e1bc0SSaúl Cabrera         let current_sp_offset = self.masm.sp_offset()?;
201940315bd2SSaúl Cabrera         let unbalanced = frame.unbalanced(self.masm)?;
202040315bd2SSaúl Cabrera         let (label, cmp) = if unbalanced {
202140315bd2SSaúl Cabrera             (self.masm.get_label()?, IntCmpKind::Eq)
20224d224460SJeffrey Charles         } else {
202340315bd2SSaúl Cabrera             (*frame.label(), IntCmpKind::Ne)
20244d224460SJeffrey Charles         };
20254d224460SJeffrey Charles 
20264d224460SJeffrey Charles         self.masm
2027703871a2SAlex Crichton             .branch(cmp, top.reg, top.reg.into(), label, OperandSize::S32)?;
202814b39bc2SSaúl Cabrera         self.context.free_reg(top);
20294d224460SJeffrey Charles 
203040315bd2SSaúl Cabrera         if unbalanced {
203140315bd2SSaúl Cabrera             self.context
203240315bd2SSaúl Cabrera                 .br::<_, _, ConditionalBranch>(frame, self.masm, |_, _, _| Ok(()))?;
20334d224460SJeffrey Charles 
20344d224460SJeffrey Charles             // Restore sp_offset to what it was for falling through and emit
20354d224460SJeffrey Charles             // fallthrough label.
2036b93e1bc0SSaúl Cabrera             self.masm.reset_stack_pointer(current_sp_offset)?;
2037b93e1bc0SSaúl Cabrera             self.masm.bind(label)?;
20381bc4ff3fSSaúl Cabrera         }
20391bc4ff3fSSaúl Cabrera 
2040b93e1bc0SSaúl Cabrera         Ok(())
2041b93e1bc0SSaúl Cabrera     }
2042b93e1bc0SSaúl Cabrera 
visit_br_table(&mut self, targets: BrTable<'a>) -> Self::Output2043b93e1bc0SSaúl Cabrera     fn visit_br_table(&mut self, targets: BrTable<'a>) -> Self::Output {
2044350410acSSaúl Cabrera         // +1 to account for the default target.
2045350410acSSaúl Cabrera         let len = targets.len() + 1;
2046350410acSSaúl Cabrera         // SmallVec<[_; 5]> to match the binary emission layer (e.g
2047350410acSSaúl Cabrera         // see `JmpTableSeq'), but here we use 5 instead since we
2048350410acSSaúl Cabrera         // bundle the default target as the last element in the array.
2049b93e1bc0SSaúl Cabrera         let mut labels: SmallVec<[_; 5]> = smallvec![];
2050b93e1bc0SSaúl Cabrera         for _ in 0..len {
2051b93e1bc0SSaúl Cabrera             labels.push(self.masm.get_label()?);
2052b93e1bc0SSaúl Cabrera         }
2053350410acSSaúl Cabrera 
20545b265534SSaúl Cabrera         // Find the innermost target and use it as the relative frame
20555b265534SSaúl Cabrera         // for result handling below.
20565b265534SSaúl Cabrera         //
2057dacd33b0SSaúl Cabrera         // This approach ensures that
20585b265534SSaúl Cabrera         // 1. The stack pointer offset is correctly positioned
20595b265534SSaúl Cabrera         //    according to the expectations of the innermost block end
20605b265534SSaúl Cabrera         //    sequence.
20615b265534SSaúl Cabrera         // 2. We meet the jump site invariants introduced by
20625b265534SSaúl Cabrera         //    `CodegenContext::br`, which take advantage of Wasm
20635b265534SSaúl Cabrera         //    semantics given that all jumps are "outward".
20645b265534SSaúl Cabrera         let mut innermost = targets.default();
20655b265534SSaúl Cabrera         for target in targets.targets() {
20665b265534SSaúl Cabrera             let target = target?;
20675b265534SSaúl Cabrera             if target < innermost {
20685b265534SSaúl Cabrera                 innermost = target;
20695b265534SSaúl Cabrera             }
20705b265534SSaúl Cabrera         }
20715b265534SSaúl Cabrera 
20725b265534SSaúl Cabrera         let innermost_index = control_index(innermost, self.control_frames.len())?;
20735b265534SSaúl Cabrera         let innermost_frame = &mut self.control_frames[innermost_index];
20745b265534SSaúl Cabrera         let innermost_result = innermost_frame.results::<M>()?;
2075f0162a40SSaúl Cabrera 
2076446a7f5eSSaúl Cabrera         let (index, tmp) = {
2077b93e1bc0SSaúl Cabrera             let index_and_tmp = self.context.without::<Result<(TypedReg, _)>, M, _>(
20785b265534SSaúl Cabrera                 innermost_result.regs(),
2079350410acSSaúl Cabrera                 self.masm,
2080b93e1bc0SSaúl Cabrera                 |cx, masm| Ok((cx.pop_to_reg(masm, None)?, cx.any_gpr(masm)?)),
2081b93e1bc0SSaúl Cabrera             )??;
2082350410acSSaúl Cabrera 
208340315bd2SSaúl Cabrera             // Materialize any constants or locals into their result
208440315bd2SSaúl Cabrera             // representation, so that when reachability is restored,
208540315bd2SSaúl Cabrera             // they are correctly located.  NB: the results are popped
20865b265534SSaúl Cabrera             // in function of the innermost branch specified for
208740315bd2SSaúl Cabrera             // `br_table`, which implies that the machine stack will
208840315bd2SSaúl Cabrera             // be correctly balanced, by virtue of calling
208940315bd2SSaúl Cabrera             // `pop_abi_results`.
209040315bd2SSaúl Cabrera 
209140315bd2SSaúl Cabrera             // It's possible that we need to balance the stack for the
209240315bd2SSaúl Cabrera             // rest of the targets, which will be done before emitting
209340315bd2SSaúl Cabrera             // the unconditional jump below.
20945b265534SSaúl Cabrera             innermost_frame.pop_abi_results::<M, _>(
2095b93e1bc0SSaúl Cabrera                 &mut self.context,
2096b93e1bc0SSaúl Cabrera                 self.masm,
2097b93e1bc0SSaúl Cabrera                 |results, _, _| Ok(results.ret_area().copied()),
2098b93e1bc0SSaúl Cabrera             )?;
2099f0162a40SSaúl Cabrera             index_and_tmp
2100f0162a40SSaúl Cabrera         };
2101f0162a40SSaúl Cabrera 
2102b93e1bc0SSaúl Cabrera         self.masm.jmp_table(&labels, index.into(), tmp)?;
2103bac512aaSSaúl Cabrera         // Save the original stack pointer offset; we will reset the stack
2104bac512aaSSaúl Cabrera         // pointer to this offset after jumping to each of the targets. Each
2105bac512aaSSaúl Cabrera         // jump might adjust the stack according to the base offset of the
2106bac512aaSSaúl Cabrera         // target.
2107b93e1bc0SSaúl Cabrera         let current_sp = self.masm.sp_offset()?;
2108350410acSSaúl Cabrera 
2109350410acSSaúl Cabrera         for (t, l) in targets
2110350410acSSaúl Cabrera             .targets()
2111350410acSSaúl Cabrera             .chain(std::iter::once(Ok(targets.default())))
2112350410acSSaúl Cabrera             .zip(labels.iter())
2113350410acSSaúl Cabrera         {
2114b93e1bc0SSaúl Cabrera             let control_index = control_index(t?, self.control_frames.len())?;
21159e0c6503SSaúl Cabrera             let frame = &mut self.control_frames[control_index];
2116bac512aaSSaúl Cabrera             // Reset the stack pointer to its original offset. This is needed
2117bac512aaSSaúl Cabrera             // because each jump will potentially adjust the stack pointer
2118bac512aaSSaúl Cabrera             // according to the base offset of the target.
2119b93e1bc0SSaúl Cabrera             self.masm.reset_stack_pointer(current_sp)?;
2120350410acSSaúl Cabrera 
2121350410acSSaúl Cabrera             // NB: We don't perform any result handling as it was
2122350410acSSaúl Cabrera             // already taken care of above before jumping to the
2123f0162a40SSaúl Cabrera             // jump table.
2124b93e1bc0SSaúl Cabrera             self.masm.bind(*l)?;
2125bac512aaSSaúl Cabrera             // Ensure that the stack pointer is correctly positioned before
2126bac512aaSSaúl Cabrera             // jumping to the jump table code.
212740315bd2SSaúl Cabrera             self.context
212840315bd2SSaúl Cabrera                 .br::<_, _, UnconditionalBranch>(frame, self.masm, |_, _, _| Ok(()))?;
2129350410acSSaúl Cabrera         }
2130bac512aaSSaúl Cabrera         // Finally reset the stack pointer to the original location.
2131bac512aaSSaúl Cabrera         // The reachability analysis, will ensure it's correctly located
2132bac512aaSSaúl Cabrera         // once reachability is restored.
2133b93e1bc0SSaúl Cabrera         self.masm.reset_stack_pointer(current_sp)?;
21349e0c6503SSaúl Cabrera         self.context.reachable = false;
2135350410acSSaúl Cabrera         self.context.free_reg(index.reg);
2136350410acSSaúl Cabrera         self.context.free_reg(tmp);
2137b93e1bc0SSaúl Cabrera 
2138b93e1bc0SSaúl Cabrera         Ok(())
2139350410acSSaúl Cabrera     }
2140350410acSSaúl Cabrera 
visit_return(&mut self) -> Self::Output2141b93e1bc0SSaúl Cabrera     fn visit_return(&mut self) -> Self::Output {
2142350410acSSaúl Cabrera         // Grab the outermost frame, which is the function's body
2143350410acSSaúl Cabrera         // frame. We don't rely on [`codegen::control_index`] since
2144350410acSSaúl Cabrera         // this frame is implicit and we know that it should exist at
2145350410acSSaúl Cabrera         // index 0.
2146404711b4SSaúl Cabrera         let outermost = &mut self.control_frames[0];
2147350410acSSaúl Cabrera         self.context
214840315bd2SSaúl Cabrera             .br::<_, _, UnconditionalBranch>(outermost, self.masm, |masm, cx, frame| {
2149b93e1bc0SSaúl Cabrera                 frame.pop_abi_results::<M, _>(cx, masm, |results, _, _| {
2150b93e1bc0SSaúl Cabrera                     Ok(results.ret_area().copied())
2151b93e1bc0SSaúl Cabrera                 })
2152b93e1bc0SSaúl Cabrera             })
2153404711b4SSaúl Cabrera     }
2154404711b4SSaúl Cabrera 
visit_unreachable(&mut self) -> Self::Output2155b93e1bc0SSaúl Cabrera     fn visit_unreachable(&mut self) -> Self::Output {
2156b93e1bc0SSaúl Cabrera         self.masm.unreachable()?;
2157404711b4SSaúl Cabrera         self.context.reachable = false;
2158404711b4SSaúl Cabrera         // Set the implicit outermost frame as target to perform the necessary
2159404711b4SSaúl Cabrera         // stack clean up.
2160404711b4SSaúl Cabrera         let outermost = &mut self.control_frames[0];
2161404711b4SSaúl Cabrera         outermost.set_as_target();
2162b93e1bc0SSaúl Cabrera 
2163b93e1bc0SSaúl Cabrera         Ok(())
2164404711b4SSaúl Cabrera     }
2165404711b4SSaúl Cabrera 
visit_local_tee(&mut self, index: u32) -> Self::Output2166b93e1bc0SSaúl Cabrera     fn visit_local_tee(&mut self, index: u32) -> Self::Output {
2167b93e1bc0SSaúl Cabrera         let typed_reg = self.emit_set_local(index)?;
216814b39bc2SSaúl Cabrera         self.context.stack.push(typed_reg.into());
2169b93e1bc0SSaúl Cabrera 
2170b93e1bc0SSaúl Cabrera         Ok(())
21713efd7284SSaúl Cabrera     }
21723efd7284SSaúl Cabrera 
visit_global_get(&mut self, global_index: u32) -> Self::Output2173b93e1bc0SSaúl Cabrera     fn visit_global_get(&mut self, global_index: u32) -> Self::Output {
2174690dd116SSaúl Cabrera         let index = GlobalIndex::from_u32(global_index);
21753ed4a63eSSaúl Cabrera         let (ty, base, offset) = self.emit_get_global_addr(index)?;
21763ed4a63eSSaúl Cabrera         let addr = self.masm.address_at_reg(base, offset)?;
2177b93e1bc0SSaúl Cabrera         let dst = self.context.reg_for_type(ty, self.masm)?;
2178b93e1bc0SSaúl Cabrera         self.masm.load(addr, writable!(dst), ty.try_into()?)?;
217914b39bc2SSaúl Cabrera         self.context.stack.push(Val::reg(dst, ty));
2180b93e1bc0SSaúl Cabrera 
21813ed4a63eSSaúl Cabrera         self.context.free_reg(base);
21823ed4a63eSSaúl Cabrera 
2183b93e1bc0SSaúl Cabrera         Ok(())
2184690dd116SSaúl Cabrera     }
2185690dd116SSaúl Cabrera 
visit_global_set(&mut self, global_index: u32) -> Self::Output2186b93e1bc0SSaúl Cabrera     fn visit_global_set(&mut self, global_index: u32) -> Self::Output {
2187690dd116SSaúl Cabrera         let index = GlobalIndex::from_u32(global_index);
21883ed4a63eSSaúl Cabrera         let (ty, base, offset) = self.emit_get_global_addr(index)?;
21893ed4a63eSSaúl Cabrera         let addr = self.masm.address_at_reg(base, offset)?;
21900e98a8d5SSaúl Cabrera 
2191b93e1bc0SSaúl Cabrera         let typed_reg = self.context.pop_to_reg(self.masm, None)?;
21922da108dfSSaúl Cabrera         self.masm
2193b93e1bc0SSaúl Cabrera             .store(typed_reg.reg.into(), addr, ty.try_into()?)?;
21943ed4a63eSSaúl Cabrera         self.context.free_reg(typed_reg.reg);
21953ed4a63eSSaúl Cabrera         self.context.free_reg(base);
2196b93e1bc0SSaúl Cabrera 
2197b93e1bc0SSaúl Cabrera         Ok(())
2198b93e1bc0SSaúl Cabrera     }
2199b93e1bc0SSaúl Cabrera 
visit_drop(&mut self) -> Self::Output2200b93e1bc0SSaúl Cabrera     fn visit_drop(&mut self) -> Self::Output {
2201b93e1bc0SSaúl Cabrera         self.context.drop_last(1, |regalloc, val| match val {
2202703871a2SAlex Crichton             Val::Reg(tr) => Ok(regalloc.free(tr.reg)),
2203b93e1bc0SSaúl Cabrera             Val::Memory(m) => self.masm.free_stack(m.slot.size),
2204b93e1bc0SSaúl Cabrera             _ => Ok(()),
2205b93e1bc0SSaúl Cabrera         })
2206b93e1bc0SSaúl Cabrera     }
2207b93e1bc0SSaúl Cabrera 
visit_select(&mut self) -> Self::Output2208b93e1bc0SSaúl Cabrera     fn visit_select(&mut self) -> Self::Output {
2209b93e1bc0SSaúl Cabrera         let cond = self.context.pop_to_reg(self.masm, None)?;
2210b93e1bc0SSaúl Cabrera         let val2 = self.context.pop_to_reg(self.masm, None)?;
2211b93e1bc0SSaúl Cabrera         let val1 = self.context.pop_to_reg(self.masm, None)?;
2212703871a2SAlex Crichton         self.masm.cmp(cond.reg, RegImm::i32(0), OperandSize::S32)?;
22130e9121daSFrankReh         // Conditionally move val1 to val2 if the comparison is
22142da108dfSSaúl Cabrera         // not zero.
2215bdb834baSSaúl Cabrera         self.masm.cmov(
2216bdb834baSSaúl Cabrera             writable!(val2.into()),
2217bdb834baSSaúl Cabrera             val1.into(),
2218bdb834baSSaúl Cabrera             IntCmpKind::Ne,
2219b93e1bc0SSaúl Cabrera             val1.ty.try_into()?,
2220b93e1bc0SSaúl Cabrera         )?;
22212da108dfSSaúl Cabrera         self.context.stack.push(val2.into());
22222da108dfSSaúl Cabrera         self.context.free_reg(val1.reg);
22232da108dfSSaúl Cabrera         self.context.free_reg(cond);
2224b93e1bc0SSaúl Cabrera 
2225b93e1bc0SSaúl Cabrera         Ok(())
22262da108dfSSaúl Cabrera     }
22272da108dfSSaúl Cabrera 
visit_typed_select(&mut self, _ty: ValType) -> Self::Output2228071c4061Sr-near     fn visit_typed_select(&mut self, _ty: ValType) -> Self::Output {
2229071c4061Sr-near         self.visit_select()
2230071c4061Sr-near     }
2231071c4061Sr-near 
visit_ref_null(&mut self, hty: HeapType) -> Self::Output2232071c4061Sr-near     fn visit_ref_null(&mut self, hty: HeapType) -> Self::Output {
2233071c4061Sr-near         match hty {
2234071c4061Sr-near             HeapType::FUNC => {
2235071c4061Sr-near                 let ptr_type = self.env.ptr_type();
2236071c4061Sr-near                 match ptr_type {
2237071c4061Sr-near                     WasmValType::I64 => self.context.stack.push(Val::i64(0)),
2238071c4061Sr-near                     WasmValType::I32 => self.context.stack.push(Val::i32(0)),
2239071c4061Sr-near                     _ => bail!(CodeGenError::unsupported_wasm_type()),
2240071c4061Sr-near                 }
2241071c4061Sr-near                 Ok(())
2242071c4061Sr-near             }
2243071c4061Sr-near             _ => Err(format_err!(CodeGenError::unsupported_wasm_type())),
2244071c4061Sr-near         }
2245071c4061Sr-near     }
2246071c4061Sr-near 
visit_ref_is_null(&mut self) -> Self::Output2247071c4061Sr-near     fn visit_ref_is_null(&mut self) -> Self::Output {
2248071c4061Sr-near         let (zero, size) = match self.env.ptr_type() {
2249071c4061Sr-near             WasmValType::I64 => (RegImm::i64(0), OperandSize::S64),
2250071c4061Sr-near             WasmValType::I32 => (RegImm::i32(0), OperandSize::S32),
2251071c4061Sr-near             _ => bail!(CodeGenError::unsupported_wasm_type()),
2252071c4061Sr-near         };
2253071c4061Sr-near         self.context.unop(self.masm, |masm, reg| {
2254071c4061Sr-near             masm.cmp_with_set(writable!(reg), zero, IntCmpKind::Eq, size)?;
2255071c4061Sr-near             Ok(TypedReg::i32(reg))
2256071c4061Sr-near         })
2257071c4061Sr-near     }
2258071c4061Sr-near 
visit_ref_func(&mut self, function_index: u32) -> Self::Output2259071c4061Sr-near     fn visit_ref_func(&mut self, function_index: u32) -> Self::Output {
2260071c4061Sr-near         let ref_func = self.env.builtins.ref_func::<M::ABI>()?;
2261071c4061Sr-near         self.context.stack.extend([function_index.try_into()?]);
2262071c4061Sr-near         FnCall::emit::<M>(
2263071c4061Sr-near             &mut self.env,
2264071c4061Sr-near             self.masm,
2265071c4061Sr-near             &mut self.context,
2266071c4061Sr-near             Callee::Builtin(ref_func),
2267071c4061Sr-near         )
2268071c4061Sr-near     }
2269071c4061Sr-near 
visit_i32_load(&mut self, memarg: MemArg) -> Self::Output2270b93e1bc0SSaúl Cabrera     fn visit_i32_load(&mut self, memarg: MemArg) -> Self::Output {
22718b42faf4Sad hoc         self.emit_wasm_load(
22728b42faf4Sad hoc             &memarg,
22738b42faf4Sad hoc             WasmValType::I32,
2274bb5e4bbaSSaúl Cabrera             LoadKind::Operand(OperandSize::S32),
22758b42faf4Sad hoc         )
227683cf7438SSaúl Cabrera     }
227783cf7438SSaúl Cabrera 
visit_i32_load8_s(&mut self, memarg: MemArg) -> Self::Output2278b93e1bc0SSaúl Cabrera     fn visit_i32_load8_s(&mut self, memarg: MemArg) -> Self::Output {
227983cf7438SSaúl Cabrera         self.emit_wasm_load(
228083cf7438SSaúl Cabrera             &memarg,
228183cf7438SSaúl Cabrera             WasmValType::I32,
2282362568b4Sad hoc             LoadKind::ScalarExtend(Extend::<Signed>::I32Extend8.into()),
2283b93e1bc0SSaúl Cabrera         )
228483cf7438SSaúl Cabrera     }
228583cf7438SSaúl Cabrera 
visit_i32_load8_u(&mut self, memarg: MemArg) -> Self::Output2286b93e1bc0SSaúl Cabrera     fn visit_i32_load8_u(&mut self, memarg: MemArg) -> Self::Output {
22878b42faf4Sad hoc         self.emit_wasm_load(
22888b42faf4Sad hoc             &memarg,
22898b42faf4Sad hoc             WasmValType::I32,
2290362568b4Sad hoc             LoadKind::ScalarExtend(Extend::<Zero>::I32Extend8.into()),
22918b42faf4Sad hoc         )
229283cf7438SSaúl Cabrera     }
229383cf7438SSaúl Cabrera 
visit_i32_load16_s(&mut self, memarg: MemArg) -> Self::Output2294b93e1bc0SSaúl Cabrera     fn visit_i32_load16_s(&mut self, memarg: MemArg) -> Self::Output {
229583cf7438SSaúl Cabrera         self.emit_wasm_load(
229683cf7438SSaúl Cabrera             &memarg,
229783cf7438SSaúl Cabrera             WasmValType::I32,
2298362568b4Sad hoc             LoadKind::ScalarExtend(Extend::<Signed>::I32Extend16.into()),
229983cf7438SSaúl Cabrera         )
230083cf7438SSaúl Cabrera     }
230183cf7438SSaúl Cabrera 
visit_i32_load16_u(&mut self, memarg: MemArg) -> Self::Output2302b93e1bc0SSaúl Cabrera     fn visit_i32_load16_u(&mut self, memarg: MemArg) -> Self::Output {
23038b42faf4Sad hoc         self.emit_wasm_load(
23048b42faf4Sad hoc             &memarg,
23058b42faf4Sad hoc             WasmValType::I32,
2306362568b4Sad hoc             LoadKind::ScalarExtend(Extend::<Zero>::I32Extend16.into()),
23078b42faf4Sad hoc         )
230883cf7438SSaúl Cabrera     }
230983cf7438SSaúl Cabrera 
visit_i32_store(&mut self, memarg: MemArg) -> Self::Output2310b93e1bc0SSaúl Cabrera     fn visit_i32_store(&mut self, memarg: MemArg) -> Self::Output {
2311cb195e54Sad hoc         self.emit_wasm_store(&memarg, StoreKind::Operand(OperandSize::S32))
231283cf7438SSaúl Cabrera     }
231383cf7438SSaúl Cabrera 
visit_i32_store8(&mut self, memarg: MemArg) -> Self::Output2314b93e1bc0SSaúl Cabrera     fn visit_i32_store8(&mut self, memarg: MemArg) -> Self::Output {
2315cb195e54Sad hoc         self.emit_wasm_store(&memarg, StoreKind::Operand(OperandSize::S8))
231683cf7438SSaúl Cabrera     }
231783cf7438SSaúl Cabrera 
visit_i32_store16(&mut self, memarg: MemArg) -> Self::Output2318b93e1bc0SSaúl Cabrera     fn visit_i32_store16(&mut self, memarg: MemArg) -> Self::Output {
2319cb195e54Sad hoc         self.emit_wasm_store(&memarg, StoreKind::Operand(OperandSize::S16))
232083cf7438SSaúl Cabrera     }
232183cf7438SSaúl Cabrera 
visit_i64_load8_s(&mut self, memarg: MemArg) -> Self::Output2322b93e1bc0SSaúl Cabrera     fn visit_i64_load8_s(&mut self, memarg: MemArg) -> Self::Output {
232383cf7438SSaúl Cabrera         self.emit_wasm_load(
232483cf7438SSaúl Cabrera             &memarg,
232583cf7438SSaúl Cabrera             WasmValType::I64,
2326362568b4Sad hoc             LoadKind::ScalarExtend(Extend::<Signed>::I64Extend8.into()),
232783cf7438SSaúl Cabrera         )
232883cf7438SSaúl Cabrera     }
232983cf7438SSaúl Cabrera 
visit_i64_load8_u(&mut self, memarg: MemArg) -> Self::Output2330b93e1bc0SSaúl Cabrera     fn visit_i64_load8_u(&mut self, memarg: MemArg) -> Self::Output {
23318b42faf4Sad hoc         self.emit_wasm_load(
23328b42faf4Sad hoc             &memarg,
23338b42faf4Sad hoc             WasmValType::I64,
2334362568b4Sad hoc             LoadKind::ScalarExtend(Extend::<Zero>::I64Extend8.into()),
23358b42faf4Sad hoc         )
233683cf7438SSaúl Cabrera     }
233783cf7438SSaúl Cabrera 
visit_i64_load16_u(&mut self, memarg: MemArg) -> Self::Output2338b93e1bc0SSaúl Cabrera     fn visit_i64_load16_u(&mut self, memarg: MemArg) -> Self::Output {
23398b42faf4Sad hoc         self.emit_wasm_load(
23408b42faf4Sad hoc             &memarg,
23418b42faf4Sad hoc             WasmValType::I64,
2342362568b4Sad hoc             LoadKind::ScalarExtend(Extend::<Zero>::I64Extend16.into()),
23438b42faf4Sad hoc         )
234483cf7438SSaúl Cabrera     }
234583cf7438SSaúl Cabrera 
visit_i64_load16_s(&mut self, memarg: MemArg) -> Self::Output2346b93e1bc0SSaúl Cabrera     fn visit_i64_load16_s(&mut self, memarg: MemArg) -> Self::Output {
234783cf7438SSaúl Cabrera         self.emit_wasm_load(
234883cf7438SSaúl Cabrera             &memarg,
234983cf7438SSaúl Cabrera             WasmValType::I64,
2350362568b4Sad hoc             LoadKind::ScalarExtend(Extend::<Signed>::I64Extend16.into()),
235183cf7438SSaúl Cabrera         )
235283cf7438SSaúl Cabrera     }
235383cf7438SSaúl Cabrera 
visit_i64_load32_u(&mut self, memarg: MemArg) -> Self::Output2354b93e1bc0SSaúl Cabrera     fn visit_i64_load32_u(&mut self, memarg: MemArg) -> Self::Output {
23558b42faf4Sad hoc         self.emit_wasm_load(
23568b42faf4Sad hoc             &memarg,
23578b42faf4Sad hoc             WasmValType::I64,
2358362568b4Sad hoc             LoadKind::ScalarExtend(Extend::<Zero>::I64Extend32.into()),
23598b42faf4Sad hoc         )
236083cf7438SSaúl Cabrera     }
236183cf7438SSaúl Cabrera 
visit_i64_load32_s(&mut self, memarg: MemArg) -> Self::Output2362b93e1bc0SSaúl Cabrera     fn visit_i64_load32_s(&mut self, memarg: MemArg) -> Self::Output {
236383cf7438SSaúl Cabrera         self.emit_wasm_load(
236483cf7438SSaúl Cabrera             &memarg,
236583cf7438SSaúl Cabrera             WasmValType::I64,
2366362568b4Sad hoc             LoadKind::ScalarExtend(Extend::<Signed>::I64Extend32.into()),
236783cf7438SSaúl Cabrera         )
236883cf7438SSaúl Cabrera     }
236983cf7438SSaúl Cabrera 
visit_i64_load(&mut self, memarg: MemArg) -> Self::Output2370b93e1bc0SSaúl Cabrera     fn visit_i64_load(&mut self, memarg: MemArg) -> Self::Output {
23718b42faf4Sad hoc         self.emit_wasm_load(
23728b42faf4Sad hoc             &memarg,
23738b42faf4Sad hoc             WasmValType::I64,
2374bb5e4bbaSSaúl Cabrera             LoadKind::Operand(OperandSize::S64),
23758b42faf4Sad hoc         )
237683cf7438SSaúl Cabrera     }
237783cf7438SSaúl Cabrera 
visit_i64_store(&mut self, memarg: MemArg) -> Self::Output237883cf7438SSaúl Cabrera     fn visit_i64_store(&mut self, memarg: MemArg) -> Self::Output {
2379cb195e54Sad hoc         self.emit_wasm_store(&memarg, StoreKind::Operand(OperandSize::S64))
238083cf7438SSaúl Cabrera     }
238183cf7438SSaúl Cabrera 
visit_i64_store8(&mut self, memarg: MemArg) -> Self::Output238283cf7438SSaúl Cabrera     fn visit_i64_store8(&mut self, memarg: MemArg) -> Self::Output {
2383cb195e54Sad hoc         self.emit_wasm_store(&memarg, StoreKind::Operand(OperandSize::S8))
238483cf7438SSaúl Cabrera     }
238583cf7438SSaúl Cabrera 
visit_i64_store16(&mut self, memarg: MemArg) -> Self::Output238683cf7438SSaúl Cabrera     fn visit_i64_store16(&mut self, memarg: MemArg) -> Self::Output {
2387cb195e54Sad hoc         self.emit_wasm_store(&memarg, StoreKind::Operand(OperandSize::S16))
238883cf7438SSaúl Cabrera     }
238983cf7438SSaúl Cabrera 
visit_i64_store32(&mut self, memarg: MemArg) -> Self::Output239083cf7438SSaúl Cabrera     fn visit_i64_store32(&mut self, memarg: MemArg) -> Self::Output {
2391cb195e54Sad hoc         self.emit_wasm_store(&memarg, StoreKind::Operand(OperandSize::S32))
239283cf7438SSaúl Cabrera     }
239383cf7438SSaúl Cabrera 
visit_f32_load(&mut self, memarg: MemArg) -> Self::Output2394b93e1bc0SSaúl Cabrera     fn visit_f32_load(&mut self, memarg: MemArg) -> Self::Output {
23958b42faf4Sad hoc         self.emit_wasm_load(
23968b42faf4Sad hoc             &memarg,
23978b42faf4Sad hoc             WasmValType::F32,
2398bb5e4bbaSSaúl Cabrera             LoadKind::Operand(OperandSize::S32),
23998b42faf4Sad hoc         )
240083cf7438SSaúl Cabrera     }
240183cf7438SSaúl Cabrera 
visit_f32_store(&mut self, memarg: MemArg) -> Self::Output2402b93e1bc0SSaúl Cabrera     fn visit_f32_store(&mut self, memarg: MemArg) -> Self::Output {
2403cb195e54Sad hoc         self.emit_wasm_store(&memarg, StoreKind::Operand(OperandSize::S32))
240483cf7438SSaúl Cabrera     }
240583cf7438SSaúl Cabrera 
visit_f64_load(&mut self, memarg: MemArg) -> Self::Output2406b93e1bc0SSaúl Cabrera     fn visit_f64_load(&mut self, memarg: MemArg) -> Self::Output {
24078b42faf4Sad hoc         self.emit_wasm_load(
24088b42faf4Sad hoc             &memarg,
24098b42faf4Sad hoc             WasmValType::F64,
2410bb5e4bbaSSaúl Cabrera             LoadKind::Operand(OperandSize::S64),
24118b42faf4Sad hoc         )
241283cf7438SSaúl Cabrera     }
241383cf7438SSaúl Cabrera 
visit_f64_store(&mut self, memarg: MemArg) -> Self::Output2414b93e1bc0SSaúl Cabrera     fn visit_f64_store(&mut self, memarg: MemArg) -> Self::Output {
2415cb195e54Sad hoc         self.emit_wasm_store(&memarg, StoreKind::Operand(OperandSize::S64))
241683cf7438SSaúl Cabrera     }
241783cf7438SSaúl Cabrera 
visit_i32_trunc_sat_f32_s(&mut self) -> Self::Output2418b93e1bc0SSaúl Cabrera     fn visit_i32_trunc_sat_f32_s(&mut self) -> Self::Output {
24192c6f3862SSaúl Cabrera         use OperandSize::*;
24202c6f3862SSaúl Cabrera 
24212c6f3862SSaúl Cabrera         self.context
24222c6f3862SSaúl Cabrera             .convert_op(self.masm, WasmValType::I32, |masm, dst, src, dst_size| {
2423b93e1bc0SSaúl Cabrera                 masm.signed_truncate(writable!(dst), src, S32, dst_size, TruncKind::Checked)
2424b93e1bc0SSaúl Cabrera             })
24252c6f3862SSaúl Cabrera     }
24262c6f3862SSaúl Cabrera 
visit_i32_trunc_sat_f32_u(&mut self) -> Self::Output2427b93e1bc0SSaúl Cabrera     fn visit_i32_trunc_sat_f32_u(&mut self) -> Self::Output {
24282c6f3862SSaúl Cabrera         use OperandSize::*;
24292c6f3862SSaúl Cabrera 
2430f309bfddSad hoc         self.masm
2431f309bfddSad hoc             .unsigned_truncate(&mut self.context, S32, S32, TruncKind::Checked)
24322c6f3862SSaúl Cabrera     }
24332c6f3862SSaúl Cabrera 
visit_i32_trunc_sat_f64_s(&mut self) -> Self::Output2434b93e1bc0SSaúl Cabrera     fn visit_i32_trunc_sat_f64_s(&mut self) -> Self::Output {
24352c6f3862SSaúl Cabrera         use OperandSize::*;
24362c6f3862SSaúl Cabrera 
24372c6f3862SSaúl Cabrera         self.context
24382c6f3862SSaúl Cabrera             .convert_op(self.masm, WasmValType::I32, |masm, dst, src, dst_size| {
2439b93e1bc0SSaúl Cabrera                 masm.signed_truncate(writable!(dst), src, S64, dst_size, TruncKind::Checked)
2440b93e1bc0SSaúl Cabrera             })
24412c6f3862SSaúl Cabrera     }
24422c6f3862SSaúl Cabrera 
visit_i32_trunc_sat_f64_u(&mut self) -> Self::Output2443b93e1bc0SSaúl Cabrera     fn visit_i32_trunc_sat_f64_u(&mut self) -> Self::Output {
24442c6f3862SSaúl Cabrera         use OperandSize::*;
24452c6f3862SSaúl Cabrera 
2446f309bfddSad hoc         self.masm
2447f309bfddSad hoc             .unsigned_truncate(&mut self.context, S64, S32, TruncKind::Checked)
24482c6f3862SSaúl Cabrera     }
24492c6f3862SSaúl Cabrera 
visit_i64_trunc_sat_f32_s(&mut self) -> Self::Output2450b93e1bc0SSaúl Cabrera     fn visit_i64_trunc_sat_f32_s(&mut self) -> Self::Output {
24512c6f3862SSaúl Cabrera         use OperandSize::*;
24522c6f3862SSaúl Cabrera 
24532c6f3862SSaúl Cabrera         self.context
24542c6f3862SSaúl Cabrera             .convert_op(self.masm, WasmValType::I64, |masm, dst, src, dst_size| {
2455b93e1bc0SSaúl Cabrera                 masm.signed_truncate(writable!(dst), src, S32, dst_size, TruncKind::Checked)
2456b93e1bc0SSaúl Cabrera             })
24572c6f3862SSaúl Cabrera     }
24582c6f3862SSaúl Cabrera 
visit_i64_trunc_sat_f32_u(&mut self) -> Self::Output2459b93e1bc0SSaúl Cabrera     fn visit_i64_trunc_sat_f32_u(&mut self) -> Self::Output {
24602c6f3862SSaúl Cabrera         use OperandSize::*;
24612c6f3862SSaúl Cabrera 
2462f309bfddSad hoc         self.masm
2463f309bfddSad hoc             .unsigned_truncate(&mut self.context, S32, S64, TruncKind::Checked)
24642c6f3862SSaúl Cabrera     }
24652c6f3862SSaúl Cabrera 
visit_i64_trunc_sat_f64_s(&mut self) -> Self::Output2466b93e1bc0SSaúl Cabrera     fn visit_i64_trunc_sat_f64_s(&mut self) -> Self::Output {
24672c6f3862SSaúl Cabrera         use OperandSize::*;
24682c6f3862SSaúl Cabrera 
24692c6f3862SSaúl Cabrera         self.context
24702c6f3862SSaúl Cabrera             .convert_op(self.masm, WasmValType::I64, |masm, dst, src, dst_size| {
2471b93e1bc0SSaúl Cabrera                 masm.signed_truncate(writable!(dst), src, S64, dst_size, TruncKind::Checked)
2472b93e1bc0SSaúl Cabrera             })
24732c6f3862SSaúl Cabrera     }
24742c6f3862SSaúl Cabrera 
visit_i64_trunc_sat_f64_u(&mut self) -> Self::Output2475b93e1bc0SSaúl Cabrera     fn visit_i64_trunc_sat_f64_u(&mut self) -> Self::Output {
24762c6f3862SSaúl Cabrera         use OperandSize::*;
24772c6f3862SSaúl Cabrera 
2478f309bfddSad hoc         self.masm
2479f309bfddSad hoc             .unsigned_truncate(&mut self.context, S64, S64, TruncKind::Checked)
24802c6f3862SSaúl Cabrera     }
24812c6f3862SSaúl Cabrera 
visit_i64_add128(&mut self) -> Self::Output2482b93e1bc0SSaúl Cabrera     fn visit_i64_add128(&mut self) -> Self::Output {
2483c42f925fSAlex Crichton         self.context
2484c42f925fSAlex Crichton             .binop128(self.masm, |masm, lhs_lo, lhs_hi, rhs_lo, rhs_hi| {
2485c42f925fSAlex Crichton                 masm.add128(
2486c42f925fSAlex Crichton                     writable!(lhs_lo),
2487c42f925fSAlex Crichton                     writable!(lhs_hi),
2488c42f925fSAlex Crichton                     lhs_lo,
2489c42f925fSAlex Crichton                     lhs_hi,
2490c42f925fSAlex Crichton                     rhs_lo,
2491c42f925fSAlex Crichton                     rhs_hi,
2492b93e1bc0SSaúl Cabrera                 )?;
2493b93e1bc0SSaúl Cabrera                 Ok((TypedReg::i64(lhs_lo), TypedReg::i64(lhs_hi)))
2494b93e1bc0SSaúl Cabrera             })
2495c42f925fSAlex Crichton     }
2496c42f925fSAlex Crichton 
visit_i64_sub128(&mut self) -> Self::Output2497b93e1bc0SSaúl Cabrera     fn visit_i64_sub128(&mut self) -> Self::Output {
2498c42f925fSAlex Crichton         self.context
2499c42f925fSAlex Crichton             .binop128(self.masm, |masm, lhs_lo, lhs_hi, rhs_lo, rhs_hi| {
2500c42f925fSAlex Crichton                 masm.sub128(
2501c42f925fSAlex Crichton                     writable!(lhs_lo),
2502c42f925fSAlex Crichton                     writable!(lhs_hi),
2503c42f925fSAlex Crichton                     lhs_lo,
2504c42f925fSAlex Crichton                     lhs_hi,
2505c42f925fSAlex Crichton                     rhs_lo,
2506c42f925fSAlex Crichton                     rhs_hi,
2507b93e1bc0SSaúl Cabrera                 )?;
2508b93e1bc0SSaúl Cabrera                 Ok((TypedReg::i64(lhs_lo), TypedReg::i64(lhs_hi)))
2509b93e1bc0SSaúl Cabrera             })
2510c42f925fSAlex Crichton     }
2511c42f925fSAlex Crichton 
visit_i64_mul_wide_s(&mut self) -> Self::Output2512b93e1bc0SSaúl Cabrera     fn visit_i64_mul_wide_s(&mut self) -> Self::Output {
2513b93e1bc0SSaúl Cabrera         self.masm.mul_wide(&mut self.context, MulWideKind::Signed)
2514c42f925fSAlex Crichton     }
2515c42f925fSAlex Crichton 
visit_i64_mul_wide_u(&mut self) -> Self::Output2516b93e1bc0SSaúl Cabrera     fn visit_i64_mul_wide_u(&mut self) -> Self::Output {
2517b93e1bc0SSaúl Cabrera         self.masm.mul_wide(&mut self.context, MulWideKind::Unsigned)
2518c42f925fSAlex Crichton     }
2519c42f925fSAlex Crichton 
visit_i32_atomic_load8_u(&mut self, memarg: MemArg) -> Self::Output25203a4cf0acSad hoc     fn visit_i32_atomic_load8_u(&mut self, memarg: MemArg) -> Self::Output {
25218b42faf4Sad hoc         self.emit_wasm_load(
25228b42faf4Sad hoc             &memarg,
25238b42faf4Sad hoc             WasmValType::I32,
2524cb195e54Sad hoc             LoadKind::Atomic(OperandSize::S8, Some(Extend::<Zero>::I32Extend8.into())),
25258b42faf4Sad hoc         )
25268b42faf4Sad hoc     }
25278b42faf4Sad hoc 
visit_i32_atomic_load16_u(&mut self, memarg: MemArg) -> Self::Output25283a4cf0acSad hoc     fn visit_i32_atomic_load16_u(&mut self, memarg: MemArg) -> Self::Output {
25298b42faf4Sad hoc         self.emit_wasm_load(
25308b42faf4Sad hoc             &memarg,
25318b42faf4Sad hoc             WasmValType::I32,
2532cb195e54Sad hoc             LoadKind::Atomic(OperandSize::S16, Some(Extend::<Zero>::I32Extend16.into())),
25338b42faf4Sad hoc         )
25348b42faf4Sad hoc     }
25358b42faf4Sad hoc 
visit_i32_atomic_load(&mut self, memarg: MemArg) -> Self::Output25363a4cf0acSad hoc     fn visit_i32_atomic_load(&mut self, memarg: MemArg) -> Self::Output {
25378b42faf4Sad hoc         self.emit_wasm_load(
25388b42faf4Sad hoc             &memarg,
25398b42faf4Sad hoc             WasmValType::I32,
2540cb195e54Sad hoc             LoadKind::Atomic(OperandSize::S32, None),
25418b42faf4Sad hoc         )
25428b42faf4Sad hoc     }
25438b42faf4Sad hoc 
visit_i64_atomic_load8_u(&mut self, memarg: MemArg) -> Self::Output25443a4cf0acSad hoc     fn visit_i64_atomic_load8_u(&mut self, memarg: MemArg) -> Self::Output {
25458b42faf4Sad hoc         self.emit_wasm_load(
25468b42faf4Sad hoc             &memarg,
25478b42faf4Sad hoc             WasmValType::I64,
2548cb195e54Sad hoc             LoadKind::Atomic(OperandSize::S8, Some(Extend::<Zero>::I64Extend8.into())),
25498b42faf4Sad hoc         )
25508b42faf4Sad hoc     }
25518b42faf4Sad hoc 
visit_i64_atomic_load16_u(&mut self, memarg: MemArg) -> Self::Output25523a4cf0acSad hoc     fn visit_i64_atomic_load16_u(&mut self, memarg: MemArg) -> Self::Output {
25538b42faf4Sad hoc         self.emit_wasm_load(
25548b42faf4Sad hoc             &memarg,
25558b42faf4Sad hoc             WasmValType::I64,
2556cb195e54Sad hoc             LoadKind::Atomic(OperandSize::S16, Some(Extend::<Zero>::I64Extend16.into())),
25578b42faf4Sad hoc         )
25588b42faf4Sad hoc     }
25598b42faf4Sad hoc 
visit_i64_atomic_load32_u(&mut self, memarg: MemArg) -> Self::Output25603a4cf0acSad hoc     fn visit_i64_atomic_load32_u(&mut self, memarg: MemArg) -> Self::Output {
25618b42faf4Sad hoc         self.emit_wasm_load(
25628b42faf4Sad hoc             &memarg,
25638b42faf4Sad hoc             WasmValType::I64,
2564cb195e54Sad hoc             LoadKind::Atomic(OperandSize::S32, Some(Extend::<Zero>::I64Extend32.into())),
25658b42faf4Sad hoc         )
25668b42faf4Sad hoc     }
25678b42faf4Sad hoc 
visit_i64_atomic_load(&mut self, memarg: MemArg) -> Self::Output25683a4cf0acSad hoc     fn visit_i64_atomic_load(&mut self, memarg: MemArg) -> Self::Output {
25698b42faf4Sad hoc         self.emit_wasm_load(
25708b42faf4Sad hoc             &memarg,
25718b42faf4Sad hoc             WasmValType::I64,
2572cb195e54Sad hoc             LoadKind::Atomic(OperandSize::S64, None),
25738b42faf4Sad hoc         )
25748b42faf4Sad hoc     }
25758b42faf4Sad hoc 
visit_i32_atomic_store(&mut self, memarg: MemArg) -> Self::Output25763a4cf0acSad hoc     fn visit_i32_atomic_store(&mut self, memarg: MemArg) -> Self::Output {
2577cb195e54Sad hoc         self.emit_wasm_store(&memarg, StoreKind::Atomic(OperandSize::S32))
25783a4cf0acSad hoc     }
25793a4cf0acSad hoc 
visit_i64_atomic_store(&mut self, memarg: MemArg) -> Self::Output25803a4cf0acSad hoc     fn visit_i64_atomic_store(&mut self, memarg: MemArg) -> Self::Output {
2581cb195e54Sad hoc         self.emit_wasm_store(&memarg, StoreKind::Atomic(OperandSize::S64))
25823a4cf0acSad hoc     }
25833a4cf0acSad hoc 
visit_i32_atomic_store8(&mut self, memarg: MemArg) -> Self::Output25843a4cf0acSad hoc     fn visit_i32_atomic_store8(&mut self, memarg: MemArg) -> Self::Output {
2585cb195e54Sad hoc         self.emit_wasm_store(&memarg, StoreKind::Atomic(OperandSize::S8))
25863a4cf0acSad hoc     }
25873a4cf0acSad hoc 
visit_i32_atomic_store16(&mut self, memarg: MemArg) -> Self::Output25883a4cf0acSad hoc     fn visit_i32_atomic_store16(&mut self, memarg: MemArg) -> Self::Output {
2589cb195e54Sad hoc         self.emit_wasm_store(&memarg, StoreKind::Atomic(OperandSize::S16))
25903a4cf0acSad hoc     }
25913a4cf0acSad hoc 
visit_i64_atomic_store8(&mut self, memarg: MemArg) -> Self::Output25923a4cf0acSad hoc     fn visit_i64_atomic_store8(&mut self, memarg: MemArg) -> Self::Output {
2593cb195e54Sad hoc         self.emit_wasm_store(&memarg, StoreKind::Atomic(OperandSize::S8))
25943a4cf0acSad hoc     }
25953a4cf0acSad hoc 
visit_i64_atomic_store16(&mut self, memarg: MemArg) -> Self::Output25963a4cf0acSad hoc     fn visit_i64_atomic_store16(&mut self, memarg: MemArg) -> Self::Output {
2597cb195e54Sad hoc         self.emit_wasm_store(&memarg, StoreKind::Atomic(OperandSize::S16))
25983a4cf0acSad hoc     }
25993a4cf0acSad hoc 
visit_i64_atomic_store32(&mut self, memarg: MemArg) -> Self::Output26003a4cf0acSad hoc     fn visit_i64_atomic_store32(&mut self, memarg: MemArg) -> Self::Output {
2601cb195e54Sad hoc         self.emit_wasm_store(&memarg, StoreKind::Atomic(OperandSize::S32))
26023a4cf0acSad hoc     }
26033a4cf0acSad hoc 
visit_i32_atomic_rmw8_add_u(&mut self, arg: MemArg) -> Self::Output26040a4dcc4eSad hoc     fn visit_i32_atomic_rmw8_add_u(&mut self, arg: MemArg) -> Self::Output {
26050a4dcc4eSad hoc         self.emit_atomic_rmw(
26060a4dcc4eSad hoc             &arg,
26070a4dcc4eSad hoc             RmwOp::Add,
26080a4dcc4eSad hoc             OperandSize::S8,
2609362568b4Sad hoc             Some(Extend::<Zero>::I32Extend8),
26100a4dcc4eSad hoc         )
26110a4dcc4eSad hoc     }
26120a4dcc4eSad hoc 
visit_i32_atomic_rmw16_add_u(&mut self, arg: MemArg) -> Self::Output26130a4dcc4eSad hoc     fn visit_i32_atomic_rmw16_add_u(&mut self, arg: MemArg) -> Self::Output {
26140a4dcc4eSad hoc         self.emit_atomic_rmw(
26150a4dcc4eSad hoc             &arg,
26160a4dcc4eSad hoc             RmwOp::Add,
26170a4dcc4eSad hoc             OperandSize::S16,
2618362568b4Sad hoc             Some(Extend::<Zero>::I32Extend16),
26190a4dcc4eSad hoc         )
26200a4dcc4eSad hoc     }
26210a4dcc4eSad hoc 
visit_i32_atomic_rmw_add(&mut self, arg: MemArg) -> Self::Output26220a4dcc4eSad hoc     fn visit_i32_atomic_rmw_add(&mut self, arg: MemArg) -> Self::Output {
26230a4dcc4eSad hoc         self.emit_atomic_rmw(&arg, RmwOp::Add, OperandSize::S32, None)
26240a4dcc4eSad hoc     }
26250a4dcc4eSad hoc 
visit_i64_atomic_rmw8_add_u(&mut self, arg: MemArg) -> Self::Output26260a4dcc4eSad hoc     fn visit_i64_atomic_rmw8_add_u(&mut self, arg: MemArg) -> Self::Output {
26270a4dcc4eSad hoc         self.emit_atomic_rmw(
26280a4dcc4eSad hoc             &arg,
26290a4dcc4eSad hoc             RmwOp::Add,
26300a4dcc4eSad hoc             OperandSize::S8,
2631362568b4Sad hoc             Some(Extend::<Zero>::I64Extend8),
26320a4dcc4eSad hoc         )
26330a4dcc4eSad hoc     }
26340a4dcc4eSad hoc 
visit_i64_atomic_rmw16_add_u(&mut self, arg: MemArg) -> Self::Output26350a4dcc4eSad hoc     fn visit_i64_atomic_rmw16_add_u(&mut self, arg: MemArg) -> Self::Output {
26360a4dcc4eSad hoc         self.emit_atomic_rmw(
26370a4dcc4eSad hoc             &arg,
26380a4dcc4eSad hoc             RmwOp::Add,
26390a4dcc4eSad hoc             OperandSize::S16,
2640362568b4Sad hoc             Some(Extend::<Zero>::I64Extend16),
26410a4dcc4eSad hoc         )
26420a4dcc4eSad hoc     }
26430a4dcc4eSad hoc 
visit_i64_atomic_rmw32_add_u(&mut self, arg: MemArg) -> Self::Output26440a4dcc4eSad hoc     fn visit_i64_atomic_rmw32_add_u(&mut self, arg: MemArg) -> Self::Output {
2645c72de0bfSad hoc         self.emit_atomic_rmw(
2646c72de0bfSad hoc             &arg,
2647c72de0bfSad hoc             RmwOp::Add,
2648c72de0bfSad hoc             OperandSize::S32,
2649362568b4Sad hoc             Some(Extend::<Zero>::I64Extend32),
2650c72de0bfSad hoc         )
26510a4dcc4eSad hoc     }
26520a4dcc4eSad hoc 
visit_i64_atomic_rmw_add(&mut self, arg: MemArg) -> Self::Output26530a4dcc4eSad hoc     fn visit_i64_atomic_rmw_add(&mut self, arg: MemArg) -> Self::Output {
26540a4dcc4eSad hoc         self.emit_atomic_rmw(&arg, RmwOp::Add, OperandSize::S64, None)
26550a4dcc4eSad hoc     }
26560a4dcc4eSad hoc 
visit_i32_atomic_rmw8_sub_u(&mut self, arg: MemArg) -> Self::Output2657c72de0bfSad hoc     fn visit_i32_atomic_rmw8_sub_u(&mut self, arg: MemArg) -> Self::Output {
2658c72de0bfSad hoc         self.emit_atomic_rmw(
2659c72de0bfSad hoc             &arg,
2660c72de0bfSad hoc             RmwOp::Sub,
2661c72de0bfSad hoc             OperandSize::S8,
2662362568b4Sad hoc             Some(Extend::<Zero>::I32Extend8),
2663c72de0bfSad hoc         )
2664c72de0bfSad hoc     }
visit_i32_atomic_rmw16_sub_u(&mut self, arg: MemArg) -> Self::Output2665c72de0bfSad hoc     fn visit_i32_atomic_rmw16_sub_u(&mut self, arg: MemArg) -> Self::Output {
2666c72de0bfSad hoc         self.emit_atomic_rmw(
2667c72de0bfSad hoc             &arg,
2668c72de0bfSad hoc             RmwOp::Sub,
2669c72de0bfSad hoc             OperandSize::S16,
2670362568b4Sad hoc             Some(Extend::<Zero>::I32Extend16),
2671c72de0bfSad hoc         )
2672c72de0bfSad hoc     }
2673c72de0bfSad hoc 
visit_i32_atomic_rmw_sub(&mut self, arg: MemArg) -> Self::Output2674146aa476Sad hoc     fn visit_i32_atomic_rmw_sub(&mut self, arg: MemArg) -> Self::Output {
2675146aa476Sad hoc         self.emit_atomic_rmw(&arg, RmwOp::Sub, OperandSize::S32, None)
2676146aa476Sad hoc     }
2677146aa476Sad hoc 
visit_i64_atomic_rmw8_sub_u(&mut self, arg: MemArg) -> Self::Output2678c72de0bfSad hoc     fn visit_i64_atomic_rmw8_sub_u(&mut self, arg: MemArg) -> Self::Output {
2679c72de0bfSad hoc         self.emit_atomic_rmw(
2680c72de0bfSad hoc             &arg,
2681c72de0bfSad hoc             RmwOp::Sub,
2682c72de0bfSad hoc             OperandSize::S8,
2683362568b4Sad hoc             Some(Extend::<Zero>::I64Extend8),
2684c72de0bfSad hoc         )
2685c72de0bfSad hoc     }
2686c72de0bfSad hoc 
visit_i64_atomic_rmw16_sub_u(&mut self, arg: MemArg) -> Self::Output2687c72de0bfSad hoc     fn visit_i64_atomic_rmw16_sub_u(&mut self, arg: MemArg) -> Self::Output {
2688c72de0bfSad hoc         self.emit_atomic_rmw(
2689c72de0bfSad hoc             &arg,
2690c72de0bfSad hoc             RmwOp::Sub,
2691c72de0bfSad hoc             OperandSize::S16,
2692362568b4Sad hoc             Some(Extend::<Zero>::I64Extend16),
2693c72de0bfSad hoc         )
2694c72de0bfSad hoc     }
2695c72de0bfSad hoc 
visit_i64_atomic_rmw32_sub_u(&mut self, arg: MemArg) -> Self::Output2696c72de0bfSad hoc     fn visit_i64_atomic_rmw32_sub_u(&mut self, arg: MemArg) -> Self::Output {
2697c72de0bfSad hoc         self.emit_atomic_rmw(
2698c72de0bfSad hoc             &arg,
2699c72de0bfSad hoc             RmwOp::Sub,
2700c72de0bfSad hoc             OperandSize::S32,
2701362568b4Sad hoc             Some(Extend::<Zero>::I64Extend32),
2702c72de0bfSad hoc         )
2703c72de0bfSad hoc     }
2704c72de0bfSad hoc 
visit_i64_atomic_rmw_sub(&mut self, arg: MemArg) -> Self::Output2705146aa476Sad hoc     fn visit_i64_atomic_rmw_sub(&mut self, arg: MemArg) -> Self::Output {
2706146aa476Sad hoc         self.emit_atomic_rmw(&arg, RmwOp::Sub, OperandSize::S64, None)
2707146aa476Sad hoc     }
2708146aa476Sad hoc 
visit_i32_atomic_rmw8_xchg_u(&mut self, arg: MemArg) -> Self::Output2709146aa476Sad hoc     fn visit_i32_atomic_rmw8_xchg_u(&mut self, arg: MemArg) -> Self::Output {
2710146aa476Sad hoc         self.emit_atomic_rmw(
2711146aa476Sad hoc             &arg,
2712146aa476Sad hoc             RmwOp::Xchg,
2713146aa476Sad hoc             OperandSize::S8,
2714362568b4Sad hoc             Some(Extend::<Zero>::I32Extend8),
2715146aa476Sad hoc         )
2716146aa476Sad hoc     }
2717146aa476Sad hoc 
visit_i32_atomic_rmw16_xchg_u(&mut self, arg: MemArg) -> Self::Output2718146aa476Sad hoc     fn visit_i32_atomic_rmw16_xchg_u(&mut self, arg: MemArg) -> Self::Output {
2719146aa476Sad hoc         self.emit_atomic_rmw(
2720146aa476Sad hoc             &arg,
2721146aa476Sad hoc             RmwOp::Xchg,
2722146aa476Sad hoc             OperandSize::S16,
2723362568b4Sad hoc             Some(Extend::<Zero>::I32Extend16),
2724146aa476Sad hoc         )
2725146aa476Sad hoc     }
2726146aa476Sad hoc 
visit_i32_atomic_rmw_xchg(&mut self, arg: MemArg) -> Self::Output2727146aa476Sad hoc     fn visit_i32_atomic_rmw_xchg(&mut self, arg: MemArg) -> Self::Output {
2728146aa476Sad hoc         self.emit_atomic_rmw(&arg, RmwOp::Xchg, OperandSize::S32, None)
2729146aa476Sad hoc     }
2730146aa476Sad hoc 
visit_i64_atomic_rmw8_xchg_u(&mut self, arg: MemArg) -> Self::Output2731146aa476Sad hoc     fn visit_i64_atomic_rmw8_xchg_u(&mut self, arg: MemArg) -> Self::Output {
2732146aa476Sad hoc         self.emit_atomic_rmw(
2733146aa476Sad hoc             &arg,
2734146aa476Sad hoc             RmwOp::Xchg,
2735146aa476Sad hoc             OperandSize::S8,
2736362568b4Sad hoc             Some(Extend::<Zero>::I64Extend8),
2737146aa476Sad hoc         )
2738146aa476Sad hoc     }
2739146aa476Sad hoc 
visit_i64_atomic_rmw16_xchg_u(&mut self, arg: MemArg) -> Self::Output2740146aa476Sad hoc     fn visit_i64_atomic_rmw16_xchg_u(&mut self, arg: MemArg) -> Self::Output {
2741146aa476Sad hoc         self.emit_atomic_rmw(
2742146aa476Sad hoc             &arg,
2743146aa476Sad hoc             RmwOp::Xchg,
2744146aa476Sad hoc             OperandSize::S16,
2745362568b4Sad hoc             Some(Extend::<Zero>::I64Extend16),
2746146aa476Sad hoc         )
2747146aa476Sad hoc     }
2748146aa476Sad hoc 
visit_i64_atomic_rmw32_xchg_u(&mut self, arg: MemArg) -> Self::Output2749146aa476Sad hoc     fn visit_i64_atomic_rmw32_xchg_u(&mut self, arg: MemArg) -> Self::Output {
2750146aa476Sad hoc         self.emit_atomic_rmw(
2751146aa476Sad hoc             &arg,
2752146aa476Sad hoc             RmwOp::Xchg,
2753146aa476Sad hoc             OperandSize::S32,
2754362568b4Sad hoc             Some(Extend::<Zero>::I64Extend32),
2755146aa476Sad hoc         )
2756146aa476Sad hoc     }
2757146aa476Sad hoc 
visit_i64_atomic_rmw_xchg(&mut self, arg: MemArg) -> Self::Output2758146aa476Sad hoc     fn visit_i64_atomic_rmw_xchg(&mut self, arg: MemArg) -> Self::Output {
2759146aa476Sad hoc         self.emit_atomic_rmw(&arg, RmwOp::Xchg, OperandSize::S64, None)
2760146aa476Sad hoc     }
2761146aa476Sad hoc 
visit_i32_atomic_rmw8_and_u(&mut self, arg: MemArg) -> Self::Output27622eb65138Sad hoc     fn visit_i32_atomic_rmw8_and_u(&mut self, arg: MemArg) -> Self::Output {
27632eb65138Sad hoc         self.emit_atomic_rmw(
27642eb65138Sad hoc             &arg,
27652eb65138Sad hoc             RmwOp::And,
27662eb65138Sad hoc             OperandSize::S8,
2767362568b4Sad hoc             Some(Extend::<Zero>::I32Extend8),
27682eb65138Sad hoc         )
27692eb65138Sad hoc     }
27702eb65138Sad hoc 
visit_i32_atomic_rmw16_and_u(&mut self, arg: MemArg) -> Self::Output27712eb65138Sad hoc     fn visit_i32_atomic_rmw16_and_u(&mut self, arg: MemArg) -> Self::Output {
27722eb65138Sad hoc         self.emit_atomic_rmw(
27732eb65138Sad hoc             &arg,
27742eb65138Sad hoc             RmwOp::And,
27752eb65138Sad hoc             OperandSize::S16,
2776362568b4Sad hoc             Some(Extend::<Zero>::I32Extend16),
27772eb65138Sad hoc         )
27782eb65138Sad hoc     }
27792eb65138Sad hoc 
visit_i32_atomic_rmw_and(&mut self, arg: MemArg) -> Self::Output27802eb65138Sad hoc     fn visit_i32_atomic_rmw_and(&mut self, arg: MemArg) -> Self::Output {
27812eb65138Sad hoc         self.emit_atomic_rmw(&arg, RmwOp::And, OperandSize::S32, None)
27822eb65138Sad hoc     }
27832eb65138Sad hoc 
visit_i64_atomic_rmw8_and_u(&mut self, arg: MemArg) -> Self::Output27842eb65138Sad hoc     fn visit_i64_atomic_rmw8_and_u(&mut self, arg: MemArg) -> Self::Output {
27852eb65138Sad hoc         self.emit_atomic_rmw(
27862eb65138Sad hoc             &arg,
27872eb65138Sad hoc             RmwOp::And,
27882eb65138Sad hoc             OperandSize::S8,
2789362568b4Sad hoc             Some(Extend::<Zero>::I64Extend8),
27902eb65138Sad hoc         )
27912eb65138Sad hoc     }
27922eb65138Sad hoc 
visit_i64_atomic_rmw16_and_u(&mut self, arg: MemArg) -> Self::Output27932eb65138Sad hoc     fn visit_i64_atomic_rmw16_and_u(&mut self, arg: MemArg) -> Self::Output {
27942eb65138Sad hoc         self.emit_atomic_rmw(
27952eb65138Sad hoc             &arg,
27962eb65138Sad hoc             RmwOp::And,
27972eb65138Sad hoc             OperandSize::S16,
2798362568b4Sad hoc             Some(Extend::<Zero>::I64Extend16),
27992eb65138Sad hoc         )
28002eb65138Sad hoc     }
28012eb65138Sad hoc 
visit_i64_atomic_rmw32_and_u(&mut self, arg: MemArg) -> Self::Output28022eb65138Sad hoc     fn visit_i64_atomic_rmw32_and_u(&mut self, arg: MemArg) -> Self::Output {
28032eb65138Sad hoc         self.emit_atomic_rmw(
28042eb65138Sad hoc             &arg,
28052eb65138Sad hoc             RmwOp::And,
28062eb65138Sad hoc             OperandSize::S32,
2807362568b4Sad hoc             Some(Extend::<Zero>::I64Extend32),
28082eb65138Sad hoc         )
28092eb65138Sad hoc     }
28102eb65138Sad hoc 
visit_i64_atomic_rmw_and(&mut self, arg: MemArg) -> Self::Output28112eb65138Sad hoc     fn visit_i64_atomic_rmw_and(&mut self, arg: MemArg) -> Self::Output {
28122eb65138Sad hoc         self.emit_atomic_rmw(&arg, RmwOp::And, OperandSize::S64, None)
28132eb65138Sad hoc     }
28142eb65138Sad hoc 
visit_i32_atomic_rmw8_or_u(&mut self, arg: MemArg) -> Self::Output28152eb65138Sad hoc     fn visit_i32_atomic_rmw8_or_u(&mut self, arg: MemArg) -> Self::Output {
28162eb65138Sad hoc         self.emit_atomic_rmw(
28172eb65138Sad hoc             &arg,
28182eb65138Sad hoc             RmwOp::Or,
28192eb65138Sad hoc             OperandSize::S8,
2820362568b4Sad hoc             Some(Extend::<Zero>::I32Extend8),
28212eb65138Sad hoc         )
28222eb65138Sad hoc     }
28232eb65138Sad hoc 
visit_i32_atomic_rmw16_or_u(&mut self, arg: MemArg) -> Self::Output28242eb65138Sad hoc     fn visit_i32_atomic_rmw16_or_u(&mut self, arg: MemArg) -> Self::Output {
28252eb65138Sad hoc         self.emit_atomic_rmw(
28262eb65138Sad hoc             &arg,
28272eb65138Sad hoc             RmwOp::Or,
28282eb65138Sad hoc             OperandSize::S16,
2829362568b4Sad hoc             Some(Extend::<Zero>::I32Extend16),
28302eb65138Sad hoc         )
28312eb65138Sad hoc     }
28322eb65138Sad hoc 
visit_i32_atomic_rmw_or(&mut self, arg: MemArg) -> Self::Output28332eb65138Sad hoc     fn visit_i32_atomic_rmw_or(&mut self, arg: MemArg) -> Self::Output {
28342eb65138Sad hoc         self.emit_atomic_rmw(&arg, RmwOp::Or, OperandSize::S32, None)
28352eb65138Sad hoc     }
28362eb65138Sad hoc 
visit_i64_atomic_rmw8_or_u(&mut self, arg: MemArg) -> Self::Output28372eb65138Sad hoc     fn visit_i64_atomic_rmw8_or_u(&mut self, arg: MemArg) -> Self::Output {
28382eb65138Sad hoc         self.emit_atomic_rmw(
28392eb65138Sad hoc             &arg,
28402eb65138Sad hoc             RmwOp::Or,
28412eb65138Sad hoc             OperandSize::S8,
2842362568b4Sad hoc             Some(Extend::<Zero>::I64Extend8),
28432eb65138Sad hoc         )
28442eb65138Sad hoc     }
28452eb65138Sad hoc 
visit_i64_atomic_rmw16_or_u(&mut self, arg: MemArg) -> Self::Output28462eb65138Sad hoc     fn visit_i64_atomic_rmw16_or_u(&mut self, arg: MemArg) -> Self::Output {
28472eb65138Sad hoc         self.emit_atomic_rmw(
28482eb65138Sad hoc             &arg,
28492eb65138Sad hoc             RmwOp::Or,
28502eb65138Sad hoc             OperandSize::S16,
2851362568b4Sad hoc             Some(Extend::<Zero>::I64Extend16),
28522eb65138Sad hoc         )
28532eb65138Sad hoc     }
28542eb65138Sad hoc 
visit_i64_atomic_rmw32_or_u(&mut self, arg: MemArg) -> Self::Output28552eb65138Sad hoc     fn visit_i64_atomic_rmw32_or_u(&mut self, arg: MemArg) -> Self::Output {
28562eb65138Sad hoc         self.emit_atomic_rmw(
28572eb65138Sad hoc             &arg,
28582eb65138Sad hoc             RmwOp::Or,
28592eb65138Sad hoc             OperandSize::S32,
2860362568b4Sad hoc             Some(Extend::<Zero>::I64Extend32),
28612eb65138Sad hoc         )
28622eb65138Sad hoc     }
28632eb65138Sad hoc 
visit_i64_atomic_rmw_or(&mut self, arg: MemArg) -> Self::Output28642eb65138Sad hoc     fn visit_i64_atomic_rmw_or(&mut self, arg: MemArg) -> Self::Output {
28652eb65138Sad hoc         self.emit_atomic_rmw(&arg, RmwOp::Or, OperandSize::S64, None)
28662eb65138Sad hoc     }
28672eb65138Sad hoc 
visit_i32_atomic_rmw8_xor_u(&mut self, arg: MemArg) -> Self::Output28682eb65138Sad hoc     fn visit_i32_atomic_rmw8_xor_u(&mut self, arg: MemArg) -> Self::Output {
28692eb65138Sad hoc         self.emit_atomic_rmw(
28702eb65138Sad hoc             &arg,
28712eb65138Sad hoc             RmwOp::Xor,
28722eb65138Sad hoc             OperandSize::S8,
2873362568b4Sad hoc             Some(Extend::<Zero>::I32Extend8),
28742eb65138Sad hoc         )
28752eb65138Sad hoc     }
28762eb65138Sad hoc 
visit_i32_atomic_rmw16_xor_u(&mut self, arg: MemArg) -> Self::Output28772eb65138Sad hoc     fn visit_i32_atomic_rmw16_xor_u(&mut self, arg: MemArg) -> Self::Output {
28782eb65138Sad hoc         self.emit_atomic_rmw(
28792eb65138Sad hoc             &arg,
28802eb65138Sad hoc             RmwOp::Xor,
28812eb65138Sad hoc             OperandSize::S16,
2882362568b4Sad hoc             Some(Extend::<Zero>::I32Extend16),
28832eb65138Sad hoc         )
28842eb65138Sad hoc     }
28852eb65138Sad hoc 
visit_i32_atomic_rmw_xor(&mut self, arg: MemArg) -> Self::Output28862eb65138Sad hoc     fn visit_i32_atomic_rmw_xor(&mut self, arg: MemArg) -> Self::Output {
28872eb65138Sad hoc         self.emit_atomic_rmw(&arg, RmwOp::Xor, OperandSize::S32, None)
28882eb65138Sad hoc     }
28892eb65138Sad hoc 
visit_i64_atomic_rmw8_xor_u(&mut self, arg: MemArg) -> Self::Output28902eb65138Sad hoc     fn visit_i64_atomic_rmw8_xor_u(&mut self, arg: MemArg) -> Self::Output {
28912eb65138Sad hoc         self.emit_atomic_rmw(
28922eb65138Sad hoc             &arg,
28932eb65138Sad hoc             RmwOp::Xor,
28942eb65138Sad hoc             OperandSize::S8,
2895362568b4Sad hoc             Some(Extend::<Zero>::I64Extend8),
28962eb65138Sad hoc         )
28972eb65138Sad hoc     }
28982eb65138Sad hoc 
visit_i64_atomic_rmw16_xor_u(&mut self, arg: MemArg) -> Self::Output28992eb65138Sad hoc     fn visit_i64_atomic_rmw16_xor_u(&mut self, arg: MemArg) -> Self::Output {
29002eb65138Sad hoc         self.emit_atomic_rmw(
29012eb65138Sad hoc             &arg,
29022eb65138Sad hoc             RmwOp::Xor,
29032eb65138Sad hoc             OperandSize::S16,
2904362568b4Sad hoc             Some(Extend::<Zero>::I64Extend16),
29052eb65138Sad hoc         )
29062eb65138Sad hoc     }
29072eb65138Sad hoc 
visit_i64_atomic_rmw32_xor_u(&mut self, arg: MemArg) -> Self::Output29082eb65138Sad hoc     fn visit_i64_atomic_rmw32_xor_u(&mut self, arg: MemArg) -> Self::Output {
29092eb65138Sad hoc         self.emit_atomic_rmw(
29102eb65138Sad hoc             &arg,
29112eb65138Sad hoc             RmwOp::Xor,
29122eb65138Sad hoc             OperandSize::S32,
2913362568b4Sad hoc             Some(Extend::<Zero>::I64Extend32),
29142eb65138Sad hoc         )
29152eb65138Sad hoc     }
29162eb65138Sad hoc 
visit_i64_atomic_rmw_xor(&mut self, arg: MemArg) -> Self::Output29172eb65138Sad hoc     fn visit_i64_atomic_rmw_xor(&mut self, arg: MemArg) -> Self::Output {
29182eb65138Sad hoc         self.emit_atomic_rmw(&arg, RmwOp::Xor, OperandSize::S64, None)
29192eb65138Sad hoc     }
29202eb65138Sad hoc 
visit_i32_atomic_rmw8_cmpxchg_u(&mut self, arg: MemArg) -> Self::Output29213ab865a2Sad hoc     fn visit_i32_atomic_rmw8_cmpxchg_u(&mut self, arg: MemArg) -> Self::Output {
29223ab865a2Sad hoc         self.emit_atomic_cmpxchg(&arg, OperandSize::S8, Some(Extend::I32Extend8))
29233ab865a2Sad hoc     }
29243ab865a2Sad hoc 
visit_i32_atomic_rmw16_cmpxchg_u(&mut self, arg: MemArg) -> Self::Output29253ab865a2Sad hoc     fn visit_i32_atomic_rmw16_cmpxchg_u(&mut self, arg: MemArg) -> Self::Output {
29263ab865a2Sad hoc         self.emit_atomic_cmpxchg(&arg, OperandSize::S16, Some(Extend::I32Extend16))
29273ab865a2Sad hoc     }
29283ab865a2Sad hoc 
visit_i32_atomic_rmw_cmpxchg(&mut self, arg: MemArg) -> Self::Output29293ab865a2Sad hoc     fn visit_i32_atomic_rmw_cmpxchg(&mut self, arg: MemArg) -> Self::Output {
29303ab865a2Sad hoc         self.emit_atomic_cmpxchg(&arg, OperandSize::S32, None)
29313ab865a2Sad hoc     }
29323ab865a2Sad hoc 
visit_i64_atomic_rmw8_cmpxchg_u(&mut self, arg: MemArg) -> Self::Output29333ab865a2Sad hoc     fn visit_i64_atomic_rmw8_cmpxchg_u(&mut self, arg: MemArg) -> Self::Output {
29343ab865a2Sad hoc         self.emit_atomic_cmpxchg(&arg, OperandSize::S8, Some(Extend::I64Extend8))
29353ab865a2Sad hoc     }
29363ab865a2Sad hoc 
visit_i64_atomic_rmw16_cmpxchg_u(&mut self, arg: MemArg) -> Self::Output29373ab865a2Sad hoc     fn visit_i64_atomic_rmw16_cmpxchg_u(&mut self, arg: MemArg) -> Self::Output {
29383ab865a2Sad hoc         self.emit_atomic_cmpxchg(&arg, OperandSize::S16, Some(Extend::I64Extend16))
29393ab865a2Sad hoc     }
29403ab865a2Sad hoc 
visit_i64_atomic_rmw32_cmpxchg_u(&mut self, arg: MemArg) -> Self::Output29413ab865a2Sad hoc     fn visit_i64_atomic_rmw32_cmpxchg_u(&mut self, arg: MemArg) -> Self::Output {
29423ab865a2Sad hoc         self.emit_atomic_cmpxchg(&arg, OperandSize::S32, Some(Extend::I64Extend32))
29433ab865a2Sad hoc     }
29443ab865a2Sad hoc 
visit_i64_atomic_rmw_cmpxchg(&mut self, arg: MemArg) -> Self::Output29453ab865a2Sad hoc     fn visit_i64_atomic_rmw_cmpxchg(&mut self, arg: MemArg) -> Self::Output {
29463ab865a2Sad hoc         self.emit_atomic_cmpxchg(&arg, OperandSize::S64, None)
29473ab865a2Sad hoc     }
29483ab865a2Sad hoc 
visit_memory_atomic_wait32(&mut self, arg: MemArg) -> Self::Output29491bd66bf6Sad hoc     fn visit_memory_atomic_wait32(&mut self, arg: MemArg) -> Self::Output {
29501bd66bf6Sad hoc         self.emit_atomic_wait(&arg, AtomicWaitKind::Wait32)
29511bd66bf6Sad hoc     }
29521bd66bf6Sad hoc 
visit_memory_atomic_wait64(&mut self, arg: MemArg) -> Self::Output29531bd66bf6Sad hoc     fn visit_memory_atomic_wait64(&mut self, arg: MemArg) -> Self::Output {
29541bd66bf6Sad hoc         self.emit_atomic_wait(&arg, AtomicWaitKind::Wait64)
29551bd66bf6Sad hoc     }
29561bd66bf6Sad hoc 
visit_memory_atomic_notify(&mut self, arg: MemArg) -> Self::Output29571bd66bf6Sad hoc     fn visit_memory_atomic_notify(&mut self, arg: MemArg) -> Self::Output {
29581bd66bf6Sad hoc         self.emit_atomic_notify(&arg)
29591bd66bf6Sad hoc     }
29601bd66bf6Sad hoc 
visit_atomic_fence(&mut self) -> Self::Output29611bd66bf6Sad hoc     fn visit_atomic_fence(&mut self) -> Self::Output {
29621bd66bf6Sad hoc         self.masm.fence()
29631bd66bf6Sad hoc     }
29641bd66bf6Sad hoc 
29651256cfaeSAlex Crichton     wasmparser::for_each_visit_operator!(def_unsupported);
29661256cfaeSAlex Crichton }
29671256cfaeSAlex Crichton 
29687ef8f2e2SSaúl Cabrera impl<'a, 'translation, 'data, M> VisitSimdOperator<'a>
29697ef8f2e2SSaúl Cabrera     for CodeGen<'a, 'translation, 'data, M, Emission>
29701256cfaeSAlex Crichton where
29711256cfaeSAlex Crichton     M: MacroAssembler,
29721256cfaeSAlex Crichton {
visit_v128_const(&mut self, val: V128) -> Self::Output2973b93e1bc0SSaúl Cabrera     fn visit_v128_const(&mut self, val: V128) -> Self::Output {
2974b93e1bc0SSaúl Cabrera         self.context.stack.push(Val::v128(val.i128()));
2975b93e1bc0SSaúl Cabrera         Ok(())
29761256cfaeSAlex Crichton     }
29771256cfaeSAlex Crichton 
visit_v128_load(&mut self, memarg: MemArg) -> Self::Output2978b93e1bc0SSaúl Cabrera     fn visit_v128_load(&mut self, memarg: MemArg) -> Self::Output {
29798b42faf4Sad hoc         self.emit_wasm_load(
29808b42faf4Sad hoc             &memarg,
29818b42faf4Sad hoc             WasmValType::V128,
2982bb5e4bbaSSaúl Cabrera             LoadKind::Operand(OperandSize::S128),
29838b42faf4Sad hoc         )
29841256cfaeSAlex Crichton     }
29851256cfaeSAlex Crichton 
visit_v128_store(&mut self, memarg: MemArg) -> Self::Output2986b93e1bc0SSaúl Cabrera     fn visit_v128_store(&mut self, memarg: MemArg) -> Self::Output {
2987cb195e54Sad hoc         self.emit_wasm_store(&memarg, StoreKind::Operand(OperandSize::S128))
29881256cfaeSAlex Crichton     }
29891256cfaeSAlex Crichton 
visit_v128_load8x8_s(&mut self, memarg: MemArg) -> Self::Output29906066c675SJeffrey Charles     fn visit_v128_load8x8_s(&mut self, memarg: MemArg) -> Self::Output {
29916066c675SJeffrey Charles         self.emit_wasm_load(
29926066c675SJeffrey Charles             &memarg,
29936066c675SJeffrey Charles             WasmValType::V128,
2994a0338af8SJeffrey Charles             LoadKind::VectorExtend(V128LoadExtendKind::E8x8S),
29956066c675SJeffrey Charles         )
29966066c675SJeffrey Charles     }
29976066c675SJeffrey Charles 
visit_v128_load8x8_u(&mut self, memarg: MemArg) -> Self::Output29986066c675SJeffrey Charles     fn visit_v128_load8x8_u(&mut self, memarg: MemArg) -> Self::Output {
29996066c675SJeffrey Charles         self.emit_wasm_load(
30006066c675SJeffrey Charles             &memarg,
30016066c675SJeffrey Charles             WasmValType::V128,
3002a0338af8SJeffrey Charles             LoadKind::VectorExtend(V128LoadExtendKind::E8x8U),
30036066c675SJeffrey Charles         )
30046066c675SJeffrey Charles     }
30056066c675SJeffrey Charles 
visit_v128_load16x4_s(&mut self, memarg: MemArg) -> Self::Output30066066c675SJeffrey Charles     fn visit_v128_load16x4_s(&mut self, memarg: MemArg) -> Self::Output {
30076066c675SJeffrey Charles         self.emit_wasm_load(
30086066c675SJeffrey Charles             &memarg,
30096066c675SJeffrey Charles             WasmValType::V128,
3010a0338af8SJeffrey Charles             LoadKind::VectorExtend(V128LoadExtendKind::E16x4S),
30116066c675SJeffrey Charles         )
30126066c675SJeffrey Charles     }
30136066c675SJeffrey Charles 
visit_v128_load16x4_u(&mut self, memarg: MemArg) -> Self::Output30146066c675SJeffrey Charles     fn visit_v128_load16x4_u(&mut self, memarg: MemArg) -> Self::Output {
30156066c675SJeffrey Charles         self.emit_wasm_load(
30166066c675SJeffrey Charles             &memarg,
30176066c675SJeffrey Charles             WasmValType::V128,
3018a0338af8SJeffrey Charles             LoadKind::VectorExtend(V128LoadExtendKind::E16x4U),
30196066c675SJeffrey Charles         )
30206066c675SJeffrey Charles     }
30216066c675SJeffrey Charles 
visit_v128_load32x2_s(&mut self, memarg: MemArg) -> Self::Output30226066c675SJeffrey Charles     fn visit_v128_load32x2_s(&mut self, memarg: MemArg) -> Self::Output {
30236066c675SJeffrey Charles         self.emit_wasm_load(
30246066c675SJeffrey Charles             &memarg,
30256066c675SJeffrey Charles             WasmValType::V128,
3026a0338af8SJeffrey Charles             LoadKind::VectorExtend(V128LoadExtendKind::E32x2S),
30276066c675SJeffrey Charles         )
30286066c675SJeffrey Charles     }
30296066c675SJeffrey Charles 
visit_v128_load32x2_u(&mut self, memarg: MemArg) -> Self::Output30306066c675SJeffrey Charles     fn visit_v128_load32x2_u(&mut self, memarg: MemArg) -> Self::Output {
30316066c675SJeffrey Charles         self.emit_wasm_load(
30326066c675SJeffrey Charles             &memarg,
30336066c675SJeffrey Charles             WasmValType::V128,
3034a0338af8SJeffrey Charles             LoadKind::VectorExtend(V128LoadExtendKind::E32x2U),
30356066c675SJeffrey Charles         )
30366066c675SJeffrey Charles     }
30376066c675SJeffrey Charles 
visit_v128_load8_splat(&mut self, memarg: MemArg) -> Self::Output30386066c675SJeffrey Charles     fn visit_v128_load8_splat(&mut self, memarg: MemArg) -> Self::Output {
30396066c675SJeffrey Charles         self.emit_wasm_load(
30406066c675SJeffrey Charles             &memarg,
30416066c675SJeffrey Charles             WasmValType::V128,
3042be6c6c86SJeffrey Charles             LoadKind::Splat(SplatLoadKind::S8),
30436066c675SJeffrey Charles         )
30446066c675SJeffrey Charles     }
30456066c675SJeffrey Charles 
visit_v128_load16_splat(&mut self, memarg: MemArg) -> Self::Output30466066c675SJeffrey Charles     fn visit_v128_load16_splat(&mut self, memarg: MemArg) -> Self::Output {
30476066c675SJeffrey Charles         self.emit_wasm_load(
30486066c675SJeffrey Charles             &memarg,
30496066c675SJeffrey Charles             WasmValType::V128,
3050be6c6c86SJeffrey Charles             LoadKind::Splat(SplatLoadKind::S16),
30516066c675SJeffrey Charles         )
30526066c675SJeffrey Charles     }
30536066c675SJeffrey Charles 
visit_v128_load32_splat(&mut self, memarg: MemArg) -> Self::Output30546066c675SJeffrey Charles     fn visit_v128_load32_splat(&mut self, memarg: MemArg) -> Self::Output {
30556066c675SJeffrey Charles         self.emit_wasm_load(
30566066c675SJeffrey Charles             &memarg,
30576066c675SJeffrey Charles             WasmValType::V128,
3058be6c6c86SJeffrey Charles             LoadKind::Splat(SplatLoadKind::S32),
30596066c675SJeffrey Charles         )
30606066c675SJeffrey Charles     }
30616066c675SJeffrey Charles 
visit_v128_load64_splat(&mut self, memarg: MemArg) -> Self::Output30626066c675SJeffrey Charles     fn visit_v128_load64_splat(&mut self, memarg: MemArg) -> Self::Output {
30636066c675SJeffrey Charles         self.emit_wasm_load(
30646066c675SJeffrey Charles             &memarg,
30656066c675SJeffrey Charles             WasmValType::V128,
3066be6c6c86SJeffrey Charles             LoadKind::Splat(SplatLoadKind::S64),
30676066c675SJeffrey Charles         )
30686066c675SJeffrey Charles     }
30696066c675SJeffrey Charles 
visit_i8x16_splat(&mut self) -> Self::Output3070be6c6c86SJeffrey Charles     fn visit_i8x16_splat(&mut self) -> Self::Output {
3071be6c6c86SJeffrey Charles         self.masm.splat(&mut self.context, SplatKind::I8x16)
3072be6c6c86SJeffrey Charles     }
3073be6c6c86SJeffrey Charles 
visit_i16x8_splat(&mut self) -> Self::Output3074be6c6c86SJeffrey Charles     fn visit_i16x8_splat(&mut self) -> Self::Output {
3075be6c6c86SJeffrey Charles         self.masm.splat(&mut self.context, SplatKind::I16x8)
3076be6c6c86SJeffrey Charles     }
3077be6c6c86SJeffrey Charles 
visit_i32x4_splat(&mut self) -> Self::Output3078be6c6c86SJeffrey Charles     fn visit_i32x4_splat(&mut self) -> Self::Output {
3079be6c6c86SJeffrey Charles         self.masm.splat(&mut self.context, SplatKind::I32x4)
3080be6c6c86SJeffrey Charles     }
3081be6c6c86SJeffrey Charles 
visit_i64x2_splat(&mut self) -> Self::Output3082be6c6c86SJeffrey Charles     fn visit_i64x2_splat(&mut self) -> Self::Output {
3083be6c6c86SJeffrey Charles         self.masm.splat(&mut self.context, SplatKind::I64x2)
3084be6c6c86SJeffrey Charles     }
3085be6c6c86SJeffrey Charles 
visit_f32x4_splat(&mut self) -> Self::Output3086be6c6c86SJeffrey Charles     fn visit_f32x4_splat(&mut self) -> Self::Output {
3087be6c6c86SJeffrey Charles         self.masm.splat(&mut self.context, SplatKind::F32x4)
3088be6c6c86SJeffrey Charles     }
3089be6c6c86SJeffrey Charles 
visit_f64x2_splat(&mut self) -> Self::Output3090be6c6c86SJeffrey Charles     fn visit_f64x2_splat(&mut self) -> Self::Output {
3091be6c6c86SJeffrey Charles         self.masm.splat(&mut self.context, SplatKind::F64x2)
3092be6c6c86SJeffrey Charles     }
3093be6c6c86SJeffrey Charles 
visit_i8x16_shuffle(&mut self, lanes: [u8; 16]) -> Self::Output3094ba950f2cSJeffrey Charles     fn visit_i8x16_shuffle(&mut self, lanes: [u8; 16]) -> Self::Output {
3095ba950f2cSJeffrey Charles         let rhs = self.context.pop_to_reg(self.masm, None)?;
3096ba950f2cSJeffrey Charles         let lhs = self.context.pop_to_reg(self.masm, None)?;
3097ba950f2cSJeffrey Charles         self.masm
3098ba950f2cSJeffrey Charles             .shuffle(writable!(lhs.into()), lhs.into(), rhs.into(), lanes)?;
3099ba950f2cSJeffrey Charles         self.context.stack.push(TypedReg::v128(lhs.into()).into());
3100ba950f2cSJeffrey Charles         self.context.free_reg(rhs);
3101ba950f2cSJeffrey Charles         Ok(())
3102ba950f2cSJeffrey Charles     }
3103ba950f2cSJeffrey Charles 
visit_i8x16_swizzle(&mut self) -> Self::Output310412649ac5SJeffrey Charles     fn visit_i8x16_swizzle(&mut self) -> Self::Output {
310512649ac5SJeffrey Charles         let rhs = self.context.pop_to_reg(self.masm, None)?;
310612649ac5SJeffrey Charles         let lhs = self.context.pop_to_reg(self.masm, None)?;
310712649ac5SJeffrey Charles         self.masm
310812649ac5SJeffrey Charles             .swizzle(writable!(lhs.into()), lhs.into(), rhs.into())?;
310912649ac5SJeffrey Charles         self.context.stack.push(TypedReg::v128(lhs.into()).into());
311012649ac5SJeffrey Charles         self.context.free_reg(rhs);
311112649ac5SJeffrey Charles         Ok(())
311212649ac5SJeffrey Charles     }
311312649ac5SJeffrey Charles 
visit_i8x16_extract_lane_s(&mut self, lane: u8) -> Self::Output3114cd67a609SJeffrey Charles     fn visit_i8x16_extract_lane_s(&mut self, lane: u8) -> Self::Output {
3115cd67a609SJeffrey Charles         self.context.extract_lane_op(
3116cd67a609SJeffrey Charles             self.masm,
3117cd67a609SJeffrey Charles             ExtractLaneKind::I8x16S,
3118cd67a609SJeffrey Charles             |masm, src, dst, kind| masm.extract_lane(src, dst, lane, kind),
3119cd67a609SJeffrey Charles         )
3120cd67a609SJeffrey Charles     }
3121cd67a609SJeffrey Charles 
visit_i8x16_extract_lane_u(&mut self, lane: u8) -> Self::Output3122cd67a609SJeffrey Charles     fn visit_i8x16_extract_lane_u(&mut self, lane: u8) -> Self::Output {
3123cd67a609SJeffrey Charles         self.context.extract_lane_op(
3124cd67a609SJeffrey Charles             self.masm,
3125cd67a609SJeffrey Charles             ExtractLaneKind::I8x16U,
3126cd67a609SJeffrey Charles             |masm, src, dst, kind| masm.extract_lane(src, dst, lane, kind),
3127cd67a609SJeffrey Charles         )
3128cd67a609SJeffrey Charles     }
3129cd67a609SJeffrey Charles 
visit_i16x8_extract_lane_s(&mut self, lane: u8) -> Self::Output3130cd67a609SJeffrey Charles     fn visit_i16x8_extract_lane_s(&mut self, lane: u8) -> Self::Output {
3131cd67a609SJeffrey Charles         self.context.extract_lane_op(
3132cd67a609SJeffrey Charles             self.masm,
3133cd67a609SJeffrey Charles             ExtractLaneKind::I16x8S,
3134cd67a609SJeffrey Charles             |masm, src, dst, kind| masm.extract_lane(src, dst, lane, kind),
3135cd67a609SJeffrey Charles         )
3136cd67a609SJeffrey Charles     }
3137cd67a609SJeffrey Charles 
visit_i16x8_extract_lane_u(&mut self, lane: u8) -> Self::Output3138cd67a609SJeffrey Charles     fn visit_i16x8_extract_lane_u(&mut self, lane: u8) -> Self::Output {
3139cd67a609SJeffrey Charles         self.context.extract_lane_op(
3140cd67a609SJeffrey Charles             self.masm,
3141cd67a609SJeffrey Charles             ExtractLaneKind::I16x8U,
3142cd67a609SJeffrey Charles             |masm, src, dst, kind| masm.extract_lane(src, dst, lane, kind),
3143cd67a609SJeffrey Charles         )
3144cd67a609SJeffrey Charles     }
3145cd67a609SJeffrey Charles 
visit_i32x4_extract_lane(&mut self, lane: u8) -> Self::Output3146cd67a609SJeffrey Charles     fn visit_i32x4_extract_lane(&mut self, lane: u8) -> Self::Output {
3147cd67a609SJeffrey Charles         self.context
3148cd67a609SJeffrey Charles             .extract_lane_op(self.masm, ExtractLaneKind::I32x4, |masm, src, dst, kind| {
3149cd67a609SJeffrey Charles                 masm.extract_lane(src, dst, lane, kind)
3150cd67a609SJeffrey Charles             })
3151cd67a609SJeffrey Charles     }
3152cd67a609SJeffrey Charles 
visit_i64x2_extract_lane(&mut self, lane: u8) -> Self::Output3153cd67a609SJeffrey Charles     fn visit_i64x2_extract_lane(&mut self, lane: u8) -> Self::Output {
3154cd67a609SJeffrey Charles         self.context
3155cd67a609SJeffrey Charles             .extract_lane_op(self.masm, ExtractLaneKind::I64x2, |masm, src, dst, kind| {
3156cd67a609SJeffrey Charles                 masm.extract_lane(src, dst, lane, kind)
3157cd67a609SJeffrey Charles             })
3158cd67a609SJeffrey Charles     }
3159cd67a609SJeffrey Charles 
visit_f32x4_extract_lane(&mut self, lane: u8) -> Self::Output3160cd67a609SJeffrey Charles     fn visit_f32x4_extract_lane(&mut self, lane: u8) -> Self::Output {
3161cd67a609SJeffrey Charles         self.context
3162cd67a609SJeffrey Charles             .extract_lane_op(self.masm, ExtractLaneKind::F32x4, |masm, src, dst, kind| {
3163cd67a609SJeffrey Charles                 masm.extract_lane(src, dst, lane, kind)
3164cd67a609SJeffrey Charles             })
3165cd67a609SJeffrey Charles     }
3166cd67a609SJeffrey Charles 
visit_f64x2_extract_lane(&mut self, lane: u8) -> Self::Output3167cd67a609SJeffrey Charles     fn visit_f64x2_extract_lane(&mut self, lane: u8) -> Self::Output {
3168cd67a609SJeffrey Charles         self.context
3169cd67a609SJeffrey Charles             .extract_lane_op(self.masm, ExtractLaneKind::F64x2, |masm, src, dst, kind| {
3170cd67a609SJeffrey Charles                 masm.extract_lane(src, dst, lane, kind)
3171cd67a609SJeffrey Charles             })
3172cd67a609SJeffrey Charles     }
3173cd67a609SJeffrey Charles 
visit_i8x16_eq(&mut self) -> Self::Output3174febd080eSJeffrey Charles     fn visit_i8x16_eq(&mut self) -> Self::Output {
3175febd080eSJeffrey Charles         self.context
3176febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S8, |masm, dst, src, _size| {
3177febd080eSJeffrey Charles                 masm.v128_eq(writable!(dst), dst, src, VectorEqualityKind::I8x16)?;
3178febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3179febd080eSJeffrey Charles             })
3180febd080eSJeffrey Charles     }
3181febd080eSJeffrey Charles 
visit_i16x8_eq(&mut self) -> Self::Output3182febd080eSJeffrey Charles     fn visit_i16x8_eq(&mut self) -> Self::Output {
3183febd080eSJeffrey Charles         self.context
3184febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S16, |masm, dst, src, _size| {
3185febd080eSJeffrey Charles                 masm.v128_eq(writable!(dst), dst, src, VectorEqualityKind::I16x8)?;
3186febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3187febd080eSJeffrey Charles             })
3188febd080eSJeffrey Charles     }
3189febd080eSJeffrey Charles 
visit_i32x4_eq(&mut self) -> Self::Output3190febd080eSJeffrey Charles     fn visit_i32x4_eq(&mut self) -> Self::Output {
3191febd080eSJeffrey Charles         self.context
3192febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S32, |masm, dst, src, _size| {
3193febd080eSJeffrey Charles                 masm.v128_eq(writable!(dst), dst, src, VectorEqualityKind::I32x4)?;
3194febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3195febd080eSJeffrey Charles             })
3196febd080eSJeffrey Charles     }
3197febd080eSJeffrey Charles 
visit_i64x2_eq(&mut self) -> Self::Output3198febd080eSJeffrey Charles     fn visit_i64x2_eq(&mut self) -> Self::Output {
3199febd080eSJeffrey Charles         self.context
3200febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S64, |masm, dst, src, _size| {
3201febd080eSJeffrey Charles                 masm.v128_eq(writable!(dst), dst, src, VectorEqualityKind::I64x2)?;
3202febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3203febd080eSJeffrey Charles             })
3204febd080eSJeffrey Charles     }
3205febd080eSJeffrey Charles 
visit_f32x4_eq(&mut self) -> Self::Output3206febd080eSJeffrey Charles     fn visit_f32x4_eq(&mut self) -> Self::Output {
3207febd080eSJeffrey Charles         self.context
3208febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S32, |masm, dst, src, _size| {
3209febd080eSJeffrey Charles                 masm.v128_eq(writable!(dst), dst, src, VectorEqualityKind::F32x4)?;
3210febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3211febd080eSJeffrey Charles             })
3212febd080eSJeffrey Charles     }
3213febd080eSJeffrey Charles 
visit_f64x2_eq(&mut self) -> Self::Output3214febd080eSJeffrey Charles     fn visit_f64x2_eq(&mut self) -> Self::Output {
3215febd080eSJeffrey Charles         self.context
3216febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S64, |masm, dst, src, _size| {
3217febd080eSJeffrey Charles                 masm.v128_eq(writable!(dst), dst, src, VectorEqualityKind::F64x2)?;
3218febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3219febd080eSJeffrey Charles             })
3220febd080eSJeffrey Charles     }
3221febd080eSJeffrey Charles 
visit_i8x16_ne(&mut self) -> Self::Output3222febd080eSJeffrey Charles     fn visit_i8x16_ne(&mut self) -> Self::Output {
3223febd080eSJeffrey Charles         self.context
3224febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S8, |masm, dst, src, _size| {
3225febd080eSJeffrey Charles                 masm.v128_ne(writable!(dst), dst, src, VectorEqualityKind::I8x16)?;
3226febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3227febd080eSJeffrey Charles             })
3228febd080eSJeffrey Charles     }
3229febd080eSJeffrey Charles 
visit_i16x8_ne(&mut self) -> Self::Output3230febd080eSJeffrey Charles     fn visit_i16x8_ne(&mut self) -> Self::Output {
3231febd080eSJeffrey Charles         self.context
3232febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S16, |masm, dst, src, _size| {
3233febd080eSJeffrey Charles                 masm.v128_ne(writable!(dst), dst, src, VectorEqualityKind::I16x8)?;
3234febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3235febd080eSJeffrey Charles             })
3236febd080eSJeffrey Charles     }
3237febd080eSJeffrey Charles 
visit_i32x4_ne(&mut self) -> Self::Output3238febd080eSJeffrey Charles     fn visit_i32x4_ne(&mut self) -> Self::Output {
3239febd080eSJeffrey Charles         self.context
3240febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S32, |masm, dst, src, _size| {
3241febd080eSJeffrey Charles                 masm.v128_ne(writable!(dst), dst, src, VectorEqualityKind::I32x4)?;
3242febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3243febd080eSJeffrey Charles             })
3244febd080eSJeffrey Charles     }
3245febd080eSJeffrey Charles 
visit_i64x2_ne(&mut self) -> Self::Output3246febd080eSJeffrey Charles     fn visit_i64x2_ne(&mut self) -> Self::Output {
3247febd080eSJeffrey Charles         self.context
3248febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S64, |masm, dst, src, _size| {
3249febd080eSJeffrey Charles                 masm.v128_ne(writable!(dst), dst, src, VectorEqualityKind::I64x2)?;
3250febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3251febd080eSJeffrey Charles             })
3252febd080eSJeffrey Charles     }
3253febd080eSJeffrey Charles 
visit_f32x4_ne(&mut self) -> Self::Output3254febd080eSJeffrey Charles     fn visit_f32x4_ne(&mut self) -> Self::Output {
3255febd080eSJeffrey Charles         self.context
3256febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S32, |masm, dst, src, _size| {
3257febd080eSJeffrey Charles                 masm.v128_ne(writable!(dst), dst, src, VectorEqualityKind::F32x4)?;
3258febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3259febd080eSJeffrey Charles             })
3260febd080eSJeffrey Charles     }
3261febd080eSJeffrey Charles 
visit_f64x2_ne(&mut self) -> Self::Output3262febd080eSJeffrey Charles     fn visit_f64x2_ne(&mut self) -> Self::Output {
3263febd080eSJeffrey Charles         self.context
3264febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S64, |masm, dst, src, _size| {
3265febd080eSJeffrey Charles                 masm.v128_ne(writable!(dst), dst, src, VectorEqualityKind::F64x2)?;
3266febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3267febd080eSJeffrey Charles             })
3268febd080eSJeffrey Charles     }
3269febd080eSJeffrey Charles 
visit_i8x16_lt_s(&mut self) -> Self::Output3270febd080eSJeffrey Charles     fn visit_i8x16_lt_s(&mut self) -> Self::Output {
3271febd080eSJeffrey Charles         self.context
3272febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S8, |masm, dst, src, _size| {
3273febd080eSJeffrey Charles                 masm.v128_lt(writable!(dst), dst, src, VectorCompareKind::I8x16S)?;
3274febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3275febd080eSJeffrey Charles             })
3276febd080eSJeffrey Charles     }
3277febd080eSJeffrey Charles 
visit_i8x16_lt_u(&mut self) -> Self::Output3278febd080eSJeffrey Charles     fn visit_i8x16_lt_u(&mut self) -> Self::Output {
3279febd080eSJeffrey Charles         self.context
3280febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S8, |masm, dst, src, _size| {
3281febd080eSJeffrey Charles                 masm.v128_lt(writable!(dst), dst, src, VectorCompareKind::I8x16U)?;
3282febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3283febd080eSJeffrey Charles             })
3284febd080eSJeffrey Charles     }
3285febd080eSJeffrey Charles 
visit_i16x8_lt_s(&mut self) -> Self::Output3286febd080eSJeffrey Charles     fn visit_i16x8_lt_s(&mut self) -> Self::Output {
3287febd080eSJeffrey Charles         self.context
3288febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S16, |masm, dst, src, _size| {
3289febd080eSJeffrey Charles                 masm.v128_lt(writable!(dst), dst, src, VectorCompareKind::I16x8S)?;
3290febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3291febd080eSJeffrey Charles             })
3292febd080eSJeffrey Charles     }
3293febd080eSJeffrey Charles 
visit_i16x8_lt_u(&mut self) -> Self::Output3294febd080eSJeffrey Charles     fn visit_i16x8_lt_u(&mut self) -> Self::Output {
3295febd080eSJeffrey Charles         self.context
3296febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S16, |masm, dst, src, _size| {
3297febd080eSJeffrey Charles                 masm.v128_lt(writable!(dst), dst, src, VectorCompareKind::I16x8U)?;
3298febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3299febd080eSJeffrey Charles             })
3300febd080eSJeffrey Charles     }
3301febd080eSJeffrey Charles 
visit_i32x4_lt_s(&mut self) -> Self::Output3302febd080eSJeffrey Charles     fn visit_i32x4_lt_s(&mut self) -> Self::Output {
3303febd080eSJeffrey Charles         self.context
3304febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S32, |masm, dst, src, _size| {
3305febd080eSJeffrey Charles                 masm.v128_lt(writable!(dst), dst, src, VectorCompareKind::I32x4S)?;
3306febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3307febd080eSJeffrey Charles             })
3308febd080eSJeffrey Charles     }
3309febd080eSJeffrey Charles 
visit_i32x4_lt_u(&mut self) -> Self::Output3310febd080eSJeffrey Charles     fn visit_i32x4_lt_u(&mut self) -> Self::Output {
3311febd080eSJeffrey Charles         self.context
3312febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S32, |masm, dst, src, _size| {
3313febd080eSJeffrey Charles                 masm.v128_lt(writable!(dst), dst, src, VectorCompareKind::I32x4U)?;
3314febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3315febd080eSJeffrey Charles             })
3316febd080eSJeffrey Charles     }
3317febd080eSJeffrey Charles 
visit_i64x2_lt_s(&mut self) -> Self::Output3318febd080eSJeffrey Charles     fn visit_i64x2_lt_s(&mut self) -> Self::Output {
3319febd080eSJeffrey Charles         self.context
3320febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S64, |masm, dst, src, _size| {
3321febd080eSJeffrey Charles                 masm.v128_lt(writable!(dst), dst, src, VectorCompareKind::I64x2S)?;
3322febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3323febd080eSJeffrey Charles             })
3324febd080eSJeffrey Charles     }
3325febd080eSJeffrey Charles 
visit_f32x4_lt(&mut self) -> Self::Output3326febd080eSJeffrey Charles     fn visit_f32x4_lt(&mut self) -> Self::Output {
3327febd080eSJeffrey Charles         self.context
3328febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S32, |masm, dst, src, _size| {
3329febd080eSJeffrey Charles                 masm.v128_lt(writable!(dst), dst, src, VectorCompareKind::F32x4)?;
3330febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3331febd080eSJeffrey Charles             })
3332febd080eSJeffrey Charles     }
3333febd080eSJeffrey Charles 
visit_f64x2_lt(&mut self) -> Self::Output3334febd080eSJeffrey Charles     fn visit_f64x2_lt(&mut self) -> Self::Output {
3335febd080eSJeffrey Charles         self.context
3336febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S64, |masm, dst, src, _size| {
3337febd080eSJeffrey Charles                 masm.v128_lt(writable!(dst), dst, src, VectorCompareKind::F64x2)?;
3338febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3339febd080eSJeffrey Charles             })
3340febd080eSJeffrey Charles     }
3341febd080eSJeffrey Charles 
visit_i8x16_le_s(&mut self) -> Self::Output3342febd080eSJeffrey Charles     fn visit_i8x16_le_s(&mut self) -> Self::Output {
3343febd080eSJeffrey Charles         self.context
3344febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S8, |masm, dst, src, _size| {
3345febd080eSJeffrey Charles                 masm.v128_le(writable!(dst), dst, src, VectorCompareKind::I8x16S)?;
3346febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3347febd080eSJeffrey Charles             })
3348febd080eSJeffrey Charles     }
3349febd080eSJeffrey Charles 
visit_i8x16_le_u(&mut self) -> Self::Output3350febd080eSJeffrey Charles     fn visit_i8x16_le_u(&mut self) -> Self::Output {
3351febd080eSJeffrey Charles         self.context
3352febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S8, |masm, dst, src, _size| {
3353febd080eSJeffrey Charles                 masm.v128_le(writable!(dst), dst, src, VectorCompareKind::I8x16U)?;
3354febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3355febd080eSJeffrey Charles             })
3356febd080eSJeffrey Charles     }
3357febd080eSJeffrey Charles 
visit_i16x8_le_s(&mut self) -> Self::Output3358febd080eSJeffrey Charles     fn visit_i16x8_le_s(&mut self) -> Self::Output {
3359febd080eSJeffrey Charles         self.context
3360febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S16, |masm, dst, src, _size| {
3361febd080eSJeffrey Charles                 masm.v128_le(writable!(dst), dst, src, VectorCompareKind::I16x8S)?;
3362febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3363febd080eSJeffrey Charles             })
3364febd080eSJeffrey Charles     }
3365febd080eSJeffrey Charles 
visit_i16x8_le_u(&mut self) -> Self::Output3366febd080eSJeffrey Charles     fn visit_i16x8_le_u(&mut self) -> Self::Output {
3367febd080eSJeffrey Charles         self.context
3368febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S16, |masm, dst, src, _size| {
3369febd080eSJeffrey Charles                 masm.v128_le(writable!(dst), dst, src, VectorCompareKind::I16x8U)?;
3370febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3371febd080eSJeffrey Charles             })
3372febd080eSJeffrey Charles     }
3373febd080eSJeffrey Charles 
visit_i32x4_le_s(&mut self) -> Self::Output3374febd080eSJeffrey Charles     fn visit_i32x4_le_s(&mut self) -> Self::Output {
3375febd080eSJeffrey Charles         self.context
3376febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S32, |masm, dst, src, _size| {
3377febd080eSJeffrey Charles                 masm.v128_le(writable!(dst), dst, src, VectorCompareKind::I32x4S)?;
3378febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3379febd080eSJeffrey Charles             })
3380febd080eSJeffrey Charles     }
3381febd080eSJeffrey Charles 
visit_i32x4_le_u(&mut self) -> Self::Output3382febd080eSJeffrey Charles     fn visit_i32x4_le_u(&mut self) -> Self::Output {
3383febd080eSJeffrey Charles         self.context
3384febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S32, |masm, dst, src, _size| {
3385febd080eSJeffrey Charles                 masm.v128_le(writable!(dst), dst, src, VectorCompareKind::I32x4U)?;
3386febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3387febd080eSJeffrey Charles             })
3388febd080eSJeffrey Charles     }
3389febd080eSJeffrey Charles 
visit_i64x2_le_s(&mut self) -> Self::Output3390febd080eSJeffrey Charles     fn visit_i64x2_le_s(&mut self) -> Self::Output {
3391febd080eSJeffrey Charles         self.context
3392febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S64, |masm, dst, src, _size| {
3393febd080eSJeffrey Charles                 masm.v128_le(writable!(dst), dst, src, VectorCompareKind::I64x2S)?;
3394febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3395febd080eSJeffrey Charles             })
3396febd080eSJeffrey Charles     }
3397febd080eSJeffrey Charles 
visit_f32x4_le(&mut self) -> Self::Output3398febd080eSJeffrey Charles     fn visit_f32x4_le(&mut self) -> Self::Output {
3399febd080eSJeffrey Charles         self.context
3400febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S32, |masm, dst, src, _size| {
3401febd080eSJeffrey Charles                 masm.v128_le(writable!(dst), dst, src, VectorCompareKind::F32x4)?;
3402febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3403febd080eSJeffrey Charles             })
3404febd080eSJeffrey Charles     }
3405febd080eSJeffrey Charles 
visit_f64x2_le(&mut self) -> Self::Output3406febd080eSJeffrey Charles     fn visit_f64x2_le(&mut self) -> Self::Output {
3407febd080eSJeffrey Charles         self.context
3408febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S64, |masm, dst, src, _size| {
3409febd080eSJeffrey Charles                 masm.v128_le(writable!(dst), dst, src, VectorCompareKind::F64x2)?;
3410febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3411febd080eSJeffrey Charles             })
3412febd080eSJeffrey Charles     }
3413febd080eSJeffrey Charles 
visit_i8x16_gt_s(&mut self) -> Self::Output3414febd080eSJeffrey Charles     fn visit_i8x16_gt_s(&mut self) -> Self::Output {
3415febd080eSJeffrey Charles         self.context
3416febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S8, |masm, dst, src, _size| {
3417febd080eSJeffrey Charles                 masm.v128_gt(writable!(dst), dst, src, VectorCompareKind::I8x16S)?;
3418febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3419febd080eSJeffrey Charles             })
3420febd080eSJeffrey Charles     }
3421febd080eSJeffrey Charles 
visit_i8x16_gt_u(&mut self) -> Self::Output3422febd080eSJeffrey Charles     fn visit_i8x16_gt_u(&mut self) -> Self::Output {
3423febd080eSJeffrey Charles         self.context
3424febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S8, |masm, dst, src, _size| {
3425febd080eSJeffrey Charles                 masm.v128_gt(writable!(dst), dst, src, VectorCompareKind::I8x16U)?;
3426febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3427febd080eSJeffrey Charles             })
3428febd080eSJeffrey Charles     }
3429febd080eSJeffrey Charles 
visit_i16x8_gt_s(&mut self) -> Self::Output3430febd080eSJeffrey Charles     fn visit_i16x8_gt_s(&mut self) -> Self::Output {
3431febd080eSJeffrey Charles         self.context
3432febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S16, |masm, dst, src, _size| {
3433febd080eSJeffrey Charles                 masm.v128_gt(writable!(dst), dst, src, VectorCompareKind::I16x8S)?;
3434febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3435febd080eSJeffrey Charles             })
3436febd080eSJeffrey Charles     }
3437febd080eSJeffrey Charles 
visit_i16x8_gt_u(&mut self) -> Self::Output3438febd080eSJeffrey Charles     fn visit_i16x8_gt_u(&mut self) -> Self::Output {
3439febd080eSJeffrey Charles         self.context
3440febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S16, |masm, dst, src, _size| {
3441febd080eSJeffrey Charles                 masm.v128_gt(writable!(dst), dst, src, VectorCompareKind::I16x8U)?;
3442febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3443febd080eSJeffrey Charles             })
3444febd080eSJeffrey Charles     }
3445febd080eSJeffrey Charles 
visit_i32x4_gt_s(&mut self) -> Self::Output3446febd080eSJeffrey Charles     fn visit_i32x4_gt_s(&mut self) -> Self::Output {
3447febd080eSJeffrey Charles         self.context
3448febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S32, |masm, dst, src, _size| {
3449febd080eSJeffrey Charles                 masm.v128_gt(writable!(dst), dst, src, VectorCompareKind::I32x4S)?;
3450febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3451febd080eSJeffrey Charles             })
3452febd080eSJeffrey Charles     }
3453febd080eSJeffrey Charles 
visit_i32x4_gt_u(&mut self) -> Self::Output3454febd080eSJeffrey Charles     fn visit_i32x4_gt_u(&mut self) -> Self::Output {
3455febd080eSJeffrey Charles         self.context
3456febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S32, |masm, dst, src, _size| {
3457febd080eSJeffrey Charles                 masm.v128_gt(writable!(dst), dst, src, VectorCompareKind::I32x4U)?;
3458febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3459febd080eSJeffrey Charles             })
3460febd080eSJeffrey Charles     }
3461febd080eSJeffrey Charles 
visit_i64x2_gt_s(&mut self) -> Self::Output3462febd080eSJeffrey Charles     fn visit_i64x2_gt_s(&mut self) -> Self::Output {
3463febd080eSJeffrey Charles         self.context
3464febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S64, |masm, dst, src, _size| {
3465febd080eSJeffrey Charles                 masm.v128_gt(writable!(dst), dst, src, VectorCompareKind::I64x2S)?;
3466febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3467febd080eSJeffrey Charles             })
3468febd080eSJeffrey Charles     }
3469febd080eSJeffrey Charles 
visit_f32x4_gt(&mut self) -> Self::Output3470febd080eSJeffrey Charles     fn visit_f32x4_gt(&mut self) -> Self::Output {
3471febd080eSJeffrey Charles         self.context
3472febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S32, |masm, dst, src, _size| {
3473febd080eSJeffrey Charles                 masm.v128_gt(writable!(dst), dst, src, VectorCompareKind::F32x4)?;
3474febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3475febd080eSJeffrey Charles             })
3476febd080eSJeffrey Charles     }
3477febd080eSJeffrey Charles 
visit_f64x2_gt(&mut self) -> Self::Output3478febd080eSJeffrey Charles     fn visit_f64x2_gt(&mut self) -> Self::Output {
3479febd080eSJeffrey Charles         self.context
3480febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S64, |masm, dst, src, _size| {
3481febd080eSJeffrey Charles                 masm.v128_gt(writable!(dst), dst, src, VectorCompareKind::F64x2)?;
3482febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3483febd080eSJeffrey Charles             })
3484febd080eSJeffrey Charles     }
3485febd080eSJeffrey Charles 
visit_i8x16_ge_s(&mut self) -> Self::Output3486febd080eSJeffrey Charles     fn visit_i8x16_ge_s(&mut self) -> Self::Output {
3487febd080eSJeffrey Charles         self.context
3488febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S8, |masm, dst, src, _size| {
3489febd080eSJeffrey Charles                 masm.v128_ge(writable!(dst), dst, src, VectorCompareKind::I8x16S)?;
3490febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3491febd080eSJeffrey Charles             })
3492febd080eSJeffrey Charles     }
3493febd080eSJeffrey Charles 
visit_i8x16_ge_u(&mut self) -> Self::Output3494febd080eSJeffrey Charles     fn visit_i8x16_ge_u(&mut self) -> Self::Output {
3495febd080eSJeffrey Charles         self.context
3496febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S8, |masm, dst, src, _size| {
3497febd080eSJeffrey Charles                 masm.v128_ge(writable!(dst), dst, src, VectorCompareKind::I8x16U)?;
3498febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3499febd080eSJeffrey Charles             })
3500febd080eSJeffrey Charles     }
3501febd080eSJeffrey Charles 
visit_i16x8_ge_s(&mut self) -> Self::Output3502febd080eSJeffrey Charles     fn visit_i16x8_ge_s(&mut self) -> Self::Output {
3503febd080eSJeffrey Charles         self.context
3504febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S16, |masm, dst, src, _size| {
3505febd080eSJeffrey Charles                 masm.v128_ge(writable!(dst), dst, src, VectorCompareKind::I16x8S)?;
3506febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3507febd080eSJeffrey Charles             })
3508febd080eSJeffrey Charles     }
3509febd080eSJeffrey Charles 
visit_i16x8_ge_u(&mut self) -> Self::Output3510febd080eSJeffrey Charles     fn visit_i16x8_ge_u(&mut self) -> Self::Output {
3511febd080eSJeffrey Charles         self.context
3512febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S16, |masm, dst, src, _size| {
3513febd080eSJeffrey Charles                 masm.v128_ge(writable!(dst), dst, src, VectorCompareKind::I16x8U)?;
3514febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3515febd080eSJeffrey Charles             })
3516febd080eSJeffrey Charles     }
3517febd080eSJeffrey Charles 
visit_i32x4_ge_s(&mut self) -> Self::Output3518febd080eSJeffrey Charles     fn visit_i32x4_ge_s(&mut self) -> Self::Output {
3519febd080eSJeffrey Charles         self.context
3520febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S32, |masm, dst, src, _size| {
3521febd080eSJeffrey Charles                 masm.v128_ge(writable!(dst), dst, src, VectorCompareKind::I32x4S)?;
3522febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3523febd080eSJeffrey Charles             })
3524febd080eSJeffrey Charles     }
3525febd080eSJeffrey Charles 
visit_i32x4_ge_u(&mut self) -> Self::Output3526febd080eSJeffrey Charles     fn visit_i32x4_ge_u(&mut self) -> Self::Output {
3527febd080eSJeffrey Charles         self.context
3528febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S32, |masm, dst, src, _size| {
3529febd080eSJeffrey Charles                 masm.v128_ge(writable!(dst), dst, src, VectorCompareKind::I32x4U)?;
3530febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3531febd080eSJeffrey Charles             })
3532febd080eSJeffrey Charles     }
3533febd080eSJeffrey Charles 
visit_i64x2_ge_s(&mut self) -> Self::Output3534febd080eSJeffrey Charles     fn visit_i64x2_ge_s(&mut self) -> Self::Output {
3535febd080eSJeffrey Charles         self.context
3536febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S64, |masm, dst, src, _size| {
3537febd080eSJeffrey Charles                 masm.v128_ge(writable!(dst), dst, src, VectorCompareKind::I64x2S)?;
3538febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3539febd080eSJeffrey Charles             })
3540febd080eSJeffrey Charles     }
3541febd080eSJeffrey Charles 
visit_f32x4_ge(&mut self) -> Self::Output3542febd080eSJeffrey Charles     fn visit_f32x4_ge(&mut self) -> Self::Output {
3543febd080eSJeffrey Charles         self.context
3544febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S32, |masm, dst, src, _size| {
3545febd080eSJeffrey Charles                 masm.v128_ge(writable!(dst), dst, src, VectorCompareKind::F32x4)?;
3546febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3547febd080eSJeffrey Charles             })
3548febd080eSJeffrey Charles     }
3549febd080eSJeffrey Charles 
visit_f64x2_ge(&mut self) -> Self::Output3550febd080eSJeffrey Charles     fn visit_f64x2_ge(&mut self) -> Self::Output {
3551febd080eSJeffrey Charles         self.context
3552febd080eSJeffrey Charles             .binop(self.masm, OperandSize::S32, |masm, dst, src, _size| {
3553febd080eSJeffrey Charles                 masm.v128_ge(writable!(dst), dst, src, VectorCompareKind::F64x2)?;
3554febd080eSJeffrey Charles                 Ok(TypedReg::v128(dst))
3555febd080eSJeffrey Charles             })
3556febd080eSJeffrey Charles     }
3557febd080eSJeffrey Charles 
visit_i8x16_replace_lane(&mut self, lane: u8) -> Self::Output35581ad7a4f6SJeffrey Charles     fn visit_i8x16_replace_lane(&mut self, lane: u8) -> Self::Output {
35591ad7a4f6SJeffrey Charles         self.context
35601ad7a4f6SJeffrey Charles             .replace_lane_op(self.masm, ReplaceLaneKind::I8x16, |masm, src, dst, kind| {
35611ad7a4f6SJeffrey Charles                 masm.replace_lane(src, dst, lane, kind)
35621ad7a4f6SJeffrey Charles             })
35631ad7a4f6SJeffrey Charles     }
35641ad7a4f6SJeffrey Charles 
visit_i16x8_replace_lane(&mut self, lane: u8) -> Self::Output35651ad7a4f6SJeffrey Charles     fn visit_i16x8_replace_lane(&mut self, lane: u8) -> Self::Output {
35661ad7a4f6SJeffrey Charles         self.context
35671ad7a4f6SJeffrey Charles             .replace_lane_op(self.masm, ReplaceLaneKind::I16x8, |masm, src, dst, kind| {
35681ad7a4f6SJeffrey Charles                 masm.replace_lane(src, dst, lane, kind)
35691ad7a4f6SJeffrey Charles             })
35701ad7a4f6SJeffrey Charles     }
35711ad7a4f6SJeffrey Charles 
visit_i32x4_replace_lane(&mut self, lane: u8) -> Self::Output35721ad7a4f6SJeffrey Charles     fn visit_i32x4_replace_lane(&mut self, lane: u8) -> Self::Output {
35731ad7a4f6SJeffrey Charles         self.context
35741ad7a4f6SJeffrey Charles             .replace_lane_op(self.masm, ReplaceLaneKind::I32x4, |masm, src, dst, kind| {
35751ad7a4f6SJeffrey Charles                 masm.replace_lane(src, dst, lane, kind)
35761ad7a4f6SJeffrey Charles             })
35771ad7a4f6SJeffrey Charles     }
35781ad7a4f6SJeffrey Charles 
visit_i64x2_replace_lane(&mut self, lane: u8) -> Self::Output35791ad7a4f6SJeffrey Charles     fn visit_i64x2_replace_lane(&mut self, lane: u8) -> Self::Output {
35801ad7a4f6SJeffrey Charles         self.context
35811ad7a4f6SJeffrey Charles             .replace_lane_op(self.masm, ReplaceLaneKind::I64x2, |masm, src, dst, kind| {
35821ad7a4f6SJeffrey Charles                 masm.replace_lane(src, dst, lane, kind)
35831ad7a4f6SJeffrey Charles             })
35841ad7a4f6SJeffrey Charles     }
35851ad7a4f6SJeffrey Charles 
visit_f32x4_replace_lane(&mut self, lane: u8) -> Self::Output35861ad7a4f6SJeffrey Charles     fn visit_f32x4_replace_lane(&mut self, lane: u8) -> Self::Output {
35871ad7a4f6SJeffrey Charles         self.context
35881ad7a4f6SJeffrey Charles             .replace_lane_op(self.masm, ReplaceLaneKind::F32x4, |masm, src, dst, kind| {
35891ad7a4f6SJeffrey Charles                 masm.replace_lane(src, dst, lane, kind)
35901ad7a4f6SJeffrey Charles             })
35911ad7a4f6SJeffrey Charles     }
35921ad7a4f6SJeffrey Charles 
visit_f64x2_replace_lane(&mut self, lane: u8) -> Self::Output35931ad7a4f6SJeffrey Charles     fn visit_f64x2_replace_lane(&mut self, lane: u8) -> Self::Output {
35941ad7a4f6SJeffrey Charles         self.context
35951ad7a4f6SJeffrey Charles             .replace_lane_op(self.masm, ReplaceLaneKind::F64x2, |masm, src, dst, kind| {
35961ad7a4f6SJeffrey Charles                 masm.replace_lane(src, dst, lane, kind)
35971ad7a4f6SJeffrey Charles             })
35981ad7a4f6SJeffrey Charles     }
35991ad7a4f6SJeffrey Charles 
visit_v128_not(&mut self) -> Self::Output3600cb195e54Sad hoc     fn visit_v128_not(&mut self) -> Self::Output {
3601cb195e54Sad hoc         self.context.unop(self.masm, |masm, reg| {
3602cb195e54Sad hoc             masm.v128_not(writable!(reg))?;
3603cb195e54Sad hoc             Ok(TypedReg::new(WasmValType::V128, reg))
3604cb195e54Sad hoc         })
3605cb195e54Sad hoc     }
3606cb195e54Sad hoc 
visit_v128_and(&mut self) -> Self::Output3607cb195e54Sad hoc     fn visit_v128_and(&mut self) -> Self::Output {
3608cb195e54Sad hoc         self.context
3609cb195e54Sad hoc             .binop(self.masm, OperandSize::S128, |masm, dst, src, _size| {
3610cb195e54Sad hoc                 masm.v128_and(dst, src, writable!(dst))?;
3611cb195e54Sad hoc                 Ok(TypedReg::new(WasmValType::V128, dst))
3612cb195e54Sad hoc             })
3613cb195e54Sad hoc     }
3614cb195e54Sad hoc 
visit_v128_andnot(&mut self) -> Self::Output3615cb195e54Sad hoc     fn visit_v128_andnot(&mut self) -> Self::Output {
3616cb195e54Sad hoc         self.context
3617cb195e54Sad hoc             .binop(self.masm, OperandSize::S128, |masm, dst, src, _size| {
3618cb195e54Sad hoc                 // careful here: and_not is *not* commutative: dst = !src1 & src2
3619cb195e54Sad hoc                 masm.v128_and_not(src, dst, writable!(dst))?;
3620cb195e54Sad hoc                 Ok(TypedReg::new(WasmValType::V128, dst))
3621cb195e54Sad hoc             })
3622cb195e54Sad hoc     }
3623cb195e54Sad hoc 
visit_v128_or(&mut self) -> Self::Output3624cb195e54Sad hoc     fn visit_v128_or(&mut self) -> Self::Output {
3625cb195e54Sad hoc         self.context
3626cb195e54Sad hoc             .binop(self.masm, OperandSize::S128, |masm, dst, src, _size| {
3627cb195e54Sad hoc                 // careful here: and_not is *not* commutative: dst = !src1 & src2
3628cb195e54Sad hoc                 masm.v128_or(src, dst, writable!(dst))?;
3629cb195e54Sad hoc                 Ok(TypedReg::new(WasmValType::V128, dst))
3630cb195e54Sad hoc             })
3631cb195e54Sad hoc     }
3632cb195e54Sad hoc 
visit_v128_xor(&mut self) -> Self::Output3633cb195e54Sad hoc     fn visit_v128_xor(&mut self) -> Self::Output {
3634cb195e54Sad hoc         self.context
3635cb195e54Sad hoc             .binop(self.masm, OperandSize::S128, |masm, dst, src, _size| {
3636cb195e54Sad hoc                 // careful here: and_not is *not* commutative: dst = !src1 & src2
3637cb195e54Sad hoc                 masm.v128_xor(src, dst, writable!(dst))?;
3638cb195e54Sad hoc                 Ok(TypedReg::new(WasmValType::V128, dst))
3639cb195e54Sad hoc             })
3640cb195e54Sad hoc     }
3641cb195e54Sad hoc 
visit_v128_bitselect(&mut self) -> Self::Output3642cb195e54Sad hoc     fn visit_v128_bitselect(&mut self) -> Self::Output {
3643cb195e54Sad hoc         let mask = self.context.pop_to_reg(self.masm, None)?;
3644cb195e54Sad hoc         let op2 = self.context.pop_to_reg(self.masm, None)?;
3645cb195e54Sad hoc         let op1 = self.context.pop_to_reg(self.masm, None)?;
3646cb195e54Sad hoc         let dst = self.context.any_fpr(self.masm)?;
3647cb195e54Sad hoc 
3648cb195e54Sad hoc         // careful here: bitselect is *not* commutative.
3649cb195e54Sad hoc         self.masm
3650cb195e54Sad hoc             .v128_bitselect(op1.reg, op2.reg, mask.reg, writable!(dst))?;
3651cb195e54Sad hoc 
3652cb195e54Sad hoc         self.context
3653cb195e54Sad hoc             .stack
3654cb195e54Sad hoc             .push(TypedReg::new(WasmValType::V128, dst).into());
3655cb195e54Sad hoc         self.context.free_reg(op1);
3656cb195e54Sad hoc         self.context.free_reg(op2);
3657cb195e54Sad hoc         self.context.free_reg(mask);
3658cb195e54Sad hoc 
3659cb195e54Sad hoc         Ok(())
3660cb195e54Sad hoc     }
3661cb195e54Sad hoc 
visit_v128_any_true(&mut self) -> Self::Output3662cb195e54Sad hoc     fn visit_v128_any_true(&mut self) -> Self::Output {
3663cb195e54Sad hoc         let src = self.context.pop_to_reg(self.masm, None)?;
3664cb195e54Sad hoc         let dst = self.context.any_gpr(self.masm)?;
3665cb195e54Sad hoc 
3666cb195e54Sad hoc         self.masm.v128_any_true(src.reg, writable!(dst))?;
3667cb195e54Sad hoc 
3668cb195e54Sad hoc         self.context
3669cb195e54Sad hoc             .stack
3670cb195e54Sad hoc             .push(TypedReg::new(WasmValType::I32, dst).into());
3671cb195e54Sad hoc         self.context.free_reg(src);
3672cb195e54Sad hoc 
3673cb195e54Sad hoc         Ok(())
3674cb195e54Sad hoc     }
3675cb195e54Sad hoc 
visit_v128_load8_lane(&mut self, arg: MemArg, lane: u8) -> Self::Output3676cb195e54Sad hoc     fn visit_v128_load8_lane(&mut self, arg: MemArg, lane: u8) -> Self::Output {
3677cb195e54Sad hoc         self.emit_wasm_load(
3678cb195e54Sad hoc             &arg,
3679cb195e54Sad hoc             WasmValType::V128,
3680cb195e54Sad hoc             LoadKind::vector_lane(lane, OperandSize::S8),
3681cb195e54Sad hoc         )
3682cb195e54Sad hoc     }
3683cb195e54Sad hoc 
visit_v128_load16_lane(&mut self, arg: MemArg, lane: u8) -> Self::Output3684cb195e54Sad hoc     fn visit_v128_load16_lane(&mut self, arg: MemArg, lane: u8) -> Self::Output {
3685cb195e54Sad hoc         self.emit_wasm_load(
3686cb195e54Sad hoc             &arg,
3687cb195e54Sad hoc             WasmValType::V128,
3688cb195e54Sad hoc             LoadKind::vector_lane(lane, OperandSize::S16),
3689cb195e54Sad hoc         )
3690cb195e54Sad hoc     }
3691cb195e54Sad hoc 
visit_v128_load32_lane(&mut self, arg: MemArg, lane: u8) -> Self::Output3692cb195e54Sad hoc     fn visit_v128_load32_lane(&mut self, arg: MemArg, lane: u8) -> Self::Output {
3693cb195e54Sad hoc         self.emit_wasm_load(
3694cb195e54Sad hoc             &arg,
3695cb195e54Sad hoc             WasmValType::V128,
3696cb195e54Sad hoc             LoadKind::vector_lane(lane, OperandSize::S32),
3697cb195e54Sad hoc         )
3698cb195e54Sad hoc     }
3699cb195e54Sad hoc 
visit_v128_load64_lane(&mut self, arg: MemArg, lane: u8) -> Self::Output3700cb195e54Sad hoc     fn visit_v128_load64_lane(&mut self, arg: MemArg, lane: u8) -> Self::Output {
3701cb195e54Sad hoc         self.emit_wasm_load(
3702cb195e54Sad hoc             &arg,
3703cb195e54Sad hoc             WasmValType::V128,
3704cb195e54Sad hoc             LoadKind::vector_lane(lane, OperandSize::S64),
3705cb195e54Sad hoc         )
3706cb195e54Sad hoc     }
3707cb195e54Sad hoc 
visit_v128_store8_lane(&mut self, arg: MemArg, lane: u8) -> Self::Output3708cb195e54Sad hoc     fn visit_v128_store8_lane(&mut self, arg: MemArg, lane: u8) -> Self::Output {
3709cb195e54Sad hoc         self.emit_wasm_store(&arg, StoreKind::vector_lane(lane, OperandSize::S8))
3710cb195e54Sad hoc     }
3711cb195e54Sad hoc 
visit_v128_store16_lane(&mut self, arg: MemArg, lane: u8) -> Self::Output3712cb195e54Sad hoc     fn visit_v128_store16_lane(&mut self, arg: MemArg, lane: u8) -> Self::Output {
3713cb195e54Sad hoc         self.emit_wasm_store(&arg, StoreKind::vector_lane(lane, OperandSize::S16))
3714cb195e54Sad hoc     }
3715cb195e54Sad hoc 
visit_v128_store32_lane(&mut self, arg: MemArg, lane: u8) -> Self::Output3716cb195e54Sad hoc     fn visit_v128_store32_lane(&mut self, arg: MemArg, lane: u8) -> Self::Output {
3717cb195e54Sad hoc         self.emit_wasm_store(&arg, StoreKind::vector_lane(lane, OperandSize::S32))
3718cb195e54Sad hoc     }
3719cb195e54Sad hoc 
visit_v128_store64_lane(&mut self, arg: MemArg, lane: u8) -> Self::Output3720cb195e54Sad hoc     fn visit_v128_store64_lane(&mut self, arg: MemArg, lane: u8) -> Self::Output {
3721cb195e54Sad hoc         self.emit_wasm_store(&arg, StoreKind::vector_lane(lane, OperandSize::S64))
3722cb195e54Sad hoc     }
3723cb195e54Sad hoc 
visit_f32x4_convert_i32x4_s(&mut self) -> Self::Output372476654321SJeffrey Charles     fn visit_f32x4_convert_i32x4_s(&mut self) -> Self::Output {
372576654321SJeffrey Charles         self.context.unop(self.masm, |masm, reg| {
372676654321SJeffrey Charles             masm.v128_convert(reg, writable!(reg), V128ConvertKind::I32x4S)?;
372776654321SJeffrey Charles             Ok(TypedReg::v128(reg))
372876654321SJeffrey Charles         })
372976654321SJeffrey Charles     }
373076654321SJeffrey Charles 
visit_f32x4_convert_i32x4_u(&mut self) -> Self::Output373176654321SJeffrey Charles     fn visit_f32x4_convert_i32x4_u(&mut self) -> Self::Output {
373276654321SJeffrey Charles         self.context.unop(self.masm, |masm, reg| {
373376654321SJeffrey Charles             masm.v128_convert(reg, writable!(reg), V128ConvertKind::I32x4U)?;
373476654321SJeffrey Charles             Ok(TypedReg::v128(reg))
373576654321SJeffrey Charles         })
373676654321SJeffrey Charles     }
373776654321SJeffrey Charles 
visit_f64x2_convert_low_i32x4_s(&mut self) -> Self::Output373876654321SJeffrey Charles     fn visit_f64x2_convert_low_i32x4_s(&mut self) -> Self::Output {
373976654321SJeffrey Charles         self.context.unop(self.masm, |masm, reg| {
374076654321SJeffrey Charles             masm.v128_convert(reg, writable!(reg), V128ConvertKind::I32x4LowS)?;
374176654321SJeffrey Charles             Ok(TypedReg::v128(reg))
374276654321SJeffrey Charles         })
374376654321SJeffrey Charles     }
374476654321SJeffrey Charles 
visit_f64x2_convert_low_i32x4_u(&mut self) -> Self::Output374576654321SJeffrey Charles     fn visit_f64x2_convert_low_i32x4_u(&mut self) -> Self::Output {
374676654321SJeffrey Charles         self.context.unop(self.masm, |masm, reg| {
374776654321SJeffrey Charles             masm.v128_convert(reg, writable!(reg), V128ConvertKind::I32x4LowU)?;
374876654321SJeffrey Charles             Ok(TypedReg::v128(reg))
374976654321SJeffrey Charles         })
375076654321SJeffrey Charles     }
375176654321SJeffrey Charles 
visit_i8x16_narrow_i16x8_s(&mut self) -> Self::Output375276654321SJeffrey Charles     fn visit_i8x16_narrow_i16x8_s(&mut self) -> Self::Output {
375376654321SJeffrey Charles         self.context
375476654321SJeffrey Charles             .binop(self.masm, OperandSize::S16, |masm, dst, src, _size| {
375576654321SJeffrey Charles                 masm.v128_narrow(dst, src, writable!(dst), V128NarrowKind::I16x8S)?;
375676654321SJeffrey Charles                 Ok(TypedReg::v128(dst))
375776654321SJeffrey Charles             })
375876654321SJeffrey Charles     }
375976654321SJeffrey Charles 
visit_i8x16_narrow_i16x8_u(&mut self) -> Self::Output376076654321SJeffrey Charles     fn visit_i8x16_narrow_i16x8_u(&mut self) -> Self::Output {
376176654321SJeffrey Charles         self.context
376276654321SJeffrey Charles             .binop(self.masm, OperandSize::S16, |masm, dst, src, _size| {
376376654321SJeffrey Charles                 masm.v128_narrow(dst, src, writable!(dst), V128NarrowKind::I16x8U)?;
376476654321SJeffrey Charles                 Ok(TypedReg::v128(dst))
376576654321SJeffrey Charles             })
376676654321SJeffrey Charles     }
376776654321SJeffrey Charles 
visit_i16x8_narrow_i32x4_s(&mut self) -> Self::Output376876654321SJeffrey Charles     fn visit_i16x8_narrow_i32x4_s(&mut self) -> Self::Output {
376976654321SJeffrey Charles         self.context
377076654321SJeffrey Charles             .binop(self.masm, OperandSize::S32, |masm, dst, src, _size| {
377176654321SJeffrey Charles                 masm.v128_narrow(dst, src, writable!(dst), V128NarrowKind::I32x4S)?;
377276654321SJeffrey Charles                 Ok(TypedReg::v128(dst))
377376654321SJeffrey Charles             })
377476654321SJeffrey Charles     }
377576654321SJeffrey Charles 
visit_i16x8_narrow_i32x4_u(&mut self) -> Self::Output377676654321SJeffrey Charles     fn visit_i16x8_narrow_i32x4_u(&mut self) -> Self::Output {
377776654321SJeffrey Charles         self.context
377876654321SJeffrey Charles             .binop(self.masm, OperandSize::S32, |masm, dst, src, _size| {
377976654321SJeffrey Charles                 masm.v128_narrow(dst, src, writable!(dst), V128NarrowKind::I32x4U)?;
378076654321SJeffrey Charles                 Ok(TypedReg::v128(dst))
378176654321SJeffrey Charles             })
378276654321SJeffrey Charles     }
378376654321SJeffrey Charles 
visit_f32x4_demote_f64x2_zero(&mut self) -> Self::Output378476654321SJeffrey Charles     fn visit_f32x4_demote_f64x2_zero(&mut self) -> Self::Output {
378576654321SJeffrey Charles         self.context.unop(self.masm, |masm, reg| {
378676654321SJeffrey Charles             masm.v128_demote(reg, writable!(reg))?;
378776654321SJeffrey Charles             Ok(TypedReg::v128(reg))
378876654321SJeffrey Charles         })
378976654321SJeffrey Charles     }
379076654321SJeffrey Charles 
visit_f64x2_promote_low_f32x4(&mut self) -> Self::Output379176654321SJeffrey Charles     fn visit_f64x2_promote_low_f32x4(&mut self) -> Self::Output {
379276654321SJeffrey Charles         self.context.unop(self.masm, |masm, reg| {
379376654321SJeffrey Charles             masm.v128_promote(reg, writable!(reg))?;
379476654321SJeffrey Charles             Ok(TypedReg::v128(reg))
379576654321SJeffrey Charles         })
379676654321SJeffrey Charles     }
379776654321SJeffrey Charles 
visit_i16x8_extend_low_i8x16_s(&mut self) -> Self::Output379876654321SJeffrey Charles     fn visit_i16x8_extend_low_i8x16_s(&mut self) -> Self::Output {
379976654321SJeffrey Charles         self.context.unop(self.masm, |masm, reg| {
380076654321SJeffrey Charles             masm.v128_extend(reg, writable!(reg), V128ExtendKind::LowI8x16S)?;
380176654321SJeffrey Charles             Ok(TypedReg::v128(reg))
380276654321SJeffrey Charles         })
380376654321SJeffrey Charles     }
380476654321SJeffrey Charles 
visit_i16x8_extend_high_i8x16_s(&mut self) -> Self::Output380576654321SJeffrey Charles     fn visit_i16x8_extend_high_i8x16_s(&mut self) -> Self::Output {
380676654321SJeffrey Charles         self.context.unop(self.masm, |masm, reg| {
380776654321SJeffrey Charles             masm.v128_extend(reg, writable!(reg), V128ExtendKind::HighI8x16S)?;
380876654321SJeffrey Charles             Ok(TypedReg::v128(reg))
380976654321SJeffrey Charles         })
381076654321SJeffrey Charles     }
381176654321SJeffrey Charles 
visit_i16x8_extend_low_i8x16_u(&mut self) -> Self::Output381276654321SJeffrey Charles     fn visit_i16x8_extend_low_i8x16_u(&mut self) -> Self::Output {
381376654321SJeffrey Charles         self.context.unop(self.masm, |masm, reg| {
381476654321SJeffrey Charles             masm.v128_extend(reg, writable!(reg), V128ExtendKind::LowI8x16U)?;
381576654321SJeffrey Charles             Ok(TypedReg::v128(reg))
381676654321SJeffrey Charles         })
381776654321SJeffrey Charles     }
381876654321SJeffrey Charles 
visit_i16x8_extend_high_i8x16_u(&mut self) -> Self::Output381976654321SJeffrey Charles     fn visit_i16x8_extend_high_i8x16_u(&mut self) -> Self::Output {
382076654321SJeffrey Charles         self.context.unop(self.masm, |masm, reg| {
382176654321SJeffrey Charles             masm.v128_extend(reg, writable!(reg), V128ExtendKind::HighI8x16U)?;
382276654321SJeffrey Charles             Ok(TypedReg::v128(reg))
382376654321SJeffrey Charles         })
382476654321SJeffrey Charles     }
382576654321SJeffrey Charles 
visit_i32x4_extend_low_i16x8_s(&mut self) -> Self::Output382676654321SJeffrey Charles     fn visit_i32x4_extend_low_i16x8_s(&mut self) -> Self::Output {
382776654321SJeffrey Charles         self.context.unop(self.masm, |masm, reg| {
382876654321SJeffrey Charles             masm.v128_extend(reg, writable!(reg), V128ExtendKind::LowI16x8S)?;
382976654321SJeffrey Charles             Ok(TypedReg::v128(reg))
383076654321SJeffrey Charles         })
383176654321SJeffrey Charles     }
383276654321SJeffrey Charles 
visit_i32x4_extend_high_i16x8_s(&mut self) -> Self::Output383376654321SJeffrey Charles     fn visit_i32x4_extend_high_i16x8_s(&mut self) -> Self::Output {
383476654321SJeffrey Charles         self.context.unop(self.masm, |masm, reg| {
383576654321SJeffrey Charles             masm.v128_extend(reg, writable!(reg), V128ExtendKind::HighI16x8S)?;
383676654321SJeffrey Charles             Ok(TypedReg::v128(reg))
383776654321SJeffrey Charles         })
383876654321SJeffrey Charles     }
383976654321SJeffrey Charles 
visit_i32x4_extend_low_i16x8_u(&mut self) -> Self::Output384076654321SJeffrey Charles     fn visit_i32x4_extend_low_i16x8_u(&mut self) -> Self::Output {
384176654321SJeffrey Charles         self.context.unop(self.masm, |masm, reg| {
384276654321SJeffrey Charles             masm.v128_extend(reg, writable!(reg), V128ExtendKind::LowI16x8U)?;
384376654321SJeffrey Charles             Ok(TypedReg::v128(reg))
384476654321SJeffrey Charles         })
384576654321SJeffrey Charles     }
384676654321SJeffrey Charles 
visit_i32x4_extend_high_i16x8_u(&mut self) -> Self::Output384776654321SJeffrey Charles     fn visit_i32x4_extend_high_i16x8_u(&mut self) -> Self::Output {
384876654321SJeffrey Charles         self.context.unop(self.masm, |masm, reg| {
384976654321SJeffrey Charles             masm.v128_extend(reg, writable!(reg), V128ExtendKind::HighI16x8U)?;
385076654321SJeffrey Charles             Ok(TypedReg::v128(reg))
385176654321SJeffrey Charles         })
385276654321SJeffrey Charles     }
385376654321SJeffrey Charles 
visit_i64x2_extend_low_i32x4_s(&mut self) -> Self::Output385476654321SJeffrey Charles     fn visit_i64x2_extend_low_i32x4_s(&mut self) -> Self::Output {
385576654321SJeffrey Charles         self.context.unop(self.masm, |masm, reg| {
385676654321SJeffrey Charles             masm.v128_extend(reg, writable!(reg), V128ExtendKind::LowI32x4S)?;
385776654321SJeffrey Charles             Ok(TypedReg::v128(reg))
385876654321SJeffrey Charles         })
385976654321SJeffrey Charles     }
386076654321SJeffrey Charles 
visit_i64x2_extend_high_i32x4_s(&mut self) -> Self::Output386176654321SJeffrey Charles     fn visit_i64x2_extend_high_i32x4_s(&mut self) -> Self::Output {
386276654321SJeffrey Charles         self.context.unop(self.masm, |masm, reg| {
386376654321SJeffrey Charles             masm.v128_extend(reg, writable!(reg), V128ExtendKind::HighI32x4S)?;
386476654321SJeffrey Charles             Ok(TypedReg::v128(reg))
386576654321SJeffrey Charles         })
386676654321SJeffrey Charles     }
386776654321SJeffrey Charles 
visit_i64x2_extend_low_i32x4_u(&mut self) -> Self::Output386876654321SJeffrey Charles     fn visit_i64x2_extend_low_i32x4_u(&mut self) -> Self::Output {
386976654321SJeffrey Charles         self.context.unop(self.masm, |masm, reg| {
387076654321SJeffrey Charles             masm.v128_extend(reg, writable!(reg), V128ExtendKind::LowI32x4U)?;
387176654321SJeffrey Charles             Ok(TypedReg::v128(reg))
387276654321SJeffrey Charles         })
387376654321SJeffrey Charles     }
387476654321SJeffrey Charles 
visit_i64x2_extend_high_i32x4_u(&mut self) -> Self::Output387576654321SJeffrey Charles     fn visit_i64x2_extend_high_i32x4_u(&mut self) -> Self::Output {
387676654321SJeffrey Charles         self.context.unop(self.masm, |masm, reg| {
387776654321SJeffrey Charles             masm.v128_extend(reg, writable!(reg), V128ExtendKind::HighI32x4U)?;
387876654321SJeffrey Charles             Ok(TypedReg::v128(reg))
387976654321SJeffrey Charles         })
388076654321SJeffrey Charles     }
388176654321SJeffrey Charles 
visit_i8x16_add(&mut self) -> Self::Output388270c93c67Sad hoc     fn visit_i8x16_add(&mut self) -> Self::Output {
388370c93c67Sad hoc         self.context
388441b7b260SJeffrey Charles             .binop(self.masm, OperandSize::S8, |masm, dst, src, _size| {
388541b7b260SJeffrey Charles                 masm.v128_add(dst, src, writable!(dst), V128AddKind::I8x16)?;
388670c93c67Sad hoc                 Ok(TypedReg::new(WasmValType::V128, dst))
388770c93c67Sad hoc             })
388870c93c67Sad hoc     }
388970c93c67Sad hoc 
visit_i16x8_add(&mut self) -> Self::Output389070c93c67Sad hoc     fn visit_i16x8_add(&mut self) -> Self::Output {
389170c93c67Sad hoc         self.context
389241b7b260SJeffrey Charles             .binop(self.masm, OperandSize::S16, |masm, dst, src, _size| {
389341b7b260SJeffrey Charles                 masm.v128_add(dst, src, writable!(dst), V128AddKind::I16x8)?;
389470c93c67Sad hoc                 Ok(TypedReg::new(WasmValType::V128, dst))
389570c93c67Sad hoc             })
389670c93c67Sad hoc     }
389770c93c67Sad hoc 
visit_i32x4_add(&mut self) -> Self::Output389870c93c67Sad hoc     fn visit_i32x4_add(&mut self) -> Self::Output {
389970c93c67Sad hoc         self.context
390041b7b260SJeffrey Charles             .binop(self.masm, OperandSize::S32, |masm, dst, src, _size| {
390141b7b260SJeffrey Charles                 masm.v128_add(dst, src, writable!(dst), V128AddKind::I32x4)?;
390270c93c67Sad hoc                 Ok(TypedReg::new(WasmValType::V128, dst))
390370c93c67Sad hoc             })
390470c93c67Sad hoc     }
390570c93c67Sad hoc 
visit_i64x2_add(&mut self) -> Self::Output390670c93c67Sad hoc     fn visit_i64x2_add(&mut self) -> Self::Output {
390770c93c67Sad hoc         self.context
390841b7b260SJeffrey Charles             .binop(self.masm, OperandSize::S64, |masm, dst, src, _size| {
390941b7b260SJeffrey Charles                 masm.v128_add(dst, src, writable!(dst), V128AddKind::I64x2)?;
391070c93c67Sad hoc                 Ok(TypedReg::new(WasmValType::V128, dst))
391170c93c67Sad hoc             })
391270c93c67Sad hoc     }
391370c93c67Sad hoc 
visit_i8x16_sub(&mut self) -> Self::Output391470c93c67Sad hoc     fn visit_i8x16_sub(&mut self) -> Self::Output {
391570c93c67Sad hoc         self.context
391641b7b260SJeffrey Charles             .binop(self.masm, OperandSize::S8, |masm, dst, src, _size| {
391741b7b260SJeffrey Charles                 masm.v128_sub(dst, src, writable!(dst), V128SubKind::I8x16)?;
391870c93c67Sad hoc                 Ok(TypedReg::new(WasmValType::V128, dst))
391970c93c67Sad hoc             })
392070c93c67Sad hoc     }
392170c93c67Sad hoc 
visit_i16x8_sub(&mut self) -> Self::Output392270c93c67Sad hoc     fn visit_i16x8_sub(&mut self) -> Self::Output {
392370c93c67Sad hoc         self.context
392441b7b260SJeffrey Charles             .binop(self.masm, OperandSize::S16, |masm, dst, src, _size| {
392541b7b260SJeffrey Charles                 masm.v128_sub(dst, src, writable!(dst), V128SubKind::I16x8)?;
392670c93c67Sad hoc                 Ok(TypedReg::new(WasmValType::V128, dst))
392770c93c67Sad hoc             })
392870c93c67Sad hoc     }
392970c93c67Sad hoc 
visit_i32x4_sub(&mut self) -> Self::Output393070c93c67Sad hoc     fn visit_i32x4_sub(&mut self) -> Self::Output {
393170c93c67Sad hoc         self.context
393241b7b260SJeffrey Charles             .binop(self.masm, OperandSize::S32, |masm, dst, src, _size| {
393341b7b260SJeffrey Charles                 masm.v128_sub(dst, src, writable!(dst), V128SubKind::I32x4)?;
393470c93c67Sad hoc                 Ok(TypedReg::new(WasmValType::V128, dst))
393570c93c67Sad hoc             })
393670c93c67Sad hoc     }
393770c93c67Sad hoc 
visit_i64x2_sub(&mut self) -> Self::Output393870c93c67Sad hoc     fn visit_i64x2_sub(&mut self) -> Self::Output {
393970c93c67Sad hoc         self.context
394041b7b260SJeffrey Charles             .binop(self.masm, OperandSize::S64, |masm, dst, src, _size| {
394141b7b260SJeffrey Charles                 masm.v128_sub(dst, src, writable!(dst), V128SubKind::I64x2)?;
394270c93c67Sad hoc                 Ok(TypedReg::new(WasmValType::V128, dst))
394370c93c67Sad hoc             })
394470c93c67Sad hoc     }
394570c93c67Sad hoc 
visit_i16x8_mul(&mut self) -> Self::Output394670c93c67Sad hoc     fn visit_i16x8_mul(&mut self) -> Self::Output {
394741b7b260SJeffrey Charles         self.masm.v128_mul(&mut self.context, V128MulKind::I16x8)
394870c93c67Sad hoc     }
394970c93c67Sad hoc 
visit_i32x4_mul(&mut self) -> Self::Output395070c93c67Sad hoc     fn visit_i32x4_mul(&mut self) -> Self::Output {
395141b7b260SJeffrey Charles         self.masm.v128_mul(&mut self.context, V128MulKind::I32x4)
395270c93c67Sad hoc     }
395370c93c67Sad hoc 
visit_i64x2_mul(&mut self) -> Self::Output395470c93c67Sad hoc     fn visit_i64x2_mul(&mut self) -> Self::Output {
395541b7b260SJeffrey Charles         self.masm.v128_mul(&mut self.context, V128MulKind::I64x2)
395670c93c67Sad hoc     }
395770c93c67Sad hoc 
visit_i8x16_add_sat_s(&mut self) -> Self::Output395870c93c67Sad hoc     fn visit_i8x16_add_sat_s(&mut self) -> Self::Output {
395970c93c67Sad hoc         self.context
396041b7b260SJeffrey Charles             .binop(self.masm, OperandSize::S8, |masm, dst, src, _size| {
396141b7b260SJeffrey Charles                 masm.v128_add(dst, src, writable!(dst), V128AddKind::I8x16SatS)?;
396270c93c67Sad hoc                 Ok(TypedReg::new(WasmValType::V128, dst))
396370c93c67Sad hoc             })
396470c93c67Sad hoc     }
396570c93c67Sad hoc 
visit_i16x8_add_sat_s(&mut self) -> Self::Output396670c93c67Sad hoc     fn visit_i16x8_add_sat_s(&mut self) -> Self::Output {
396770c93c67Sad hoc         self.context
396841b7b260SJeffrey Charles             .binop(self.masm, OperandSize::S16, |masm, dst, src, _size| {
396941b7b260SJeffrey Charles                 masm.v128_add(dst, src, writable!(dst), V128AddKind::I16x8SatS)?;
397070c93c67Sad hoc                 Ok(TypedReg::new(WasmValType::V128, dst))
397170c93c67Sad hoc             })
397270c93c67Sad hoc     }
397370c93c67Sad hoc 
visit_i8x16_add_sat_u(&mut self) -> Self::Output397470c93c67Sad hoc     fn visit_i8x16_add_sat_u(&mut self) -> Self::Output {
397570c93c67Sad hoc         self.context
397641b7b260SJeffrey Charles             .binop(self.masm, OperandSize::S8, |masm, dst, src, _size| {
397741b7b260SJeffrey Charles                 masm.v128_add(dst, src, writable!(dst), V128AddKind::I8x16SatU)?;
397870c93c67Sad hoc                 Ok(TypedReg::new(WasmValType::V128, dst))
397970c93c67Sad hoc             })
398070c93c67Sad hoc     }
398170c93c67Sad hoc 
visit_i16x8_add_sat_u(&mut self) -> Self::Output398270c93c67Sad hoc     fn visit_i16x8_add_sat_u(&mut self) -> Self::Output {
398370c93c67Sad hoc         self.context
398441b7b260SJeffrey Charles             .binop(self.masm, OperandSize::S16, |masm, dst, src, _size| {
398541b7b260SJeffrey Charles                 masm.v128_add(dst, src, writable!(dst), V128AddKind::I16x8SatU)?;
398670c93c67Sad hoc                 Ok(TypedReg::new(WasmValType::V128, dst))
398770c93c67Sad hoc             })
398870c93c67Sad hoc     }
398970c93c67Sad hoc 
visit_i8x16_sub_sat_s(&mut self) -> Self::Output399070c93c67Sad hoc     fn visit_i8x16_sub_sat_s(&mut self) -> Self::Output {
399170c93c67Sad hoc         self.context
399241b7b260SJeffrey Charles             .binop(self.masm, OperandSize::S8, |masm, dst, src, _size| {
399341b7b260SJeffrey Charles                 masm.v128_sub(dst, src, writable!(dst), V128SubKind::I8x16SatS)?;
399470c93c67Sad hoc                 Ok(TypedReg::new(WasmValType::V128, dst))
399570c93c67Sad hoc             })
399670c93c67Sad hoc     }
399770c93c67Sad hoc 
visit_i16x8_sub_sat_s(&mut self) -> Self::Output399870c93c67Sad hoc     fn visit_i16x8_sub_sat_s(&mut self) -> Self::Output {
399970c93c67Sad hoc         self.context
400041b7b260SJeffrey Charles             .binop(self.masm, OperandSize::S16, |masm, dst, src, _size| {
400141b7b260SJeffrey Charles                 masm.v128_sub(dst, src, writable!(dst), V128SubKind::I16x8SatS)?;
400270c93c67Sad hoc                 Ok(TypedReg::new(WasmValType::V128, dst))
400370c93c67Sad hoc             })
400470c93c67Sad hoc     }
400570c93c67Sad hoc 
visit_i8x16_sub_sat_u(&mut self) -> Self::Output400670c93c67Sad hoc     fn visit_i8x16_sub_sat_u(&mut self) -> Self::Output {
400770c93c67Sad hoc         self.context
400841b7b260SJeffrey Charles             .binop(self.masm, OperandSize::S8, |masm, dst, src, _size| {
400941b7b260SJeffrey Charles                 masm.v128_sub(dst, src, writable!(dst), V128SubKind::I8x16SatU)?;
401070c93c67Sad hoc                 Ok(TypedReg::new(WasmValType::V128, dst))
401170c93c67Sad hoc             })
401270c93c67Sad hoc     }
401370c93c67Sad hoc 
visit_i16x8_sub_sat_u(&mut self) -> Self::Output401470c93c67Sad hoc     fn visit_i16x8_sub_sat_u(&mut self) -> Self::Output {
401570c93c67Sad hoc         self.context
401641b7b260SJeffrey Charles             .binop(self.masm, OperandSize::S16, |masm, dst, src, _size| {
401741b7b260SJeffrey Charles                 masm.v128_sub(dst, src, writable!(dst), V128SubKind::I16x8SatU)?;
401870c93c67Sad hoc                 Ok(TypedReg::new(WasmValType::V128, dst))
401970c93c67Sad hoc             })
402070c93c67Sad hoc     }
402170c93c67Sad hoc 
visit_i8x16_abs(&mut self) -> Self::Output402248fe3bb5SJeffrey Charles     fn visit_i8x16_abs(&mut self) -> Self::Output {
402348fe3bb5SJeffrey Charles         self.context.unop(self.masm, |masm, reg| {
402448fe3bb5SJeffrey Charles             masm.v128_abs(reg, writable!(reg), V128AbsKind::I8x16)?;
402548fe3bb5SJeffrey Charles             Ok(TypedReg::new(WasmValType::V128, reg))
402648fe3bb5SJeffrey Charles         })
402748fe3bb5SJeffrey Charles     }
402848fe3bb5SJeffrey Charles 
visit_i16x8_abs(&mut self) -> Self::Output402948fe3bb5SJeffrey Charles     fn visit_i16x8_abs(&mut self) -> Self::Output {
403048fe3bb5SJeffrey Charles         self.context.unop(self.masm, |masm, reg| {
403148fe3bb5SJeffrey Charles             masm.v128_abs(reg, writable!(reg), V128AbsKind::I16x8)?;
403248fe3bb5SJeffrey Charles             Ok(TypedReg::new(WasmValType::V128, reg))
403348fe3bb5SJeffrey Charles         })
403448fe3bb5SJeffrey Charles     }
403548fe3bb5SJeffrey Charles 
visit_i32x4_abs(&mut self) -> Self::Output403648fe3bb5SJeffrey Charles     fn visit_i32x4_abs(&mut self) -> Self::Output {
403748fe3bb5SJeffrey Charles         self.context.unop(self.masm, |masm, reg| {
403848fe3bb5SJeffrey Charles             masm.v128_abs(reg, writable!(reg), V128AbsKind::I32x4)?;
403948fe3bb5SJeffrey Charles             Ok(TypedReg::new(WasmValType::V128, reg))
404048fe3bb5SJeffrey Charles         })
404148fe3bb5SJeffrey Charles     }
404248fe3bb5SJeffrey Charles 
visit_i64x2_abs(&mut self) -> Self::Output404348fe3bb5SJeffrey Charles     fn visit_i64x2_abs(&mut self) -> Self::Output {
404448fe3bb5SJeffrey Charles         self.context.unop(self.masm, |masm, reg| {
404548fe3bb5SJeffrey Charles             masm.v128_abs(reg, writable!(reg), V128AbsKind::I64x2)?;
404648fe3bb5SJeffrey Charles             Ok(TypedReg::new(WasmValType::V128, reg))
404748fe3bb5SJeffrey Charles         })
404848fe3bb5SJeffrey Charles     }
404948fe3bb5SJeffrey Charles 
visit_f32x4_abs(&mut self) -> Self::Output405048fe3bb5SJeffrey Charles     fn visit_f32x4_abs(&mut self) -> Self::Output {
405148fe3bb5SJeffrey Charles         self.context.unop(self.masm, |masm, reg| {
405248fe3bb5SJeffrey Charles             masm.v128_abs(reg, writable!(reg), V128AbsKind::F32x4)?;
405348fe3bb5SJeffrey Charles             Ok(TypedReg::new(WasmValType::V128, reg))
405448fe3bb5SJeffrey Charles         })
405548fe3bb5SJeffrey Charles     }
405648fe3bb5SJeffrey Charles 
visit_f64x2_abs(&mut self) -> Self::Output405748fe3bb5SJeffrey Charles     fn visit_f64x2_abs(&mut self) -> Self::Output {
405848fe3bb5SJeffrey Charles         self.context.unop(self.masm, |masm, reg| {
405948fe3bb5SJeffrey Charles             masm.v128_abs(reg, writable!(reg), V128AbsKind::F64x2)?;
406048fe3bb5SJeffrey Charles             Ok(TypedReg::new(WasmValType::V128, reg))
406148fe3bb5SJeffrey Charles         })
406248fe3bb5SJeffrey Charles     }
406348fe3bb5SJeffrey Charles 
visit_i8x16_neg(&mut self) -> Self::Output4064d943d57eSad hoc     fn visit_i8x16_neg(&mut self) -> Self::Output {
4065d943d57eSad hoc         self.context.unop(self.masm, |masm, op| {
406641b7b260SJeffrey Charles             masm.v128_neg(writable!(op), V128NegKind::I8x16)?;
4067d943d57eSad hoc             Ok(TypedReg::new(WasmValType::V128, op))
4068d943d57eSad hoc         })
4069d943d57eSad hoc     }
4070d943d57eSad hoc 
visit_i16x8_neg(&mut self) -> Self::Output4071d943d57eSad hoc     fn visit_i16x8_neg(&mut self) -> Self::Output {
4072d943d57eSad hoc         self.context.unop(self.masm, |masm, op| {
407341b7b260SJeffrey Charles             masm.v128_neg(writable!(op), V128NegKind::I16x8)?;
4074d943d57eSad hoc             Ok(TypedReg::new(WasmValType::V128, op))
4075d943d57eSad hoc         })
4076d943d57eSad hoc     }
4077d943d57eSad hoc 
visit_i32x4_neg(&mut self) -> Self::Output4078d943d57eSad hoc     fn visit_i32x4_neg(&mut self) -> Self::Output {
4079d943d57eSad hoc         self.context.unop(self.masm, |masm, op| {
408041b7b260SJeffrey Charles             masm.v128_neg(writable!(op), V128NegKind::I32x4)?;
4081d943d57eSad hoc             Ok(TypedReg::new(WasmValType::V128, op))
4082d943d57eSad hoc         })
4083d943d57eSad hoc     }
4084d943d57eSad hoc 
visit_i64x2_neg(&mut self) -> Self::Output4085d943d57eSad hoc     fn visit_i64x2_neg(&mut self) -> Self::Output {
4086d943d57eSad hoc         self.context.unop(self.masm, |masm, op| {
408741b7b260SJeffrey Charles             masm.v128_neg(writable!(op), V128NegKind::I64x2)?;
4088d943d57eSad hoc             Ok(TypedReg::new(WasmValType::V128, op))
4089d943d57eSad hoc         })
4090d943d57eSad hoc     }
4091d943d57eSad hoc 
visit_i8x16_shl(&mut self) -> Self::Output4092d943d57eSad hoc     fn visit_i8x16_shl(&mut self) -> Self::Output {
4093d943d57eSad hoc         self.masm
4094d943d57eSad hoc             .v128_shift(&mut self.context, OperandSize::S8, ShiftKind::Shl)
4095d943d57eSad hoc     }
4096d943d57eSad hoc 
visit_i16x8_shl(&mut self) -> Self::Output4097d943d57eSad hoc     fn visit_i16x8_shl(&mut self) -> Self::Output {
4098d943d57eSad hoc         self.masm
4099d943d57eSad hoc             .v128_shift(&mut self.context, OperandSize::S16, ShiftKind::Shl)
4100d943d57eSad hoc     }
4101d943d57eSad hoc 
visit_i32x4_shl(&mut self) -> Self::Output4102d943d57eSad hoc     fn visit_i32x4_shl(&mut self) -> Self::Output {
4103d943d57eSad hoc         self.masm
4104d943d57eSad hoc             .v128_shift(&mut self.context, OperandSize::S32, ShiftKind::Shl)
4105d943d57eSad hoc     }
4106d943d57eSad hoc 
visit_i64x2_shl(&mut self) -> Self::Output4107d943d57eSad hoc     fn visit_i64x2_shl(&mut self) -> Self::Output {
4108d943d57eSad hoc         self.masm
4109d943d57eSad hoc             .v128_shift(&mut self.context, OperandSize::S64, ShiftKind::Shl)
4110d943d57eSad hoc     }
4111d943d57eSad hoc 
visit_i8x16_shr_u(&mut self) -> Self::Output4112d943d57eSad hoc     fn visit_i8x16_shr_u(&mut self) -> Self::Output {
4113d943d57eSad hoc         self.masm
4114d943d57eSad hoc             .v128_shift(&mut self.context, OperandSize::S8, ShiftKind::ShrU)
4115d943d57eSad hoc     }
4116d943d57eSad hoc 
visit_i16x8_shr_u(&mut self) -> Self::Output4117d943d57eSad hoc     fn visit_i16x8_shr_u(&mut self) -> Self::Output {
4118d943d57eSad hoc         self.masm
4119d943d57eSad hoc             .v128_shift(&mut self.context, OperandSize::S16, ShiftKind::ShrU)
4120d943d57eSad hoc     }
4121d943d57eSad hoc 
visit_i32x4_shr_u(&mut self) -> Self::Output4122d943d57eSad hoc     fn visit_i32x4_shr_u(&mut self) -> Self::Output {
4123d943d57eSad hoc         self.masm
4124d943d57eSad hoc             .v128_shift(&mut self.context, OperandSize::S32, ShiftKind::ShrU)
4125d943d57eSad hoc     }
4126d943d57eSad hoc 
visit_i64x2_shr_u(&mut self) -> Self::Output4127d943d57eSad hoc     fn visit_i64x2_shr_u(&mut self) -> Self::Output {
4128d943d57eSad hoc         self.masm
4129d943d57eSad hoc             .v128_shift(&mut self.context, OperandSize::S64, ShiftKind::ShrU)
4130d943d57eSad hoc     }
4131d943d57eSad hoc 
visit_i8x16_shr_s(&mut self) -> Self::Output4132d943d57eSad hoc     fn visit_i8x16_shr_s(&mut self) -> Self::Output {
4133d943d57eSad hoc         self.masm
4134d943d57eSad hoc             .v128_shift(&mut self.context, OperandSize::S8, ShiftKind::ShrS)
4135d943d57eSad hoc     }
4136d943d57eSad hoc 
visit_i16x8_shr_s(&mut self) -> Self::Output4137d943d57eSad hoc     fn visit_i16x8_shr_s(&mut self) -> Self::Output {
4138d943d57eSad hoc         self.masm
4139d943d57eSad hoc             .v128_shift(&mut self.context, OperandSize::S16, ShiftKind::ShrS)
4140d943d57eSad hoc     }
4141d943d57eSad hoc 
visit_i32x4_shr_s(&mut self) -> Self::Output4142d943d57eSad hoc     fn visit_i32x4_shr_s(&mut self) -> Self::Output {
4143d943d57eSad hoc         self.masm
4144d943d57eSad hoc             .v128_shift(&mut self.context, OperandSize::S32, ShiftKind::ShrS)
4145d943d57eSad hoc     }
4146d943d57eSad hoc 
visit_i64x2_shr_s(&mut self) -> Self::Output4147d943d57eSad hoc     fn visit_i64x2_shr_s(&mut self) -> Self::Output {
4148d943d57eSad hoc         self.masm
4149d943d57eSad hoc             .v128_shift(&mut self.context, OperandSize::S64, ShiftKind::ShrS)
4150d943d57eSad hoc     }
4151d943d57eSad hoc 
visit_i16x8_q15mulr_sat_s(&mut self) -> Self::Output4152b5b82579SJeffrey Charles     fn visit_i16x8_q15mulr_sat_s(&mut self) -> Self::Output {
4153b5b82579SJeffrey Charles         self.context
4154b5b82579SJeffrey Charles             .binop(self.masm, OperandSize::S16, |masm, dst, src, size| {
4155b5b82579SJeffrey Charles                 masm.v128_q15mulr_sat_s(dst, src, writable!(dst), size)?;
4156b5b82579SJeffrey Charles                 Ok(TypedReg::v128(dst))
4157b5b82579SJeffrey Charles             })
4158b5b82579SJeffrey Charles     }
4159b5b82579SJeffrey Charles 
visit_i8x16_min_s(&mut self) -> Self::Output4160305c3f99Sad hoc     fn visit_i8x16_min_s(&mut self) -> Self::Output {
4161305c3f99Sad hoc         self.context
416241b7b260SJeffrey Charles             .binop(self.masm, OperandSize::S8, |masm, dst, src, _size| {
416341b7b260SJeffrey Charles                 masm.v128_min(src, dst, writable!(dst), V128MinKind::I8x16S)?;
4164305c3f99Sad hoc                 Ok(TypedReg::v128(dst))
4165305c3f99Sad hoc             })
4166305c3f99Sad hoc     }
4167305c3f99Sad hoc 
visit_i8x16_all_true(&mut self) -> Self::Output41686eb3155eSJeffrey Charles     fn visit_i8x16_all_true(&mut self) -> Self::Output {
41696eb3155eSJeffrey Charles         self.context.v128_all_true_op(self.masm, |masm, src, dst| {
41706eb3155eSJeffrey Charles             masm.v128_all_true(src, writable!(dst), OperandSize::S8)
41716eb3155eSJeffrey Charles         })
41726eb3155eSJeffrey Charles     }
41736eb3155eSJeffrey Charles 
visit_i16x8_all_true(&mut self) -> Self::Output41746eb3155eSJeffrey Charles     fn visit_i16x8_all_true(&mut self) -> Self::Output {
41756eb3155eSJeffrey Charles         self.context.v128_all_true_op(self.masm, |masm, src, dst| {
41766eb3155eSJeffrey Charles             masm.v128_all_true(src, writable!(dst), OperandSize::S16)
41776eb3155eSJeffrey Charles         })
41786eb3155eSJeffrey Charles     }
41796eb3155eSJeffrey Charles 
visit_i32x4_all_true(&mut self) -> Self::Output41806eb3155eSJeffrey Charles     fn visit_i32x4_all_true(&mut self) -> Self::Output {
41816eb3155eSJeffrey Charles         self.context.v128_all_true_op(self.masm, |masm, src, dst| {
41826eb3155eSJeffrey Charles             masm.v128_all_true(src, writable!(dst), OperandSize::S32)
41836eb3155eSJeffrey Charles         })
41846eb3155eSJeffrey Charles     }
41856eb3155eSJeffrey Charles 
visit_i64x2_all_true(&mut self) -> Self::Output41866eb3155eSJeffrey Charles     fn visit_i64x2_all_true(&mut self) -> Self::Output {
41876eb3155eSJeffrey Charles         self.context.v128_all_true_op(self.masm, |masm, src, dst| {
41886eb3155eSJeffrey Charles             masm.v128_all_true(src, writable!(dst), OperandSize::S64)
41896eb3155eSJeffrey Charles         })
41906eb3155eSJeffrey Charles     }
41916eb3155eSJeffrey Charles 
visit_i8x16_bitmask(&mut self) -> Self::Output41926eb3155eSJeffrey Charles     fn visit_i8x16_bitmask(&mut self) -> Self::Output {
41936eb3155eSJeffrey Charles         self.context.v128_bitmask_op(self.masm, |masm, src, dst| {
41946eb3155eSJeffrey Charles             masm.v128_bitmask(src, writable!(dst), OperandSize::S8)
41956eb3155eSJeffrey Charles         })
41966eb3155eSJeffrey Charles     }
41976eb3155eSJeffrey Charles 
visit_i16x8_bitmask(&mut self) -> Self::Output41986eb3155eSJeffrey Charles     fn visit_i16x8_bitmask(&mut self) -> Self::Output {
41996eb3155eSJeffrey Charles         self.context.v128_bitmask_op(self.masm, |masm, src, dst| {
42006eb3155eSJeffrey Charles             masm.v128_bitmask(src, writable!(dst), OperandSize::S16)
42016eb3155eSJeffrey Charles         })
42026eb3155eSJeffrey Charles     }
42036eb3155eSJeffrey Charles 
visit_i32x4_bitmask(&mut self) -> Self::Output42046eb3155eSJeffrey Charles     fn visit_i32x4_bitmask(&mut self) -> Self::Output {
42056eb3155eSJeffrey Charles         self.context.v128_bitmask_op(self.masm, |masm, src, dst| {
42066eb3155eSJeffrey Charles             masm.v128_bitmask(src, writable!(dst), OperandSize::S32)
42076eb3155eSJeffrey Charles         })
42086eb3155eSJeffrey Charles     }
42096eb3155eSJeffrey Charles 
visit_i64x2_bitmask(&mut self) -> Self::Output42106eb3155eSJeffrey Charles     fn visit_i64x2_bitmask(&mut self) -> Self::Output {
42116eb3155eSJeffrey Charles         self.context.v128_bitmask_op(self.masm, |masm, src, dst| {
42126eb3155eSJeffrey Charles             masm.v128_bitmask(src, writable!(dst), OperandSize::S64)
42136eb3155eSJeffrey Charles         })
42146eb3155eSJeffrey Charles     }
42156eb3155eSJeffrey Charles 
visit_i32x4_trunc_sat_f32x4_s(&mut self) -> Self::Output42167f93c1edSJeffrey Charles     fn visit_i32x4_trunc_sat_f32x4_s(&mut self) -> Self::Output {
42177f93c1edSJeffrey Charles         self.masm
4218fb7dd612SJeffrey Charles             .v128_trunc(&mut self.context, V128TruncKind::I32x4FromF32x4S)
42197f93c1edSJeffrey Charles     }
42207f93c1edSJeffrey Charles 
visit_i32x4_trunc_sat_f32x4_u(&mut self) -> Self::Output42217f93c1edSJeffrey Charles     fn visit_i32x4_trunc_sat_f32x4_u(&mut self) -> Self::Output {
42227f93c1edSJeffrey Charles         self.masm
4223fb7dd612SJeffrey Charles             .v128_trunc(&mut self.context, V128TruncKind::I32x4FromF32x4U)
42247f93c1edSJeffrey Charles     }
42257f93c1edSJeffrey Charles 
visit_i32x4_trunc_sat_f64x2_s_zero(&mut self) -> Self::Output42267f93c1edSJeffrey Charles     fn visit_i32x4_trunc_sat_f64x2_s_zero(&mut self) -> Self::Output {
42277f93c1edSJeffrey Charles         self.masm
4228fb7dd612SJeffrey Charles             .v128_trunc(&mut self.context, V128TruncKind::I32x4FromF64x2SZero)
42297f93c1edSJeffrey Charles     }
42307f93c1edSJeffrey Charles 
visit_i32x4_trunc_sat_f64x2_u_zero(&mut self) -> Self::Output42317f93c1edSJeffrey Charles     fn visit_i32x4_trunc_sat_f64x2_u_zero(&mut self) -> Self::Output {
42327f93c1edSJeffrey Charles         self.masm
4233fb7dd612SJeffrey Charles             .v128_trunc(&mut self.context, V128TruncKind::I32x4FromF64x2UZero)
42347f93c1edSJeffrey Charles     }
42357f93c1edSJeffrey Charles 
visit_i16x8_min_s(&mut self) -> Self::Output4236305c3f99Sad hoc     fn visit_i16x8_min_s(&mut self) -> Self::Output {
4237305c3f99Sad hoc         self.context
423841b7b260SJeffrey Charles             .binop(self.masm, OperandSize::S16, |masm, dst, src, _size| {
423941b7b260SJeffrey Charles                 masm.v128_min(src, dst, writable!(dst), V128MinKind::I16x8S)?;
4240305c3f99Sad hoc                 Ok(TypedReg::v128(dst))
4241305c3f99Sad hoc             })
4242305c3f99Sad hoc     }
4243305c3f99Sad hoc 
visit_i32x4_dot_i16x8_s(&mut self) -> Self::Output4244ec9f885aSJeffrey Charles     fn visit_i32x4_dot_i16x8_s(&mut self) -> Self::Output {
4245ec9f885aSJeffrey Charles         self.context
4246ec9f885aSJeffrey Charles             .binop(self.masm, OperandSize::S32, |masm, dst, src, _size| {
4247ec9f885aSJeffrey Charles                 masm.v128_dot(dst, src, writable!(dst))?;
4248ec9f885aSJeffrey Charles                 Ok(TypedReg::v128(dst))
4249ec9f885aSJeffrey Charles             })
4250ec9f885aSJeffrey Charles     }
4251ec9f885aSJeffrey Charles 
visit_i8x16_popcnt(&mut self) -> Self::Output4252362b0dbfSJeffrey Charles     fn visit_i8x16_popcnt(&mut self) -> Self::Output {
4253362b0dbfSJeffrey Charles         self.masm.v128_popcnt(&mut self.context)
4254362b0dbfSJeffrey Charles     }
4255362b0dbfSJeffrey Charles 
visit_i8x16_avgr_u(&mut self) -> Self::Output4256b09899deSJeffrey Charles     fn visit_i8x16_avgr_u(&mut self) -> Self::Output {
4257b09899deSJeffrey Charles         self.context
4258b09899deSJeffrey Charles             .binop(self.masm, OperandSize::S8, |masm, dst, src, size| {
4259b09899deSJeffrey Charles                 masm.v128_avgr(dst, src, writable!(dst), size)?;
4260b09899deSJeffrey Charles                 Ok(TypedReg::v128(dst))
4261b09899deSJeffrey Charles             })
4262b09899deSJeffrey Charles     }
4263b09899deSJeffrey Charles 
visit_i32x4_min_s(&mut self) -> Self::Output4264305c3f99Sad hoc     fn visit_i32x4_min_s(&mut self) -> Self::Output {
4265305c3f99Sad hoc         self.context
426641b7b260SJeffrey Charles             .binop(self.masm, OperandSize::S32, |masm, dst, src, _size| {
426741b7b260SJeffrey Charles                 masm.v128_min(src, dst, writable!(dst), V128MinKind::I32x4S)?;
4268305c3f99Sad hoc                 Ok(TypedReg::v128(dst))
4269305c3f99Sad hoc             })
4270305c3f99Sad hoc     }
4271305c3f99Sad hoc 
visit_i8x16_min_u(&mut self) -> Self::Output4272305c3f99Sad hoc     fn visit_i8x16_min_u(&mut self) -> Self::Output {
4273305c3f99Sad hoc         self.context
427441b7b260SJeffrey Charles             .binop(self.masm, OperandSize::S8, |masm, dst, src, _size| {
427541b7b260SJeffrey Charles                 masm.v128_min(src, dst, writable!(dst), V128MinKind::I8x16U)?;
4276305c3f99Sad hoc                 Ok(TypedReg::v128(dst))
4277305c3f99Sad hoc             })
4278305c3f99Sad hoc     }
4279305c3f99Sad hoc 
visit_i16x8_avgr_u(&mut self) -> Self::Output4280b09899deSJeffrey Charles     fn visit_i16x8_avgr_u(&mut self) -> Self::Output {
4281b09899deSJeffrey Charles         self.context
4282b09899deSJeffrey Charles             .binop(self.masm, OperandSize::S16, |masm, dst, src, size| {
4283b09899deSJeffrey Charles                 masm.v128_avgr(dst, src, writable!(dst), size)?;
4284b09899deSJeffrey Charles                 Ok(TypedReg::v128(dst))
4285b09899deSJeffrey Charles             })
4286b09899deSJeffrey Charles     }
4287b09899deSJeffrey Charles 
visit_i16x8_min_u(&mut self) -> Self::Output4288305c3f99Sad hoc     fn visit_i16x8_min_u(&mut self) -> Self::Output {
4289305c3f99Sad hoc         self.context
429041b7b260SJeffrey Charles             .binop(self.masm, OperandSize::S16, |masm, dst, src, _size| {
429141b7b260SJeffrey Charles                 masm.v128_min(src, dst, writable!(dst), V128MinKind::I16x8U)?;
4292305c3f99Sad hoc                 Ok(TypedReg::v128(dst))
4293305c3f99Sad hoc             })
4294305c3f99Sad hoc     }
4295305c3f99Sad hoc 
visit_i32x4_min_u(&mut self) -> Self::Output4296305c3f99Sad hoc     fn visit_i32x4_min_u(&mut self) -> Self::Output {
4297305c3f99Sad hoc         self.context
429841b7b260SJeffrey Charles             .binop(self.masm, OperandSize::S32, |masm, dst, src, _size| {
429941b7b260SJeffrey Charles                 masm.v128_min(src, dst, writable!(dst), V128MinKind::I32x4U)?;
4300305c3f99Sad hoc                 Ok(TypedReg::v128(dst))
4301305c3f99Sad hoc             })
4302305c3f99Sad hoc     }
4303305c3f99Sad hoc 
visit_i8x16_max_s(&mut self) -> Self::Output4304305c3f99Sad hoc     fn visit_i8x16_max_s(&mut self) -> Self::Output {
4305305c3f99Sad hoc         self.context
430641b7b260SJeffrey Charles             .binop(self.masm, OperandSize::S8, |masm, dst, src, _size| {
430741b7b260SJeffrey Charles                 masm.v128_max(src, dst, writable!(dst), V128MaxKind::I8x16S)?;
4308305c3f99Sad hoc                 Ok(TypedReg::v128(dst))
4309305c3f99Sad hoc             })
4310305c3f99Sad hoc     }
4311305c3f99Sad hoc 
visit_i16x8_max_s(&mut self) -> Self::Output4312305c3f99Sad hoc     fn visit_i16x8_max_s(&mut self) -> Self::Output {
4313305c3f99Sad hoc         self.context
431441b7b260SJeffrey Charles             .binop(self.masm, OperandSize::S16, |masm, dst, src, _size| {
431541b7b260SJeffrey Charles                 masm.v128_max(src, dst, writable!(dst), V128MaxKind::I16x8S)?;
4316305c3f99Sad hoc                 Ok(TypedReg::v128(dst))
4317305c3f99Sad hoc             })
4318305c3f99Sad hoc     }
4319305c3f99Sad hoc 
visit_i32x4_max_s(&mut self) -> Self::Output4320305c3f99Sad hoc     fn visit_i32x4_max_s(&mut self) -> Self::Output {
4321305c3f99Sad hoc         self.context
432241b7b260SJeffrey Charles             .binop(self.masm, OperandSize::S32, |masm, dst, src, _size| {
432341b7b260SJeffrey Charles                 masm.v128_max(src, dst, writable!(dst), V128MaxKind::I32x4S)?;
4324305c3f99Sad hoc                 Ok(TypedReg::v128(dst))
4325305c3f99Sad hoc             })
4326305c3f99Sad hoc     }
4327305c3f99Sad hoc 
visit_i8x16_max_u(&mut self) -> Self::Output4328305c3f99Sad hoc     fn visit_i8x16_max_u(&mut self) -> Self::Output {
4329305c3f99Sad hoc         self.context
433041b7b260SJeffrey Charles             .binop(self.masm, OperandSize::S8, |masm, dst, src, _size| {
433141b7b260SJeffrey Charles                 masm.v128_max(src, dst, writable!(dst), V128MaxKind::I8x16U)?;
4332305c3f99Sad hoc                 Ok(TypedReg::v128(dst))
4333305c3f99Sad hoc             })
4334305c3f99Sad hoc     }
4335305c3f99Sad hoc 
visit_i16x8_max_u(&mut self) -> Self::Output4336305c3f99Sad hoc     fn visit_i16x8_max_u(&mut self) -> Self::Output {
4337305c3f99Sad hoc         self.context
433841b7b260SJeffrey Charles             .binop(self.masm, OperandSize::S16, |masm, dst, src, _size| {
433941b7b260SJeffrey Charles                 masm.v128_max(src, dst, writable!(dst), V128MaxKind::I16x8U)?;
4340305c3f99Sad hoc                 Ok(TypedReg::v128(dst))
4341305c3f99Sad hoc             })
4342305c3f99Sad hoc     }
4343305c3f99Sad hoc 
visit_i32x4_max_u(&mut self) -> Self::Output4344305c3f99Sad hoc     fn visit_i32x4_max_u(&mut self) -> Self::Output {
4345305c3f99Sad hoc         self.context
434641b7b260SJeffrey Charles             .binop(self.masm, OperandSize::S32, |masm, dst, src, _size| {
434741b7b260SJeffrey Charles                 masm.v128_max(src, dst, writable!(dst), V128MaxKind::I32x4U)?;
4348305c3f99Sad hoc                 Ok(TypedReg::v128(dst))
4349305c3f99Sad hoc             })
4350305c3f99Sad hoc     }
4351305c3f99Sad hoc 
visit_i16x8_extmul_low_i8x16_s(&mut self) -> Self::Output4352305c3f99Sad hoc     fn visit_i16x8_extmul_low_i8x16_s(&mut self) -> Self::Output {
4353305c3f99Sad hoc         self.masm
435441b7b260SJeffrey Charles             .v128_extmul(&mut self.context, V128ExtMulKind::LowI8x16S)
4355305c3f99Sad hoc     }
4356305c3f99Sad hoc 
visit_i32x4_extmul_low_i16x8_s(&mut self) -> Self::Output4357305c3f99Sad hoc     fn visit_i32x4_extmul_low_i16x8_s(&mut self) -> Self::Output {
4358305c3f99Sad hoc         self.masm
435941b7b260SJeffrey Charles             .v128_extmul(&mut self.context, V128ExtMulKind::LowI16x8S)
4360305c3f99Sad hoc     }
4361305c3f99Sad hoc 
visit_i64x2_extmul_low_i32x4_s(&mut self) -> Self::Output4362305c3f99Sad hoc     fn visit_i64x2_extmul_low_i32x4_s(&mut self) -> Self::Output {
4363305c3f99Sad hoc         self.masm
436441b7b260SJeffrey Charles             .v128_extmul(&mut self.context, V128ExtMulKind::LowI32x4S)
4365305c3f99Sad hoc     }
4366305c3f99Sad hoc 
visit_i16x8_extmul_low_i8x16_u(&mut self) -> Self::Output4367305c3f99Sad hoc     fn visit_i16x8_extmul_low_i8x16_u(&mut self) -> Self::Output {
4368305c3f99Sad hoc         self.masm
436941b7b260SJeffrey Charles             .v128_extmul(&mut self.context, V128ExtMulKind::LowI8x16U)
4370305c3f99Sad hoc     }
4371305c3f99Sad hoc 
visit_i32x4_extmul_low_i16x8_u(&mut self) -> Self::Output4372305c3f99Sad hoc     fn visit_i32x4_extmul_low_i16x8_u(&mut self) -> Self::Output {
4373305c3f99Sad hoc         self.masm
437441b7b260SJeffrey Charles             .v128_extmul(&mut self.context, V128ExtMulKind::LowI16x8U)
4375305c3f99Sad hoc     }
4376305c3f99Sad hoc 
visit_i64x2_extmul_low_i32x4_u(&mut self) -> Self::Output4377305c3f99Sad hoc     fn visit_i64x2_extmul_low_i32x4_u(&mut self) -> Self::Output {
4378305c3f99Sad hoc         self.masm
437941b7b260SJeffrey Charles             .v128_extmul(&mut self.context, V128ExtMulKind::LowI32x4U)
4380305c3f99Sad hoc     }
4381305c3f99Sad hoc 
visit_i16x8_extmul_high_i8x16_u(&mut self) -> Self::Output4382305c3f99Sad hoc     fn visit_i16x8_extmul_high_i8x16_u(&mut self) -> Self::Output {
438341b7b260SJeffrey Charles         self.masm
438441b7b260SJeffrey Charles             .v128_extmul(&mut self.context, V128ExtMulKind::HighI8x16U)
4385305c3f99Sad hoc     }
4386305c3f99Sad hoc 
visit_i32x4_extmul_high_i16x8_u(&mut self) -> Self::Output4387305c3f99Sad hoc     fn visit_i32x4_extmul_high_i16x8_u(&mut self) -> Self::Output {
438841b7b260SJeffrey Charles         self.masm
438941b7b260SJeffrey Charles             .v128_extmul(&mut self.context, V128ExtMulKind::HighI16x8U)
4390305c3f99Sad hoc     }
4391305c3f99Sad hoc 
visit_i64x2_extmul_high_i32x4_u(&mut self) -> Self::Output4392305c3f99Sad hoc     fn visit_i64x2_extmul_high_i32x4_u(&mut self) -> Self::Output {
439341b7b260SJeffrey Charles         self.masm
439441b7b260SJeffrey Charles             .v128_extmul(&mut self.context, V128ExtMulKind::HighI32x4U)
4395305c3f99Sad hoc     }
4396305c3f99Sad hoc 
visit_i16x8_extmul_high_i8x16_s(&mut self) -> Self::Output4397305c3f99Sad hoc     fn visit_i16x8_extmul_high_i8x16_s(&mut self) -> Self::Output {
4398305c3f99Sad hoc         self.masm
439941b7b260SJeffrey Charles             .v128_extmul(&mut self.context, V128ExtMulKind::HighI8x16S)
4400305c3f99Sad hoc     }
4401305c3f99Sad hoc 
visit_i32x4_extmul_high_i16x8_s(&mut self) -> Self::Output4402305c3f99Sad hoc     fn visit_i32x4_extmul_high_i16x8_s(&mut self) -> Self::Output {
4403305c3f99Sad hoc         self.masm
440441b7b260SJeffrey Charles             .v128_extmul(&mut self.context, V128ExtMulKind::HighI16x8S)
4405305c3f99Sad hoc     }
4406305c3f99Sad hoc 
visit_i64x2_extmul_high_i32x4_s(&mut self) -> Self::Output4407305c3f99Sad hoc     fn visit_i64x2_extmul_high_i32x4_s(&mut self) -> Self::Output {
4408305c3f99Sad hoc         self.masm
440941b7b260SJeffrey Charles             .v128_extmul(&mut self.context, V128ExtMulKind::HighI32x4S)
4410305c3f99Sad hoc     }
4411305c3f99Sad hoc 
visit_i16x8_extadd_pairwise_i8x16_s(&mut self) -> Self::Output4412305c3f99Sad hoc     fn visit_i16x8_extadd_pairwise_i8x16_s(&mut self) -> Self::Output {
4413305c3f99Sad hoc         self.context.unop(self.masm, |masm, op| {
441441b7b260SJeffrey Charles             masm.v128_extadd_pairwise(op, writable!(op), V128ExtAddKind::I8x16S)?;
4415305c3f99Sad hoc             Ok(TypedReg::v128(op))
4416305c3f99Sad hoc         })
4417305c3f99Sad hoc     }
4418305c3f99Sad hoc 
visit_i16x8_extadd_pairwise_i8x16_u(&mut self) -> Self::Output4419305c3f99Sad hoc     fn visit_i16x8_extadd_pairwise_i8x16_u(&mut self) -> Self::Output {
4420305c3f99Sad hoc         self.context.unop(self.masm, |masm, op| {
442141b7b260SJeffrey Charles             masm.v128_extadd_pairwise(op, writable!(op), V128ExtAddKind::I8x16U)?;
4422305c3f99Sad hoc             Ok(TypedReg::v128(op))
4423305c3f99Sad hoc         })
4424305c3f99Sad hoc     }
4425305c3f99Sad hoc 
visit_i32x4_extadd_pairwise_i16x8_s(&mut self) -> Self::Output4426305c3f99Sad hoc     fn visit_i32x4_extadd_pairwise_i16x8_s(&mut self) -> Self::Output {
4427305c3f99Sad hoc         self.context.unop(self.masm, |masm, op| {
442841b7b260SJeffrey Charles             masm.v128_extadd_pairwise(op, writable!(op), V128ExtAddKind::I16x8S)?;
4429305c3f99Sad hoc             Ok(TypedReg::v128(op))
4430305c3f99Sad hoc         })
4431305c3f99Sad hoc     }
4432305c3f99Sad hoc 
visit_i32x4_extadd_pairwise_i16x8_u(&mut self) -> Self::Output4433305c3f99Sad hoc     fn visit_i32x4_extadd_pairwise_i16x8_u(&mut self) -> Self::Output {
4434305c3f99Sad hoc         self.context.unop(self.masm, |masm, op| {
443541b7b260SJeffrey Charles             masm.v128_extadd_pairwise(op, writable!(op), V128ExtAddKind::I16x8U)?;
4436305c3f99Sad hoc             Ok(TypedReg::v128(op))
4437305c3f99Sad hoc         })
4438305c3f99Sad hoc     }
4439305c3f99Sad hoc 
visit_f32x4_add(&mut self) -> Self::Output4440acef4083SJeffrey Charles     fn visit_f32x4_add(&mut self) -> Self::Output {
4441acef4083SJeffrey Charles         self.context
4442acef4083SJeffrey Charles             .binop(self.masm, OperandSize::S32, |masm, dst, src, _size| {
4443acef4083SJeffrey Charles                 masm.v128_add(dst, src, writable!(dst), V128AddKind::F32x4)?;
4444acef4083SJeffrey Charles                 Ok(TypedReg::v128(dst))
4445acef4083SJeffrey Charles             })
4446acef4083SJeffrey Charles     }
4447acef4083SJeffrey Charles 
visit_f64x2_add(&mut self) -> Self::Output4448acef4083SJeffrey Charles     fn visit_f64x2_add(&mut self) -> Self::Output {
4449acef4083SJeffrey Charles         self.context
4450acef4083SJeffrey Charles             .binop(self.masm, OperandSize::S64, |masm, dst, src, _size| {
4451acef4083SJeffrey Charles                 masm.v128_add(dst, src, writable!(dst), V128AddKind::F64x2)?;
4452acef4083SJeffrey Charles                 Ok(TypedReg::v128(dst))
4453acef4083SJeffrey Charles             })
4454acef4083SJeffrey Charles     }
4455acef4083SJeffrey Charles 
visit_f32x4_sub(&mut self) -> Self::Output4456acef4083SJeffrey Charles     fn visit_f32x4_sub(&mut self) -> Self::Output {
4457acef4083SJeffrey Charles         self.context
4458acef4083SJeffrey Charles             .binop(self.masm, OperandSize::S32, |masm, dst, src, _size| {
4459acef4083SJeffrey Charles                 masm.v128_sub(dst, src, writable!(dst), V128SubKind::F32x4)?;
4460acef4083SJeffrey Charles                 Ok(TypedReg::v128(dst))
4461acef4083SJeffrey Charles             })
4462acef4083SJeffrey Charles     }
4463acef4083SJeffrey Charles 
visit_f64x2_sub(&mut self) -> Self::Output4464acef4083SJeffrey Charles     fn visit_f64x2_sub(&mut self) -> Self::Output {
4465acef4083SJeffrey Charles         self.context
4466acef4083SJeffrey Charles             .binop(self.masm, OperandSize::S64, |masm, dst, src, _size| {
4467acef4083SJeffrey Charles                 masm.v128_sub(dst, src, writable!(dst), V128SubKind::F64x2)?;
4468acef4083SJeffrey Charles                 Ok(TypedReg::v128(dst))
4469acef4083SJeffrey Charles             })
4470acef4083SJeffrey Charles     }
4471acef4083SJeffrey Charles 
visit_f32x4_mul(&mut self) -> Self::Output4472acef4083SJeffrey Charles     fn visit_f32x4_mul(&mut self) -> Self::Output {
4473acef4083SJeffrey Charles         self.masm.v128_mul(&mut self.context, V128MulKind::F32x4)
4474acef4083SJeffrey Charles     }
4475acef4083SJeffrey Charles 
visit_f64x2_mul(&mut self) -> Self::Output4476acef4083SJeffrey Charles     fn visit_f64x2_mul(&mut self) -> Self::Output {
4477acef4083SJeffrey Charles         self.masm.v128_mul(&mut self.context, V128MulKind::F64x2)
4478acef4083SJeffrey Charles     }
4479acef4083SJeffrey Charles 
visit_f32x4_div(&mut self) -> Self::Output4480acef4083SJeffrey Charles     fn visit_f32x4_div(&mut self) -> Self::Output {
4481acef4083SJeffrey Charles         self.context
4482acef4083SJeffrey Charles             .binop(self.masm, OperandSize::S32, |masm, dst, src, size| {
4483acef4083SJeffrey Charles                 masm.v128_div(dst, src, writable!(dst), size)?;
4484acef4083SJeffrey Charles                 Ok(TypedReg::v128(dst))
4485acef4083SJeffrey Charles             })
4486acef4083SJeffrey Charles     }
4487acef4083SJeffrey Charles 
visit_f64x2_div(&mut self) -> Self::Output4488acef4083SJeffrey Charles     fn visit_f64x2_div(&mut self) -> Self::Output {
4489acef4083SJeffrey Charles         self.context
4490acef4083SJeffrey Charles             .binop(self.masm, OperandSize::S64, |masm, dst, src, size| {
4491acef4083SJeffrey Charles                 masm.v128_div(dst, src, writable!(dst), size)?;
4492acef4083SJeffrey Charles                 Ok(TypedReg::v128(dst))
4493acef4083SJeffrey Charles             })
4494acef4083SJeffrey Charles     }
4495acef4083SJeffrey Charles 
visit_f32x4_neg(&mut self) -> Self::Output4496acef4083SJeffrey Charles     fn visit_f32x4_neg(&mut self) -> Self::Output {
4497acef4083SJeffrey Charles         self.context.unop(self.masm, |masm, reg| {
4498acef4083SJeffrey Charles             masm.v128_neg(writable!(reg), V128NegKind::F32x4)?;
4499acef4083SJeffrey Charles             Ok(TypedReg::v128(reg))
4500acef4083SJeffrey Charles         })
4501acef4083SJeffrey Charles     }
4502acef4083SJeffrey Charles 
visit_f32x4_ceil(&mut self) -> Self::Output4503fb7dd612SJeffrey Charles     fn visit_f32x4_ceil(&mut self) -> Self::Output {
4504fb7dd612SJeffrey Charles         self.context.unop(self.masm, |masm, reg| {
4505fb7dd612SJeffrey Charles             masm.v128_ceil(reg, writable!(reg), OperandSize::S32)?;
4506fb7dd612SJeffrey Charles             Ok(TypedReg::v128(reg))
4507fb7dd612SJeffrey Charles         })
4508fb7dd612SJeffrey Charles     }
4509fb7dd612SJeffrey Charles 
visit_f64x2_neg(&mut self) -> Self::Output4510acef4083SJeffrey Charles     fn visit_f64x2_neg(&mut self) -> Self::Output {
4511acef4083SJeffrey Charles         self.context.unop(self.masm, |masm, reg| {
4512acef4083SJeffrey Charles             masm.v128_neg(writable!(reg), V128NegKind::F64x2)?;
4513acef4083SJeffrey Charles             Ok(TypedReg::v128(reg))
4514acef4083SJeffrey Charles         })
4515acef4083SJeffrey Charles     }
4516acef4083SJeffrey Charles 
visit_f64x2_ceil(&mut self) -> Self::Output4517fb7dd612SJeffrey Charles     fn visit_f64x2_ceil(&mut self) -> Self::Output {
4518fb7dd612SJeffrey Charles         self.context.unop(self.masm, |masm, reg| {
4519fb7dd612SJeffrey Charles             masm.v128_ceil(reg, writable!(reg), OperandSize::S64)?;
4520fb7dd612SJeffrey Charles             Ok(TypedReg::v128(reg))
4521fb7dd612SJeffrey Charles         })
4522fb7dd612SJeffrey Charles     }
4523fb7dd612SJeffrey Charles 
visit_f32x4_sqrt(&mut self) -> Self::Output4524acef4083SJeffrey Charles     fn visit_f32x4_sqrt(&mut self) -> Self::Output {
4525acef4083SJeffrey Charles         self.context.unop(self.masm, |masm, reg| {
4526acef4083SJeffrey Charles             masm.v128_sqrt(reg, writable!(reg), OperandSize::S32)?;
4527acef4083SJeffrey Charles             Ok(TypedReg::v128(reg))
4528acef4083SJeffrey Charles         })
4529acef4083SJeffrey Charles     }
4530acef4083SJeffrey Charles 
visit_f32x4_floor(&mut self) -> Self::Output4531fb7dd612SJeffrey Charles     fn visit_f32x4_floor(&mut self) -> Self::Output {
4532fb7dd612SJeffrey Charles         self.context.unop(self.masm, |masm, reg| {
4533fb7dd612SJeffrey Charles             masm.v128_floor(reg, writable!(reg), OperandSize::S32)?;
4534fb7dd612SJeffrey Charles             Ok(TypedReg::v128(reg))
4535fb7dd612SJeffrey Charles         })
4536fb7dd612SJeffrey Charles     }
4537fb7dd612SJeffrey Charles 
visit_f64x2_sqrt(&mut self) -> Self::Output4538acef4083SJeffrey Charles     fn visit_f64x2_sqrt(&mut self) -> Self::Output {
4539acef4083SJeffrey Charles         self.context.unop(self.masm, |masm, reg| {
4540acef4083SJeffrey Charles             masm.v128_sqrt(reg, writable!(reg), OperandSize::S64)?;
4541acef4083SJeffrey Charles             Ok(TypedReg::v128(reg))
4542acef4083SJeffrey Charles         })
4543acef4083SJeffrey Charles     }
4544acef4083SJeffrey Charles 
visit_f64x2_floor(&mut self) -> Self::Output4545fb7dd612SJeffrey Charles     fn visit_f64x2_floor(&mut self) -> Self::Output {
4546fb7dd612SJeffrey Charles         self.context.unop(self.masm, |masm, reg| {
4547fb7dd612SJeffrey Charles             masm.v128_floor(reg, writable!(reg), OperandSize::S64)?;
4548fb7dd612SJeffrey Charles             Ok(TypedReg::v128(reg))
4549fb7dd612SJeffrey Charles         })
4550fb7dd612SJeffrey Charles     }
4551fb7dd612SJeffrey Charles 
visit_f32x4_nearest(&mut self) -> Self::Output4552fb7dd612SJeffrey Charles     fn visit_f32x4_nearest(&mut self) -> Self::Output {
4553fb7dd612SJeffrey Charles         self.context.unop(self.masm, |masm, reg| {
4554fb7dd612SJeffrey Charles             masm.v128_nearest(reg, writable!(reg), OperandSize::S32)?;
4555fb7dd612SJeffrey Charles             Ok(TypedReg::v128(reg))
4556fb7dd612SJeffrey Charles         })
4557fb7dd612SJeffrey Charles     }
4558fb7dd612SJeffrey Charles 
visit_f64x2_nearest(&mut self) -> Self::Output4559fb7dd612SJeffrey Charles     fn visit_f64x2_nearest(&mut self) -> Self::Output {
4560fb7dd612SJeffrey Charles         self.context.unop(self.masm, |masm, reg| {
4561fb7dd612SJeffrey Charles             masm.v128_nearest(reg, writable!(reg), OperandSize::S64)?;
4562fb7dd612SJeffrey Charles             Ok(TypedReg::v128(reg))
4563fb7dd612SJeffrey Charles         })
4564fb7dd612SJeffrey Charles     }
4565fb7dd612SJeffrey Charles 
visit_f32x4_trunc(&mut self) -> Self::Output4566fb7dd612SJeffrey Charles     fn visit_f32x4_trunc(&mut self) -> Self::Output {
4567fb7dd612SJeffrey Charles         self.masm
4568fb7dd612SJeffrey Charles             .v128_trunc(&mut self.context, V128TruncKind::F32x4)
4569fb7dd612SJeffrey Charles     }
4570fb7dd612SJeffrey Charles 
visit_f64x2_trunc(&mut self) -> Self::Output4571fb7dd612SJeffrey Charles     fn visit_f64x2_trunc(&mut self) -> Self::Output {
4572fb7dd612SJeffrey Charles         self.masm
4573fb7dd612SJeffrey Charles             .v128_trunc(&mut self.context, V128TruncKind::F64x2)
4574fb7dd612SJeffrey Charles     }
4575fb7dd612SJeffrey Charles 
visit_v128_load32_zero(&mut self, memarg: MemArg) -> Self::Output4576898b0febSJeffrey Charles     fn visit_v128_load32_zero(&mut self, memarg: MemArg) -> Self::Output {
4577898b0febSJeffrey Charles         self.emit_wasm_load(
4578898b0febSJeffrey Charles             &memarg,
4579898b0febSJeffrey Charles             WasmValType::V128,
4580898b0febSJeffrey Charles             LoadKind::VectorZero(OperandSize::S32),
4581898b0febSJeffrey Charles         )
4582898b0febSJeffrey Charles     }
4583898b0febSJeffrey Charles 
visit_v128_load64_zero(&mut self, memarg: MemArg) -> Self::Output4584898b0febSJeffrey Charles     fn visit_v128_load64_zero(&mut self, memarg: MemArg) -> Self::Output {
4585898b0febSJeffrey Charles         self.emit_wasm_load(
4586898b0febSJeffrey Charles             &memarg,
4587898b0febSJeffrey Charles             WasmValType::V128,
4588898b0febSJeffrey Charles             LoadKind::VectorZero(OperandSize::S64),
4589898b0febSJeffrey Charles         )
4590898b0febSJeffrey Charles     }
4591898b0febSJeffrey Charles 
visit_f32x4_pmin(&mut self) -> Self::Output4592b0319ebcSJeffrey Charles     fn visit_f32x4_pmin(&mut self) -> Self::Output {
4593b0319ebcSJeffrey Charles         self.context
4594b0319ebcSJeffrey Charles             .binop(self.masm, OperandSize::S32, |masm, dst, src, size| {
4595b0319ebcSJeffrey Charles                 masm.v128_pmin(dst, src, writable!(dst), size)?;
4596b0319ebcSJeffrey Charles                 Ok(TypedReg::v128(dst))
4597b0319ebcSJeffrey Charles             })
4598b0319ebcSJeffrey Charles     }
4599b0319ebcSJeffrey Charles 
visit_f64x2_pmin(&mut self) -> Self::Output4600b0319ebcSJeffrey Charles     fn visit_f64x2_pmin(&mut self) -> Self::Output {
4601b0319ebcSJeffrey Charles         self.context
4602b0319ebcSJeffrey Charles             .binop(self.masm, OperandSize::S64, |masm, dst, src, size| {
4603b0319ebcSJeffrey Charles                 masm.v128_pmin(dst, src, writable!(dst), size)?;
4604b0319ebcSJeffrey Charles                 Ok(TypedReg::v128(dst))
4605b0319ebcSJeffrey Charles             })
4606b0319ebcSJeffrey Charles     }
4607b0319ebcSJeffrey Charles 
visit_f32x4_pmax(&mut self) -> Self::Output4608b0319ebcSJeffrey Charles     fn visit_f32x4_pmax(&mut self) -> Self::Output {
4609b0319ebcSJeffrey Charles         self.context
4610b0319ebcSJeffrey Charles             .binop(self.masm, OperandSize::S32, |masm, dst, src, size| {
4611b0319ebcSJeffrey Charles                 masm.v128_pmax(dst, src, writable!(dst), size)?;
4612b0319ebcSJeffrey Charles                 Ok(TypedReg::v128(dst))
4613b0319ebcSJeffrey Charles             })
4614b0319ebcSJeffrey Charles     }
4615b0319ebcSJeffrey Charles 
visit_f64x2_pmax(&mut self) -> Self::Output4616b0319ebcSJeffrey Charles     fn visit_f64x2_pmax(&mut self) -> Self::Output {
4617b0319ebcSJeffrey Charles         self.context
4618b0319ebcSJeffrey Charles             .binop(self.masm, OperandSize::S64, |masm, dst, src, size| {
4619b0319ebcSJeffrey Charles                 masm.v128_pmax(dst, src, writable!(dst), size)?;
4620b0319ebcSJeffrey Charles                 Ok(TypedReg::v128(dst))
4621b0319ebcSJeffrey Charles             })
4622b0319ebcSJeffrey Charles     }
4623b0319ebcSJeffrey Charles 
visit_f32x4_min(&mut self) -> Self::Output46241f24222fSJeffrey Charles     fn visit_f32x4_min(&mut self) -> Self::Output {
46251f24222fSJeffrey Charles         self.context
46261f24222fSJeffrey Charles             .binop(self.masm, OperandSize::S32, |masm, dst, src, _size| {
46271f24222fSJeffrey Charles                 masm.v128_min(dst, src, writable!(dst), V128MinKind::F32x4)?;
46281f24222fSJeffrey Charles                 Ok(TypedReg::v128(dst))
46291f24222fSJeffrey Charles             })
46301f24222fSJeffrey Charles     }
46311f24222fSJeffrey Charles 
visit_f64x2_min(&mut self) -> Self::Output46321f24222fSJeffrey Charles     fn visit_f64x2_min(&mut self) -> Self::Output {
46331f24222fSJeffrey Charles         self.context
46341f24222fSJeffrey Charles             .binop(self.masm, OperandSize::S64, |masm, dst, src, _size| {
46351f24222fSJeffrey Charles                 masm.v128_min(dst, src, writable!(dst), V128MinKind::F64x2)?;
46361f24222fSJeffrey Charles                 Ok(TypedReg::v128(dst))
46371f24222fSJeffrey Charles             })
46381f24222fSJeffrey Charles     }
46391f24222fSJeffrey Charles 
visit_f32x4_max(&mut self) -> Self::Output46401f24222fSJeffrey Charles     fn visit_f32x4_max(&mut self) -> Self::Output {
46411f24222fSJeffrey Charles         self.context
46421f24222fSJeffrey Charles             .binop(self.masm, OperandSize::S32, |masm, dst, src, _size| {
46431f24222fSJeffrey Charles                 masm.v128_max(dst, src, writable!(dst), V128MaxKind::F32x4)?;
46441f24222fSJeffrey Charles                 Ok(TypedReg::v128(dst))
46451f24222fSJeffrey Charles             })
46461f24222fSJeffrey Charles     }
46471f24222fSJeffrey Charles 
visit_f64x2_max(&mut self) -> Self::Output46481f24222fSJeffrey Charles     fn visit_f64x2_max(&mut self) -> Self::Output {
46491f24222fSJeffrey Charles         self.context
46501f24222fSJeffrey Charles             .binop(self.masm, OperandSize::S64, |masm, dst, src, _size| {
46511f24222fSJeffrey Charles                 masm.v128_max(dst, src, writable!(dst), V128MaxKind::F64x2)?;
46521f24222fSJeffrey Charles                 Ok(TypedReg::v128(dst))
46531f24222fSJeffrey Charles             })
46541f24222fSJeffrey Charles     }
46551f24222fSJeffrey Charles 
46561256cfaeSAlex Crichton     wasmparser::for_each_visit_simd_operator!(def_unsupported);
4657835abbcdSSaúl Cabrera }
4658835abbcdSSaúl Cabrera 
46597ef8f2e2SSaúl Cabrera impl<'a, 'translation, 'data, M> CodeGen<'a, 'translation, 'data, M, Emission>
46609cc62e7fSJeffrey Charles where
46619cc62e7fSJeffrey Charles     M: MacroAssembler,
46629cc62e7fSJeffrey Charles {
cmp_i32s(&mut self, kind: IntCmpKind) -> Result<()>4663b93e1bc0SSaúl Cabrera     fn cmp_i32s(&mut self, kind: IntCmpKind) -> Result<()> {
466481cd9983SNick Fitzgerald         self.context.i32_binop(self.masm, |masm, dst, src, size| {
4665b93e1bc0SSaúl Cabrera             masm.cmp_with_set(writable!(dst), src, kind, size)?;
4666b93e1bc0SSaúl Cabrera             Ok(TypedReg::i32(dst))
4667b93e1bc0SSaúl Cabrera         })
46689cc62e7fSJeffrey Charles     }
46699cc62e7fSJeffrey Charles 
cmp_i64s(&mut self, kind: IntCmpKind) -> Result<()>4670b93e1bc0SSaúl Cabrera     fn cmp_i64s(&mut self, kind: IntCmpKind) -> Result<()> {
46719cc62e7fSJeffrey Charles         self.context
467281cd9983SNick Fitzgerald             .i64_binop(self.masm, move |masm, dst, src, size| {
4673b93e1bc0SSaúl Cabrera                 masm.cmp_with_set(writable!(dst), src, kind, size)?;
4674b93e1bc0SSaúl Cabrera                 Ok(TypedReg::i32(dst)) // Return value for comparisons is an `i32`.
4675b93e1bc0SSaúl Cabrera             })
46769cc62e7fSJeffrey Charles     }
46779cc62e7fSJeffrey Charles }
46789cc62e7fSJeffrey Charles 
4679b93e1bc0SSaúl Cabrera impl TryFrom<WasmValType> for OperandSize {
4680b112bb85SNick Fitzgerald     type Error = crate::Error;
try_from(ty: WasmValType) -> Result<OperandSize>4681b93e1bc0SSaúl Cabrera     fn try_from(ty: WasmValType) -> Result<OperandSize> {
4682b93e1bc0SSaúl Cabrera         let ty = match ty {
4683496237c2SNick Fitzgerald             WasmValType::I32 | WasmValType::F32 => OperandSize::S32,
4684496237c2SNick Fitzgerald             WasmValType::I64 | WasmValType::F64 => OperandSize::S64,
4685fa9a948dSJeffrey Charles             WasmValType::V128 => OperandSize::S128,
4686496237c2SNick Fitzgerald             WasmValType::Ref(rt) => {
4687a109d2abSSaúl Cabrera                 match rt.heap_type {
46880e9121daSFrankReh                     // TODO: Hardcoded size, assuming 64-bit support only. Once
4689a109d2abSSaúl Cabrera                     // Wasmtime supports 32-bit architectures, this will need
4690a109d2abSSaúl Cabrera                     // to be updated in such a way that the calculation of the
4691a109d2abSSaúl Cabrera                     // OperandSize will depend on the target's  pointer size.
4692a109d2abSSaúl Cabrera                     WasmHeapType::Func => OperandSize::S64,
469362e51da5SAlex Crichton                     WasmHeapType::Extern => OperandSize::S64,
4694b93e1bc0SSaúl Cabrera                     _ => bail!(CodeGenError::unsupported_wasm_type()),
4695a109d2abSSaúl Cabrera                 }
4696a109d2abSSaúl Cabrera             }
4697b93e1bc0SSaúl Cabrera         };
4698b93e1bc0SSaúl Cabrera         Ok(ty)
4699835abbcdSSaúl Cabrera     }
4700835abbcdSSaúl Cabrera }
4701